diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Module.bsl b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Module.bsl
index 92aa78a95..ac1bb87b6 100644
--- a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Module.bsl
+++ b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Module.bsl
@@ -74,8 +74,9 @@
КонецПроцедуры
-////////////////////////////////////////////////////////////////////////////////
-// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ
+#КонецОбласти
+
+#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура СрокНачалаИсполненияПриИзменении(Элемент)
@@ -161,8 +162,9 @@
КонецПроцедуры
-////////////////////////////////////////////////////////////////////////////////
-// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
&НаСервере
Процедура ИнициализацияФормы()
diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Help/ru.html b/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Help/ru.html
index f91eeeffd..d821a490f 100644
--- a/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Help/ru.html
+++ b/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначено для постановки и проверки выполнения произвольных задач.
Можно запустить из документа программы по команде Создать на основании (из бизнес-процесса также, при соответствующих настройках - такое задание станет подчиненным бизнес-процессом). Также можно начать новый бизнес-процессЗадание по команде Создать в списке Задания.
Предназначен для управления бизнес-процессами Задание.
Этот бизнес-процесс состоит из двух шагов - исполнение и проверка, при этом проверяющий может вернуть задачу на доработку.
Формируемые программой по бизнес-процессу Заданиезадачи на исполнение и на проверку адресуются исполнителю не только явно, с использованием персональной адресации, но и с помощью ролевой адресации.
Содержит общую информацию о валютах и предназначен для добавления новых валют (рекомендуется для корректного заполнения данных о валюте).
В Общероссийском классификаторе валют выводится:
diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Form.form
index 160d43c0c..4020de4d1 100644
--- a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Form.form
+++ b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Form.form
@@ -709,14 +709,7 @@
Подобрать валюты из Общероссийского классификатора валют
@@ -738,14 +731,7 @@
Загрузить курсы валют с веб-сайта РБК
diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl
index f788ec976..6f263c1d2 100644
--- a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl
+++ b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl
@@ -17,6 +17,11 @@
Элементы.Валюты.РежимВыбора = Параметры.РежимВыбора;
+ Если Не Пользователи.РолиДоступны("ДобавлениеИзменениеБазовойНСИ") Тогда
+ Элементы.ФормаПодборИзОКВ.Видимость = Ложь;
+ Элементы.ФормаЗагрузитьКурсыВалют.Видимость = Ложь;
+ КонецЕсли;
+
КонецПроцедуры
&НаКлиенте
diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Help/ru.html
index b761db9ca..214f17443 100644
--- a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Help/ru.html
+++ b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Описание свойств используемой валюты.
Валюта широко используется в деятельности любого предприятия: во всех документах, которые имеют дело с денежными суммами (счета, платежные поручения, договоры, накладные) присутствует поле Валюта, явно или по умолчанию. Значение поля Валюта заполняется в зависимости от направления деятельности предприятия: рубль, иностранная валюта или у.е.
Список предназначен для ведения валют, используемых в программе. Необходимые для работы валюты можно подобрать из Общероссийского классификатора валют - ОКВ (рекомендуется) или добавить вручную.
Открыть список валют можно из раздела Справочники.
В списке выводится:
diff --git a/SSL/src/Catalogs/Валюты/ObjectModule.bsl b/SSL/src/Catalogs/Валюты/ObjectModule.bsl
index 98811939c..81f03df05 100644
--- a/SSL/src/Catalogs/Валюты/ObjectModule.bsl
+++ b/SSL/src/Catalogs/Валюты/ObjectModule.bsl
@@ -82,6 +82,7 @@
Если ЭтоНовый() Тогда
ДополнительныеСвойства.Вставить("ОбновитьКурсы");
+ ДополнительныеСвойства.Вставить("ЭтоНовый");
Иначе
ПредыдущиеЗначения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "Код,СпособУстановкиКурса,ОсновнаяВалюта,Наценка,ФормулаРасчетаКурса");
Если (ПредыдущиеЗначения.СпособУстановкиКурса <> СпособУстановкиКурса)
@@ -144,6 +145,10 @@
КонецЦикла;
НаборЗаписей.ДополнительныеСвойства.Вставить("ОтключитьКонтрольПодчиненныхВалют", Истина);
+ Если ПодчиненнаяВалюта.ДополнительныеСвойства.Свойство("ЭтоНовый") Тогда
+ НаборЗаписей.ДополнительныеСвойства.Вставить("ПропуститьПроверкуЗапретаИзменения");
+ КонецЕсли;
+
НаборЗаписей.Записать();
ИначеЕсли СпособУстановкиКурса = Перечисления.СпособыУстановкиКурсаВалюты.РасчетПоФормуле Тогда
@@ -175,6 +180,11 @@
НаборЗаписей.Прочитать();
НаборЗаписей.ДополнительныеСвойства.Вставить("ОбновитьКурсЗависимойВалюты", ПодчиненнаяВалюта.Ссылка);
НаборЗаписей.ДополнительныеСвойства.Вставить("ОбновленныеПериоды", ОбновленныеПериоды);
+
+ Если ПодчиненнаяВалюта.ДополнительныеСвойства.Свойство("ЭтоНовый") Тогда
+ НаборЗаписей.ДополнительныеСвойства.Вставить("ПропуститьПроверкуЗапретаИзменения");
+ КонецЕсли;
+
НаборЗаписей.Записать();
КонецЦикла
diff --git a/SSL/src/Catalogs/Валюты/Templates/ОбщероссийскийКлассификаторВалют/Template.txt b/SSL/src/Catalogs/Валюты/Templates/ОбщероссийскийКлассификаторВалют/Template.txt
index ded747288..2a346a1fd 100644
--- a/SSL/src/Catalogs/Валюты/Templates/ОбщероссийскийКлассификаторВалют/Template.txt
+++ b/SSL/src/Catalogs/Валюты/Templates/ОбщероссийскийКлассификаторВалют/Template.txt
@@ -65,10 +65,8 @@
-
-
@@ -156,7 +154,7 @@
-
+
diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/Help/ru.html b/SSL/src/Catalogs/ВариантыОтветовАнкет/Help/ru.html
index 0e6731ce5..bb402cec8 100644
--- a/SSL/src/Catalogs/ВариантыОтветовАнкет/Help/ru.html
+++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Ведение списка вариантов ответов на вопросы типов Выбор одного или нескольких вариантов ответа из предложенных.
Существуют вопросы анкеты типа Выбор одного варианта ответа из предложенных или Выбор нескольких вариантов ответа из предложенных. В этих случаях ответ респондента сводится к выбору одного или нескольких вариантов ответа из списка с помощью переключателей.
Заполните Наименование варианта отчета, которое выводится в списках программы и в панели отчетов.
diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Help/ru.html b/SSL/src/Catalogs/ВариантыОтчетов/Help/ru.html
index b3950f20b..6885988ef 100644
--- a/SSL/src/Catalogs/ВариантыОтчетов/Help/ru.html
+++ b/SSL/src/Catalogs/ВариантыОтчетов/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для управления вариантами отчетов, для настройки размещения в панелях отчетов разделов программы.
Программа позволяет сохранять и использовать несколько вариантов одного и того же отчета. Предусмотрены предопределенные варианты отчетов. Также можно создавать свои собственные варианты отчетов, изменяя настройки существующих: настройки формирования и внешнего вида (состав полей, сортировки, группировки, условное оформление).
В программе предусмотрена возможность создавать общие варианты отчетов. Общие варианты отчетов доступны всем пользователям этого отчета.
diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Form.form b/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Form.form
index 1934e98e9..3dbc59643 100644
--- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Form.form
+++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Form.form
@@ -37,10 +37,6 @@
Список.ИндексКартинкиТекущий
-
- ru
- Пользователь, который добавил версию файла.
- СписокИндексКартинкиТекущийРасширеннаяПодсказка91
@@ -88,7 +84,7 @@
ru
- Пользователь, который добавил версию файла.
+ Пользователь, который добавил версию файла в списокСписокАвторРасширеннаяПодсказка
@@ -199,7 +195,7 @@
ru
- Номер версии файла.
+ Номер версии файлаСписокНомерВерсииРасширеннаяПодсказка
@@ -244,6 +240,10 @@
Список.Комментарий
+
+ ru
+ Комментарий к версии файла
+ СписокКомментарийРасширеннаяПодсказка95
@@ -287,7 +287,7 @@
ru
- Дата добавления версии файла в базу.
+ Дата добавления версии файла в списокСписокДатаСозданияРасширеннаяПодсказка
@@ -334,7 +334,7 @@
ru
- Размер данных версии файла.
+ Размер версии файла в байтахСписокРазмерРасширеннаяПодсказка
diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Module.bsl b/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Module.bsl
index f451bd6ed..1bf30bc85 100644
--- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Module.bsl
+++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Module.bsl
@@ -282,6 +282,11 @@
ФайлОбъект.Записать();
РазблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, УникальныйИдентификаторКарточкиФайла);
+ ВерсияОбъект = Версия.ПолучитьОбъект();
+ ЗаблокироватьДанныеДляРедактирования(Версия, , УникальныйИдентификаторКарточкиФайла);
+ ВерсияОбъект.Записать();
+ РазблокироватьДанныеДляРедактирования(Версия, УникальныйИдентификаторКарточкиФайла);
+
КонецПроцедуры
&НаСервере
diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВыборСпособаСравненияВерсий/Help/ru.html b/SSL/src/Catalogs/ВерсииФайлов/Forms/ВыборСпособаСравненияВерсий/Help/ru.html
index 494aeb548..6f48cf8b1 100644
--- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВыборСпособаСравненияВерсий/Help/ru.html
+++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ВыборСпособаСравненияВерсий/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Выбор программы для сравнения версий файлов. В программе предусмотрена возможность сравнивать версии файлов формата HTML, TXT, RTF, DOC, DOCX, ODT.
Позволяет задать текстовый редактор, который будет использоваться для сравнения версий файлов между собой. Вызывается при выполнении команды Показать отличия из списка версий файла, если текстовый редактор для сравнения не задан по умолчанию.
По окончании редактирования файла (по команде Завершить редактирование в списке файлов) программа рекомендует сохранить версию файла и ввести информацию о данной версии. По умолчанию эта возможность включена (рекомендуется использовать сохранение версий, так как в случае серьезных ошибок, которые привели к порче файла, можно вернуться к более ранней, неиспорченной версии). Впоследствии можно отредактировать комментарий и при необходимости изменить автора версии.
Предназначен для просмотра и управления версиями файла.
Для просмотра списка всех версий файла откройте его карточку (в списке файлов нажмите F2 или Еще -Открыть карточку) и нажмите Версии файла на панели навигации.
Список версий является иерархическим, для удобства просмотра отображается в виде дерева. В этом случае легко проследить историю редактирования файла. Более поздние версии отображаются подчиненными более ранним. При этом первую версию файла удалить из списка невозможно.
diff --git a/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl b/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl
index 0aef8819e..2a6568b77 100644
--- a/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl
+++ b/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl
@@ -116,6 +116,7 @@
КонецЕсли;
Исключение
+ // Обработка исключения не требуется
КонецПопытки;
КонецЕсли;
КонецЕсли;
diff --git a/SSL/src/Catalogs/ВерсииФайлов/ВерсииФайлов.mdo b/SSL/src/Catalogs/ВерсииФайлов/ВерсииФайлов.mdo
index 1460f89b2..1985a0486 100644
--- a/SSL/src/Catalogs/ВерсииФайлов/ВерсииФайлов.mdo
+++ b/SSL/src/Catalogs/ВерсииФайлов/ВерсииФайлов.mdo
@@ -57,9 +57,13 @@
UseOwner
+
+ ru
+ Файл
+ ru
- Владелец
+ Владелец версии файлаtrue
@@ -149,7 +153,7 @@
ru
- Пользователь, который добавил версию файла
+ Пользователь, который добавил версию файла в список
@@ -165,7 +169,7 @@
ДатаМодификацииУниверсальнаяru
- Дата модификации универсальная
+ Дата изменения (универсальное время)Date
@@ -173,7 +177,7 @@
ru
- Дата изменения данных версии файла, приведенная к Гринвичу (очищенная от смещения летнего времени и смещения зоны)
+ Дата изменения данных версии файла (универсальное время)
@@ -186,7 +190,7 @@
ДатаМодификацииФайлаru
- Дата модификации файла
+ Дата изменения (местное время)Date
@@ -214,7 +218,7 @@
ru
- Дата добавления версии файла в базу
+ Дата добавления версии файла в список
@@ -229,14 +233,14 @@
Зашифрованru
- Зашифрован
+ ЗашифрованаBooleanru
- Версия зашифрована
+ Признак того, что версия файла зашифрована
@@ -249,7 +253,7 @@
ИндексКартинкиru
- Индекс картинки
+ Индекс значкаNumber
@@ -259,7 +263,7 @@
ru
- Индекс иконки, соответствующей расширению файла, для показа в списке
+ Индекс значка версии файла (служебное поле)
@@ -280,7 +284,7 @@
ru
- Комментарий к версии
+ Комментарий к версии файлаtrue
@@ -293,7 +297,7 @@
НомерВерсииru
- Номер версии
+ НомерNumber
@@ -315,14 +319,14 @@
ПодписанЭПru
- Подписан ЭП
+ Подписана электронноBooleanru
- Файл версии подписан ЭП
+ Признак того, что версия файла подписана электронно
@@ -344,7 +348,7 @@
ru
- Полное наименование (длиной до 256 символов)
+ Имя версии файла (без расширения) длиной до 256 символов
@@ -367,7 +371,7 @@
ru
- Дополнительный путь к файлу на диске (когда файл хранится в томе)
+ Путь к версии файла в томе (служебное поле)
@@ -388,7 +392,7 @@
ru
- Размер данных версии файла
+ Размер версии файла в байтах
@@ -433,7 +437,7 @@
ru
- Родительская версия для данной версии - возможна древесная структура версий
+ Родительская версия (возможна иерархическая структура версий)
@@ -455,7 +459,7 @@
ru
- Статус извлечения текста - для фонового задания извлечения текста
+ Статус извлечения текста из файла (служебное поле)
@@ -477,7 +481,7 @@
ru
- Текст, извлеченный из файла - для полнотекстового поиска
+ Текст, извлеченный из файла (служебное поле)
@@ -489,14 +493,14 @@
ТипХраненияФайлаru
- Тип хранения файла
+ Тип хранения версии файлаEnumRef.ТипыХраненияФайловru
- Где хранятся файлы - в базе как хранилище значения или в каталоге на диске
+ Тип хранения версии файла (в томе или в информационной базе)
@@ -515,7 +519,7 @@
ru
- Том хранения файлов (если файл хранится в томе)
+ Том хранения файлов (когда версия файла хранится в томе)
@@ -528,14 +532,14 @@
ФайлХранилищеru
- Файл
+ Временное хранилище версии файлаValueStorageru
- Временное хранилище файла (служебное поле)
+ Временное хранилище версии файла (служебное поле)
diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Help/ru.html b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Help/ru.html
index 285244f84..489b34d32 100644
--- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Help/ru.html
+++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Список предназначен для выбора вида контактной информации.
Виды контактной информации представляют собой предопределенные группы, каждая из которых соответствует спискам или документам, которые являются носителями контактной информации, а элементы внутри этих групп определяют состав контактной информации этих объектов программы. При этом состав групп не может быть изменен. Список групп имеет иерархическую структуру в виде дерева.
diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl
index d2c4e70ed..13da2eccd 100644
--- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl
+++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl
@@ -1,22 +1,3 @@
-
-#Область ОбработчикиКомандФормы
-
-&НаКлиенте
-Процедура ПереместитьЭлементВверх()
-
- НастройкаПорядкаЭлементовКлиент.ПереместитьЭлементВверхВыполнить(Список, Элементы.Список);
-
-КонецПроцедуры
-
-&НаКлиенте
-Процедура ПереместитьЭлементВниз()
-
- НастройкаПорядкаЭлементовКлиент.ПереместитьЭлементВнизВыполнить(Список, Элементы.Список);
-
-КонецПроцедуры
-
-#КонецОбласти
-
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
@@ -32,3 +13,45 @@
КонецПроцедуры
#КонецОбласти
+
+#Область ОбработчикиКомандФормы
+
+&НаКлиенте
+Процедура ПереместитьЭлементВверх()
+
+ Если Не ВозможноПеремещениеЭлемента(Элементы.Список.ТекущиеДанные.Ссылка, "Вверх") Тогда
+ ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Нстр("ru = 'Перемещение данного вида контактной информации не предусмотрено'"));
+ Возврат;
+ КонецЕсли;
+
+ НастройкаПорядкаЭлементовКлиент.ПереместитьЭлементВверхВыполнить(Список, Элементы.Список);
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПереместитьЭлементВниз()
+
+ Если Не ВозможноПеремещениеЭлемента(Элементы.Список.ТекущиеДанные.Ссылка, "Вниз") Тогда
+ ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Нстр("ru = 'Перемещение данного вида контактной информации не предусмотрено'"));
+ Возврат;
+ КонецЕсли;
+
+ НастройкаПорядкаЭлементовКлиент.ПереместитьЭлементВнизВыполнить(Список, Элементы.Список);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+&НаСервере
+Функция ВозможноПеремещениеЭлемента(ТекущийЭлемент, Направление)
+
+ СоседнийЭлемент = НастройкаПорядкаЭлементовСлужебный.СоседнийЭлемент(ТекущийЭлемент, Список, Направление);
+
+ Возврат СоседнийЭлемент = Неопределено Или Не (ТекущийЭлемент.ЗапретитьРедактированиеПользователем Или СоседнийЭлемент.ЗапретитьРедактированиеПользователем);
+
+КонецФункции
+
+#КонецОбласти
+
diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form
index ffbc7af5f..72b8addf8 100644
--- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form
+++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form
@@ -572,7 +572,7 @@
123ru
- При проверки адреса по классификатору ФИАС выполняются дополнительные проверки:
+ При проверке адреса по классификатору ФИАС выполняются дополнительные проверки:
- "Округ" (между уровнями "Регион" и "Район").
- "Внутригородской район" (между уровнями "Город" и "Населенный пункт")
- Уровни дополнительных территорий (между "Улица", и номером дома или владения)
@@ -1074,6 +1074,7 @@
true
+ true
diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Help/ru.html
index 0f25d2700..f119a22ee 100644
--- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Help/ru.html
+++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Описание свойств поля контактной информации.
Поставка программы осуществляется c предопределенными полями контактной информации для некоторых документов и списков. У предопределенных полей контактной информации можно только поменять настройки, остальные реквизиты заполнены по умолчанию и защищены от редактирования.
Предназначен для настройки видов контактной информации в документах и списках программы.
Программа позволяет хранить и обрабатывать контактную информацию, использующуюся на предприятии.
Работа с контактной информацией в разных списках программы реализована одинаково. Все списки предоставляют одинаковую возможность по работе с адресами или телефонами. В программе также предусмотрена возможность хранения контактной информации в табличных частях документов и загрузка контактной информации. В табличных частях документов можно редактировать контактную информацию. Такая возможность может потребоваться при работе в документах представляемой электронной отчетности. Связано это с необходимостью сохранения в данных документа точной копии представленных в фискальные органы сведений, в том числе адресов и телефонов физических лиц.
diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo
index cf077817b..1713cc961 100644
--- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo
+++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo
@@ -469,6 +469,25 @@
UseUse
+
+ ЗапретитьРедактированиеПользователем
+
+ ru
+ Запретить редактирование пользователем
+
+
+ Boolean
+
+
+ ru
+ Запретить редактирование пользователем вида пользователем
+
+
+
+
+ Use
+ Use
+ ФормаСписка
diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl
index b6beef754..9b56e4949 100644
--- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl
+++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl
@@ -66,6 +66,11 @@
Элементы.СоздатьВнешнегоПользователя.Видимость = Ложь;
КонецЕсли;
+ Если Не Пользователи.РолиДоступны("ДобавлениеИзменениеВнешнихПользователей") Тогда
+ Элементы.ВнешниеПользователиСписокКонтекстноеМенюНазначитьГруппы.Видимость = Ложь;
+ Элементы.НазначитьГруппы.Видимость = Ложь;
+ КонецЕсли;
+
Если НЕ Пользователи.ЭтоПолноправныйПользователь(, ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы().Локальный) Тогда
Если Элементы.Найти("ПользователиИБ") <> Неопределено Тогда
Элементы.ПользователиИБ.Видимость = Ложь;
diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Help/ru.html
index d5ba65641..f0e418f72 100644
--- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Help/ru.html
+++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для ведения пользователей, которые работают с программой "извне". Их доступ, как правило, сильно ограничен. Внешние пользователи не принимают активного участия в процессах учета, работают обособленно, не взаимодействуют между собой. Например, это сотрудники в кадровой базе, покупатели в интернет-магазине, респонденты в базе для анкетирования.
Открыть список внешних пользователей можно из раздела Администрирование - Настройки пользователей и прав. Также можно его открыть из раздела Анкетирование (Управление доступом).
Внешние пользователи программы разного типа, поэтому информация о них хранится в различных списках программы.
diff --git a/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ВопросыШаблонаАнкеты.mdo b/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ВопросыШаблонаАнкеты.mdo
index e8a1f5382..2bd7cb0fd 100644
--- a/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ВопросыШаблонаАнкеты.mdo
+++ b/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ВопросыШаблонаАнкеты.mdo
@@ -59,6 +59,10 @@
UseOwner
+
+ ru
+ Шаблон анкеты
+ ruШаблон анкеты, которому принадлежит данный вопрос
@@ -75,6 +79,10 @@
UseParent
+
+ ru
+ Раздел
+ ruРаздел, в который входит вопрос шаблона анкеты
diff --git a/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ВстречаПрисоединенныеФайлы.mdo b/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ВстречаПрисоединенныеФайлы.mdo
index dcd23abd3..a238f73f8 100644
--- a/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ВстречаПрисоединенныеФайлы.mdo
+++ b/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ВстречаПрисоединенныеФайлы.mdo
@@ -120,7 +120,7 @@
ru
- Пользователь, добавивший файл
+ Пользователь, который добавил файл в список
@@ -138,14 +138,14 @@
ВладелецФайлаru
- Владелец файла
+ РазмещениеDocumentRef.Встречаru
- Объект-владелец файла
+ Место размещения файла (объект)
@@ -157,7 +157,7 @@
ДатаМодификацииУниверсальнаяru
- Дата модификации универсальная
+ Дата изменения (универсальное время)Date
@@ -165,7 +165,7 @@
ru
- Универсальная дата модификации файла
+ Дата изменения данных файла (универсальное время)
@@ -185,7 +185,7 @@
ru
- Дата создания файла
+ Дата добавления файла в список
@@ -219,14 +219,14 @@
Изменилru
- Изменил
+ ОтредактировалCatalogRef.Пользователиru
- Пользователь, отредактировавший файл последним
+ Последний пользователь, который отредактировал файл
@@ -242,7 +242,7 @@
ИндексКартинкиru
- Индекс картинки
+ Индекс значкаNumber
@@ -252,7 +252,7 @@
ru
- Индекс картинки файла (служебное поле)
+ Индекс значка файла (служебное поле)
@@ -286,14 +286,14 @@
ПодписанЭПru
- Подписан ЭП
+ Подписан электронноBooleanru
- Признак того, что файл подписан с помощью электронной подписи.
+ Признак того, что файл подписан электронно
@@ -325,7 +325,7 @@
Размерru
- Размер
+ Размер (байт)Number
@@ -377,7 +377,7 @@
ru
- Пользователь, редактирующий файл в данный момент
+ Пользователь, который занял файл для редактирования
@@ -441,7 +441,7 @@
ru
- Тип хранения файла (в томе или непосредственно в системе)
+ Тип хранения файла (в томе или в информационной базе)
@@ -460,7 +460,7 @@
ru
- Том для хранения файла
+ Том хранения файлов (когда файл хранится в томе)
@@ -472,7 +472,7 @@
ФайлХранилищеru
- Файл хранилище
+ Временное хранилище файлаValueStorage
diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Help/ru.html
index 24676c12c..294743144 100644
--- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Help/ru.html
+++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Внешних пользователей можно объединять в группы по разным признакам. Группа внешних пользователей может включать однородных пользователей, например, контрагентов или физические лица. Также можно создать группу внешних пользователей, которая включает различных внешних пользователей со сходными свойствами, например, респондентов или участников опроса. Так удобнее настраивать права доступа.
diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Module.bsl
index 6f11dd45b..893d01de8 100644
--- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Module.bsl
+++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Module.bsl
@@ -21,7 +21,7 @@
Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
Если Объект.Родитель = Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи
- Или ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Родитель, "ВсеОбъектыАвторизации") Тогда
+ Или ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Родитель, "ВсеОбъектыАвторизации") = Истина Тогда
Объект.Родитель = Справочники.ГруппыВнешнихПользователей.ПустаяСсылка();
КонецЕсли;
@@ -428,6 +428,7 @@
Функция ПеремещениеПользователяВГруппу(МассивПользователей, НоваяГруппаВладелец)
МассивПеремещенныхПользователей = Новый Массив;
+ МассивНеПеремещенныхПользователей = Новый Массив;
Для Каждого ПользовательСсылка Из МассивПользователей Цикл
ПараметрыОтбора = Новый Структура("ВнешнийПользователь", ПользовательСсылка);
@@ -440,7 +441,7 @@
КонецЦикла;
Возврат ПользователиСлужебный.ФормированиеСообщенияПользователю(
- МассивПеремещенныхПользователей, НоваяГруппаВладелец, Ложь);
+ МассивПеремещенныхПользователей, НоваяГруппаВладелец, Ложь, МассивНеПеремещенныхПользователей);
КонецФункции
@@ -498,7 +499,7 @@
ДействияВФорме.СоставГруппы = "Редактирование";
ДействияВФорме.СвойстваЭлемента = "Редактирование";
- ИначеЕсли РольДоступна("ДобавлениеИзменениеВнешнихПользователей") Тогда
+ ИначеЕсли Пользователи.РолиДоступны("ДобавлениеИзменениеВнешнихПользователей") Тогда
// Менеджер внешних пользователей.
ДействияВФорме.Роли = "";
ДействияВФорме.СоставГруппы = "Редактирование";
diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Help/ru.html b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Help/ru.html
index c46de5427..69edb6e91 100644
--- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Help/ru.html
+++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Т.к. групп доступа может быть очень много и с похожими настройками ограничений прав, предусмотрена возможность создавать папки для упрощения поиска нужной группы доступа и понимания ограничений прав доступа в целом.
Группы доступа можно сгруппировать по различным признакам.
Т.к. групп доступа может быть очень много и с похожими настройками ограничений прав, предусмотрена возможность создавать папки для упрощения поиска нужной группы доступа и понимания ограничений прав доступа в целом.
Группы доступа можно сгруппировать в папки по различным признакам.
Список групп доступа предназначен для ведения групп доступа и позволяет просмотреть имеющиеся настройки прав с ограничениями.
Список групп доступа открывается по команде Группы доступа из раздела Администрирование - Настройки пользователей и прав. Для быстрого перехода к списку групп доступа, созданных на базе профиля групп доступа, можно воспользоваться командой Группы доступа на панели навигации профиля групп доступа.
Группа доступа определяет совокупность действий с данными программы, которые могут выполнять участники этой группы. Как правило, группы доступа соответствуют различным должностным обязанностям (или видам деятельности) пользователей программы. Пользователь может входить одновременно в одну или несколько групп доступа, которые в совокупности образуют его персональные настройки прав доступа.
Группа доступа определяет совокупность действий с данными программы, которые могут выполнять участники этой группы. Как правило, группы доступа соответствуют различным должностным обязанностям (или видам деятельности) пользователей программы. Пользователь может входить одновременно в одну или несколько групп доступа, которые в совокупности образуют его персональные настройки прав доступа.
С помощью группы доступа можно задавать и администрировать общие настройки прав доступа для некоторой группы пользователей, выполняющих однотипные функции в программе, например, Бухгалтеры.
Группы доступа предназначены для настройки прав и ограничений прав доступа конкретным пользователям и группам пользователей программы.
Программа позволяет настроить доступ пользователей к различным функциям, спискам и документам. Предусмотрены предопределенные наборы ролей. Кроме этого, имеется возможность самостоятельной настройки доступа. Управление доступом осуществляет администратор. При этом пользователь, назначенный ответственным в группе доступа, может изменять состав своей группы доступа.
Набор прав и возможности по их ограничению определяются заданным профилем групп доступа.
Просмотр и редактирование свойств группы пользователей.
Пользователей можно объединять в группы по разным признакам, например, по должностям или в соответствии со структурой предприятия. Это ускоряет настройку прав доступа - можно настроить их одновременно нескольким пользователям, которые выполняют сходные функции.
diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Module.bsl
index 969c00994..ad6b87eb5 100644
--- a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Module.bsl
+++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Module.bsl
@@ -175,6 +175,7 @@
Функция ПеремещениеПользователяВГруппу(МассивПользователей, НоваяГруппаВладелец)
МассивПеремещенныхПользователей = Новый Массив;
+ МассивНеПеремещенныхПользователей = Новый Массив;
Для Каждого ПользовательСсылка Из МассивПользователей Цикл
ПараметрыОтбора = Новый Структура("Пользователь", ПользовательСсылка);
@@ -187,7 +188,7 @@
КонецЦикла;
Возврат ПользователиСлужебный.ФормированиеСообщенияПользователю(
- МассивПеремещенныхПользователей, НоваяГруппаВладелец, Ложь);
+ МассивПеремещенныхПользователей, НоваяГруппаВладелец, Ложь, МассивНеПеремещенныхПользователей);
КонецФункции
diff --git a/SSL/src/Catalogs/ГруппыПользователей/Help/ru.html b/SSL/src/Catalogs/ГруппыПользователей/Help/ru.html
index 2331c5ecb..4c072e5a4 100644
--- a/SSL/src/Catalogs/ГруппыПользователей/Help/ru.html
+++ b/SSL/src/Catalogs/ГруппыПользователей/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для ведения групп пользователей.
Удобно использовать группы, когда в программе много пользователей:
diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Module.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Module.bsl
index f4013377b..9325e7eb5 100644
--- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Module.bsl
+++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Module.bsl
@@ -134,7 +134,7 @@
&НаСервере
Процедура ЗаполнитьТаблицы()
СписокВыбранных = Параметры.ПользователиСБыстрымДоступом;
- Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Пользователи ГДЕ НЕ ПометкаУдаления И НЕ Недействителен");
+ Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Пользователи ГДЕ НЕ ПометкаУдаления И НЕ Недействителен И НЕ Служебный");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если СписокВыбранных.НайтиПоЗначению(Выборка.Ссылка) = Неопределено Тогда
diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form
index 1ed9fd4b8..21e8d850a 100644
--- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form
+++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form
@@ -281,17 +281,104 @@
Часть сведений в карточке дополнительного отчета или обработки программа проставляет по умолчанию, они указаны разработчиком в файле внешней обработки или отчета и их невозможно изменить (список команд и дополнительная информация). Каждая дополнительная обработка может предоставлять одну или несколько команд, размещаемых в окнах объектов программы или в разделах программы.
Существуют два типа дополнительных отчетов и обработок:
@@ -32,7 +32,7 @@
Версия;
Имя объекта;
Описание - подробная информация о дополнительном отчете или обработке.
Группа - включите дополнительную обработку или отчет в одну из групп. Выберите нужную группу из списка. Группы помогают упорядочить дополнительные отчеты и обработки.
Загрузка из файла
-
С помощью команды Загрузить из файла можно обновить обработку во внутреннем хранилище программы. Укажите путь к файлу, нажмите Открыть.
Выгрузка в файл
+
С помощью команды Загрузить из файла можно обновить обработку во внутреннем хранилище программы. Вид загружаемой обработки должен соответствовать текущему виду обработки. Укажите путь к файлу, нажмите Открыть.
Выгрузка в файл
С помощью команды Выгрузить в файл можно выгрузить дополнительный отчет или обработку из хранилища в файл на диске компьютера. Укажите папку на компьютере, нажмите Сохранить. Имя файлу присваивается автоматически, имеется возможность его переименовать.
Как правило, большинство обработок должны выполняться в безопасном режиме. Это гарантирует, что они не содержат "ненадежный" программный код, который выполняется на сервере.
Однако некоторые обработки могут требовать выполнения в небезопасном режиме. Такие обработки следует загружать только из надежных источников (поставщиков) или перед загрузкой самостоятельно выполнять их аудит.
diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl
index 863455068..b9a7fbc65 100644
--- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl
+++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl
@@ -12,8 +12,14 @@
// Проверка возможности загрузки новых обработок в информационную базу.
ЭтоНовый = Объект.Ссылка.Пустая();
- Если ЭтоНовый И НЕ ДополнительныеОтчетыИОбработки.ПравоДобавления() Тогда
- ВызватьИсключение НСтр("ru = 'Недостаточно прав доступа для добавления дополнительных отчетов или обработок.'");
+ ПравоДобавления = ДополнительныеОтчетыИОбработки.ПравоДобавления();
+ Если Не ПравоДобавления Тогда
+ Если ЭтоНовый Тогда
+ ВызватьИсключение НСтр("ru = 'Недостаточно прав доступа для добавления дополнительных отчетов или обработок.'");
+ Иначе
+ Элементы.ЗагрузитьИзФайла.Видимость = Ложь;
+ Элементы.ВыгрузитьВФайл.Видимость = Ложь;
+ КонецЕсли;
КонецЕсли;
// Ограничение возможности выбора вида публикации в зависимости от настроек информационной базы.
@@ -28,10 +34,12 @@
Элементы.СтраницаДополнительнаяИнформация.Видимость = ОтображениеРасширеннойИнформации;
// Ограничение возможности загрузки обработки из файла / сохранения в файл.
- Элементы.ЗагрузитьИзФайла.Видимость =
- ДополнительныеОтчетыИОбработки.ВозможнаЗагрузкаОбработкиИзФайла(Объект.Ссылка);
- Элементы.ВыгрузитьВФайл.Видимость =
- ДополнительныеОтчетыИОбработки.ВозможнаВыгрузкаОбработкиВФайл(Объект.Ссылка);
+ Если Не ДополнительныеОтчетыИОбработки.ВозможнаЗагрузкаОбработкиИзФайла(Объект.Ссылка) Тогда
+ Элементы.ЗагрузитьИзФайла.Видимость = Ложь;
+ КонецЕсли;
+ Если Не ДополнительныеОтчетыИОбработки.ВозможнаВыгрузкаОбработкиВФайл(Объект.Ссылка) Тогда
+ Элементы.ВыгрузитьВФайл.Видимость = Ложь;
+ КонецЕсли;
ВидДополнительнаяОбработка = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка;
ВидДополнительныйОтчет = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет;
@@ -500,7 +508,7 @@
ПараметрыДиалога.Заголовок = НСтр("ru = 'Выберите файл внешней обработки'");
КонецЕсли;
- ДополнительныеОтчетыИОбработкиКлиент.ПоказатьПомещениеФайла(Обработчик, УникальныйИдентификатор, Объект.ИмяФайла, ПараметрыДиалога);
+ СтандартныеПодсистемыКлиент.ПоказатьПомещениеФайла(Обработчик, УникальныйИдентификатор, Объект.ИмяФайла, ПараметрыДиалога);
КонецПроцедуры
&НаКлиенте
@@ -914,10 +922,10 @@
Иначе
ЗаголовокОшибки = НСтр("ru = 'Обработка не подключена'");
КонецЕсли;
- СтандартныеПодсистемыКлиентСервер.РезультатВыполненияДобавитьПредупреждение(
+ СтандартныеПодсистемыКлиентСервер.ВывестиПредупреждение(
ПараметрыРегистрации,
ПараметрыРегистрации.ТекстОшибки,
- НСтр("ru = 'Техническая информация:'") + Символы.ПС + ПараметрыРегистрации.КраткоеПредставлениеОшибки,
+ ПараметрыРегистрации.КраткоеПредставлениеОшибки,
ЗаголовокОшибки);
КонецЕсли;
diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Help/ru.html b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Help/ru.html
index c4c4b42b0..2801888f7 100644
--- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Help/ru.html
+++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для хранения в программе дополнительных отчетов и обработок.
Программа позволяет подключать и использовать дополнительные (внешние) отчеты и обработки в режиме 1С:Предприятия. Они позволяют расширять возможности программы, не внося в нее изменений, что может быть востребовано для оперативного решения каких-либо задач без снятия с поддержки поставщика программы.
Дополнительные отчеты и обработки разрабатываются в режиме Конфигуратора, для этого надо обращаться к разработчику. Также можно получить их из интернета.
diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl
index 91649d605..259fb9a30 100644
--- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl
+++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl
@@ -155,8 +155,9 @@
ПриЗаписиНазначаемойОбработки(Отказ);
КонецЕсли;
- Если Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда
- ПриЗаписиГлобальногоОтчета(Отказ);
+ Если Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет
+ Или Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет Тогда
+ ПриЗаписиОтчета(Отказ);
КонецЕсли;
КонецПроцедуры
@@ -391,7 +392,7 @@
////////////////////////////////////////////////////////////////////////////////
// Глобальные отчеты
-Процедура ПриЗаписиГлобальногоОтчета(Отказ)
+Процедура ПриЗаписиОтчета(Отказ)
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда
diff --git a/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаЭлемента/Help/ru.html
index 2655da4fb..a60539b01 100644
--- a/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаЭлемента/Help/ru.html
+++ b/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаЭлемента/Help/ru.html
@@ -1,7 +1,7 @@
-
+
Предназначена для настройки и хранения отборов, по которым в дальнейшем можно осуществлять быстрый доступ к группе документов взаимодействий.
Закладки могут быть только индивидуальными. С помощью закладок можно группировать документы взаимодействий, например, по отделам предприятия, используя различные условия отбора.
Напишите Наименование. Поле является обязательным.
Для того чтобы задать новое условие для отбора, нажмите Добавить новый элемент. Условий может быть несколько.
В колонке Поле выберите поле документа взаимодействий, по которому будет происходить отбор. Для этого в списке укажите нужное поле, затем нажмите Выбрать. Также можно использовать двойной щелчок мыши.
diff --git a/SSL/src/Catalogs/ЗакладкиВзаимодействий/Help/ru.html b/SSL/src/Catalogs/ЗакладкиВзаимодействий/Help/ru.html
index 56b34feb0..dc7278660 100644
--- a/SSL/src/Catalogs/ЗакладкиВзаимодействий/Help/ru.html
+++ b/SSL/src/Catalogs/ЗакладкиВзаимодействий/Help/ru.html
@@ -1,4 +1,4 @@
-
+
С помощью закладок можно группировать документы в списке взаимодействий, например, разместить их в группы по отделам предприятия, используя различные условия отбора. Закладки могут быть только индивидуальными.
Для того чтобы использовать эту возможность, выберите группировку списка взаимодействий По закладкам.
Ввод закладок
diff --git a/SSL/src/Catalogs/ЗакладкиВзаимодействий/ЗакладкиВзаимодействий.mdo b/SSL/src/Catalogs/ЗакладкиВзаимодействий/ЗакладкиВзаимодействий.mdo
index d2abee39b..1c0fc8ac1 100644
--- a/SSL/src/Catalogs/ЗакладкиВзаимодействий/ЗакладкиВзаимодействий.mdo
+++ b/SSL/src/Catalogs/ЗакладкиВзаимодействий/ЗакладкиВзаимодействий.mdo
@@ -58,6 +58,10 @@
UseOwner
+
+ ru
+ Пользователь
+ ruПользователь, создавший закладку
@@ -74,6 +78,10 @@
UseParent
+
+ ru
+ Группа
+ ruГруппа, в которую входит данная закладка
diff --git a/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Help/ru.html b/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Help/ru.html
index 4525d43da..f5938c351 100644
--- a/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Help/ru.html
+++ b/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Список предназначен для работы с заметками. В списке находятся все заметки, созданные Вами в программе.
Открывается по команде Все заметки в разделе Органайзер.
В программе можно вести заметки - произвольную текстовую информацию, для которой не получается подобрать какого-либо подходящего справочника или документа и которая никому больше не должна быть доступна. Заметки доступны только их автору.
Все заметки, введенные по поводу данного объекта программы, отображаются в этом списке.
Открывается из карточки объекта программы по команде Мои заметки панели навигации.
В списках объекты, с которыми связаны заметки, помечены значком .
diff --git a/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Module.bsl b/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Module.bsl
index b69b2dc11..8fefb659f 100644
--- a/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Module.bsl
+++ b/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Module.bsl
@@ -11,10 +11,16 @@
Если Параметры.Свойство("Предмет") Тогда
Предмет = Параметры.Предмет;
Список.Параметры.УстановитьЗначениеПараметра("Предмет", Предмет);
- КонецЕсли;
+ КонецЕсли;
Список.Параметры.УстановитьЗначениеПараметра("Пользователь", Пользователи.ТекущийПользователь());
Список.Параметры.УстановитьЗначениеПараметра("ПоказыватьЗаметкиДругихПользователей", Ложь);
Список.Параметры.УстановитьЗначениеПараметра("ПоказыватьУдаленные", Ложь);
+
+ Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда
+ Элементы.Автор.Видимость = Ложь;
+ Элементы.ПоказыватьЗаметкиДругихПользователей.Видимость = Ложь;
+ КонецЕсли;
+
КонецПроцедуры
&НаСервере
diff --git a/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Help/ru.html b/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Help/ru.html
index 490a8d3b1..48077500c 100644
--- a/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Help/ru.html
+++ b/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Список размещается на рабочем столе программы, предназначен для работы с заметками.
В программе можно вести заметки - произвольную текстовую информацию, для которой не получается подобрать какого-либо подходящего справочника или документа и которая никому больше не должна быть доступна. Заметки доступны только их автору.
В заметки не следует помещать информацию, для хранения которой в программе предусмотрены соответствующие списки или документы.
Список Все заметки можно группировать. Для этого нужно создать необходимое количество групп и перетащить в них заметки с помощью мыши. Также при вводе заметки можно выбрать группу, в которую она входит.
Ввод группы заметок
diff --git a/SSL/src/Catalogs/Заметки/Forms/ФормаГруппы/Module.bsl b/SSL/src/Catalogs/Заметки/Forms/ФормаГруппы/Module.bsl
index 2348d7f2b..021d99642 100644
--- a/SSL/src/Catalogs/Заметки/Forms/ФормаГруппы/Module.bsl
+++ b/SSL/src/Catalogs/Заметки/Forms/ФормаГруппы/Module.bsl
@@ -11,6 +11,11 @@
Если Объект.Ссылка.Пустая() Тогда
Объект.Автор = Пользователи.ТекущийПользователь();
КонецЕсли;
+
+ Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда
+ Элементы.Автор.Видимость = Ложь;
+ КонецЕсли;
+
КонецПроцедуры
#КонецОбласти
diff --git a/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Help/ru.html
index ed988acd5..dbad152d9 100644
--- a/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Help/ru.html
+++ b/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Help/ru.html
@@ -1,4 +1,4 @@
-
+
В заметке можно поместить произвольную текстовую информацию, для которой не получается подобрать какого-либо подходящего справочника или документа и которая больше никому не должна быть доступна.
Заметки доступны в карточке объектов программы или на рабочем столе, поэтому в заметке можно быстро на короткое время записать какую-либо информацию, а затем перенести в более подходящий справочник. Например, можно использовать заметку как временное место для быстрой записи адреса во время телефонного разговора с клиентом, для того чтобы затем не спеша перенести этот адрес в справочник Контрагенты.
Также можно использовать заметки и для хранения информации, которая актуальна в течение длительного времени (например, как записную книжку, в которой можно сделать запись о дне рождения коллеги или важного для вас клиента, при этом можно ввести напоминание по поводу заметки, чтобы не забыть поздравить).
Список Заметки относится к внутренним данным для администратора. Полезен для контроля всех заметок в программе, введенными всеми пользователями в программе.
Для работы со своими заметками и ввода заметок используйте списки Все заметки или Мои заметки рабочего стола. Группы, введенные в списке Все заметки, отражаются также и в этом списке.
diff --git a/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ЗапланированноеВзаимодействиеПрисоединенныеФайлы.mdo b/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ЗапланированноеВзаимодействиеПрисоединенныеФайлы.mdo
index 993d843e7..c5a447512 100644
--- a/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ЗапланированноеВзаимодействиеПрисоединенныеФайлы.mdo
+++ b/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ЗапланированноеВзаимодействиеПрисоединенныеФайлы.mdo
@@ -120,7 +120,7 @@
ru
- Пользователь, добавивший файл
+ Пользователь, который добавил файл в список
@@ -138,14 +138,14 @@
ВладелецФайлаru
- Владелец файла
+ РазмещениеDocumentRef.ЗапланированноеВзаимодействиеru
- Объект-владелец файла
+ Место размещения файла (объект)
@@ -157,7 +157,7 @@
ДатаМодификацииУниверсальнаяru
- Дата модификации универсальная
+ Дата изменения (универсальное время)Date
@@ -165,7 +165,7 @@
ru
- Универсальная дата модификации файла
+ Дата изменения данных файла (универсальное время)
@@ -185,7 +185,7 @@
ru
- Дата создания файла
+ Дата добавления файла в список
@@ -219,14 +219,14 @@
Изменилru
- Изменил
+ ОтредактировалCatalogRef.Пользователиru
- Пользователь, отредактировавший файл последним
+ Последний пользователь, который отредактировал файл
@@ -242,7 +242,7 @@
ИндексКартинкиru
- Индекс картинки
+ Индекс значкаNumber
@@ -252,7 +252,7 @@
ru
- Индекс картинки файла (служебное поле)
+ Индекс значка файла (служебное поле)
@@ -286,14 +286,14 @@
ПодписанЭПru
- Подписан ЭП
+ Подписан электронноBooleanru
- Признак того, что файл подписан с помощью электронной подписи.
+ Признак того, что файл подписан электронно
@@ -325,7 +325,7 @@
Размерru
- Размер
+ Размер (байт)Number
@@ -377,7 +377,7 @@
ru
- Пользователь, редактирующий файл в данный момент
+ Пользователь, который занял файл для редактирования
@@ -441,7 +441,7 @@
ru
- Тип хранения файла (в томе или непосредственно в системе)
+ Тип хранения файла (в томе или в информационной базе)
@@ -460,7 +460,7 @@
ru
- Том для хранения файла
+ Том хранения файлов (когда файл хранится в томе)
@@ -472,7 +472,7 @@
ФайлХранилищеru
- Файл хранилище
+ Временное хранилище файлаValueStorage
diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаГруппы/Help/ru.html b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаГруппы/Help/ru.html
index 65c09e677..dfacff322 100644
--- a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаГруппы/Help/ru.html
+++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаГруппы/Help/ru.html
@@ -1,4 +1,4 @@
-
+
В программе предусмотрена возможность использовать дополнительные реквизиты (сведения) нескольких типов. Тип данных выбирается при настройке дополнительных реквизитов (сведений). При выборе типа данных Дополнительное значение программа предлагает ввести значения в этот список. При этом для каждого дополнительного реквизита или сведения данного типа используется свой список значений. С помощью этого типа данных можно описывать различные свойства объектов программы.
Тип данных Дополнительное значение часто используется, при этом ввод информации сводится к выбору значений из списка, что ускоряет процесс ввода и снижает количество ошибок.
В программе предусмотрена возможность использовать дополнительные реквизиты (сведения) нескольких типов. Тип данных выбирается при настройке дополнительных реквизитов (сведений). При выборе типа данных Дополнительное значение (иерархия) программа предлагает ввести значения в этот список. При этом для каждого дополнительного реквизита или сведения данного типа используется свой список значений.
Тип данных Дополнительное значение (иерархия) часто используется, при этом ввод информации сводится к выбору значений из списка, что ускоряет процесс ввода и снижает количество ошибок. С помощью этого типа данных можно описывать различные свойства объектов программы.
Просмотр свойств идентификатора объекта метаданных.
Заполняется автоматически при первом запуске (и каждом обновлении) конфигурации, согласно метаданным конфигурации, а также автоматически актуализируется при каждом обновлении версии конфигурации (учитываются переименованные, добавленные и удаленные объекты метаданных).
Предназначен для хранения и просмотра идентификаторов объектов метаданных. Данные списка не редактируются, предназначены для обеспечения работы программы.
Список заполняется автоматически при первом запуске (и каждом обновлении) конфигурации, согласно метаданным конфигурации, а также автоматически актуализируется при каждом обновлении версии конфигурации (учитываются переименованные, добавленные и удаленные объекты метаданных).
В списке в виде дерева выводятся все объекты программы, сгруппированные по типам. По умолчанию выводится поле Синоним объекта. По команде Еще - Изменить форму можно добавить в список поля Полное имя и Идентификатор.
График работы вводится на основании производственного календаря. Графики работы можно ввести как для предприятия в целом, так и для его подразделений (например, график работы склада).
В зависимости от производственной необходимости или от потребностей тех подразделений, для которых график работы предназначен, графики работы могут настраиваться на весь год или на определенный период. Также настройка графика работы может проводиться время от времени в течение всего года, на некоторое количество дней вперед.
Программа позволяет формировать и хранить графики работы, которые используются на предприятии. Графики работы формируются на основе производственных календарей. Можно использовать графики работы как для предприятия в целом, так и для его подразделений (например, график работы склада). В графике работы подразделения содержится информация о рабочих днях этого подразделения. Например, если склад предприятия работает на прием товара от поставщиков по вторникам и четвергам, то рабочими днями для графика работы "Прием товара на складе" будут являться вторники и четверги.
В зависимости от производственной необходимости или в зависимости от потребностей тех подразделений, для которых график работы предназначен, графики работы могут настраиваться на весь год или на определенный период. Также настройка графика работы может проводиться время от времени в течение всего года, на некоторое количество дней вперед.
Программа позволяет загружать классификатор банков РФ с сайта агентства "РосБизнесКонсалтинг" (www.rbc.ru). При этом программа учитывает недействующие банки (в карточке такого банка включен соответствующий флажок).
Предназначена для выбора сведений о банках, которые используются при заполнении реквизитов банковских счетов, в документах и других объектах программы.
Деятельность банка прекращена - программа учитывает недействующие банки и автоматически включает флажок для таких банков. Также можно его включить вручную, если получены сведения о закрытии банка.
В классификаторе банков РФ хранятся сведения о банках, которые используются при заполнении реквизитов банковских счетов, в документах и других объектах программы.
Классификатор может быть заполнен автоматически с использованием Общероссийского классификатора банков. При использовании автоматической загрузки классификатора банков существенно снижается трудоемкость ввода информации, ввод информации о банке в различных документах сводится к выбору из классификатора, соответственно сводится к минимуму количество ошибок в отчетности, и кроме того, программа позволяет всегда поддерживать классификатор в актуальном состоянии.
Банки, деятельность которых прекращена, в списке становятся неактивными.
В программе имеются предопределенные ключевые операции. При необходимости можно добавить новые. В качестве ключевых операций могут выступать различные операции программы, например, проведение документа, формирование отчета и т.п. Для того чтобы оценивать производительность программы, необходимо в начале работы программы заполнить параметры ключевых операций (после установки программы параметры ключевых операций не заполнены).
Предназначен для хранения параметров ключевых операций.
Параметры ключевых операций необходимы для оценки производительности работы программы. В программе предусмотрены встроенные средства для сбора и анализа данных о производительности работы по APDEX, которая является международным стандартом оценки производительности информационных систем.
Список открывается по команде Ключевые операции раздела Сервисные подсистемы.
Предназначена для просмотра набора дополнительных реквизитов и сведений.
Выводится Наименование набора, указывается группа справочника, которой соответствует данный набор.
Включает в себя списки дополнительных реквизитов и сведений, входящих в набор. Списки предназначены только для просмотра, изменить в них ничего невозможно. Для изменения воспользуйтесь командами Дополнительные реквизиты или Дополнительные сведения в разделах Администрирование - Общие настройки.
Наименование - название организации, которое будет использоваться в программе при выборе организации.
diff --git a/SSL/src/Catalogs/Организации/Help/ru.html b/SSL/src/Catalogs/Организации/Help/ru.html
index a76e9c59d..8708ef4d8 100644
--- a/SSL/src/Catalogs/Организации/Help/ru.html
+++ b/SSL/src/Catalogs/Организации/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для описания формальной структуры предприятия, которая может состоять из нескольких хозяйствующих субъектов, фактически принадлежащих одному и тому же собственнику (группе собственников), и которые действуют согласованно в целях увеличения прибыли.
Открывается по команде Организации в разделе Справочники.
Входящие - в эту папку попадают по умолчанию все входящие письма.
diff --git a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Help/ru.html b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Help/ru.html
index 2570ade8e..603323a29 100644
--- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Help/ru.html
+++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для категоризации входящей и исходящей почтовой корреспонденции. Владельцем папок является Учетная запись электронной почты.
Открывается по команде Папки электронных писем панели навигации учетной записи электронной почты. Также работать с папками электронной почты можно в списке взаимодействий, выбрав группировку По папкам.
Шесть папок для каждой учетной записи являются предопределенными и не могут быть удалены и изменены:
diff --git a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ПапкиЭлектронныхПисем.mdo b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ПапкиЭлектронныхПисем.mdo
index 5513ee1a9..d2865ae9a 100644
--- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ПапкиЭлектронныхПисем.mdo
+++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ПапкиЭлектронныхПисем.mdo
@@ -59,6 +59,10 @@
UseOwner
+
+ ru
+ Учетная запись
+ ruУчетная запись, к которой принадлежит данная папка
@@ -75,6 +79,10 @@
UseParent
+
+ ru
+ Родитель
+ ruПапка, в которую входит данная папка
diff --git a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Help/ru.html b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Help/ru.html
index 34668885d..8c22eb9e9 100644
--- a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Help/ru.html
+++ b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Список предназначен для удобства согласования пользователей ИБ в Конфигураторе со списками Пользователи и Внешние пользователи.
При записи пользователя (или внешнего пользователя) вместе с ним автоматически создается или изменяется соответствующий ему пользователь ИБ. Однако есть ряд ситуаций, когда список пользователей ИБ становится несогласованным со списком пользователей. Тогда с помощью данного списка могут быть решены следующие задачи:
diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl
index 5e38afe2b..5663aeb12 100644
--- a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl
+++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl
@@ -32,7 +32,7 @@
Элементы.ПользовательИБРежимЗапуска.Видимость = Ложь;
КонецЕсли;
- Если ПользователиСлужебный.ЭтоУчебнаяПлатформа() Тогда
+ Если СтандартныеПодсистемыСервер.ЭтоУчебнаяПлатформа() Тогда
Элементы.СвойстваАутентификацииОС.ТолькоПросмотр = Истина;
КонецЕсли;
@@ -131,8 +131,10 @@
ОбщаяНастройкаФормы(Истина);
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
+ ДополнительныеПараметры = Новый Структура;
+ ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "СтраницаДополнительныеРеквизиты");
МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
- МодульУправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, , "СтраницаДополнительныеРеквизиты");
+ МодульУправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
КонецЕсли;
КонецПроцедуры
@@ -568,7 +570,7 @@
ЭтотОбъект,
ПарольПользователяСервиса);
Иначе
- Подключаемый_EMailНачалоВыбораЗавершение("", Неопределено);
+ Подключаемый_EMailНачалоВыбораЗавершение(Null, Неопределено);
КонецЕсли;
КонецПроцедуры
@@ -580,7 +582,9 @@
Возврат;
КонецЕсли;
- ПарольПользователяСервиса = НовыйПарольПользователяСервиса;
+ Если НовыйПарольПользователяСервиса <> Null Тогда
+ ПарольПользователяСервиса = НовыйПарольПользователяСервиса;
+ КонецЕсли;
ТаблицаКИ = ЭтотОбъект.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов;
@@ -668,11 +672,10 @@
Процедура РолиПометкаПриИзменении(Элемент)
Если Элементы.Роли.ТекущиеДанные <> Неопределено Тогда
- ОбработатьИнтерфейсРолей("ОбновитьСоставРолей");
-
Если Элементы.Роли.ТекущиеДанные.Имя = "ПолныеПрава" Тогда
УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект);
КонецЕсли;
+ ОбработатьИнтерфейсРолей("ОбновитьСоставРолей");
КонецЕсли;
КонецПроцедуры
@@ -1102,23 +1105,37 @@
КонецЕсли;
Результат.Вставить("ПодтверждениеПароля", ПодтверждениеПароля);
- Если НЕ ДляПроверкиПервогоАдминистратора
- И ПользователиСлужебный.ТребуетсяСоздатьПервогоАдминистратора(Результат) Тогда
+ Если Не УровеньДоступа.НастройкиДляВхода Тогда
+ Возврат Результат;
+ КонецЕсли;
+
+ Если Не ПользователиСлужебный.ЗапретРедактированияРолей() Тогда
+ ТекущиеРоли = ПользовательИБРоли.Выгрузить(, "Роль").ВыгрузитьКолонку("Роль");
+ Результат.Вставить("Роли", ТекущиеРоли);
+ КонецЕсли;
+
+ Если ДляПроверкиПервогоАдминистратора Тогда
+ Возврат Результат;
+ КонецЕсли;
+
+ // Добавление ролей требуемых при создании первого администратора.
+ Если ПользователиСлужебный.ТребуетсяСоздатьПервогоАдминистратора(Результат) Тогда
- РолиАдминистратора = Новый Массив;
- РолиАдминистратора.Добавить("ПолныеПрава");
+ Если Результат.Свойство("Роли") И Результат.Роли <> Неопределено Тогда
+ РолиАдминистратора = Результат.Роли;
+ Иначе
+ РолиАдминистратора = Новый Массив;
+ КонецЕсли;
+
+ Если РолиАдминистратора.Найти("ПолныеПрава") = Неопределено Тогда
+ РолиАдминистратора.Добавить("ПолныеПрава");
+ КонецЕсли;
ИмяРолиАдминистратораСистемы = Пользователи.РольАдминистратораСистемы().Имя;
Если РолиАдминистратора.Найти(ИмяРолиАдминистратораСистемы) = Неопределено Тогда
РолиАдминистратора.Добавить(ИмяРолиАдминистратораСистемы);
КонецЕсли;
Результат.Вставить("Роли", РолиАдминистратора);
-
- ИначеЕсли УровеньДоступа.НастройкиДляВхода
- И Не ПользователиСлужебный.ЗапретРедактированияРолей() Тогда
-
- ТекущиеРоли = ПользовательИБРоли.Выгрузить(, "Роль").ВыгрузитьКолонку("Роль");
- Результат.Вставить("Роли", ТекущиеРоли);
КонецЕсли;
Возврат Результат;
diff --git a/SSL/src/Catalogs/Пользователи/Help/ru.html b/SSL/src/Catalogs/Пользователи/Help/ru.html
index 6842a9840..e6b4481ac 100644
--- a/SSL/src/Catalogs/Пользователи/Help/ru.html
+++ b/SSL/src/Catalogs/Пользователи/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для ведения пользователей, которые работают с программой.
Открыть список пользователей можно из раздела Администрирование - Настройки пользователей и прав или Управление доступом с помощью команды Пользователи.
Ведение списка пользователей может осуществлять как администратор, так и ответственный за список внешних пользователей.
ru
- Том для хранения файла
+ Том хранения файлов (когда файл хранится в томе)
@@ -222,7 +222,7 @@
ru
- Тип хранения файла (в томе или непосредственно в системе)
+ Тип хранения файла (в томе или в информационной базе)
diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Help/ru.html b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Help/ru.html
index e21c0a613..f14ddc683 100644
--- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Help/ru.html
+++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Правила применяются автоматически, но иногда их необходимо применить вручную. Например, когда создано новое правило, и необходимо применить его к уже имеющимся письмам.
Открывается по команде Применить правила из окна Правила обработки электронной почты или из списка взаимодействий (группировка по папкам) по команде Применить правила обработки контекстного меню по правой кнопке мыши в панели группировки.
В поле Условие необходимо выбрать наименование созданного правила - текстовое описание условия, по которому будут отбираться письма.
diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Help/ru.html b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Help/ru.html
index f64a9d766..e2aceeb11 100644
--- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Help/ru.html
+++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для создания и хранения условий автоматического распределения входящей и исходящей корреспонденции по папкам. Правила настраиваются для учетной записи электронной почты.
Для писем учетной записи можно задать правила обработки электронной почты, по которым письма будут автоматически размещаться в той или иной папке. Задавать правила обработки имеет смысл, если на учетную запись приходит много корреспонденции.
Открывается соответствующей командой в панели навигации учетной записи электронной почты.
diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ПравилаОбработкиЭлектроннойПочты.mdo b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ПравилаОбработкиЭлектроннойПочты.mdo
index 604a2ba46..f39bcacb0 100644
--- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ПравилаОбработкиЭлектроннойПочты.mdo
+++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ПравилаОбработкиЭлектроннойПочты.mdo
@@ -59,6 +59,10 @@
UseOwner
+
+ ru
+ Учетная запись
+ ruУчетная запись, для которой определяются правила обработки электронной почты
diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Form.form b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Form.form
index 9dc41d63c..36a664a35 100644
--- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Form.form
+++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Form.form
@@ -145,11 +145,6 @@
true
-
- ru
- Решение типичных проблем, установка программ.
-
- ButtonИнструкцияРасширеннаяПодсказка19
@@ -299,7 +294,7 @@
OnCreateAtServerПриСозданииНаСервере
- LockWholeInterface
+ LockOwnertruetrueVertical
diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl
index bbd0213d6..9b2cb616e 100644
--- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl
+++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl
@@ -35,7 +35,13 @@
Элементы.ОписаниеОшибки.Заголовок = ОписаниеОшибки;
Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Такси Тогда
- КоэффициентСжатия = 0.7;
+ СистемнаяИнформация = Новый СистемнаяИнформация;
+ ВерсияПриложения = СистемнаяИнформация.ВерсияПриложения;
+ Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияПриложения, "8.3.6.0") > 0 Тогда
+ КоэффициентСжатия = 0.78;
+ Иначе
+ КоэффициентСжатия = 0.71;
+ КонецЕсли;
Иначе
КоэффициентСжатия = 0.75;
КонецЕсли;
diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Help/ru.html
index 3fc73fa85..a09866512 100644
--- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Help/ru.html
+++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Сведения о программе электронной подписи и шифрования.
\ No newline at end of file
diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl
index 8deab42b9..9a8b0a252 100644
--- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl
+++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl
@@ -1,5 +1,4 @@
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
-
#Область ПрограммныйИнтерфейс
// Возвращает список реквизитов, которые можно редактировать
@@ -13,7 +12,29 @@
КонецФункции
#КонецОбласти
+#КонецЕсли
+#Область ОбработчикиСобытий
+
+Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
+
+ Если ВидФормы = "ФормаСписка" Тогда
+ СтандартнаяОбработка = Ложь;
+ Параметры.Вставить("ПоказатьСтраницуПрограммы");
+ ВыбраннаяФорма = Метаданные.ОбщиеФормы.НастройкиЭлектроннойПодписиИШифрования;
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
+
+ Параметры.Отбор.Вставить("ПометкаУдаления", Ложь);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область СлужебныеПроцедурыИФункции
Функция ПоставляемыеНастройкиПрограмм(ТолькоДляНачальногоЗаполнения = Ложь) Экспорт
@@ -173,25 +194,4 @@
КонецПроцедуры
#КонецОбласти
-
#КонецЕсли
-
-#Область ОбработчикиСобытий
-
-Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
-
- Если ВидФормы = "ФормаСписка" Тогда
- СтандартнаяОбработка = Ложь;
- Параметры.Вставить("ПоказатьСтраницуПрограммы");
- ВыбраннаяФорма = Метаданные.ОбщиеФормы.НастройкиЭлектроннойПодписиИШифрования;
- КонецЕсли;
-
-КонецПроцедуры
-
-Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
-
- Параметры.Отбор.Вставить("ПометкаУдаления", Ложь);
-
-КонецПроцедуры
-
-#КонецОбласти
diff --git a/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Help/ru.html
index 8697ffcf0..945a9dd6b 100644
--- a/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Help/ru.html
+++ b/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Просмотр или формирование производственного календаря.
Производственный календарь - это своеобразный классификатор, постоянные сведения, которые не меняются в течение года.
Производственный календарь РФ (который является общегосударственным) входит в поставляемые данные программы и обновляется по мере утверждения календаря и переносов праздников в РФ.
Предназначен для формирования и хранения производственных календарей.
Открывается по соответствующей команде в разделе Справочники.
Производственный календарь - это своеобразный классификатор, постоянные сведения, которые не меняются в течение года. Их может быть несколько, т.к. в разных регионах предусмотрен разный состав праздничных дней и соответственно переносов.
diff --git a/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl b/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl
index a3681645e..f84045fdd 100644
--- a/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl
+++ b/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl
@@ -98,6 +98,10 @@
И ПраздничныеДни.Найти(ДатаПредпраздничногоДня, "Дата") = Неопределено Тогда
ВидыДней.Вставить(ДатаПредпраздничногоДня, Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный);
КонецЕсли;
+ Если Год(ПраздничныйДень) <> НомерГода Тогда
+ // Праздничные дни другого года далее также пропускаем.
+ Продолжить;
+ КонецЕсли;
Если ВидыДней[ПраздничныйДень] <> Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий
И СтрокаТаблицы.ПереноситьВыходной Тогда
// Если праздничный день выпадает на выходной,
diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбораГруппы/Help/ru.html b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбораГруппы/Help/ru.html
index 6c11df31f..3deef1275 100644
--- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбораГруппы/Help/ru.html
+++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбораГруппы/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Т.к. профилей групп доступа может быть очень много и с похожими настройками ограничений прав, предусмотрена возможность создавать папки для упрощения поиска нужного профиля групп доступа и понимания ограничений прав доступа в целом.
Профилей групп доступа может быть много и с похожим назначением, поэтому предусмотрена возможность создавать папки (группы) для упрощения поиска нужного профиля и понимания принципов их формирования.
Предназначен для управления профилями групп доступа.
Профилей групп доступа может быть много и с похожим назначением, поэтому предусмотрена возможность создавать папки для упрощения поиска нужного профиля и понимания принципов их формирования.
Список открывается по команде Профили групп доступа в разделе Администрирование - Настройка пользователей и прав.
В программе существуют предопределенные профили групп доступа. В ряде случаев предустановленных профилей групп доступа оказывается недостаточно для осуществления требуемой настройки прав доступа пользователей. В таких случаях администратор имеет возможность добавить новые профили групп доступа.
Профиль групп доступа объединяет в себе, как правило, несколько ролей, а также содержит описание видов доступа, в разрезе которых администратор может настраивать права с помощью групп доступа. Таким образом, профиль представляет собой определенный шаблон, в соответствии с которым администратор ведет группы доступа.
Как правило, настройка профилей групп доступа обычно выполняется при внедрении и конфигурировании прикладного решения. Они предназначены для создания готовых подборок разрешенных действий (ролей), содержащих права доступа к объектам программы, и "разрезов" ограничения этих прав (видов доступа), которые предполагается использовать в группах доступа.
В ряде случаев предустановленных профилей групп доступа оказывается недостаточно для осуществления требуемой настройки прав доступа пользователей. В таких случаях администратор имеет возможность добавить новые или изменить предустановленные профили групп доступа.
С помощью профилей становится возможным:
diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl
index f13ca6bfa..969c71ecf 100644
--- a/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl
+++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl
@@ -238,7 +238,7 @@
ПоставляемыеПрофили = УправлениеДоступомСлужебныйПовтИсп.Параметры(
).ПоставляемыеПрофилиГруппДоступа;
- ОписанияПрофилей = ПоставляемыеПрофили.ОписанияПрофилей;
+ ОписанияПрофилей = ПоставляемыеПрофили.ОписанияПрофилейМассив;
ПараметрыОбновления = ПоставляемыеПрофили.ПараметрыОбновления;
ОбновленныеПрофили = Новый Массив;
@@ -253,8 +253,7 @@
| Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа");
ТекущиеПрофили = Запрос.Выполнить().Выгрузить();
- Для каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл
- СвойстваПрофиля = ОписаниеПрофиля.Значение;
+ Для каждого СвойстваПрофиля Из ОписанияПрофилей Цикл
СтрокаТекущегоПрофиля = ТекущиеПрофили.Найти(
Новый УникальныйИдентификатор(СвойстваПрофиля.Идентификатор),
@@ -649,10 +648,10 @@
СсылкиПоставляемыхПрофилей = Новый Массив;
- Для каждого ОписаниеПрофиля Из ПоставляемыеПрофили.ОписанияПрофилей Цикл
+ Для каждого ОписаниеПрофиля Из ПоставляемыеПрофили.ОписанияПрофилейМассив Цикл
СсылкиПоставляемыхПрофилей.Добавить(
Справочники.ПрофилиГруппДоступа.ПолучитьСсылку(
- Новый УникальныйИдентификатор(ОписаниеПрофиля.Значение.Идентификатор)));
+ Новый УникальныйИдентификатор(ОписаниеПрофиля.Идентификатор)));
КонецЦикла;
Запрос = Новый Запрос;
@@ -849,6 +848,7 @@
// Преобразование описаний в соответствие идентификаторов и
// свойств для хранения и быстрой обработки.
СвойстваПрофилей = Новый Соответствие;
+ ОписанияПрофилейМассив = Новый Массив;
Для каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл
// Проверка наличия ролей в метаданных.
Для каждого Роль Из ОписаниеПрофиля.Роли Цикл
@@ -860,6 +860,14 @@
ОписаниеПрофиля.Идентификатор,
Роль);
КонецЕсли;
+ Если ВРег(Лев(Роль, СтрДлина("Профиль"))) = ВРег("Профиль") Тогда
+ ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'В описании профиля ""%1 (%2)""
+ |указана недопустимая роль ""%3"".'"),
+ ОписаниеПрофиля.Имя,
+ ОписаниеПрофиля.Идентификатор,
+ Роль);
+ КонецЕсли;
КонецЦикла;
Если СвойстваПрофилей.Получить(ОписаниеПрофиля.Идентификатор) <> Неопределено Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
@@ -867,6 +875,7 @@
ОписаниеПрофиля.Идентификатор);
КонецЕсли;
СвойстваПрофилей.Вставить(ОписаниеПрофиля.Идентификатор, ОписаниеПрофиля);
+ ОписанияПрофилейМассив.Добавить(ОписаниеПрофиля);
Если ЗначениеЗаполнено(ОписаниеПрофиля.Имя) Тогда
Если СвойстваПрофилей.Получить(ОписаниеПрофиля.Имя) <> Неопределено Тогда
ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
@@ -1018,8 +1027,12 @@
ОписаниеПрофиля.ЗначенияДоступа = ЗначенияДоступа;
КонецЦикла;
- Возврат ОбщегоНазначения.ФиксированныеДанные(Новый Структура(
- "ПараметрыОбновления, ОписанияПрофилей", ПараметрыОбновления, СвойстваПрофилей));
+ ПоставляемыеПрофили = Новый Структура;
+ ПоставляемыеПрофили.Вставить("ПараметрыОбновления", ПараметрыОбновления);
+ ПоставляемыеПрофили.Вставить("ОписанияПрофилей", СвойстваПрофилей);
+ ПоставляемыеПрофили.Вставить("ОписанияПрофилейМассив", ОписанияПрофилейМассив);
+
+ Возврат ОбщегоНазначения.ФиксированныеДанные(ПоставляемыеПрофили);
КонецФункции
diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Help/ru.html b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Help/ru.html
index b46f2384a..020eefee3 100644
--- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Help/ru.html
+++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Позволяет указать параметры, необходимые для подключения к FTP-ресурсу при рассылке отчетов. Поле Сервер и каталог является обязательным для заполнения, остальные поля не обязательны.
Предназначена для автоматического формирования отчетов и доставки сформированных отчетов получателям.
Рассылки отчетов позволяют автоматизировать процесс получения отчетов так, что, не открывая программу, можно получить в нужное время готовый отчет на свою электронную почту или в определенный каталог в виде файла.
diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Module.bsl
index ce21dfd8a..673988ada 100644
--- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Module.bsl
+++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Module.bsl
@@ -673,7 +673,8 @@
Иначе
ПолныйАдрес = "ftp://"+ Объект.FTPЛогин +":"+ Объект.FTPПароль +"@"+ ПолныйАдрес;
КонецЕсли;
- ЗапуститьПриложение(ПолныйАдрес, , Ложь);
+
+ ОбщегоНазначенияКлиент.ПерейтиПоСсылке(ПолныйАдрес);
КонецПроцедуры
&НаКлиенте
@@ -1815,7 +1816,7 @@
// Проверка изменений
ФорматыСовпадают = Истина;
Для Индекс = 1 По СписокФорматов.Количество() Цикл
- Если СписокФорматов[Индекс-1].Пометка <> Переменные.СписокФорматовКопия[Индекс-1].Пометка Тогда
+ Если СписокФорматов[Индекс - 1].Пометка <> Переменные.СписокФорматовКопия[Индекс - 1].Пометка Тогда
ФорматыСовпадают = Ложь;
Прервать;
КонецЕсли;
diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Help/ru.html b/SSL/src/Catalogs/РассылкиОтчетов/Help/ru.html
index ff914fd8c..43cab430f 100644
--- a/SSL/src/Catalogs/РассылкиОтчетов/Help/ru.html
+++ b/SSL/src/Catalogs/РассылкиОтчетов/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для подготовки рассылок с целью автоматического формирования отчетов и доставки сформированных отчетов получателям.
Открывается по команде Рассылки отчетов из раздела Сервисные подсистемы.
Программа содержит большое количество отчетов. Зачастую пользователям нужно периодически получать один и тот же отчет. Например, в начале каждого рабочего дня менеджеру нужно видеть текущее состояние взаиморасчетов со своими клиентами. Или в конце каждой недели директор хочет видеть состояние основных финансовых показателей фирмы.
- Use
- DontUse
+
+ Отбор.ИспользоватьДляОтправки
+
+ true
+
+ Use
diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Help/ru.html b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Help/ru.html
index 55d849d95..a5b74474d 100644
--- a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Help/ru.html
+++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для выбора роли исполнителя.
Открывается по кнопке Выбрать из поля Роль исполнителябизнес-процессов и окон подбора ролей исполнителей.
Роли исполнителей могут использоваться бизнес-процессами для ролевой маршрутизации задач. В этом случае поручение выдается не персонально исполнителю, а некоторой роли (например, Старший по залу), а соответствие пользователей ролям задается в списке Роли и исполнители и используется программой для доставки поручений конкретным пользователям. В определенных случаях роли исполнителя бывает недостаточно, чтобы точно определить исполнителей. Тогда необходимо указывать основной и дополнительный объекты адресации. Например, у роли Руководитель проектов могут присутствовать основной объект адресации Подразделение и дополнительный объект Проект. Таким образом, с помощью объектов адресации происходит уточнение, руководителям какого проекта и в каком подразделении адресуется задача.
Роли исполнителей могут использоваться бизнес-процессами для ролевой маршрутизации задач. В этом случае поручение выдается не персонально исполнителю, а некоторой роли (например, Старший по залу), а соответствие пользователей ролям задается в списке Роли и исполнители задач и используется программой для доставки поручений конкретным пользователям.
В определенных случаях роли исполнителя бывает недостаточно, чтобы точно определить исполнителей. Тогда необходимо указывать основной и дополнительный объекты адресации. Например, у роли Руководитель проектов могут присутствовать основной объект адресации Подразделение и дополнительный объект Проект. Таким образом, с помощью объектов адресации происходит уточнение, руководителям какого проекта и в каком подразделении адресуется задача.
Открывается по команде Роли исполнителей в разделе Бизнес-процессы и задачи.
Роли исполнителей могут использоваться бизнес-процессами для ролевой маршрутизации задач. В этом случае поручение выдается не персонально исполнителю, а некоторой роли (например, Старший по залу), а соответствие пользователей ролям задается в списке Роли и исполнители задач и используется программой для доставки поручений конкретным пользователям. В определенных случаях роли исполнителя бывает недостаточно, чтобы точно определить исполнителей. Тогда необходимо указывать основной и дополнительный объекты адресации. Например, у роли Руководитель проектов могут присутствовать основной объект адресации Подразделение и дополнительный объект Проект. Таким образом, с помощью объектов адресации происходит уточнение, руководителям какого проекта и в каком подразделении адресуется задача.
@@ -12,7 +12,7 @@
Наименование - полное наименование роли;
Краткое представление - сокращенное наименование роли для удобства использования. По умолчанию в это поле автоматически копируется Код;
Предназначена для подписания файлов, электронных документов и других данных.
Электронная подпись - реквизит электронного документа, с помощью которого можно удостовериться в неизменности электронного документа с момента его подписи. Контроль неизменности электронного документа осуществляется в результате проверки соответствия электронной подписи и документа, а также проверки действительности сертификата. Контроль неизменности электронного документа можно выполнить в любой момент времени.
Подписание данных
diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Module.bsl
index 6a26ec122..789ce10e6 100644
--- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Module.bsl
+++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПодписаниеДанных/Module.bsl
@@ -1,5 +1,5 @@
&НаКлиенте
-Перем ВнутренниеДанные, СвойстваПароля, ОписаниеДанных, ФормаОбъекта, ОбработкаПослеПредупреждения;
+Перем ВнутренниеДанные, СвойстваПароля, ОписаниеДанных, ФормаОбъекта, ОбработкаПослеПредупреждения, ТекущийСписокПредставлений;
#Область ОбработчикиСобытийФормы
@@ -40,14 +40,23 @@
Процедура ПредставлениеДанныхНажатие(Элемент, СтандартнаяОбработка)
ЭлектроннаяПодписьСлужебныйКлиент.ПредставлениеДанныхНажатие(ЭтотОбъект,
- Элемент, СтандартнаяОбработка, ОписаниеДанных);
+ Элемент, СтандартнаяОбработка, ТекущийСписокПредставлений);
КонецПроцедуры
&НаКлиенте
Процедура СертификатПриИзменении(Элемент)
- СертификатПриИзмененииНаСервере(ЭлектроннаяПодписьСлужебныйКлиент.ОтпечаткиСертификатовНаКлиенте());
+ ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьОтпечаткиСертификатовНаКлиенте(
+ Новый ОписаниеОповещения("СертификатПриИзмененииЗавершение", ЭтотОбъект));
+
+КонецПроцедуры
+
+// Продолжение процедуры СертификатПриИзменении.
+&НаКлиенте
+Процедура СертификатПриИзмененииЗавершение(ОтпечаткиСертификатовНаКлиенте, Контекст) Экспорт
+
+ СертификатПриИзмененииНаСервере(ОтпечаткиСертификатовНаКлиенте);
ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект, ВнутренниеДанные, СвойстваПароля);
@@ -94,7 +103,16 @@
Сертификат = ВыбранноеЗначение;
КонецЕсли;
- СертификатПриИзмененииНаСервере(ЭлектроннаяПодписьСлужебныйКлиент.ОтпечаткиСертификатовНаКлиенте());
+ ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьОтпечаткиСертификатовНаКлиенте(
+ Новый ОписаниеОповещения("СертификатОбработкаВыбораЗавершение", ЭтотОбъект, ВыбранноеЗначение));
+
+КонецПроцедуры
+
+// Продолжение процедуры СертификатОбработкаВыбора.
+&НаКлиенте
+Процедура СертификатОбработкаВыбораЗавершение(ОтпечаткиСертификатовНаКлиенте, ВыбранноеЗначение) Экспорт
+
+ СертификатПриИзмененииНаСервере(ОтпечаткиСертификатовНаКлиенте);
Если ВыбранноеЗначение = Истина
И ВнутренниеДанные["ВыбранныйСертификатПароль"] <> Неопределено Тогда
@@ -111,16 +129,14 @@
&НаКлиенте
Процедура СертификатАвтоПодбор(Элемент, Текст, ДанныеВыбора, Параметры, Ожидание, СтандартнаяОбработка)
- СтандартнаяОбработка = Ложь;
- ДанныеВыбора = СертификатСписокВыбора;
+ ЭлектроннаяПодписьСлужебныйКлиент.СертификатПодборИзСпискаВыбора(ЭтотОбъект, Текст, ДанныеВыбора, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура СертификатОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, Параметры, СтандартнаяОбработка)
- СтандартнаяОбработка = Ложь;
- ДанныеВыбора = СертификатСписокВыбора;
+ ЭлектроннаяПодписьСлужебныйКлиент.СертификатПодборИзСпискаВыбора(ЭтотОбъект, Текст, ДанныеВыбора, СтандартнаяОбработка);
КонецПроцедуры
@@ -166,11 +182,17 @@
Возврат;
КонецЕсли;
- Если Не ПодписатьДанные() Тогда
- Возврат;
- КонецЕсли;
+ ПодписатьДанные(Новый ОписаниеОповещения("ПодписатьЗавершение", ЭтотОбъект));
- Закрыть(Истина);
+КонецПроцедуры
+
+// Продолжение процедуры Подписать.
+&НаКлиенте
+Процедура ПодписатьЗавершение(Результат, Контекст) Экспорт
+
+ Если Результат = Истина Тогда
+ Закрыть(Истина);
+ КонецЕсли;
КонецПроцедуры
@@ -179,19 +201,47 @@
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
-Функция ПродолжитьОткрытие(ОбщиеВнутренниеДанные, КлиентскиеПараметры) Экспорт
+Процедура ПродолжитьОткрытие(Оповещение, ОбщиеВнутренниеДанные, КлиентскиеПараметры) Экспорт
- Если Не ЭлектроннаяПодписьСлужебныйКлиент.ПродолжитьОткрытиеНачало(ЭтотОбъект, КлиентскиеПараметры) Тогда
- Возврат Ложь;
+ Если КлиентскиеПараметры = ВнутренниеДанные Тогда
+ КлиентскиеПараметры = Новый Структура("Сертификат, СвойстваПароля", Сертификат, СвойстваПароля);
+ Возврат;
КонецЕсли;
- ОбработкаПродолжения = Новый ОписаниеОповещения("ПродолжитьОткрытие", ЭтотОбъект);
+ Если КлиентскиеПараметры.Свойство("УказанКонтекстДругойОперации") Тогда
+ СвойстваСертификата = ОбщиеВнутренниеДанные;
+ КлиентскиеПараметры.ОписаниеДанных.КонтекстОперации.ПродолжитьОткрытие(,, СвойстваСертификата);
+ Если СвойстваСертификата.Сертификат = Сертификат Тогда
+ СвойстваПароля = СвойстваСертификата.СвойстваПароля;
+ КонецЕсли;
+ КонецЕсли;
+
+ ОписаниеДанных = КлиентскиеПараметры.ОписаниеДанных;
+ ФормаОбъекта = КлиентскиеПараметры.Форма;
+ ТекущийСписокПредставлений = КлиентскиеПараметры.ТекущийСписокПредставлений;
ВнутренниеДанные = ОбщиеВнутренниеДанные;
- ОписаниеДанных = КлиентскиеПараметры.ОписаниеДанных;
- ФормаОбъекта = КлиентскиеПараметры.Форма;
+ Контекст = Новый Структура("Оповещение", Оповещение);
+ Оповещение = Новый ОписаниеОповещения("ПродолжитьОткрытие", ЭтотОбъект);
+
+ ЭлектроннаяПодписьСлужебныйКлиент.ПродолжитьОткрытиеНачало(Новый ОписаниеОповещения(
+ "ПродолжитьОткрытиеПослеНачала", ЭтотОбъект, Контекст), ЭтотОбъект, КлиентскиеПараметры);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПродолжитьОткрытие.
+&НаКлиенте
+Процедура ПродолжитьОткрытиеПослеНачала(Результат, Контекст) Экспорт
+
+ Если Результат <> Истина Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение);
+ Возврат;
+ КонецЕсли;
ДополнительныеПараметры = Новый Структура;
+ Если СвойстваПароля <> Неопределено Тогда
+ ДополнительныеПараметры.Вставить("ПриУстановкеПароляИзДругойОперации", Истина);
+ КонецЕсли;
ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект,
ВнутренниеДанные, СвойстваПароля, ДополнительныеПараметры);
@@ -200,30 +250,51 @@
Или ДополнительныеПараметры.УсиленнаяЗащитаЗакрытогоКлюча) Тогда
ОбработкаПослеПредупреждения = Неопределено;
-
- Если ПодписатьДанные() Тогда
- ВыполнитьОбработкуОповещения(ОписаниеОповещенияОЗакрытии, Истина);
- Возврат Истина;
- КонецЕсли;
- Иначе
- Открыть();
+ ПодписатьДанные(Новый ОписаниеОповещения("ПродолжитьОткрытиеПослеПодписанияДанных", ЭтотОбъект, Контекст));
+ Возврат;
КонецЕсли;
- Возврат Истина;
+ Открыть();
-КонецФункции
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПродолжитьОткрытие.
+&НаКлиенте
+Процедура ПродолжитьОткрытиеПослеПодписанияДанных(Результат, Контекст) Экспорт
+
+ Если Результат = Истина Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина);
+ Иначе
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение);
+ КонецЕсли;
+
+КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПодписание(КлиентскиеПараметры, ОбработкаЗавершения) Экспорт
- ОписаниеДанных = КлиентскиеПараметры.ОписаниеДанных;
- ФормаОбъекта = КлиентскиеПараметры.Форма;
+ ЭлектроннаяПодписьСлужебныйКлиент.ОбновитьФормуПередПовторнымИспользованием(ЭтотОбъект, КлиентскиеПараметры);
+
+ ОписаниеДанных = КлиентскиеПараметры.ОписаниеДанных;
+ ФормаОбъекта = КлиентскиеПараметры.Форма;
+ ТекущийСписокПредставлений = КлиентскиеПараметры.ТекущийСписокПредставлений;
ОбработкаПослеПредупреждения = ОбработкаЗавершения;
ОбработкаПродолжения = Новый ОписаниеОповещения("ВыполнитьПодписание", ЭтотОбъект);
- Если ПодписатьДанные() Тогда
- ВыполнитьОбработкуОповещения(ОбработкаЗавершения, Истина);
+ Контекст = Новый Структура("ОбработкаЗавершения", ОбработкаЗавершения);
+ ПодписатьДанные(Новый ОписаниеОповещения("ВыполнитьПодписаниеЗавершение", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьПодписание.
+&НаКлиенте
+Процедура ВыполнитьПодписаниеЗавершение(Результат, Контекст) Экспорт
+
+ Если Результат = Истина Тогда
+ ВыполнитьОбработкуОповещения(Контекст.ОбработкаЗавершения, Истина);
КонецЕсли;
КонецПроцедуры
@@ -231,7 +302,16 @@
&НаКлиенте
Процедура ПриИзмененииСпискаСертификатов()
- СертификатПриИзмененииНаСервере(ЭлектроннаяПодписьСлужебныйКлиент.ОтпечаткиСертификатовНаКлиенте(), Истина);
+ ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьОтпечаткиСертификатовНаКлиенте(
+ Новый ОписаниеОповещения("ПриИзмененииСпискаСертификатовЗавершение", ЭтотОбъект));
+
+КонецПроцедуры
+
+// Продолжение процедуры ПриИзмененииСпискаСертификатов.
+&НаКлиенте
+Процедура ПриИзмененииСпискаСертификатовЗавершение(ОтпечаткиСертификатовНаКлиенте, Контекст) Экспорт
+
+ СертификатПриИзмененииНаСервере(ОтпечаткиСертификатовНаКлиенте, Истина);
ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект,
ВнутренниеДанные, СвойстваПароля, Новый Структура("ПриИзмененииСвойствСертификата", Истина));
@@ -253,25 +333,29 @@
КонецПроцедуры
&НаКлиенте
-Функция ПодписатьДанные()
+Процедура ПодписатьДанные(Оповещение)
- ОшибкаНаКлиенте = Новый Структура;
- ОшибкаНаСервере = Новый Структура;
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("ОшибкаНаКлиенте", Новый Структура);
+ Контекст.Вставить("ОшибкаНаСервере", Новый Структура);
Если СертификатДействителенДо < ОбщегоНазначенияКлиент.ДатаСеанса() Тогда
- ОшибкаНаКлиенте.Вставить("ОписаниеОшибки",
+ Контекст.ОшибкаНаКлиенте.Вставить("ОписаниеОшибки",
НСтр("ru = 'У выбранного сертификата истек срок действия.
|Выберите другой сертификат.'"));
- ПоказатьОшибку(ОшибкаНаКлиенте, ОшибкаНаСервере);
- Возврат Ложь;
+ ПоказатьОшибку(Контекст.ОшибкаНаКлиенте, Контекст.ОшибкаНаСервере);
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь);
+ Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(СертификатПрограмма) Тогда
- ОшибкаНаКлиенте.Вставить("ОписаниеОшибки",
+ Контекст.ОшибкаНаКлиенте.Вставить("ОписаниеОшибки",
НСтр("ru = 'У выбранного сертификата не указана программа для закрытого ключа.
|Выберите другой сертификат.'"));
- ПоказатьОшибку(ОшибкаНаКлиенте, ОшибкаНаСервере);
- Возврат Ложь;
+ ПоказатьОшибку(Контекст.ОшибкаНаКлиенте, Контекст.ОшибкаНаСервере);
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь);
+ Возврат;
КонецЕсли;
ВыбранныйСертификат = Новый Структура;
@@ -283,47 +367,101 @@
Если ОписаниеДанных.Свойство("ПередВыполнением")
И ТипЗнч(ОписаниеДанных.ПередВыполнением) = Тип("ОписаниеОповещения") Тогда
- ВыполнитьОбработкуОповещения(ОписаниеДанных.ПередВыполнением, Неопределено);
+ ПараметрыВыполнения = Новый Структура;
+ ПараметрыВыполнения.Вставить("ОписаниеДанных", ОписаниеДанных);
+ ПараметрыВыполнения.Вставить("Оповещение", Новый ОписаниеОповещения(
+ "ПодписатьДанныеПослеОбработкиПередВыполнением", ЭтотОбъект, Контекст));
+
+ ВыполнитьОбработкуОповещения(ОписаниеДанных.ПередВыполнением, ПараметрыВыполнения);
+ Иначе
+ ПодписатьДанныеПослеОбработкиПередВыполнением(Новый Структура, Контекст);
КонецЕсли;
- ИдентификаторФормы = Неопределено;
+КонецПроцедуры
+
+// Продолжение процедуры ПодписатьДанные.
+&НаКлиенте
+Процедура ПодписатьДанныеПослеОбработкиПередВыполнением(Результат, Контекст) Экспорт
+
+ Если Результат.Свойство("ОписаниеОшибки") Тогда
+ ПоказатьОшибку(Новый Структура("ОписаниеОшибки", Результат.ОписаниеОшибки), Новый Структура);
+ Возврат;
+ КонецЕсли;
+
+ Контекст.Вставить("ИдентификаторФормы", УникальныйИдентификатор);
Если ТипЗнч(ФормаОбъекта) = Тип("УправляемаяФорма") Тогда
- ИдентификаторФормы = ФормаОбъекта.УникальныйИдентификатор;
+ Контекст.ИдентификаторФормы = ФормаОбъекта.УникальныйИдентификатор;
ИначеЕсли ТипЗнч(ФормаОбъекта) = Тип("УникальныйИдентификатор") Тогда
- ИдентификаторФормы = ФормаОбъекта;
+ Контекст.ИдентификаторФормы = ФормаОбъекта;
КонецЕсли;
- Успех = Ложь;
+ ПараметрыВыполнения = Новый Структура;
+ ПараметрыВыполнения.Вставить("ОписаниеДанных", ОписаниеДанных);
+ ПараметрыВыполнения.Вставить("Форма", ЭтотОбъект);
+ ПараметрыВыполнения.Вставить("ИдентификаторФормы", Контекст.ИдентификаторФормы);
+ ПараметрыВыполнения.Вставить("ЗначениеПароля", СвойстваПароля.Значение);
+ Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения);
Если ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().СоздаватьЭлектронныеПодписиНаСервере Тогда
Если ЗначениеЗаполнено(СертификатНаСервереОписаниеОшибки) Тогда
- ОшибкаНаСервере = СертификатНаСервереОписаниеОшибки;
+ Результат = Новый Структура("Ошибка", СертификатНаСервереОписаниеОшибки);
СертификатНаСервереОписаниеОшибки = Новый Структура;
+ ПодписатьДанныеПослеВыполненияНаСторонеСервера(Результат, Контекст);
Иначе
// Попытка подписания на сервере.
- Успех = ПодписатьНаСторонеСервера(ИдентификаторФормы, ОшибкаНаСервере);
- КонецЕсли;
-
- Если Не Успех Тогда
- // Попытка подписания на клиенте.
- Успех = ПодписатьНаСторонеКлиента(ИдентификаторФормы, ОшибкаНаКлиенте);
+ ЭлектроннаяПодписьСлужебныйКлиент.ВыполнитьНаСтороне(Новый ОписаниеОповещения(
+ "ПодписатьДанныеПослеВыполненияНаСторонеСервера", ЭтотОбъект, Контекст),
+ "Подписание", "НаСторонеСервера", Контекст.ПараметрыВыполнения);
КонецЕсли;
Иначе
- // Попытка подписания на клиенте.
- Успех = ПодписатьНаСторонеКлиента(ИдентификаторФормы, ОшибкаНаКлиенте, Истина);
+ ПодписатьДанныеПослеВыполненияНаСторонеСервера(Неопределено, Контекст);
КонецЕсли;
- Если Не Успех Тогда
- ПоказатьОшибку(ОшибкаНаКлиенте, ОшибкаНаСервере);
- Возврат Ложь;
+КонецПроцедуры
+
+// Продолжение процедуры ПодписатьДанные.
+&НаКлиенте
+Процедура ПодписатьДанныеПослеВыполненияНаСторонеСервера(Результат, Контекст) Экспорт
+
+ Если Результат <> Неопределено Тогда
+ ПодписатьДанныеПослеВыполнения(Результат);
+ КонецЕсли;
+
+ Если Результат <> Неопределено И Не Результат.Свойство("Ошибка") Тогда
+ ПодписатьДанныеПослеВыполненияНаСторонеКлиента(Новый Структура, Контекст);
+ Иначе
+ Если Результат <> Неопределено Тогда
+ Контекст.ОшибкаНаСервере = Результат.Ошибка;
+ КонецЕсли;
+
+ // Попытка подписания на клиенте.
+ ЭлектроннаяПодписьСлужебныйКлиент.ВыполнитьНаСтороне(Новый ОписаниеОповещения(
+ "ПодписатьДанныеПослеВыполненияНаСторонеКлиента", ЭтотОбъект, Контекст),
+ "Подписание", "НаСторонеКлиента", Контекст.ПараметрыВыполнения);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ПодписатьДанные.
+&НаКлиенте
+Процедура ПодписатьДанныеПослеВыполненияНаСторонеКлиента(Результат, Контекст) Экспорт
+
+ ПодписатьДанныеПослеВыполнения(Результат);
+
+ Если Результат.Свойство("Ошибка") Тогда
+ Контекст.ОшибкаНаКлиенте = Результат.Ошибка;
+ ПоказатьОшибку(Контекст.ОшибкаНаКлиенте, Контекст.ОшибкаНаСервере);
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь);
+ Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(ПредставлениеДанных)
И (Не ОписаниеДанных.Свойство("СообщитьОЗавершении")
Или ОписаниеДанных.СообщитьОЗавершении <> Ложь) Тогда
- ЭлектроннаяПодписьКлиент.ИнформироватьОПодписанииОбъекта(ПредставлениеДанных,
- ОписаниеДанных.ТекущийСписокПредставлений.Количество() > 1);
+ ЭлектроннаяПодписьКлиент.ИнформироватьОПодписанииОбъекта(
+ ЭлектроннаяПодписьСлужебныйКлиент.ПолноеПредставлениеДанных(ЭтотОбъект),
+ ТекущийСписокПредставлений.Количество() > 1);
КонецЕсли;
Если ОписаниеДанных.Свойство("КонтекстОперации") Тогда
@@ -336,290 +474,27 @@
ПараметрыФормы);
КонецЕсли;
- Возврат Истина;
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина);
-КонецФункции
+КонецПроцедуры
+// Продолжение процедуры ПодписатьДанные.
&НаКлиенте
-Функция ПодписатьНаСторонеКлиента(ИдентификаторФормы, ОшибкаНаКлиенте, ТолькоНаСторонеКлиента = Ложь)
+Процедура ПодписатьДанныеПослеВыполнения(Результат)
- МенеджерКриптографии = ЭлектроннаяПодписьСлужебныйКлиент.МенеджерКриптографии("Подписание",
- ТолькоНаСторонеКлиента, ОшибкаНаКлиенте, СертификатПрограмма);
-
- Если МенеджерКриптографии = Неопределено Тогда
- Возврат Ложь;
+ Если Результат.Свойство("ОперацияНачалась") Тогда
+ ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект, ВнутренниеДанные,
+ СвойстваПароля, Новый Структура("ПриУспешномВыполненииОперации", Истина));
КонецЕсли;
- СертификатКриптографии = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(СертификатОтпечаток,
- Истина, СертификатПрограмма, Ложь, ОшибкаНаКлиенте);
-
- Если СертификатКриптографии = Неопределено Тогда
- Возврат Ложь;
+ Если Результат.Свойство("ЕстьОбработанныеЭлементыДанных") Тогда
+ // После начала подписания изменять сертификат более недопустимо,
+ // иначе набор данных будет обработан по-разному.
+ Элементы.Сертификат.ТолькоПросмотр = Истина;
+ Элементы.Комментарий.ТолькоПросмотр = Истина;
КонецЕсли;
- СвойстваСертификата = ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(СертификатКриптографии);
- СвойстваСертификата.Вставить("ДвоичныеДанные", СертификатКриптографии.Выгрузить());
-
- Успех = Ложь;
- ПарольПринят = Ложь;
- МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = СвойстваПароля.Значение;
-
- Если ОписаниеДанных.Свойство("Данные") Тогда
- Успех = ПодписатьЭлементДанныхНаСторонеКлиента(ОписаниеДанных, МенеджерКриптографии,
- СертификатКриптографии, ИдентификаторФормы, СвойстваСертификата, ПарольПринят, ОшибкаНаКлиенте);
- Иначе
- Для каждого ЭлементДанных Из ОписаниеДанных.НаборДанных Цикл
- ОписаниеДанных.Вставить("ТекущийЭлементНабораДанных", ЭлементДанных);
-
- Если ЭлементДанных.Свойство("СвойстваПодписи") Тогда
- Успех = Истина;
- Продолжить;
- КонецЕсли;
-
- Успех = ПодписатьЭлементДанныхНаСторонеКлиента(ЭлементДанных, МенеджерКриптографии,
- СертификатКриптографии, ИдентификаторФормы, СвойстваСертификата, ПарольПринят, ОшибкаНаКлиенте);
-
- Если Не Успех Тогда
- Если ПарольПринят Тогда
- ЗаблокироватьИзменениеПараметровОперации();
- КонецЕсли;
- Прервать;
- КонецЕсли;
- КонецЦикла;
- КонецЕсли;
-
- Если ПарольПринят Тогда
- ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект,
- ВнутренниеДанные, СвойстваПароля, Новый Структура("ПриУспешномВыполненииОперации", Истина));
- КонецЕсли;
-
- Возврат Успех;
-
-КонецФункции
-
-&НаКлиенте
-Функция ПодписатьЭлементДанныхНаСторонеКлиента(ЭлементДанных, МенеджерКриптографии, СертификатКриптографии,
- ИдентификаторФормы, СвойстваСертификата, ПарольПринят, ОшибкаНаКлиенте)
-
- Попытка
- ДанныеДляПодписания = ДанныеИзОписанияДанных(ЭлементДанных.Данные);
- Исключение
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаКлиенте.Вставить("ОписаниеОшибки",
- НСтр("ru = 'При получении данных для подписания возникла ошибка:'")
- + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- Возврат Ложь;
- КонецПопытки;
-
- Попытка
- ДвоичныеДанныеПодписи = МенеджерКриптографии.Подписать(ДанныеДляПодписания, СертификатКриптографии);
- Исключение
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаКлиенте.Вставить("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- ОшибкаНаКлиенте.Вставить("Инструкция", Истина);
- Возврат Ложь;
- КонецПопытки;
-
- ОписаниеОшибки = "";
- Если ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеДанныеПодписи(ДвоичныеДанныеПодписи, ОписаниеОшибки) Тогда
- ОшибкаНаКлиенте.Вставить("ОписаниеОшибки", ОписаниеОшибки);
- Возврат Ложь;
- КонецЕсли;
-
- ПарольПринят = Истина;
-
- СвойстваПодписи = СвойстваПодписи(ДвоичныеДанныеПодписи, СвойстваСертификата, Комментарий);
- ЭлементДанных.Вставить("СвойстваПодписи", СвойстваПодписи);
-
- Если ЭлементДанных.Свойство("Объект") Тогда
- Если ТипЗнч(ЭлементДанных.Объект) = Тип("ОписаниеОповещения") Тогда
- Попытка
- ВыполнитьОбработкуОповещения(ЭлементДанных.Объект, ОписаниеДанных);
- Исключение
- ЭлементДанных.Удалить("СвойстваПодписи");
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаКлиенте.Вставить("ОписаниеОшибки", НСтр("ru = 'При записи подписи возникла ошибка:'")
- + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- Возврат Ложь;
- КонецПопытки;
- Иначе
- ВерсияОбъекта = Неопределено;
- ЭлементДанных.Свойство("ВерсияОбъекта", ВерсияОбъекта);
- Попытка
- ДобавитьПодпись(ЭлементДанных.Объект, СвойстваПодписи, ИдентификаторФормы, ВерсияОбъекта);
- Исключение
- ЭлементДанных.Удалить("СвойстваПодписи");
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаКлиенте.Вставить("ОписаниеОшибки", НСтр("ru = 'При записи подписи возникла ошибка:'")
- + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- Возврат Ложь;
- КонецПопытки;
- ОповеститьОбИзменении(ЭлементДанных.Объект);
- КонецЕсли;
- КонецЕсли;
-
- Возврат Истина;
-
-КонецФункции
-
-&НаКлиенте
-Функция ПодписатьНаСторонеСервера(ИдентификаторФормы, ОшибкаНаСервере)
-
- Успех = Ложь;
- ПарольПринят = Ложь;
-
- Если ОписаниеДанных.Свойство("Данные") Тогда
- Успех = ПодписатьЭлементДанныхНаСторонеСервера(ОписаниеДанных, ИдентификаторФормы,
- ПарольПринят, ОшибкаНаСервере);
- Иначе
- Для каждого ЭлементДанных Из ОписаниеДанных.НаборДанных Цикл
- ОписаниеДанных.Вставить("ТекущийЭлементНабораДанных", ЭлементДанных);
-
- Если ЭлементДанных.Свойство("СвойстваПодписи") Тогда
- Успех = Истина;
- Продолжить;
- КонецЕсли;
-
- Успех = ПодписатьЭлементДанныхНаСторонеСервера(ЭлементДанных, ИдентификаторФормы,
- ПарольПринят, ОшибкаНаСервере);
-
- Если Не Успех Тогда
- Если ПарольПринят Тогда
- ЗаблокироватьИзменениеПараметровОперации();
- КонецЕсли;
- Прервать;
- КонецЕсли;
- КонецЦикла;
- КонецЕсли;
-
- Если ПарольПринят Тогда
- ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект,
- ВнутренниеДанные, СвойстваПароля, Новый Структура("ПриУспешномВыполненииОперации", Истина));
- КонецЕсли;
-
- Возврат Успех;
-
-КонецФункции
-
-&НаКлиенте
-Функция ПодписатьЭлементДанныхНаСторонеСервера(ЭлементДанных, ИдентификаторФормы, ПарольПринят, ОшибкаНаСервере)
-
- ПараметрыДляСервера = Новый Структура;
- ПараметрыДляСервера.Вставить("Комментарий", Комментарий);
- ПараметрыДляСервера.Вставить("ИдентификаторФормы", ИдентификаторФормы);
- ПараметрыДляСервера.Вставить("СертификатПрограмма", СертификатПрограмма);
- ПараметрыДляСервера.Вставить("СертификатОтпечаток", СертификатОтпечаток);
-
- АдресПодписи = Неопределено;
- ЭлементДанныхДляСервера = Новый Структура;
- ЭлементДанныхДляСервера.Вставить("Данные", ДанныеИзОписанияДанных(ЭлементДанных.Данные, Ложь));
-
- Если ЭлементДанных.Свойство("Объект")
- И Не ТипЗнч(ЭлементДанных.Объект) = Тип("ОписаниеОповещения") Тогда
-
- ЭлементДанныхДляСервера.Вставить("Объект", ЭлементДанных.Объект);
-
- Если ЭлементДанных.Свойство("ВерсияОбъекта") Тогда
- ЭлементДанныхДляСервера.Свойство("ВерсияОбъекта", ЭлементДанных.ВерсияОбъекта);
- КонецЕсли;
- КонецЕсли;
-
- Если Не ПодписатьЭлементДанныхНаСервере(ЭлементДанныхДляСервера, ПараметрыДляСервера,
- СвойстваПароля.Значение, АдресПодписи, ПарольПринят, ОшибкаНаСервере) Тогда
- Возврат Ложь;
- КонецЕсли;
-
- ЭлементДанных.Вставить("СвойстваПодписи", АдресПодписи);
-
- Если ЭлементДанных.Свойство("Объект") Тогда
- Если ТипЗнч(ЭлементДанных.Объект) = Тип("ОписаниеОповещения") Тогда
- Попытка
- ВыполнитьОбработкуОповещения(ЭлементДанных.Объект, ОписаниеДанных);
- Исключение
- ЭлементДанных.Удалить("СвойстваПодписи");
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаСервере.Вставить("ОписаниеОшибки", НСтр("ru = 'При записи подписи возникла ошибка:'")
- + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- Возврат Ложь;
- КонецПопытки;
- Иначе
- ОповеститьОбИзменении(ЭлементДанных.Объект);
- КонецЕсли;
- КонецЕсли;
-
- Возврат Истина;
-
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ПодписатьЭлементДанныхНаСервере(Знач ЭлементДанныхДляСервера, Знач Параметры,
- Знач ЗначениеПароля, АдресПодписи, ПарольПринят, ОшибкаНаСервере)
-
- МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии("Подписание",
- Ложь, ОшибкаНаСервере, Параметры.СертификатПрограмма);
-
- Если МенеджерКриптографии = Неопределено Тогда
- Возврат Ложь;
- КонецЕсли;
-
- СертификатКриптографии = ЭлектроннаяПодпись.ПолучитьСертификатПоОтпечатку(
- Параметры.СертификатОтпечаток, Истина, Параметры.СертификатПрограмма, Ложь, ОшибкаНаСервере);
-
- Если СертификатКриптографии = Неопределено Тогда
- Возврат Ложь;
- КонецЕсли;
-
- МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = ЗначениеПароля;
- Попытка
- ДанныеДляПодписания = ПолучитьИзВременногоХранилища(ЭлементДанныхДляСервера.Данные);
- Исключение
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаСервере.Вставить("ОписаниеОшибки",
- НСтр("ru = 'При получении данных для подписания возникла ошибка:'")
- + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- Возврат Ложь;
- КонецПопытки;
-
- Попытка
- ДвоичныеДанныеПодписи = МенеджерКриптографии.Подписать(ДанныеДляПодписания, СертификатКриптографии);
- Исключение
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаСервере.Вставить("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- ОшибкаНаСервере.Вставить("Инструкция", Истина);
- Возврат Ложь;
- КонецПопытки;
-
- ОписаниеОшибки = "";
- Если ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеДанныеПодписи(ДвоичныеДанныеПодписи, ОписаниеОшибки) Тогда
- ОшибкаНаСервере.Вставить("ОписаниеОшибки", ОписаниеОшибки);
- Возврат Ложь;
- КонецЕсли;
-
- ПарольПринят = Истина;
-
- СвойстваСертификата = ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(СертификатКриптографии);
- СвойстваСертификата.Вставить("ДвоичныеДанные", СертификатКриптографии.Выгрузить());
-
- СвойстваПодписи = СвойстваПодписи(ДвоичныеДанныеПодписи, СвойстваСертификата, Параметры.Комментарий);
- АдресПодписи = ПоместитьВоВременноеХранилище(СвойстваПодписи, Параметры.ИдентификаторФормы);
-
- Если ЭлементДанныхДляСервера.Свойство("Объект") Тогда
- ВерсияОбъекта = Неопределено;
- ЭлементДанныхДляСервера.Свойство("ВерсияОбъекта", ВерсияОбъекта);
- Попытка
- ДобавитьПодпись(ЭлементДанныхДляСервера.Объект, СвойстваПодписи,
- Параметры.ИдентификаторФормы, ВерсияОбъекта);
- Исключение
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаСервере.Вставить("ОписаниеОшибки", НСтр("ru = 'При записи подписи возникла ошибка:'")
- + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- Возврат Ложь;
- КонецПопытки;
- КонецЕсли;
-
- Возврат Истина;
-
-КонецФункции
+КонецПроцедуры
&НаКлиенте
Процедура ПоказатьОшибку(ОшибкаНаКлиенте, ОшибкаНаСервере)
@@ -634,81 +509,4 @@
КонецПроцедуры
-&НаКлиентеНаСервереБезКонтекста
-Функция СвойстваПодписи(ДвоичныеДанныеПодписи, СвойстваСертификата, Комментарий)
-
- СвойстваПодписи = Новый Структура;
- СвойстваПодписи.Вставить("Подпись", ДвоичныеДанныеПодписи);
- СвойстваПодписи.Вставить("УстановившийПодпись", ПользователиКлиентСервер.АвторизованныйПользователь());
- СвойстваПодписи.Вставить("Комментарий", Комментарий);
- СвойстваПодписи.Вставить("ИмяФайлаПодписи", "");
- СвойстваПодписи.Вставить("ДатаПодписи", Дата('00010101')); // Устанавливается перед записью.
- // Производные свойства:
- СвойстваПодписи.Вставить("Сертификат", СвойстваСертификата.ДвоичныеДанные);
- СвойстваПодписи.Вставить("Отпечаток", СвойстваСертификата.Отпечаток);
- СвойстваПодписи.Вставить("КомуВыданСертификат", СвойстваСертификата.КомуВыдан);
-
- Возврат СвойстваПодписи;
-
-КонецФункции
-
-&НаКлиенте
-Функция ДанныеИзОписанияДанных(Знач Данные, ДляСтороныКлиента = Истина)
-
- Если ТипЗнч(Данные) = Тип("ОписаниеОповещения") Тогда
- ОбработкаПолученияДанных = Данные;
- Данные = Неопределено;
- ВыполнитьОбработкуОповещения(ОбработкаПолученияДанных, Данные);
- КонецЕсли;
-
- Если ДляСтороныКлиента Тогда
- // Для стороны клиента требуются двоичные данные или путь к файлу.
-
- Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
- Возврат Данные;
- КонецЕсли;
-
- Если ТипЗнч(Данные) = Тип("Строка") Тогда
- Если ЭтоАдресВременногоХранилища(Данные) Тогда
- Возврат ПолучитьИзВременногоХранилища(Данные);
- КонецЕсли;
- Иначе // Путь к файлу
- Возврат Данные;
- КонецЕсли;
- Иначе
- // Для стороны сервера требуется адрес двоичных данных во временном хранилище.
-
- Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
- Возврат ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);
- КонецЕсли;
-
- Если ТипЗнч(Данные) = Тип("Строка") Тогда
- Если ЭтоАдресВременногоХранилища(Данные) Тогда
- Возврат Данные;
- КонецЕсли;
- Иначе // Путь к файлу
- Данные = Новый ДвоичныеДанные(Данные);
- Возврат ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);
- КонецЕсли;
- КонецЕсли;
-
-КонецФункции
-
-&НаСервереБезКонтекста
-Процедура ДобавитьПодпись(СсылкаНаОбъект, СвойстваПодписи, ИдентификаторФормы, ВерсияОбъекта)
-
- ЭлектроннаяПодпись.ДобавитьПодпись(СсылкаНаОбъект, СвойстваПодписи, ИдентификаторФормы, ВерсияОбъекта);
-
-КонецПроцедуры
-
-&НаКлиенте
-Процедура ЗаблокироватьИзменениеПараметровОперации()
-
- // После начала подписания изменять сертификат более недопустимо,
- // иначе набор данных будет обработан по-разному.
- Элементы.Сертификат.ТолькоПросмотр = Истина;
- Элементы.Комментарий.ТолькоПросмотр = Истина;
-
-КонецПроцедуры
-
#КонецОбласти
diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Form.form
index d00cf5eab..01fa6f476 100644
--- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Form.form
+++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Form.form
@@ -200,9 +200,6 @@
ClickКартинкаНажатие
-
- CommonPicture.ПустоеСостояние
- trueAutoSize
@@ -247,9 +244,6 @@
ClickКартинкаНажатие
-
- CommonPicture.ПустоеСостояние
- trueAutoSize
@@ -364,9 +358,6 @@
ClickКартинкаНажатие
-
- CommonPicture.ПустоеСостояние
- trueAutoSize
@@ -411,9 +402,6 @@
ClickКартинкаНажатие
-
- CommonPicture.ПустоеСостояние
- trueAutoSize
@@ -530,9 +518,6 @@
ClickКартинкаНажатие
-
- CommonPicture.ПустоеСостояние
- trueAutoSize
@@ -577,9 +562,6 @@
ClickКартинкаНажатие
-
- CommonPicture.ПустоеСостояние
- trueAutoSize
@@ -701,9 +683,6 @@
ClickКартинкаНажатие
-
- CommonPicture.ПустоеСостояние
- trueAutoSize
@@ -748,9 +727,6 @@
ClickКартинкаНажатие
-
- CommonPicture.ПустоеСостояние
- trueAutoSize
@@ -899,9 +875,6 @@
ClickКартинкаНажатие
-
- CommonPicture.ПустоеСостояние
- trueAutoSize
@@ -946,9 +919,6 @@
ClickКартинкаНажатие
-
- CommonPicture.ПустоеСостояние
- trueAutoSize
@@ -1065,9 +1035,6 @@
ClickКартинкаНажатие
-
- CommonPicture.ПустоеСостояние
- trueAutoSize
@@ -1112,9 +1079,6 @@
ClickКартинкаНажатие
-
- CommonPicture.ПустоеСостояние
- trueAutoSize
@@ -1231,9 +1195,6 @@
ClickКартинкаНажатие
-
- CommonPicture.ПустоеСостояние
- trueAutoSize
@@ -1278,9 +1239,6 @@
ClickКартинкаНажатие
-
- CommonPicture.ПустоеСостояние
- trueAutoSize
@@ -1397,9 +1355,6 @@
ClickКартинкаНажатие
-
- CommonPicture.ПустоеСостояние
- trueAutoSize
@@ -1444,9 +1399,6 @@
ClickКартинкаНажатие
-
- CommonPicture.ПустоеСостояние
- trueAutoSize
@@ -2133,6 +2085,10 @@
NotificationProcessingОбработкаОповещения
+
+ OnOpen
+ ПриОткрытии
+ OnCreateAtServerПриСозданииНаСервере
@@ -2183,13 +2139,16 @@
- ДанныеСертификата
+ АдресСертификатаru
- Данные сертификата
+ Адрес сертификата3
-
+
+ String
+
+ true
@@ -2350,13 +2309,30 @@
true
+
+ ПарольПринят
+
+ ru
+ Пароль принят
+
+ 13
+
+ Boolean
+
+
+ true
+
+
+ true
+
+ ИмяПервойПроверкиruИмя первой проверки
- 13
+ 14String
diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl
index 29fee0650..fb667cfb7 100644
--- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl
+++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl
@@ -40,7 +40,7 @@
Картинка = Элементы.Добавить(Проверка.Имя + "НаКлиентеКартинка", Тип("ДекорацияФормы"), Группа);
Картинка.Вид = ВидДекорацииФормы.Картинка;
- Картинка.Картинка = БиблиотекаКартинок.ПустоеСостояние;
+ Картинка.Картинка = Новый Картинка;
Картинка.РазмерКартинки = РазмерКартинки.АвтоРазмер;
Картинка.Ширина = 3;
Картинка.Высота = 1;
@@ -49,7 +49,7 @@
Картинка = Элементы.Добавить(Проверка.Имя + "НаСервереКартинка", Тип("ДекорацияФормы"), Группа);
Картинка.Вид = ВидДекорацииФормы.Картинка;
- Картинка.Картинка = БиблиотекаКартинок.ПустоеСостояние;
+ Картинка.Картинка = Новый Картинка;
Картинка.РазмерКартинки = РазмерКартинки.АвтоРазмер;
Картинка.Ширина = 3;
Картинка.Высота = 1;
@@ -69,7 +69,7 @@
"ДанныеСертификата, Программа, УсиленнаяЗащитаЗакрытогоКлюча");
Программа = СвойстваСертификата.Программа;
- ДанныеСертификата = СвойстваСертификата.ДанныеСертификата.Получить();
+ АдресСертификата = ПоместитьВоВременноеХранилище(СвойстваСертификата.ДанныеСертификата.Получить(), УникальныйИдентификатор);
СертификатУсиленнаяЗащитаЗакрытогоКлюча = СвойстваСертификата.УсиленнаяЗащитаЗакрытогоКлюча;
ОбновитьВидимостьНаСервере();
@@ -82,6 +82,15 @@
КонецПроцедуры
+&НаКлиенте
+Процедура ПриОткрытии(Отказ)
+
+ Если ВнутренниеДанные = Неопределено Тогда
+ Отказ = Истина;
+ КонецЕсли;
+
+КонецПроцедуры
+
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
@@ -150,7 +159,13 @@
&НаКлиенте
Процедура Проверить(Команда)
- ПроверитьСертификат();
+ ПроверитьСертификат(Новый ОписаниеОповещения("ПроверитьЗавершение", ЭтотОбъект));
+
+КонецПроцедуры
+
+// Продолжение процедуры Проверить.
+&НаКлиенте
+Процедура ПроверитьЗавершение(Неопределен, Контекст) Экспорт
Если Не ПроверкаПриВыборе Тогда
Возврат;
@@ -169,12 +184,11 @@
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
-Функция ПродолжитьОткрытие(ОбщиеВнутренниеДанные, ВходящиеКлиентскиеПараметры) Экспорт
+Процедура ПродолжитьОткрытие(Оповещение, ОбщиеВнутренниеДанные, ВходящиеКлиентскиеПараметры) Экспорт
ВнутренниеДанные = ОбщиеВнутренниеДанные;
КлиентскиеПараметры = ВходящиеКлиентскиеПараметры;
КлиентскиеПараметры.Вставить("Результат");
-
ОбработкаПродолжения = Новый ОписаниеОповещения("ПродолжитьОткрытие", ЭтотОбъект);
ДополнительныеПараметры = Новый Структура;
@@ -185,35 +199,48 @@
ТекущийЭлемент = Элементы.ФормаПроверить;
КонецЕсли;
- ПоказатьПредупреждение = Ложь;
-
Если КлиентскиеПараметры.Свойство("БезПодтверждения")
И КлиентскиеПараметры.БезПодтверждения
И ( ДополнительныеПараметры.ПарольУказан
Или ДополнительныеПараметры.УсиленнаяЗащитаЗакрытогоКлюча) Тогда
- ПроверитьСертификат();
- Если КлиентскиеПараметры.Результат.ПроверкиПройдены Тогда
- Возврат Ложь;
+ Если Не КлиентскиеПараметры.Свойство("ОбработкаРезультата")
+ Или ТипЗнч(КлиентскиеПараметры.ОбработкаРезультата) <> Тип("ОписаниеОповещения") Тогда
+ Открыть();
КонецЕсли;
- Если ПроверкаПриВыборе Тогда
- ПоказатьПредупреждение = Истина;
- КонецЕсли;
+ Контекст = Новый Структура("Оповещение", Оповещение);
+ ПроверитьСертификат(Новый ОписаниеОповещения("ПродолжитьОткрытиеПослеПроверкиСертификата", ЭтотОбъект, Контекст));
+ Возврат;
+ КонецЕсли;
+
+ Открыть();
+
+ ВыполнитьОбработкуОповещения(Оповещение);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПродолжитьОткрытие.
+&НаКлиенте
+Процедура ПродолжитьОткрытиеПослеПроверкиСертификата(Результат, Контекст) Экспорт
+
+ Если КлиентскиеПараметры.Результат.ПроверкиПройдены Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина);
+ Возврат;
КонецЕсли;
Если Не Открыта() Тогда
Открыть();
КонецЕсли;
- Если ПоказатьПредупреждение Тогда
- ПоказатьПредупреждениеОНевозможностиПродолжения()
+ Если ПроверкаПриВыборе Тогда
+ ПоказатьПредупреждениеОНевозможностиПродолжения();
КонецЕсли;
- Возврат Истина;
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение);
-КонецФункции
+КонецПроцедуры
&НаКлиенте
Процедура ПриИзмененияИспользованияПодписанияИлиШифрования()
@@ -255,16 +282,40 @@
КонецПроцедуры
&НаКлиенте
-Процедура ПроверитьСертификат()
+Процедура ПроверитьСертификат(Оповещение)
ПарольПринят = Ложь;
-
ПроверкиНаКлиенте = Новый Структура;
- ПроверитьНаСторонеКлиента(ПарольПринят);
+ ПроверкиНаСервере = Новый Структура;
+
+ // Очистка предыдущих результатов проверки.
+ ОсновныеПроверки = Новый Структура(
+ "ЗаконныйСертификат, НаличиеСертификата, ДанныеСертификата, НаличиеПрограммы,
+ |Подписание, ПроверкаПодписи, Шифрование, Расшифровка");
+
+ Для каждого КлючИЗначение Из ОсновныеПроверки Цикл
+ УстановитьЭлемент(ЭтотОбъект, КлючИЗначение.Ключ, Ложь);
+ УстановитьЭлемент(ЭтотОбъект, КлючИЗначение.Ключ, Истина);
+ КонецЦикла;
+
+ Для каждого ЭлементСписка Из ДополнительныеПроверки Цикл
+ УстановитьЭлемент(ЭтотОбъект, ЭлементСписка.Значение, Ложь);
+ УстановитьЭлемент(ЭтотОбъект, ЭлементСписка.Значение, Истина);
+ КонецЦикла;
+
+ Контекст = Новый Структура("Оповещение", Оповещение);
+
+ ПроверитьНаСторонеКлиента(Новый ОписаниеОповещения(
+ "ПроверитьСертификатПослеПроверкиНаКлиенте", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьСертификат.
+&НаКлиенте
+Процедура ПроверитьСертификатПослеПроверкиНаКлиенте(Результат, Контекст) Экспорт
Если ОперацииНаСервере Тогда
- ПроверкиНаСервере = Новый Структура;
- ПроверитьНаСторонеСервера(СвойстваПароля.Значение, ПарольПринят);
+ ПроверитьНаСторонеСервера(СвойстваПароля.Значение);
Иначе
ПроверкиНаСервере = Неопределено;
КонецЕсли;
@@ -287,89 +338,361 @@
ВыполнитьОбработкуОповещения(КлиентскиеПараметры.ОбработкаРезультата, Результат.ПроверкиПройдены);
КонецЕсли;
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение);
+
КонецПроцедуры
+
&НаКлиенте
-Процедура ПроверитьНаСторонеКлиента(ПарольПринят)
+Процедура ПроверитьНаСторонеКлиента(Оповещение)
- НаСервере = Ложь;
+ Контекст = Новый Структура("Оповещение", Оповещение);
- Попытка
- СертификатКриптографии = Новый СертификатКриптографии(ДанныеСертификата);
- ОписаниеОшибки = "";
- Исключение
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
- КонецПопытки;
+ НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения(
+ "ПроверитьНаСторонеКлиентаПослеПодключенияРасширенияРаботыСКриптографией", ЭтотОбъект, Контекст));
- Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
- УстановитьЭлемент(ЭтотОбъект, ИмяПервойПроверки, НаСервере, ОписаниеОшибки, Истина);
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьНаСторонеКлиента.
+&НаКлиенте
+Процедура ПроверитьНаСторонеКлиентаПослеПодключенияРасширенияРаботыСКриптографией(Подключено, Контекст) Экспорт
+
+ Если Не Подключено Тогда
+ ЭлектроннаяПодписьКлиент.СоздатьМенеджерКриптографии(Новый ОписаниеОповещения(
+ "ПроверитьНаСторонеКлиентаПослеПопыткиСозданияМенеджераКриптографии", ЭтотОбъект, Контекст),
+ "ПроверкаСертификата", Ложь);
Возврат;
КонецЕсли;
+ // Проверка данных сертификата.
+ Контекст.Вставить("ДанныеСертификата", ПолучитьИзВременногоХранилища(АдресСертификата));
+
+ СертификатКриптографии = Новый СертификатКриптографии;
+ СертификатКриптографии.НачатьИнициализацию(Новый ОписаниеОповещения(
+ "ПроверитьНаСторонеКлиентаПослеИнициализацииСертификата", ЭтотОбъект, Контекст,
+ "ПроверитьНаСторонеКлиентаПослеОшибкиИнициализацииСертификата", ЭтотОбъект),
+ Контекст.ДанныеСертификата);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьНаСторонеКлиента.
+&НаКлиенте
+Процедура ПроверитьНаСторонеКлиентаПослеПопыткиСозданияМенеджераКриптографии(Результат, Контекст) Экспорт
+
+ УстановитьЭлемент(ЭтотОбъект, ИмяПервойПроверки, Ложь, Результат, Ложь);
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьНаСторонеКлиента.
+&НаКлиенте
+Процедура ПроверитьНаСторонеКлиентаПослеОшибкиИнициализацииСертификата(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
+
+ СтандартнаяОбработка = Ложь;
+
+ ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
+ УстановитьЭлемент(ЭтотОбъект, ИмяПервойПроверки, Ложь, ОписаниеОшибки, Истина);
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьНаСторонеКлиента.
+&НаКлиенте
+Процедура ПроверитьНаСторонеКлиентаПослеИнициализацииСертификата(СертификатКриптографии, Контекст) Экспорт
+
+ Контекст.Вставить("СертификатКриптографии", СертификатКриптографии);
+
// Законный сертификат
- Если СертификатКриптографии.Субъект.Свойство("SN") Тогда
+ Если Контекст.СертификатКриптографии.Субъект.Свойство("SN") Тогда
ОписаниеОшибки = "";
Иначе
ОписаниеОшибки = НСтр("ru = 'В описании субъекта сертификата не найдено поле ""SN"".'");
КонецЕсли;
- УстановитьЭлемент(ЭтотОбъект, "ЗаконныйСертификат", НаСервере, ОписаниеОшибки);
+ УстановитьЭлемент(ЭтотОбъект, "ЗаконныйСертификат", Ложь, ОписаниеОшибки);
// Наличие сертификата в личном списке.
- ОписаниеОшибки = "";
- ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(Base64Строка(СертификатКриптографии.Отпечаток),
- Истина, , Ложь, ОписаниеОшибки);
- УстановитьЭлемент(ЭтотОбъект, "НаличиеСертификата", НаСервере, ОписаниеОшибки);
+ ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьСертификатПоОтпечатку(Новый ОписаниеОповещения(
+ "ПроверитьНаСторонеКлиентаПослеПоискаСертификата", ЭтотОбъект, Контекст),
+ Base64Строка(Контекст.СертификатКриптографии.Отпечаток), Истина, Неопределено);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьНаСторонеКлиента.
+&НаКлиенте
+Процедура ПроверитьНаСторонеКлиентаПослеПоискаСертификата(Результат, Контекст) Экспорт
+
+ Если ТипЗнч(Результат) <> Тип("СертификатКриптографии") Тогда
+ ОписаниеОшибки = Результат.ОписаниеОшибки + Символы.ПС + Символы.ПС
+ + НСтр("ru = 'Проверка подписания, созданной подписи и расшифровки не могут быть выполнены.'");
+ Иначе
+ ОписаниеОшибки = "";
+ КонецЕсли;
+ УстановитьЭлемент(ЭтотОбъект, "НаличиеСертификата", Ложь, ОписаниеОшибки);
// Проверка данных сертификата.
- ОписаниеОшибки = "";
- МенеджерКриптографии = ЭлектроннаяПодписьСлужебныйКлиент.МенеджерКриптографии("ПроверкаСертификата",
- Ложь, ОписаниеОшибки);
+ ЭлектроннаяПодписьКлиент.СоздатьМенеджерКриптографии(Новый ОписаниеОповещения(
+ "ПроверитьНаСторонеКлиентаПослеСозданияЛюбогоМенеджераКриптографии", ЭтотОбъект, Контекст),
+ "ПроверкаСертификата", Ложь);
- Если Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
- ЭлектроннаяПодписьКлиент.ПроверитьСертификат(МенеджерКриптографии, СертификатКриптографии, ОписаниеОшибки);
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьНаСторонеКлиента.
+&НаКлиенте
+Процедура ПроверитьНаСторонеКлиентаПослеСозданияЛюбогоМенеджераКриптографии(Результат, Контекст) Экспорт
+
+ Если ТипЗнч(Результат) = Тип("МенеджерКриптографии") Тогда
+ ЭлектроннаяПодписьКлиент.ПроверитьСертификат(Новый ОписаниеОповещения(
+ "ПроверитьНаСторонеКлиентаПослеПроверкиСертификата", ЭтотОбъект, Контекст),
+ Контекст.СертификатКриптографии, Результат);
+ Иначе
+ ПроверитьНаСторонеКлиентаПослеПроверкиСертификата(Результат, Контекст)
КонецЕсли;
- УстановитьЭлемент(ЭтотОбъект, "ДанныеСертификата", НаСервере, ОписаниеОшибки, Истина);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьНаСторонеКлиента.
+&НаКлиенте
+Процедура ПроверитьНаСторонеКлиентаПослеПроверкиСертификата(Результат, Контекст) Экспорт
+
+ Если Результат = Истина Тогда
+ ОписаниеОшибки = "";
+ Иначе
+ ОписаниеОшибки = Результат;
+ КонецЕсли;
+ УстановитьЭлемент(ЭтотОбъект, "ДанныеСертификата", Ложь, ОписаниеОшибки, Истина);
// Наличие программы
Если ЗначениеЗаполнено(Программа) Тогда
- ОписаниеОшибки = "";
- МенеджерКриптографии = ЭлектроннаяПодписьСлужебныйКлиент.МенеджерКриптографии("",
- Ложь, ОписаниеОшибки, Программа);
+ ЭлектроннаяПодписьКлиент.СоздатьМенеджерКриптографии(Новый ОписаниеОповещения(
+ "ПроверитьНаСторонеКлиентаПослеСозданияМенеджераКриптографии", ЭтотОбъект, Контекст),
+ "ПроверкаСертификата", Ложь, Программа);
Иначе
- МенеджерКриптографии = Неопределено;
ОписаниеОшибки = НСтр("ru = 'Программа для использования закрытого ключа не указана в сертификате.'");
+ ПроверитьНаСторонеКлиентаПослеСозданияМенеджераКриптографии(ОписаниеОшибки, Контекст);
КонецЕсли;
- Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
- ОписаниеОшибки = ОписаниеОшибки + Символы.ПС + Символы.ПС
- + НСтр("ru = 'Проверка подписания, проверка созданной подписи, проверка шифрования
- |и проверка расшифровки не могут быть выполнены.'");
- КонецЕсли;
- УстановитьЭлемент(ЭтотОбъект, "НаличиеПрограммы", НаСервере, ОписаниеОшибки, Истина);
-
- УстановитьЭлемент(ЭтотОбъект, "Подписание", НаСервере);
- УстановитьЭлемент(ЭтотОбъект, "ПроверкаПодписи", НаСервере);
- УстановитьЭлемент(ЭтотОбъект, "Шифрование", НаСервере);
- УстановитьЭлемент(ЭтотОбъект, "Расшифровка", НаСервере);
- Для каждого ЭлементСписка Из ДополнительныеПроверки Цикл
- УстановитьЭлемент(ЭтотОбъект, ЭлементСписка.Значение, НаСервере);
- КонецЦикла;
-
- Если МенеджерКриптографии = Неопределено Тогда
- Возврат;
- КонецЕсли;
-
- МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = СвойстваПароля.Значение;
-
- ПроверитьОперации(ЭтотОбъект, МенеджерКриптографии, СертификатКриптографии,
- ДанныеСертификата, НаСервере, ПарольПринят, ЭлектроннаяПодписьПереопределяемыйКлиент);
КонецПроцедуры
-&НаСервере
-Процедура ПроверитьНаСторонеСервера(Знач ЗначениеПароля, ПарольПринят)
+// Продолжение процедуры ПроверитьНаСторонеКлиента.
+&НаКлиенте
+Процедура ПроверитьНаСторонеКлиентаПослеСозданияМенеджераКриптографии(Результат, Контекст) Экспорт
- НаСервере = Истина;
+ Контекст.Вставить("МенеджерКриптографии", Неопределено);
+
+ Если ТипЗнч(Результат) = Тип("МенеджерКриптографии") Тогда
+ Контекст.МенеджерКриптографии = Результат;
+ ОписаниеОшибки = "";
+ Иначе
+ ОписаниеОшибки = Результат + Символы.ПС + Символы.ПС
+ + НСтр("ru = 'Проверка подписания, созданной подписи, шифрования и
+ |расшифровки не могут быть выполнены.'");
+ КонецЕсли;
+ УстановитьЭлемент(ЭтотОбъект, "НаличиеПрограммы", Ложь, ОписаниеОшибки, Истина);
+
+ Если Контекст.МенеджерКриптографии = Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение);
+ Возврат;
+ КонецЕсли;
+
+ Контекст.МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = СвойстваПароля.Значение;
+
+ // Подписание.
+ Если ПроверкиНаКлиенте.НаличиеСертификата Тогда
+ Контекст.МенеджерКриптографии.НачатьПодписывание(Новый ОписаниеОповещения(
+ "ПроверитьНаСторонеКлиентаПослеПодписания", ЭтотОбъект, Контекст,
+ "ПроверитьНаСторонеКлиентаПослеОшибкиПодписания", ЭтотОбъект),
+ Контекст.ДанныеСертификата, Контекст.СертификатКриптографии);
+ Иначе
+ ПроверитьНаСторонеКлиентаПослеПодписания(Null, Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьНаСторонеКлиента.
+&НаКлиенте
+Процедура ПроверитьНаСторонеКлиентаПослеОшибкиПодписания(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
+
+ СтандартнаяОбработка = Ложь;
+ ПроверитьНаСторонеКлиентаПослеПодписания(КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьНаСторонеКлиента.
+&НаКлиенте
+Процедура ПроверитьНаСторонеКлиентаПослеПодписания(ДанныеПодписи, Контекст) Экспорт
+
+ Если ДанныеПодписи <> Null Тогда
+ Если ТипЗнч(ДанныеПодписи) = Тип("Строка") Тогда
+ ОписаниеОшибки = ДанныеПодписи;
+ Иначе
+ ОписаниеОшибки = "";
+ ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеДанныеПодписи(ДанныеПодписи, ОписаниеОшибки);
+ КонецЕсли;
+ Если Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
+ ПарольПринят = Истина;
+ КонецЕсли;
+ УстановитьЭлемент(ЭтотОбъект, "Подписание", Ложь, ОписаниеОшибки, Истина);
+ КонецЕсли;
+
+ // Проверка подписи.
+ Если ПроверкиНаКлиенте.НаличиеСертификата И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
+ Контекст.МенеджерКриптографии.НачатьПроверкуПодписи(Новый ОписаниеОповещения(
+ "ПроверитьНаСторонеКлиентаПослеПроверкиПодписи", ЭтотОбъект, Контекст,
+ "ПроверитьНаСторонеКлиентаПослеОшибкиПроверкиПодписи", ЭтотОбъект),
+ Контекст.ДанныеСертификата, ДанныеПодписи);
+ Иначе
+ ПроверитьНаСторонеКлиентаПослеПроверкиПодписи(Null, Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьНаСторонеКлиента.
+&НаКлиенте
+Процедура ПроверитьНаСторонеКлиентаПослеОшибкиПроверкиПодписи(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
+
+ СтандартнаяОбработка = Ложь;
+ ПроверитьНаСторонеКлиентаПослеПроверкиПодписи(КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьНаСторонеКлиента.
+&НаКлиенте
+Процедура ПроверитьНаСторонеКлиентаПослеПроверкиПодписи(Сертификат, Контекст) Экспорт
+
+ Если Сертификат <> Null Тогда
+ Если ТипЗнч(Сертификат) = Тип("Строка") Тогда
+ ОписаниеОшибки = Сертификат;
+ Иначе
+ ОписаниеОшибки = "";
+ КонецЕсли;
+ УстановитьЭлемент(ЭтотОбъект, "ПроверкаПодписи", Ложь, ОписаниеОшибки, Истина);
+ КонецЕсли;
+
+ // Шифрование.
+ Контекст.МенеджерКриптографии.НачатьШифрование(Новый ОписаниеОповещения(
+ "ПроверитьНаСторонеКлиентаПослеШифрования", ЭтотОбъект, Контекст,
+ "ПроверитьНаСторонеКлиентаПослеОшибкиШифрования", ЭтотОбъект),
+ Контекст.ДанныеСертификата, Контекст.СертификатКриптографии);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьНаСторонеКлиента.
+&НаКлиенте
+Процедура ПроверитьНаСторонеКлиентаПослеОшибкиШифрования(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
+
+ СтандартнаяОбработка = Ложь;
+ ПроверитьНаСторонеКлиентаПослеШифрования(КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьНаСторонеКлиента.
+&НаКлиенте
+Процедура ПроверитьНаСторонеКлиентаПослеШифрования(ЗашифрованныеДанные, Контекст) Экспорт
+
+ Если ТипЗнч(ЗашифрованныеДанные) = Тип("Строка") Тогда
+ ОписаниеОшибки = ЗашифрованныеДанные;
+ Иначе
+ ОписаниеОшибки = "";
+ КонецЕсли;
+ УстановитьЭлемент(ЭтотОбъект, "Шифрование", Ложь, ОписаниеОшибки, Истина);
+
+ // Расшифровка.
+ Если ПроверкиНаКлиенте.НаличиеСертификата И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
+ Контекст.МенеджерКриптографии.НачатьРасшифровку(Новый ОписаниеОповещения(
+ "ПроверитьНаСторонеКлиентаПослеРасшифровки", ЭтотОбъект, Контекст,
+ "ПроверитьНаСторонеКлиентаПослеОшибкиРасшифровки", ЭтотОбъект),
+ ЗашифрованныеДанные);
+ Иначе
+ ПроверитьНаСторонеКлиентаПослеРасшифровки(Null, Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьНаСторонеКлиента.
+&НаКлиенте
+Процедура ПроверитьНаСторонеКлиентаПослеОшибкиРасшифровки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
+
+ СтандартнаяОбработка = Ложь;
+ ПроверитьНаСторонеКлиентаПослеРасшифровки(КраткоеПредставлениеОшибки(ИнформацияОбОшибке), Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьНаСторонеКлиента.
+&НаКлиенте
+Процедура ПроверитьНаСторонеКлиентаПослеРасшифровки(РасшифрованныеДанные, Контекст) Экспорт
+
+ Если РасшифрованныеДанные <> Null Тогда
+ Если ТипЗнч(РасшифрованныеДанные) = Тип("Строка") Тогда
+ ОписаниеОшибки = РасшифрованныеДанные;
+ Иначе
+ ОписаниеОшибки = "";
+ КонецЕсли;
+ ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеРасшифрованныеДанные(РасшифрованныеДанные, ОписаниеОшибки);
+ УстановитьЭлемент(ЭтотОбъект, "Расшифровка", Ложь, ОписаниеОшибки, Истина);
+ КонецЕсли;
+
+ // Дополнительные проверки.
+ Контекст.Вставить("Индекс", -1);
+
+ ПроверитьНаСторонеКлиентаЦиклНачало(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьНаСторонеКлиента.
+&НаКлиенте
+Процедура ПроверитьНаСторонеКлиентаЦиклНачало(Контекст)
+
+ Если ДополнительныеПроверки.Количество() <= Контекст.Индекс + 1 Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение);
+ Возврат;
+ КонецЕсли;
+ Контекст.Индекс = Контекст.Индекс + 1;
+ Контекст.Вставить("ЭлементСписка", ДополнительныеПроверки[Контекст.Индекс]);
+
+ ПараметрыВыполнения = Новый Структура;
+ ПараметрыВыполнения.Вставить("Сертификат", Сертификат);
+ ПараметрыВыполнения.Вставить("Проверка", Контекст.ЭлементСписка.Значение);
+ ПараметрыВыполнения.Вставить("МенеджерКриптографии", Контекст.МенеджерКриптографии);
+ ПараметрыВыполнения.Вставить("ОписаниеОшибки", "");
+ ПараметрыВыполнения.Вставить("ЭтоПредупреждение", Ложь);
+ ПараметрыВыполнения.Вставить("ОжидатьПродолжения", Ложь);
+ ПараметрыВыполнения.Вставить("Оповещение", Новый ОписаниеОповещения(
+ "ПроверитьНаСторонеКлиентаПослеДополнительнойПроверки", ЭтотОбъект, Контекст));
+
+ Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения);
+
+ Попытка
+ ЭлектроннаяПодписьПереопределяемыйКлиент.ПриДополнительнойПроверкеСертификата(ПараметрыВыполнения);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ПараметрыВыполнения.ОжидатьПродолжения = Ложь;
+ ПараметрыВыполнения.ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
+ КонецПопытки;
+
+ Если ПараметрыВыполнения.ОжидатьПродолжения <> Истина Тогда
+ ПроверитьНаСторонеКлиентаПослеДополнительнойПроверки(, Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьНаСторонеКлиента.
+&НаКлиенте
+Процедура ПроверитьНаСторонеКлиентаПослеДополнительнойПроверки(Неопределен, Контекст) Экспорт
+
+ УстановитьЭлемент(ЭтотОбъект, Контекст.ЭлементСписка.Значение, Ложь,
+ Контекст.ПараметрыВыполнения.ОписаниеОшибки,
+ Контекст.ПараметрыВыполнения.ЭтоПредупреждение <> Истина);
+
+ ПроверитьНаСторонеКлиентаЦиклНачало(Контекст);
+
+КонецПроцедуры
+
+
+&НаСервере
+Процедура ПроверитьНаСторонеСервера(Знач ЗначениеПароля)
+
+ ДанныеСертификата = ПолучитьИзВременногоХранилища(АдресСертификата);
Попытка
СертификатКриптографии = Новый СертификатКриптографии(ДанныеСертификата);
@@ -380,7 +703,7 @@
КонецПопытки;
Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
- УстановитьЭлемент(ЭтотОбъект, ИмяПервойПроверки, НаСервере, ОписаниеОшибки, Истина);
+ УстановитьЭлемент(ЭтотОбъект, ИмяПервойПроверки, Истина, ОписаниеОшибки, Истина);
Возврат;
КонецЕсли;
@@ -390,13 +713,19 @@
Иначе
ОписаниеОшибки = НСтр("ru = 'В описании субъекта сертификата не найдено поле ""SN"".'");
КонецЕсли;
- УстановитьЭлемент(ЭтотОбъект, "ЗаконныйСертификат", НаСервере, ОписаниеОшибки);
+ УстановитьЭлемент(ЭтотОбъект, "ЗаконныйСертификат", Истина, ОписаниеОшибки);
// Наличие сертификата в личном списке.
- ОписаниеОшибки = "";
- ЭлектроннаяПодпись.ПолучитьСертификатПоОтпечатку(Base64Строка(СертификатКриптографии.Отпечаток),
- Истина, , Ложь, ОписаниеОшибки);
- УстановитьЭлемент(ЭтотОбъект, "НаличиеСертификата", НаСервере, ОписаниеОшибки);
+ Результат = Новый Структура;
+ ЭлектроннаяПодписьСлужебный.ПолучитьСертификатПоОтпечатку(Base64Строка(СертификатКриптографии.Отпечаток),
+ Истина, Ложь, , Результат);
+ Если ЗначениеЗаполнено(Результат) Тогда
+ ОписаниеОшибки = Результат.ОписаниеОшибки + Символы.ПС + Символы.ПС
+ + НСтр("ru = 'Проверка подписания, созданной подписи и расшифровки не могут быть выполнены.'");
+ Иначе
+ ОписаниеОшибки = "";
+ КонецЕсли;
+ УстановитьЭлемент(ЭтотОбъект, "НаличиеСертификата", Истина, ОписаниеОшибки);
// Проверка данных сертификата.
ОписаниеОшибки = "";
@@ -406,7 +735,7 @@
Если Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
ЭлектроннаяПодпись.ПроверитьСертификат(МенеджерКриптографии, СертификатКриптографии, ОписаниеОшибки);
КонецЕсли;
- УстановитьЭлемент(ЭтотОбъект, "ДанныеСертификата", НаСервере, ОписаниеОшибки, Истина);
+ УстановитьЭлемент(ЭтотОбъект, "ДанныеСертификата", Истина, ОписаниеОшибки, Истина);
// Наличие программы
Если ЗначениеЗаполнено(Программа) Тогда
@@ -417,15 +746,12 @@
МенеджерКриптографии = Неопределено;
ОписаниеОшибки = НСтр("ru = 'Программа для использования закрытого ключа не указана в сертификате.'");
КонецЕсли;
- УстановитьЭлемент(ЭтотОбъект, "НаличиеПрограммы", НаСервере, ОписаниеОшибки, Истина);
-
- УстановитьЭлемент(ЭтотОбъект, "Подписание", НаСервере);
- УстановитьЭлемент(ЭтотОбъект, "ПроверкаПодписи", НаСервере);
- УстановитьЭлемент(ЭтотОбъект, "Шифрование", НаСервере);
- УстановитьЭлемент(ЭтотОбъект, "Расшифровка", НаСервере);
- Для каждого ЭлементСписка Из ДополнительныеПроверки Цикл
- УстановитьЭлемент(ЭтотОбъект, ЭлементСписка.Значение, НаСервере);
- КонецЦикла;
+ Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
+ ОписаниеОшибки = ОписаниеОшибки + Символы.ПС + Символы.ПС
+ + НСтр("ru = 'Проверка подписания, созданной подписи, шифрования и
+ |расшифровки не могут быть выполнены.'");
+ КонецЕсли;
+ УстановитьЭлемент(ЭтотОбъект, "НаличиеПрограммы", Истина, ОписаниеОшибки, Истина);
Если МенеджерКриптографии = Неопределено Тогда
Возврат;
@@ -433,52 +759,46 @@
МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = ЗначениеПароля;
- ПроверитьОперации(ЭтотОбъект, МенеджерКриптографии, СертификатКриптографии,
- ДанныеСертификата, НаСервере, ПарольПринят, ЭлектроннаяПодписьПереопределяемый);
-
-КонецПроцедуры
-
-&НаКлиентеНаСервереБезКонтекста
-Процедура ПроверитьОперации(Форма, МенеджерКриптографии, СертификатКриптографии, Данные, НаСервере, ПарольПринят, Модуль)
-
// Подписание.
- ОписаниеОшибки = "";
- Попытка
- ДанныеПодписи = МенеджерКриптографии.Подписать(Данные, СертификатКриптографии);
- ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеДанныеПодписи(ДанныеПодписи, ОписаниеОшибки);
- Исключение
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
- КонецПопытки;
- Если Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
- ПарольПринят = Истина;
- КонецЕсли;
- УстановитьЭлемент(Форма, "Подписание", НаСервере, ОписаниеОшибки, Истина);
-
- // Проверка подписи.
- Если Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
+ Если ПроверкиНаСервере.НаличиеСертификата Тогда
ОписаниеОшибки = "";
Попытка
- МенеджерКриптографии.ПроверитьПодпись(Данные, ДанныеПодписи);
+ ДанныеПодписи = МенеджерКриптографии.Подписать(ДанныеСертификата, СертификатКриптографии);
+ ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеДанныеПодписи(ДанныеПодписи, ОписаниеОшибки);
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
КонецПопытки;
- УстановитьЭлемент(Форма, "ПроверкаПодписи", НаСервере, ОписаниеОшибки, Истина);
+ Если Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
+ ПарольПринят = Истина;
+ КонецЕсли;
+ УстановитьЭлемент(ЭтотОбъект, "Подписание", Истина, ОписаниеОшибки, Истина);
+ КонецЕсли;
+
+ // Проверка подписи.
+ Если ПроверкиНаСервере.НаличиеСертификата И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
+ ОписаниеОшибки = "";
+ Попытка
+ МенеджерКриптографии.ПроверитьПодпись(ДанныеСертификата, ДанныеПодписи);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
+ КонецПопытки;
+ УстановитьЭлемент(ЭтотОбъект, "ПроверкаПодписи", Истина, ОписаниеОшибки, Истина);
КонецЕсли;
// Шифрование.
ОписаниеОшибки = "";
Попытка
- ЗашифрованныеДанные = МенеджерКриптографии.Зашифровать(Данные, СертификатКриптографии);
+ ЗашифрованныеДанные = МенеджерКриптографии.Зашифровать(ДанныеСертификата, СертификатКриптографии);
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
КонецПопытки;
- УстановитьЭлемент(Форма, "Шифрование", НаСервере, ОписаниеОшибки, Истина);
+ УстановитьЭлемент(ЭтотОбъект, "Шифрование", Истина, ОписаниеОшибки, Истина);
// Расшифровка.
- Если Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
+ Если ПроверкиНаСервере.НаличиеСертификата И Не ЗначениеЗаполнено(ОписаниеОшибки) Тогда
ОписаниеОшибки = "";
Попытка
РасшифрованныеДанные = МенеджерКриптографии.Расшифровать(ЗашифрованныеДанные);
@@ -487,21 +807,21 @@
ИнформацияОбОшибке = ИнформацияОбОшибке();
ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
КонецПопытки;
- УстановитьЭлемент(Форма, "Расшифровка", НаСервере, ОписаниеОшибки, Истина);
+ УстановитьЭлемент(ЭтотОбъект, "Расшифровка", Истина, ОписаниеОшибки, Истина);
КонецЕсли;
// Дополнительные проверки.
- Для каждого ЭлементСписка Из Форма.ДополнительныеПроверки Цикл
+ Для каждого ЭлементСписка Из ДополнительныеПроверки Цикл
ОписаниеОшибки = "";
ЭтоПредупреждение = Ложь;
Попытка
- Модуль.ПриДополнительнойПроверкеСертификата(Форма.Сертификат, ЭлементСписка.Значение,
- МенеджерКриптографии, ОписаниеОшибки, ЭтоПредупреждение);
+ ЭлектроннаяПодписьПереопределяемый.ПриДополнительнойПроверкеСертификата(Сертификат,
+ ЭлементСписка.Значение, МенеджерКриптографии, ОписаниеОшибки, ЭтоПредупреждение);
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
КонецПопытки;
- УстановитьЭлемент(Форма, ЭлементСписка.Значение, НаСервере, ОписаниеОшибки, ЭтоПредупреждение <> Истина);
+ УстановитьЭлемент(ЭтотОбъект, ЭлементСписка.Значение, Истина, ОписаниеОшибки, ЭтоПредупреждение <> Истина);
КонецЦикла;
КонецПроцедуры
@@ -512,8 +832,15 @@
ЭлементКартинка = Форма.Элементы[НачалоЭлемента + ?(НаСервере, "НаСервере", "НаКлиенте") + "Картинка"];
Проверки = Форма["Проверки" + ?(НаСервере, "НаСервере", "НаКлиенте")];
+ Попытка
+ Значение = ЭлементКартинка.Картинка;
+ Исключение
+ Форма.УстановитьЭлементЧерезСервер(НачалоЭлемента, НаСервере, ОписаниеОшибки, ЭтоОшибка);
+ Возврат;
+ КонецПопытки;
+
Если ОписаниеОшибки = Неопределено Тогда
- ЭлементКартинка.Картинка = БиблиотекаКартинок.ПустоеСостояние;
+ ЭлементКартинка.Картинка = Новый Картинка;
ЭлементКартинка.Подсказка = НСтр("ru = 'Проверка не выполнялась.'");
Проверки.Вставить(НачалоЭлемента, Неопределено);
@@ -529,4 +856,11 @@
КонецПроцедуры
+&НаСервере
+Процедура УстановитьЭлементЧерезСервер(НачалоЭлемента, НаСервере, ОписаниеОшибки, ЭтоОшибка)
+
+ УстановитьЭлемент(ЭтотОбъект, НачалоЭлемента, НаСервере, ОписаниеОшибки, ЭтоОшибка);
+
+КонецПроцедуры
+
#КонецОбласти
diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПросмотрДанных/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПросмотрДанных/Form.form
index 40e2bc8a1..7fb047187 100644
--- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПросмотрДанных/Form.form
+++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПросмотрДанных/Form.form
@@ -61,46 +61,6 @@
Normal
-
- СписокЗначение
- 27
- true
- true
-
-
- Список.Значение
-
-
- СписокЗначениеРасширеннаяПодсказка
- 29
- Label
- true
- true
-
- Left
-
-
-
- СписокЗначениеКонтекстноеМеню
- 28
- true
-
- InputField
- true
- Auto
- true
- Left
- true
-
- true
- true
- true
- true
- true
- true
- Normal
-
- СписокКоманднаяПанель3
@@ -215,6 +175,9 @@
Autotruetrue
+ None
+ None
+ Nonetrue
@@ -306,23 +269,6 @@
true
-
- Значение
-
- ru
- Значение
-
- 1
-
- AnyRef
-
-
- true
-
-
- true
-
- Представление
@@ -362,9 +308,7 @@
СписокПредставленийДанных
-
- ValueList
-
+ ПредставлениеДанных
diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПросмотрДанных/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПросмотрДанных/Module.bsl
index cca1b2a80..c700f7b8f 100644
--- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПросмотрДанных/Module.bsl
+++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПросмотрДанных/Module.bsl
@@ -1,12 +1,19 @@
+&НаКлиенте
+Перем СписокПредставленийДанных;
+
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
+ Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа.
+ Возврат;
+ КонецЕсли;
+
Заголовок = Параметры.ПредставлениеДанных;
- Для каждого ЭлементСписка Из Параметры.СписокПредставленийДанных Цикл
- ЗаполнитьЗначенияСвойств(Список.Добавить(), ЭлементСписка);
+ Для каждого Представление Из Параметры.СписокПредставленийДанных Цикл
+ Список.Добавить().Представление = Представление;
КонецЦикла;
КонецПроцедуры
@@ -25,9 +32,11 @@
#Область ОбработчикиСобытийЭлементовТаблицыФормыСписок
&НаКлиенте
-Процедура СписокОткрыть(Команда)
+Процедура УстановитьСписокПредставлений(СписокПредставлений, Контекст) Экспорт
- ОткрытьДанные();
+ СписокПредставленийДанных = СписокПредставлений;
+
+ Контекст = Новый ОписаниеОповещения("УстановитьСписокПредставлений", ЭтотОбъект, Контекст);
КонецПроцедуры
@@ -35,14 +44,33 @@
#Область ОбработчикиКомандФормы
+&НаКлиенте
+Процедура СписокОткрыть()
+
+ ОткрытьДанные();
+
+КонецПроцедуры
+
&НаКлиенте
Процедура ОткрытьДанные()
- Если Элементы.Список.ТекущиеДанные = Неопределено Тогда
+ Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
- ПоказатьЗначение(, Элементы.Список.ТекущиеДанные.Значение);
+ Строка = Список.НайтиПоИдентификатору(Элементы.Список.ТекущаяСтрока);
+ Если Строка = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+ Индекс = Список.Индекс(Строка);
+
+ Значение = СписокПредставленийДанных[Индекс].Значение;
+
+ Если ТипЗнч(Значение) = Тип("ОписаниеОповещения") Тогда
+ ВыполнитьОбработкуОповещения(Значение);
+ Иначе
+ ПоказатьЗначение(, Значение);
+ КонецЕсли;
КонецПроцедуры
diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Form.form
index 2375d209e..f1a4e3257 100644
--- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Form.form
+++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Form.form
@@ -1149,7 +1149,6 @@
ПредставлениеДанныхString
- AnyRef
diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Help/ru.html b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Help/ru.html
index 6feb4de68..3d8aa5d20 100644
--- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Help/ru.html
+++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для расшифровки данных.
Выводятся сведения:
В ссылке в верхней части окна указываются сведения о данных, которые будут расшифрованы.
diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Module.bsl
index 4aedec038..4df18b091 100644
--- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Module.bsl
+++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/РасшифровкаДанных/Module.bsl
@@ -1,5 +1,5 @@
&НаКлиенте
-Перем ВнутренниеДанные, СвойстваПароля, ОписаниеДанных, ФормаОбъекта, ОбработкаПослеПредупреждения;
+Перем ВнутренниеДанные, СвойстваПароля, ОписаниеДанных, ФормаОбъекта, ОбработкаПослеПредупреждения, ТекущийСписокПредставлений;
#Область ОбработчикиСобытийФормы
@@ -48,14 +48,23 @@
Процедура ПредставлениеДанныхНажатие(Элемент, СтандартнаяОбработка)
ЭлектроннаяПодписьСлужебныйКлиент.ПредставлениеДанныхНажатие(ЭтотОбъект,
- Элемент, СтандартнаяОбработка, ОписаниеДанных);
+ Элемент, СтандартнаяОбработка, ТекущийСписокПредставлений);
КонецПроцедуры
&НаКлиенте
Процедура СертификатПриИзменении(Элемент)
- СертификатПриИзмененииНаСервере(ЭлектроннаяПодписьСлужебныйКлиент.ОтпечаткиСертификатовНаКлиенте());
+ ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьОтпечаткиСертификатовНаКлиенте(
+ Новый ОписаниеОповещения("СертификатПриИзмененииЗавершение", ЭтотОбъект));
+
+КонецПроцедуры
+
+// Продолжение процедуры СертификатПриИзменении.
+&НаКлиенте
+Процедура СертификатПриИзмененииЗавершение(ОтпечаткиСертификатовНаКлиенте, Контекст) Экспорт
+
+ СертификатПриИзмененииНаСервере(ОтпечаткиСертификатовНаКлиенте);
ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект, ВнутренниеДанные, СвойстваПароля);
@@ -114,7 +123,16 @@
Сертификат = ВыбранноеЗначение;
КонецЕсли;
- СертификатПриИзмененииНаСервере(ЭлектроннаяПодписьСлужебныйКлиент.ОтпечаткиСертификатовНаКлиенте());
+ ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьОтпечаткиСертификатовНаКлиенте(
+ Новый ОписаниеОповещения("СертификатОбработкаВыбораЗавершение", ЭтотОбъект, ВыбранноеЗначение));
+
+КонецПроцедуры
+
+// Продолжение процедуры СертификатОбработкаВыбора.
+&НаКлиенте
+Процедура СертификатОбработкаВыбораЗавершение(ОтпечаткиСертификатовНаКлиенте, ВыбранноеЗначение) Экспорт
+
+ СертификатПриИзмененииНаСервере(ОтпечаткиСертификатовНаКлиенте);
Если ВыбранноеЗначение = Истина
И ВнутренниеДанные["ВыбранныйСертификатПароль"] <> Неопределено Тогда
@@ -132,16 +150,14 @@
&НаКлиенте
Процедура СертификатАвтоПодбор(Элемент, Текст, ДанныеВыбора, Параметры, Ожидание, СтандартнаяОбработка)
- СтандартнаяОбработка = Ложь;
- ДанныеВыбора = СертификатСписокВыбора;
+ ЭлектроннаяПодписьСлужебныйКлиент.СертификатПодборИзСпискаВыбора(ЭтотОбъект, Текст, ДанныеВыбора, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура СертификатОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, Параметры, СтандартнаяОбработка)
- СтандартнаяОбработка = Ложь;
- ДанныеВыбора = СертификатСписокВыбора;
+ ЭлектроннаяПодписьСлужебныйКлиент.СертификатПодборИзСпискаВыбора(ЭтотОбъект, Текст, ДанныеВыбора, СтандартнаяОбработка);
КонецПроцедуры
@@ -201,11 +217,17 @@
Возврат;
КонецЕсли;
- Если Не РасшифроватьДанные() Тогда
- Возврат;
- КонецЕсли;
+ РасшифроватьДанные(Новый ОписаниеОповещения("РасшифроватьЗавершение", ЭтотОбъект));
- Закрыть(Истина);
+КонецПроцедуры
+
+// Продолжение процедуры Расшифровать.
+&НаКлиенте
+Процедура РасшифроватьЗавершение(Результат, Контекст) Экспорт
+
+ Если Результат = Истина Тогда
+ Закрыть(Истина);
+ КонецЕсли;
КонецПроцедуры
@@ -214,19 +236,47 @@
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
-Функция ПродолжитьОткрытие(ОбщиеВнутренниеДанные, КлиентскиеПараметры) Экспорт
+Процедура ПродолжитьОткрытие(Оповещение, ОбщиеВнутренниеДанные, КлиентскиеПараметры) Экспорт
- Если Не ЭлектроннаяПодписьСлужебныйКлиент.ПродолжитьОткрытиеНачало(ЭтотОбъект, КлиентскиеПараметры,, Истина) Тогда
- Возврат Ложь;
+ Если КлиентскиеПараметры = ВнутренниеДанные Тогда
+ КлиентскиеПараметры = Новый Структура("Сертификат, СвойстваПароля", Сертификат, СвойстваПароля);
+ Возврат;
КонецЕсли;
- ОбработкаПродолжения = Новый ОписаниеОповещения("ПродолжитьОткрытие", ЭтотОбъект);
+ Если КлиентскиеПараметры.Свойство("УказанКонтекстДругойОперации") Тогда
+ СвойстваСертификата = ОбщиеВнутренниеДанные;
+ КлиентскиеПараметры.ОписаниеДанных.КонтекстОперации.ПродолжитьОткрытие(,, СвойстваСертификата);
+ Если СвойстваСертификата.Сертификат = Сертификат Тогда
+ СвойстваПароля = СвойстваСертификата.СвойстваПароля;
+ КонецЕсли;
+ КонецЕсли;
+
+ ОписаниеДанных = КлиентскиеПараметры.ОписаниеДанных;
+ ФормаОбъекта = КлиентскиеПараметры.Форма;
+ ТекущийСписокПредставлений = КлиентскиеПараметры.ТекущийСписокПредставлений;
ВнутренниеДанные = ОбщиеВнутренниеДанные;
- ОписаниеДанных = КлиентскиеПараметры.ОписаниеДанных;
- ФормаОбъекта = КлиентскиеПараметры.Форма;
+ Контекст = Новый Структура("Оповещение", Оповещение);
+ Оповещение = Новый ОписаниеОповещения("ПродолжитьОткрытие", ЭтотОбъект);
+
+ ЭлектроннаяПодписьСлужебныйКлиент.ПродолжитьОткрытиеНачало(Новый ОписаниеОповещения(
+ "ПродолжитьОткрытиеПослеНачала", ЭтотОбъект, Контекст), ЭтотОбъект, КлиентскиеПараметры,, Истина);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПродолжитьОткрытие.
+&НаКлиенте
+Процедура ПродолжитьОткрытиеПослеНачала(Результат, Контекст) Экспорт
+
+ Если Результат <> Истина Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение);
+ Возврат;
+ КонецЕсли;
ДополнительныеПараметры = Новый Структура;
+ Если СвойстваПароля <> Неопределено Тогда
+ ДополнительныеПараметры.Вставить("ПриУстановкеПароляИзДругойОперации", Истина);
+ КонецЕсли;
ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект,
ВнутренниеДанные, СвойстваПароля, ДополнительныеПараметры);
@@ -242,30 +292,51 @@
Или ДополнительныеПараметры.УсиленнаяЗащитаЗакрытогоКлюча) Тогда
ОбработкаПослеПредупреждения = Неопределено;
-
- Если РасшифроватьДанные() Тогда
- ВыполнитьОбработкуОповещения(ОписаниеОповещенияОЗакрытии, Истина);
- Возврат Истина;
- КонецЕсли;
- Иначе
- Открыть();
+ РасшифроватьДанные(Новый ОписаниеОповещения("ПродолжитьОткрытиеПослеРасшифровкиДанных", ЭтотОбъект, Контекст));
+ Возврат;
КонецЕсли;
- Возврат Истина;
+ Открыть();
-КонецФункции
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПродолжитьОткрытие.
+&НаКлиенте
+Процедура ПродолжитьОткрытиеПослеРасшифровкиДанных(Результат, Контекст) Экспорт
+
+ Если Результат = Истина Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина);
+ Иначе
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение);
+ КонецЕсли;
+
+КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьРасшифровку(КлиентскиеПараметры, ОбработкаЗавершения) Экспорт
- ОписаниеДанных = КлиентскиеПараметры.ОписаниеДанных;
- ФормаОбъекта = КлиентскиеПараметры.Форма;
+ ЭлектроннаяПодписьСлужебныйКлиент.ОбновитьФормуПередПовторнымИспользованием(ЭтотОбъект, КлиентскиеПараметры);
+
+ ОписаниеДанных = КлиентскиеПараметры.ОписаниеДанных;
+ ФормаОбъекта = КлиентскиеПараметры.Форма;
+ ТекущийСписокПредставлений = КлиентскиеПараметры.ТекущийСписокПредставлений;
ОбработкаПослеПредупреждения = ОбработкаЗавершения;
ОбработкаПродолжения = Новый ОписаниеОповещения("ВыполнитьРасшифровку", ЭтотОбъект);
- Если РасшифроватьДанные() Тогда
- ВыполнитьОбработкуОповещения(ОбработкаЗавершения, Истина);
+ Контекст = Новый Структура("ОбработкаЗавершения", ОбработкаЗавершения);
+ РасшифроватьДанные(Новый ОписаниеОповещения("ВыполнитьРасшифровкуЗавершение", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьРасшифровку.
+&НаКлиенте
+Процедура ВыполнитьРасшифровкуЗавершение(Результат, Контекст) Экспорт
+
+ Если Результат = Истина Тогда
+ ВыполнитьОбработкуОповещения(Контекст.ОбработкаЗавершения, Истина);
КонецЕсли;
КонецПроцедуры
@@ -273,7 +344,16 @@
&НаКлиенте
Процедура ПриИзмененииСпискаСертификатов()
- СертификатПриИзмененииНаСервере(ЭлектроннаяПодписьСлужебныйКлиент.ОтпечаткиСертификатовНаКлиенте(), Истина);
+ ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьОтпечаткиСертификатовНаКлиенте(
+ Новый ОписаниеОповещения("ПриИзмененииСпискаСертификатовЗавершение", ЭтотОбъект));
+
+КонецПроцедуры
+
+// Продолжение процедуры ПриИзмененииСпискаСертификатов.
+&НаКлиенте
+Процедура ПриИзмененииСпискаСертификатовЗавершение(ОтпечаткиСертификатовНаКлиенте, Контекст) Экспорт
+
+ СертификатПриИзмененииНаСервере(ОтпечаткиСертификатовНаКлиенте, Истина);
ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект,
ВнутренниеДанные, СвойстваПароля, Новый Структура("ПриИзмененииСвойствСертификата", Истина));
@@ -295,18 +375,21 @@
КонецПроцедуры
&НаКлиенте
-Функция РасшифроватьДанные()
+Процедура РасшифроватьДанные(Оповещение)
- ОшибкаНаКлиенте = Новый Структура;
- ОшибкаНаСервере = Новый Структура;
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("ОшибкаНаКлиенте", Новый Структура);
+ Контекст.Вставить("ОшибкаНаСервере", Новый Структура);
Если Не ЗначениеЗаполнено(СертификатПрограмма) Тогда
- ОшибкаНаКлиенте.Вставить("ОписаниеОшибки",
+ Контекст.ОшибкаНаКлиенте.Вставить("ОписаниеОшибки",
НСтр("ru = 'У выбранного сертификата не указана программа для закрытого ключа.
|Выберите сертификат повторно из полного списка или
|откройте сертификат и укажите программу вручную.'"));
- ПоказатьОшибку(ОшибкаНаКлиенте, ОшибкаНаСервере);
- Возврат Ложь;
+ ПоказатьОшибку(Контекст.ОшибкаНаКлиенте, Контекст.ОшибкаНаСервере);
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь);
+ Возврат;
КонецЕсли;
ВыбранныйСертификат = Новый Структура;
@@ -318,44 +401,99 @@
Если ОписаниеДанных.Свойство("ПередВыполнением")
И ТипЗнч(ОписаниеДанных.ПередВыполнением) = Тип("ОписаниеОповещения") Тогда
- ВыполнитьОбработкуОповещения(ОписаниеДанных.ПередВыполнением, Неопределено);
+ ПараметрыВыполнения = Новый Структура;
+ ПараметрыВыполнения.Вставить("ОписаниеДанных", ОписаниеДанных);
+ ПараметрыВыполнения.Вставить("Оповещение", Новый ОписаниеОповещения(
+ "РасшифроватьДанныеПослеОбработкиПередВыполнением", ЭтотОбъект, Контекст));
+
+ ВыполнитьОбработкуОповещения(ОписаниеДанных.ПередВыполнением, ПараметрыВыполнения);
+ Иначе
+ РасшифроватьДанныеПослеОбработкиПередВыполнением(Новый Структура, Контекст);
КонецЕсли;
- ИдентификаторФормы = Неопределено;
+КонецПроцедуры
+
+// Продолжение процедуры РасшифроватьДанные.
+&НаКлиенте
+Процедура РасшифроватьДанныеПослеОбработкиПередВыполнением(Результат, Контекст) Экспорт
+
+ Если Результат.Свойство("ОписаниеОшибки") Тогда
+ ПоказатьОшибку(Новый Структура("ОписаниеОшибки", Результат.ОписаниеОшибки), Новый Структура);
+ Возврат;
+ КонецЕсли;
+
+ Контекст.Вставить("ИдентификаторФормы", УникальныйИдентификатор);
Если ТипЗнч(ФормаОбъекта) = Тип("УправляемаяФорма") Тогда
- ИдентификаторФормы = ФормаОбъекта.УникальныйИдентификатор;
+ Контекст.ИдентификаторФормы = ФормаОбъекта.УникальныйИдентификатор;
ИначеЕсли ТипЗнч(ФормаОбъекта) = Тип("УникальныйИдентификатор") Тогда
- ИдентификаторФормы = ФормаОбъекта;
+ Контекст.ИдентификаторФормы = ФормаОбъекта;
КонецЕсли;
- Успех = Ложь;
+ ПараметрыВыполнения = Новый Структура;
+ ПараметрыВыполнения.Вставить("ОписаниеДанных", ОписаниеДанных);
+ ПараметрыВыполнения.Вставить("Форма", ЭтотОбъект);
+ ПараметрыВыполнения.Вставить("ИдентификаторФормы", Контекст.ИдентификаторФормы);
+ ПараметрыВыполнения.Вставить("ЗначениеПароля", СвойстваПароля.Значение);
+ Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения);
Если ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().СоздаватьЭлектронныеПодписиНаСервере Тогда
Если ЗначениеЗаполнено(СертификатНаСервереОписаниеОшибки) Тогда
- ОшибкаНаСервере = СертификатНаСервереОписаниеОшибки;
+ Результат = Новый Структура("Ошибка", СертификатНаСервереОписаниеОшибки);
СертификатНаСервереОписаниеОшибки = Новый Структура;
+ РасшифроватьДанныеПослеВыполненияНаСторонеСервера(Результат, Контекст);
Иначе
- // Попытка подписания на сервере.
- Успех = РасшифроватьНаСторонеСервера(ИдентификаторФормы, ОшибкаНаСервере);
- КонецЕсли;
-
- Если Не Успех Тогда
- // Попытка подписания на клиенте.
- Успех = РасшифроватьНаСторонеКлиента(ИдентификаторФормы, ОшибкаНаКлиенте);
+ // Попытка шифрования на сервере.
+ ЭлектроннаяПодписьСлужебныйКлиент.ВыполнитьНаСтороне(Новый ОписаниеОповещения(
+ "РасшифроватьДанныеПослеВыполненияНаСторонеСервера", ЭтотОбъект, Контекст),
+ "Расшифровка", "НаСторонеСервера", Контекст.ПараметрыВыполнения);
КонецЕсли;
Иначе
+ РасшифроватьДанныеПослеВыполненияНаСторонеСервера(Неопределено, Контекст);
+ КонецЕсли;
+
+
+КонецПроцедуры
+
+// Продолжение процедуры РасшифроватьДанные.
+&НаКлиенте
+Процедура РасшифроватьДанныеПослеВыполненияНаСторонеСервера(Результат, Контекст) Экспорт
+
+ Если Результат <> Неопределено Тогда
+ РасшифроватьДанныеПослеВыполнения(Результат);
+ КонецЕсли;
+
+ Если Результат <> Неопределено И Не Результат.Свойство("Ошибка") Тогда
+ РасшифроватьДанныеПослеВыполненияНаСторонеКлиента(Новый Структура, Контекст);
+ Иначе
+ Если Результат <> Неопределено Тогда
+ Контекст.ОшибкаНаСервере = Результат.Ошибка;
+ КонецЕсли;
+
// Попытка подписания на клиенте.
- Успех = РасшифроватьНаСторонеКлиента(ИдентификаторФормы, ОшибкаНаКлиенте, Истина);
+ ЭлектроннаяПодписьСлужебныйКлиент.ВыполнитьНаСтороне(Новый ОписаниеОповещения(
+ "РасшифроватьДанныеПослеВыполненияНаСторонеКлиента", ЭтотОбъект, Контекст),
+ "Расшифровка", "НаСторонеКлиента", Контекст.ПараметрыВыполнения);
КонецЕсли;
- Если Не Успех Тогда
- ПоказатьОшибку(ОшибкаНаКлиенте, ОшибкаНаСервере);
- Возврат Ложь;
+КонецПроцедуры
+
+// Продолжение процедуры РасшифроватьДанные.
+&НаКлиенте
+Процедура РасшифроватьДанныеПослеВыполненияНаСторонеКлиента(Результат, Контекст) Экспорт
+
+ РасшифроватьДанныеПослеВыполнения(Результат);
+
+ Если Результат.Свойство("Ошибка") Тогда
+ Контекст.ОшибкаНаКлиенте = Результат.Ошибка;
+ ПоказатьОшибку(Контекст.ОшибкаНаКлиенте, Контекст.ОшибкаНаСервере);
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь);
+ Возврат;
КонецЕсли;
- Если Не ЗаписатьСертификатыШифрования(ИдентификаторФормы, ОшибкаНаКлиенте) Тогда
- ПоказатьОшибку(ОшибкаНаКлиенте, ОшибкаНаСервере);
- Возврат Ложь;
+ Если Не ЗаписатьСертификатыШифрования(Контекст.ИдентификаторФормы, Контекст.ОшибкаНаКлиенте) Тогда
+ ПоказатьОшибку(Контекст.ОшибкаНаКлиенте, Контекст.ОшибкаНаСервере);
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь);
+ Возврат;
КонецЕсли;
Если Не ЭтоАутентификация
@@ -363,276 +501,29 @@
И (Не ОписаниеДанных.Свойство("СообщитьОЗавершении")
Или ОписаниеДанных.СообщитьОЗавершении <> Ложь) Тогда
- ЭлектроннаяПодписьКлиент.ИнформироватьОРасшифровкеОбъекта(ПредставлениеДанных,
- ОписаниеДанных.ТекущийСписокПредставлений.Количество() > 1);
+ ЭлектроннаяПодписьКлиент.ИнформироватьОРасшифровкеОбъекта(
+ ЭлектроннаяПодписьСлужебныйКлиент.ПолноеПредставлениеДанных(ЭтотОбъект),
+ ТекущийСписокПредставлений.Количество() > 1);
КонецЕсли;
Если ОписаниеДанных.Свойство("КонтекстОперации") Тогда
ОписаниеДанных.КонтекстОперации = ЭтотОбъект;
КонецЕсли;
- Возврат Истина;
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина);
-КонецФункции
+КонецПроцедуры
+// Продолжение процедуры РасшифроватьДанные.
&НаКлиенте
-Функция РасшифроватьНаСторонеКлиента(ИдентификаторФормы, ОшибкаНаКлиенте, ТолькоНаСторонеКлиента = Ложь)
+Процедура РасшифроватьДанныеПослеВыполнения(Результат)
- МенеджерКриптографии = ЭлектроннаяПодписьСлужебныйКлиент.МенеджерКриптографии("Расшифровка",
- ТолькоНаСторонеКлиента, ОшибкаНаКлиенте, СертификатПрограмма);
-
- Если МенеджерКриптографии = Неопределено Тогда
- Возврат Ложь;
+ Если Результат.Свойство("ОперацияНачалась") Тогда
+ ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект, ВнутренниеДанные,
+ СвойстваПароля, Новый Структура("ПриУспешномВыполненииОперации", Истина));
КонецЕсли;
- СертификатКриптографии = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(СертификатОтпечаток,
- Истина, СертификатПрограмма, Ложь, ОшибкаНаКлиенте);
-
- Если СертификатКриптографии = Неопределено Тогда
- Возврат Ложь;
- КонецЕсли;
-
- Успех = Ложь;
- ПарольПринят = Ложь;
- МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = СвойстваПароля.Значение;
-
- Если ОписаниеДанных.Свойство("Данные") Тогда
- Успех = РасшифроватьЭлементДанныхНаСторонеКлиента(ОписаниеДанных, МенеджерКриптографии,
- СертификатКриптографии, ИдентификаторФормы, ПарольПринят, ОшибкаНаКлиенте);
- Иначе
- Для каждого ЭлементДанных Из ОписаниеДанных.НаборДанных Цикл
- ОписаниеДанных.Вставить("ТекущийЭлементНабораДанных", ЭлементДанных);
-
- Если ЭлементДанных.Свойство("РасшифрованныеДанные") Тогда
- Успех = Истина;
- Продолжить;
- КонецЕсли;
-
- Успех = РасшифроватьЭлементДанныхНаСторонеКлиента(ЭлементДанных, МенеджерКриптографии,
- СертификатКриптографии, ИдентификаторФормы, ПарольПринят, ОшибкаНаКлиенте);
-
- Если Не Успех Тогда
- Прервать;
- КонецЕсли;
- КонецЦикла;
- КонецЕсли;
-
- Если ПарольПринят Тогда
- ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект,
- ВнутренниеДанные, СвойстваПароля, Новый Структура("ПриУспешномВыполненииОперации", Истина));
- КонецЕсли;
-
- Возврат Успех;
-
-КонецФункции
-
-&НаКлиенте
-Функция РасшифроватьЭлементДанныхНаСторонеКлиента(ЭлементДанных, МенеджерКриптографии, СертификатКриптографии,
- ИдентификаторФормы, ПарольПринят, ОшибкаНаКлиенте)
-
- Попытка
- ДанныеДляРасшифровки = ДанныеИзОписанияДанных(ЭлементДанных.Данные);
- Исключение
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаКлиенте.Вставить("ОписаниеОшибки",
- НСтр("ru = 'При получении данных для расшифровки возникла ошибка:'")
- + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- Возврат Ложь;
- КонецПопытки;
-
- Попытка
- ДвоичныеРасшифрованныеДанные = МенеджерКриптографии.Расшифровать(ДанныеДляРасшифровки);
- Исключение
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаКлиенте.Вставить("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- ОшибкаНаКлиенте.Вставить("Инструкция", Истина);
- Возврат Ложь;
- КонецПопытки;
-
- ПарольПринят = Истина;
-
- ЭлементДанных.Вставить("РасшифрованныеДанные", ДвоичныеРасшифрованныеДанные);
-
- Если ЭлементДанных.Свойство("РазмещениеРезультата") Тогда
- Если ТипЗнч(ЭлементДанных.РазмещениеРезультата) = Тип("ОписаниеОповещения") Тогда
- Попытка
- ВыполнитьОбработкуОповещения(ЭлементДанных.РазмещениеРезультата, ОписаниеДанных);
- Исключение
- ЭлементДанных.Удалить("РасшифрованныеДанные");
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаКлиенте.Вставить("ОписаниеОшибки", НСтр("ru = 'При записи расшифрованных данных возникла ошибка:'")
- + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- Возврат Ложь;
- КонецПопытки;
- КонецЕсли;
- КонецЕсли;
-
- Возврат Истина;
-
-КонецФункции
-
-&НаКлиенте
-Функция РасшифроватьНаСторонеСервера(ИдентификаторФормы, ОшибкаНаСервере)
-
- Успех = Ложь;
- ПарольПринят = Ложь;
-
- Если ОписаниеДанных.Свойство("Данные") Тогда
- Успех = РасшифроватьЭлементДанныхНаСторонеСервера(ОписаниеДанных, ИдентификаторФормы,
- ПарольПринят, ОшибкаНаСервере);
- Иначе
- Для каждого ЭлементДанных Из ОписаниеДанных.НаборДанных Цикл
- ОписаниеДанных.Вставить("ТекущийЭлементНабораДанных", ЭлементДанных);
-
- Если ЭлементДанных.Свойство("РасшифрованныеДанные") Тогда
- Успех = Истина;
- Продолжить;
- КонецЕсли;
-
- Успех = РасшифроватьЭлементДанныхНаСторонеСервера(ЭлементДанных, ИдентификаторФормы,
- ПарольПринят, ОшибкаНаСервере);
-
- Если Не Успех Тогда
- Прервать;
- КонецЕсли;
- КонецЦикла;
- КонецЕсли;
-
- Если ПарольПринят Тогда
- ЭлектроннаяПодписьСлужебныйКлиент.ОбработатьПарольВФорме(ЭтотОбъект,
- ВнутренниеДанные, СвойстваПароля, Новый Структура("ПриУспешномВыполненииОперации", Истина));
- КонецЕсли;
-
- Возврат Успех;
-
-КонецФункции
-
-&НаКлиенте
-Функция РасшифроватьЭлементДанныхНаСторонеСервера(ЭлементДанных, ИдентификаторФормы, ПарольПринят, ОшибкаНаСервере)
-
- ПараметрыДляСервера = Новый Структура;
- ПараметрыДляСервера.Вставить("ИдентификаторФормы", ИдентификаторФормы);
- ПараметрыДляСервера.Вставить("СертификатПрограмма", СертификатПрограмма);
- ПараметрыДляСервера.Вставить("СертификатОтпечаток", СертификатОтпечаток);
-
- АдресРасшифрованныхДанных = Неопределено;
- ЭлементДанныхДляСервера = Новый Структура;
- ЭлементДанныхДляСервера.Вставить("Данные", ДанныеИзОписанияДанных(ЭлементДанных.Данные, Ложь));
-
- Если Не РасшифроватьЭлементДанныхНаСервере(ЭлементДанныхДляСервера, ПараметрыДляСервера,
- СвойстваПароля.Значение, АдресРасшифрованныхДанных, ПарольПринят, ОшибкаНаСервере) Тогда
- Возврат Ложь;
- КонецЕсли;
-
- ЭлементДанных.Вставить("РасшифрованныеДанные", АдресРасшифрованныхДанных);
-
- Если ЭлементДанных.Свойство("РазмещениеРезультата") Тогда
- Если ТипЗнч(ЭлементДанных.РазмещениеРезультата) = Тип("ОписаниеОповещения") Тогда
- Попытка
- ВыполнитьОбработкуОповещения(ЭлементДанных.РазмещениеРезультата, ОписаниеДанных);
- Исключение
- ЭлементДанных.Удалить("РасшифрованныеДанные");
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаСервере.Вставить("ОписаниеОшибки", НСтр("ru = 'При записи расшифрованных данных возникла ошибка:'")
- + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- Возврат Ложь;
- КонецПопытки;
- КонецЕсли;
- КонецЕсли;
-
- Возврат Истина;
-
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция РасшифроватьЭлементДанныхНаСервере(Знач ЭлементДанныхДляСервера, Знач Параметры,
- Знач ЗначениеПароля, АдресРасшифрованныхДанных, ПарольПринят, ОшибкаНаСервере)
-
- МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии("Расшифровка",
- Ложь, ОшибкаНаСервере, Параметры.СертификатПрограмма);
-
- Если МенеджерКриптографии = Неопределено Тогда
- Возврат Ложь;
- КонецЕсли;
-
- СертификатКриптографии = ЭлектроннаяПодпись.ПолучитьСертификатПоОтпечатку(
- Параметры.СертификатОтпечаток, Истина, Параметры.СертификатПрограмма, Ложь, ОшибкаНаСервере);
-
- Если СертификатКриптографии = Неопределено Тогда
- Возврат Ложь;
- КонецЕсли;
-
- МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = ЗначениеПароля;
- Попытка
- ДанныеДляРасшифровки = ПолучитьИзВременногоХранилища(ЭлементДанныхДляСервера.Данные);
- Исключение
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаСервере.Вставить("ОписаниеОшибки",
- НСтр("ru = 'При получении данных для расшифровки возникла ошибка:'")
- + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- Возврат Ложь;
- КонецПопытки;
-
- Попытка
- ДвоичныеРасшифрованныеДанные = МенеджерКриптографии.Расшифровать(ДанныеДляРасшифровки);
- Исключение
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаСервере.Вставить("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- ОшибкаНаСервере.Вставить("Инструкция", Истина);
- Возврат Ложь;
- КонецПопытки;
-
- ПарольПринят = Истина;
-
- АдресРасшифрованныхДанных = ПоместитьВоВременноеХранилище(ДвоичныеРасшифрованныеДанные, Параметры.ИдентификаторФормы);
-
- Возврат Истина;
-
-КонецФункции
-
-
-&НаКлиенте
-Функция ДанныеИзОписанияДанных(Знач Данные, ДляСтороныКлиента = Истина)
-
- Если ТипЗнч(Данные) = Тип("ОписаниеОповещения") Тогда
- ОбработкаПолученияДанных = Данные;
- Данные = Неопределено;
- ВыполнитьОбработкуОповещения(ОбработкаПолученияДанных, Данные);
- КонецЕсли;
-
- Если ДляСтороныКлиента Тогда
- // Для стороны клиента требуются двоичные данные или путь к файлу.
-
- Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
- Возврат Данные;
- КонецЕсли;
-
- Если ТипЗнч(Данные) = Тип("Строка") Тогда
- Если ЭтоАдресВременногоХранилища(Данные) Тогда
- Возврат ПолучитьИзВременногоХранилища(Данные);
- КонецЕсли;
- Иначе // Путь к файлу
- Возврат Данные;
- КонецЕсли;
- Иначе
- // Для стороны сервера требуется адрес двоичных данных во временном хранилище.
-
- Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
- Возврат ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);
- КонецЕсли;
-
- Если ТипЗнч(Данные) = Тип("Строка") Тогда
- Если ЭтоАдресВременногоХранилища(Данные) Тогда
- Возврат Данные;
- КонецЕсли;
- Иначе // Путь к файлу
- Данные = Новый ДвоичныеДанные(Данные);
- Возврат ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);
- КонецЕсли;
- КонецЕсли;
-
-КонецФункции
-
+КонецПроцедуры
&НаКлиенте
Функция ЗаписатьСертификатыШифрования(ИдентификаторФормы, Ошибка)
diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаВыбора/Help/ru.html b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаВыбора/Help/ru.html
index ac3866df1..b1b667c75 100644
--- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаВыбора/Help/ru.html
+++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаВыбора/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для выбора сертификата электронной подписи.
В списке выводится:
Представление - полное наименование сертификата;
diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form
index d04c1eee1..ca90438da 100644
--- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form
+++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form
@@ -1754,6 +1754,10 @@
Показать данные сертификата7
+
+ ru
+ Показать данные сертификата, которые сохраняются в файле
+
diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Help/ru.html
index edf3dcdc5..5ca33af56 100644
--- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Help/ru.html
+++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Сведения о сертификате электронной подписи.
В верхней части программа автоматически выводит данные о сертификате:
Кому выдан;
diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl
index 3ea5b4162..6ac2d9f78 100644
--- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl
+++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Module.bsl
@@ -140,7 +140,7 @@
&НаКлиенте
Процедура СохранитьДанныеСертификатаВФайл(Команда)
- ЭлектроннаяПодписьКлиент.СохранитьСертификат(АдресСертификата);
+ ЭлектроннаяПодписьСлужебныйКлиент.СохранитьСертификат(, АдресСертификата);
КонецПроцедуры
@@ -220,7 +220,7 @@
Если ЗначениеЗаполнено(ОрганизацияПоУмолчанию)
И Объект.Организация = ОрганизацияПоУмолчанию
- И Не МодульОрганизацииСлужебный.ИспользуетсяНесколькоОрганизация() Тогда
+ И Не МодульОрганизацииСлужебный.ИспользуетсяНесколькоОрганизаций() Тогда
Элементы.ОрганизацияЗаголовок.Видимость = Ложь;
Элементы.Организация.Видимость = Ложь;
diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Form.form b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Form.form
index 0e6ba6027..ac73d945e 100644
--- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Form.form
+++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Form.form
@@ -83,150 +83,106 @@
Предназначена для выбора сертификатов при шифровании данных.
Шифрование данных
С помощью ссылки в верхней части окна можно просмотреть объект, который будет подписан. Ссылка принимает значение наименования объекта.
diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Module.bsl
index 230ecb31f..43f921ee1 100644
--- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Module.bsl
+++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ШифрованиеДанных/Module.bsl
@@ -1,5 +1,5 @@
&НаКлиенте
-Перем ВнутренниеДанные, ОписаниеДанных, ФормаОбъекта, ОбработкаПослеПредупреждения;
+Перем ВнутренниеДанные, ОписаниеДанных, ФормаОбъекта, ОбработкаПослеПредупреждения, ТекущийСписокПредставлений;
#Область ОбработчикиСобытийФормы
@@ -10,13 +10,41 @@
Возврат;
КонецЕсли;
+ Если ЗначениеЗаполнено(Параметры.НаборСертификатов) Тогда
+ УказанНаборСертификатов = Истина;
+ ЗаполнитьСертификатыШифрованияИзНабора(Параметры.НаборСертификатов);
+ Если НаборСертификатов.Количество() = 0 И Параметры.ИзменятьНабор Тогда
+ // Если все сертификаты набора ссылочные и изменение набора разрешено,
+ // то взаимодействие с пользователем обычное, как будто он сам их добавил.
+ УказанНаборСертификатов = Ложь;
+ КонецЕсли;
+ КонецЕсли;
+
ЭлектроннаяПодписьСлужебный.НастроитьФормуПодписанияШифрованияРасшифровки(ЭтотОбъект, Истина);
+ Если УказанНаборСертификатов Тогда
+ Элементы.Сертификат.Видимость = Ложь;
+ Элементы.ГруппаСертификатыШифрования.Заголовок = Элементы.ГруппаУказанныйНаборСертификатов.Заголовок;
+ Элементы.СертификатыШифрования.ТолькоПросмотр = Истина;
+ Элементы.СертификатыШифрованияПодобрать.Доступность = Ложь;
+ ЗаполнитьПрограммуШифрованияНаСервере();
+ КонецЕсли;
+
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
+ Если ВРег(ИмяСобытия) = ВРег("Запись_ПрограммыЭлектроннойПодписиИШифрования")
+ Или ВРег(ИмяСобытия) = ВРег("Запись_ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux")
+ Или ВРег(ИмяСобытия) = ВРег("Запись_СертификатыКлючейЭлектроннойПодписиИШифрования") Тогда
+
+ Если УказанНаборСертификатов Тогда
+ ПодключитьОбработчикОжидания("ПерезаполнитьПрограммуШифрования", 0.1, Истина);
+ Возврат;
+ КонецЕсли;
+ КонецЕсли;
+
Если ВРег(ИмяСобытия) = ВРег("Запись_СертификатыКлючейЭлектроннойПодписиИШифрования") Тогда
ПодключитьОбработчикОжидания("ПриИзмененииСпискаСертификатов", 0.1, Истина);
КонецЕсли;
@@ -31,14 +59,23 @@
Процедура ПредставлениеДанныхНажатие(Элемент, СтандартнаяОбработка)
ЭлектроннаяПодписьСлужебныйКлиент.ПредставлениеДанныхНажатие(ЭтотОбъект,
- Элемент, СтандартнаяОбработка, ОписаниеДанных);
+ Элемент, СтандартнаяОбработка, ТекущийСписокПредставлений);
КонецПроцедуры
&НаКлиенте
Процедура СертификатПриИзменении(Элемент)
- СертификатПриИзмененииНаСервере(ЭлектроннаяПодписьСлужебныйКлиент.ОтпечаткиСертификатовНаКлиенте());
+ ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьОтпечаткиСертификатовНаКлиенте(
+ Новый ОписаниеОповещения("СертификатПриИзмененииЗавершение", ЭтотОбъект));
+
+КонецПроцедуры
+
+// Продолжение процедуры СертификатПриИзменении.
+&НаКлиенте
+Процедура СертификатПриИзмененииЗавершение(ОтпечаткиСертификатовНаКлиенте, Контекст) Экспорт
+
+ СертификатПриИзмененииНаСервере(ОтпечаткиСертификатовНаКлиенте);
КонецПроцедуры
@@ -67,23 +104,30 @@
Сертификат = ВыбранноеЗначение;
- СертификатПриИзмененииНаСервере(ЭлектроннаяПодписьСлужебныйКлиент.ОтпечаткиСертификатовНаКлиенте());
+ ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьОтпечаткиСертификатовНаКлиенте(
+ Новый ОписаниеОповещения("СертификатОбработкаВыбораЗавершение", ЭтотОбъект));
+
+КонецПроцедуры
+
+// Продолжение процедуры СертификатОбработкаВыбора.
+&НаКлиенте
+Процедура СертификатОбработкаВыбораЗавершение(ОтпечаткиСертификатовНаКлиенте, Неопределен) Экспорт
+
+ СертификатПриИзмененииНаСервере(ОтпечаткиСертификатовНаКлиенте);
КонецПроцедуры
&НаКлиенте
Процедура СертификатАвтоПодбор(Элемент, Текст, ДанныеВыбора, Параметры, Ожидание, СтандартнаяОбработка)
- СтандартнаяОбработка = Ложь;
- ДанныеВыбора = СертификатСписокВыбора;
+ ЭлектроннаяПодписьСлужебныйКлиент.СертификатПодборИзСпискаВыбора(ЭтотОбъект, Текст, ДанныеВыбора, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура СертификатОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, Параметры, СтандартнаяОбработка)
- СтандартнаяОбработка = Ложь;
- ДанныеВыбора = СертификатСписокВыбора;
+ ЭлектроннаяПодписьСлужебныйКлиент.СертификатПодборИзСпискаВыбора(ЭтотОбъект, Текст, ДанныеВыбора, СтандартнаяОбработка);
КонецПроцедуры
@@ -124,28 +168,44 @@
&НаКлиенте
Процедура ОткрытьСертификат(Команда)
- ТекущиеДанные = Элементы.СертификатыШифрования.ТекущиеДанные;
+ Если Элементы.ВариантыШифрования.ТекущаяСтраница = Элементы.ПодборИзСправочника Тогда
+ ТекущиеДанные = Элементы.СертификатыШифрования.ТекущиеДанные;
+ Иначе
+ ТекущиеДанные = Элементы.НаборСертификатов.ТекущиеДанные;
+ КонецЕсли;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
- ЭлектроннаяПодписьКлиент.ОткрытьСертификат(ТекущиеДанные.Отпечаток);
+ Если Элементы.ВариантыШифрования.ТекущаяСтраница = Элементы.ПодборИзСправочника Тогда
+ ЭлектроннаяПодписьКлиент.ОткрытьСертификат(ТекущиеДанные.Сертификат);
+ Иначе
+ ЭлектроннаяПодписьКлиент.ОткрытьСертификат(ТекущиеДанные.АдресДанных);
+ КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Зашифровать(Команда)
- Если Не ПроверитьЗаполнение() Тогда
+ Если Не УказанНаборСертификатов
+ И Не ПроверитьЗаполнение() Тогда
+
Возврат;
КонецЕсли;
- Если Не ЗашифроватьДанные() Тогда
- Возврат;
- КонецЕсли;
+ ЗашифроватьДанные(Новый ОписаниеОповещения("ЗашифроватьЗавершение", ЭтотОбъект));
- Закрыть(Истина);
+КонецПроцедуры
+
+// Продолжение процедуры Зашифровать.
+&НаКлиенте
+Процедура ЗашифроватьЗавершение(Результат, Контекст) Экспорт
+
+ Если Результат = Истина Тогда
+ Закрыть(Истина);
+ КонецЕсли;
КонецПроцедуры
@@ -153,45 +213,443 @@
#Область СлужебныеПроцедурыИФункции
-&НаКлиенте
-Функция ПродолжитьОткрытие(ОбщиеВнутренниеДанные, КлиентскиеПараметры) Экспорт
+&НаСервере
+Процедура ЗаполнитьСертификатыШифрованияИзНабора(ОписаниеНабораСертификатов)
- Если Не ЭлектроннаяПодписьСлужебныйКлиент.ПродолжитьОткрытиеНачало(ЭтотОбъект, КлиентскиеПараметры, Истина) Тогда
- Возврат Ложь;
- КонецЕсли;
-
- ОбработкаПродолжения = Новый ОписаниеОповещения("ПродолжитьОткрытие", ЭтотОбъект);
-
- ВнутренниеДанные = ОбщиеВнутренниеДанные;
- ОписаниеДанных = КлиентскиеПараметры.ОписаниеДанных;
- ФормаОбъекта = КлиентскиеПараметры.Форма;
-
- Если БезПодтверждения Тогда
- ОбработкаПослеПредупреждения = Неопределено;
-
- Если ЗашифроватьДанные() Тогда
- ВыполнитьОбработкуОповещения(ОписаниеОповещенияОЗакрытии, Истина);
- Возврат Истина;
- КонецЕсли;
+ Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ОписаниеНабораСертификатов)) Тогда
+ Запрос = Новый Запрос;
+ Запрос.УстановитьПараметр("Ссылка", ОписаниеНабораСертификатов);
+ Запрос.Текст =
+ "ВЫБРАТЬ
+ | ТабличнаяЧастьСертификатыШифрования.Сертификат КАК Сертификат
+ |ИЗ
+ | &Таблица КАК ТабличнаяЧастьСертификатыШифрования
+ |ГДЕ
+ | ТабличнаяЧастьСертификатыШифрования.Ссылка = &Ссылка";
+ Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Таблица",
+ Метаданные.НайтиПоТипу(ТипЗнч(ОписаниеНабораСертификатов)).ПолноеИмя() + ".СертификатыШифрования");
+ МассивСертификатов = Новый Массив;
+ Выборка = Запрос.Выполнить().Выбрать();
+ Пока Выборка.Следующий() Цикл
+ МассивСертификатов.Добавить(Выборка.Сертификат.Получить());
+ КонецЦикла;
Иначе
- Открыть();
+ Если ТипЗнч(ОписаниеНабораСертификатов) = ТипЗнч("Строка") Тогда
+ МассивСертификатов = ПолучитьИзВременногоХранилища(ОписаниеНабораСертификатов);
+ Иначе
+ МассивСертификатов = ОписаниеНабораСертификатов;
+ КонецЕсли;
+ ДобавленныеСертификаты = Новый Соответствие;
+ Для каждого ТекущийСертификат Из МассивСертификатов Цикл
+ Если ТипЗнч(Сертификат) = ТипЗнч("СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования") Тогда
+ Если ДобавленныеСертификаты.Получить(ТекущийСертификат) = Неопределено Тогда
+ ДобавленныеСертификаты.Вставить(ТекущийСертификат, Истина);
+ СертификатыШифрования.Добавить().Сертификат = ТекущийСертификат;
+ КонецЕсли;
+ Иначе
+ СертификатыШифрования.Очистить();
+ Прервать;
+ КонецЕсли;
+ КонецЦикла;
+ Если СертификатыШифрования.Количество() > 0
+ Или МассивСертификатов.Количество() = 0 Тогда
+ Возврат;
+ КонецЕсли;
КонецЕсли;
- Возврат Истина;
+ ТаблицаСертификатов = Новый ТаблицаЗначений;
+ ТаблицаСертификатов.Колонки.Добавить("Ссылка");
+ ТаблицаСертификатов.Колонки.Добавить("Отпечаток");
+ ТаблицаСертификатов.Колонки.Добавить("Представление");
+ ТаблицаСертификатов.Колонки.Добавить("КомуВыдан");
+ ТаблицаСертификатов.Колонки.Добавить("Данные");
+
+ Ссылки = Новый Массив;
+ Отпечатки = Новый Массив;
+ Для каждого ОписаниеСертификата Из МассивСертификатов Цикл
+ НоваяСтрока = ТаблицаСертификатов.Добавить();
+ Если ТипЗнч(ОписаниеСертификата) = Тип("ДвоичныеДанные") Тогда
+ СертификатКриптографии = Новый СертификатКриптографии(ОписаниеСертификата);
+ СтруктураСертификата = ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(СертификатКриптографии);
+ НоваяСтрока.Представление = СтруктураСертификата.Представление;
+ НоваяСтрока.КомуВыдан = СтруктураСертификата.КомуВыдан;
+ НоваяСтрока.Отпечаток = СтруктураСертификата.Отпечаток;
+ НоваяСтрока.Данные = ОписаниеСертификата;
+ Отпечатки.Добавить(СтруктураСертификата.Отпечаток);
+ Иначе
+ НоваяСтрока.Ссылка = ОписаниеСертификата;
+ Ссылки.Добавить(ОписаниеСертификата);
+ КонецЕсли;
+ КонецЦикла;
+
+ Запрос = Новый Запрос;
+ Запрос.УстановитьПараметр("Ссылки", Ссылки);
+ Запрос.УстановитьПараметр("Отпечатки", Отпечатки);
+ Запрос.Текст =
+ "ВЫБРАТЬ
+ | Сертификаты.Ссылка КАК Ссылка,
+ | Сертификаты.Отпечаток,
+ | Сертификаты.Наименование КАК Представление,
+ | Сертификаты.ДанныеСертификата
+ |ИЗ
+ | Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования КАК Сертификаты
+ |ГДЕ
+ | НЕ(НЕ Сертификаты.Ссылка В (&Ссылки)
+ | И НЕ Сертификаты.Отпечаток В (&Отпечатки))";
+ Выборка = Запрос.Выполнить().Выбрать();
+ Пока Выборка.Следующий() Цикл
+ Строки = ТаблицаСертификатов.НайтиСтроки(Новый Структура("Ссылка", Выборка.Ссылка));
+ Для каждого Строка Из Строки Цикл
+ ДанныеСертификата = Выборка.ДанныеСертификата.Получить();
+ Если ТипЗнч(ДанныеСертификата) <> Тип("ДвоичныеДанные") Тогда
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Данные сертификата ""%1"" не найдены в справочнике'"), Выборка.Представление);
+ КонецЕсли;
+ Попытка
+ СертификатКриптографии = Новый СертификатКриптографии(ДанныеСертификата);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Данные сертификата ""%1"" в справочнике не корректны по причине:
+ |%2'"),
+ Выборка.Представление,
+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+ КонецПопытки;
+ СтруктураСертификата= ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(СертификатКриптографии);
+ Строка.Отпечаток = Выборка.Отпечаток;
+ Строка.Представление = Выборка.Представление;
+ Строка.КомуВыдан = СтруктураСертификата.КомуВыдан;
+ Строка.Данные = ДанныеСертификата;
+ КонецЦикла;
+ Строки = ТаблицаСертификатов.НайтиСтроки(Новый Структура("Отпечаток", Выборка.Отпечаток));
+ Для каждого Строка Из Строки Цикл
+ Строка.Ссылка = Выборка.Ссылка;
+ Строка.Представление = Выборка.Представление;
+ КонецЦикла;
+ КонецЦикла;
+
+ // Удаление дублей.
+ ВсеОтпечатки = Новый Соответствие;
+ Индекс = ТаблицаСертификатов.Количество() - 1;
+ Пока Индекс >= 0 Цикл
+ Строка = ТаблицаСертификатов[Индекс];
+ Если ВсеОтпечатки.Получить(Строка.Отпечаток) = Неопределено Тогда
+ ВсеОтпечатки.Вставить(Строка.Отпечаток, Истина);
+ Иначе
+ ТаблицаСертификатов.Удалить(Индекс);
+ КонецЕсли;
+ Индекс = Индекс - 1;
+ КонецЦикла;
+
+ Отбор = Новый Структура("Ссылка", Неопределено);
+ ВсеСертификатыВСправочнике = ТаблицаСертификатов.НайтиСтроки(Отбор).Количество() = 0;
+
+ Если ВсеСертификатыВСправочнике Тогда
+ Для Каждого Строка Из ТаблицаСертификатов Цикл
+ СертификатыШифрования.Добавить().Сертификат = Строка.Ссылка;
+ КонецЦикла;
+ Иначе
+ СвойстваСертификатов = Новый Массив;
+ Для Каждого Строка Из ТаблицаСертификатов Цикл
+ НоваяСтрока = НаборСертификатов.Добавить();
+ ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
+ НоваяСтрока.АдресДанных = ПоместитьВоВременноеХранилище(Строка.Данные, УникальныйИдентификатор);
+ Свойства = Новый Структура;
+ Свойства.Вставить("Отпечаток", Строка.Отпечаток);
+ Свойства.Вставить("Представление", Строка.КомуВыдан);
+ Свойства.Вставить("Сертификат", Строка.Данные);
+ СвойстваСертификатов.Добавить(Свойства);
+ КонецЦикла;
+
+ АдресСвойствСертификатов = ПоместитьВоВременноеХранилище(СвойстваСертификатов, УникальныйИдентификатор);
+ Элементы.ВариантыШифрования.ТекущаяСтраница = Элементы.УказанныйНаборСертификатов;
+ КонецЕсли;
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПерезаполнитьПрограммуШифрования()
+
+ ЗаполнитьПрограммуШифрованияНаСервере();
+ ЗаполнитьПрограммуШифрования();
+
+КонецПроцедуры
+
+&НаСервере
+Процедура ЗаполнитьПрограммуШифрованияНаСервере()
+
+ СертификатПрограмма = Неопределено;
+ ПерваяПрограммаНаСервере = Неопределено;
+
+ Если НаборСертификатов.Количество() > 0 Тогда
+ СертификатАдрес = НаборСертификатов[0].АдресДанных;
+ Иначе
+ Попытка
+ ЗначенияРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
+ СертификатыШифрования[0].Сертификат, "Программа, ДанныеСертификата");
+
+ Если ЗначениеЗаполнено(ЗначенияРеквизитов.Программа) Тогда
+ СертификатПрограмма = ЗначенияРеквизитов.Программа;
+ Возврат;
+ КонецЕсли;
+
+ ДвоичныеДанныеСертификата = ЗначенияРеквизитов.ДанныеСертификата.Получить();
+ СертификатКриптографии = Новый СертификатКриптографии(ДвоичныеДанныеСертификата);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'При получении данных сертификата ""%1""
+ |из информационной базы возникла ошибка:
+ |%2'"),
+ СертификатыШифрования[0].Сертификат,
+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+ КонецПопытки;
+ СертификатАдрес = ПоместитьВоВременноеХранилище(ДвоичныеДанныеСертификата, УникальныйИдентификатор);
+ КонецЕсли;
+
+ ОбщиеНастройки = ЭлектроннаяПодпись.ОбщиеНастройки();
+ Если Не ОбщиеНастройки.СоздаватьЭлектронныеПодписиНаСервере Тогда
+ Возврат;
+ КонецЕсли;
+
+ СертификатКриптографии = Новый СертификатКриптографии(ПолучитьИзВременногоХранилища(СертификатАдрес));
+ ТестовыеДанные = ТестовыеДвоичныеДанные();
+
+ Для Каждого ОписаниеПрограммы Из ОбщиеНастройки.ОписанияПрограмм Цикл
+ МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии("",
+ Ложь, "", ОписаниеПрограммы.Ссылка);
+
+ Если МенеджерКриптографии = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+ Если Не ЗначениеЗаполнено(ПерваяПрограммаНаСервере) Тогда
+ ПерваяПрограммаНаСервере = ОписаниеПрограммы.Ссылка;
+ КонецЕсли;
+ Попытка
+ ЗашифрованныеТестовыеДанные = МенеджерКриптографии.Зашифровать(ТестовыеДанные, СертификатКриптографии);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ КонецПопытки;
+ Если ИнформацияОбОшибке = Неопределено И ЗначениеЗаполнено(ЗашифрованныеТестовыеДанные) Тогда
+ СертификатПрограмма = ОписаниеПрограммы.Ссылка;
+ Прервать;
+ КонецЕсли;
+ КонецЦикла;
+
+КонецПроцедуры
+
+&НаСервереБезКонтекста
+Функция ТестовыеДвоичныеДанные()
+
+ Возврат БиблиотекаКартинок.СертификатКлюча.ПолучитьДвоичныеДанные();
КонецФункции
+&НаКлиенте
+Процедура ЗаполнитьПрограммуШифрования(Оповещение = Неопределено)
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("ПерваяПрограммаНаКлиенте", Неопределено);
+
+ Если ЗначениеЗаполнено(СертификатПрограмма) Тогда
+ ЗаполнитьПрограммуШифрованияПослеЦикла(Контекст);
+ Возврат;
+ КонецЕсли;
+
+ ОписанияПрограмм = ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ОписанияПрограмм;
+
+ Если ОписанияПрограмм = Неопределено Или ОписанияПрограмм.Количество() = 0 Тогда
+ ЗаполнитьПрограммуШифрованияПослеЦикла(Контекст);
+ Возврат;
+ КонецЕсли;
+
+ Контекст.Вставить("ОписанияПрограмм", ОписанияПрограмм);
+
+ СертификатКриптографии = Новый СертификатКриптографии;
+ СертификатКриптографии.НачатьИнициализацию(Новый ОписаниеОповещения(
+ "ЗаполнитьПрограммуШифрованияПослеИнициализацииСертификата", ЭтотОбъект, Контекст),
+ ПолучитьИзВременногоХранилища(СертификатАдрес));
+
+КонецПроцедуры
+
+// Продолжение процедуры ЗаполнитьПрограммуШифрования.
+&НаКлиенте
+Процедура ЗаполнитьПрограммуШифрованияПослеИнициализацииСертификата(СертификатКриптографии, Контекст) Экспорт
+
+ Контекст.Вставить("СертификатШифрования", СертификатКриптографии);
+ Контекст.Вставить("ТестовыеДанные", ТестовыеДвоичныеДанные());
+
+ Контекст.Вставить("Индекс", -1);
+ ЗаполнитьПрограммуШифрованияЦиклНачало(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ЗаполнитьПрограммуШифрования.
+&НаКлиенте
+Процедура ЗаполнитьПрограммуШифрованияЦиклНачало(Контекст)
+
+ Если Контекст.ОписанияПрограмм.Количество() <= Контекст.Индекс + 1 Тогда
+ ЗаполнитьПрограммуШифрованияПослеЦикла(Контекст);
+ Возврат;
+ КонецЕсли;
+ Контекст.Индекс = Контекст.Индекс + 1;
+ Контекст.Вставить("ОписаниеПрограммы", Контекст.ОписанияПрограмм[Контекст.Индекс]);
+
+ ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографии(Новый ОписаниеОповещения(
+ "ЗаполнитьПрограммуШифрованияПослеСозданияМенеджераКриптографии", ЭтотОбъект, Контекст),
+ "Шифрование", Ложь, Контекст.ОписаниеПрограммы.Ссылка);
+
+КонецПроцедуры
+
+// Продолжение процедуры ЗаполнитьПрограммуШифрования.
+&НаКлиенте
+Процедура ЗаполнитьПрограммуШифрованияПослеСозданияМенеджераКриптографии(МенеджерКриптографии, Контекст) Экспорт
+
+ Если ТипЗнч(МенеджерКриптографии) <> Тип("МенеджерКриптографии") Тогда
+ ЗаполнитьПрограммуШифрованияЦиклНачало(Контекст);
+ Возврат;
+ КонецЕсли;
+
+ Если Не ЗначениеЗаполнено(Контекст.ПерваяПрограммаНаКлиенте) Тогда
+ Контекст.ПерваяПрограммаНаКлиенте = Контекст.ОписаниеПрограммы.Ссылка;
+ КонецЕсли;
+
+ МенеджерКриптографии.НачатьШифрование(Новый ОписаниеОповещения(
+ "ЗаполнитьПрограммуШифрованияПослеШифрования", ЭтотОбъект, Контекст,
+ "ЗаполнитьПрограммуШифрованияПослеОшибкиШифрования", ЭтотОбъект),
+ Контекст.ТестовыеДанные, Контекст.СертификатШифрования);
+
+КонецПроцедуры
+
+// Продолжение процедуры ЗаполнитьПрограммуШифрования.
+&НаКлиенте
+Процедура ЗаполнитьПрограммуШифрованияПослеОшибкиШифрования(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
+
+ СтандартнаяОбработка = Ложь;
+ ЗаполнитьПрограммуШифрованияЦиклНачало(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ЗаполнитьПрограммуШифрования.
+&НаКлиенте
+Процедура ЗаполнитьПрограммуШифрованияПослеШифрования(ЗашифрованныеДанные, Контекст) Экспорт
+
+ Если Не ЗначениеЗаполнено(ЗашифрованныеДанные) Тогда
+ ЗаполнитьПрограммуШифрованияЦиклНачало(Контекст);
+ Возврат;
+ КонецЕсли;
+
+ СертификатПрограмма = Контекст.ОписаниеПрограммы.Ссылка;
+ ЗаполнитьПрограммуШифрованияПослеЦикла(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры СоздатьМенеджерКриптографии.
+&НаКлиенте
+Процедура ЗаполнитьПрограммуШифрованияПослеЦикла(Контекст)
+
+ Если Не ЗначениеЗаполнено(СертификатПрограмма) Тогда
+
+ Если ЗначениеЗаполнено(Контекст.ПерваяПрограммаНаКлиенте) Тогда
+ СертификатПрограмма = Контекст.ПерваяПрограммаНаКлиенте;
+
+ ИначеЕсли ЗначениеЗаполнено(ПерваяПрограммаНаСервере) Тогда
+ СертификатПрограмма = ПерваяПрограммаНаСервере;
+ КонецЕсли;
+ КонецЕсли;
+
+ Если Контекст.Оповещение <> Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение);
+ КонецЕсли;
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПродолжитьОткрытие(Оповещение, ОбщиеВнутренниеДанные, КлиентскиеПараметры) Экспорт
+
+ ОписаниеДанных = КлиентскиеПараметры.ОписаниеДанных;
+ ФормаОбъекта = КлиентскиеПараметры.Форма;
+ ТекущийСписокПредставлений = КлиентскиеПараметры.ТекущийСписокПредставлений;
+
+ ВнутренниеДанные = ОбщиеВнутренниеДанные;
+ Контекст = Новый Структура("Оповещение", Оповещение);
+ Оповещение = Новый ОписаниеОповещения("ПродолжитьОткрытие", ЭтотОбъект);
+
+ ЭлектроннаяПодписьСлужебныйКлиент.ПродолжитьОткрытиеНачало(Новый ОписаниеОповещения(
+ "ПродолжитьОткрытиеПослеНачала", ЭтотОбъект, Контекст), ЭтотОбъект, КлиентскиеПараметры, Истина);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПродолжитьОткрытие.
+&НаКлиенте
+Процедура ПродолжитьОткрытиеПослеНачала(Результат, Контекст) Экспорт
+
+ Если Результат <> Истина Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение);
+ Возврат;
+ КонецЕсли;
+
+ Если УказанНаборСертификатов Тогда
+ ЗаполнитьПрограммуШифрования(Новый ОписаниеОповещения(
+ "ПродолжитьОткрытиеПослеЗаполненияПрограммы", ЭтотОбъект, Контекст));
+ Иначе
+ ПродолжитьОткрытиеПослеЗаполненияПрограммы(, Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ПродолжитьОткрытие.
+&НаКлиенте
+Процедура ПродолжитьОткрытиеПослеЗаполненияПрограммы(Результат, Контекст) Экспорт
+
+ Если БезПодтверждения Тогда
+ ОбработкаПослеПредупреждения = Неопределено;
+ ЗашифроватьДанные(Новый ОписаниеОповещения("ПродолжитьОткрытиеПослеШифрованияДанных", ЭтотОбъект, Контекст));
+ Возврат;
+ КонецЕсли;
+
+ Открыть();
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПродолжитьОткрытие.
+&НаКлиенте
+Процедура ПродолжитьОткрытиеПослеШифрованияДанных(Результат, Контекст) Экспорт
+
+ Если Результат = Истина Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина);
+ Иначе
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение);
+ КонецЕсли;
+
+КонецПроцедуры
+
&НаКлиенте
Процедура ВыполнитьШифрование(КлиентскиеПараметры, ОбработкаЗавершения) Экспорт
- ОписаниеДанных = КлиентскиеПараметры.ОписаниеДанных;
- ФормаОбъекта = КлиентскиеПараметры.Форма;
+ ЭлектроннаяПодписьСлужебныйКлиент.ОбновитьФормуПередПовторнымИспользованием(ЭтотОбъект, КлиентскиеПараметры);
+
+ ОписаниеДанных = КлиентскиеПараметры.ОписаниеДанных;
+ ФормаОбъекта = КлиентскиеПараметры.Форма;
+ ТекущийСписокПредставлений = КлиентскиеПараметры.ТекущийСписокПредставлений;
ОбработкаПослеПредупреждения = ОбработкаЗавершения;
ОбработкаПродолжения = Новый ОписаниеОповещения("ВыполнитьШифрование", ЭтотОбъект);
- Если ЗашифроватьДанные() Тогда
- ВыполнитьОбработкуОповещения(ОбработкаЗавершения, Истина);
+ Контекст = Новый Структура("ОбработкаЗавершения", ОбработкаЗавершения);
+ ЗашифроватьДанные(Новый ОписаниеОповещения("ВыполнитьШифрованиеЗавершение", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьШифрование.
+&НаКлиенте
+Процедура ВыполнитьШифрованиеЗавершение(Результат, Контекст) Экспорт
+
+ Если Результат = Истина Тогда
+ ВыполнитьОбработкуОповещения(Контекст.ОбработкаЗавершения, Истина);
КонецЕсли;
КонецПроцедуры
@@ -199,7 +657,16 @@
&НаКлиенте
Процедура ПриИзмененииСпискаСертификатов()
- СертификатПриИзмененииНаСервере(ЭлектроннаяПодписьСлужебныйКлиент.ОтпечаткиСертификатовНаКлиенте(), Истина);
+ ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьОтпечаткиСертификатовНаКлиенте(
+ Новый ОписаниеОповещения("ПриИзмененииСпискаСертификатовЗавершение", ЭтотОбъект));
+
+КонецПроцедуры
+
+// Продолжение процедуры ПриИзмененииСпискаСертификатов.
+&НаКлиенте
+Процедура ПриИзмененииСпискаСертификатовЗавершение(ОтпечаткиСертификатовНаКлиенте, Контекст) Экспорт
+
+ СертификатПриИзмененииНаСервере(ОтпечаткиСертификатовНаКлиенте, Истина);
КонецПроцедуры
@@ -218,80 +685,130 @@
КонецПроцедуры
&НаКлиенте
-Функция ЗашифроватьДанные()
+Процедура ЗашифроватьДанные(Оповещение)
- ОшибкаНаКлиенте = Новый Структура;
- ОшибкаНаСервере = Новый Структура;
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("ОшибкаНаКлиенте", Новый Структура);
+ Контекст.Вставить("ОшибкаНаСервере", Новый Структура);
- Если СертификатДействителенДо < ОбщегоНазначенияКлиент.ДатаСеанса() Тогда
- ОшибкаНаКлиенте.Вставить("ОписаниеОшибки",
- НСтр("ru = 'У выбранного личного сертификата истек срок действия.
- |Выберите другой сертификат.'"));
- ПоказатьОшибку(ОшибкаНаКлиенте, ОшибкаНаСервере);
- Возврат Ложь;
- КонецЕсли;
-
- Если Не ЗначениеЗаполнено(СертификатПрограмма) Тогда
- ОшибкаНаКлиенте.Вставить("ОписаниеОшибки",
- НСтр("ru = 'У выбранного личного сертификата не указана программа для закрытого ключа.
- |Выберите другой сертификат.'"));
- ПоказатьОшибку(ОшибкаНаКлиенте, ОшибкаНаСервере);
- Возврат Ложь;
- КонецЕсли;
-
- ИдентификаторФормы = УникальныйИдентификатор;
- Если ТипЗнч(ФормаОбъекта) = Тип("УправляемаяФорма") Тогда
- ИдентификаторФормы = ФормаОбъекта.УникальныйИдентификатор;
- ИначеЕсли ТипЗнч(ФормаОбъекта) = Тип("УникальныйИдентификатор") Тогда
- ИдентификаторФормы = ФормаОбъекта;
- КонецЕсли;
-
- Ссылки = Новый Массив;
- Ссылки.Добавить(Сертификат);
- Для каждого Строка Из СертификатыШифрования Цикл
- Если ЗначениеЗаполнено(Строка.Сертификат) И Строка.Сертификат <> Сертификат Тогда
- Ссылки.Добавить(Строка.Сертификат);
+ Если ЗначениеЗаполнено(Сертификат) Тогда
+ Если СертификатДействителенДо < ОбщегоНазначенияКлиент.ДатаСеанса() Тогда
+ Контекст.ОшибкаНаКлиенте.Вставить("ОписаниеОшибки",
+ НСтр("ru = 'У выбранного личного сертификата истек срок действия.
+ |Выберите другой сертификат.'"));
+ ПоказатьОшибку(Контекст.ОшибкаНаКлиенте, Контекст.ОшибкаНаСервере);
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь);
+ Возврат;
КонецЕсли;
- КонецЦикла;
+
+ Если Не ЗначениеЗаполнено(СертификатПрограмма) Тогда
+ Контекст.ОшибкаНаКлиенте.Вставить("ОписаниеОшибки",
+ НСтр("ru = 'У выбранного личного сертификата не указана программа для закрытого ключа.
+ |Выберите другой сертификат.'"));
+ ПоказатьОшибку(Контекст.ОшибкаНаКлиенте, Контекст.ОшибкаНаСервере);
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь);
+ Возврат;
+ КонецЕсли;
+ КонецЕсли;
- ОписаниеДанных.Вставить("СертификатыШифрования", СвойстваСертификатов(Ссылки, ИдентификаторФормы));
+ Контекст.Вставить("ИдентификаторФормы", УникальныйИдентификатор);
+ Если ТипЗнч(ФормаОбъекта) = Тип("УправляемаяФорма") Тогда
+ Контекст.ИдентификаторФормы = ФормаОбъекта.УникальныйИдентификатор;
+ ИначеЕсли ТипЗнч(ФормаОбъекта) = Тип("УникальныйИдентификатор") Тогда
+ Контекст.ИдентификаторФормы = ФормаОбъекта;
+ КонецЕсли;
- Успех = Ложь;
+ Если НаборСертификатов.Количество() = 0 Тогда
+ Ссылки = Новый Массив;
+ ИсключитьЛичныйСертификат = Ложь;
+ Если Элементы.Сертификат.Видимость И ЗначениеЗаполнено(Сертификат) Тогда
+ Ссылки.Добавить(Сертификат);
+ ИсключитьЛичныйСертификат = Истина;
+ КонецЕсли;
+ Для каждого Строка Из СертификатыШифрования Цикл
+ Если Не ИсключитьЛичныйСертификат Или Строка.Сертификат <> Сертификат Тогда
+ Ссылки.Добавить(Строка.Сертификат);
+ КонецЕсли;
+ КонецЦикла;
+ ОписаниеДанных.Вставить("СертификатыШифрования",
+ СвойстваСертификатов(Ссылки, Контекст.ИдентификаторФормы));
+ Иначе
+ ОписаниеДанных.Вставить("СертификатыШифрования", АдресСвойствСертификатов);
+ КонецЕсли;
+
+ ПараметрыВыполнения = Новый Структура;
+ ПараметрыВыполнения.Вставить("ОписаниеДанных", ОписаниеДанных);
+ ПараметрыВыполнения.Вставить("Форма", ЭтотОбъект);
+ ПараметрыВыполнения.Вставить("ИдентификаторФормы", Контекст.ИдентификаторФормы);
+ Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения);
Если ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().СоздаватьЭлектронныеПодписиНаСервере Тогда
Если ЗначениеЗаполнено(СертификатНаСервереОписаниеОшибки) Тогда
- ОшибкаНаСервере = СертификатНаСервереОписаниеОшибки;
+ Результат = Новый Структура("Ошибка", СертификатНаСервереОписаниеОшибки);
СертификатНаСервереОписаниеОшибки = Новый Структура;
+ ЗашифроватьДанныеПослеВыполненияНаСторонеСервера(Результат, Контекст);
Иначе
- // Попытка подписания на сервере.
- Успех = ЗашифроватьНаСторонеСервера(ИдентификаторФормы, ОшибкаНаСервере);
- КонецЕсли;
-
- Если Не Успех Тогда
- // Попытка подписания на клиенте.
- Успех = ЗашифроватьНаСторонеКлиента(ИдентификаторФормы, ОшибкаНаКлиенте);
+ // Попытка шифрования на сервере.
+ ЭлектроннаяПодписьСлужебныйКлиент.ВыполнитьНаСтороне(Новый ОписаниеОповещения(
+ "ЗашифроватьДанныеПослеВыполненияНаСторонеСервера", ЭтотОбъект, Контекст),
+ "Шифрование", "НаСторонеСервера", Контекст.ПараметрыВыполнения);
КонецЕсли;
Иначе
+ ЗашифроватьДанныеПослеВыполненияНаСторонеСервера(Неопределено, Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ЗашифроватьДанные.
+&НаКлиенте
+Процедура ЗашифроватьДанныеПослеВыполненияНаСторонеСервера(Результат, Контекст) Экспорт
+
+ Если Результат <> Неопределено Тогда
+ ЗашифроватьДанныеПослеВыполнения(Результат);
+ КонецЕсли;
+
+ Если Результат <> Неопределено И Не Результат.Свойство("Ошибка") Тогда
+ ЗашифроватьДанныеПослеВыполненияНаСторонеКлиента(Новый Структура, Контекст);
+ Иначе
+ Если Результат <> Неопределено Тогда
+ Контекст.ОшибкаНаСервере = Результат.Ошибка;
+ КонецЕсли;
+
// Попытка подписания на клиенте.
- Успех = ЗашифроватьНаСторонеКлиента(ИдентификаторФормы, ОшибкаНаКлиенте, Истина);
+ ЭлектроннаяПодписьСлужебныйКлиент.ВыполнитьНаСтороне(Новый ОписаниеОповещения(
+ "ЗашифроватьДанныеПослеВыполненияНаСторонеКлиента", ЭтотОбъект, Контекст),
+ "Шифрование", "НаСторонеКлиента", Контекст.ПараметрыВыполнения);
КонецЕсли;
- Если Не Успех Тогда
- ПоказатьОшибку(ОшибкаНаКлиенте, ОшибкаНаСервере);
- Возврат Ложь;
+КонецПроцедуры
+
+// Продолжение процедуры ЗашифроватьДанные.
+&НаКлиенте
+Процедура ЗашифроватьДанныеПослеВыполненияНаСторонеКлиента(Результат, Контекст) Экспорт
+
+ ЗашифроватьДанныеПослеВыполнения(Результат);
+
+ Если Результат.Свойство("Ошибка") Тогда
+ Контекст.ОшибкаНаКлиенте = Результат.Ошибка;
+ ПоказатьОшибку(Контекст.ОшибкаНаКлиенте, Контекст.ОшибкаНаСервере);
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь);
+ Возврат;
КонецЕсли;
- Если Не ЗаписатьСертификатыШифрования(ИдентификаторФормы, ОшибкаНаКлиенте) Тогда
- ПоказатьОшибку(ОшибкаНаКлиенте, ОшибкаНаСервере);
- Возврат Ложь;
+ Если Не ЗаписатьСертификатыШифрования(Контекст.ИдентификаторФормы, Контекст.ОшибкаНаКлиенте) Тогда
+ ПоказатьОшибку(Контекст.ОшибкаНаКлиенте, Контекст.ОшибкаНаСервере);
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь);
+ Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(ПредставлениеДанных)
И (Не ОписаниеДанных.Свойство("СообщитьОЗавершении")
Или ОписаниеДанных.СообщитьОЗавершении <> Ложь) Тогда
- ЭлектроннаяПодписьКлиент.ИнформироватьОШифрованииОбъекта(ПредставлениеДанных,
- ОписаниеДанных.ТекущийСписокПредставлений.Количество() > 1);
+ ЭлектроннаяПодписьКлиент.ИнформироватьОШифрованииОбъекта(
+ ЭлектроннаяПодписьСлужебныйКлиент.ПолноеПредставлениеДанных(ЭтотОбъект),
+ ТекущийСписокПредставлений.Количество() > 1);
КонецЕсли;
Если ОписаниеДанных.Свойство("КонтекстОперации") Тогда
@@ -304,279 +821,22 @@
ПараметрыФормы);
КонецЕсли;
- Возврат Истина;
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина);
-КонецФункции
+КонецПроцедуры
+// Продолжение процедуры ЗашифроватьДанные.
&НаКлиенте
-Функция ЗашифроватьНаСторонеКлиента(ИдентификаторФормы, ОшибкаНаКлиенте, ТолькоНаСторонеКлиента = Ложь)
+Процедура ЗашифроватьДанныеПослеВыполнения(Результат)
- МенеджерКриптографии = ЭлектроннаяПодписьСлужебныйКлиент.МенеджерКриптографии("Шифрование",
- ТолькоНаСторонеКлиента, ОшибкаНаКлиенте, СертификатПрограмма);
-
- Если МенеджерКриптографии = Неопределено Тогда
- Возврат Ложь;
+ Если Результат.Свойство("ЕстьОбработанныеЭлементыДанных") Тогда
+ // После начала шифрования изменять сертификаты более недопустимо,
+ // иначе набор данных будет обработан по-разному.
+ Элементы.Сертификат.ТолькоПросмотр = Истина;
+ Элементы.СертификатыШифрования.ТолькоПросмотр = Истина;
КонецЕсли;
- СертификатКриптографии = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(СертификатОтпечаток,
- Истина, СертификатПрограмма, Ложь, ОшибкаНаКлиенте);
-
- Если СертификатКриптографии = Неопределено Тогда
- Возврат Ложь;
- КонецЕсли;
-
- Успех = Ложь;
- ОперацияНачалась = Ложь;
-
- Если ОписаниеДанных.Свойство("Данные") Тогда
- Успех = ЗашифроватьЭлементДанныхНаСторонеКлиента(ОписаниеДанных, МенеджерКриптографии,
- ИдентификаторФормы, ОперацияНачалась, ОшибкаНаКлиенте);
- Иначе
- Для каждого ЭлементДанных Из ОписаниеДанных.НаборДанных Цикл
- ОписаниеДанных.Вставить("ТекущийЭлементНабораДанных", ЭлементДанных);
-
- Если ЭлементДанных.Свойство("СвойстваПодписи") Тогда
- Успех = Истина;
- Продолжить;
- КонецЕсли;
-
- Успех = ЗашифроватьЭлементДанныхНаСторонеКлиента(ЭлементДанных, МенеджерКриптографии,
- ИдентификаторФормы, ОперацияНачалась, ОшибкаНаКлиенте);
-
- Если Не Успех Тогда
- Если ОперацияНачалась Тогда
- ЗаблокироватьИзменениеПараметровОперации();
- КонецЕсли;
- Прервать;
- КонецЕсли;
- КонецЦикла;
- КонецЕсли;
-
- Возврат Успех;
-
-КонецФункции
-
-&НаКлиенте
-Функция ЗашифроватьЭлементДанныхНаСторонеКлиента(ЭлементДанных, МенеджерКриптографии,
- ИдентификаторФормы, ОперацияНачалась, ОшибкаНаКлиенте)
-
- Попытка
- ДанныеДляШифрования = ДанныеИзОписанияДанных(ЭлементДанных.Данные);
- Исключение
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаКлиенте.Вставить("ОписаниеОшибки",
- НСтр("ru = 'При получении данных для шифрования возникла ошибка:'")
- + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- Возврат Ложь;
- КонецПопытки;
-
- Сертификаты = СертификатыКриптографии(ОписаниеДанных.СертификатыШифрования);
-
- Попытка
- ДвоичныеЗашифрованныеДанные = МенеджерКриптографии.Зашифровать(ДанныеДляШифрования, Сертификаты);
- Исключение
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаКлиенте.Вставить("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- ОшибкаНаКлиенте.Вставить("Инструкция", Истина);
- Возврат Ложь;
- КонецПопытки;
-
- ОписаниеОшибки = "";
- Если ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеЗашифрованныеДанные(ДвоичныеЗашифрованныеДанные, ОписаниеОшибки) Тогда
- ОшибкаНаКлиенте.Вставить("ОписаниеОшибки", ОписаниеОшибки);
- Возврат Ложь;
- КонецЕсли;
-
- ОперацияНачалась = Истина;
-
- ЭлементДанных.Вставить("ЗашифрованныеДанные", ДвоичныеЗашифрованныеДанные);
-
- Если ЭлементДанных.Свойство("РазмещениеРезультата") Тогда
- Если ТипЗнч(ЭлементДанных.РазмещениеРезультата) = Тип("ОписаниеОповещения") Тогда
- Попытка
- ВыполнитьОбработкуОповещения(ЭлементДанных.РазмещениеРезультата, ОписаниеДанных);
- Исключение
- ЭлементДанных.Удалить("ЗашифрованныеДанные");
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаКлиенте.Вставить("ОписаниеОшибки", НСтр("ru = 'При записи зашифрованных данных возникла ошибка:'")
- + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- Возврат Ложь;
- КонецПопытки;
- КонецЕсли;
- КонецЕсли;
-
- Возврат Истина;
-
-КонецФункции
-
-&НаКлиенте
-Функция ЗашифроватьНаСторонеСервера(ИдентификаторФормы, ОшибкаНаСервере)
-
- Успех = Ложь;
- ОперацияНачалась = Ложь;
-
- Если ОписаниеДанных.Свойство("Данные") Тогда
- Успех = ЗашифроватьЭлементДанныхНаСторонеСервера(ОписаниеДанных, ИдентификаторФормы,
- ОперацияНачалась, ОшибкаНаСервере);
- Иначе
- Для каждого ЭлементДанных Из ОписаниеДанных.НаборДанных Цикл
- ОписаниеДанных.Вставить("ТекущийЭлементНабораДанных", ЭлементДанных);
-
- Если ЭлементДанных.Свойство("ЗашифрованныеДанные") Тогда
- Успех = Истина;
- Продолжить;
- КонецЕсли;
-
- Успех = ЗашифроватьЭлементДанныхНаСторонеСервера(ЭлементДанных, ИдентификаторФормы,
- ОперацияНачалась, ОшибкаНаСервере);
-
- Если Не Успех Тогда
- Если ОперацияНачалась Тогда
- ЗаблокироватьИзменениеПараметровОперации();
- КонецЕсли;
- Прервать;
- КонецЕсли;
- КонецЦикла;
- КонецЕсли;
-
- Возврат Успех;
-
-КонецФункции
-
-&НаКлиенте
-Функция ЗашифроватьЭлементДанныхНаСторонеСервера(ЭлементДанных, ИдентификаторФормы, ОперацияНачалась, ОшибкаНаСервере)
-
- ПараметрыДляСервера = Новый Структура;
- ПараметрыДляСервера.Вставить("ИдентификаторФормы", ИдентификаторФормы);
- ПараметрыДляСервера.Вставить("СертификатПрограмма", СертификатПрограмма);
- ПараметрыДляСервера.Вставить("СертификатОтпечаток", СертификатОтпечаток);
-
- АдресЗашифрованныхДанных = Неопределено;
- ЭлементДанныхДляСервера = Новый Структура;
- ЭлементДанныхДляСервера.Вставить("Данные", ДанныеИзОписанияДанных(ЭлементДанных.Данные, Ложь));
-
- АдресСертификатов = ОписаниеДанных.СертификатыШифрования;
-
- Если Не ЗашифроватьЭлементДанныхНаСервере(ЭлементДанныхДляСервера, ПараметрыДляСервера,
- АдресСертификатов, АдресЗашифрованныхДанных, ОперацияНачалась, ОшибкаНаСервере) Тогда
- Возврат Ложь;
- КонецЕсли;
-
- ЭлементДанных.Вставить("ЗашифрованныеДанные", АдресЗашифрованныхДанных);
-
- Если ЭлементДанных.Свойство("РазмещениеРезультата") Тогда
- Если ТипЗнч(ЭлементДанных.РазмещениеРезультата) = Тип("ОписаниеОповещения") Тогда
- Попытка
- ВыполнитьОбработкуОповещения(ЭлементДанных.РазмещениеРезультата, ОписаниеДанных);
- Исключение
- ЭлементДанных.Удалить("ЗашифрованныеДанные");
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаСервере.Вставить("ОписаниеОшибки", НСтр("ru = 'При записи зашифрованных данных возникла ошибка:'")
- + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- Возврат Ложь;
- КонецПопытки;
- КонецЕсли;
- КонецЕсли;
-
- Возврат Истина;
-
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ЗашифроватьЭлементДанныхНаСервере(Знач ЭлементДанныхДляСервера, Знач Параметры,
- АдресСертификатов, АдресЗашифрованныхДанных, ОперацияНачалась, ОшибкаНаСервере)
-
- МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии("Шифрование",
- Ложь, ОшибкаНаСервере, Параметры.СертификатПрограмма);
-
- Если МенеджерКриптографии = Неопределено Тогда
- Возврат Ложь;
- КонецЕсли;
-
- СертификатКриптографии = ЭлектроннаяПодпись.ПолучитьСертификатПоОтпечатку(
- Параметры.СертификатОтпечаток, Истина, Параметры.СертификатПрограмма, Ложь, ОшибкаНаСервере);
-
- Если СертификатКриптографии = Неопределено Тогда
- Возврат Ложь;
- КонецЕсли;
-
- Попытка
- ДанныеДляШифрования = ПолучитьИзВременногоХранилища(ЭлементДанныхДляСервера.Данные);
- Исключение
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаСервере.Вставить("ОписаниеОшибки",
- НСтр("ru = 'При получении данных для шифрования возникла ошибка:'")
- + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- Возврат Ложь;
- КонецПопытки;
-
- Сертификаты = СертификатыКриптографии(АдресСертификатов);
-
- Попытка
- ДвоичныеЗашифрованныеДанные = МенеджерКриптографии.Зашифровать(ДанныеДляШифрования, Сертификаты);
- Исключение
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ОшибкаНаСервере.Вставить("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
- ОшибкаНаСервере.Вставить("Инструкция", Истина);
- Возврат Ложь;
- КонецПопытки;
-
- ОписаниеОшибки = "";
- Если ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеЗашифрованныеДанные(ДвоичныеЗашифрованныеДанные, ОписаниеОшибки) Тогда
- ОшибкаНаСервере.Вставить("ОписаниеОшибки", ОписаниеОшибки);
- Возврат Ложь;
- КонецЕсли;
-
- ОперацияНачалась = Истина;
-
- АдресЗашифрованныхДанных = ПоместитьВоВременноеХранилище(ДвоичныеЗашифрованныеДанные, Параметры.ИдентификаторФормы);
-
- Возврат Истина;
-
-КонецФункции
-
-&НаКлиенте
-Функция ДанныеИзОписанияДанных(Знач Данные, ДляСтороныКлиента = Истина)
-
- Если ТипЗнч(Данные) = Тип("ОписаниеОповещения") Тогда
- ОбработкаПолученияДанных = Данные;
- Данные = Неопределено;
- ВыполнитьОбработкуОповещения(ОбработкаПолученияДанных, Данные);
- КонецЕсли;
-
- Если ДляСтороныКлиента Тогда
- // Для стороны клиента требуются двоичные данные или путь к файлу.
-
- Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
- Возврат Данные;
- КонецЕсли;
-
- Если ТипЗнч(Данные) = Тип("Строка") Тогда
- Если ЭтоАдресВременногоХранилища(Данные) Тогда
- Возврат ПолучитьИзВременногоХранилища(Данные);
- КонецЕсли;
- Иначе // Путь к файлу
- Возврат Данные;
- КонецЕсли;
- Иначе
- // Для стороны сервера требуется адрес двоичных данных во временном хранилище.
-
- Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
- Возврат ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);
- КонецЕсли;
-
- Если ТипЗнч(Данные) = Тип("Строка") Тогда
- Если ЭтоАдресВременногоХранилища(Данные) Тогда
- Возврат Данные;
- КонецЕсли;
- Иначе // Путь к файлу
- Данные = Новый ДвоичныеДанные(Данные);
- Возврат ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);
- КонецЕсли;
- КонецЕсли;
-
-КонецФункции
-
+КонецПроцедуры
&НаСервереБезКонтекста
Функция СвойстваСертификатов(Знач Ссылки, Знач ИдентификаторФормы)
@@ -629,22 +889,6 @@
КонецФункции
-&НаКлиентеНаСервереБезКонтекста
-Функция СертификатыКриптографии(Знач СвойстваСертификатов)
-
- Если ТипЗнч(СвойстваСертификатов) = Тип("Строка") Тогда
- СвойстваСертификатов = ПолучитьИзВременногоХранилища(СвойстваСертификатов);
- КонецЕсли;
-
- Сертификаты = Новый Массив;
- Для каждого Свойства Из СвойстваСертификатов Цикл
- Сертификаты.Добавить(Новый СертификатКриптографии(Свойства.Сертификат));
- КонецЦикла;
-
- Возврат Сертификаты;
-
-КонецФункции
-
&НаКлиенте
Функция ЗаписатьСертификатыШифрования(ИдентификаторФормы, Ошибка)
@@ -720,14 +964,4 @@
КонецПроцедуры
-&НаКлиенте
-Процедура ЗаблокироватьИзменениеПараметровОперации()
-
- // После начала шифрования изменять сертификаты более недопустимо,
- // иначе набор данных будет обработан по-разному.
- Элементы.Сертификат.ТолькоПросмотр = Истина;
- Элементы.СертификатыШифрования.ТолькоПросмотр = Истина;
-
-КонецПроцедуры
-
#КонецОбласти
diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Help/ru.html b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Help/ru.html
index 42f3c2a58..76e3246e5 100644
--- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Help/ru.html
+++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для управления сертификатами ключей электронной подписи и шифрования.
Электронная подпись - реквизит любого электронного документа, с помощью которого можно удостовериться в неизменности электронного документа с момента его подписи. Для подписи необходимо иметь сертификат ключа электронной подписи. Сертификат ключа электронной подписи можно получить с помощью криптографических сервисов (провайдеров) или операционной системы.
Контроль неизменности электронного документа осуществляется в результате проверки соответствия электронной подписи документа и сертификата ключа электронной подписи. Если электронная подпись соответствует сертификату, то это является гарантией того, что документ не был изменен кем-либо с момента его подписания. Контроль неизменности электронного документа можно выполнить в любой момент времени.
diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/ИменаРегионовРФПоРекомендациямДляСКПЭП/Template.txt b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/ИменаРегионовРФПоРекомендациямДляСКПЭП/Template.txt
index 0fb635c38..5aa7a2b48 100644
--- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/ИменаРегионовРФПоРекомендациямДляСКПЭП/Template.txt
+++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/ИменаРегионовРФПоРекомендациямДляСКПЭП/Template.txt
@@ -26,7 +26,7 @@
26 Ставропольский край
27 Хабаровский край
28 Амурская область
-29 Архангельская область и Ненецкий автономный округ
+29 Архангельская область
30 Астраханская область
31 Белгородская область
32 Брянская область
@@ -74,13 +74,13 @@
74 Челябинская область
75 Забайкальский край
76 Ярославская область
-77 г. Москва
-78 г. Санкт-Петербург
+77 г.Москва
+78 г.Санкт-Петербург
79 Еврейская автономная область
80
81
82
-83
+83 Ненецкий автономный округ
84
85
86 Ханты-Мансийский автономный округ – Югра
@@ -88,12 +88,12 @@
88
89 Ямало-Ненецкий автономный округ
90
-91
-92
+91 Республика Крым
+92 г.Севастополь
93
94
95
96
97
98
-99 Иные территории, включая, г. Байконур
+99 Иные территории,включая город и космодром Байконур
diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/КомпонентаОбмена/Template.bin b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/КомпонентаОбмена/Template.bin
index 293c067c4..dac3138c7 100644
Binary files a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/КомпонентаОбмена/Template.bin and b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/КомпонентаОбмена/Template.bin differ
diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/СертификатыКлючейЭлектроннойПодписиИШифрования.mdo b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/СертификатыКлючейЭлектроннойПодписиИШифрования.mdo
index a97592017..f610b4b45 100644
--- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/СертификатыКлючейЭлектроннойПодписиИШифрования.mdo
+++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/СертификатыКлючейЭлектроннойПодписиИШифрования.mdo
@@ -747,6 +747,7 @@
ruИмена регионов РФ по рекомендациям для СКПЭП
+ Дата актуальности - 24.03.2014 (http://www.gnivc.ru/inf_provision/classifiers_reference/ssrf/)TextDocument
diff --git a/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/СообщениеSMSПрисоединенныеФайлы.mdo b/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/СообщениеSMSПрисоединенныеФайлы.mdo
index 67ee603b9..f2ece0f9f 100644
--- a/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/СообщениеSMSПрисоединенныеФайлы.mdo
+++ b/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/СообщениеSMSПрисоединенныеФайлы.mdo
@@ -120,7 +120,7 @@
ru
- Пользователь, добавивший файл
+ Пользователь, который добавил файл в список
@@ -138,14 +138,14 @@
ВладелецФайлаru
- Владелец файла
+ РазмещениеDocumentRef.СообщениеSMSru
- Объект-владелец файла
+ Место размещения файла (объект)
@@ -157,7 +157,7 @@
ДатаМодификацииУниверсальнаяru
- Дата модификации универсальная
+ Дата изменения (универсальное время)Date
@@ -165,7 +165,7 @@
ru
- Универсальная дата модификации файла
+ Дата изменения данных файла (универсальное время)
@@ -185,7 +185,7 @@
ru
- Дата создания файла
+ Дата добавления файла в список
@@ -219,14 +219,14 @@
Изменилru
- Изменил
+ ОтредактировалCatalogRef.Пользователиru
- Пользователь, отредактировавший файл последним
+ Последний пользователь, который отредактировал файл
@@ -242,7 +242,7 @@
ИндексКартинкиru
- Индекс картинки
+ Индекс значкаNumber
@@ -252,7 +252,7 @@
ru
- Индекс картинки файла (служебное поле)
+ Индекс значка файла (служебное поле)
@@ -286,14 +286,14 @@
ПодписанЭПru
- Подписан ЭП
+ Подписан электронноBooleanru
- Признак того, что файл подписан с помощью электронной подписи.
+ Признак того, что файл подписан электронно
@@ -324,7 +324,7 @@
Размерru
- Размер
+ Размер (байт)Number
@@ -376,7 +376,7 @@
ru
- Пользователь, редактирующий файл в данный момент
+ Пользователь, который занял файл для редактирования
@@ -440,7 +440,7 @@
ru
- Тип хранения файла (в томе или непосредственно в системе)
+ Тип хранения файла (в томе или в информационной базе)
@@ -459,7 +459,7 @@
ru
- Том для хранения файла
+ Том хранения файлов (когда файл хранится в томе)
@@ -471,7 +471,7 @@
ФайлХранилищеru
- Файл хранилище
+ Временное хранилище файлаValueStorage
diff --git a/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаЭлемента/Form.form
index 903792d9f..2bddcd2a8 100644
--- a/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаЭлемента/Form.form
+++ b/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаЭлемента/Form.form
@@ -203,6 +203,47 @@
true
+
+ КоличествоПопытокОбработкиСообщения
+ 19
+ true
+ true
+
+ true
+
+
+ Объект.КоличествоПопытокОбработкиСообщения
+
+
+ КоличествоПопытокОбработкиСообщенияРасширеннаяПодсказка
+ 21
+ Label
+ true
+ true
+
+ Left
+
+
+
+ КоличествоПопытокОбработкиСообщенияКонтекстноеМеню
+ 20
+ true
+
+ InputField
+ Enter
+ true
+ Left
+ true
+
+ true
+ true
+ true
+ true
+ true
+ true
+ Normal
+
+ ПодробноеПредставлениеОшибки7
diff --git a/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаЭлемента/Form.form
index 3622f65b0..e55d4e448 100644
--- a/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаЭлемента/Form.form
+++ b/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаЭлемента/Form.form
@@ -203,6 +203,47 @@
true
+
+ КоличествоПопытокОбработкиСообщения
+ 19
+ true
+ true
+
+ true
+
+
+ Объект.КоличествоПопытокОбработкиСообщения
+
+
+ КоличествоПопытокОбработкиСообщенияРасширеннаяПодсказка
+ 21
+ Label
+ true
+ true
+
+ Left
+
+
+
+ КоличествоПопытокОбработкиСообщенияКонтекстноеМеню
+ 20
+ true
+
+ InputField
+ Enter
+ true
+ Left
+ true
+
+ true
+ true
+ true
+ true
+ true
+ true
+ Normal
+
+ ПодробноеПредставлениеОшибки7
diff --git a/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Help/ru.html b/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Help/ru.html
index 88806af61..bdcceca18 100644
--- a/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Help/ru.html
+++ b/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Help/ru.html
@@ -7,7 +7,7 @@ P:first-letter {
SUP {
FONT-SIZE: 0.9em; FONT-VARIANT: normal; FONT-WEIGHT: normal; FONT-STYLE: normal; LINE-HEIGHT: normal
}
-
+
Общероссийский классификатор стран мира (ОКСМ)
Общероссийский классификатор стран мира (ОКСМ) входит в состав Единой системы классификации и кодирования технико-экономической и социальной информации (ЕСКК) в Российской Федерации.
ОКСМ гармонизирован с Международным стандартом ИСО 3166-97 «Коды для представления наименований стран», разработанным Международной организацией по стандартизации (ИСО), и Межгосударственным классификатором стран мира MK (ИСО 3166) 004-97.
Предназначен для хранения информации о странах мира, таможенных союзах стран, либо регионах или частях стран. Данные справочника используются, например, при указании страны адреса контактной информации, страны происхождения товара.
Открывается по команде Страны мира раздела Справочники. В списке можно хранить только несколько необходимых для работы стран.
diff --git a/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl b/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl
index 24e037484..97a22e727 100644
--- a/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl
+++ b/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl
@@ -296,45 +296,6 @@
#КонецОбласти
-#Область СлужебныеПроцедурыИФункции
-
-#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
-
-// Приводит код страны к единому виду - строка длиной три символа.
-//
-Функция КодСтраныМира(Знач КодСтраны)
-
- Если ТипЗнч(КодСтраны)=Тип("Число") Тогда
- Возврат Формат(КодСтраны, "ЧЦ=3; ЧН=; ЧВН=; ЧГ=");
- КонецЕсли;
-
- Возврат Прав("000" + КодСтраны, 3);
-КонецФункции
-
-// Возвращает строку в кавычках.
-//
-Функция КонтрольКавычекВСтроке(Знач Строка)
- Возврат """" + СтрЗаменить(Строка, """", """""") + """";
-КонецФункции
-
-#КонецЕсли
-
-// Экранирует символы для использования в функции запроса ПОДОБНО.
-//
-Функция ЭкранироватьСимволыПодобия(Знач Текст, Знач СпецСимвол = "\")
- Результат = Текст;
- СимволыПодобия = "%_[]^" + СпецСимвол;
-
- Для Позиция=1 По СтрДлина(СимволыПодобия) Цикл
- ТекущийСимвол = Сред(СимволыПодобия, Позиция, 1);
- Результат = СтрЗаменить(Результат, ТекущийСимвол, СпецСимвол + ТекущийСимвол);
- КонецЦикла;
-
- Возврат Результат;
-КонецФункции
-
-#КонецОбласти
-
#Область ОбработчикиСобытий
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
@@ -534,3 +495,42 @@
#КонецЕсли
#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
+
+// Приводит код страны к единому виду - строка длиной три символа.
+//
+Функция КодСтраныМира(Знач КодСтраны)
+
+ Если ТипЗнч(КодСтраны)=Тип("Число") Тогда
+ Возврат Формат(КодСтраны, "ЧЦ=3; ЧН=; ЧВН=; ЧГ=");
+ КонецЕсли;
+
+ Возврат Прав("000" + КодСтраны, 3);
+КонецФункции
+
+// Возвращает строку в кавычках.
+//
+Функция КонтрольКавычекВСтроке(Знач Строка)
+ Возврат """" + СтрЗаменить(Строка, """", """""") + """";
+КонецФункции
+
+#КонецЕсли
+
+// Экранирует символы для использования в функции запроса ПОДОБНО.
+//
+Функция ЭкранироватьСимволыПодобия(Знач Текст, Знач СпецСимвол = "\")
+ Результат = Текст;
+ СимволыПодобия = "%_[]^" + СпецСимвол;
+
+ Для Позиция=1 По СтрДлина(СимволыПодобия) Цикл
+ ТекущийСимвол = Сред(СимволыПодобия, Позиция, 1);
+ Результат = СтрЗаменить(Результат, ТекущийСимвол, СпецСимвол + ТекущийСимвол);
+ КонецЦикла;
+
+ Возврат Результат;
+КонецФункции
+
+#КонецОбласти
diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Help/ru.html
index 0212ae81d..610634e0d 100644
--- a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Help/ru.html
+++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Основное назначение сценария - это выполнение синхронизации данных автоматически по заданному расписанию. Сценарий необходим для задания расписания и порядка отправки и получения данных.
Не рекомендуется выполнять только отправку данных или только получение данных, хотя сценарий позволяет это сделать. Рекомендуется выполнять полноценную синхронизацию данных в одном сценарии.
Предназначен для настройки и хранения сценариев синхронизации данных.
Открыть список можно из раздела Синхронизация данных по соответствующей команде. Также можно открыть список сценариев из списка Синхронизация данных по соответствующей команде меню Еще.
В списке выводится:
diff --git a/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ТелефонныйЗвонокПрисоединенныеФайлы.mdo b/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ТелефонныйЗвонокПрисоединенныеФайлы.mdo
index e21d74f7d..2dbd346c4 100644
--- a/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ТелефонныйЗвонокПрисоединенныеФайлы.mdo
+++ b/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ТелефонныйЗвонокПрисоединенныеФайлы.mdo
@@ -78,7 +78,7 @@
Descriptionru
- Имя файла
+ Имя файла (без расширения)ShowError
@@ -120,7 +120,7 @@
ru
- Пользователь, добавивший файл
+ Пользователь, который добавил файл в список
@@ -138,14 +138,14 @@
ВладелецФайлаru
- Владелец файла
+ РазмещениеDocumentRef.ТелефонныйЗвонокru
- Объект-владелец файла
+ Место размещения файла (объект)
@@ -157,7 +157,7 @@
ДатаМодификацииУниверсальнаяru
- Дата модификации универсальная
+ Дата изменения (универсальное время)Date
@@ -165,7 +165,7 @@
ru
- Универсальная дата модификации файла
+ Дата изменения данных файла (универсальное время)
@@ -185,7 +185,7 @@
ru
- Дата создания файла
+ Дата добавления файла в список
@@ -219,14 +219,14 @@
Изменилru
- Изменил
+ ОтредактировалCatalogRef.Пользователиru
- Пользователь, отредактировавший файл последним
+ Последний пользователь, который отредактировал файл
@@ -242,7 +242,7 @@
ИндексКартинкиru
- Индекс картинки
+ Индекс значкаNumber
@@ -252,7 +252,7 @@
ru
- Индекс картинки файла (служебное поле)
+ Индекс значка файла (служебное поле)
@@ -286,14 +286,14 @@
ПодписанЭПru
- Подписан ЭП
+ Подписан электронноBooleanru
- Признак того, что файл подписан с помощью электронной подписи.
+ Признак того, что файл подписан электронно
@@ -325,9 +325,8 @@
Размерru
- Размер
+ Размер (байт)
- Размер файлаNumber
@@ -378,7 +377,7 @@
ru
- Пользователь, редактирующий файл в данный момент
+ Пользователь, который занял файл для редактирования
@@ -442,7 +441,7 @@
ru
- Тип хранения файла (в томе или непосредственно в системе)
+ Тип хранения файла (в томе или в информационной базе)
@@ -461,7 +460,7 @@
ru
- Том для хранения файла
+ Том хранения файлов (когда файл хранится в томе)
@@ -473,7 +472,7 @@
ФайлХранилищеru
- Файл хранилище
+ Временное хранилище файлаValueStorage
diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html
index 05e3c05a4..4114ec267 100644
--- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html
+++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Описание свойств тома хранения файлов.
При создании нового тома автоматически проверяется доступ к указанному в поле Полный путь каталогу, в случае ошибки выводится соответствующее сообщение. Уже созданному тому нельзя поменять пути.
Предназначен для управления томами хранения файлов.
Используется в том случае, если установлен режим хранения файлов В томах на диске. Для этого в разделе Администрирование - Настройки работы с файлами включите флажок Хранить файлы в томах на диске, после этого в разделах Администрирование - Настройки работы с файлами становится доступной команда Тома хранения файлов, по которой открывается список.
В списке выводится:
diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/ТомаХраненияФайлов.mdo b/SSL/src/Catalogs/ТомаХраненияФайлов/ТомаХраненияФайлов.mdo
index 0b52e8350..51bf6017e 100644
--- a/SSL/src/Catalogs/ТомаХраненияФайлов/ТомаХраненияФайлов.mdo
+++ b/SSL/src/Catalogs/ТомаХраненияФайлов/ТомаХраненияФайлов.mdo
@@ -176,7 +176,6 @@
ruПолный путь linux
- Полный путь в LinuxString
@@ -197,7 +196,6 @@
ruПолный путь windows
- Полный путь в UNC форматеString
diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Module.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Module.bsl
index 6e94d6237..b205d2bd7 100644
--- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Module.bsl
+++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ПомощникНастройкиУчетнойЗаписи/Module.bsl
@@ -34,7 +34,26 @@
КлючСохраненияПоложенияОкна = ?(КонтекстныйРежим, "КонтекстныйРежим", "НеконтекстныйРежим");
- СсылкаНовойУчетнойЗаписи = Справочники.УчетныеЗаписиЭлектроннойПочты.ПолучитьСсылку();
+ Если Параметры.Свойство("Ключ") Тогда
+ УчетнаяЗаписьСсылка = Параметры.Ключ;
+ ТекстЗапроса =
+ "ВЫБРАТЬ
+ | УчетныеЗаписиЭлектроннойПочты.АдресЭлектроннойПочты КАК АдресЭлектроннойПочты,
+ | УчетныеЗаписиЭлектроннойПочты.ИмяПользователя КАК ИмяОтправителяПисем,
+ | УчетныеЗаписиЭлектроннойПочты.Наименование КАК НазваниеУчетнойЗаписи
+ |ИЗ
+ | Справочник.УчетныеЗаписиЭлектроннойПочты КАК УчетныеЗаписиЭлектроннойПочты
+ |ГДЕ
+ | УчетныеЗаписиЭлектроннойПочты.Ссылка = &Ссылка";
+ Запрос = Новый Запрос(ТекстЗапроса);
+ Запрос.УстановитьПараметр("Ссылка", Параметры.Ключ);
+ Выборка = Запрос.Выполнить().Выбрать();
+ Если Выборка.Следующий() Тогда
+ ЗаполнитьЗначенияСвойств(ЭтотОбъект, Выборка);
+ КонецЕсли;
+ Иначе
+ СсылкаНовойУчетнойЗаписи = Справочники.УчетныеЗаписиЭлектроннойПочты.ПолучитьСсылку();
+ КонецЕсли;
КонецПроцедуры
@@ -85,10 +104,6 @@
#КонецОбласти
-#Область ОбработчикиСобытийЭлементовТаблицыФормыИмяТаблицыФормы
-
-#КонецОбласти
-
#Область ОбработчикиКомандФормы
&НаКлиенте
@@ -146,7 +161,7 @@
ПоказатьВопрос(ОписаниеОповещения, НСтр("ru = 'Введенные данные не записаны. Закрыть форму?'"), Кнопки,,
КодВозвратаДиалога.Отмена, НСтр("ru = 'Настройка учетной записи'"));
КонецПроцедуры
-
+
&НаКлиенте
Процедура ЗакрытиеФормыПодтверждено(РезультатВопроса, ДополнительныеПараметры = Неопределено) Экспорт
@@ -384,6 +399,10 @@
&НаКлиенте
Процедура ЗаполнитьНастройкиУчетнойЗаписи()
ЗаполнитьЗначенияСвойств(ЭтотОбъект, НастройкиПоУмолчанию(АдресЭлектроннойПочты, ПарольДляПолученияПисем));
+ Если ПустаяСтрока(НазваниеУчетнойЗаписи) Тогда
+ НазваниеУчетнойЗаписи = АдресЭлектроннойПочты;
+ КонецЕсли;
+
НастройкиЗаполнены = Истина;
КонецПроцедуры
@@ -395,8 +414,6 @@
Настройки = Новый Структура;
- Настройки.Вставить("НазваниеУчетнойЗаписи", АдресЭлектроннойПочты);
-
Настройки.Вставить("ИмяПользователяДляПолученияПисем", АдресЭлектроннойПочты);
Настройки.Вставить("ИмяПользователяДляОтправкиПисем", АдресЭлектроннойПочты);
@@ -526,8 +543,12 @@
Если КонтекстныйРежим И ПустаяСтрока(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты, "АдресЭлектроннойПочты")) Тогда
УчетнаяЗапись = Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты.ПолучитьОбъект();
Иначе
- УчетнаяЗапись = Справочники.УчетныеЗаписиЭлектроннойПочты.СоздатьЭлемент();
- УчетнаяЗапись.УстановитьСсылкуНового(СсылкаНовойУчетнойЗаписи);
+ Если УчетнаяЗаписьСсылка.Пустая() Тогда
+ УчетнаяЗапись = Справочники.УчетныеЗаписиЭлектроннойПочты.СоздатьЭлемент();
+ УчетнаяЗапись.УстановитьСсылкуНового(СсылкаНовойУчетнойЗаписи);
+ Иначе
+ УчетнаяЗапись = УчетнаяЗаписьСсылка.ПолучитьОбъект();
+ КонецЕсли;
КонецЕсли;
ЗаполнитьЗначенияСвойств(УчетнаяЗапись, ЭтотОбъект);
УчетнаяЗапись.ИмяПользователя = ИмяОтправителяПисем;
@@ -744,23 +765,23 @@
ВариантНастройки.ПортСервераИсходящейПочты = 465;
ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Истина;
- // Имя сервера с префиксом "smtp.", защищенное соединение, порт 587.
+ // Имя сервера с префиксом "smtp.", защищенное (STARTTLS) соединение, порт 587.
ВариантНастройки = Результат.Добавить();
ВариантНастройки.СерверИсходящейПочты = "smtp." + ИмяСервераВУчетнойЗаписи;
ВариантНастройки.ПортСервераИсходящейПочты = 587;
- ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Истина;
+ ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Ложь;
- // Имя сервера с префиксом "mail.", защищенное соединение, порт 587.
+ // Имя сервера с префиксом "mail.", защищенное (STARTTLS) соединение, порт 587.
ВариантНастройки = Результат.Добавить();
ВариантНастройки.СерверИсходящейПочты = "mail." + ИмяСервераВУчетнойЗаписи;
ВариантНастройки.ПортСервераИсходящейПочты = 587;
- ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Истина;
+ ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Ложь;
- // Имя сервера без префиксов, защищенное соединение, порт 587.
+ // Имя сервера без префиксов, защищенное (STARTTLS) соединение, порт 587.
ВариантНастройки = Результат.Добавить();
ВариантНастройки.СерверИсходящейПочты = ИмяСервераВУчетнойЗаписи;
ВариантНастройки.ПортСервераИсходящейПочты = 587;
- ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Истина;
+ ВариантНастройки.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты = Ложь;
// Имя сервера с префиксом "smtp.", незащищенное соединение.
ВариантНастройки = Результат.Добавить();
diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Form.form
index 7fdf11280..2f5a6e199 100644
--- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Form.form
+++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Form.form
@@ -279,10 +279,10 @@
true
- СписокSearchString
+ СписокСтрокаПоиска31
- СписокSearchStringExtendedTooltip
+ СписокСтрокаПоискаРасширеннаяПодсказка33Labeltrue
@@ -292,7 +292,7 @@
- СписокSearchStringContextMenu
+ СписокСтрокаПоискаКонтекстноеМеню32true
@@ -302,10 +302,10 @@
- СписокViewStatus
+ СписокСостояниеПросмотра34
- СписокViewStatusExtendedTooltip
+ СписокСостояниеПросмотраРасширеннаяПодсказка36Labeltrue
@@ -315,7 +315,7 @@
- СписокViewStatusContextMenu
+ СписокСостояниеПросмотраКонтекстноеМеню35true
@@ -326,10 +326,10 @@
- СписокSearchControl
+ СписокУправлениеПоиском37
- СписокSearchControlExtendedTooltip
+ СписокУправлениеПоискомРасширеннаяПодсказка39Labeltrue
@@ -339,7 +339,7 @@
- СписокSearchControlContextMenu
+ СписокУправлениеПоискомКонтекстноеМеню38true
diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form
index 1df1ee4d5..9312f7fae 100644
--- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form
+++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form
@@ -1804,7 +1804,6 @@
truetrueUseIfNecessary
- Normalautotrue
diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html
index f5115efe5..96f388958 100644
--- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html
+++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Описание свойств учетной записи электронной почты.
При вводе учетной записи большинство параметров проставляется программой по умолчанию в зависимости от настроек почтовых серверов учетной записи электронной почты.
Для системных учетных записей рекомендуется запомнить пароль, для того чтобы программа могла рассылать сообщения от такой учетной записи без участия пользователя. Тем не менее, решение о хранении паролей в информационной базе принимается в каждом случае индивидуально.
diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl
index 947ca003c..fa0c59c2f 100644
--- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl
+++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl
@@ -41,6 +41,11 @@
Объект.ПериодХраненияСообщенийНаСервере = 0;
КонецЕсли;
+ Если Объект.ПротоколВходящейПочты = "IMAP" Тогда
+ Объект.ОставлятьКопииСообщенийНаСервере = Истина;
+ Объект.ПериодХраненияСообщенийНаСервере = 0;
+ КонецЕсли;
+
Если РазрешенияПолучены <> Истина Тогда
Если Не ПроверитьЗаполнение() Тогда
Отказ = Истина;
@@ -77,6 +82,7 @@
&НаКлиенте
Процедура ПротоколПриИзменении(Элемент)
+
Если Объект.ПротоколВходящейПочты = "IMAP" Тогда
Если Лев(Объект.СерверВходящейПочты, 4) = "pop." Тогда
Объект.СерверВходящейПочты = "imap." + Сред(Объект.СерверВходящейПочты, 5);
@@ -91,6 +97,7 @@
КонецЕсли;
УстановитьПортВходящейПочты();
+ УстановитьДоступностьЭлементов();
КонецПроцедуры
&НаКлиенте
@@ -176,6 +183,10 @@
&НаКлиенте
Процедура УстановитьДоступностьЭлементов()
+ ИспользуетсяПротоколPOP = Объект.ПротоколВходящейПочты = "POP";
+ Элементы.POPПередSMTP.Видимость = ИспользуетсяПротоколPOP;
+ Элементы.ОставлятьПисьмаНаСервере.Видимость = ИспользуетсяПротоколPOP;
+
Элементы.НастройкаПериодаХраненияПисем.Доступность = Объект.ОставлятьКопииСообщенийНаСервере;
Элементы.ПериодХраненияСообщенийНаСервере.Доступность = УдалятьПисьмаССервера;
КонецПроцедуры
diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Help/ru.html b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Help/ru.html
index d18d8fe82..9d864d21a 100644
--- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Help/ru.html
+++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для ведения учетных записей электронной почты, которые используются для получения и отправки электронных сообщений.
Список можно открыть соответствующей командой в разделе Администрирование - Органайзер.
В списке выводится:
diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ManagerModule.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ManagerModule.bsl
index 0ea4655c3..fe02b6a77 100644
--- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ManagerModule.bsl
+++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ManagerModule.bsl
@@ -19,6 +19,24 @@
#КонецОбласти
+#КонецЕсли
+
+#Область ОбработчикиСобытий
+
+Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
+
+ Если ВидФормы = "ФормаОбъекта" И Не Параметры.Свойство("ЗначениеКопирования")
+ И (Не Параметры.Свойство("Ключ") Или Не РаботаСПочтовымиСообщениямиВызовСервера.УчетнаяЗаписьНастроена(Параметры.Ключ)) Тогда
+ ВыбраннаяФорма = "ПомощникНастройкиУчетнойЗаписи";
+ СтандартнаяОбработка = Ложь;
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
+
#Область СлужебныеПроцедурыИФункции
// Только для внутреннего использования.
@@ -133,19 +151,12 @@
КонецФункции
-#КонецОбласти
-
-#КонецЕсли
-
-#Область ОбработчикиСобытий
-
-Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
-
- Если ВидФормы = "ФормаОбъекта" И Не Параметры.Свойство("Ключ") И Не Параметры.Свойство("ЗначениеКопирования") Тогда
- ВыбраннаяФорма = "ПомощникНастройкиУчетнойЗаписи";
- СтандартнаяОбработка = Ложь;
- КонецЕсли;
-
-КонецПроцедуры
+Функция УчетнаяЗаписьНастроена(УчетнаяЗапись) Экспорт
+ Параметры = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(УчетнаяЗапись, "АдресЭлектроннойПочты,СерверВходящейПочты,СерверИсходящейПочты");
+ Возврат Не ПустаяСтрока(Параметры.АдресЭлектроннойПочты)
+ И (Не ПустаяСтрока(Параметры.СерверВходящейПочты) Или Не ПустаяСтрока(Параметры.СерверИсходящейПочты));
+КонецФункции
#КонецОбласти
+
+#КонецЕсли
\ No newline at end of file
diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl
index acf220941..ddcf3a733 100644
--- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl
+++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl
@@ -18,6 +18,8 @@
КонецПроцедуры
+#КонецОбласти
+
#Область ОбработчикиСобытий
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
@@ -57,6 +59,4 @@
#КонецОбласти
-#КонецОбласти
-
#КонецЕсли
diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/УчетныеЗаписиЭлектроннойПочты.mdo b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/УчетныеЗаписиЭлектроннойПочты.mdo
index e3abbe508..2d87a12a8 100644
--- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/УчетныеЗаписиЭлектроннойПочты.mdo
+++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/УчетныеЗаписиЭлектроннойПочты.mdo
@@ -589,7 +589,7 @@
УдалитьВПредставлениеВключатьИмяПользователяru
- Удалить в представление включать имя пользователя
+ (не используется) В представление включать имя пользователяBoolean
diff --git a/SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Help/ru.html
index 1dc640b8c..46dd7ca45 100644
--- a/SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Help/ru.html
+++ b/SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Если один или несколько выбранных файлов превышают предельно допустимый размер, то программа выводит предупреждение со списком файлов, которые невозможно загрузить.
Предназначена для настройки кнопки запуска приложения 1С-Бухфон на начальной странице. Настройки хранятся для каждого пользователя с привязкой к рабочему месту.
Открывается по команде Настройка 1С:Бухфон в разделе Администрирование - Общие настройки.
Запуск одной и той же базы под веб-клиентом и тонким клиентом потребует две процедуры настройки.
Предназначена для настройки параметров основного рабочего каталога.
Основной рабочий каталог - папка на Вашем персональном компьютере, в которой временно хранятся файлы, полученные из программы для просмотра или редактирования.
Открывается по ссылке Настройка основного рабочего каталога в персональных настройках программы (вкладка Работа с файлами).
diff --git a/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Module.bsl b/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Module.bsl
index a3527e1af..13ce09b4e 100644
--- a/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Module.bsl
+++ b/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Module.bsl
@@ -20,7 +20,7 @@
&НаКлиенте
Процедура ПриОткрытии(Отказ)
- Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если НЕ ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
ПодключитьОбработчикОжидания("ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами", 0.1, Истина);
Отказ = Истина;
Возврат;
@@ -41,7 +41,7 @@
СтандартнаяОбработка = Ложь;
- Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если НЕ ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
Возврат;
КонецЕсли;
diff --git a/SSL/src/CommonForms/НастройкаОтправкиSMS/Help/ru.html b/SSL/src/CommonForms/НастройкаОтправкиSMS/Help/ru.html
index ad0b29dab..037e38524 100644
--- a/SSL/src/CommonForms/НастройкаОтправкиSMS/Help/ru.html
+++ b/SSL/src/CommonForms/НастройкаОтправкиSMS/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для настройки параметров отправки SMS.
Открывается по команде Настройка отправки SMS раздела Администрирование - Органайзер.
Предназначена для настройки регистрации событий доступа к персональным данным.
Открывается по команде Регистрация событий доступа к персональным данным из раздела Поддержка и обслуживание - Администрирование.
Регистрация почти всех событий (кроме событий доступа к персональным данным в программе выполняются по умолчанию).
diff --git a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form
index 56230a2e7..73f2e35b9 100644
--- a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form
+++ b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form
@@ -853,7 +853,7 @@
165ru
- В обозреватель интернет не установлено расширение для работы с электронной подписью и шифрованием. Невозможно проверить какие из программ установлены.
+ В обозреватель интернет не установлено расширение для работы с электронной подписью и шифрованием. Невозможно проверить какие из программ установлены на компьютере.truetrue
@@ -1978,11 +1978,6 @@
true
-
- ru
- Установка программ, решение типичных проблем.
-
- ButtonИнструкцияРасширеннаяПодсказка272
diff --git a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Help/ru.html b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Help/ru.html
index 389fe2a77..08e66b269 100644
--- a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Help/ru.html
+++ b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Настройка параметров для использования средств электронной подписи и шифрования (криптографии).
Открывается по команде Настройки электронной подписи и шифрования раздела Администрирование - Общие настройки.
Для электронной подписи и шифрования требуется установить специальную стороннюю программу (криптопровайдер).
diff --git a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Module.bsl b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Module.bsl
index 8880c5b31..3469f5a1e 100644
--- a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Module.bsl
+++ b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Module.bsl
@@ -104,18 +104,14 @@
Возврат;
КонецЕсли;
- Если Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаПрограммы Тогда
- ОпределитьУстановленныеПрограммы();
- КонецЕсли;
+ ОпределитьУстановленныеПрограммы();
КонецПроцедуры
&НаКлиенте
Процедура ПриПовторномОткрытии()
- Если Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаПрограммы Тогда
- ОпределитьУстановленныеПрограммы();
- КонецЕсли;
+ ОпределитьУстановленныеПрограммы();
КонецПроцедуры
@@ -127,13 +123,21 @@
Элементы.Сертификаты.Обновить();
Элементы.Сертификаты.ТекущаяСтрока = Источник;
+ Возврат;
КонецЕсли;
// При изменении состава или настроек программ.
Если ВРег(ИмяСобытия) = ВРег("Запись_ПрограммыЭлектроннойПодписиИШифрования")
- Или ВРег(ИмяСобытия) = ВРег("Запись_ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux") Тогда
+ Или ВРег(ИмяСобытия) = ВРег("Запись_ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux")
+ Или ВРег(ИмяСобытия) = ВРег("Запись_ЛичныеНастройкиЭлектроннойПодписиИШифрования") Тогда
- ПодключитьОбработчикОжидания("ПриИзмененияСоставаИлиНастроекПрограмм", 0.1, Истина);
+ ПодключитьОбработчикОжидания("ПриИзмененииСоставаИлиНастроекПрограмм", 0.1, Истина);
+ Возврат;
+ КонецЕсли;
+
+ Если ВРег(ИмяСобытия) = ВРег("Установка_РасширениеРаботыСКриптографией") Тогда
+ ОпределитьУстановленныеПрограммы();
+ Возврат;
КонецЕсли;
// При изменении настроек использования.
@@ -156,8 +160,7 @@
&НаКлиенте
Процедура СтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)
- Если ТекущаяСтраница = Элементы.СтраницаПрограммы И ПроверкаПрограммВыполнялась <> Истина Тогда
- ПроверкаПрограммВыполнялась = Истина;
+ Если ПроверкаПрограммВыполнялась <> Истина Тогда
ОпределитьУстановленныеПрограммы();
КонецЕсли;
@@ -339,8 +342,7 @@
&НаКлиенте
Процедура УстановитьРасширение(Команда)
- ЭлектроннаяПодписьКлиент.УстановитьРасширение(Истина,
- Новый ОписаниеОповещения("ПослеУстановкиРасширения", ЭтотОбъект));
+ ЭлектроннаяПодписьКлиент.УстановитьРасширение(Истина);
КонецПроцедуры
@@ -558,78 +560,130 @@
КонецПроцедуры
-// Продолжение процедуры УстановитьРасширениеНажатие.
-&НаКлиенте
-Процедура ПослеУстановкиРасширения(РасширениеУстановлено, ДополнительныеПараметры) Экспорт
-
- ОпределитьУстановленныеПрограммы();
-
-КонецПроцедуры
-
&НаКлиенте
Процедура ОпределитьУстановленныеПрограммы()
- Если ПодключитьРасширениеРаботыСКриптографией() Тогда
+ Если Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаПрограммы Тогда
+ ПроверкаПрограммВыполнялась = Истина;
+ НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения(
+ "ОпределитьУстановленныеПрограммыПослеПодключенияРасширения", ЭтотОбъект));
+ Иначе
+ ПроверкаПрограммВыполнялась = Неопределено;
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ОпределитьУстановленныеПрограммы.
+&НаКлиенте
+Процедура ОпределитьУстановленныеПрограммыПослеПодключенияРасширения(Подключено, Неопределен) Экспорт
+
+ Если Подключено Тогда
Элементы.СтраницыПрограммыИОбновление.ТекущаяСтраница = Элементы.СтраницаПрограммыОбновление;
КонецЕсли;
#Если ВебКлиент Тогда
- ПодключитьОбработчикОжидания("ОбработчикОжиданияОпределенияУстановленныхПрограмм", 0.3, Истина);
+ ПодключитьОбработчикОжидания("ОбработчикОжиданияОпределитьУстановленныеПрограммы", 0.3, Истина);
#Иначе
- ПодключитьОбработчикОжидания("ОбработчикОжиданияОпределенияУстановленныхПрограмм", 0.1, Истина);
+ ПодключитьОбработчикОжидания("ОбработчикОжиданияОпределитьУстановленныеПрограммы", 0.1, Истина);
#КонецЕсли
КонецПроцедуры
&НаКлиенте
-Процедура ОбработчикОжиданияОпределенияУстановленныхПрограмм()
+Процедура ОбработчикОжиданияДляПродолжения()
- Если Не ПодключитьРасширениеРаботыСКриптографией() Тогда
- Если Не Элементы.ГруппаВебКлиентРасширениеНеУстановлено.Видимость Тогда
- УстановитьВидимостьГруппаВебКлиентРасширениеНеУстановлено(Истина);
- КонецЕсли;
- ПодключитьОбработчикОжидания("ОпределитьУстановленныеПрограммы", 3, Истина);
- Возврат;
- КонецЕсли;
-
- Если Элементы.ГруппаВебКлиентРасширениеНеУстановлено.Видимость Тогда
- УстановитьВидимостьГруппаВебКлиентРасширениеНеУстановлено(Ложь);
- КонецЕсли;
-
- Для каждого Строка Из Программы Цикл
- ПроверитьУстановкуПрограммыНаКлиенте(Строка);
- КонецЦикла;
-
- Элементы.СтраницыПрограммыИОбновление.ТекущаяСтраница = Элементы.СтраницаПрограммыСписок;
- ТекущийЭлемент = Элементы.Программы;
-
-КонецПроцедуры
-
-&НаСервере
-Процедура УстановитьВидимостьГруппаВебКлиентРасширениеНеУстановлено(Знач ВидимостьЭлемента)
-
- Элементы.ГруппаВебКлиентРасширениеНеУстановлено.Видимость = ВидимостьЭлемента;
+ Возврат;
КонецПроцедуры
&НаКлиенте
-Процедура ПроверитьУстановкуПрограммыНаКлиенте(ОписаниеПрограммы)
+Процедура ОбработчикОжиданияОпределитьУстановленныеПрограммы()
+
+ НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения(
+ "ОбработчикОжиданияОпределитьУстановленныеПрограммыПослеПодключенияРасширения", ЭтотОбъект));
+
+ #Если ВебКлиент Тогда
+ ПодключитьОбработчикОжидания("ОбработчикОжиданияДляПродолжения", 0.3, Истина);
+ #Иначе
+ ПодключитьОбработчикОжидания("ОбработчикОжиданияДляПродолжения", 0.1, Истина);
+ #КонецЕсли
+
+КонецПроцедуры
+
+// Продолжение процедуры ОбработчикОжиданияОпределитьУстановленныеПрограммы.
+&НаКлиенте
+Процедура ОбработчикОжиданияОпределитьУстановленныеПрограммыПослеПодключенияРасширения(Подключено, Неопределен) Экспорт
+
+ Если Не Подключено Тогда
+ Если Не Элементы.ГруппаВебКлиентРасширениеНеУстановлено.Видимость Тогда
+ УстановитьВидимостьГруппаВебКлиентРасширениеНеУстановлено(Истина);
+ КонецЕсли;
+ ПодключитьОбработчикОжидания("ОбработчикОжиданияОпределитьУстановленныеПрограммы", 3, Истина);
+ Возврат;
+ КонецЕсли;
+
+ Если Элементы.ГруппаВебКлиентРасширениеНеУстановлено.Видимость Тогда
+ УстановитьВидимостьГруппаВебКлиентРасширениеНеУстановлено(Ложь);
+ КонецЕсли;
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("Индекс", -1);
+
+ ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклНачало(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ОбработчикОжиданияОпределитьУстановленныеПрограммы.
+&НаКлиенте
+Процедура ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклНачало(Контекст)
+
+ Если Программы.Количество() <= Контекст.Индекс + 1 Тогда
+ // После цикла.
+ Элементы.СтраницыПрограммыИОбновление.ТекущаяСтраница = Элементы.СтраницаПрограммыСписок;
+ ТекущийЭлемент = Элементы.Программы;
+ Возврат;
+ КонецЕсли;
+ Контекст.Индекс = Контекст.Индекс + 1;
+ ОписаниеПрограммы = Программы.Получить(Контекст.Индекс);
+
+ Контекст.Вставить("ОписаниеПрограммы", ОписаниеПрограммы);
Если ОписаниеПрограммы.ПометкаУдаления Тогда
ОбновитьЗначение(ОписаниеПрограммы.РезультатПроверки, "");
ОбновитьЗначение(ОписаниеПрограммы.Установлена, "");
+ ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклНачало(Контекст);
Возврат;
КонецЕсли;
- ОписаниеОшибки = "";
- Ошибки = Новый Массив;
+ ОписанияПрограмм = Новый Массив;
+ ОписанияПрограмм.Добавить(Контекст.ОписаниеПрограммы);
- Менеджер = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографии(ОписаниеПрограммы.Ссылка,
- ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент(), Ошибки, Ложь);
+ ПараметрыВыполнения = Новый Структура;
+ ПараметрыВыполнения.Вставить("ОписанияПрограмм", ОписанияПрограмм);
+ ПараметрыВыполнения.Вставить("Индекс", -1);
+ ПараметрыВыполнения.Вставить("ПоказатьОшибку", Неопределено);
+ ПараметрыВыполнения.Вставить("СвойстваОшибки", Новый Структура("Ошибки", Новый Массив));
+ ПараметрыВыполнения.Вставить("ЭтоLinux", ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент());
+ ПараметрыВыполнения.Вставить("Менеджер", Неопределено);
+ ПараметрыВыполнения.Вставить("Оповещение", Новый ОписаниеОповещения(
+ "ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклПродолжение", ЭтотОбъект, Контекст));
+
+ Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения);
+ ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографииЦиклНачало(ПараметрыВыполнения);
+
+КонецПроцедуры
+
+// Продолжение процедуры ОбработчикОжиданияОпределитьУстановленныеПрограммы.
+&НаКлиенте
+Процедура ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклПродолжение(Менеджер, Контекст) Экспорт
+
+ ОписаниеПрограммы = Контекст.ОписаниеПрограммы;
+ Ошибки = Контекст.ПараметрыВыполнения.СвойстваОшибки.Ошибки;
Если Менеджер <> Неопределено Тогда
ОбновитьЗначение(ОписаниеПрограммы.РезультатПроверки, НСтр("ru = 'Установлена на компьютере.'"));
ОбновитьЗначение(ОписаниеПрограммы.Установлена, Истина);
+ ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклНачало(Контекст);
Возврат;
КонецЕсли;
@@ -649,10 +703,19 @@
ОбновитьЗначение(ОписаниеПрограммы.Установлена, Ложь);
КонецЕсли;
+ ОбработчикОжиданияОпределитьУстановленныеПрограммыЦиклНачало(Контекст);
+
+КонецПроцедуры
+
+&НаСервере
+Процедура УстановитьВидимостьГруппаВебКлиентРасширениеНеУстановлено(Знач ВидимостьЭлемента)
+
+ Элементы.ГруппаВебКлиентРасширениеНеУстановлено.Видимость = ВидимостьЭлемента;
+
КонецПроцедуры
&НаКлиенте
-Процедура ПриИзмененияСоставаИлиНастроекПрограмм()
+Процедура ПриИзмененииСоставаИлиНастроекПрограмм()
ЗаполнитьПрограммыИНастройки();
diff --git a/SSL/src/CommonForms/ОбменыДанными/Form.form b/SSL/src/CommonForms/ОбменыДанными/Form.form
index a3fa6ca32..3fa07a0b0 100644
--- a/SSL/src/CommonForms/ОбменыДанными/Form.form
+++ b/SSL/src/CommonForms/ОбменыДанными/Form.form
@@ -2543,10 +2543,6 @@
truetrue
-
- true
- Role.НастройкаСинхронизацииДанных
- false
@@ -5114,10 +5110,7 @@
Состав отправляемых данныхStdPicture.InputFieldOpen
@@ -5142,14 +5135,7 @@
Удалить текущую настройку синхронизации данныхStdPicture.Delete
diff --git a/SSL/src/CommonForms/ОбменыДанными/Help/ru.html b/SSL/src/CommonForms/ОбменыДанными/Help/ru.html
index cf1c2fe04..ce8c41671 100644
--- a/SSL/src/CommonForms/ОбменыДанными/Help/ru.html
+++ b/SSL/src/CommonForms/ОбменыДанными/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначено для настройки синхронизации данных и хранения существующих настроек синхронизации данных.
Окно Синхронизация данных можно найти на Рабочем столе программы или открыть в разделе Администрирование - Настройки синхронизации данных по соответствующей команде. Если настроек синхронизации еще нет или существует только одна настройка, то окно приобретает вид панели. В этом случае меню Еще скрыто и все необходимые команды и поля выведены на панель. Окно принимает вид списка, если настроек синхронизации две и более.
В окне выводится:
diff --git a/SSL/src/CommonForms/ОбменыДанными/Module.bsl b/SSL/src/CommonForms/ОбменыДанными/Module.bsl
index c30ae1a86..1bf96afc4 100644
--- a/SSL/src/CommonForms/ОбменыДанными/Module.bsl
+++ b/SSL/src/CommonForms/ОбменыДанными/Module.bsl
@@ -12,6 +12,18 @@
Возврат;
КонецЕсли;
+ Если Не Пользователи.РолиДоступны("НастройкаСинхронизацииДанных") Тогда
+ Элементы.СписокСостоянияУзловИзменитьУзелИнформационнойБазы.Видимость = Ложь;
+ КонецЕсли;
+
+ Если Не Пользователи.РолиДоступны("АдминистраторСистемы") Тогда
+ Элементы.СоставОтправляемыхДанных.Видимость = Ложь;
+ Элементы.СписокСостоянияУзловСоставОтправляемыхДанных.Видимость = Ложь;
+ Элементы.СписокСостоянияУзловКонтекстноеМенюСоставОтправляемыхДанных.Видимость = Ложь;
+ Элементы.УдалитьНастройкуСинхронизации.Видимость = Ложь;
+ Элементы.СписокСостоянияУзловУдалитьНастройкуСинхронизации.Видимость = Ложь;
+ КонецЕсли;
+
СписокПлановОбмена = ОбменДаннымиПовтИсп.СписокПлановОбменаБСП();
Если СписокПлановОбмена.Количество() = 0 Тогда
ТекстСообщения = НСтр("ru = 'Возможность настройки синхронизации данных не предусмотрена.'");
@@ -694,12 +706,7 @@
ИмяПланаОбмена = Элемент.Значение;
МенеджерПланаОбмена = ПланыОбмена[ИмяПланаОбмена];
- Если ОбщегоНазначения.ПодсистемаСуществует("ОбменДаннымиXDTO") Тогда
- МодульОбменДаннымиXDTOПовтИсп = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиXDTOПовтИсп");
- ЭтоПланОбменаXDTO = МодульОбменДаннымиXDTOПовтИсп.ЭтоПланОбменаXDTO(ИмяПланаОбмена);
- Иначе
- ЭтоПланОбменаXDTO = Ложь;
- КонецЕсли;
+ ЭтоПланОбменаXDTO = ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(ИмяПланаОбмена);
Если Метаданные.ПланыОбмена[ИмяПланаОбмена].РаспределеннаяИнформационнаяБаза Тогда
РодительскаяГруппа = Элементы.ПодменюРИБ;
diff --git a/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Form.form b/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Form.form
index 7f9381656..e81a87ff8 100644
--- a/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Form.form
+++ b/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Form.form
@@ -622,10 +622,6 @@
truetrue
-
- true
- Role.ПолныеПрава
- Button
diff --git a/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Help/ru.html b/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Help/ru.html
index 13820ac56..5fa4f5869 100644
--- a/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Help/ru.html
+++ b/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Описание обновлений включает в себя список изменений в последней версии программы, а также историю изменений в предыдущих версиях.
Выводится однократно после завершения обновления на новую версию. Описание обновлений можно просмотреть позднее по команде Описание изменений программы в панели Информация в разделе Главное.
Предназначена для отправки электронного сообщения.
Предусмотрены кнопки Написать письмо или Отправить для отправки электронных сообщений из различных объектов программы, например, из окна пользователя программы и т.п.
Написание электронного сообщения
diff --git a/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl b/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl
index 4cdfb7e3d..4f159409f 100644
--- a/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl
+++ b/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl
@@ -226,7 +226,7 @@
Процедура ВложенияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
Отказ = Истина;
- ДобавлениеФайлаКВложениям();
+ ДобавитьФайлВоВложения();
КонецПроцедуры
@@ -349,7 +349,7 @@
&НаКлиенте
Процедура ПриложитьФайлВыполнить()
- ДобавлениеФайлаКВложениям();
+ ДобавитьФайлВоВложения();
КонецПроцедуры
@@ -457,22 +457,21 @@
КонецФункции
&НаКлиенте
-Процедура ДобавлениеФайлаКВложениям()
-
- Перем ПомещенныеФайлы;
-
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
- ПомещенныеФайлы = Новый Массив;
- Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
- Диалог.МножественныйВыбор = Истина;
- Если ПоместитьФайлы(, ПомещенныеФайлы, Диалог, Истина, ) Тогда
- ДобавитьФайлыВСписок(ПомещенныеФайлы);
- ОбновитьПредставлениеВложений();
- КонецЕсли;
- Иначе
- ПоказатьПредупреждение(,НСтр("ru = 'В Веб-клиенте без установленного расширения работы с файлами добавление файлов не поддерживается.'"));
+Процедура ДобавитьФайлВоВложения()
+ ПараметрыДиалога = Новый Структура;
+ ПараметрыДиалога.Вставить("Режим", РежимДиалогаВыбораФайла.Открытие);
+ ПараметрыДиалога.Вставить("МножественныйВыбор", Истина);
+ ОписаниеОповещения = Новый ОписаниеОповещения("ДобавитьФайлВоВложенияПриПомещенииФайлов", ЭтотОбъект);
+ СтандартныеПодсистемыКлиент.ПоказатьПомещениеФайла(ОписаниеОповещения, УникальныйИдентификатор, "", ПараметрыДиалога);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ДобавитьФайлВоВложенияПриПомещенииФайлов(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт
+ Если ПомещенныеФайлы = Неопределено Или ПомещенныеФайлы.Количество() = 0 Тогда
+ Возврат;
КонецЕсли;
-
+ ДобавитьФайлыВСписок(ПомещенныеФайлы);
+ ОбновитьПредставлениеВложений();
КонецПроцедуры
&НаСервере
@@ -652,23 +651,12 @@
Возврат;
КонецЕсли;
- Попытка
- ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма);
- Исключение
- ОбщегоНазначенияКлиентСервер.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
- Возврат;
- КонецПопытки;
-
+ ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма);
СохранитьАдресОтвета(АдресОтвета);
+ Состояние(НСтр("ru = 'Сообщение успешно отправлено'"));
- ОписаниеОповещения = Новый ОписаниеОповещения("ПродолжитьОтправкуПисьмаСПаролемЗавершение", ЭтотОбъект);
- ПоказатьПредупреждение(ОписаниеОповещения, НСтр("ru = 'Сообщение успешно отправлено'"));
-
-КонецПроцедуры
-
-&НаКлиенте
-Процедура ПродолжитьОтправкуПисьмаСПаролемЗавершение(ДополнительныеПараметры) Экспорт
Закрыть();
+
КонецПроцедуры
&НаКлиенте
diff --git a/SSL/src/CommonForms/ОтправкаТабличныхДокументовПоПочте/Help/ru.html b/SSL/src/CommonForms/ОтправкаТабличныхДокументовПоПочте/Help/ru.html
index 6442854d2..8718d890d 100644
--- a/SSL/src/CommonForms/ОтправкаТабличныхДокументовПоПочте/Help/ru.html
+++ b/SSL/src/CommonForms/ОтправкаТабличныхДокументовПоПочте/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Выводит варианты отчетов, размещенные в разделе или группах раздела программы.
Открыть панель отчетов можно по соответствующей команде из раздела программы.
Панель отчетов позволяет работать с отчетами из одного места и группирует варианты отчетов по группам командного интерфейса. Работа с панелью отчетов ведется в двух режимах:
diff --git a/SSL/src/CommonForms/ПанельОтчетов/Module.bsl b/SSL/src/CommonForms/ПанельОтчетов/Module.bsl
index 5f0cb2554..183bf6c59 100644
--- a/SSL/src/CommonForms/ПанельОтчетов/Module.bsl
+++ b/SSL/src/CommonForms/ПанельОтчетов/Module.bsl
@@ -118,10 +118,13 @@
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("КлючВарианта", Вариант.КлючВарианта);
ПараметрыОткрытия.Вставить("Раздел", ТекущийРазделСсылка);
- ПараметрыОткрытия.Вставить("Подсистема", Вариант.Подсистема);
- Найденные = ПодсистемыПрограммы.НайтиСтроки(Новый Структура("Ссылка", Вариант.Подсистема));
- ПараметрыОткрытия.Вставить("ПодсистемаПредставление", Найденные[0].Представление);
+ Соседи = ДобавленныеВарианты.НайтиСтроки(Новый Структура("Подсистема", Вариант.Подсистема));
+ Если Соседи.Количество() > 1 Тогда
+ Найденные = ПодсистемыПрограммы.НайтиСтроки(Новый Структура("Ссылка", Вариант.Подсистема));
+ ПараметрыОткрытия.Вставить("Подсистема", Вариант.Подсистема);
+ ПараметрыОткрытия.Вставить("ПодсистемаПредставление", Найденные[0].Представление);
+ КонецЕсли;
// Открытие
Если Вариант.Дополнительный Тогда
@@ -1182,7 +1185,7 @@
ПараметрыГруппы.Количество = ПараметрыГруппы.Варианты.Количество();
КонецЕсли;
- Если ПараметрыГруппы.Количество = 0 Тогда
+ Если ПараметрыГруппы.Количество = 0 И Не (РежимНастройки И ИмяГруппы = "СГруппой") Тогда
Продолжить;
КонецЕсли;
@@ -1333,7 +1336,7 @@
ПараметрыГруппы = ПараметрыЗаполнения[ПараметрыЗаполнения.ИмяГруппы];
Варианты = ПараметрыГруппы.Варианты;
КоличествоВариантов = ПараметрыГруппы.Количество;
- Если КоличествоВариантов = 0 Тогда
+ Если КоличествоВариантов = 0 И Не (РежимНастройки И ПараметрыЗаполнения.ИмяГруппы = "СГруппой") Тогда
Возврат;
КонецЕсли;
@@ -1706,7 +1709,9 @@
Функция ДобавитьГруппуПодсистемы(ПараметрыЗаполнения, СтрокаПорядкаВывода, ВГруппу)
Подсистема = СтрокаПорядкаВывода.Подсистема;
СтрокаДерева = СтрокаПорядкаВывода.СтрокаДерева;
- Если СтрокаДерева.КоличествоВариантов = 0 И СтрокаДерева.ВсегоВложенныхВариантов = 0 Тогда
+ Если СтрокаДерева.КоличествоВариантов = 0
+ И СтрокаДерева.ВсегоВложенныхВариантов = 0
+ И Не (РежимНастройки И ПараметрыЗаполнения.ИмяГруппы = "СГруппой") Тогда
Возврат ВГруппу;
КонецЕсли;
ПодсистемаПредставление = Подсистема.Представление;
diff --git a/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Help/ru.html b/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Help/ru.html
index 6b6ae1cd8..a936bfd27 100644
--- a/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Help/ru.html
+++ b/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для указания параметров доступа к кластеру серверов.
Открывается из окна Блокировка работы пользователей по ссылке Включить возможность управления блокировкой регламентных заданий.
Параметры необходимы для выполнения различных административных действий с клиент-серверной информационной базой:
diff --git a/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Module.bsl b/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Module.bsl
index b12a24823..004cd7c25 100644
--- a/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Module.bsl
+++ b/SSL/src/CommonForms/ПараметрыАдминистрированияПрограммы/Module.bsl
@@ -20,9 +20,7 @@
ПараметрыАдминистрирования = Параметры.ПараметрыАдминистрирования;
КонецЕсли;
- Если Не ТребуетсяВводПараметровАдминистрирования() Тогда
- Возврат;
- КонецЕсли;
+ ПроверитьНеобходимостьВводаПараметровАдминистрирования();
Если ДоступноИспользованиеРазделенныхДанных Тогда
@@ -68,6 +66,11 @@
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Не ТребуетсяВводПараметровАдминистрирования Тогда
+ Попытка
+ ПроверитьПараметрыАдминистрирования(ПараметрыАдминистрирования);
+ Исключение
+ Возврат; // Обработка не требуется. Форма будет открыта в штатном режиме.
+ КонецПопытки;
Закрыть(ПараметрыАдминистрирования);
КонецЕсли;
КонецПроцедуры
@@ -223,7 +226,7 @@
КонецПроцедуры
&НаСервере
-Функция ТребуетсяВводПараметровАдминистрирования()
+Процедура ПроверитьНеобходимостьВводаПараметровАдминистрирования()
ТребуетсяВводПараметровАдминистрирования = Истина;
@@ -264,9 +267,7 @@
КонецЕсли;
- Возврат ТребуетсяВводПараметровАдминистрирования;
-
-КонецФункции
+КонецПроцедуры
&НаКлиенте
Процедура ПроверитьПараметрыАдминистрированияФайловойБазы()
@@ -274,7 +275,10 @@
Если Параметры.ЗапрашиватьПараметрыАдминистрированияИБ Тогда
// В базовых версиях проверку подключения не осуществляем.
- Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда
+ ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента();
+
+ Если ПараметрыРаботыКлиента.ЭтоБазоваяВерсияКонфигурации
+ Или ПараметрыРаботыКлиента.ЭтоУчебнаяПлатформа Тогда
Возврат;
КонецЕсли;
diff --git a/SSL/src/CommonForms/ПараметрыПроксиСервера/Help/ru.html b/SSL/src/CommonForms/ПараметрыПроксиСервера/Help/ru.html
index 1d7853e7f..d48376508 100644
--- a/SSL/src/CommonForms/ПараметрыПроксиСервера/Help/ru.html
+++ b/SSL/src/CommonForms/ПараметрыПроксиСервера/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для настройки параметров прокси-сервера.
Программа предоставляет возможности для получения файлов из сети Интернет по протоколам HTTP, HTTPS, FTP и сохранения полученных файлов на клиенте, сервере или во временном хранилище.
При работе с программой для выполнения определенных операций (таких, как загрузка курсов валют, загрузка адресного классификатора, обмен данными через FTP-ресурс, обновление конфигурации с веб-сайта поставщика и т.п.) может потребоваться доступ к сети Интернет.
diff --git a/SSL/src/CommonForms/ПечатьДокументов/Form.form b/SSL/src/CommonForms/ПечатьДокументов/Form.form
index 7f01d5bb3..a46db0127 100644
--- a/SSL/src/CommonForms/ПечатьДокументов/Form.form
+++ b/SSL/src/CommonForms/ПечатьДокументов/Form.form
@@ -2112,6 +2112,7 @@
+ Ctrl+Shift+PStdPicture.PrintImmediately
@@ -2163,14 +2164,7 @@
Перейти к управлению макетами
diff --git a/SSL/src/CommonForms/ПечатьДокументов/Help/ru.html b/SSL/src/CommonForms/ПечатьДокументов/Help/ru.html
index 861e552d8..b3de6f1d3 100644
--- a/SSL/src/CommonForms/ПечатьДокументов/Help/ru.html
+++ b/SSL/src/CommonForms/ПечатьДокументов/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для просмотра, редактирования и печати сформированных печатных форм, а также для отправки печатной формы по электронной почте и сохранения в файл.
Вызывается из документов и списков документов программы по команде Печать.
Предусмотрены следующие возможности:
diff --git a/SSL/src/CommonForms/ПечатьДокументов/Module.bsl b/SSL/src/CommonForms/ПечатьДокументов/Module.bsl
index f4a972501..b88ddcc55 100644
--- a/SSL/src/CommonForms/ПечатьДокументов/Module.bsl
+++ b/SSL/src/CommonForms/ПечатьДокументов/Module.bsl
@@ -11,6 +11,10 @@
Возврат;
КонецЕсли;
+ Если Не Пользователи.РолиДоступны("ИзменениеМакетовПечатныхФорм") Тогда
+ Элементы.КнопкаПерейтиКУправлениюМакетами.Видимость = Ложь;
+ КонецЕсли;
+
// Проверка входных параметров.
Если Не ЗначениеЗаполнено(Параметры.ИсточникДанных) Тогда
ОбщегоНазначенияКлиентСервер.Проверить(ТипЗнч(Параметры.ПараметрКоманды) = Тип("Массив") Или ОбщегоНазначения.ЗначениеСсылочногоТипа(Параметры.ПараметрКоманды),
@@ -938,6 +942,7 @@
&НаКлиентеНаСервереБезКонтекста
Функция УникальноеИмяФайла(ИмяФайла)
+
Файл = Новый Файл(ИмяФайла);
ИмяБезРасширения = Файл.ИмяБезРасширения;
Расширение = Файл.Расширение;
@@ -950,6 +955,7 @@
КонецЦикла;
Возврат Файл.ПолноеИмя;
+
КонецФункции
&НаСервере
@@ -1240,7 +1246,7 @@
Возврат ТабличныеДокументы;
КонецФункции
-// автосумма
+#Область Автосумма
&НаКлиенте
Процедура РассчитатьСуммуЯчеек()
@@ -1267,6 +1273,8 @@
#КонецОбласти
+#КонецОбласти
+
diff --git a/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Help/ru.html b/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Help/ru.html
index b237c1169..4763f7d58 100644
--- a/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Help/ru.html
+++ b/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для ввода пароля учетной записи электронной почты. Открывается при отправке письма с учетных записей, в которых пароль не задан.
Ввод пароля и отправка письма
Для отправки письма введите Пароль и его Подтверждение;
diff --git a/SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/Help/ru.html b/SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/Help/ru.html
index 0501d5f97..fff0205be 100644
--- a/SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/Help/ru.html
+++ b/SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/Help/ru.html
@@ -1,3 +1,3 @@
-
+
Предназначена для повторного указания пути к исполняемому файлу 1С-Бухфон. Возникает в случае отсутствия файла по указанному пути.
Возможно, приложение было удалено или перемещено. Вы можете скачать его снова, воспользовавшись ссылкой скачать программу.
\ No newline at end of file
diff --git a/SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/Module.bsl b/SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/Module.bsl
index 7334bc435..b163da0fc 100644
--- a/SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/Module.bsl
+++ b/SSL/src/CommonForms/ПоискИсполняемогоФайла1СБухфон/Module.bsl
@@ -11,7 +11,7 @@
Процедура ПриОткрытии(Отказ)
Если НЕ Интеграция1СБухфонКлиент.ЭтоWindowsКлиент() Тогда
ПоказатьПредупреждение(,НСтр("ru = 'Для работы с приложением 1С-Бухфон необходима операционная система Microsoft Windows.'"));
- Отказ = Истина;
+ Отказ = Истина;
КонецЕсли;
КонецПроцедуры
@@ -21,10 +21,8 @@
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
- НовыйПутьКФайлу = Интеграция1СБухфонКлиент.ВыбратьФайл1СБухфон(ПутьКФайлу);
- Если НовыйПутьКФайлу <> "" Тогда
- ПутьКФайлу = НовыйПутьКФайлу;
- КонецЕсли;
+ Оповещение = Новый ОписаниеОповещения("ПутьКФайлуНачалоВыбораЗавершение", ЭтотОбъект);
+ Интеграция1СБухфонКлиент.ВыбратьФайл1СБухфон(Оповещение, ПутьКФайлу);
КонецПроцедуры
#КонецОбласти
@@ -45,8 +43,15 @@
#Область СлужебныеПроцедурыИФункции
+&НаКлиенте
+Процедура ПутьКФайлуНачалоВыбораЗавершение(НовыйПутьКФайлу, ДополнительныеПараметры) Экспорт
+ Если НовыйПутьКФайлу <> "" Тогда
+ ПутьКФайлу = НовыйПутьКФайлу;
+ КонецЕсли;
+КонецПроцедуры
+
&НаСервереБезКонтекста
-Процедура НовыйПутьКИсполняемомуФайлу(ИдентификаторКлиента, ПутьКФайлу)
+Процедура НовыйПутьКИсполняемомуФайлу(ИдентификаторКлиента, ПутьКФайлу)
Интеграция1СБухфон.СохранитьРасположениеИсполняемогоФайла1СБухфон(ИдентификаторКлиента, ПутьКФайлу);
КонецПроцедуры
diff --git a/SSL/src/CommonForms/ПраваДоступа/Help/ru.html b/SSL/src/CommonForms/ПраваДоступа/Help/ru.html
index 8703a9341..e152b76ec 100644
--- a/SSL/src/CommonForms/ПраваДоступа/Help/ru.html
+++ b/SSL/src/CommonForms/ПраваДоступа/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Открывается по команде Права доступа на панели навигации пользователя (внешнего пользователя).
Каждому пользователю, посредством профилей и групп доступа, может быть назначена одна или несколько ролей, которые в совокупности образуют его персональные настройки прав доступа.
diff --git a/SSL/src/CommonForms/ПраваДоступа/Module.bsl b/SSL/src/CommonForms/ПраваДоступа/Module.bsl
index 0fab88a17..5078846f1 100644
--- a/SSL/src/CommonForms/ПраваДоступа/Module.bsl
+++ b/SSL/src/CommonForms/ПраваДоступа/Module.bsl
@@ -240,7 +240,7 @@
ПарольПользователяСервиса);
Возврат;
Иначе
- ВключитьИсключитьИзГруппыЗавершение("", ДополнительныеПараметры);
+ ВключитьИсключитьИзГруппыЗавершение(Null, ДополнительныеПараметры);
КонецЕсли;
КонецПроцедуры
@@ -252,7 +252,9 @@
Возврат;
КонецЕсли;
- ПарольПользователяСервиса = НовыйПарольПользователяСервиса;
+ Если НовыйПарольПользователяСервиса <> Null Тогда
+ ПарольПользователяСервиса = НовыйПарольПользователяСервиса;
+ КонецЕсли;
ОписаниеОшибки = "";
@@ -305,34 +307,33 @@
Запрос.Текст =
"ВЫБРАТЬ
| ГруппыДоступа.Ссылка КАК ГруппаДоступа,
- | ГруппыДоступа.Ссылка.Наименование КАК Наименование,
- | ГруппыДоступа.Ссылка.Профиль.Наименование КАК ПрофильНаименование,
- | ГруппыДоступа.Ссылка.Описание КАК Описание,
- | ГруппыДоступа.Ссылка.Ответственный КАК Ответственный
+ | ГруппыДоступа.Наименование КАК Наименование,
+ | ГруппыДоступа.Профиль.Наименование КАК ПрофильНаименование,
+ | ГруппыДоступа.Описание КАК Описание,
+ | ГруппыДоступа.Ответственный КАК Ответственный
|ИЗ
- | (ВЫБРАТЬ РАЗЛИЧНЫЕ
- | ГруппыДоступа.Ссылка КАК Ссылка
- | ИЗ
- | Справочник.ГруппыДоступа КАК ГруппыДоступа
- | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ПользователиГруппДоступа
- | ПО (ПользователиГруппДоступа.Пользователь В
- | (ВЫБРАТЬ
- | &Пользователь
- |
- | ОБЪЕДИНИТЬ ВСЕ
- |
- | ВЫБРАТЬ
- | СоставыГруппПользователей.ГруппаПользователей
- | ИЗ
- | РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
- | ГДЕ
- | СоставыГруппПользователей.Пользователь = &Пользователь))
- | И ГруппыДоступа.Ссылка = ПользователиГруппДоступа.Ссылка
- | И (НЕ ГруппыДоступа.ПометкаУдаления)
- | И (НЕ ГруппыДоступа.Профиль.ПометкаУдаления)) КАК ГруппыДоступа
+ | Справочник.ГруппыДоступа КАК ГруппыДоступа
+ |ГДЕ
+ | НЕ ГруппыДоступа.ПометкаУдаления
+ | И НЕ ГруппыДоступа.Профиль.ПометкаУдаления
+ | И ИСТИНА В
+ | (ВЫБРАТЬ ПЕРВЫЕ 1
+ | ИСТИНА
+ | ИЗ
+ | Справочник.ГруппыДоступа.Пользователи КАК ПользователиГруппДоступа
+ | ГДЕ
+ | ПользователиГруппДоступа.Ссылка = ГруппыДоступа.Ссылка
+ | И НЕ(ПользователиГруппДоступа.Пользователь <> &Пользователь
+ | И НЕ ПользователиГруппДоступа.Пользователь В
+ | (ВЫБРАТЬ
+ | СоставыГруппПользователей.ГруппаПользователей
+ | ИЗ
+ | РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
+ | ГДЕ
+ | СоставыГруппПользователей.Пользователь = &Пользователь)))
|
|УПОРЯДОЧИТЬ ПО
- | ГруппыДоступа.Ссылка.Наименование";
+ | ГруппыДоступа.Наименование";
ВсеГруппыДоступа = Запрос.Выполнить().Выгрузить();
diff --git a/SSL/src/CommonForms/ПраваДоступаУпрощенно/Help/ru.html b/SSL/src/CommonForms/ПраваДоступаУпрощенно/Help/ru.html
index 34eb9f698..202a9321a 100644
--- a/SSL/src/CommonForms/ПраваДоступаУпрощенно/Help/ru.html
+++ b/SSL/src/CommonForms/ПраваДоступаУпрощенно/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для упрощенного режима настройки прав доступа.
Настройка прав доступа пользователей осуществляется с помощью профилей. Профиль определяет некоторую совокупность действий с данными программы, которые может выполнять пользователь. Как правило, профили соответствуют различным должностным обязанностям (или видам деятельности) пользователей программы. Пользователю могут быть назначены одновременно несколько профилей, которые в совокупности образуют его персональные настройки прав доступа.
Предназначен для просмотра и ввода значений дополнительных сведений. Ввод значений дополнительных сведений, как правило, осуществляется в отдельном окне, в отличие от дополнительных реквизитов.
diff --git a/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Module.bsl b/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Module.bsl
index 83006a408..8b76788fb 100644
--- a/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Module.bsl
+++ b/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Module.bsl
@@ -8,6 +8,12 @@
Возврат;
КонецЕсли;
+ Если Не Пользователи.РолиДоступны("ИзменениеДополнительныхСведений") Тогда
+ Элементы.ФормаЗаписать.Видимость = Ложь;
+ Элементы.ФормаЗаписатьИЗакрыть.Видимость = Ложь;
+ Элементы.ИзменитьСоставДополнительныхСведений.Видимость = Ложь;
+ КонецЕсли;
+
Если Параметры.ПанельНавигацииФормы
И ПравоДоступа("Редактирование", Метаданные.РегистрыСведений.ДополнительныеСведения) Тогда
diff --git a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Help/ru.html b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Help/ru.html
index 08a5a96ef..31e7befc1 100644
--- a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Help/ru.html
+++ b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для редактирования табличного документа.
Для редактирования табличного документа или макета в печатной форме или табличном документе выполните команду Изменить макет меню Еще.
Важно: при редактировании макетов печатных форм необходимо иметь в виду, что изменение имен областей, а также параметров макета может привести к потере работоспособности печатной формы. Восстановление стандартной печатной формы выполняется в списке Макеты печатных форм.
diff --git a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl
index 4e084eab4..34e2fa08f 100644
--- a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl
+++ b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl
@@ -46,30 +46,13 @@
Процедура ПриОткрытии(Отказ)
Если Не ПустаяСтрока(Параметры.ПутьКФайлу) Тогда
- Файл = Новый Файл(Параметры.ПутьКФайлу);
- Если ПустаяСтрока(ИмяДокумента) Тогда
- ИмяДокумента = Файл.ИмяБезРасширения;
- КонецЕсли;
- РедактированиеЗапрещено = Файл.ПолучитьТолькоЧтение();
+ ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗавершенииИнициализацииФайла", ЭтотОбъект);
+ Файл = Новый Файл();
+ Файл.НачатьИнициализацию(ОписаниеОповещения, Параметры.ПутьКФайлу);
+ Возврат;
КонецЕсли;
- Если ПустаяСтрока(ИмяДокумента) Тогда
- ИспользованныеИмена = Новый Массив;
- Оповестить("ЗапросИменРедактируемыхТабличныхДокументов", ИспользованныеИмена, ЭтотОбъект);
-
- Индекс = 1;
- Пока ИспользованныеИмена.Найти(ИмяНовогоДокумента() + Индекс) <> Неопределено Цикл
- Индекс = Индекс + 1;
- КонецЦикла;
-
- ИмяДокумента = ИмяНовогоДокумента() + Индекс;
- КонецЕсли;
-
- Элементы.ТабличныйДокумент.Редактирование = Элементы.ТабличныйДокумент.Редактирование Или Не ПустаяСтрока(Параметры.ПутьКФайлу) И Не РедактированиеЗапрещено;
-
- УстановитьЗаголовок();
- НастроитьПредставлениеКоманд();
- НастроитьОтображениеТабличногоДокумента();
+ УстановитьНачальныеНастройкиФормы();
КонецПроцедуры
@@ -98,9 +81,8 @@
&НаКлиенте
Процедура ПодтвердитьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
- Если ЗаписатьТабличныйДокумент() Тогда
- Закрыть();
- КонецЕсли;
+ ОписаниеОповещения = Новый ОписаниеОповещения("ЗакрытьФормуПослеЗаписиТабличногоДокумента", ЭтотОбъект);
+ ЗаписатьТабличныйДокумент(ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
@@ -132,9 +114,8 @@
&НаКлиенте
Процедура ЗаписатьИЗакрыть(Команда)
- Если ЗаписатьТабличныйДокумент() Тогда
- Закрыть();
- КонецЕсли;
+ ОписаниеОповещения = Новый ОписаниеОповещения("ЗакрытьФормуПослеЗаписиТабличногоДокумента", ЭтотОбъект);
+ ЗаписатьТабличныйДокумент(ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
@@ -351,23 +332,27 @@
КонецФункции
&НаКлиенте
-Функция ЗаписатьТабличныйДокумент()
+Процедура ЗакрытьФормуПослеЗаписиТабличногоДокумента(Закрывать, ДополнительныеПараметры) Экспорт
+ Если Закрывать Тогда
+ Закрыть();
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаписатьТабличныйДокумент(ОбработчикЗавершения = Неопределено)
Если ЭтоНовый() Или РедактированиеЗапрещено Тогда
- ДиалогСохраненияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
- ДиалогСохраненияФайла.ПолноеИмяФайла = ИмяДокумента;
- ДиалогСохраненияФайла.Фильтр = НСтр("ru = 'Табличный документ'") + " (*.mxl)|*.mxl";
- Если ДиалогСохраненияФайла.Выбрать() Тогда
- Параметры.ПутьКФайлу = ДиалогСохраненияФайла.ПолноеИмяФайла;
- ИмяДокумента = Сред(ДиалогСохраненияФайла.ПолноеИмяФайла, СтрДлина(ДиалогСохраненияФайла.Каталог) + 1);
- Если Нрег(Прав(ИмяДокумента, 4)) = ".mxl" Тогда
- ИмяДокумента = Лев(ИмяДокумента, СтрДлина(ИмяДокумента) - 4);
- КонецЕсли;
- Иначе
- Возврат Ложь;
- КонецЕсли;
+ НачатьДиалогСохраненияФайла(ОбработчикЗавершения);
+ Возврат;
КонецЕсли;
+ ЗаписатьТабличныйДокументИмяФайлаВыбрано(ОбработчикЗавершения);
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаписатьТабличныйДокументИмяФайлаВыбрано(Знач ОбработчикЗавершения)
+
Если Не ПустаяСтрока(Параметры.ПутьКФайлу) Тогда
ТабличныйДокумент.Записать(Параметры.ПутьКФайлу);
РедактированиеЗапрещено = Ложь;
@@ -377,10 +362,67 @@
Модифицированность = Ложь;
УстановитьЗаголовок();
- Возврат Истина;
+ ВыполнитьОбработкуОповещения(ОбработчикЗавершения, Истина);
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура НачатьДиалогСохраненияФайла(Знач ОбработчикЗавершения)
+
+ Перем ДиалогСохраненияФайла, ОписаниеОповещения;
+
+ ДиалогСохраненияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
+ ДиалогСохраненияФайла.ПолноеИмяФайла = ИмяДокумента;
+ ДиалогСохраненияФайла.Фильтр = НСтр("ru = 'Табличный документ'") + " (*.mxl)|*.mxl";
+
+ ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗавершенииДиалогаВыбораФайла", ЭтотОбъект, ОбработчикЗавершения);
+ ДиалогСохраненияФайла.Показать(ОписаниеОповещения);
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПриЗавершенииДиалогаВыбораФайла(ВыбранныеФайлы, ОбработчикЗавершения) Экспорт
+
+ Если ВыбранныеФайлы = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+
+ ПолноеИмяФайла = ВыбранныеФайлы[0];
+
+ Параметры.ПутьКФайлу = ПолноеИмяФайла;
+ ИмяДокумента = Сред(ПолноеИмяФайла, СтрДлина(ОписаниеФайла(ПолноеИмяФайла).Путь) + 1);
+ Если Нрег(Прав(ИмяДокумента, 4)) = ".mxl" Тогда
+ ИмяДокумента = Лев(ИмяДокумента, СтрДлина(ИмяДокумента) - 4);
+ КонецЕсли;
+
+ ЗаписатьТабличныйДокументИмяФайлаВыбрано(ОбработчикЗавершения);
+
+КонецПроцедуры
+
+&НаКлиенте
+Функция ОписаниеФайла(ПолноеИмя)
+
+ ПозицияРазделителя = СтроковыеФункцииКлиентСервер.НайтиСимволСКонца(ПолноеИмя, ПолучитьРазделительПути());
+
+ Имя = Сред(ПолноеИмя, ПозицияРазделителя + 1);
+ Путь = Лев(ПолноеИмя, ПозицияРазделителя);
+
+ ПозицияРасширения = СтроковыеФункцииКлиентСервер.НайтиСимволСКонца(Имя, ".");
+
+ ИмяБезРасширения = Лев(Имя, ПозицияРасширения - 1);
+ Расширение = Сред(Имя, ПозицияРасширения + 1);
+
+ Результат = Новый Структура;
+ Результат.Вставить("ПолноеИмя", ПолноеИмя);
+ Результат.Вставить("Имя", Имя);
+ Результат.Вставить("Путь", Путь);
+ Результат.Вставить("ИмяБезРасширения", ИмяБезРасширения);
+ Результат.Вставить("Расширение", Расширение);
+
+ Возврат Результат;
КонецФункции
-
+
&НаКлиенте
Функция ИмяНовогоДокумента()
Возврат НСтр("ru = 'Новый'");
@@ -433,4 +475,56 @@
ТабличныйДокумент = ЗагруженныйТабличныйДокумент;
КонецПроцедуры
+
+&НаКлиенте
+Процедура УстановитьНачальныеНастройкиФормы()
+
+ Если Не ПустаяСтрока(Параметры.ПутьКФайлу) И Не РедактированиеЗапрещено Тогда
+ Элементы.ТабличныйДокумент.Редактирование = Истина;
+ КонецЕсли;
+
+ УстановитьИмяДокумента();
+ УстановитьЗаголовок();
+ НастроитьПредставлениеКоманд();
+ НастроитьОтображениеТабличногоДокумента();
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура УстановитьИмяДокумента()
+
+ Если ПустаяСтрока(ИмяДокумента) Тогда
+ ИспользованныеИмена = Новый Массив;
+ Оповестить("ЗапросИменРедактируемыхТабличныхДокументов", ИспользованныеИмена, ЭтотОбъект);
+
+ Индекс = 1;
+ Пока ИспользованныеИмена.Найти(ИмяНовогоДокумента() + Индекс) <> Неопределено Цикл
+ Индекс = Индекс + 1;
+ КонецЦикла;
+
+ ИмяДокумента = ИмяНовогоДокумента() + Индекс;
+ КонецЕсли;
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПриЗавершенииИнициализацииФайла(Файл, ДополнительныеПараметры) Экспорт
+
+ Если ПустаяСтрока(ИмяДокумента) Тогда
+ ИмяДокумента = Файл.ИмяБезРасширения;
+ КонецЕсли;
+
+ ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗавершенииПолученияТолькоЧтения", ЭтотОбъект);
+ Файл.НачатьПолучениеТолькоЧтения(ОписаниеОповещения);
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПриЗавершенииПолученияТолькоЧтения(ТолькоЧтение, ДополнительныеПараметры) Экспорт
+
+ РедактированиеЗапрещено = ТолькоЧтение;
+ УстановитьНачальныеНастройкиФормы();
+
+КонецПроцедуры
+
#КонецОбласти
diff --git a/SSL/src/CommonForms/Сертификат/Help/ru.html b/SSL/src/CommonForms/Сертификат/Help/ru.html
index 6d855c6ff..54a62ad6b 100644
--- a/SSL/src/CommonForms/Сертификат/Help/ru.html
+++ b/SSL/src/CommonForms/Сертификат/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для просмотра основных свойств сертификата ключа электронной подписи и шифрования.
Основные сведения о сертификате
Кому выдан - личные данные владельца сертификата;
diff --git a/SSL/src/CommonForms/Сертификат/Module.bsl b/SSL/src/CommonForms/Сертификат/Module.bsl
index cb1a29538..7d53d487d 100644
--- a/SSL/src/CommonForms/Сертификат/Module.bsl
+++ b/SSL/src/CommonForms/Сертификат/Module.bsl
@@ -74,21 +74,15 @@
&НаКлиенте
Процедура СохранитьВФайл(Команда)
- ЭлектроннаяПодписьКлиент.СохранитьСертификат(АдресСертификата);
+ ЭлектроннаяПодписьСлужебныйКлиент.СохранитьСертификат(, АдресСертификата);
КонецПроцедуры
&НаКлиенте
Процедура Проверить(Команда)
- ОписаниеОшибки = Неопределено;
- Если ЭлектроннаяПодписьКлиент.ПроверитьСертификат(, АдресСертификата, ОписаниеОшибки) Тогда
- ПоказатьПредупреждение(, НСтр("ru = 'Сертификат действителен.'"));
-
- ИначеЕсли ОписаниеОшибки <> Неопределено Тогда
- ПоказатьПредупреждение(, НСтр("ru = 'Сертификат недействителен по причине:'")
- + Символы.ПС + ОписаниеОшибки);
- КонецЕсли;
+ ЭлектроннаяПодписьКлиент.ПроверитьСертификат(Новый ОписаниеОповещения(
+ "ПроверитьЗавершение", ЭтотОбъект), АдресСертификата);
КонецПроцедуры
@@ -96,6 +90,20 @@
#Область СлужебныеПроцедурыИФункции
+// Продолжение процедуры Проверить.
+&НаКлиенте
+Процедура ПроверитьЗавершение(Результат, Неопределен) Экспорт
+
+ Если Результат = Истина Тогда
+ ПоказатьПредупреждение(, НСтр("ru = 'Сертификат действителен.'"));
+
+ ИначеЕсли Результат <> Неопределено Тогда
+ ПоказатьПредупреждение(, НСтр("ru = 'Сертификат недействителен по причине:'")
+ + Символы.ПС + Результат);
+ КонецЕсли;
+
+КонецПроцедуры
+
&НаСервере
Процедура ЗаполнитьСвойстваСубъекта(Сертификат)
@@ -270,7 +278,7 @@
Если Выборка.Следующий() Тогда
ДанныеСертификата = Выборка.ДанныеСертификата.Получить();
Иначе
- Сертификат = ЭлектроннаяПодпись.ПолучитьСертификатПоОтпечатку(СсылкаОтпечаток, Ложь,, Ложь);
+ Сертификат = ЭлектроннаяПодписьСлужебный.ПолучитьСертификатПоОтпечатку(СсылкаОтпечаток, Ложь, Ложь);
Если Сертификат <> Неопределено Тогда
ДанныеСертификата = Сертификат.Выгрузить();
КонецЕсли;
diff --git a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Help/ru.html b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Help/ru.html
index b5aed361b..3ca8abe90 100644
--- a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Help/ru.html
+++ b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для указания параметров файловой или клиент-серверной базы при создании начального образа РИБ. При настройке синхронизации РИБ (внешние файлы) необходимо указать, где будет создан начальный образ РИБ. Если файлы хранятся в томах, также потребуется указать путь к файлу, в который будет записан архив (.zip) со всеми файлами в томах.
Открывается по команде Создать начальный образ из Помощника создания синхронизации данных при настройке синхронизации РИБ (внешние файлы). Также можно в списке Синхронизация данных с помощью кнопки открыть настройку синхронизации РИБ (внешние файлы), нажать кнопку Создание начального образа подчиненного узла распределенной информационной базы.
Параметры информационной базы
diff --git a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Module.bsl b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Module.bsl
index c576c580c..35e41dca0 100644
--- a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Module.bsl
+++ b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Module.bsl
@@ -166,7 +166,23 @@
СтандартнаяОбработка = Ложь;
- Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
+ ДополнительныеПараметры = Новый Структура;
+ ДополнительныеПараметры.Вставить("ИмяСвойства", ИмяСвойства);
+ ДополнительныеПараметры.Вставить("ИмяФайла", ИмяФайла);
+ ДополнительныеПараметры.Вставить("Фильтр", Фильтр);
+
+ ОповещениеПодключенияРасширенияРаботыСФайлами = Новый ОписаниеОповещения(
+ "ОбработчикСохраненияФайлаПослеПодключенияРасширенияРаботыСФайлами",
+ ЭтаФорма, ДополнительныеПараметры);
+
+ НачатьПодключениеРасширенияРаботыСФайлами(ОповещениеПодключенияРасширенияРаботыСФайлами);
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОбработчикСохраненияФайлаПослеПодключенияРасширенияРаботыСФайлами(Подключено, ДополнительныеПараметры) Экспорт
+
+ Если Не Подключено Тогда
ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено);
Возврат;
КонецЕсли;
@@ -176,12 +192,26 @@
Диалог.Заголовок = НСтр("ru = 'Выберите файл для сохранения'");
Диалог.МножественныйВыбор = Ложь;
Диалог.ПредварительныйПросмотр = Ложь;
- Диалог.Фильтр = Фильтр;
+ Диалог.Фильтр = ДополнительныеПараметры.Фильтр;
Диалог.ПолноеИмяФайла =
- ?(ЭтотОбъект[ИмяСвойства] = "", ИмяФайла, ЭтотОбъект[ИмяСвойства]);
+ ?(ЭтотОбъект[ДополнительныеПараметры.ИмяСвойства] = "",
+ ДополнительныеПараметры.ИмяФайла,
+ ЭтотОбъект[ДополнительныеПараметры.ИмяСвойства]);
- Если Диалог.Выбрать() Тогда
- ЭтотОбъект[ИмяСвойства] = Диалог.ПолноеИмяФайла;
+ ОписаниеОповещенияДиалогаВыбора = Новый ОписаниеОповещения(
+ "ОбработчикСохраненияФайлаПослеВыбораВДиалоге",
+ ЭтаФорма, ДополнительныеПараметры);
+ Диалог.Показать(ОписаниеОповещенияДиалогаВыбора);
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОбработчикСохраненияФайлаПослеВыбораВДиалоге(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
+
+ Если ВыбранныеФайлы <> Неопределено
+ И ВыбранныеФайлы.Количество() = 1 Тогда
+
+ ЭтотОбъект[ДополнительныеПараметры.ИмяСвойства] = ВыбранныеФайлы[0];
КонецЕсли;
КонецПроцедуры
diff --git a/SSL/src/CommonForms/СозданиеРезервнойКопии/Module.bsl b/SSL/src/CommonForms/СозданиеРезервнойКопии/Module.bsl
index 3299123c3..5ef2f17c0 100644
--- a/SSL/src/CommonForms/СозданиеРезервнойКопии/Module.bsl
+++ b/SSL/src/CommonForms/СозданиеРезервнойКопии/Module.bsl
@@ -22,10 +22,6 @@
#КонецОбласти
-#Область ОбработчикиСобытийЭлементовШапкиФормы
-
-#КонецОбласти
-
#Область ОбработчикиКомандФормы
&НаКлиенте
diff --git a/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Form.form b/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Form.form
index a14601920..0fbd1b8d6 100644
--- a/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Form.form
+++ b/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Form.form
@@ -422,6 +422,10 @@
БольшеНеСпрашивать62
+
+ ru
+ Больше не спрашивать (сохранять все)
+ truetrue
@@ -431,6 +435,12 @@
БольшеНеСпрашиватьRight
+
+ ru
+ Включить режим сохранения всех подписей, который в дальнейшем можно изменить
+в настройках электронной подписи и шифрования на странице Дополнительно.
+
+ ButtonБольшеНеСпрашиватьExtendedTooltip71
@@ -740,7 +750,6 @@
ПредставлениеДанныхString
- AnyRef
Предназначена для сохранения печатной формы. Имеется возможность сохранить печатные формы в нужных форматах на компьютере или присоединить к документу.
С помощью переключателя выберите, как сохранить печатную форму:
Сохранить в папку на компьютер.
diff --git a/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl b/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl
index 3b4d00ac5..cab64a34d 100644
--- a/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl
+++ b/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl
@@ -23,15 +23,22 @@
// Место сохранения по умолчанию.
ВариантСохранения = "СохранитьВПапку";
- // Объект для присоединения по умолчанию.
- Если Элементы.ВыбранныйОбъект.СписокВыбора.Количество() > 0 Тогда
- ВыбранныйОбъект = Элементы.ВыбранныйОбъект.СписокВыбора[0].Значение;
- Иначе
- Элементы.ВариантСохранения.Видимость = Ложь;
+ // настройка видимости
+ ЭтоВебКлиент = ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент();
+ ЕстьВозможностьПрисоединения = Элементы.ВыбранныйОбъект.СписокВыбора.Количество() > 0;
+ Элементы.ВыборМестаСохраненияФайла.Видимость = Не ЭтоВебКлиент Или ЕстьВозможностьПрисоединения;
+ Элементы.ВариантСохранения.Видимость = ЕстьВозможностьПрисоединения;
+ Если Не ЕстьВозможностьПрисоединения Тогда
Элементы.ПапкаДляСохраненияФайлов.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх;
КонецЕсли;
+ Элементы.ПапкаДляСохраненияФайлов.Видимость = Не ЭтоВебКлиент;
+ // Объект для присоединения по умолчанию.
+ Если ЕстьВозможностьПрисоединения Тогда
+ ВыбранныйОбъект = Элементы.ВыбранныйОбъект.СписокВыбора[0].Значение;
+ КонецЕсли;
Элементы.ВыбранныйОбъект.ТолькоПросмотр = Элементы.ВыбранныйОбъект.СписокВыбора.Количество() = 1;
+
КонецПроцедуры
&НаСервере
@@ -135,7 +142,6 @@
Процедура УстановитьСтраницуМестаСохранения()
#Если ВебКлиент Тогда
- Элементы.ГруппаМестаСохранения.ТекущаяСтраница = Элементы.СтраницаПрисоединениеКОбъекту;
Элементы.ВыбранныйОбъект.Доступность = ВариантСохранения = "Присоединить";
#Иначе
Если ВариантСохранения = "Присоединить" Тогда
diff --git a/SSL/src/CommonForms/СтруктураПодчиненности/Help/ru.html b/SSL/src/CommonForms/СтруктураПодчиненности/Help/ru.html
index c607333c2..211c0b013 100644
--- a/SSL/src/CommonForms/СтруктураПодчиненности/Help/ru.html
+++ b/SSL/src/CommonForms/СтруктураПодчиненности/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для вывода родительских и подчиненных документов.
Формируется командой Структура подчиненности на панели навигации документа.
Отчет предоставляет оперативный и наглядный доступ ко всей цепочке взаимосвязанных с точки зрения бизнес-логики документов. Документы считаются взаимосвязанными, если один документ ссылается на другой. В программе взаимосвязь документов выглядит так: в одном документе (назовем его дочерним) в качестве какого-либо реквизита указан другой документ (назовем его родительским). Отчет позволяет из какого-либо одного документа увидеть всю цепочку взаимосвязанных с ним документов.
Также можно сопоставить и обновить адреса электронной почты, содержащиеся в письме, с контактами и их текущей контактной информацией в программе.
Открывается по ссылке Уточнить контакты во входящем электронном письме. Если контакты были сопоставлены автоматически, ссылка не выводится. В этом случае можно воспользоваться командой Уточнить контакты меню Еще.
Предназначен для просмотра файлов, которые хранятся в томе на диске.
В каждом томе файлы хранятся в подкаталогах. На каждую дату создания версии файла создается свой подкаталог. Все файлы хранятся с оригинальным именем и расширением, между ними добавляется номер версии, например, Приказ2.2.txt.
Список вызывается по команде Файлы в томе панели навигации Тома.
Для просмотра отчета необходимо нажать кнопку Сформировать, предварительно задав параметры (если они предусмотрены). В клиент-серверном варианте работы программы предусмотрено формирование отчетов в фоновом режиме.
Режим формирования
Установите флажок Формировать сразу меню Еще, для того чтобы отчет формировался автоматически сразу после открытия, без нажатия кнопки Сформировать.
diff --git a/SSL/src/CommonForms/ФормаОтчета/Module.bsl b/SSL/src/CommonForms/ФормаОтчета/Module.bsl
index 7dc8946b2..72c54e4db 100644
--- a/SSL/src/CommonForms/ФормаОтчета/Module.bsl
+++ b/SSL/src/CommonForms/ФормаОтчета/Module.bsl
@@ -18,7 +18,7 @@
ВариантыПанелиКлючТекущегоВарианта = " - ";
Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда
- Элементы.КомандыЕще.Ширина = 11;
+ Элементы.КомандыЕще.Ширина = 15;
КонецЕсли;
// Параметры формы.
@@ -36,7 +36,6 @@
ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(ФормаПараметры.Отбор, Параметры.Отбор, Истина);
Параметры.Отбор.Очистить();
КонецЕсли;
- ФормаПараметры = Новый ФиксированнаяСтруктура(ФормаПараметры);
Если ФормаПараметры.Подсистема = Неопределено Тогда
Элементы.ДругиеОтчеты.Видимость = Ложь;
@@ -91,9 +90,12 @@
КонецЕсли;
// Скрытие команд вариантов
- Если Не Параметры.Свойство("ВидимостьКомандВариантовОтчетов", ВидимостьКомандВариантовОтчетов) Тогда
- ВидимостьКомандВариантовОтчетов = ВариантыОтчетовПовтИсп.ПравоДобавления();
- Если ВидимостьКомандВариантовОтчетов // Команды не отключены параметрами открытия формы.
+ Если Не НастройкиОтчета.Свойство("РазрешеноМенятьВарианты") Или Параметры.Свойство("ВидимостьКомандВариантовОтчетов") Тогда
+ НастройкиОтчета.Вставить("РазрешеноМенятьВарианты", ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ВидимостьКомандВариантовОтчетов"));
+ КонецЕсли;
+ Если ТипЗнч(НастройкиОтчета.РазрешеноМенятьВарианты) <> Тип("Булево") Тогда
+ НастройкиОтчета.РазрешеноМенятьВарианты = ВариантыОтчетовПовтИсп.ПравоДобавления();
+ Если НастройкиОтчета.РазрешеноМенятьВарианты // Команды не отключены параметрами открытия формы.
И Параметры.КлючВарианта = Неопределено // Открывается без контекста.
И ЗначениеЗаполнено(НастройкиОтчета.ВариантСсылка) Тогда // Вариант зарегистрирован.
ПредопределенныйВариант = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(НастройкиОтчета.ВариантСсылка, "ПредопределенныйВариант");
@@ -102,12 +104,12 @@
Если Отключенные.Найти(ПредопределенныйВариант) <> Неопределено Тогда // Вариант отключен.
Текст = НСтр("ru = 'Контекстный вариант ""%1"" отчета ""%2"" открыт без контекста.'");
ВариантыОтчетов.ПредупреждениеПоВарианту(НастройкиОтчета.ВариантСсылка, Текст, НастройкиОтчета.ВариантСсылка, НастройкиОтчета.ОтчетСсылка);
- ВидимостьКомандВариантовОтчетов = Ложь;
+ НастройкиОтчета.РазрешеноМенятьВарианты = Ложь;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
- Если Не ВидимостьКомандВариантовОтчетов Тогда
+ Если Не НастройкиОтчета.РазрешеноМенятьВарианты Тогда
АвтоНавигационнаяСсылка = Ложь;
КонецЕсли;
@@ -228,11 +230,11 @@
КонецЕсли;
// Вызов переопределяемого модуля.
+ ОтчетыПереопределяемый.ПередЗагрузкойВариантаНаСервере(ЭтотОбъект, НовыеНастройкиКД);
Если НастройкиОтчета.События.ПередЗагрузкойВариантаНаСервере
Или НастройкиОтчета.События.ПриЗагрузкеВариантаНаСервере Тогда
ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
КонецЕсли;
- ОтчетыПереопределяемый.ПередЗагрузкойВариантаНаСервере(ЭтотОбъект, НовыеНастройкиКД);
Если НастройкиОтчета.События.ПередЗагрузкойВариантаНаСервере Тогда
ОтчетОбъект.ПередЗагрузкойВариантаНаСервере(ЭтотОбъект, НовыеНастройкиКД);
КонецЕсли;
@@ -339,6 +341,9 @@
Если Не РежимВариантаОтчета Тогда
Возврат;
КонецЕсли;
+ Если ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() Тогда // Для платформы 8.3.5.
+ Возврат;
+ КонецЕсли;
ПользовательскиеНастройкиКД = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки;
Для Каждого ПользовательскаяНастройкаКД Из ПользовательскиеНастройкиКД.Элементы Цикл
Тип = ОтчетыКлиентСервер.ТипНастройкиСтрокой(ТипЗнч(ПользовательскаяНастройкаКД));
@@ -811,7 +816,7 @@
Возврат;
КонецЕсли;
ВариантФормы = Найденные[0];
- УстановитьТекущийВариант(ВариантФормы.КлючВарианта);
+ ЗагрузитьВариант(ВариантФормы.КлючВарианта);
КлючУникальности = Лев(КлючУникальности, Найти(КлючУникальности, "/")) + "КлючВарианта." + ВариантФормы.КлючВарианта;
Если НастройкиОтчета.ФормироватьСразу Тогда
ПодключитьОбработчикОжидания("Сформировать", 0.1, Истина);
@@ -1002,6 +1007,19 @@
&НаКлиенте
Процедура ПоказатьДиалогОтправкиПоЭлектроннойПочте()
+ ОписаниеОповещения = Новый ОписаниеОповещения("ПоказатьДиалогОтправкиПоЭлектроннойПочтеЗавершение", ЭтотОбъект);
+ Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда
+ МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент");
+ МодульРаботаСПочтовымиСообщениямиКлиент.ПроверитьНаличиеУчетнойЗаписиДляОтправкиПочты(ОписаниеОповещения);
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПоказатьДиалогОтправкиПоЭлектроннойПочтеЗавершение(УчетнаяЗаписьНастроена, ДополнительныеПараметры) Экспорт
+ Если УчетнаяЗаписьНастроена <> Истина Тогда
+ Возврат;
+ КонецЕсли;
+
ТабличныеДокументы = Новый СписокЗначений;
ТабличныеДокументы.Добавить(ЭтотОбъект.ОтчетТабличныйДокумент, ЭтотОбъект.ОтчетНаименованиеТекущегоВарианта);
@@ -1012,7 +1030,7 @@
ПараметрыФормы.Вставить("Тема", ЭтотОбъект.ОтчетНаименованиеТекущегоВарианта);
ПараметрыФормы.Вставить("Заголовок", ФормаЗаголовок);
- ОткрытьФорму("ОбщаяФорма.ОтправкаТабличныхДокументовПоПочте", ПараметрыФормы, , );
+ ОткрытьФорму("ОбщаяФорма.ОтправкаТабличныхДокументовПоПочте", ПараметрыФормы);
КонецПроцедуры
&НаКлиенте
@@ -1049,22 +1067,20 @@
&НаСервере
Процедура ВидимостьДоступностьКорректность(Изменения = "")
- ПоказыватьКомандыВариантовОтчетов = РежимВариантаОтчета И ВидимостьКомандВариантовОтчетов;
+ ПоказыватьКомандыВариантовОтчетов = РежимВариантаОтчета И НастройкиОтчета.РазрешеноМенятьВарианты;
Если Изменения = "" Тогда
- // Скрытие кнопки выбора варианта из расшифровки.
- Элементы.ВыбратьВариант.Видимость = Не РежимРасшифровки;
-
// Вычисление параметров отображения.
- ПользовательскиеНастройкиКД = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки;
- ЕстьМедленныеНастройки = РежимВариантаОтчета И ПользовательскиеНастройкиКД.Элементы.Количество() > 0;
+ ЕстьНастройки = ЕстьБыстрыеНастройки Или ЕстьОбычныеНастройки;
// Применение параметров отображения.
- Элементы.ВсеНастройки_Левая.Видимость = ПоказыватьКомандыВариантовОтчетов Или ЕстьМедленныеНастройки;
- Элементы.ВсеНастройки.Видимость = ПоказыватьКомандыВариантовОтчетов Или ЕстьМедленныеНастройки;
+ Элементы.ВсеНастройки_Левая.Видимость = ПоказыватьКомандыВариантовОтчетов Или ЕстьОбычныеНастройки;
+ Элементы.ВсеНастройки.Видимость = ПоказыватьКомандыВариантовОтчетов Или ЕстьОбычныеНастройки;
Элементы.ГруппаНастройкиОтчета_Левая.Видимость = ПоказыватьКомандыВариантовОтчетов;
- Элементы.ГруппаНастройкиОтчета.Видимость = ПоказыватьКомандыВариантовОтчетов;
- Элементы.ГруппаПользовательскиеНастройки.Видимость = ПоказыватьКомандыВариантовОтчетов И ЕстьМедленныеНастройки;
+ Элементы.ВыбратьВариант.Видимость = ПоказыватьКомандыВариантовОтчетов И Не РежимРасшифровки;
+ Элементы.СохранитьВариант.Видимость = ПоказыватьКомандыВариантовОтчетов;
+ Элементы.ИзменитьВариант.Видимость = ПоказыватьКомандыВариантовОтчетов;
+ Элементы.ГруппаПользовательскиеНастройки.Видимость = ПоказыватьКомандыВариантовОтчетов И ЕстьНастройки;
// Формировать сразу.
Элементы.ФормироватьСразу.Пометка = НастройкиОтчета.ФормироватьСразу;
@@ -1131,6 +1147,8 @@
УсловияВывода.Вставить("ТолькоБыстрые", Истина);
УсловияВывода.Вставить("ИдентификаторТекущегоУзлаКД", Неопределено);
Информация = ОтчетыСервер.РасширеннаяИнформацияОНастройках(Отчет.КомпоновщикНастроек, ЭтотОбъект, УсловияВывода);
+ ЕстьБыстрыеНастройки = Информация.ЕстьБыстрыеНастройки;
+ ЕстьОбычныеНастройки = Информация.ЕстьОбычныеНастройки;
// Удаление элементов старых настроек.
БыстрыеНастройкиУдалитьСтарыеЭлементыИКоманды(ПараметрыЗаполнения);
@@ -1305,6 +1323,16 @@
Возврат СтандартныеПодсистемыКлиентСервер.СуммаЯчеек(ОтчетТабличныйДокумент, ВыделенныеОбласти);
КонецФункции
+&НаСервере
+Процедура ЗагрузитьВариант(КлючВарианта)
+ УстановитьТекущийВариант(КлючВарианта);
+ ОтображениеСостояния = Элементы.ОтчетТабличныйДокумент.ОтображениеСостояния;
+ ОтображениеСостояния.Видимость = Истина;
+ ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.Неактуальность;
+ ОтображениеСостояния.Картинка = БиблиотекаКартинок.Информация32;
+ ОтображениеСостояния.Текст = НСтр("ru = 'Выбран другой вариант отчета. Нажмите ""Сформировать"" для получения отчета.'");
+КонецПроцедуры
+
////////////////////////////////////////////////////////////////////////////////
// Сервер
diff --git a/SSL/src/CommonForms/ЭлектроннаяПодпись/Help/ru.html b/SSL/src/CommonForms/ЭлектроннаяПодпись/Help/ru.html
index 5cf550822..e73704c9c 100644
--- a/SSL/src/CommonForms/ЭлектроннаяПодпись/Help/ru.html
+++ b/SSL/src/CommonForms/ЭлектроннаяПодпись/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для просмотра основных свойств электронной подписи.
Электронная подпись - реквизит электронного документа, с помощью которого можно удостовериться в неизменности электронного документа с момента его подписи. Контроль неизменности электронного документа осуществляется в результате проверки соответствия электронной подписи и документа, а также проверки действительности сертификата. Контроль неизменности электронного документа можно выполнить в любой момент времени.
С помощью электронной подписи можно:
diff --git a/SSL/src/CommonModules/АдминистрированиеКластераCOMКлиентСервер/Module.bsl b/SSL/src/CommonModules/АдминистрированиеКластераCOMКлиентСервер/Module.bsl
index ea76d7448..2726914df 100644
--- a/SSL/src/CommonModules/АдминистрированиеКластераCOMКлиентСервер/Module.bsl
+++ b/SSL/src/CommonModules/АдминистрированиеКластераCOMКлиентСервер/Module.bsl
@@ -120,7 +120,7 @@
ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
- а = ИнформационнаяБаза.SessionsDenied;
+ СеансыЗапрещены = ИнформационнаяБаза.SessionsDenied;
ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(
ИнформационнаяБаза,
@@ -386,30 +386,47 @@
Кластер,
ПараметрыАдминистрированияИБ.ИмяВКластере);
- Сеансы = ПолучитьСеансы(СоединениеСАгентомСервера, Кластер, ОписаниеИнформационнойБазы, Фильтр, Ложь);
+ КоличествоПопыток = 3;
+ ВсеСеансыУдалены = Ложь;
- Для Каждого Сеанс Из Сеансы Цикл
+ Для ТекущаяПопытка = 0 По КоличествоПопыток Цикл
- Попытка
+ Сеансы = ПолучитьСеансы(СоединениеСАгентомСервера, Кластер, ОписаниеИнформационнойБазы, Фильтр, Ложь);
+
+ Если Сеансы.Количество() = 0 Тогда
- СоединениеСАгентомСервера.TerminateSession(Кластер, Сеанс);
+ ВсеСеансыУдалены = Истина;
+ Прервать;
- Исключение
+ ИначеЕсли ТекущаяПопытка = КоличествоПопыток Тогда
- // Сеанс мог завершиться к моменту вызова TerminateSession.
+ Прервать;
- ОтборСеансов = Новый Структура("Номер", Сеанс.Номер);
+ КонецЕсли;
+
+ Для каждого Сеанс Из Сеансы Цикл
- Если ПолучитьСеансы(СоединениеСАгентомСервера, Кластер, ОписаниеИнформационнойБазы, ОтборСеансов, Ложь).Количество() > 0 Тогда
- ВызватьИсключение;
- Иначе
+ Попытка
+
+ СоединениеСАгентомСервера.TerminateSession(Кластер, Сеанс);
+
+ Исключение
+
+ // Сеанс мог завершиться к моменту вызова TerminateSession.
Продолжить;
- КонецЕсли;
+
+ КонецПопытки;
- КонецПопытки;
+ КонецЦикла;
КонецЦикла;
+ Если НЕ ВсеСеансыУдалены Тогда
+
+ ВызватьИсключение НСтр("ru = 'Не удалось удалить сеансы.'");
+
+ КонецЕсли;
+
КонецПроцедуры
#КонецОбласти
@@ -534,44 +551,66 @@
ПараметрыАдминистрированияКластера.ПортКластера,
ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
-
- ПроцессыИСоединения = ПолучитьСоединения(
- COMСоединитель,
- СоединениеСАгентомСервера,
- Кластер,
- ПараметрыАдминистрированияИБ,
- Фильтр,
- Ложь);
-
- Для Каждого ПроцессИСоединение Из ПроцессыИСоединения Цикл
- Попытка
+ Значение = Новый Массив;
+ Значение.Добавить("1CV8"); // идентификатор приложения 1С:Предприятие в режиме запуска "Толстый клиент"
+ Значение.Добавить("1CV8C"); // идентификатор приложения 1С:Предприятие в режиме запуска "Тонкий клиент"
+ Значение.Добавить("WebClient"); // идентификатор приложения 1С:Предприятие в режиме запуска "Веб-клиент"
+ Значение.Добавить("Designer"); // идентификатор приложения Конфигуратор
+ Значение.Добавить("COMConnection"); // идентификатор сессии внешнего соединения 1С:Предприятия через COM
+ Значение.Добавить("WSConnection"); // идентификатор сессии Web-сервиса
+ Значение.Добавить("BackgroundJob"); // идентификатор сессии обработки заданий
+ Значение.Добавить("WebServerExtension"); // идентификатор расширения Web-сервера
+
+ АдминистрированиеКластераКлиентСервер.ДобавитьУсловиеФильтра(Фильтр, "ИдентификаторКлиентскогоПриложения", ВидСравнения.ВСписке, Значение);
+
+ КоличествоПопыток = 3;
+ ВсеСоединенияРазорваны = Ложь;
+
+ Для ТекущаяПопытка = 0 По КоличествоПопыток Цикл
+
+ Соединения = ПолучитьСоединения(
+ COMСоединитель,
+ СоединениеСАгентомСервера,
+ Кластер,
+ ПараметрыАдминистрированияИБ,
+ Фильтр,
+ Ложь);
+
+ Если Соединения.Количество() = 0 Тогда
- ПроцессИСоединение.СоединениеСРабочимПроцессом.Disconnect(ПроцессИСоединение.Соединение);
+ ВсеСоединенияРазорваны = Истина;
+ Прервать;
- Исключение
+ ИначеЕсли ТекущаяПопытка = КоличествоПопыток Тогда
- // Соединение могло уже завершиться к моменту вызова Disconnect.
+ Прервать;
- ОтборСоединений = Новый Структура("Номер", ПроцессИСоединение.Соединение.Номер);
+ КонецЕсли;
+
+ Для каждого Соединение Из Соединения Цикл
- ОписанияСоединений = ПолучитьСоединения(
- COMСоединитель,
- СоединениеСАгентомСервера,
- Кластер,
- ПараметрыАдминистрированияИБ,
- ОтборСоединений);
-
- Если ОписанияСоединений.Количество() > 0 Тогда
- ВызватьИсключение;
- Иначе
+ Попытка
+
+ Соединение.СоединениеСРабочимПроцессом.Disconnect(Соединение.Соединение);
+
+ Исключение
+
+ // Соединение могло уже завершиться к моменту вызова Disconnect.
Продолжить;
- КонецЕсли;
+
+ КонецПопытки;
- КонецПопытки;
+ КонецЦикла;
КонецЦикла;
+ Если НЕ ВсеСоединенияРазорваны Тогда
+
+ ВызватьИсключение НСтр("ru = 'Не удалось разорвать соединения.'");
+
+ КонецЕсли;
+
КонецПроцедуры
#КонецОбласти
@@ -1269,33 +1308,48 @@
Соединения = Новый Массив();
Словарь = СловарьСвойствСоединений();
- СоединениеСРабочимПроцессом = СоединениеСРабочимПроцессом(COMСоединитель, СоединениеСАгентомСервера, Кластер);
-
- СоединениеСРабочимПроцессом.AddAuthentication(ИмяАдминистратораИБ, ПарольАдминистратораИБ);
-
- Для Каждого ИнформационнаяБаза Из СоединениеСРабочимПроцессом.GetInfoBases() Цикл
+ // Рабочие процессы, зарегистрированные в кластере
+ Для каждого РабочийПроцесс Из СоединениеСАгентомСервера.GetWorkingProcesses(Кластер) Цикл
- Если ИнформационнаяБаза.Name = ИмяВКластере Тогда
+ // Административное соединение с рабочим процессом
+ СтрокаСоединенияСРабочимПроцессом = РабочийПроцесс.HostName + ":" + Формат(РабочийПроцесс.MainPort, "ЧГ=");
+ СоединениеСРабочимПроцессом = COMСоединитель.ConnectWorkingProcess(СтрокаСоединенияСРабочимПроцессом);
+
+ // Получение информационных баз (аутентификация не требуется)
+ Для каждого ИнформационнаяБаза Из СоединениеСРабочимПроцессом.GetInfoBases() Цикл
- Для Каждого Соединение Из СоединениеСРабочимПроцессом.GetInfoBaseConnections(ИнформационнаяБаза) Цикл
+ // Это требуемая информационная база
+ Если ИнформационнаяБаза.Name = ИмяВКластере Тогда
- ОписаниеСоединения = ОписаниеОбъектаОбъектнойМоделиCOMАдминистратора(Соединение, Словарь);
+ // Для получение соединений с информационной базой требуется аутентификация
+ СоединениеСРабочимПроцессом.AddAuthentication(ИмяАдминистратораИБ, ПарольАдминистратораИБ);
- Если АдминистрированиеКластераКлиентСервер.ПроверитьУсловияФильтра(ОписаниеСоединения, Фильтр) Тогда
+ // Получение соединений с информационной базой
+ Для каждого Соединение Из СоединениеСРабочимПроцессом.GetInfoBaseConnections(ИнформационнаяБаза) Цикл
- Если Описания Тогда
- Соединения.Добавить(ОписаниеСоединения);
- Иначе
- Соединения.Добавить(Новый Структура("СоединениеСРабочимПроцессом, Соединение", СоединениеСРабочимПроцессом, Соединение));
+ ОписаниеСоединения = ОписаниеОбъектаОбъектнойМоделиCOMАдминистратора(Соединение, Словарь);
+
+ // Проверка соединения на соответствие требуемым фильтрам
+ Если АдминистрированиеКластераКлиентСервер.ПроверитьУсловияФильтра(ОписаниеСоединения, Фильтр) Тогда
+
+ Если Описания Тогда
+
+ Соединения.Добавить(ОписаниеСоединения);
+
+ Иначе
+
+ Соединения.Добавить(Новый Структура("СоединениеСРабочимПроцессом, Соединение", СоединениеСРабочимПроцессом, Соединение));
+
+ КонецЕсли;
+
КонецЕсли;
-
- КонецЕсли;
+
+ КонецЦикла;
+
+ КонецЕсли;
- КонецЦикла;
-
-
- КонецЕсли;
-
+ КонецЦикла;
+
КонецЦикла;
Возврат Соединения;
diff --git a/SSL/src/CommonModules/АдминистрированиеКластераRASКлиентСервер/Module.bsl b/SSL/src/CommonModules/АдминистрированиеКластераRASКлиентСервер/Module.bsl
index afbc1a9e1..bdeac5e38 100644
--- a/SSL/src/CommonModules/АдминистрированиеКластераRASКлиентСервер/Module.bsl
+++ b/SSL/src/CommonModules/АдминистрированиеКластераRASКлиентСервер/Module.bsl
@@ -102,7 +102,7 @@
Словарь = Новый Структура();
Словарь.Вставить("БлокировкаСеансов", "sessions-deny");
- а = СвойстваИнформационнойБазы(ПараметрыАдминистрированияКластера, ПараметрыАдминистрированияИБ, Словарь);
+ СвойстваИБ = СвойстваИнформационнойБазы(ПараметрыАдминистрированияКластера, ПараметрыАдминистрированияИБ, Словарь);
КонецЕсли;
@@ -254,31 +254,48 @@
ИдентификаторИнформационнойБазы = ПолучитьИнформационнуюБазу(ИдентификаторКластера, ПараметрыАдминистрированияКластера, ПараметрыАдминистрированияИБ);
- Сеансы = ПолучитьСеансы(ИдентификаторКластера, ПараметрыАдминистрированияКластера, ИдентификаторИнформационнойБазы, Фильтр, Ложь);
- Для Каждого Сеанс Из Сеансы Цикл
+ КоличествоПопыток = 3;
+ ВсеСеансыУдалены = Ложь;
+
+ Для ТекущаяПопытка = 0 По КоличествоПопыток Цикл
- Попытка
+ Сеансы = ПолучитьСеансы(ИдентификаторКластера, ПараметрыАдминистрированияКластера, ИдентификаторИнформационнойБазы, Фильтр, Ложь);
+
+ Если Сеансы.Количество() = 0 Тогда
- Параметры.Вставить("session", Сеанс.Получить("session"));
- ВыполнитьКоманду(Шаблон, ПараметрыАдминистрированияКластера, Параметры);
+ ВсеСеансыУдалены = Истина;
+ Прервать;
- Исключение
+ ИначеЕсли ТекущаяПопытка = КоличествоПопыток Тогда
- // Сеанс мог завершиться к моменту вызова rac session terminate.
+ Прервать;
- ОтборСеансов = Новый Структура();
- ОтборСеансов.Вставить("Номер", Сеанс.Получить("session-id"));
+ КонецЕсли;
+
+ Для каждого Сеанс Из Сеансы Цикл
- Если ПолучитьСеансы(ИдентификаторКластера, ПараметрыАдминистрированияКластера, ПараметрыАдминистрированияИБ, ОтборСеансов, Истина).Количество() > 0 Тогда
- ВызватьИсключение;
- Иначе
+ Попытка
+
+ Параметры.Вставить("session", Сеанс.Получить("session"));
+ ВыполнитьКоманду(Шаблон, ПараметрыАдминистрированияКластера, Параметры);
+
+ Исключение
+
+ // Сеанс мог завершиться к моменту вызова rac session terminate.
Продолжить;
- КонецЕсли;
+
+ КонецПопытки;
- КонецПопытки;
+ КонецЦикла;
КонецЦикла;
+ Если НЕ ВсеСеансыУдалены Тогда
+
+ ВызватьИсключение НСтр("ru = 'Не удалось удалить сеансы.'");
+
+ КонецЕсли;
+
КонецПроцедуры
#КонецОбласти
@@ -376,8 +393,6 @@
Шаблон = "%rac connection --cluster=%cluster% --cluster-user=%?cluster-user% --cluster-pwd=%?cluster-pwd% disconnect --process=%process% --connection=%connection% --infobase-user=%?infobase-user% --infobase-pwd=%?infobase-pwd%";
- Параметры = Новый Структура;
-
Параметры = Новый Соответствие();
ИдентификаторКластера = ПолучитьКластер(ПараметрыАдминистрированияКластера);
@@ -388,40 +403,61 @@
Параметры.Вставить("infobase", ИдентификаторИнформационнойБазы);
ЗаполнитьПараметрыАутентификацииВИБ(ПараметрыАдминистрированияИБ, Параметры);
- Соединения = ПолучитьСоединения(ИдентификаторКластера, ПараметрыАдминистрированияКластера, ИдентификаторИнформационнойБазы, ПараметрыАдминистрированияИБ, Фильтр, Ложь);
- Для Каждого Соединение Из Соединения Цикл
+ Значение = Новый Массив;
+ Значение.Добавить("1CV8"); // идентификатор приложения 1С:Предприятие в режиме запуска "Толстый клиент"
+ Значение.Добавить("1CV8C"); // идентификатор приложения 1С:Предприятие в режиме запуска "Тонкий клиент"
+ Значение.Добавить("WebClient"); // идентификатор приложения 1С:Предприятие в режиме запуска "Веб-клиент"
+ Значение.Добавить("Designer"); // идентификатор приложения Конфигуратор
+ Значение.Добавить("COMConnection"); // идентификатор сессии внешнего соединения 1С:Предприятия через COM
+ Значение.Добавить("WSConnection"); // идентификатор сессии Web-сервиса
+ Значение.Добавить("BackgroundJob"); // идентификатор сессии обработки заданий
+ Значение.Добавить("WebServerExtension"); // идентификатор расширения Web-сервера
+
+ АдминистрированиеКластераКлиентСервер.ДобавитьУсловиеФильтра(Фильтр, "ИдентификаторКлиентскогоПриложения", ВидСравнения.ВСписке, Значение);
+
+ КоличествоПопыток = 3;
+ ВсеСоединенияРазорваны = Ложь;
+
+ Для ТекущаяПопытка = 0 По КоличествоПопыток Цикл
+
+ Соединения = ПолучитьСоединения(ИдентификаторКластера, ПараметрыАдминистрированияКластера, ИдентификаторИнформационнойБазы, ПараметрыАдминистрированияИБ, Фильтр, Ложь);
- Попытка
+ Если Соединения.Количество() = 0 Тогда
- Параметры.Вставить("process", Соединение.Получить("process"));
- Параметры.Вставить("connection", Соединение.Получить("connection"));
- ВыполнитьКоманду(Шаблон, ПараметрыАдминистрированияКластера, Параметры);
+ ВсеСоединенияРазорваны = Истина;
+ Прервать;
- Исключение
+ ИначеЕсли ТекущаяПопытка = КоличествоПопыток Тогда
- // Соединение могло уже завершиться к моменту вызова rac connection disconnect.
+ Прервать;
- ОтборСоединений = Новый Структура();
- ОтборСоединений.Вставить("Номер", Соединение.Получить("conn-id"));
+ КонецЕсли;
+
+ Для каждого Соединение Из Соединения Цикл
- ОписанияСоединений = ПолучитьСоединения(
- ИдентификаторКластера,
- ПараметрыАдминистрированияКластера,
- ИдентификаторИнформационнойБазы,
- ПараметрыАдминистрированияИБ,
- ОтборСоединений,
- Истина);
-
- Если ОписанияСоединений.Количество() > 0 Тогда
- ВызватьИсключение;
- Иначе
+ Попытка
+
+ Параметры.Вставить("process", Соединение.Получить("process"));
+ Параметры.Вставить("connection", Соединение.Получить("connection"));
+ ВыполнитьКоманду(Шаблон, ПараметрыАдминистрированияКластера, Параметры);
+
+ Исключение
+
+ // Соединение могло уже завершиться к моменту вызова rac connection disconnect.
Продолжить;
- КонецЕсли;
+
+ КонецПопытки;
- КонецПопытки;
+ КонецЦикла;
КонецЦикла;
+ Если НЕ ВсеСоединенияРазорваны Тогда
+
+ ВызватьИсключение НСтр("ru = 'Не удалось разорвать соединения.'");
+
+ КонецЕсли;
+
КонецПроцедуры
#КонецОбласти
@@ -734,7 +770,7 @@
//
// Возвращаемое значение: Массив(Структура).
//
-Функция ПолучитьРабочиеСерверы(Знач ИдентификаторКластера, Знач ПараметрыАдминистрированияКластера, Фильтр = Неопределено)
+Функция ПолучитьРабочиеСерверы(Знач ИдентификаторКластера, Знач ПараметрыАдминистрированияКластера, Знач Фильтр = Неопределено)
Шаблон = "%rac server --cluster=%cluster% --cluster-user=%?cluster-user% --cluster-pwd=%?cluster-pwd% list";
@@ -759,7 +795,7 @@
//
// Возвращаемое значение: Массив(Структура).
//
-Функция ПолучитьИнформационныеБазы(Знач ИдентификаторКластера, Знач ПараметрыАдминистрированияКластера, Фильтр = Неопределено)
+Функция ПолучитьИнформационныеБазы(Знач ИдентификаторКластера, Знач ПараметрыАдминистрированияКластера, Знач Фильтр = Неопределено)
Шаблон = "%rac infobase summary --cluster=%cluster% --cluster-user=%?cluster-user% --cluster-pwd=%?cluster-pwd% list";
@@ -809,7 +845,7 @@
//
// Возвращаемое значение: Массив(Структура).
//
-Функция ПолучитьРабочиеПроцессы(Знач ИдентификаторКластера, Знач ПараметрыАдминистрированияКластера, Фильтр = Неопределено)
+Функция ПолучитьРабочиеПроцессы(Знач ИдентификаторКластера, Знач ПараметрыАдминистрированияКластера, Знач Фильтр = Неопределено)
Шаблон = "%rac process --cluster=%cluster% --cluster-user=%?cluster-user% --cluster-pwd=%?cluster-pwd% list --server=%server%";
@@ -825,9 +861,7 @@
ПотокВывода = ВыполнитьКоманду(Шаблон, ПараметрыАдминистрированияКластера, Параметры);
РабочиеПроцессыСервера = ПарсерВывода(ПотокВывода, Неопределено, Фильтр);
Для Каждого РабочийПроцесс Из РабочиеПроцессыСервера Цикл
- Если РабочийПроцесс.Получить("running") = "yes" И РабочийПроцесс.Получить("is-enable") = "yes" Тогда
- Результат.Добавить(РабочийПроцесс);
- КонецЕсли;
+ Результат.Добавить(РабочийПроцесс);
КонецЦикла;
КонецЦикла;
@@ -880,7 +914,7 @@
// (описание структур - см. АдминистрированиеКластераКлиентСервер.СвойстваСеанса()) или массив соответствий,
// описывающих свойства сеансов в нотации утилиты rac (при ИспользоватьСловарь = Ложь).
//
-Функция ПолучитьСеансы(Знач ИдентификаторКластера, Знач ПараметрыАдминистрированияКластера, Знач ИдентификаторИнформационнойБазы, Фильтр = Неопределено, Знач ИспользоватьСловарь = Истина) Экспорт
+Функция ПолучитьСеансы(Знач ИдентификаторКластера, Знач ПараметрыАдминистрированияКластера, Знач ИдентификаторИнформационнойБазы, Знач Фильтр = Неопределено, Знач ИспользоватьСловарь = Истина) Экспорт
Шаблон = "%rac session --cluster=%cluster% --cluster-user=%?cluster-user% --cluster-pwd=%?cluster-pwd% list --infobase=%infobase%";
@@ -1564,6 +1598,7 @@
Исключение
// Обработка исключения не требуется. Ожидаемое исключение - ошибка
// преобразования к типу Дата.
+ Возврат ЭлементВывода;
КонецПопытки;
Возврат ЭлементВывода;
diff --git a/SSL/src/CommonModules/АдминистрированиеКластераКлиентСервер/Module.bsl b/SSL/src/CommonModules/АдминистрированиеКластераКлиентСервер/Module.bsl
index ccc631020..0d83577cd 100644
--- a/SSL/src/CommonModules/АдминистрированиеКластераКлиентСервер/Module.bsl
+++ b/SSL/src/CommonModules/АдминистрированиеКластераКлиентСервер/Module.bsl
@@ -1097,6 +1097,47 @@
#Область СлужебныеПроцедурыИФункции
+// Добавляет к фильтру новое условие.
+//
+Процедура ДобавитьУсловиеФильтра(Фильтр, Знач Свойство, Знач ВидСравненияЗначений, Знач Значение) Экспорт
+
+ Если Фильтр = Неопределено Тогда
+
+ Если ВидСравненияЗначений = ВидСравнения.Равно Тогда
+
+ Фильтр = Новый Структура;
+ Фильтр.Вставить(Свойство, Значение);
+
+ Иначе
+
+ НовыйЭлементФильтра = Новый Структура("Свойство, ВидСравнения, Значение", Свойство, ВидСравненияЗначений, Значение);
+
+ Фильтр = Новый Массив;
+ Фильтр.Добавить(НовыйЭлементФильтра);
+
+ КонецЕсли;
+
+ ИначеЕсли ТипЗнч(Фильтр) = Тип("Структура") Тогда
+
+ СуществующийЭлементФильтра = Новый Структура("Свойство, ВидСравнения, Значение", Фильтр.Ключ, ВидСравнения.Равно, Фильтр.Значение);
+ НовыйЭлементФильтра = Новый Структура("Свойство, ВидСравнения, Значение", Свойство, ВидСравненияЗначений, Значение);
+
+ Фильтр = Новый Массив;
+ Фильтр.Добавить(СуществующийЭлементФильтра);
+ Фильтр.Добавить(НовыйЭлементФильтра);
+
+ ИначеЕсли ТипЗнч(Фильтр) = Тип("Массив") Тогда
+
+ Фильтр.Добавить(Новый Структура("Свойство, ВидСравнения, Значение", Свойство, ВидСравненияЗначений, Значение));
+
+ Иначе
+
+ ВызватьИсключение НСтр("ru = 'Некорректно задано описание фильтра!'");
+
+ КонецЕсли;
+
+КонецПроцедуры
+
// Проверяет значения свойств объекта на соответствие условиям, указанным в фильтре.
//
// Параметры:
diff --git a/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl
index 8aa9748db..80b7444e7 100644
--- a/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl
+++ b/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl
@@ -174,13 +174,13 @@
КонецЕсли;
Возврат 0;
-
КонецФункции
// Проверка загруженности адресного классификатора.
+//
// Возвращаемое значение:
-// Булево - Истина, если адресный классификатор загружен хотя бы по одному региону, Ложь - в противном случае. Для веб
-// сервиса всегда Истина.
+// Булево - Истина, если адресный классификатор загружен хотя бы по одному региону, Ложь - в противном случае.
+//
Функция КлассификаторЗагружен() Экспорт
Если АдресныйКлассификаторСлужебный.ИсточникДанныхАдресногоКлассификатораВебСервис() Тогда
diff --git a/SSL/src/CommonModules/АдресныйКлассификаторВМоделиСервисаСлужебный/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторВМоделиСервисаСлужебный/Module.bsl
index 0e9d7d1c2..bf518dc8f 100644
--- a/SSL/src/CommonModules/АдресныйКлассификаторВМоделиСервисаСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/АдресныйКлассификаторВМоделиСервисаСлужебный/Module.bsl
@@ -41,9 +41,11 @@
Процедура ДоступныНовыеДанные(Знач Дескриптор, Загружать) Экспорт
Если Дескриптор.DataType = "ФИАС" Тогда
+
Загружать = ПроверитьНаличиеНовыхДанных(Дескриптор);
КонецЕсли;
+
КонецПроцедуры
// Вызывается после вызова ДоступныНовыеДанные, позволяет разобрать данные.
diff --git a/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl
index dff632fc6..25710c248 100644
--- a/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl
+++ b/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl
@@ -134,10 +134,6 @@
Если Результат <> Истина Тогда
// Отказ от установки расширения.
Возврат;
-
- ИначеЕсли Не ПодключитьРасширениеРаботыСФайлами() Тогда
- ПоказатьПредупреждение(, НСтр("ru = 'Расширение для работы с файлами не подключено.'"));
- Возврат;
КонецЕсли;
Форма = ДополнительныеПараметры.Форма;
@@ -162,41 +158,11 @@
Диалог.Каталог = ТекущееЗначение;
- Если Не Диалог.Выбрать() Тогда
- Возврат;
- КонецЕсли;
-
- Результат = Диалог.Каталог;
- ВладелецЗначения[ИмяРеквизита] = Результат;
- ДанныеВыбора = Результат;
-
- Если ДополнительныеПараметры.ОповещениеЗавершения <> Неопределено Тогда
- ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеЗавершения, Результат);
- КонецЕсли;
+ ОписаниеОповещения = Новый ОписаниеОповещения("ВыбратьКаталогЗавершениеОтображенияДиалогаВыбораФайла", ЭтотОбъект, ДополнительныеПараметры);
+ Диалог.Показать(ОписаниеОповещения);
КонецПроцедуры
-// Создает и возвращает временный каталог на клиенте.
-//
-// Возвращаемое значение:
-// Строка - полное имя созданного каталога.
-//
-Функция ВременныйКаталогКлиента() Экспорт
-
-#Если ВебКлиент Тогда
- Разделитель = ПолучитьРазделительПути();
-
- КаталогКлиента = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогВременныхФайлов())
- + Разделитель + Строка(Новый УникальныйИдентификатор) + Разделитель;
-#Иначе
- КаталогКлиента = ПолучитьИмяВременногоФайла();
-#КонецЕсли
-
- СоздатьКаталог(КаталогКлиента);
-
- Возврат КаталогКлиента;
-КонецФункции
-
// Завершение модального получения подтверждения о получении ресурсов на проверку наличия обновления классификатора.
//
Процедура ПолучениеРазрешенияБезопасностиПроверкиНаличияОбновленияАдресныхОбъектов(Знач РезультатЗакрытия, Знач ДополнительныеПараметры) Экспорт
@@ -215,4 +181,146 @@
КонецФункции
+Процедура ВыбратьКаталогЗавершениеОтображенияДиалогаВыбораФайла(Каталог, ДополнительныеПараметры) Экспорт
+
+ Если Каталог <> Неопределено Тогда
+
+ ДополнительныеПараметры.Форма[ДополнительныеПараметры.ПутьКДанным] = Каталог[0];
+
+ Если ДополнительныеПараметры.ОповещениеЗавершения <> Неопределено Тогда
+ ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеЗавершения, Каталог[0]);
+ КонецЕсли;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Проверка на доступность всех необходимых файлов для загрузки.
+//
+// Параметры:
+// КодыРегионов - Массив - содержит числовые значения - коды регионов-субъектов РФ (для последующей
+// загрузки).
+// Каталог - Строка - каталог с проверяемыми файлами.
+// ПараметрыЗагрузки - Структура - содержит поля.
+// * КодИсточникаЗагрузки - Строка - описывает набор анализируемых файлов. Возможные значения: "КАТАЛОГ",
+// "САЙТ, "ИТС".
+// * ПолеОшибки - Строка - имя реквизита для привязки сообщений об ошибке.
+//
+// Возвращаемое значение:
+// Структура - описание результата. Содержит поля.
+// * КодыРегионов - Массив - содержит числовые значения кодов регионов-субъектов для которых доступны
+// все файлы.
+// * ЕстьВсеФайлы - Булево - флаг того, что можно загружать все регионы.
+// * Ошибки - Структура - см. описание ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю.
+// * ФайлыПоРегионам - Соответствие - соответствие файлов регионам. Ключ может быть:
+// - числом (код региона), тогда значение - массив имен файлов, необходимых
+// для загрузки этого региона
+// - символом "*", тогда значение - массив имен файлов, необходимых для
+// загрузки всех регионов.
+//
+Процедура АнализДоступностиФайловКлассификатораВКаталоге(ОписаниеЗавершения, КодыРегионов, Каталог, ПараметрыЗагрузки) Экспорт
+
+ РабочийКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Каталог);
+ ПолеОшибки = ПараметрыЗагрузки.ПолеОшибки;
+
+ Результат = Новый Структура;
+ Результат.Вставить("КодыРегионов", КодыРегионов);
+ Результат.Вставить("ЕстьВсеФайлы", Истина);
+ Результат.Вставить("Ошибки", Неопределено);
+ Результат.Вставить("ФайлыПоРегионам", Новый Соответствие);
+
+ ДополнительныеПараметры = Новый Структура;
+ ДополнительныеПараметры.Вставить("ОтсутствующиеФайлы", Новый Соответствие);
+ ДополнительныеПараметры.Вставить("ОписаниеЗавершения", ОписаниеЗавершения);
+ ДополнительныеПараметры.Вставить("Результат", Результат);
+ ДополнительныеПараметры.Вставить("РабочийКаталог", РабочийКаталог);
+ ДополнительныеПараметры.Вставить("ПолеОшибки", ПолеОшибки);
+ ОписаниеОповещения = Новый ОписаниеОповещения("АнализДоступностиФайловКлассификатораВКаталогеЗавершение", ЭтотОбъект, ДополнительныеПараметры);
+
+ ВыполнитьОбработкуОповещения(ОписаниеОповещения, 0);
+
+КонецПроцедуры
+
+Процедура АнализДоступностиФайловКлассификатораВКаталогеЗавершение(ИндексРегиона, ДополнительныеПараметры) Экспорт
+
+ Если ИндексРегиона <= ДополнительныеПараметры.Результат.КодыРегионов.ВГраница() Тогда
+
+ КодРегиона = ДополнительныеПараметры.Результат.КодыРегионов[ИндексРегиона];
+ // Набор файлов для каждого региона.
+ ДополнительныеПараметры.Результат.ФайлыПоРегионам[КодРегиона] = Новый Массив;
+
+ ИмяФайла = Формат(КодРегиона, "ЧЦ=2; ЧН=; ЧВН=; ЧГ=") + ".ZIP";
+ ДополнительныеПараметры.Вставить("КодРегиона", КодРегиона);
+ ДополнительныеПараметры.Вставить("ИмяФайла", ИмяФайла);
+ ДополнительныеПараметры.Вставить("ИндексРегиона", ИндексРегиона);
+ ОписаниеОповещения = Новый ОписаниеОповещения("АнализДоступностиФайловКлассификатораВКаталогеПослеПоискаФайлов", ЭтотОбъект, ДополнительныеПараметры);
+ НачатьПоискФайлов(ОписаниеОповещения, ДополнительныеПараметры.РабочийКаталог, МаскаФайла(ИмяФайла));
+
+ Иначе // окончание цикла
+
+ // Собираем все в один вызов
+ Представления = АдресныйКлассификаторВызовСервера.ПредставлениеРегионаПоКоду(ДополнительныеПараметры.ОтсутствующиеФайлы);
+
+ Для Каждого КлючЗначение Из Представления Цикл
+ СообщениеОбОшибке = НСтр("ru = 'Для региона ""%1"" не найден файл данных ""%2""'") + Символы.ПС;
+ СообщениеОбОшибке = СообщениеОбОшибке + НСтр("ru = 'Актуальные адресные сведения можно загрузить по адресу http://its.1c.ru/download/fias'");
+
+ ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(ДополнительныеПараметры.Результат.Ошибки, ДополнительныеПараметры.ПолеОшибки,
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке,
+ КлючЗначение.Значение, ДополнительныеПараметры.ОтсутствующиеФайлы[КлючЗначение.Ключ]), Неопределено);
+ КонецЦикла;
+
+ ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеЗавершения, ДополнительныеПараметры.Результат);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура АнализДоступностиФайловКлассификатораВКаталогеПослеПоискаФайлов(НайденныеФайлы, ДополнительныеПараметры) Экспорт
+
+ СтруктураФайла = Новый Структура("Существует, Имя, ИмяБезРасширения, ПолноеИмя, Путь, Расширение", Ложь);
+ Если НайденныеФайлы.Количество() > 0 Тогда
+
+ СтруктураФайла.Существует = Истина;
+ ЗаполнитьЗначенияСвойств(СтруктураФайла, НайденныеФайлы[0]);
+ КонецЕсли;
+
+ Если СтруктураФайла.Существует Тогда
+ ДополнительныеПараметры.Результат.ФайлыПоРегионам[ДополнительныеПараметры.КодРегиона].Добавить(СтруктураФайла.ПолноеИмя);
+ Иначе
+ ДополнительныеПараметры.Результат.ЕстьВсеФайлы = Ложь;
+ ДополнительныеПараметры.ОтсутствующиеФайлы.Вставить(ДополнительныеПараметры.КодРегиона, ДополнительныеПараметры.ИмяФайла);
+ КонецЕсли;
+
+ АнализДоступностиФайловКлассификатораВКаталогеЗавершение(ДополнительныеПараметры.ИндексРегиона + 1, ДополнительныеПараметры);
+
+КонецПроцедуры
+
+Функция МаскаФайла(ИмяФайла)
+
+ СистемнаяИнформация = Новый СистемнаяИнформация;
+ Платформа = СистемнаяИнформация.ТипПлатформы;
+
+ НеУчитыватьРегистр = Платформа = ТипПлатформы.Windows_x86 Или Платформа = ТипПлатформы.Windows_x86_64;
+
+ Если НеУчитыватьРегистр Тогда
+ Маска = ВРег(ИмяФайла);
+ Иначе
+ Маска = "";
+ Для Позиция = 1 По СтрДлина(ИмяФайла) Цикл
+ Символ = Сред(ИмяФайла, Позиция, 1);
+ ВерхнийРегистр = ВРег(Символ);
+ НижнийРегистр = НРег(Символ);
+ Если ВерхнийРегистр = НижнийРегистр Тогда
+ Маска = Маска + Символ;
+ Иначе
+ Маска = Маска + "[" + ВерхнийРегистр + НижнийРегистр + "]";
+ КонецЕсли;
+ КонецЦикла;
+ КонецЕсли;
+
+ Возврат Маска;
+
+КонецФункции
+
#КонецОбласти
\ No newline at end of file
diff --git a/SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/Module.bsl
index 67af7f67a..0383e0fc6 100644
--- a/SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/Module.bsl
+++ b/SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/Module.bsl
@@ -12,122 +12,6 @@
КонецФункции
-// Поиск первого файла по маске без учета регистра (особенностей операционной системы).
-//
-// Параметры:
-// Каталог - Строка - каталог, в котором ищется файл.
-// МаскаИмениФайла - Строка - имя искомого файла.
-//
-// Возвращаемое значение:
-// Структура - описание найденного файла. Содержит поля:
-// * Существует - Булево - флаг того, что указанный файл существует.
-// * Имя - Строка - характеристика найденного файла, см. описания типа Файл.
-// * ИмяБезРасширения - Строка - характеристика найденного файла, см. описания типа Файл.
-// * ПолноеИмя - Строка - характеристика найденного файла, см. описания типа Файл.
-// * Путь - Строка - характеристика найденного файла, см. описания типа Файл.
-// * Расширение - Строка - характеристика найденного файла, см. описания типа Файл.
-//
-Функция НайтиФайл(Каталог, МаскаИмениФайла) Экспорт
-
- СистемнаяИнформация = Новый СистемнаяИнформация;
- Платформа = СистемнаяИнформация.ТипПлатформы;
-
- НеУчитыватьРегистр = Платформа = ТипПлатформы.Windows_x86 Или Платформа = ТипПлатформы.Windows_x86_64;
-
- Если НеУчитыватьРегистр Тогда
- Маска = ВРег(МаскаИмениФайла);
- Иначе
- Маска = "";
- Для Позиция = 1 По СтрДлина(МаскаИмениФайла) Цикл
- Символ = Сред(МаскаИмениФайла, Позиция, 1);
- ВерхнийРегистр = ВРег(Символ);
- НижнийРегистр = НРег(Символ);
- Если ВерхнийРегистр = НижнийРегистр Тогда
- Маска = Маска + Символ;
- Иначе
- Маска = Маска + "[" + ВерхнийРегистр + НижнийРегистр + "]";
- КонецЕсли;
- КонецЦикла;
- КонецЕсли;
-
- Результат = Новый Структура("Существует, Имя, ИмяБезРасширения, ПолноеИмя, Путь, Расширение", Ложь);
- Варианты = НайтиФайлы(Каталог, Маска);
- Если Варианты.Количество() > 0 Тогда
- Результат.Существует = Истина;
- ЗаполнитьЗначенияСвойств(Результат, Варианты[0]);
- КонецЕсли;
-
- Возврат Результат;
-КонецФункции
-
-// Проверка на доступность всех необходимых файлов для загрузки.
-//
-// Параметры:
-// КодыРегионов - Массив - содержит числовые значения - коды регионов-субъектов РФ (для последующей
-// загрузки).
-// Каталог - Строка - каталог с проверяемыми файлами.
-// ПараметрыЗагрузки - Структура - содержит поля.
-// * КодИсточникаЗагрузки - Строка - описывает набор анализируемых файлов. Возможные значения: "КАТАЛОГ",
-// "САЙТ, "ИТС".
-// * ПолеОшибки - Строка - имя реквизита для привязки сообщений об ошибке.
-//
-// Возвращаемое значение:
-// Структура - описание результата. Содержит поля.
-// * КодыРегионов - Массив - содержит числовые значения кодов регионов-субъектов для которых доступны
-// все файлы.
-// * ЕстьВсеФайлы - Булево - флаг того, что можно загружать все регионы.
-// * Ошибки - Структура - см. описание ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю.
-// * ФайлыПоРегионам - Соответствие - соответствие файлов регионам. Ключ может быть:
-// - числом (код региона), тогда значение - массив имен файлов, необходимых
-// для загрузки этого региона
-// - символом "*", тогда значение - массив имен файлов, необходимых для
-// загрузки всех регионов.
-//
-Функция АнализДоступностиФайловКлассификатораВКаталоге(КодыРегионов, Каталог, ПараметрыЗагрузки) Экспорт
-
- РабочийКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Каталог);
- ПолеОшибки = ПараметрыЗагрузки.ПолеОшибки;
-
- Результат = Новый Структура;
- Результат.Вставить("КодыРегионов", КодыРегионов);
- Результат.Вставить("ЕстьВсеФайлы", Истина);
- Результат.Вставить("Ошибки", Неопределено);
- Результат.Вставить("ФайлыПоРегионам", Новый Соответствие);
-
- ОтсутствующиеФайлы = Новый Соответствие;
-
- Для Каждого КодРегиона Из КодыРегионов Цикл
- // Набор файлов для каждого региона.
- Результат.ФайлыПоРегионам[КодРегиона] = Новый Массив;
-
- ИмяФайла = Формат(КодРегиона, "ЧЦ=2; ЧН=; ЧВН=; ЧГ=") + ".ZIP";
- Файл = НайтиФайл(РабочийКаталог, ИмяФайла);
- Если Файл.Существует Тогда
- Результат.ФайлыПоРегионам[КодРегиона].Добавить(Файл.ПолноеИмя);
- Иначе
- Результат.ЕстьВсеФайлы = Ложь;
- ОтсутствующиеФайлы.Вставить(КодРегиона, ИмяФайла);
- КонецЕсли;
-
- КонецЦикла;
-
- // Собираем все в один вызов
- Представления = АдресныйКлассификаторВызовСервера.ПредставлениеРегионаПоКоду(ОтсутствующиеФайлы);
-
- Для Каждого КлючЗначение Из Представления Цикл
- СообщениеОбОшибке = НСтр("ru = 'Для региона ""%1"" не найден файл данных ""%2""'") + Символы.ПС;
- СообщениеОбОшибке = СообщениеОбОшибке + НСтр("ru = 'Актуальные адресные сведения можно загрузить по адресу http://its.1c.ru/download/fias'");
-
- ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Результат.Ошибки, ПолеОшибки,
- СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- СообщениеОбОшибке,
- КлючЗначение.Значение, ОтсутствующиеФайлы[КлючЗначение.Ключ]), Неопределено
- );
- КонецЦикла;
-
- Возврат Результат;
-КонецФункции
-
// Разделяет исходный текст на наименование и сокращение.
// Сокращением считается последнее слово, отделенное пробельным символом.
//
diff --git a/SSL/src/CommonModules/АдресныйКлассификаторПовтИсп/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторПовтИсп/Module.bsl
index 7c30a1f56..e330d0774 100644
--- a/SSL/src/CommonModules/АдресныйКлассификаторПовтИсп/Module.bsl
+++ b/SSL/src/CommonModules/АдресныйКлассификаторПовтИсп/Module.bsl
@@ -52,4 +52,57 @@
КонецФункции
+// Возвращает данные о загруженных регионах
+//
+// Возвращаемое значение:
+// Соответствие - Ключ - код субъекта РФ, Значение - Истина, если регион загружен
+//
+Функция СведенияОЗагруженныхРегионах() Экспорт
+
+ Результат = Новый Соответствие;
+
+ Запрос = Новый Запрос;
+ Запрос.Текст =
+ "ВЫБРАТЬ
+ | РодительскийОбъект.КодСубъектаРФ КАК КодСубъектаРФ,
+ | РодительскийОбъект.Наименование КАК Наименование,
+ | РодительскийОбъект.Сокращение КАК Сокращение,
+ | ВЫБОР
+ | КОГДА 1 В
+ | (ВЫБРАТЬ ПЕРВЫЕ 1
+ | 1
+ | ИЗ
+ | РегистрСведений.АдресныеОбъекты
+ | ГДЕ
+ | РегистрСведений.АдресныеОбъекты.Уровень В (2, 3, 4, 5, 6)
+ | И РегистрСведений.АдресныеОбъекты.КодСубъектаРФ = Регион.КодСубъектаРФ)
+ | ТОГДА ИСТИНА
+ | ИНАЧЕ ЛОЖЬ
+ | КОНЕЦ КАК РегионЗагружен
+ |ИЗ
+ | РегистрСведений.АдресныеОбъекты КАК РодительскийОбъект
+ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК Регион
+ | ПО (Регион.Уровень = 1)
+ | И (Регион.КодСубъектаРФ = РодительскийОбъект.КодСубъектаРФ)
+ | И (Регион.КодОкруга = 0)
+ | И (Регион.КодРайона = 0)
+ | И (Регион.КодГорода = 0)
+ | И (Регион.КодВнутригородскогоРайона = 0)
+ | И (Регион.КодНаселенногоПункта = 0)
+ | И (Регион.КодУлицы = 0)
+ | И (Регион.КодДополнительногоЭлемента = 0)
+ | И (Регион.КодПодчиненногоЭлемента = 0)
+ |ГДЕ
+ | РодительскийОбъект.Уровень = 1";
+
+ РезультатЗапроса = Запрос.Выполнить().Выбрать();
+
+ Пока РезультатЗапроса.Следующий() Цикл
+ Результат.Вставить(РезультатЗапроса.КодСубъектаРФ, РезультатЗапроса.РегионЗагружен);
+ КонецЦикла;
+
+ Возврат Результат;
+
+КонецФункции
+
#КонецОбласти
\ No newline at end of file
diff --git a/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl
index 75c85beb6..e4e531b40 100644
--- a/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl
@@ -159,6 +159,7 @@
СтрокаРезультата = Данные.Добавить();
СтрокаРезультата.Идентификатор = Новый УникальныйИдентификатор(ПерваяЗапись);
СтрокаРезультата.Представление = Строка.Presentation;
+ СтрокаРезультата.Неактуален = НЕ Строка.Actual;
КонецЦикла;
КонецПроцедуры
@@ -185,7 +186,9 @@
| АдресныеОбъекты.Наименование КАК Наименование,
| АдресныеОбъекты.Сокращение КАК Сокращение,
| АдресныеОбъекты.Дополнительно КАК Дополнительно,
- | АдресныеОбъекты.КодКЛАДР КАК КодКЛАДР
+ | АдресныеОбъекты.КодКЛАДР КАК КодКЛАДР,
+ | АдресныеОбъекты.Актуален КАК Актуален,
+ | ВЫБОР КОГДА АдресныеОбъекты.Актуален ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА КОНЕЦ КАК Неактуален
|ПОМЕСТИТЬ АдресаПоИндексу
|ИЗ
| РегистрСведений.ДомаЗданияСтроения КАК ДомаЗданияСтроения
@@ -214,7 +217,9 @@
| АдресныеОбъекты.Наименование,
| АдресныеОбъекты.Сокращение,
| АдресныеОбъекты.Дополнительно,
- | АдресныеОбъекты.КодКЛАДР
+ | АдресныеОбъекты.КодКЛАДР,
+ | АдресныеОбъекты.Актуален КАК Актуален,
+ | ВЫБОР КОГДА АдресныеОбъекты.Актуален ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА КОНЕЦ КАК Неактуален
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
|ГДЕ
@@ -244,7 +249,9 @@
| Подчиненный.Сокращение КАК ПодчиненныйСокращение,
| АдресныйОбъект.Идентификатор КАК Идентификатор,
| АдресныйОбъект.Наименование КАК Наименование,
- | АдресныйОбъект.Сокращение КАК Сокращение
+ | АдресныйОбъект.Сокращение КАК Сокращение,
+ | АдресныйОбъект.Актуален КАК Актуален,
+ | АдресныйОбъект.Неактуален КАК Неактуален
|ИЗ
| АдресаПоИндексу КАК АдресныйОбъект
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК СубъектРФ
@@ -436,7 +443,7 @@
// Убираем общие, из оставшихся будет полное наименование.
ЗаполнитьЗначенияСвойств(Строка, Пустые);
СтрокаРезультата = Данные.Добавить();
-
+ СтрокаРезультата.Неактуален = Строка.Неактуален;
СтрокаРезультата.Идентификатор = Строка.Идентификатор;
Представление = "";
@@ -586,6 +593,12 @@
ПерваяЗапись = ?(ЗначениеЗаполнено(ДополнительныеПараметры.ПерваяЗапись), Строка(ДополнительныеПараметры.ПерваяЗапись), Неопределено);
Сортировка = ?(ЗначениеЗаполнено(ДополнительныеПараметры.Сортировка), Строка(ДополнительныеПараметры.Сортировка), "ASC");
+ Если ЗначениеЗаполнено(ПерваяЗапись) Тогда
+ ДлинаПервойЗаписи = СтрДлина(ПерваяЗапись);
+ ПерваяЗаписьСтрока = Лев("00000000-0000-0000-0000-000000000000", 36 - ДлинаПервойЗаписи) + ПерваяЗапись;
+ ПерваяЗапись = Новый УникальныйИдентификатор(ПерваяЗаписьСтрока);
+ КонецЕсли;
+
Порция = Сервис.Select(РодительУровня, Уровень, ПерваяЗапись, Сортировка, РазмерПорции, КодЯзыка, Метаданные.Имя);
Результат.Заголовок = Порция.Title;
Список = Порция.ПолучитьСписок("Item");
@@ -595,32 +608,27 @@
СтрокаРезультата.РегионЗагружен = Истина;
СтрокаРезультата.Идентификатор = Новый УникальныйИдентификатор(Строка.ID);
СтрокаРезультата.Представление = Строка.Presentation;
+ СтрокаРезультата.Неактуален = НЕ Строка.Actual;
КонецЦикла;
Возврат;
КонецЕсли;
- // Выбираем все записи
+ // Выбираем все записи (дополнительные территории)
ПерваяЗапись = Неопределено;
РазмерПорции = 1000;
- Пока Истина Цикл
- Порция = Сервис.Select(РодительУровня, Уровень, ПерваяЗапись, "ASC", РазмерПорции, КодЯзыка, Метаданные.Имя);
- Результат.Заголовок = Порция.Title;
- Список = Порция.ПолучитьСписок("Item");
-
- Если Список.Количество() = 0 Тогда
- Прервать;
- КонецЕсли;
-
- Для Каждого Строка Из Список Цикл
- ПерваяЗапись = Строка.ID;
-
- СтрокаРезультата = Данные.Добавить();
- СтрокаРезультата.РегионЗагружен = Истина;
- СтрокаРезультата.Идентификатор = Новый УникальныйИдентификатор(ПерваяЗапись);
- СтрокаРезультата.Представление = Строка.Presentation;
- КонецЦикла;
+ Порция = Сервис.Select(РодительУровня, Уровень, Неопределено, "ASC", РазмерПорции, КодЯзыка, Метаданные.Имя);
+ Результат.Заголовок = Порция.Title;
+ Список = Порция.ПолучитьСписок("Item");
+
+ Для Каждого Строка Из Список Цикл
+ ПерваяЗапись = Строка.ID;
+ СтрокаРезультата = Данные.Добавить();
+ СтрокаРезультата.РегионЗагружен = Истина;
+ СтрокаРезультата.Идентификатор = Новый УникальныйИдентификатор(ПерваяЗапись);
+ СтрокаРезультата.Представление = Строка.Presentation;
+ СтрокаРезультата.Неактуален = НЕ Строка.Actual;
КонецЦикла;
КонецПроцедуры
@@ -747,9 +755,9 @@
ТекстЗапроса =
#Область ТекстЗапроса
"ВЫБРАТЬ " + ТекстРазмерПорции + "
- | АдресныйОбъект.Идентификатор КАК Идентификатор,
- | АдресныйОбъект.Наименование + "" "" + АдресныйОбъект.Сокращение КАК Представление,
- | ИСТИНА КАК РегионЗагружен,
+ | АдресныйОбъект.Идентификатор КАК Идентификатор,
+ | АдресныйОбъект.Наименование + "" "" + АдресныйОбъект.Сокращение КАК Представление,
+ | ИСТИНА КАК РегионЗагружен,
| ВЫБОР КОГДА АдресныйОбъект.Актуален ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА КОНЕЦ КАК Неактуален
|ИЗ
| РегистрСведений.АдресныеОбъекты КАК РодительскийОбъект
@@ -955,7 +963,11 @@
Источник = ИсточникДанныхАдресногоКлассификатора();
Если ПустаяСтрока(Источник) Тогда
// Локальное, всегда корректное.
- ЗаполнитьСписокАвтоподбораЧастиАдресаВнутр(Результат, Текст, Родитель, УровниЗапроса, ДополнительныеПараметры);
+ Если УровниЗапроса.Найти(7) = Неопределено Тогда
+ СписокАвтоподбораЧастиНаселенногоПункта(Результат, Текст, Родитель, УровниЗапроса, ДополнительныеПараметры);
+ Иначе
+ СписокАвтоподбораЧастиУлицы(Результат, Текст, Родитель, УровниЗапроса, ДополнительныеПараметры);
+ КонецЕсли;
ИначеЕсли Источник = "Сервис1С" Тогда
// Веб сервис 1С, может быть на обслуживании.
@@ -971,6 +983,313 @@
Возврат Результат;
КонецФункции
+// Заполнение данных для автоподбора из загруженных данных для населенного пункта
+//
+Процедура СписокАвтоподбораЧастиНаселенногоПункта(Результат, Текст, Родитель, УровниЗапроса, ДополнительныеПараметры) Экспорт
+
+ ТекстПоиска = ЗамаскироватьСпецсимволыПодобия(Текст);
+
+ Запрос = Новый Запрос;
+ Запрос.УстановитьПараметр("НачалоФразы", ТекстПоиска + "%");
+ Запрос.УстановитьПараметр("Уровни", УровниЗапроса);
+
+ Если ЗначениеЗаполнено(Родитель) И УровниЗапроса.Количество() = 1 Тогда
+ Уровень = УровниЗапроса[0];
+ ТекстОтбора = ?(Уровень > 2, " И РодительскийОбъект.КодОкруга = АдресныйОбъект.КодОкруга", "");
+ ТекстОтбора = ТекстОтбора + ?(Уровень > 3, " И РодительскийОбъект.КодРайона = АдресныйОбъект.КодРайона ", "");
+ ТекстОтбора = ТекстОтбора + ?(Уровень > 4, " И РодительскийОбъект.КодГорода = АдресныйОбъект.КодГорода ", "");
+ ТекстОтбора = ТекстОтбора + ?(Уровень > 5, " И РодительскийОбъект.КодВнутригородскогоРайона = АдресныйОбъект.КодВнутригородскогоРайона ", "");
+ ТекстОтбора = ТекстОтбора + ?(Уровень > 6, " И РодительскийОбъект.КодНаселенногоПункта = АдресныйОбъект.КодНаселенногоПункта ", "");
+
+ Запрос.УстановитьПараметр("Идентификатор", Родитель);
+ ТекстЗапросаПодходящиеОбъекты = "ВЫБРАТЬ ПЕРВЫЕ 200
+ | АдресныйОбъект.Уровень,
+ | АдресныйОбъект.КодСубъектаРФ,
+ | АдресныйОбъект.КодОкруга,
+ | АдресныйОбъект.КодРайона,
+ | АдресныйОбъект.КодГорода,
+ | АдресныйОбъект.КодВнутригородскогоРайона,
+ | АдресныйОбъект.КодНаселенногоПункта,
+ | АдресныйОбъект.Идентификатор,
+ | АдресныйОбъект.Наименование,
+ | АдресныйОбъект.Сокращение
+ |ПОМЕСТИТЬ
+ | ПодходящиеОбъекты
+ |ИЗ
+ | РегистрСведений.АдресныеОбъекты КАК РодительскийОбъект
+ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект
+ | ПО РодительскийОбъект.КодСубъектаРФ = АдресныйОбъект.КодСубъектаРФ " + ТекстОтбора + "
+ |ГДЕ
+ | АдресныйОбъект.Наименование ПОДОБНО &НачалоФразы
+ | И РодительскийОбъект.Идентификатор = &Идентификатор
+ | И АдресныйОбъект.Уровень = " + Строка(Уровень) + "
+ |УПОРЯДОЧИТЬ ПО
+ | АдресныйОбъект.Уровень
+ |ИНДЕКСИРОВАТЬ ПО
+ | АдресныйОбъект.Уровень,
+ | АдресныйОбъект.КодСубъектаРФ,
+ | АдресныйОбъект.КодОкруга,
+ | АдресныйОбъект.КодРайона,
+ | АдресныйОбъект.КодГорода,
+ | АдресныйОбъект.КодВнутригородскогоРайона,
+ | АдресныйОбъект.КодНаселенногоПункта,
+ | АдресныйОбъект.Идентификатор
+ |";
+ Иначе
+ ТекстЗапросаПодходящиеОбъекты = "ВЫБРАТЬ ПЕРВЫЕ 200
+ | АдресныйОбъект.Уровень,
+ | АдресныйОбъект.КодСубъектаРФ,
+ | АдресныйОбъект.КодОкруга,
+ | АдресныйОбъект.КодРайона,
+ | АдресныйОбъект.КодГорода,
+ | АдресныйОбъект.КодВнутригородскогоРайона,
+ | АдресныйОбъект.КодНаселенногоПункта,
+ | АдресныйОбъект.Идентификатор,
+ | АдресныйОбъект.Наименование,
+ | АдресныйОбъект.Сокращение
+ |ПОМЕСТИТЬ
+ | ПодходящиеОбъекты
+ |ИЗ
+ | РегистрСведений.АдресныеОбъекты КАК АдресныйОбъект
+ |ГДЕ
+ | АдресныйОбъект.Наименование ПОДОБНО &НачалоФразы
+ | И АдресныйОбъект.Уровень В (&Уровни)
+ |УПОРЯДОЧИТЬ ПО
+ | АдресныйОбъект.Уровень
+ |ИНДЕКСИРОВАТЬ ПО
+ | АдресныйОбъект.Уровень,
+ | АдресныйОбъект.КодСубъектаРФ,
+ | АдресныйОбъект.КодОкруга,
+ | АдресныйОбъект.КодРайона,
+ | АдресныйОбъект.КодГорода,
+ | АдресныйОбъект.КодВнутригородскогоРайона,
+ | АдресныйОбъект.КодНаселенногоПункта,
+ | АдресныйОбъект.Идентификатор
+ |";
+ КонецЕсли;
+
+ ТекстЗапроса = ТекстЗапросаПодходящиеОбъекты + "
+ |;/////////////////////////////////////////////////////////////////////////////////
+ |
+ |ВЫБРАТЬ ПЕРВЫЕ 20
+ | АдресныйОбъект.КодСубъектаРФ КАК КодСубъектаРФ,
+ | СубъектРФ.Наименование КАК СубъектРФНаименование,
+ | СубъектРФ.Сокращение КАК СубъектРФСокращение,
+ |
+ | Округ.Наименование КАК ОкругНаименование,
+ | Округ.Сокращение КАК ОкругСокращение,
+ |
+ | Район.Наименование КАК РайонНаименование,
+ | Район.Сокращение КАК РайонСокращение,
+ |
+ | Город.Наименование КАК ГородНаименование,
+ | Город.Сокращение КАК ГородСокращение,
+ |
+ | ВнутригородскойРайон.Наименование КАК ВнутригородскойРайонНаименование,
+ | ВнутригородскойРайон.Сокращение КАК ВнутригородскойРайонСокращение,
+ |
+ | НаселенныйПункт.Наименование КАК НаселенныйПунктНаименование,
+ | НаселенныйПункт.Сокращение КАК НаселенныйПунктСокращение,
+ |
+ | АдресныйОбъект.Идентификатор КАК Идентификатор,
+ |
+ | АдресныйОбъект.Наименование КАК Наименование,
+ | АдресныйОбъект.Сокращение КАК Сокращение
+ |
+ |ИЗ
+ | ПодходящиеОбъекты КАК АдресныйОбъект
+ |
+ |ЛЕВОЕ СОЕДИНЕНИЕ
+ | РегистрСведений.АдресныеОбъекты КАК СубъектРФ
+ |ПО
+ | СубъектРФ.Уровень = 1
+ | И СубъектРФ.КодСубъектаРФ = АдресныйОбъект.КодСубъектаРФ
+ | И СубъектРФ.КодОкруга = 0
+ | И СубъектРФ.КодРайона = 0
+ | И СубъектРФ.КодГорода = 0
+ | И СубъектРФ.КодВнутригородскогоРайона = 0
+ | И СубъектРФ.КодНаселенногоПункта = 0
+ | И СубъектРФ.КодУлицы = 0
+ | И СубъектРФ.КодДополнительногоЭлемента = 0
+ | И СубъектРФ.КодПодчиненногоЭлемента = 0
+ | И СубъектРФ.Идентификатор <> АдресныйОбъект.Идентификатор
+ |
+ |ЛЕВОЕ СОЕДИНЕНИЕ
+ | РегистрСведений.АдресныеОбъекты КАК Округ
+ |ПО
+ | Округ.Уровень = 2
+ | И Округ.КодСубъектаРФ = АдресныйОбъект.КодСубъектаРФ
+ | И Округ.КодОкруга = АдресныйОбъект.КодОкруга
+ | И Округ.КодРайона = 0
+ | И Округ.КодГорода = 0
+ | И Округ.КодВнутригородскогоРайона = 0
+ | И Округ.КодНаселенногоПункта = 0
+ | И Округ.КодУлицы = 0
+ | И Округ.КодДополнительногоЭлемента = 0
+ | И Округ.КодПодчиненногоЭлемента = 0
+ | И Округ.Идентификатор <> АдресныйОбъект.Идентификатор
+ |
+ |ЛЕВОЕ СОЕДИНЕНИЕ
+ | РегистрСведений.АдресныеОбъекты КАК Район
+ |ПО
+ | Район.Уровень = 3
+ | И Район.КодСубъектаРФ = АдресныйОбъект.КодСубъектаРФ
+ | И Район.КодОкруга = АдресныйОбъект.КодОкруга
+ | И Район.КодРайона = АдресныйОбъект.КодРайона
+ | И Район.КодГорода = 0
+ | И Район.КодВнутригородскогоРайона = 0
+ | И Район.КодНаселенногоПункта = 0
+ | И Район.КодУлицы = 0
+ | И Район.КодДополнительногоЭлемента = 0
+ | И Район.КодПодчиненногоЭлемента = 0
+ | И Район.Идентификатор <> АдресныйОбъект.Идентификатор
+ |
+ |ЛЕВОЕ СОЕДИНЕНИЕ
+ | РегистрСведений.АдресныеОбъекты КАК Город
+ |ПО
+ | Город.Уровень = 4
+ | И Город.КодСубъектаРФ = АдресныйОбъект.КодСубъектаРФ
+ | И Город.КодОкруга = АдресныйОбъект.КодОкруга
+ | И Город.КодРайона = АдресныйОбъект.КодРайона
+ | И Город.КодГорода = АдресныйОбъект.КодГорода
+ | И Город.КодВнутригородскогоРайона = 0
+ | И Город.КодНаселенногоПункта = 0
+ | И Город.КодУлицы = 0
+ | И Город.КодДополнительногоЭлемента = 0
+ | И Город.КодПодчиненногоЭлемента = 0
+ | И Город.Идентификатор <> АдресныйОбъект.Идентификатор
+ |
+ |ЛЕВОЕ СОЕДИНЕНИЕ
+ | РегистрСведений.АдресныеОбъекты КАК ВнутригородскойРайон
+ |ПО
+ | ВнутригородскойРайон.Уровень = 5
+ | И ВнутригородскойРайон.КодСубъектаРФ = АдресныйОбъект.КодСубъектаРФ
+ | И ВнутригородскойРайон.КодОкруга = АдресныйОбъект.КодОкруга
+ | И ВнутригородскойРайон.КодРайона = АдресныйОбъект.КодРайона
+ | И ВнутригородскойРайон.КодГорода = АдресныйОбъект.КодГорода
+ | И ВнутригородскойРайон.КодВнутригородскогоРайона = АдресныйОбъект.КодВнутригородскогоРайона
+ | И ВнутригородскойРайон.КодНаселенногоПункта = 0
+ | И ВнутригородскойРайон.КодУлицы = 0
+ | И ВнутригородскойРайон.КодДополнительногоЭлемента = 0
+ | И ВнутригородскойРайон.КодПодчиненногоЭлемента = 0
+ | И ВнутригородскойРайон.Идентификатор <> АдресныйОбъект.Идентификатор
+ |
+ |ЛЕВОЕ СОЕДИНЕНИЕ
+ | РегистрСведений.АдресныеОбъекты КАК НаселенныйПункт
+ |ПО
+ | НаселенныйПункт.Уровень = 6
+ | И НаселенныйПункт.КодСубъектаРФ = АдресныйОбъект.КодСубъектаРФ
+ | И НаселенныйПункт.КодОкруга = АдресныйОбъект.КодОкруга
+ | И НаселенныйПункт.КодРайона = АдресныйОбъект.КодРайона
+ | И НаселенныйПункт.КодГорода = АдресныйОбъект.КодГорода
+ | И НаселенныйПункт.КодВнутригородскогоРайона = АдресныйОбъект.КодВнутригородскогоРайона
+ | И НаселенныйПункт.КодНаселенногоПункта = АдресныйОбъект.КодНаселенногоПункта
+ | И НаселенныйПункт.КодУлицы = 0
+ | И НаселенныйПункт.КодДополнительногоЭлемента = 0
+ | И НаселенныйПункт.КодПодчиненногоЭлемента = 0
+ | И НаселенныйПункт.Идентификатор <> АдресныйОбъект.Идентификатор
+ |
+ |УПОРЯДОЧИТЬ ПО
+ | НаселенныйПунктНаименование,
+ | ВнутригородскойРайонНаименование,
+ | ГородНаименование,
+ | РайонНаименование,
+ | ОкругНаименование,
+ | СубъектРФНаименование
+ |";
+
+ Запрос.Текст = ТекстЗапроса;
+
+ Данные = Результат.Данные;
+ СведенияОЗагруженныхРегионах = АдресныйКлассификаторПовтИсп.СведенияОЗагруженныхРегионах();
+ Для Каждого Строка Из Запрос.Выполнить().Выгрузить() Цикл
+ СтрокаРезультата = Данные.Добавить();
+ ЗаполнитьЗначенияСвойств(СтрокаРезультата, Строка, "Идентификатор");
+ Представление = "";
+
+ ДобавитьВПредставлениеЭлементАдреса(Представление, Строка.Наименование, Строка.Сокращение);
+ Если УровниЗапроса.Найти(6) <> Неопределено Тогда
+ ДобавитьВПредставлениеЭлементАдреса(Представление, Строка.НаселенныйПунктНаименование, Строка.НаселенныйПунктСокращение);
+ КонецЕсли;
+ Если УровниЗапроса.Найти(5) <> Неопределено Тогда
+ ДобавитьВПредставлениеЭлементАдреса(Представление, Строка.ВнутригородскойРайонНаименование, Строка.ВнутригородскойРайонСокращение);
+ КонецЕсли;
+ Если УровниЗапроса.Найти(4) <> Неопределено Тогда
+ ДобавитьВПредставлениеЭлементАдреса(Представление, Строка.ГородНаименование, Строка.ГородСокращение);
+ КонецЕсли;
+ Если УровниЗапроса.Найти(3) <> Неопределено Тогда
+ ДобавитьВПредставлениеЭлементАдреса(Представление, Строка.РайонНаименование, Строка.РайонСокращение);
+ КонецЕсли;
+ Если УровниЗапроса.Найти(2) <> Неопределено Тогда
+ ДобавитьВПредставлениеЭлементАдреса(Представление, Строка.ОкругНаименование, Строка.ОкругСокращение);
+ КонецЕсли;
+ Если УровниЗапроса.Найти(1) <> Неопределено Тогда
+ ДобавитьВПредставлениеЭлементАдреса(Представление, Строка.СубъектРФНаименование, Строка.СубъектРФСокращение);
+ КонецЕсли;
+ СтрокаРезультата.Представление = Представление;
+ СтрокаРезультата.РегионЗагружен = СведенияОЗагруженныхРегионах[Строка.КодСубъектаРФ];
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+// Заполнение данных для автоподбора из загруженных данных для улиц
+//
+Процедура СписокАвтоподбораЧастиУлицы(Результат, Текст, Родитель, УровниЗапроса, ДополнительныеПараметры) Экспорт
+
+ ТекстПоиска = ЗамаскироватьСпецсимволыПодобия(Текст);
+ Запрос = Новый Запрос;
+
+ Запрос.Текст =
+ "ВЫБРАТЬ ПЕРВЫЕ 5000
+ | АдресныеОбъекты.Наименование КАК Наименование,
+ | АдресныеОбъекты.Уровень КАК Уровень,
+ | АдресныеОбъекты.Идентификатор КАК Идентификатор,
+ | АдресныеОбъекты.Сокращение
+ |ПОМЕСТИТЬ НайденныеАдресныеОбъекты
+ |ИЗ
+ | РегистрСведений.АдресныеОбъекты КАК РодительскийОбъект
+ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
+ | ПО РодительскийОбъект.КодСубъектаРФ = АдресныеОбъекты.КодСубъектаРФ
+ | И РодительскийОбъект.КодОкруга = АдресныеОбъекты.КодОкруга
+ | И РодительскийОбъект.КодРайона = АдресныеОбъекты.КодРайона
+ | И РодительскийОбъект.КодГорода = АдресныеОбъекты.КодГорода
+ | И РодительскийОбъект.КодВнутригородскогоРайона = АдресныеОбъекты.КодВнутригородскогоРайона
+ | И РодительскийОбъект.КодНаселенногоПункта = АдресныеОбъекты.КодНаселенногоПункта
+ |ГДЕ
+ | РодительскийОбъект.Идентификатор = &Идентификатор
+ | И АдресныеОбъекты.Уровень = 7
+ |
+ |ИНДЕКСИРОВАТЬ ПО
+ | Наименование
+ |;
+ |
+ |////////////////////////////////////////////////////////////////////////////////
+ |ВЫБРАТЬ ПЕРВЫЕ 20
+ | НайденныеАдресныеОбъекты.Наименование + "" "" + НайденныеАдресныеОбъекты.Сокращение КАК Представление,
+ | НайденныеАдресныеОбъекты.Идентификатор,
+ | ИСТИНА КАК РегионЗагружен
+ |ИЗ
+ | НайденныеАдресныеОбъекты КАК НайденныеАдресныеОбъекты
+ |ГДЕ
+ | (НайденныеАдресныеОбъекты.Наименование ПОДОБНО &НачалоФразы
+ | ИЛИ НайденныеАдресныеОбъекты.Наименование ПОДОБНО &НачалоСлова)";
+
+ Запрос.УстановитьПараметр("Идентификатор", Новый УникальныйИдентификатор(Родитель));
+ Запрос.УстановитьПараметр("НачалоФразы", ТекстПоиска + "%");
+ Запрос.УстановитьПараметр("НачалоСлова", "% " + ТекстПоиска + "%");
+
+ РезультатЗапроса = Запрос.Выполнить().Выгрузить();
+
+ Данные = Результат.Данные;
+ Для Каждого Строка Из РезультатЗапроса Цикл
+ СтрокаРезультата = Данные.Добавить();
+ ЗаполнитьЗначенияСвойств(СтрокаРезультата, Строка);
+ КонецЦикла;
+
+КонецПроцедуры
+
+
// Конструктор таблицы - результата автоподбора.
//
Функция ТаблицаДанныхАвтоподбора() Экспорт
@@ -1004,6 +1323,7 @@
СтрокаРезультата.РегионЗагружен = Истина;
СтрокаРезультата.Идентификатор = Новый УникальныйИдентификатор(Строка.ID);
СтрокаРезультата.Представление = Строка.Presentation;
+ СтрокаРезультата.Неактуален = НЕ Строка.Actual;
КонецЦикла;
КонецПроцедуры
@@ -1012,7 +1332,8 @@
//
Процедура ЗаполнитьСписокАвтоподбораЧастиАдресаВнутр(Результат, Текст, Родитель, УровниЗапроса, ДополнительныеПараметры) Экспорт
- ОтбиратьЗаписей = "20";
+ ОтбиратьЗаписейДляАнализа = "300";
+ ОтбиратьЗаписейДляСписка = "20";
ТекстПоиска = ЗамаскироватьСпецсимволыПодобия(Текст);
@@ -1026,7 +1347,7 @@
ТекстЗапросаПодходящиеОбъекты =
#Область ТекстЗапроса
"// Родитель указан явно
- |ВЫБРАТЬ ПЕРВЫЕ " + ОтбиратьЗаписей + "
+ |ВЫБРАТЬ ПЕРВЫЕ " + ОтбиратьЗаписейДляАнализа + "
| АдресныйОбъект.Уровень,
| АдресныйОбъект.КодСубъектаРФ,
| АдресныйОбъект.КодОкруга,
@@ -1234,6 +1555,8 @@
|ГДЕ
| РодительскийОбъект.Идентификатор = &Родитель
| И НЕ АдресныйОбъект.Идентификатор ЕСТЬ NULL
+ |УПОРЯДОЧИТЬ ПО
+ | АдресныйОбъект.Уровень
|ИНДЕКСИРОВАТЬ ПО
| АдресныйОбъект.Уровень,
| АдресныйОбъект.КодСубъектаРФ,
@@ -1254,7 +1577,7 @@
ТекстЗапросаПодходящиеОбъекты =
#Область ТекстЗапроса
"// Родитель НЕ указан
- |ВЫБРАТЬ ПЕРВЫЕ " + ОтбиратьЗаписей + "
+ |ВЫБРАТЬ ПЕРВЫЕ " + ОтбиратьЗаписейДляАнализа + "
| АдресныйОбъект.Уровень,
| АдресныйОбъект.КодСубъектаРФ,
| АдресныйОбъект.КодОкруга,
@@ -1266,7 +1589,6 @@
| АдресныйОбъект.КодДополнительногоЭлемента,
| АдресныйОбъект.КодПодчиненногоЭлемента,
| АдресныйОбъект.Идентификатор,
- |
| АдресныйОбъект.Наименование,
| АдресныйОбъект.Сокращение,
|
@@ -1309,6 +1631,8 @@
|ГДЕ
| АдресныйОбъект.Наименование ПОДОБНО &НачалоФразы
| И АдресныйОбъект.Уровень В (&Уровни)
+ |УПОРЯДОЧИТЬ ПО
+ | АдресныйОбъект.Уровень
|ИНДЕКСИРОВАТЬ ПО
| АдресныйОбъект.Уровень,
| АдресныйОбъект.КодСубъектаРФ,
@@ -1331,7 +1655,7 @@
ТекстЗапросаПодходящиеОбъекты + "
|;/////////////////////////////////////////////////////////////////////////////////
|
- |ВЫБРАТЬ
+ |ВЫБРАТЬ ПЕРВЫЕ " + ОтбиратьЗаписейДляСписка + "
| СубъектРФ.Наименование КАК СубъектРФНаименование,
| СубъектРФ.Сокращение КАК СубъектРФСокращение,
|
@@ -2323,8 +2647,15 @@
АдресXDTO = ПроверяемыйАдрес.Адрес;
Если ТипЗнч(АдресXDTO) = ТипСтрока Тогда
- ПолныйАдресXDTO = ДесериализацияАдресаXDTO(АдресXDTO);
- АдресXDTO = ПолныйАдресXDTO.Состав.Состав;
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
+ ПолныйАдресXDTO = ДесериализацияАдресаXDTO(АдресXDTO);
+ АдресXDTO = ПолныйАдресXDTO.Состав.Состав;
+ Иначе
+ Результат.Отказ = Истина;
+ Результат.КраткоеПредставлениеОшибки = НСтр("ru = 'Адрес не может быть проверен, так как не распознан.'");
+ Результат.ПодробноеПредставлениеОшибки = Результат.КраткоеПредставлениеОшибки;
+ Возврат Результат;
+ КонецЕсли;
КонецЕсли;
АдресаДляПроверки.Добавить(Новый Структура("Адрес, Уровни", АдресXDTO, Уровни));
@@ -2429,7 +2760,7 @@
ВызватьИсключение НСтр("ru = 'В уровнях для проверки адреса не указан уровень субъекта РФ.'");
КонецЕсли;
- РегионЗагруженВАдресныеСведения = РегионЗагружен(Адрес.СубъектРФ);
+ РегионЗагруженВАдресныеСведения = СведенияОРегионе(Адрес.СубъектРФ).Загружен;
Если РегионЗагруженВАдресныеСведения = Неопределено Тогда
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "СубъектРФ", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Регион ""%1"" не существует'"),
@@ -2537,10 +2868,10 @@
СтрокиВариантов = ТаблицаСокращенийДополнительных.НайтиСтроки( Новый Структура("Сокращение, Значение", Вариант.Сокращение, ТипАдресногоЭлемента));
Если СтрокиВариантов.Количество() > 0 Тогда
Код = СтрокиВариантов[0].Идентификатор;
- Если Код = "90" Тогда
+ Если Код = 90 Тогда
Дополнительный = Вариант;
- ИначеЕсли Код = "91" Тогда
- Подчиненный = Вариант;
+ ИначеЕсли Код = 91 Тогда
+ Подчиненный = Вариант;
КонецЕсли;
КонецЕсли;
@@ -2561,8 +2892,8 @@
ПроверятьВнутригородскойРайон = Не ПустаяСтрока(ВнутригородскойРайон.Наименование) И Уровни.Найти(5) <> Неопределено;
ПроверятьНаселенныйПункт = Не ПустаяСтрока(НаселенныйПункт.Наименование) И Уровни.Найти(6) <> Неопределено;
ПроверятьУлицу = Не ПустаяСтрока(Улица.Наименование) И Уровни.Найти(7) <> Неопределено;
- ПроверятьДополнительный = Не ПустаяСтрока(Дополнительный.Наименование) И Уровни.Найти(90) <> Неопределено;
- ПроверятьПодчиненный = Не ПустаяСтрока(Подчиненный.Наименование) И Уровни.Найти(91) <> Неопределено;
+ ПроверятьДополнительный = Не ПустаяСтрока(Дополнительный.Наименование);
+ ПроверятьПодчиненный = Не ПустаяСтрока(Подчиненный.Наименование);
Запрос.Текст =
#Область ТекстЗапроса
@@ -2848,8 +3179,18 @@
ЗаписиДомов = РезультатЗапроса.Выгрузить();
КорректныеЗаписи = Новый Массив;
+ ИндексНайден = Ложь;
+ ВариантАдреса = Новый Структура;
Для Каждого Запись Из ЗаписиДомов Цикл;
-
+ ЗаполнитьПочтовыйИндексИКодКЛАДРПоИерархииФИАС(ВариантАдреса, Запись);
+ Если ВариантАдреса.Свойство("Индекс") Тогда
+ Если ЗначениеЗаполнено(Индекс) И ВариантАдреса.Индекс <> Число(Индекс) Тогда
+ Продолжить;
+ Иначе
+ ИндексНайден = Истина;
+ КонецЕсли;
+ КонецЕсли;
+
Если ПроверятьОкруг И Не Запись.ОкругНайден Тогда
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "Округ", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Округ ""%1"" отсутствует в адресном классификаторе'"),
@@ -2871,14 +3212,13 @@
));
КонецЕсли;
-
Если ПроверятьВнутригородскойРайон И Не Запись.ВнутригородскойРайонНайден Тогда
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "ВнутригРайон", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Внутригородской район ""%1"" отсутствует в адресном классификаторе'"),
ВнутригородскойРайон.Наименование + " " + ВнутригородскойРайон.Сокращение
));
КонецЕсли;
-
+
Если ПроверятьНаселенныйПункт И Не Запись.НаселенныйПунктНайден Тогда
ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "НаселПункт", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Населенный пункт ""%1"" отсутствует в адресном классификаторе'"),
@@ -2924,18 +3264,26 @@
КонецЦикла;
+ Если НЕ ИндексНайден Тогда
+ ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "Индекс", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Индекс ""%1"" в адресном классификаторе не соответствует введенному адресу'"), Индекс));
+ Возврат Результат;
+ КонецЕсли;
+
Если КорректныеЗаписи.Количество() = 0 Тогда
// Нет смысла искать дома и выдавать варианты, надо посмотреть в историю.
Возврат Результат;
КонецЕсли;
ЕстьЗаписиДомов = Ложь;
+ ИндексКорректный = Ложь;
Если НЕ Уровни.Найти(90) = Неопределено Тогда
Для Каждого Запись Из КорректныеЗаписи Цикл
// Если Запись.Строения равно Null значит по этому адресу нет домов.
Если ЗначениеЗаполнено(Запись.Строения) Тогда
Описание = Запись.Строения.Получить();
+ ВариантАдреса = Новый Структура;
Если Не ПустаяСтрока(Описание) Тогда
ИдентификаторДополнительно = УникальныйИдентификаторИзСтроки64(Лев(Описание, 24));
Описание = Сред(Описание, 25);
@@ -2943,32 +3291,38 @@
ЕстьЗаписиДомов = Истина;
Если ОписаниеЗданийФИАССодержитДанные(Описание, ЗданияИПомещения) Тогда
- ВариантАдреса = Новый Структура;
ЗаполнитьИдентификаторПоИерархииФИАС(ВариантАдреса, Запись);
ЗаполнитьДополнительныеДанныеПоИерархииФИАС(ВариантАдреса, Запись, ИдентификаторДополнительно);
ЗаполнитьПочтовыйИндексИКодКЛАДРПоИерархииФИАС(ВариантАдреса, Запись);
- ВариантыАдреса.Добавить(ВариантАдреса);
-
- // Проверить индекс
- Если ЗначениеЗаполнено(Индекс) И Формат(ВариантАдреса.Индекс, "ЧРГ=' '; ЧГ=0") <> Индекс Тогда
- ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "Индекс", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Индекс ""%1"" в адресном классификаторе не соответствует введенному адресу'"), Индекс));
+ Если ЗначениеЗаполнено(Индекс) И ВариантАдреса.Свойство("Индекс") И Формат(ВариантАдреса.Индекс, "ЧРГ=' '; ЧГ=0") = Индекс Тогда
+ ИндексКорректный = Истина;
КонецЕсли;
+ ВариантыАдреса.Добавить(ВариантАдреса);
КонецЕсли;
КонецЕсли;
-
КонецЕсли;
КонецЕсли;
КонецЦикла;
+
КонецЕсли;
ЕстьВарианты = ВариантыАдреса.Количество() > 0;
Если ЕстьЗаписиДомов И Не ЕстьВарианты Тогда
- ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "Подчиненный", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = '""%1"" отсутствует в адресном классификаторе'"), ОписаниеЗданияПоСоответствиюФИАС(ЗданияИПомещения)
- ));
+ ОписаниеЗданияПоСоответствиюФИАС = ОписаниеЗданияПоСоответствиюФИАС(ЗданияИПомещения);
+ Если ЗначениеЗаполнено(ОписаниеЗданияПоСоответствиюФИАС) Тогда
+ ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "Подчиненный", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = '""%1"" отсутствует в адресном классификаторе'"), ОписаниеЗданияПоСоответствиюФИАС(ЗданияИПомещения)
+ ));
+ КонецЕсли;
+
+ ВариантАдреса = Новый Структура;
+ ЗаполнитьПочтовыйИндексИКодКЛАДРПоИерархииФИАС(ВариантАдреса, Запись);
+ Если ЗначениеЗаполнено(Индекс) И ВариантАдреса.Свойство("Индекс") И Формат(ВариантАдреса.Индекс, "ЧРГ=' '; ЧГ=0") = Индекс Тогда
+ ИндексКорректный = Истина;
+ КонецЕсли;
+
ИначеЕсли Не ЕстьЗаписиДомов И Не ЕстьВарианты Тогда
// Добавляем варианты, ошибкой не считаем.
Для Каждого Запись Из КорректныеЗаписи Цикл
@@ -2977,10 +3331,20 @@
ЗаполнитьДополнительныеДанныеПоИерархииФИАС(ВариантАдреса, Запись, Неопределено);
ЗаполнитьПочтовыйИндексИКодКЛАДРПоИерархииФИАС(ВариантАдреса, Запись);
ВариантыАдреса.Добавить(ВариантАдреса);
+
+ Если ЗначениеЗаполнено(Индекс) И ВариантАдреса.Свойство("Индекс") И Формат(ВариантАдреса.Индекс, "ЧРГ=' '; ЧГ=0") = Индекс Тогда
+ ИндексКорректный = Истина;
+ КонецЕсли;
КонецЦикла;
КонецЕсли;
+ // Проверить индекс
+ Если НЕ ИндексКорректный И ЗначениеЗаполнено(Индекс) Тогда
+ ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ОшибкиПроверки, "Индекс", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Индекс ""%1"" в адресном классификаторе не соответствует введенному адресу'"), Индекс));
+ КонецЕсли;
+
Возврат Результат;
КонецФункции
@@ -3338,7 +3702,6 @@
ИдентификаторНаселенногоПункта = РезультатЗапроса.ИдентификаторАдресныйОбъект;
КонецЕсли;
КонецЕсли;
-
Возврат ИдентификаторНаселенногоПункта;
@@ -3346,45 +3709,165 @@
// Определяет индекс адреса по частям адреса.
//
-Функция ИндексАдресаПоЧастямАдреса(Адрес) Экспорт
+Функция ИндексАдресаПоЧастямАдреса(Адрес, Идентификатор = Неопределено) Экспорт
- Индекс = "";
- Идентификатор = ИдентификаторАдресногоОбъектаПоЧастямАдреса(Адрес, Истина);
- Если Идентификатор <> Неопределено Тогда
- Запрос = Новый Запрос;
- Запрос.Текст =
- "ВЫБРАТЬ
- | АдресныеОбъекты.ПочтовыйИндекс
- |ИЗ
- | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
- |ГДЕ
- | АдресныеОбъекты.Идентификатор = &Идентификатор";
+ Индекс = 0;
+ Источник = ИсточникДанныхАдресногоКлассификатора();
+ Если ПустаяСтрока(Источник) Тогда
+ // Локальное
- Запрос.УстановитьПараметр("Идентификатор", Идентификатор);
+ Если НЕ ЗначениеЗаполнено(Идентификатор) Тогда
+ Идентификатор = ИдентификаторАдресногоОбъектаПоЧастямАдреса(Адрес, Истина);
+ КонецЕсли;
- РезультатЗапроса = Запрос.Выполнить().Выбрать();
-
- Если РезультатЗапроса.Следующий() Тогда
- Если РезультатЗапроса.ПочтовыйИндекс = 0 Тогда
- Запрос = Новый Запрос;
- Запрос.Текст ="ВЫБРАТЬ
- | ДомаЗданияСтроения.ПочтовыйИндекс
- |ИЗ
- | РегистрСведений.ДомаЗданияСтроения КАК ДомаЗданияСтроения
- |ГДЕ
- | ДомаЗданияСтроения.АдресныйОбъект = &Идентификатор";
- Запрос.УстановитьПараметр("Идентификатор", Идентификатор);
- РезультатЗапроса = Запрос.Выполнить().Выбрать();
- Если РезультатЗапроса.Следующий() Тогда
+ Если Идентификатор <> Неопределено Тогда
+ Запрос = Новый Запрос;
+ Запрос.Текст =
+ "ВЫБРАТЬ
+ | АдресныеОбъекты.ПочтовыйИндекс
+ |ИЗ
+ | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
+ |ГДЕ
+ | АдресныеОбъекты.Идентификатор = &Идентификатор";
+
+ Запрос.УстановитьПараметр("Идентификатор", Идентификатор);
+
+ РезультатЗапроса = Запрос.Выполнить().Выбрать();
+
+ Если РезультатЗапроса.Следующий() Тогда
+ Если РезультатЗапроса.ПочтовыйИндекс = 0 Тогда
+
+ // Расшифровка свойств адреса
+ Запрос = Новый Запрос(
+ #Область ТекстЗапроса
+ "ВЫБРАТЬ
+ | Значение
+ |ИЗ
+ | РегистрСведений.СлужебныеАдресныеСведения
+ |ГДЕ
+ | Тип = ""ТипАдрЭл"" И Ключ = ""ПочтовыйИндекс""
+ |;//////////////////////////////////////////////////////////////////////////////////////////////////
+ |ВЫБРАТЬ
+ | Расшифровка.Ключ КАК Значение,
+ | Расшифровка.Значение КАК ТипАдрЭл,
+ |
+ | ВЫБОР
+ | КОГДА НЕ ТипыВладения.Идентификатор ЕСТЬ NULL ТОГДА ТипыВладения.Идентификатор
+ | КОГДА НЕ ТипыСтроения.Идентификатор ЕСТЬ NULL ТОГДА ТипыСтроения.Идентификатор
+ | ИНАЧЕ 0
+ | КОНЕЦ КАК Идентификатор
+ |
+ |ИЗ
+ | РегистрСведений.СлужебныеАдресныеСведения КАК Расшифровка
+ |
+ |ЛЕВОЕ СОЕДИНЕНИЕ
+ | РегистрСведений.СлужебныеАдресныеСведения КАК ТипыВладения
+ |ПО
+ | ТипыВладения.Тип = ""ESTSTAT""
+ | И ТипыВладения.Значение = Расшифровка.Ключ
+ |
+ |ЛЕВОЕ СОЕДИНЕНИЕ
+ | РегистрСведений.СлужебныеАдресныеСведения КАК ТипыСтроения
+ |ПО
+ | ТипыСтроения.Тип = ""STRSTAT""
+ | И ТипыСтроения.Значение = Расшифровка.Ключ
+ |
+ |ГДЕ
+ | Расшифровка.Тип = ""ДопАдрЭлНомер""
+ |"
+ #КонецОбласти
+ );
+ НаборРезультатов = Запрос.ВыполнитьПакет();
+
+ Таблица = НаборРезультатов[0].Выгрузить();
+ Если Таблица.Количество() = 0 Тогда
+ ТипАдрЭлПочтовыйИндекс = "";
+ Иначе
+ ТипАдрЭлПочтовыйИндекс = Таблица[0].Значение;
+ КонецЕсли;
+ ТаблицаСокращенийЗданий = НаборРезультатов[1].Выгрузить();
+ ТаблицаСокращенийЗданий.Индексы.Добавить("ТипАдрЭл");
+
+ ЗданияИПомещения = Новый Соответствие;
+ ТипЧисло = Новый ОписаниеТипов("Число");
+ Для Каждого ДополнительныйЭлемент Из Адрес.ПолучитьСписок("ДопАдрЭл") Цикл
+ ТипАдресногоЭлемента = СокрЛП(ДополнительныйЭлемент.ТипАдрЭл);
+
+ // Здание или помещение, почтовый индекс?
+ Если ТипАдресногоЭлемента = "" Тогда
+ ЗначениеНомера = ДополнительныйЭлемент.Номер;
+ СтрокаЗдания = ТаблицаСокращенийЗданий.Найти(ЗначениеНомера.Тип, "ТипАдрЭл");
+ Если СтрокаЗдания <> Неопределено Тогда
+ ЗданияИПомещения[СтрокаЗдания.Значение] = Новый Структура("Вид, Значение", СтрокаЗдания.Идентификатор, ЗначениеНомера.Значение);;
+ КонецЕсли;
+ Продолжить;
+ ИначеЕсли ТипАдресногоЭлемента = ТипАдрЭлПочтовыйИндекс Тогда
+ Индекс = ТипЧисло.ПривестиЗначение(ДополнительныйЭлемент.Значение);
+ Продолжить;
+ КонецЕсли;
+ КонецЦикла;
+
+ Запрос = Новый Запрос;
+ Запрос.Текст ="ВЫБРАТЬ
+ | ДомаЗданияСтроения.ПочтовыйИндекс,
+ | ДомаЗданияСтроения.Строения
+ |ИЗ
+ | РегистрСведений.ДомаЗданияСтроения КАК ДомаЗданияСтроения
+ |ГДЕ
+ | ДомаЗданияСтроения.АдресныйОбъект = &Идентификатор";
+ Запрос.УстановитьПараметр("Идентификатор", Идентификатор);
+ РезультатЗапроса = Запрос.Выполнить().Выгрузить();
+
+ Для Каждого Запись Из РезультатЗапроса Цикл
+ // Если Запись.Строения равно Null значит по этому адресу нет домов.
+ Если ЗначениеЗаполнено(Запись.Строения) Тогда
+ Описание = Запись.Строения.Получить();
+
+ Если Не ПустаяСтрока(Описание) Тогда
+ ИдентификаторДополнительно = УникальныйИдентификаторИзСтроки64(Лев(Описание, 24));
+ Описание = Сред(Описание, 25);
+ Если Не ПустаяСтрока(Описание) Тогда
+ ЕстьЗаписиДомов = Истина;
+
+ Если ОписаниеЗданийФИАССодержитДанные(Описание, ЗданияИПомещения) Тогда
+ Индекс = Запись.ПочтовыйИндекс;
+ КонецЕсли;
+ КонецЕсли;
+ КонецЕсли;
+ КонецЕсли;
+ КонецЦикла;
+ Иначе
Индекс = РезультатЗапроса.ПочтовыйИндекс;
КонецЕсли;
- Иначе
- Индекс = РезультатЗапроса.ПочтовыйИндекс;
+ КонецЕсли;
+ КонецЕсли;
+
+ ИначеЕсли Источник = "Сервис1С" Тогда
+ // Веб сервис 1С, может быть на обслуживании.
+ АдресаДляПроверки = Новый Массив;
+ Результат = Новый Структура("Данные", Новый Массив);
+ СтруктураОписанияОшибкиПоставщика(Результат);
+ Уровни = АдресныйКлассификаторПовтИсп.УровниКлассификатораФИАС();
+ АдресаДляПроверки.Добавить(Новый Структура("Адрес, Уровни", Адрес, Уровни));
+ Попытка
+ ЗаполнитьРезультатПроверкиАдресаПоКлассификаторуСервис1С(Результат, АдресаДляПроверки);
+ Исключение
+ СтруктураОписанияОшибкиПоставщика(Результат, ИнформацияОбОшибке());
+ ЗаписьЖурналаРегистрации( СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, , , Результат.ПодробноеПредставлениеОшибки);
+ КонецПопытки;
+
+ Если НЕ Результат.Отказ Тогда
+ Если Результат.Данные[0].Варианты.Количество() > 0 Тогда
+ Индекс = Результат.Данные[0].Варианты[0].Индекс;
КонецЕсли;
КонецЕсли;
КонецЕсли;
- Возврат Индекс;
+ Если Индекс = 0 Тогда
+ Возврат Неопределено;
+ Иначе
+ Возврат Индекс;
+ КонецЕсли;
КонецФункции
Процедура ДобавитьОшибкуПроверкиАдресаПоКлассификатору(ВсеОшибки, Ключ, Текст, Подсказка = Неопределено);
@@ -3761,6 +4244,18 @@
Описание.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
Текст = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
+ Если ТипЗнч(ИнформацияОбОшибке.Причина) = Тип("ИнформацияОбОшибке") Тогда
+ Если ИнформацияОбОшибке.Причина.Причина <> Неопределено Тогда
+ ОписаниеОшибкиДляПоиска = ВРег(ИнформацияОбОшибке.Причина.Причина.Описание);
+ ПозицияНачало = Найти(ОписаниеОшибкиДляПоиска , "");
+ Если ПозицияНачало > 0 Тогда
+ ПозицияОкончание = Найти(ОписаниеОшибкиДляПоиска , "");
+ Текст = Сред(ИнформацияОбОшибке.Причина.Причина.Описание, ПозицияНачало + 13,
+ ПозицияОкончание - ПозицияНачало - 13);
+ КонецЕсли;
+ КонецЕсли;
+ КонецЕсли;
+
// Отрезаем клиентский текст
Позиция = Найти(Текст, ": ");
Если Позиция > 0 Тогда
@@ -3857,6 +4352,8 @@
Возврат ДоступныеУровни;
КонецФункции
+
+
Функция УстановитьСоответствиеЧастейАдресаИхУровню(ЧастиАдреса, Уровни) Экспорт
ОбработатьОбщепринятыеСокращения(ЧастиАдреса);
@@ -4096,31 +4593,31 @@
КодДополнительнойТерритории = "0";
ТекстСоединения = "";
ТекстЗапросаВыборки = "";
- СписокПолей = Новый Структура();
+ СписокПолей = Новый Соответствие();
Для каждого Уровень Из Уровни Цикл
Если Уровень = 1 Тогда
- СписокПолей.Вставить("СубъектРФ");
+ СписокПолей.Вставить("СубъектРФ", "КодСубъектаРФ");
ТекстСоединения = " СубъектРФ КАК СубъектРФ ";
ИначеЕсли Уровень = 2 Тогда
- СписокПолей.Вставить("Округ");
+ СписокПолей.Вставить("Округ", "КодОкруга");
ТекстСоединения = ТекстСоединения + " ЛЕВОЕ СОЕДИНЕНИЕ Округ КАК Округ
| ПО СубъектаРФ.КодСубъектаРФ = Округ.КодСубъектаРФ";
КодОкруга = "Округ.КодОкруга";
ИначеЕсли Уровень = 3 Тогда
- СписокПолей.Вставить("Район");
+ СписокПолей.Вставить("Район", "КодРайона");
ТекстСоединения = ТекстСоединения + " ЛЕВОЕ СОЕДИНЕНИЕ Район КАК Район
| ПО Район.КодСубъектаРФ = СубъектРФ.КодСубъектаРФ
| И Район.КодОкруга = " + КодОкруга;
КодРайона = "Район.КодРайона";
ИначеЕсли Уровень = 4 Тогда
- СписокПолей.Вставить("Город");
+ СписокПолей.Вставить("Город", "КодГорода");
ТекстСоединения = ТекстСоединения + " ЛЕВОЕ СОЕДИНЕНИЕ Город КАК Город
| ПО Город.КодСубъектаРФ = СубъектРФ.КодСубъектаРФ
| И Город.КодОкруга = " + КодОкруга + "
| И Город.КодРайона = " + КодРайона;
КодГорода = "Город.КодГорода";
ИначеЕсли Уровень = 5 Тогда
- СписокПолей.Вставить("ВнутригородскойРайон");
+ СписокПолей.Вставить("ВнутригородскойРайон", "КодВнутригородскогоРайона");
ТекстСоединения = ТекстСоединения + " ЛЕВОЕ СОЕДИНЕНИЕ ВнутригородскойРайон КАК ВнутригородскойРайон
| ПО ВнутригородскойРайон.КодСубъектаРФ = СубъектРФ.КодСубъектаРФ
| И ВнутригородскойРайон.КодОкруга = " + КодОкруга + "
@@ -4128,7 +4625,7 @@
| И ВнутригородскойРайон.КодГорода = " + КодГорода;
КодВнутригородскогоРайона = "ВнутригородскойРайон.КодВнутригородскогоРайона";
ИначеЕсли Уровень = 6 Тогда
- СписокПолей.Вставить("НаселенныйПункт");
+ СписокПолей.Вставить("НаселенныйПункт", "КодНаселенногоПункта");
ТекстСоединения = ТекстСоединения + " ЛЕВОЕ СОЕДИНЕНИЕ НаселенныйПункт КАК НаселенныйПункт
| ПО НаселенныйПункт.КодСубъектаРФ = СубъектРФ.КодСубъектаРФ
| И НаселенныйПункт.КодОкруга = " + КодОкруга + "
@@ -4137,7 +4634,7 @@
| И НаселенныйПункт.КодВнутригородскогоРайона = " + КодВнутригородскогоРайона;
КодНаселенногоПункта = "НаселенныйПункт.КодНаселенногоПункта";
ИначеЕсли Уровень = 7 Тогда
- СписокПолей.Вставить("Улицы");
+ СписокПолей.Вставить("Улицы", "КодУлицы");
ТекстСоединения = ТекстСоединения + " ЛЕВОЕ СОЕДИНЕНИЕ Улицы КАК Улицы
| ПО Улицы.КодСубъектаРФ = СубъектРФ.КодСубъектаРФ
| И Улицы.КодОкруга = " + КодОкруга + "
@@ -4146,38 +4643,19 @@
| И Улицы.КодВнутригородскогоРайона = " + КодВнутригородскогоРайона + "
| И Улицы.КодНаселенногоПункта = " + КодНаселенногоПункта;
КодУлицы = "Улицы.КодУлицы";
- ИначеЕсли Уровень = 90 Тогда
- СписокПолей.Вставить("ДополнительнаяТерритория");
- ТекстСоединения = ТекстСоединения + " ЛЕВОЕ СОЕДИНЕНИЕ ДополнительнаяТерритория КАК ДополнительнаяТерритория
- | ПО ДополнительнаяТерритория.КодСубъектаРФ =СубъектРФ.КодСубъектаРФ
- | И ДополнительнаяТерритория.КодОкруга = " + КодОкруга + "
- | И ДополнительнаяТерритория.КодРайона = " + КодРайона + "
- | И ДополнительнаяТерритория.КодГорода = " + КодГорода + "
- | И ДополнительнаяТерритория.КодВнутригородскогоРайона = " + КодВнутригородскогоРайона + "
- | И ДополнительнаяТерритория.КодНаселенногоПункта = " + КодНаселенногоПункта + "
- | И ДополнительнаяТерритория.КодУлицы = " + КодУлицы;
- КодДополнительнойТерритории = "ДополнительнаяТерритория.КодДополнительногоЭлемента";
- ИначеЕсли Уровень = 91 Тогда
- СписокПолей.Вставить("ЭлементДополнительнойТерритории");
- ТекстСоединения = ТекстСоединения + " ЛЕВОЕ СОЕДИНЕНИЕ ЭлементДополнительнойТерритории КАК ЭлементДополнительнойТерритории
- | ПО ЭлементДополнительнойТерритории.КодСубъектаРФ = СубъектРФ.КодСубъектаРФ
- | И ЭлементДополнительнойТерритории.КодОкруга = " + КодОкруга + "
- | И ЭлементДополнительнойТерритории.КодРайона = " + КодРайона + "
- | И ЭлементДополнительнойТерритории.КодГорода = " + КодГорода + "
- | И ЭлементДополнительнойТерритории.КодВнутригородскогоРайона = " + КодВнутригородскогоРайона + "
- | И ЭлементДополнительнойТерритории.КодНаселенногоПункта = " + КодНаселенногоПункта + "
- | И ЭлементДополнительнойТерритории.КодУлицы = " + КодУлицы + "
- | И ЭлементДополнительнойТерритории.КодДополнительногоЭлемента = " + КодДополнительнойТерритории;
КонецЕсли;
КонецЦикла;
Разделитель = "";
Для каждого Элемент Из СписокПолей Цикл
ТекстЗапросаВыборки = ТекстЗапросаВыборки + Разделитель + " " + Элемент.Ключ +".Наименование + "" "" +
- | " + Элемент.Ключ + ".Сокращение КАК "+ Элемент.Ключ + ", " + Элемент.Ключ +".Уровень КАК " + Элемент.Ключ + "Уровень";
+ | " + Элемент.Ключ + ".Сокращение КАК "+ Элемент.Ключ + ", " + Элемент.Ключ +".Уровень КАК " + Элемент.Ключ + "Уровень, " +
+ Элемент.Ключ + "." + Элемент.Значение + " КАК " + Элемент.Значение;
Разделитель = ", ";
КонецЦикла;
-
+
+ Разделитель = "";
+ УсловиеГдеДляДополнительныхТерриторий = "";
Если НЕ ПустаяСтрока(ТекстЗапросаВыборки) Тогда
ТекстЗапросаВыборки = "ВЫБРАТЬ " + ТекстЗапросаВыборки + " ИЗ " + ТекстСоединения;
@@ -4192,11 +4670,119 @@
СтрокаАдреса = ЧастиАдреса.Найти(Результат[Элемент.Ключ], "Значение");
Если СтрокаАдреса <> Неопределено Тогда
СтрокаАдреса.Уровень = Результат[Элемент.Ключ + "Уровень"];
+ УсловиеГдеДляДополнительныхТерриторий = УсловиеГдеДляДополнительныхТерриторий + Разделитель +
+ "АдресныеОбъекты." + СписокПолей.Получить(Элемент.Ключ) + " = " + Формат(Результат[Элемент.Значение], "ЧРГ=''; ЧГ=0");
+ Иначе
+ УсловиеГдеДляДополнительныхТерриторий = УсловиеГдеДляДополнительныхТерриторий + Разделитель +
+ "АдресныеОбъекты." + СписокПолей.Получить(Элемент.Ключ) + " = 0";
КонецЕсли;
+ Разделитель = " И ";
КонецЦикла;
КонецЕсли;
КонецЕсли;
+ Запрос = Новый Запрос;
+ Запрос.Текст = "ВЫБРАТЬ
+ | ДанныеАдреса.Уровень КАК Уровень,
+ | ДанныеАдреса.Позиция КАК Позиция,
+ | ДанныеАдреса.Значение КАК Значение,
+ | ДанныеАдреса.Наименование КАК Наименование,
+ | ДанныеАдреса.Сокращение КАК Сокращение
+ |ПОМЕСТИТЬ ДанныеАдреса
+ |ИЗ
+ | &ДанныеАдреса КАК ДанныеАдреса
+ |ГДЕ
+ | ДанныеАдреса.Уровень = 0
+ |
+ |ИНДЕКСИРОВАТЬ ПО
+ | Уровень,
+ | Позиция,
+ | Наименование,
+ | Сокращение
+ |;
+ |
+ |////////////////////////////////////////////////////////////////////////////////
+ |ВЫБРАТЬ
+ | АдресныеОбъекты.Идентификатор КАК Идентификатор,
+ | АдресныеОбъекты.Наименование КАК Наименование,
+ | АдресныеОбъекты.Сокращение КАК Сокращение,
+ | АдресныеОбъекты.Уровень КАК Уровень,
+ | АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ,
+ | АдресныеОбъекты.КодОкруга КАК КодОкруга,
+ | АдресныеОбъекты.КодРайона КАК КодРайона,
+ | АдресныеОбъекты.КодГорода КАК КодГорода,
+ | АдресныеОбъекты.КодВнутригородскогоРайона,
+ | АдресныеОбъекты.КодНаселенногоПункта,
+ | АдресныеОбъекты.КодУлицы,
+ | АдресныеОбъекты.КодДополнительногоЭлемента
+ |ПОМЕСТИТЬ ДополнительнаяТерритория
+ |ИЗ
+ | ДанныеАдреса КАК ДанныеАдреса
+ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
+ | ПО (АдресныеОбъекты.Уровень = 90)
+ | И ДанныеАдреса.Наименование = АдресныеОбъекты.Наименование
+ | И ДанныеАдреса.Сокращение = АдресныеОбъекты.Сокращение
+ |ГДЕ
+ | НЕ АдресныеОбъекты.Идентификатор ЕСТЬ NULL И " + УсловиеГдеДляДополнительныхТерриторий + "
+ |;
+ |
+ |////////////////////////////////////////////////////////////////////////////////
+ |ВЫБРАТЬ
+ | АдресныеОбъекты.Идентификатор КАК Идентификатор,
+ | АдресныеОбъекты.Наименование КАК Наименование,
+ | АдресныеОбъекты.Сокращение КАК Сокращение,
+ | АдресныеОбъекты.Уровень КАК Уровень,
+ | АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ,
+ | АдресныеОбъекты.КодОкруга КАК КодОкруга,
+ | АдресныеОбъекты.КодРайона КАК КодРайона,
+ | АдресныеОбъекты.КодГорода КАК КодГорода,
+ | АдресныеОбъекты.КодВнутригородскогоРайона,
+ | АдресныеОбъекты.КодНаселенногоПункта,
+ | АдресныеОбъекты.КодУлицы,
+ | АдресныеОбъекты.КодДополнительногоЭлемента,
+ | АдресныеОбъекты.КодПодчиненногоЭлемента
+ |ПОМЕСТИТЬ ЭлементДополнительнойТерритории
+ |ИЗ
+ | ДанныеАдреса КАК ДанныеАдреса
+ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
+ | ПО (АдресныеОбъекты.Уровень = 91)
+ | И ДанныеАдреса.Наименование = АдресныеОбъекты.Наименование
+ | И ДанныеАдреса.Сокращение = АдресныеОбъекты.Сокращение
+ |ГДЕ
+ | НЕ АдресныеОбъекты.Идентификатор ЕСТЬ NULL И " + УсловиеГдеДляДополнительныхТерриторий + "
+ |;
+ |
+ |////////////////////////////////////////////////////////////////////////////////
+ |ВЫБРАТЬ
+ | АдресныеОбъекты.Наименование + "" "" + АдресныеОбъекты.Сокращение КАК ДополнительнаяТерритория,
+ | АдресныеОбъекты.Уровень КАК ДополнительнаяТерриторияУровень,
+ | ЭлементДополнительнойТерритории.Наименование + "" "" + ЭлементДополнительнойТерритории.Сокращение КАК ЭлементДополнительнойТерритории,
+ | ЭлементДополнительнойТерритории.Уровень КАК ЭлементДополнительнойТерриторииУровень
+ |ИЗ
+ | ДополнительнаяТерритория КАК АдресныеОбъекты
+ | ЛЕВОЕ СОЕДИНЕНИЕ ЭлементДополнительнойТерритории КАК ЭлементДополнительнойТерритории
+ | ПО АдресныеОбъекты.КодДополнительногоЭлемента = ЭлементДополнительнойТерритории.КодДополнительногоЭлемента
+ |ГДЕ " + УсловиеГдеДляДополнительныхТерриторий;
+
+ Запрос.УстановитьПараметр("ДанныеАдреса", ЧастиАдреса);
+ ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();
+
+ Если ВыборкаДетальныеЗаписи.Следующий() Тогда
+
+ Если ЗначениеЗаполнено(ВыборкаДетальныеЗаписи.ДополнительнаяТерритория) Тогда
+ СтрокаАдреса = ЧастиАдреса.Найти(ВыборкаДетальныеЗаписи.ДополнительнаяТерритория, "Значение");
+ Если СтрокаАдреса <> Неопределено Тогда
+ СтрокаАдреса.Уровень = ВыборкаДетальныеЗаписи.ДополнительнаяТерриторияУровень;
+ КонецЕсли;
+ КонецЕсли;
+ Если ЗначениеЗаполнено(ВыборкаДетальныеЗаписи.ЭлементДополнительнойТерритории) Тогда
+ СтрокаАдреса = ЧастиАдреса.Найти(ВыборкаДетальныеЗаписи.ЭлементДополнительнойТерритории, "Значение");
+ Если СтрокаАдреса <> Неопределено Тогда
+ СтрокаАдреса.Уровень = ВыборкаДетальныеЗаписи.ЭлементДополнительнойТерриторииУровень;
+ КонецЕсли;
+ КонецЕсли;
+ КонецЕсли;
+
КонецПроцедуры
Процедура УстановитьУровниУлицыПоЧастямАдреса(ИдентификаторНаселенногоПункта, ЧастиАдреса) Экспорт
@@ -4480,6 +5066,7 @@
КонецПроцедуры
+
// Определяет улицу и дополнительную территорию, функция используется для совместимости данных перенесенных из КЛАДР.
//
// Параметры:
@@ -4781,7 +5368,7 @@
#КонецОбласти
-#Область СлужебныйПрограммныйИнтерфейсПреобразованиеТиповДанныхФИАС
+#Область ПреобразованиеТиповДанныхФИАС
// Преобразует УникальныйИдентификатор в ДвоичныеДанные.
//
@@ -4791,7 +5378,7 @@
// Возвращаемое значение:
// ДвоичныеДанные - результат преобразования.
//
-Функция УникальныйИдентификаторВДвоичныеДанные(Идентификатор)
+Функция УникальныйИдентификаторВДвоичныеДанные(Идентификатор)
ТипXDTOДвоичныеДанные = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "hexBinary");
ЗначениеHEX = ФабрикаXDTO.Создать(ТипXDTOДвоичныеДанные, СтрЗаменить(XMLСтрока(Идентификатор), "-", ""));
@@ -4803,12 +5390,12 @@
// Выполняет обратное действие для функции УникальныйИдентификаторВДвоичныеДанные.
//
// Параметры:
-// ДвоичныеДанные - исходные данные
+// ДвоичныеДанные - исходные данные.
//
// Возвращаемое значение:
// УникальныйИдентификатор - результат преобразования.
//
-Функция УникальныйИдентификаторИзДвоичныхДанных(ДвоичныеДанные)
+Функция УникальныйИдентификаторИзДвоичныхДанных(ДвоичныеДанные)
// Двоичные -> hex
ТипXDTOДвоичныеДанные = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "hexBinary");
@@ -4877,1351 +5464,6 @@
#КонецОбласти
-#Область ПрочиеСлужебныеПроцедурыИФункции
-
-// Возвращает информацию о состоянии загруженности регионов.
-//
-// Возвращаемое значение:
-// ТаблицаЗначений - описание состояния. Содержит колонки.
-// * КодСубъектаРФ - Число - Код региона.
-// * Идентификатор - УникальныйИдентификатор - Идентификатор региона.
-// * Представление - Строка - Наименование и сокращение региона.
-// * Загружено - Булево - Истина, если классификатор по данному региону сейчас загружен.
-// * ДатаВерсии - Дата - UTC версия загруженных данных.
-//
-Функция СведенияОЗагрузкеСубъектовРФ() Экспорт
-
- Классификатор = РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ();
-
- // Выбираем все возможные данные - и из регистра, и из классификатора.
- // Считаем, что уникальность обеспечивается не идентификатором (что правильно), а кодом субъекта
- // из-за особенностей платформы по передаче уникального идентификатора в таблицу-параметр запроса.
-
- Запрос = Новый Запрос("
- |ВЫБРАТЬ
- | Параметр.Наименование КАК Наименование,
- | Параметр.Сокращение КАК Сокращение,
- | Параметр.КодСубъектаРФ КАК КодСубъектаРФ
- |ПОМЕСТИТЬ
- | Классификатор
- |ИЗ
- | &Классификатор КАК Параметр
- |;///////////////////////////////////////////////////////////////////////////////////
- |
- |ВЫБРАТЬ
- | ВсеДоступныеРегионы.Наименование + "" "" + ВсеДоступныеРегионы.Сокращение КАК Представление,
- | ВсеДоступныеРегионы.КодСубъектаРФ КАК КодСубъектаРФ,
- | ИдентификаторыАдресныхОбъектов.Идентификатор КАК Идентификатор,
- | ВЫБОР
- | КОГДА АдресныеОбъекты.КодСубъектаРФ ЕСТЬ 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
- |
- |ЛЕВОЕ СОЕДИНЕНИЕ
- | РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК Версии
- |ПО
- | Версии.КодСубъектаРФ = ВсеДоступныеРегионы.КодСубъектаРФ
- |
- |УПОРЯДОЧИТЬ ПО
- | ВсеДоступныеРегионы.КодСубъектаРФ,
- | ВсеДоступныеРегионы.Наименование + "" "" + ВсеДоступныеРегионы.Сокращение
- |");
- Запрос.УстановитьПараметр("Классификатор", Классификатор);
-
- ЗагруженныеСведения = Запрос.Выполнить().Выгрузить();
- ЗагруженныеСведения.Индексы.Добавить("Идентификатор");
- ЗагруженныеСведения.Индексы.Добавить("КодСубъектаРФ");
- ЗагруженныеСведения.Индексы.Добавить("Загружено");
-
- // Корректируем идентификаторы из-за особенностей платформы по передаче уникального
- // идентификатора в таблицу-параметр запроса.
- Для Каждого Строка Из ЗагруженныеСведения Цикл
- Если Не ЗначениеЗаполнено(Строка.Идентификатор) Тогда
- СтрокаКлассификатора = Классификатор.Найти(Строка.КодСубъектаРФ, "КодСубъектаРФ");
- Если СтрокаКлассификатора <> Неопределено Тогда
- Строка.Идентификатор = СтрокаКлассификатора.Идентификатор;
- КонецЕсли;
- КонецЕсли;
- КонецЦикла;
-
- Возврат ЗагруженныеСведения;
-КонецФункции
-
-// Возвращает краткую информацию о состоянии загруженности регионов.
-//
-// Возвращаемое значение:
-// Структура - описание состояния. Содержит колонки.
-// * КоличествоРегионов - Число - Общие количество регионов.
-// * КоличествоЗагруженныхРегионов - Число - количество загруженных регионов.
-Функция КраткиеСведенияОЗагрузкеСубъектовРФ() Экспорт
-
- Результат = Новый Структура("КоличествоРегионов, КоличествоЗагруженныхРегионов");
-
- Результат.КоличествоЗагруженныхРегионов = АдресныйКлассификатор.КоличествоЗагруженныхРегионов();
-
- Классификатор = РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ();
- Результат.КоличествоРегионов = Классификатор.Количество();
-
- Возврат Результат;
-КонецФункции
-
-// Проверяет наличие загруженных адресных сведений по региону.
-//
-Функция РегионЗагружен(НаименованиеРегиона) Экспорт
-
- СведенияОРегионе = АдресныйКлассификаторКлиентСервер.НаименованиеИСокращение(НаименованиеРегиона);
-
- Запрос = Новый Запрос;
- Запрос.Текст =
- "ВЫБРАТЬ ПЕРВЫЕ 1
- | АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ,
- | ВЫБОР
- | КОГДА НЕ ЗагруженныеДанные.Идентификатор ЕСТЬ NULL
- | ТОГДА ИСТИНА
- | ИНАЧЕ ЛОЖЬ
- | КОНЕЦ КАК РегионЗагружен
- |ИЗ
- | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
- | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК ЗагруженныеДанные
- | ПО (ЗагруженныеДанные.Уровень > 1)
- | И АдресныеОбъекты.КодСубъектаРФ = ЗагруженныеДанные.КодСубъектаРФ
- |ГДЕ
- | АдресныеОбъекты.Наименование = &Наименование
- | И АдресныеОбъекты.Сокращение = &Сокращение
- | И АдресныеОбъекты.Уровень = 1";
-
- Запрос.УстановитьПараметр("Наименование", СведенияОРегионе.Наименование);
- Запрос.УстановитьПараметр("Сокращение", СведенияОРегионе.Сокращение);
-
- РезультатЗапроса = Запрос.Выполнить().Выбрать();
-
- Если РезультатЗапроса.Следующий() Тогда
- Возврат РезультатЗапроса.РегионЗагружен;
- КонецЕсли;
-
- Возврат Неопределено;
-
-КонецФункции
-
-// Загрузка всех данных классификатора адресов.
-//
-// Параметры:
-// КодыСубъектовРФ - Массив - Содержит числовые коды регионов-субъектов для загрузки.
-//
-// ОписаниеФайлов - Строка, Массив - Каталог на сервере, в котором находятся файлы данных. Ожидается, что имена
-// файлов будут в верхнем регистре.
-// Массив элементов типа ОписаниеПередаваемогоФайла или структур с полями.
-// * Имя - Строка - Имя или полное имя передаваемого файла.
-// * Хранение - ДвоичныеДанные, Строка - Описание хранения файла. Строка
-// может быть путем на файловой системе или адресом во временном
-// хранилище.
-// ОповещатьОПрогрессе - Булево - Флаг оповещения о прогрессе (см ДлительныеОперации.СообщитьПрогресс).
-//
-Процедура ЗагрузитьКлассификаторАдресов(КодыСубъектовРФ, ОписаниеФайлов, ОповещатьОПрогрессе = Истина) Экспорт
-
- ДатаЗагрузки = ТекущаяУниверсальнаяДата();
-
- Если ТипЗнч(ОписаниеФайлов) = Тип("Строка") Тогда
- // Файлы уже подготовлены
- КаталогФайлов = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ОписаниеФайлов);
- Иначе
- // Извлекаем файлы
- КаталогФайлов = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути( ПолучитьИмяВременногоФайла() );
- СоздатьКаталог(КаталогФайлов);
-
- Для Каждого ОписаниеФайла Из ОписаниеФайлов Цикл
- Файл = Новый Файл(ОписаниеФайла.Имя);
- ПолноеИмяФайла = КаталогФайлов + ВРег(Файл.Имя);;
-
- Данные = ОписаниеФайла.Хранение;
- ТипДанных = ТипЗнч(Данные);
-
- Если ТипДанных = Тип("ДвоичныеДанные") Тогда
- Данные.Записать(ПолноеИмяФайла);
-
- ИначеЕсли ЭтоАдресВременногоХранилища(Данные) Тогда
- Данные = ПолучитьИзВременногоХранилища(Данные);
- Данные.Записать(ПолноеИмяФайла);
-
- Иначе
- ПолноеИмяФайла = Данные;
-
- КонецЕсли;
-
- Если ВРег(Прав(ПолноеИмяФайла, 4)) = ".ZIP" Тогда
- Архив = Новый ЧтениеZipФайла(ПолноеИмяФайла);
- Архив.ИзвлечьВсе(КаталогФайлов, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
- УдалитьВременныйФайл(ПолноеИмяФайла);
- КонецЕсли;
-
- КонецЦикла;
-
- КонецЕсли;
-
- ВидыСведенийНеОбработаны = Истина;
-
- // 2. Все заказанные субъекты
- ВсегоСубъектов = КодыСубъектовРФ.Количество();
- НомерПоПорядку = 0;
-
- Для Каждого СубъектРФ Из КодыСубъектовРФ Цикл
-
- НомерПоПорядку = НомерПоПорядку + 1;
- Если ОповещатьОПрогрессе Тогда
- ДлительныеОперации.СообщитьПрогресс( , СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Загрузка региона ""%1 - %2"" ...'"),
- СубъектРФ, АдресныйКлассификатор.НаименованиеРегионаПоКоду(СубъектРФ)));
- КонецЕсли;
-
- Если ВидыСведенийНеОбработаны Тогда
- // Общая справочная информация, понадобится потом.
- СлужебныеАдресныеСведения = СлужебныеАдресныеСведения(Неопределено, КаталогФайлов);
-
- // И сразу запишем
- Набор = РегистрыСведений.СлужебныеАдресныеСведения.СоздатьНаборЗаписей();
- Набор.Загрузить(СлужебныеАдресныеСведения.Сведения);
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); // Отключаем всю бизнес-логику для ускорения операции.
-
- ВидыСведенийНеОбработаны = Ложь;
- КонецЕсли;
-
- НачатьТранзакцию();
- Попытка
-
- ВерсияСубъектаРФ = ИнформацияОЗагрузкеВерсии(СубъектРФ).Версия;
- Если ВерсияСубъектаРФ <> СлужебныеАдресныеСведения.Версия Тогда
- ЗагрузитьАдресныеОбъекты(СубъектРФ, КаталогФайлов, СлужебныеАдресныеСведения.Сведения);
- ЗагрузитьДомаЗданияСтроения(СубъектРФ, КаталогФайлов, СлужебныеАдресныеСведения.Сведения);
- ЗагрузитьИсториюАдресныхОбъектов(СубъектРФ, КаталогФайлов, СлужебныеАдресныеСведения.Сведения);
- ЗагрузитьПричиныИзмененияАдреса(СубъектРФ, КаталогФайлов, СлужебныеАдресныеСведения.Сведения);
- ЗагрузитьДополнительныеСведения(СубъектРФ, КаталогФайлов, СлужебныеАдресныеСведения.Сведения);
- ЗагрузитьАдресныеОриентиры(СубъектРФ, КаталогФайлов, СлужебныеАдресныеСведения.Сведения);
-
- // Ставим версию данных загрузки региона.
- УстановитьИнформациюОЗагрузкеВерсии(СубъектРФ, СлужебныеАдресныеСведения.Версия, СлужебныеАдресныеСведения.ДатаВерсии, ДатаЗагрузки);
-
- // Очищаем загруженные данные в старом классификаторе.
- ОчиститьСведенияУстаревшегоКлассификатора(СубъектРФ);
- КонецЕсли;
-
- ЗафиксироватьТранзакцию();
- Исключение
- ОтменитьТранзакцию();
- ВызватьИсключение;
- КонецПопытки;
-
- КонецЦикла;
-
- // 3. Обновляем список субъектов РФ - убеждаемся, что у нас есть все корневые записи.
- РегистрыСведений.АдресныеОбъекты.ОбновитьСоставСубъектовРФПоКлассификатору();
-
- // 4. Загружаем сокращения адресов.
- // Эти данные будут нужны при разборах адреса из строки.
-
- АдресныеСокращения = АдресныеСокращения(КаталогФайлов);
- Набор = РегистрыСведений.УровниСокращенийАдресныхСведений.СоздатьНаборЗаписей();
- Набор.Загрузить(АдресныеСокращения.Сведения);
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); // Отключаем всю бизнес-логику для ускорения операции.
-
- // 5. Очищаем временный каталог.
- Если ТипЗнч(ОписаниеФайлов) = Тип("Строка") Тогда
- УдалитьВременныйФайл(КаталогФайлов);
- КонецЕсли;
-
- //6. Удаляет устаревшие данные КЛАДР если они есть
- ОчиститьУстаревшиеАдресныеСведенияКЛАДР();
-
-КонецПроцедуры
-
-// Удаляет устаревшие данные КЛАДР.
-//
-Процедура ОчиститьУстаревшиеАдресныеСведенияКЛАДР()
-
- Запрос = Новый Запрос;
- Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
- | УдалитьАдресныйКлассификатор.Код
- |ИЗ
- | РегистрСведений.УдалитьАдресныйКлассификатор КАК УдалитьАдресныйКлассификатор";
-
- РезультатЗапроса = Запрос.Выполнить().Выбрать();
- Если РезультатЗапроса .Следующий() Тогда
- ВесьРегистр = РегистрыСведений.УдалитьАдресныйКлассификатор.СоздатьНаборЗаписей();
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(ВесьРегистр);
- КонецЕсли;
-
-КонецПроцедуры
-
-// Загрузка всех данных классификатора адресов с сайта.
-//
-// Параметры:
-// КодыСубъектовРФ - Массив - Содержит числовые коды регионов-субъектов для загрузки. Если не указано, то будут
-// загружены все регионы, по которым когда-либо загружались данные.
-// Авторизация - Структура - описание авторизации на сайте поддержки 1С. Если не указано, то будет прочитано из базы.
-// * Логин - Строка - Данные авторизации.
-// * Пароль - Строка - Данные авторизации.
-//
-Процедура ЗагрузитьКлассификаторАдресовССайта(КодыСубъектовРФ = Неопределено, ИсходнаяАвторизация = Неопределено) Экспорт
-
- Если ИсходнаяАвторизация = Неопределено Тогда
- Авторизация = СтандартныеПодсистемыСервер.ПараметрыАутентификацииНаСайте();
- Иначе
- Авторизация = ИсходнаяАвторизация;
- КонецЕсли;
-
- Если КодыСубъектовРФ = Неопределено Тогда
- ВсеРегионы = СведенияОЗагрузкеСубъектовРФ();
- ЗагруженныеРегионы = ВсеРегионы.Скопировать(Новый Структура("Загруженный", Истина));
- КодыСубъектовРФ = ЗагруженныеРегионы.ВыгрузитьКолонку("КодСубъектаРФ");
- КонецЕсли;
-
- ВременныйКаталог = ПолучитьИмяВременногоФайла();
- СоздатьКаталог(ВременныйКаталог);
- ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ВременныйКаталог);
-
- КодыСубъектовДляЗагрузки = Новый Массив;
- ОписаниеФайлов = Новый Массив;
-
- ПараметрыПолучения = Новый Структура;
- Если Авторизация <> Неопределено Тогда
- ПараметрыПолучения.Вставить("Пользователь", Авторизация.Логин);
- ПараметрыПолучения.Вставить("Пароль", Авторизация.Пароль);
- КонецЕсли;
-
- ВсеВерсии = ДоступныеВерсииАдресныхСведений();
- Для Каждого КодСубъекта Из КодыСубъектовРФ Цикл
- ОписаниеРегиона = ВсеВерсии.Найти(КодСубъекта, "КодСубъектаРФ");
- Если ОписаниеРегиона = Неопределено Тогда
- // Возможно устаревший регион, не ошибка.
- Продолжить;
- КонецЕсли;
-
- ФайлРегиона = АдресИнтернетаВключаяПорт(ОписаниеРегиона.Адрес);
- ПутьДляСохранения = ВременныйКаталог + ВРег(ФайлРегиона.ИмяФайла);
-
- ПараметрыПолучения.Вставить("ПутьДляСохранения", ПутьДляСохранения);
- ЗагруженныйФайл = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(ОписаниеРегиона.Адрес, ПараметрыПолучения);
- Если Не ЗагруженныйФайл.Статус Тогда
- УдалитьВременныйФайл(ВременныйКаталог);
- ВызватьИсключение ЗагруженныйФайл.СообщениеОбОшибке + Символы.ПС +
- НСтр("ru = 'Возможные причины:
- |• Некорректно введен или не введен логин и пароль;
- |• Нет подключения к Интернету;
- |• На веб-узле возникли неполадки;
- |• Брандмауэр или другое промежуточное ПО (антивирусы и т.п.) блокируют попытки программы подключиться к Интернету;
- |• Подключение к Интернету выполняется через прокси-сервер, но его параметры не заданы в программе.'");
- КонецЕсли;
-
- КодыСубъектовДляЗагрузки.Добавить(КодСубъекта);
- ОписаниеФайлов.Добавить( Новый Структура("Имя, Хранение", ПутьДляСохранения, ПутьДляСохранения) );
- КонецЦикла;
-
- ЗагрузитьКлассификаторАдресов(КодыСубъектовДляЗагрузки, ОписаниеФайлов);
- УдалитьВременныйФайл(ВременныйКаталог);
-
-КонецПроцедуры
-
-// Очистка данных классификатора адресов.
-//
-// Параметры:
-// КодыСубъектовРФ - Массив - Содержит числовые коды регионов-субъектов для очистки.
-//
-Процедура ОчиститьКлассификаторАдресов(КодыСубъектовРФ) Экспорт
-
- // Все заказанные субъекты
- ВсегоСубъектов = КодыСубъектовРФ.Количество();
- НомерПоПорядку = 0;
-
- Для Каждого СубъектРФ Из КодыСубъектовРФ Цикл
-
- НомерПоПорядку = НомерПоПорядку + 1;
- ДлительныеОперации.СообщитьПрогресс( , СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Очистка региона ""%1 - %2"" (осталось %3) ...'"),
- СубъектРФ, АдресныйКлассификатор.НаименованиеРегионаПоКоду(СубъектРФ),
- Формат(ВсегоСубъектов - НомерПоПорядку, "ЧН=")
- ));
-
- НачатьТранзакцию();
- Попытка
-
- ОчиститьАдресныеОбъекты(СубъектРФ);
- ОчиститьДомаЗданияСтроения(СубъектРФ);
- ОчиститьИсториюАдресныхОбъектов(СубъектРФ);
- ОчиститьПричиныИзмененияАдреса(СубъектРФ);
- ОчиститьДополнительныеСведения(СубъектРФ);
- ОчиститьАдресныеОриентиры(СубъектРФ);
-
- СброситьИнформациюОЗагрузкеВерсии(СубъектРФ);
-
- ЗафиксироватьТранзакцию();
- Исключение
- ОтменитьТранзакцию();
- ВызватьИсключение;
- КонецПопытки;
-
- КонецЦикла;
-
-КонецПроцедуры
-
-// Набор разрешений профилей безопасности для проверки наличия обновления на сайте 1С.
-//
-// Возвращаемое значение:
-// Массив - необходимые разрешения.
-//
-Функция РазрешенияБезопасностиОбновления() Экспорт
-
- Разрешения = Новый Массив;
-
- // Запрос обновления
- Адрес = ОбщегоНазначенияКлиентСервер.СтруктураURI( АдресФайлаОписанияДоступныхВерсий() );
- Разрешения.Добавить( РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(
- ВРег(Адрес.Схема), Адрес.Хост, Адрес.Порт, НСтр("ru = 'Проверка обновления адресного классификатора.'")
- ));
-
- // Корневой каталог данных - используется только для получения разрешения.
- // Фактический адрес для загрузки считывается из файла обновлений.
- Адрес = ОбщегоНазначенияКлиентСервер.СтруктураURI("http://downloads.v8.1c.ru/tmplts/ITS/KLADR/");
- Разрешения.Добавить( РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(
- ВРег(Адрес.Схема), Адрес.Хост, Адрес.Порт, НСтр("ru = 'Загрузка данных адресного классификатора.'")
- ));
-
- Возврат Разрешения;
-КонецФункции
-
-// Путь к файлу на веб сервере, содержащему информацию по версиям адресных сведений.
-//
-// Возвращаемое значение:
-// Строка - путь к файлу описания данных.
-//
-Функция АдресФайлаОписанияДоступныхВерсий() Экспорт
-
- Возврат "http://downloads.1c.ru/ipp/ITSREPV/V8Update/fias/version.zip";
-
-КонецФункции
-
-// Пространство имен для операций XDTO.
-//
-// Возвращаемое значение:
-// Строка
-//
-Функция ПространствоИмен() Экспорт
-
- Возврат "http://www.v8.1c.ru/ssl/AddressSystem";
-
-КонецФункции
-
-// Проверяет наличие обновлений адресного классификатора на веб сервере
-// для тех объектов, которые ранее уже загружались.
-//
-// Возвращаемое значение - ТаблицаЗначений - Описание добавленных и измененных субъектов. Содержит Колонки.
-// * КодСубъектаРФ - Число - Код субъекта РФ.
-// * Наименование - Строка - Наименование субъекта РФ.
-// * Сокращение - Строка - Сокращение субъекта РФ.
-// * Индекс - Число - Почтовый индекс.
-// * Идентификатор - УникальныйИдентификатор - Идентификатор субъекта.
-// * Адрес - Строка - Адрес для скачивания файла данных региона.
-// * ДоступноОбновление - Булево - Флаг доступности обновления для данного региона.
-// * Загружено - Булево - Флаг того, что данные хоть раз загружались.
-//
-Функция ДоступныеВерсииАдресныхСведений() Экспорт
-
- Результат = Новый ТаблицаЗначений;
-
- ТипСтрока = Новый ОписаниеТипов("Строка");
- ТипЧисло = Новый ОписаниеТипов("Число");
- ТипБулево = Новый ОписаниеТипов("Булево");
- Колонки = Результат.Колонки;
-
- Колонки.Добавить("КодСубъектаРФ", ТипЧисло);
- Колонки.Добавить("Наименование", ТипСтрока);
- Колонки.Добавить("Сокращение", ТипСтрока);
- Колонки.Добавить("Индекс", ТипЧисло);
- Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("УникальныйИдентификатор") );
- Колонки.Добавить("Адрес", ТипСтрока);
- Колонки.Добавить("ДоступноОбновление", ТипБулево);
- Колонки.Добавить("Загружено", ТипБулево);
-
- Результат.Индексы.Добавить("КодСубъектаРФ");
-
- АдресОписания = АдресИнтернетаВключаяПорт( АдресФайлаОписанияДоступныхВерсий() );
- РезультатПолученияФайла = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(АдресОписания.Адрес);
- Если Не РезультатПолученияФайла.Статус Тогда
- ВызватьИсключение РезультатПолученияФайла.СообщениеОбОшибке;
- КонецЕсли;
-
- // Получен zip, внутри которого xml.
- КаталогДляРаспаковки = ПолучитьИмяВременногоФайла();
- Архив = Новый ЧтениеZipФайла(РезультатПолученияФайла.Путь);
- Архив.ИзвлечьВсе(КаталогДляРаспаковки);
- ФайлОписания = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогДляРаспаковки) + "version.xml";
-
- ЧтениеXML = Новый ЧтениеXML;
- ЧтениеXML.ОткрытьФайл(ФайлОписания);
- ДоступныеДанные = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ФабрикаXDTO.Тип( ПространствоИмен(), "Publications") );
-
- ЧтениеXML.Закрыть();
- УдалитьВременныйФайл(КаталогДляРаспаковки);
- УдалитьВременныйФайл(РезультатПолученияФайла.Путь);
-
- ДатаПоследнейВерсии = '00000000';
- ПоследняяПубликация = Неопределено;
-
- Для Каждого Публикация Из ДоступныеДанные.ПолучитьСписок("Publication") Цикл
- Если Публикация.UpdateDate > ДатаПоследнейВерсии Тогда
- ДатаПоследнейВерсии = Публикация.UpdateDate;
- ПоследняяПубликация = Публикация;
- КонецЕсли;
- КонецЦикла;
-
- Если ПоследняяПубликация = Неопределено Тогда
- // Нет данных совсем
- Возврат Результат;
- КонецЕсли;
-
- // Сравниваем то что в регистре, и то что прочитали.
- ТекущиеСубъекты = СведенияОЗагрузкеСубъектовРФ();
-
- Для Каждого ЗаписьРегиона Из ПоследняяПубликация.ПолучитьСписок("Region") Цикл
- Идентификатор = УникальныйИдентификаторИзДвоичныхДанных(ЗаписьРегиона.AOGUID);
- ТекущийСубъект = ТекущиеСубъекты.Найти(Идентификатор, "Идентификатор");
-
- СтрокаРегиона = Результат.Добавить();
- СтрокаРегиона.КодСубъектаРФ = ЗаписьРегиона.REGIONCODE;
- СтрокаРегиона.Наименование = ЗаписьРегиона.FORMALNAME;
- СтрокаРегиона.Сокращение = ЗаписьРегиона.SHORTNAME;
- СтрокаРегиона.Индекс = ЗаписьРегиона.POSTALCODE;
- СтрокаРегиона.Идентификатор = Идентификатор;
- СтрокаРегиона.Адрес = ЗаписьРегиона.Url;
- СтрокаРегиона.Загружено = ТекущийСубъект <> Неопределено И ТекущийСубъект.Загружено;
-
- СтрокаРегиона.ДоступноОбновление = ТекущийСубъект = Неопределено // Новый регион
- Или ТекущийСубъект.ДатаВерсии < ДатаПоследнейВерсии // Обновленный регион
- Или ( // Обновленные данные существующего субъекта.
- ТекущийСубъект.КодСубъектаРФ <> ЗаписьРегиона.REGIONCODE
- Или ТекущийСубъект.Представление <> ЗаписьРегиона.FORMALNAME
- Или ТекущийСубъект.Сокращение <> ЗаписьРегиона.SHORTNAME
- Или ТекущийСубъект.Индекс <> ЗаписьРегиона.POSTALCODE
- );
- КонецЦикла;
-
- Возврат Результат;
-КонецФункции
-
-// Возвращает описание последней загрузки классификатора.
-//
-// Возвращаемое значение:
-// Структура - содержит поля:
-// * ДатаПоследнейЗагрузки - Дата - Дата последней загрузки (часовой пояс сеанса).
-// * УниверсальнаяДатаПоследнейЗагрузки - Дата - Дата последней загрузки (UTC).
-// * ДнейНазад - Число - Количество дней от последней загрузки.
-// * Представление - Строка - Описание, например "Адресный классификатор был загружен
-// сегодня.";
-// * НеобходимоОбновление - Булево - Истина, если количество дней от последней загрузки превышает
-// период актуальности.
-//
-Функция ОписаниеПоследнейЗагрузки() Экспорт
-
- Результат = Новый Структура("ДнейНазад, ДатаПоследнейЗагрузки, УниверсальнаяДатаПоследнейЗагрузки, Представление, НеобходимоОбновление");
-
- // Определяем дату последней загрузки.
- Запрос = Новый Запрос("
- |ВЫБРАТЬ ПЕРВЫЕ 1
- | ДатаЗагрузки КАК ДатаЗагрузки
- |ИЗ
- | РегистрСведений.ЗагруженныеВерсииАдресныхСведений
- |УПОРЯДОЧИТЬ ПО
- | ДатаЗагрузки УБЫВ
- |");
- Выборка = Запрос.Выполнить().Выбрать();
- Если Выборка.Следующий() Тогда
- ДатаПоследнейЗагрузки = Выборка.ДатаЗагрузки;
- Иначе
- ДатаПоследнейЗагрузки = '00000000';
- КонецЕсли;
-
- Если ДатаПоследнейЗагрузки = '00000000' Тогда
- Результат.НеобходимоОбновление = Ложь;
- Результат.Представление = НСтр("ru = 'Адресный классификатор еще не загружался.'");
- Возврат Результат;
- КонецЕсли;
-
- Результат.УниверсальнаяДатаПоследнейЗагрузки = ДатаПоследнейЗагрузки;
- Результат.ДатаПоследнейЗагрузки = МестноеВремя(ДатаПоследнейЗагрузки, ЧасовойПоясСеанса());
-
- НачалоПериода = НачалоДня(ТекущаяУниверсальнаяДата());
- КонецПериода = НачалоДня(ДатаПоследнейЗагрузки);
- ДнейРазницы = Цел( (НачалоПериода - КонецПериода) / 86400 );
-
- Если ДнейРазницы = 0 Тогда
- Представление = НСтр("ru = 'Адресный классификатор был загружен сегодня.'");
-
- ИначеЕсли ДнейРазницы = 1 Тогда
- Представление = НСтр("ru = 'Адресный классификатор был загружен вчера.'");
-
- ИначеЕсли ДнейРазницы = 2 Тогда
- Представление = НСтр("ru = 'Адресный классификатор был загружен позавчера.'");
-
- Иначе
- Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Адресный классификатор был загружен %1 назад.'"), ОбщегоНазначения.ИнтервалВремениСтрокой(КонецПериода, НачалоПериода)
- );
-
- КонецЕсли;
-
- Результат.НеобходимоОбновление = ДнейРазницы > 30;
- Результат.ДнейНазад = ДнейРазницы;
- Результат.Представление = Представление;
-
- Возврат Результат;
-КонецФункции
-
-// Проверяет наличие записей о регионах в регистре сведений АдресныеОбъекты и заполняет их в случае отсутствия.
-//
-Процедура ПроверитьНачальноеЗаполнение() Экспорт
-
- Запрос = Новый Запрос;
- Запрос.Текст =
- "ВЫБРАТЬ ПЕРВЫЕ 1
- | АдресныеОбъекты.Уровень
- |ИЗ
- | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
- |ГДЕ
- | АдресныеОбъекты.Уровень = 1";
-
- РезультатЗапроса = Запрос.Выполнить().Выбрать();
-
- Если НЕ РезультатЗапроса.Следующий() Тогда
- ВыполнитьНачальноеЗаполнение();
- КонецЕсли;;
-
-КонецПроцедуры
-
-// Возвращает настройку текущего источника данных адресов.
-//
-// Возвращаемое значение:
-// Строка - описание источника. Пустая строка - используются загружаемые в регистр данные.
-//
-Функция ИсточникДанныхАдресногоКлассификатора() Экспорт
-
- Возврат ПолучитьФункциональнуюОпцию("ИсточникДанныхАдресногоКлассификатора");
-
-КонецФункции
-
-// Возвращает является ли источником данных веб сервис.
-//
-// Возвращаемое значение:
-// Булево - Если веб сервис является источником адресных сведений, то возвращает Истина.
-//
-Функция ИсточникДанныхАдресногоКлассификатораВебСервис() Экспорт
-
- Источник = ИсточникДанныхАдресногоКлассификатора();
- Если НЕ ПустаяСтрока(Источник) И Источник = "Сервис1С" Тогда
- Возврат Истина;
- КонецЕсли;
-
- Возврат Ложь;
-
-КонецФункции
-
-Процедура РассчитатьУровниСокращенийАдресныхСведений()
-
- Запрос = Новый Запрос("
- |ВЫБРАТЬ РАЗЛИЧНЫЕ
- | Уровень КАК Уровень,
- | Сокращение КАК Сокращение
- |ИЗ
- | РегистрСведений.АдресныеОбъекты
- |ОБЪЕДИНИТЬ
- |ВЫБРАТЬ
- | Уровень, Сокращение
- |ИЗ
- | РегистрСведений.ИсторияАдресныхОбъектов
- |");
- Варианты = Запрос.Выполнить().Выгрузить();
-
- Сокращения = РегистрыСведений.УровниСокращенийАдресныхСведений.СоздатьНаборЗаписей();
- Сокращения.Загрузить(Варианты);
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(Сокращения);
-
-КонецПроцедуры
-
-// Вычитываем справочную информацию и информацию о версии.
-//
-Функция СлужебныеАдресныеСведения(КодСубъектаРФ, КаталогФайлов)
-
- Набор = РегистрыСведений.СлужебныеАдресныеСведения.СоздатьНаборЗаписей();
- Сведения = Набор.ВыгрузитьКолонки("Тип, Идентификатор, Ключ, Значение");
- Сведения.Индексы.Добавить("Тип, Идентификатор, Ключ");
-
- ТекущаяЗапись = Неопределено;
- ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "ADDRSTATUS", "AddressStatuses");
-
- Пока СледующаяЗаписьФайлаЗагрузкиСубъектаРФ(ФайлЗагрузки, ТекущаяЗапись) Цикл
- Если ВРег(ТекущаяЗапись.TYPE) <> "SOCRBASE" Тогда
- Запись = Сведения.Добавить();
-
- Запись.Тип = ТекущаяЗапись.TYPE;
- Запись.Идентификатор = ТекущаяЗапись.ID;
- Запись.Ключ = ТекущаяЗапись.KEY;
- Запись.Значение = ТекущаяЗапись.VALUE;
- КонецЕсли;
- КонецЦикла;
-
- Результат = Новый Структура("Сведения", Сведения);
- Результат.Вставить("Версия", ФайлЗагрузки.Версия);
- Результат.Вставить("ДатаВерсии", ФайлЗагрузки.ДатаВерсии);
-
- ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
-
- Возврат Результат;
-КонецФункции
-
-// Вычитываем информацию о адресных сокращениях
-//
-Функция АдресныеСокращения(КаталогФайлов)
-
- Набор = РегистрыСведений.УровниСокращенийАдресныхСведений.СоздатьНаборЗаписей();
- Сведения = Набор.ВыгрузитьКолонки("Сокращение, Уровень, Значение");
- Сведения.Индексы.Добавить("Сокращение, Уровень");
-
- ТекущаяЗапись = Неопределено;
- ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(Неопределено, КаталогФайлов, "SOCRBASE", "AddressStatuses");
-
- Пока СледующаяЗаписьФайлаЗагрузкиСубъектаРФ(ФайлЗагрузки, ТекущаяЗапись) Цикл
- Если ВРег(ТекущаяЗапись.TYPE) = "SOCRBASE" И ЗначениеЗаполнено(ТекущаяЗапись.KEY) Тогда
- Запись = Сведения.Добавить();
- Запись.Уровень = ТекущаяЗапись.ID;
- Запись.Сокращение = ТекущаяЗапись.KEY;
- Запись.Значение = ТекущаяЗапись.VALUE;
- КонецЕсли;
- КонецЦикла;
-
- Результат = Новый Структура("Сведения", Сведения);
- Результат.Вставить("Версия", ФайлЗагрузки.Версия);
- Результат.Вставить("ДатаВерсии", ФайлЗагрузки.ДатаВерсии);
-
- ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
-
- Возврат Результат;
-КонецФункции
-
-
-Процедура ЗагрузитьАдресныеОбъекты(КодСубъектаРФ, КаталогФайлов, ВидыСведений)
-
- Набор = РегистрыСведений.АдресныеОбъекты.СоздатьНаборЗаписей();
- Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
-
- ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "ADDROBJ", "AddressObjects");
-
- ТекущаяЗапись = Неопределено;
- Пока СледующаяЗаписьФайлаЗагрузкиСубъектаРФ(ФайлЗагрузки, ТекущаяЗапись)Цикл
- Запись = Набор.Добавить();
-
- Запись.КодСубъектаРФ = ТекущаяЗапись.REGIONCODE;
- Запись.КодОкруга = ТекущаяЗапись.AUTOCODE;
- Запись.КодРайона = ТекущаяЗапись.AREACODE;
- Запись.КодГорода = ТекущаяЗапись.CITYCODE;
- Запись.КодВнутригородскогоРайона = ТекущаяЗапись.CTARCODE;
- Запись.КодНаселенногоПункта = ТекущаяЗапись.PLACECODE;
- Запись.КодУлицы = ТекущаяЗапись.STREETCODE;
- Запись.КодДополнительногоЭлемента = ТекущаяЗапись.EXTRCODE;
- Запись.КодПодчиненногоЭлемента = ТекущаяЗапись.SEXTCODE;
- Запись.Уровень = ТекущаяЗапись.AOLEVEL;
- Запись.Идентификатор = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.AOGUID);
- Запись.ПочтовыйИндекс = ТекущаяЗапись.POSTALCODE;
- Запись.Наименование = ТекущаяЗапись.FORMALNAME;
- Запись.Сокращение = ТекущаяЗапись.SHORTNAME;
- Запись.Дополнительно = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.EXTRAGUID);
- Запись.КодКЛАДР = ТекущаяЗапись.CODE;
- Запись.Актуален = ?(ТекущаяЗапись.CURRSTATUS = 0, Истина, Ложь);
- КонецЦикла;
-
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); // Отключаем всю бизнес-логику для ускорения операции.
- ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
-КонецПроцедуры
-
-Процедура ЗагрузитьДомаЗданияСтроения(КодСубъектаРФ, КаталогФайлов, ВидыСведений)
-
- Сжатие = Новый СжатиеДанных(9);
- ТипXMLСтрока = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "string");
-
- Набор = РегистрыСведений.ДомаЗданияСтроения.СоздатьНаборЗаписей();
- Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
- ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "HOUSE", "Houses");
-
- КлючевыеКолонки = "КодСубъектаРФ, АдресныйОбъект, ПочтовыйИндекс";
- Таблица = Набор.ВыгрузитьКолонки(КлючевыеКолонки);
- Таблица.Индексы.Добавить(КлючевыеКолонки);
- Фильтр = Новый Структура(КлючевыеКолонки);
-
- ТекущаяЗапись = Неопределено;
- Пока СледующаяЗаписьФайлаЗагрузкиСубъектаРФ(ФайлЗагрузки, ТекущаяЗапись) Цикл
-
- Фильтр.КодСубъектаРФ = КодСубъектаРФ;
- Фильтр.АдресныйОбъект = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.AOGUID);
- Фильтр.ПочтовыйИндекс = ТекущаяЗапись.POSTALCODE;
- Если Таблица.НайтиСтроки(Фильтр).Количество() > 0 Тогда
- Продолжить;
- КонецЕсли;
-
- Запись = Набор.Добавить();
-
- Запись.КодСубъектаРФ = КодСубъектаРФ;
- Запись.АдресныйОбъект = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.AOGUID);
- Запись.ПочтовыйИндекс = ТекущаяЗапись.POSTALCODE;
-
- ОписаниеЗданийXDTO = ТекущаяЗапись.ПолучитьXDTO("BUILDINGS");
- Запись.Строения = Новый ХранилищеЗначения(ОписаниеЗданийXDTO.ЛексическоеЗначение, Сжатие);
-
- ЗаполнитьЗначенияСвойств(Таблица.Добавить(), Запись);
- КонецЦикла;
-
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); // Отключаем всю бизнес-логику для ускорения операции.
- ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
-КонецПроцедуры
-
-Процедура ЗагрузитьДополнительныеСведения(КодСубъектаРФ, КаталогФайлов, ВидыСведений)
-
- Набор = РегистрыСведений.ДополнительныеАдресныеСведения.СоздатьНаборЗаписей();
- Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
- ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "EXTRAINFO", "AdditionalAddressInfo");
-
- ТекущаяЗапись = Неопределено;
- Пока СледующаяЗаписьФайлаЗагрузкиСубъектаРФ(ФайлЗагрузки, ТекущаяЗапись) Цикл
- Запись = Набор.Добавить();
-
- Запись.КодСубъектаРФ = КодСубъектаРФ;
- Запись.Идентификатор = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.EXTRAGUID);
- Запись.OKATO = ТекущаяЗапись.OKATO;
- Запись.ОКТМО = ТекущаяЗапись.OKTMO;
- Запись.КодИФНСФЛ = ТекущаяЗапись.IFNSFL;
- Запись.КодИФНСЮЛ = ТекущаяЗапись.IFNSUL;
- Запись.КодУчасткаИФНСФЛ = ТекущаяЗапись.TERRIFNSFL;
- Запись.КодУчасткаИФНСЮЛ = ТекущаяЗапись.TERRIFNSUL;
- КонецЦикла;
-
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); // Отключаем всю бизнес-логику для ускорения операции.
- ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
-
-КонецПроцедуры
-
-Процедура ЗагрузитьИсториюАдресныхОбъектов(КодСубъектаРФ, КаталогФайлов, ВидыСведений)
-
- Набор = РегистрыСведений.ИсторияАдресныхОбъектов.СоздатьНаборЗаписей();
- Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
- ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "ARCHOBJ", "ArchiveObjects");
-
- ТекущаяЗапись = Неопределено;
- Пока СледующаяЗаписьФайлаЗагрузкиСубъектаРФ(ФайлЗагрузки, ТекущаяЗапись) Цикл
-
- Запись = Набор.Добавить();
- Запись.Уровень = ТекущаяЗапись.AOLEVEL;
- Запись.КодСубъектаРФ = ТекущаяЗапись.REGIONCODE;
- Запись.КодОкруга = ТекущаяЗапись.AUTOCODE;
- Запись.КодРайона = ТекущаяЗапись.AREACODE;
- Запись.КодГорода = ТекущаяЗапись.CITYCODE;
- Запись.КодВнутригородскогоРайона = ТекущаяЗапись.CTARCODE;
- Запись.КодНаселенногоПункта = ТекущаяЗапись.PLACECODE;
- Запись.КодУлицы = ТекущаяЗапись.STREETCODE;
- Запись.КодДополнительногоЭлемента = ТекущаяЗапись.EXTRCODE;
- Запись.КодПодчиненногоЭлемента = ТекущаяЗапись.SEXTCODE;
- Запись.Идентификатор = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.AOID);
- Запись.ТекущийКодСубъектаРФ = КодСубъектаРФ;
-
- Запись.ПочтовыйИндекс = ТекущаяЗапись.POSTALCODE;
- Запись.Наименование = ТекущаяЗапись.FORMALNAME;
- Запись.Сокращение = ТекущаяЗапись.SHORTNAME;
- Запись.Дополнительно = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.EXTRAGUID);
- Запись.КодКЛАДР = ТекущаяЗапись.CODE;
- Запись.АдресныйОбъект = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.AOGUID);
- Запись.НачалоДействияЗаписи = ТекущаяЗапись.STARTDATE;
- Запись.ОкончаниеДействияЗаписи = ТекущаяЗапись.ENDDATE;
- Запись.Операция = ТекущаяЗапись.OPERSTATUS
- КонецЦикла;
-
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); // Отключаем всю бизнес-логику для ускорения операции.
- ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
-
-КонецПроцедуры
-
-Процедура ЗагрузитьПричиныИзмененияАдреса(КодСубъектаРФ, КаталогФайлов, ВидыСведений)
-
- Сжатие = Новый СжатиеДанных(9);
-
- Набор = РегистрыСведений.ПричиныИзмененияАдресныхСведений.СоздатьНаборЗаписей();
- Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
- ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "ARCHDOCS", "RegulatoryDocs");
-
- ТекущаяЗапись = Неопределено;
- Пока СледующаяЗаписьФайлаЗагрузкиСубъектаРФ(ФайлЗагрузки, ТекущаяЗапись) Цикл
- Запись = Набор.Добавить();
-
- Запись.КодСубъектаРФ = КодСубъектаРФ;
- Запись.Идентификатор = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.DOCID);
- Запись.ИзмененныйОбъект = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.OBJID);
- Запись.СодержитОписание = ТекущаяЗапись.ISDESCR;
- Запись.Описание = Новый ХранилищеЗначения(ТекущаяЗапись.DESCR, Сжатие);
- КонецЦикла;
-
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); // TOOD: Набор.Записать(Истина);
- ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
-
-КонецПроцедуры
-
-Процедура ЗагрузитьАдресныеОриентиры(КодСубъектаРФ, КаталогФайлов, ВидыСведений)
-
- Сжатие = Новый СжатиеДанных(9);
-
- Набор = РегистрыСведений.ОриентирыАдресныхОбъектов.СоздатьНаборЗаписей();
- Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
- ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "LANDMARKS", "Landmarks");
-
- ТекущаяЗапись = Неопределено;
- Пока СледующаяЗаписьФайлаЗагрузкиСубъектаРФ(ФайлЗагрузки, ТекущаяЗапись) Цикл
- Запись = Набор.Добавить();
-
- Запись.КодСубъектаРФ = КодСубъектаРФ;
- Запись.Идентификатор = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.LANDGUID);
- Запись.АдресныйОбъект = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.AOGUID);
- Запись.ПочтовыйИндекс = ТекущаяЗапись.POSTALCODE;
- Запись.Дополнительно = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.EXTRAGUID);
- Запись.Описание = Новый ХранилищеЗначения(ТекущаяЗапись.LOCATION, Сжатие);
- КонецЦикла;
-
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); // Отключаем всю бизнес-логику для ускорения операции.
- ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
-
-КонецПроцедуры
-
-Процедура УстановитьИнформациюОЗагрузкеВерсии(КодСубъектаРФ, Версия, ДатаВерсии, ДатаЗагрузки)
-
- Набор = РегистрыСведений.ЗагруженныеВерсииАдресныхСведений.СоздатьНаборЗаписей();
- Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
-
- ОсновнаяЗапись = Набор.Добавить();
- ОсновнаяЗапись.КодСубъектаРФ = КодСубъектаРФ;
- ОсновнаяЗапись.Версия = Версия;
- ОсновнаяЗапись.ДатаВерсии = ДатаВерсии;
- ОсновнаяЗапись.ДатаЗагрузки = ДатаЗагрузки;
-
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); // Отключаем всю бизнес-логику для ускорения операции.
-КонецПроцедуры
-
-Функция ИнформацияОЗагрузкеВерсии(КодСубъектаРФ)
-
- ПустаяДата = Дата(1, 1, 1, 0, 0, 0);
- ИнформацияОЗагрузке = Новый Структура("Версия, ДатаВерсии, ДатаЗагрузки", 0, ПустаяДата, ПустаяДата);
-
- Запрос = Новый Запрос;
- Запрос.Текст =
- "ВЫБРАТЬ
- | ЗагруженныеВерсииАдресныхСведений.Версия,
- | ЗагруженныеВерсииАдресныхСведений.ДатаВерсии,
- | ЗагруженныеВерсииАдресныхСведений.ДатаЗагрузки
- |ИЗ
- | РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК ЗагруженныеВерсииАдресныхСведений
- |ГДЕ
- | ЗагруженныеВерсииАдресныхСведений.КодСубъектаРФ = &КодСубъектаРФ";
-
- Запрос.УстановитьПараметр("КодСубъектаРФ", КодСубъектаРФ);
- Результат = Запрос.Выполнить().Выгрузить();
- Если Результат.Количество() > 0 Тогда
- ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
- ИнформацияОЗагрузке.Версия = ОписаниеТипаЧисло.ПривестиЗначение(Результат[0].Версия);
- ИнформацияОЗагрузке.ДатаВерсии = Результат[0].ДатаВерсии;
- ИнформацияОЗагрузке.ДатаЗагрузки = Результат[0].ДатаЗагрузки;
- КонецЕсли;
- Возврат ИнформацияОЗагрузке;
-
-КонецФункции
-
-Процедура СброситьИнформациюОЗагрузкеВерсии(КодСубъектаРФ)
-
- Набор = РегистрыСведений.ЗагруженныеВерсииАдресныхСведений.СоздатьНаборЗаписей();
- Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); // Отключаем всю бизнес-логику для ускорения операции.
-
-КонецПроцедуры
-
-Процедура ОчиститьАдресныеОбъекты(КодСубъектаРФ)
- // Очищаем, не трогая запись региона.
-
- Набор = РегистрыСведений.АдресныеОбъекты.СоздатьНаборЗаписей();
- Отбор = Набор.Отбор;
-
- Отбор.Уровень.Установить(1);
- Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
- Отбор.КодОкруга.Установить(0);
- Отбор.КодРайона.Установить(0);
- Отбор.КодГорода.Установить(0);
- Отбор.КодВнутригородскогоРайона.Установить(0);
- Отбор.КодНаселенногоПункта.Установить(0);
- Отбор.КодУлицы.Установить(0);
- Отбор.КодДополнительногоЭлемента.Установить(0);
- Отбор.КодПодчиненногоЭлемента.Установить(0);
- Набор.Прочитать();
-
- Отбор.Сбросить();
- Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); // Отключаем всю бизнес-логику для ускорения операции.
-
-КонецПроцедуры
-
-Процедура ОчиститьДомаЗданияСтроения(КодСубъектаРФ)
-
- Набор = РегистрыСведений.ДомаЗданияСтроения.СоздатьНаборЗаписей();
- Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); // Отключаем всю бизнес-логику для ускорения операции.
-
-КонецПроцедуры
-
-Процедура ОчиститьДополнительныеСведения(КодСубъектаРФ)
-
- Набор = РегистрыСведений.ДополнительныеАдресныеСведения.СоздатьНаборЗаписей();
- Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); // Отключаем всю бизнес-логику для ускорения операции.
-
-КонецПроцедуры
-
-Процедура ОчиститьИсториюАдресныхОбъектов(КодСубъектаРФ)
-
- Набор = РегистрыСведений.ИсторияАдресныхОбъектов.СоздатьНаборЗаписей();
- Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); // Отключаем всю бизнес-логику для ускорения операции.
-
-КонецПроцедуры
-
-Процедура ОчиститьПричиныИзмененияАдреса(КодСубъектаРФ)
-
- Набор = РегистрыСведений.ПричиныИзмененияАдресныхСведений.СоздатьНаборЗаписей();
- Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); // Отключаем всю бизнес-логику для ускорения операции.
-
-КонецПроцедуры
-
-Процедура ОчиститьАдресныеОриентиры(КодСубъектаРФ)
-
- Набор = РегистрыСведений.ОриентирыАдресныхОбъектов.СоздатьНаборЗаписей();
- Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); // Отключаем всю бизнес-логику для ускорения операции.
-
-КонецПроцедуры
-
-Процедура ОчиститьСведенияУстаревшегоКлассификатора(КодСубъектаРФ)
-
- Запрос = Новый Запрос("
- |ВЫБРАТЬ ПЕРВЫЕ 1
- | ТипАдресногоЭлемента,
- | КодАдресногоОбъектаВКоде,
- | КодРайонаВКоде,
- | КодГородаВКоде,
- | КодНаселенногоПунктаВКоде,
- | КодУлицыВКоде,
- | Код,
- | Наименование,
- | Сокращение,
- | Индекс,
- | АльтернативныеНазвания,
- | ПризнакАктуальности
- |ИЗ
- | РегистрСведений.УдалитьАдресныйКлассификатор
- |ГДЕ
- | ТипАдресногоЭлемента = 1
- | И КодАдресногоОбъектаВКоде = &КодСубъектаРФ
- |");
- Запрос.УстановитьПараметр("КодСубъектаРФ", КодСубъектаРФ);
- Регион = Запрос.Выполнить().Выгрузить();
-
- Набор = РегистрыСведений.УдалитьАдресныйКлассификатор.СоздатьНаборЗаписей();
- Набор.Отбор.КодАдресногоОбъектаВКоде.Установить(КодСубъектаРФ);
-
- Если Регион.Количество() > 0 Тогда
- ЗаполнитьЗначенияСвойств(Набор.Добавить(), Регион[0]);
- КонецЕсли;
-
- ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); // Отключаем всю бизнес-логику для ускорения операции.
-КонецПроцедуры
-
-// Инициализирует структуру описания файла данных адресных сведений.
-//
-Функция ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, КлючВида, ИмяОписывающегоУзла)
-
- Если КодСубъектаРФ = Неопределено Тогда
- ИмяИсходногоФайла = КлючВида;
- Иначе
- ИмяИсходногоФайла = Формат(КодСубъектаРФ, "ЧЦ=2; ЧН=; ЧВН=") + "_" + КлючВида;
- КонецЕсли;
-
- Результат = Новый Структура;
-
- // Как архив
- Файл = АдресныйКлассификаторКлиентСервер.НайтиФайл(КаталогФайлов, ИмяИсходногоФайла + ".ZIP");
- Если Файл.Существует Тогда
- ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути( ПолучитьИмяВременногоФайла() );
-
- ЧтениеZipФайла = Новый ЧтениеZipФайла(Файл.ПолноеИмя);
- Элемент = ЧтениеZipФайла.Элементы[0];
- ЧтениеZipФайла.Извлечь(Элемент, ВременныйКаталог);
-
- Результат.Вставить("Путь", ВременныйКаталог);
- Результат.Вставить("ПолноеИмя", ВременныйКаталог + Элемент.ПолноеИмя);
- Результат.Вставить("УдалитьПутьПриЗакрытии", Истина);
- Иначе
- // Как обычный файл
- Результат.Вставить("Путь", КаталогФайлов);
- Результат.Вставить("УдалитьПутьПриЗакрытии", Ложь);
- Результат.Вставить("ПолноеИмя", КаталогФайлов + ИмяИсходногоФайла + ".FI");
- КонецЕсли;
-
- // Тип заголовка
- СвойствоЗаголовка = ФабрикаXDTO.Пакеты.Получить(ПространствоИмен()).КорневыеСвойства.Получить(ИмяОписывающегоУзла);
- ТипXDTOЗаголовка = СвойствоЗаголовка.Тип;
-
- // Тип записи
- Заголовок = ФабрикаXDTO.Создать(ТипXDTOЗаголовка);
- ТипXDTOЗаписи = Неопределено;
- Для Каждого Свойство Из ТипXDTOЗаголовка.Свойства Цикл
- Если Заголовок.ПолучитьСписок(Свойство.ЛокальноеИмя) <> Неопределено Тогда
- ТипXDTOЗаписи = Свойство.Тип;
- Прервать;
- КонецЕсли;
- КонецЦикла;
-
- Если ТипXDTOЗаписи = Неопределено Тогда
- ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'В файле ""%1"" не найден список записей в типе %2'"), Результат.ПолноеИмя, Результат.ТипXDTO
- );
- КонецЕсли;
-
- Результат.Вставить("ТипXDTO", ТипXDTOЗаголовка);
- Результат.Вставить("ТипXDTOЗаписи", ТипXDTOЗаписи);
-
- Результат.Вставить("Версия");
- Результат.Вставить("ДатаВерсии");
- Результат.Вставить("ФайлЧтения", Новый ЧтениеFastInfoset);
-
- ФайлЧтения = Результат.ФайлЧтения;
- ФайлЧтения.ОткрытьФайл(Результат.ПолноеИмя);
-
- // Встаем на первый узел с данными.
- КореньНайден = ФайлЧтения.ПерейтиКСодержимому() <> ТипУзлаXML.Ничего;
- Пока КореньНайден Цикл
- Если ФайлЧтения.ТипУзла = ТипУзлаXML.НачалоЭлемента И ФайлЧтения.ЛокальноеИмя = ИмяОписывающегоУзла Тогда
- // Корявое чтение с типизацией.
- Результат.Версия = ТипизированныйАтрибутXDTO(ФайлЧтения, ТипXDTOЗаголовка, "Version");
- Результат.ДатаВерсии = ТипизированныйАтрибутXDTO(ФайлЧтения, ТипXDTOЗаголовка, "UpdateDate");
- Прервать;
- КонецЕсли;
- КореньНайден = ФайлЧтения.Прочитать();
- КонецЦикла;
-
- Если КореньНайден Тогда
- // Позиционируемся на следующий узел.
- ФайлЧтения.Прочитать();
- Иначе
- ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'В файле ""%1"" не найден корневой узел %2'"), Результат.ПолноеИмя, ИмяОписывающегоУзла
- );
- КонецЕсли;
-
- Результат.Вставить("КодСубъектаРФ", КодСубъектаРФ);
- Результат.Вставить("КлючВида", КлючВида);
-
- Возврат Результат;
-КонецФункции
-
-Функция ТипизированныйАтрибутXDTO(ФайлЧтения, ТипЗаписи, ИмяАтрибута)
-
- ТипАтрибута = ТипЗаписи.Свойства.Получить(ИмяАтрибута).Тип;
- ЗначениеXDTO = ФабрикаXDTO.Создать(ТипАтрибута, ФайлЧтения.ПолучитьАтрибут(ИмяАтрибута));
-
- Возврат ЗначениеXDTO.Значение;
-КонецФункции
-
-// Завершает работу с набором данных.
-//
-Процедура ЗакрытьФайлЗагрузкиСубъектаРФ(ОписаниеФайла)
-
- ОписаниеФайла.ФайлЧтения.Закрыть();
- ОписаниеФайла.ФайлЧтения = Неопределено;
-
- Если ОписаниеФайла.УдалитьПутьПриЗакрытии Тогда
- УдалитьВременныйФайл(ОписаниеФайла.Путь);
- КонецЕсли;
-
-КонецПроцедуры
-
-// Читает следующую запись
-//
-Функция СледующаяЗаписьФайлаЗагрузкиСубъектаРФ(ФайлЗагрузки, ТекущаяЗапись)
- Чтение = ФайлЗагрузки.ФайлЧтения;
-
- Если Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
- ТекущаяЗапись = Неопределено;
- Возврат Ложь;
- КонецЕсли;
-
- ТекущаяЗапись = ФабрикаXDTO.ПрочитатьXML(Чтение, ФайлЗагрузки.ТипXDTOЗаписи);
- Возврат Истина;
-КонецФункции
-
-// Противоположность ОбщегоНазначенияКлиентСервер.СтруктураURI
-//
-Функция URIПоСтруктуре(СтруктураURI)
- Результат = "";
-
- // Протокол
- Если Не ПустаяСтрока(СтруктураURI.Схема) Тогда
- Результат = Результат + СтруктураURI.Схема + "://";
- КонецЕсли;
-
- // Авторизация
- Если Не ПустаяСтрока(СтруктураURI.Логин) Тогда
- Результат = Результат + СтруктураURI.Логин + ":" + СтруктураURI.Пароль + "@";
- КонецЕсли;
-
- // Все остальное
- Результат = Результат + СтруктураURI.Хост;
- Если Не ПустаяСтрока(СтруктураURI.Порт) Тогда
- Результат = Результат + ":" + ?(ТипЗнч(СтруктураURI.Порт) = Тип("Число"), Формат(СтруктураURI.Порт, ""), СтруктураURI.Порт);
- КонецЕсли;
-
- Результат = Результат + "/" + СтруктураURI.ПутьНаСервере;
- Возврат Результат;
-
-КонецФункции
-
-// Подстановка порта в адрес загрузки для профилей безопасности.
-//
-Функция АдресИнтернетаВключаяПорт(Адрес)
-
- Результат = Новый Структура;
-
- СоставАдреса = ОбщегоНазначенияКлиентСервер.СтруктураURI(Адрес);
- Если ПустаяСтрока(СоставАдреса.Порт) Тогда
- Протокол = ВРег(СоставАдреса.Схема);
- Если Протокол = "HTTP" Тогда
- СоставАдреса.Порт = 80;
- ИначеЕсли Протокол = "HTTPS" Тогда
- СоставАдреса.Порт = 443;
- КонецЕсли;
-
- Результат.Вставить("Адрес", URIПоСтруктуре(СоставАдреса) );
- Иначе
- Результат.Вставить("Адрес", Адрес);
- КонецЕсли;
-
- ИмяФайла = СоставАдреса.ПутьНаСервере;
- ПозицияПараметра = Найти(ИмяФайла, "?");
- Если ПозицияПараметра > 0 Тогда
- ИмяФайла = Лев(ИмяФайла, ПозицияПараметра - 1);
- КонецЕсли;
- ИмяФайла = СтрЗаменить(ИмяФайла, Символы.ПС, "");
- ИмяФайла = СтрЗаменить(ИмяФайла, "/", Символы.ПС);
- ИмяФайла = СтрЗаменить(ИмяФайла, "\", Символы.ПС);
-
- Результат.Вставить("ИмяФайла", СокрЛП(СтрПолучитьСтроку(ИмяФайла, СтрЧислоСтрок(ИмяФайла))));
- Возврат Результат;
-КонецФункции
-
-// Имя событие для записи в журнал регистрации.
-//
-Функция СобытиеЖурналаРегистрации()
-
- Возврат АдресныйКлассификаторКлиентСервер.СобытиеЖурналаРегистрации();
-
-КонецФункции
-
-// Удаляет временный файл.
-// Если при попытке удаления возникает ошибка, она игнорируется - файл будет удален позднее.
-//
-Процедура УдалитьВременныйФайл(ПолноеИмяФайла) Экспорт
-
- Если ПустаяСтрока(ПолноеИмяФайла) Тогда
- Возврат;
- КонецЕсли;
-
- Попытка
- УдалитьФайлы(ПолноеИмяФайла)
- Исключение
- ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение,
- ,, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось удалить временный файл
- |%1
- |по причине: %2'"), ПолноеИмяФайла, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
- КонецПопытки
-
-КонецПроцедуры
-#КонецОбласти
-
#Область ПереносУстаревшегоКлассификатора
// Фоновая актуализация адресного классификатора.
@@ -6268,15 +5510,16 @@
//
Функция УстаревшийКлассификаторСодержитСведения()
- Запрос = Новый Запрос("
- |ВЫБРАТЬ ПЕРВЫЕ 1
- | Регионы.КодАдресногоОбъектаВКоде КАК КодСубъектаРФ
- |ИЗ
- | РегистрСведений.УдалитьАдресныйКлассификатор КАК Регионы
- |ГДЕ
- | Регионы.ТипАдресногоЭлемента > 1
- |");
-
+ Если НЕ ПравоДоступа("Чтение", Метаданные.РегистрыСведений.УдалитьАдресныйКлассификатор) Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
+ | Регионы.КодАдресногоОбъектаВКоде КАК КодСубъектаРФ
+ |ИЗ
+ | РегистрСведений.УдалитьАдресныйКлассификатор КАК Регионы
+ |ГДЕ
+ | Регионы.ТипАдресногоЭлемента > 1");
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
@@ -6284,7 +5527,7 @@
КонецЕсли;
Возврат Ложь;
КонецФункции
-
+
Процедура ПеренестиДанныеУстаревшегоКлассификатор(КодыСубъектовРФ)
// 1. Переносим все заказанные субъекты.
@@ -6358,7 +5601,7 @@
ЗаполнитьАдресныеОбъектыРегистраКЛАДР(СубъектРФ, ТаблицыДанных);
// 2. Дома - по загруженным актуальным данным.
- ЗаполнитьЗаполнитьДомаЗданияСтроенияКЛАДР(СубъектРФ, ТаблицыДанных);
+ ЗаполнитьДомаЗданияСтроенияКЛАДР(СубъектРФ, ТаблицыДанных);
// 3. Запись собранного
АдресныеОбъекты.Загрузить(ТаблицыДанных.АдресныеОбъекты);
@@ -6507,7 +5750,7 @@
КонецПроцедуры
-Процедура ЗаполнитьЗаполнитьДомаЗданияСтроенияКЛАДР(СубъектРФ, ТаблицыДанных)
+Процедура ЗаполнитьДомаЗданияСтроенияКЛАДР(СубъектРФ, ТаблицыДанных)
ТипЧисло = Новый ОписаниеТипов("Число");
@@ -6533,14 +5776,12 @@
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
- КодАдресногоОбъекта = Цел(Выборка.Код / 10000 );
-
- СтрокаАдресногоОбъекта = ТаблицаАдресныхОбъектов.Найти(КодАдресногоОбъекта, "КодКЛАДР");
- ИдентификаторАдресногоОбъекта = ?(СтрокаАдресногоОбъекта = Неопределено, Неопределено, СтрокаАдресногоОбъекта.Идентификатор);
-
ЕстьЗаписиДомов = Истина;
Пока ЕстьЗаписиДомов Цикл
+ КодАдресногоОбъекта = Цел(Выборка.Код / 10000);
+ СтрокаАдресногоОбъекта = ТаблицаАдресныхОбъектов.Найти(КодАдресногоОбъекта, "КодКЛАДР");
+ ИдентификаторАдресногоОбъекта = ?(СтрокаАдресногоОбъекта = Неопределено, Неопределено, СтрокаАдресногоОбъекта.Идентификатор);
Если ИдентификаторАдресногоОбъекта <> Неопределено Тогда
Описание = Выборка.Наименование;
@@ -6554,10 +5795,8 @@
ДобавитьЗаписиДомовЗданийСтроенийКЛАДР(Описание, ПараметрыДомов, ДополнительныйИдентификатор, ТаблицыДанных);
КонецЕсли;
-
ЕстьЗаписиДомов = Выборка.Следующий();
КонецЦикла;
-
КонецЦикла;
КонецПроцедуры
@@ -6947,4 +6186,1401 @@
#КонецОбласти
+#Область ПрочиеСлужебныеПроцедурыИФункции
+
+// Возвращает является ли источником данных веб сервис.
+//
+// Возвращаемое значение:
+// Булево - Если веб сервис является источником адресных сведений, то возвращает Истина.
+//
+Функция ИсточникДанныхАдресногоКлассификатораВебСервис() Экспорт
+
+ Источник = ИсточникДанныхАдресногоКлассификатора();
+ Если НЕ ПустаяСтрока(Источник) И Источник = "Сервис1С" Тогда
+ Возврат Истина;
+ КонецЕсли;
+
+ Возврат Ложь;
+
+КонецФункции
+
+// Возвращает информацию о состоянии загруженности регионов.
+//
+// Возвращаемое значение:
+// ТаблицаЗначений - описание состояния. Содержит колонки.
+// * КодСубъектаРФ - Число - Код региона.
+// * Идентификатор - УникальныйИдентификатор - Идентификатор региона.
+// * Представление - Строка - Наименование и сокращение региона.
+// * Загружено - Булево - Истина, если классификатор по данному региону сейчас загружен.
+// * ДатаВерсии - Дата - UTC версия загруженных данных.
+//
+Функция СведенияОЗагрузкеСубъектовРФ() Экспорт
+
+ Классификатор = РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ();
+
+ // Выбираем все возможные данные - и из регистра, и из классификатора.
+ // Считаем, что уникальность обеспечивается не идентификатором (что правильно), а кодом субъекта
+ // из-за особенностей платформы по передаче уникального идентификатора в таблицу-параметр запроса.
+
+ Запрос = Новый Запрос("
+ |ВЫБРАТЬ
+ | Параметр.Наименование КАК Наименование,
+ | Параметр.Сокращение КАК Сокращение,
+ | Параметр.КодСубъектаРФ КАК КодСубъектаРФ
+ |ПОМЕСТИТЬ
+ | Классификатор
+ |ИЗ
+ | &Классификатор КАК Параметр
+ |;///////////////////////////////////////////////////////////////////////////////////
+ |
+ |ВЫБРАТЬ
+ | ВсеДоступныеРегионы.Наименование + "" "" + ВсеДоступныеРегионы.Сокращение КАК Представление,
+ | ВсеДоступныеРегионы.КодСубъектаРФ КАК КодСубъектаРФ,
+ | ИдентификаторыАдресныхОбъектов.Идентификатор КАК Идентификатор,
+ | ВЫБОР
+ | КОГДА АдресныеОбъекты.КодСубъектаРФ ЕСТЬ 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
+ |
+ |ЛЕВОЕ СОЕДИНЕНИЕ
+ | РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК Версии
+ |ПО
+ | Версии.КодСубъектаРФ = ВсеДоступныеРегионы.КодСубъектаРФ
+ |
+ |УПОРЯДОЧИТЬ ПО
+ | ВсеДоступныеРегионы.КодСубъектаРФ,
+ | ВсеДоступныеРегионы.Наименование + "" "" + ВсеДоступныеРегионы.Сокращение
+ |");
+ Запрос.УстановитьПараметр("Классификатор", Классификатор);
+
+ ЗагруженныеСведения = Запрос.Выполнить().Выгрузить();
+ ЗагруженныеСведения.Индексы.Добавить("Идентификатор");
+ ЗагруженныеСведения.Индексы.Добавить("КодСубъектаРФ");
+ ЗагруженныеСведения.Индексы.Добавить("Загружено");
+
+ // Корректируем идентификаторы из-за особенностей платформы по передаче уникального
+ // идентификатора в таблицу-параметр запроса.
+ Для Каждого Строка Из ЗагруженныеСведения Цикл
+ Если Не ЗначениеЗаполнено(Строка.Идентификатор) Тогда
+ СтрокаКлассификатора = Классификатор.Найти(Строка.КодСубъектаРФ, "КодСубъектаРФ");
+ Если СтрокаКлассификатора <> Неопределено Тогда
+ Строка.Идентификатор = СтрокаКлассификатора.Идентификатор;
+ КонецЕсли;
+ КонецЕсли;
+ КонецЦикла;
+
+ Возврат ЗагруженныеСведения;
+КонецФункции
+
+// Возвращает краткую информацию о состоянии загруженности регионов.
+//
+// Возвращаемое значение:
+// Структура - описание состояния. Содержит колонки.
+// * КоличествоРегионов - Число - Общие количество регионов.
+// * КоличествоЗагруженныхРегионов - Число - количество загруженных регионов.
+Функция КраткиеСведенияОЗагрузкеСубъектовРФ() Экспорт
+
+ Результат = Новый Структура("КоличествоРегионов, КоличествоЗагруженныхРегионов");
+
+ Результат.КоличествоЗагруженныхРегионов = АдресныйКлассификатор.КоличествоЗагруженныхРегионов();
+
+ Классификатор = РегистрыСведений.АдресныеОбъекты.КлассификаторСубъектовРФ();
+ Результат.КоличествоРегионов = Классификатор.Количество();
+
+ Возврат Результат;
+КонецФункции
+
+// Возвращает код региона и проверяет наличие загруженных адресных сведений по региону.
+//
+Функция СведенияОРегионе(НаименованиеРегиона) Экспорт
+
+ Результат = Новый Структура("Загружен, КодСубъектаРФ", Неопределено, Неопределено);
+ СведенияОРегионе = АдресныйКлассификаторКлиентСервер.НаименованиеИСокращение(НаименованиеРегиона);
+
+ Запрос = Новый Запрос;
+ Запрос.Текст =
+ "ВЫБРАТЬ ПЕРВЫЕ 1
+ | АдресныеОбъекты.КодСубъектаРФ КАК КодСубъектаРФ,
+ | ВЫБОР
+ | КОГДА НЕ ЗагруженныеДанные.Идентификатор ЕСТЬ NULL
+ | ТОГДА ИСТИНА
+ | ИНАЧЕ ЛОЖЬ
+ | КОНЕЦ КАК РегионЗагружен
+ |ИЗ
+ | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
+ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК ЗагруженныеДанные
+ | ПО (ЗагруженныеДанные.Уровень > 1)
+ | И АдресныеОбъекты.КодСубъектаРФ = ЗагруженныеДанные.КодСубъектаРФ
+ |ГДЕ
+ | АдресныеОбъекты.Наименование = &Наименование
+ | И АдресныеОбъекты.Сокращение = &Сокращение
+ | И АдресныеОбъекты.Уровень = 1";
+
+ Запрос.УстановитьПараметр("Наименование", СведенияОРегионе.Наименование);
+ Запрос.УстановитьПараметр("Сокращение", СведенияОРегионе.Сокращение);
+
+ РезультатЗапроса = Запрос.Выполнить().Выбрать();
+
+ Если РезультатЗапроса.Следующий() Тогда
+ Результат.Загружен = РезультатЗапроса.РегионЗагружен;
+ Результат.КодСубъектаРФ = РезультатЗапроса.КодСубъектаРФ;
+ КонецЕсли;
+
+ Возврат Результат;
+
+КонецФункции
+
+// Загрузка всех данных классификатора адресов.
+//
+// Параметры:
+// КодыСубъектовРФ - Массив - Содержит числовые коды регионов-субъектов для загрузки.
+//
+// ОписаниеФайлов - Строка, Массив - Каталог на сервере, в котором находятся файлы данных. Ожидается, что имена
+// файлов будут в верхнем регистре.
+// Массив элементов типа ОписаниеПередаваемогоФайла или структур с полями.
+// * Имя - Строка - Имя или полное имя передаваемого файла.
+// * Хранение - ДвоичныеДанные, Строка - Описание хранения файла. Строка
+// может быть путем на файловой системе или адресом во временном
+// хранилище.
+// ОповещатьОПрогрессе - Булево - Флаг оповещения о прогрессе (см ДлительныеОперации.СообщитьПрогресс).
+//
+Процедура ЗагрузитьКлассификаторАдресов(КодыСубъектовРФ, ОписаниеФайлов, ОповещатьОПрогрессе = Истина) Экспорт
+
+ ДатаЗагрузки = ТекущаяУниверсальнаяДата();
+
+ Если ТипЗнч(ОписаниеФайлов) = Тип("Строка") Тогда
+ // Файлы уже подготовлены
+ КаталогФайлов = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ОписаниеФайлов);
+
+ Иначе
+ // Извлекаем файлы
+ КаталогФайлов = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути( ПолучитьИмяВременногоФайла() );
+ СоздатьКаталог(КаталогФайлов);
+
+ Для Каждого ОписаниеФайла Из ОписаниеФайлов Цикл
+ Файл = Новый Файл(ОписаниеФайла.Имя);
+ ПолноеИмяФайла = КаталогФайлов + ВРег(Файл.Имя);;
+
+ Данные = ОписаниеФайла.Хранение;
+ ТипДанных = ТипЗнч(Данные);
+
+ Если ТипДанных = Тип("ДвоичныеДанные") Тогда
+ Данные.Записать(ПолноеИмяФайла);
+
+ ИначеЕсли ЭтоАдресВременногоХранилища(Данные) Тогда
+ Данные = ПолучитьИзВременногоХранилища(Данные);
+ Данные.Записать(ПолноеИмяФайла);
+
+ Иначе
+ ПолноеИмяФайла = Данные;
+
+ КонецЕсли;
+
+ Если ВРег(Прав(ПолноеИмяФайла, 4)) = ".ZIP" Тогда
+ Архив = Новый ЧтениеZipФайла(ПолноеИмяФайла);
+ Архив.ИзвлечьВсе(КаталогФайлов, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
+ УдалитьВременныйФайл(ПолноеИмяФайла);
+ КонецЕсли;
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ ВидыСведенийНеОбработаны = Истина;
+
+ // 2. Все заказанные субъекты
+ ВсегоСубъектов = КодыСубъектовРФ.Количество();
+ НомерПоПорядку = 0;
+
+ Для Каждого СубъектРФ Из КодыСубъектовРФ Цикл
+
+ НомерПоПорядку = НомерПоПорядку + 1;
+ Если ОповещатьОПрогрессе Тогда
+ ДлительныеОперации.СообщитьПрогресс( , СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Загрузка региона ""%1 - %2"" (осталось %3) ...'"),
+ СубъектРФ, АдресныйКлассификатор.НаименованиеРегионаПоКоду(СубъектРФ),
+ Формат(ВсегоСубъектов - НомерПоПорядку, "ЧН=")));
+ КонецЕсли;
+
+ Если ВидыСведенийНеОбработаны Тогда
+ // Общая справочная информация, понадобится потом.
+ СлужебныеАдресныеСведения = СлужебныеАдресныеСведения(Неопределено, КаталогФайлов);
+ // И сразу запишем
+ Набор = РегистрыСведений.СлужебныеАдресныеСведения.СоздатьНаборЗаписей();
+ Набор.Загрузить(СлужебныеАдресныеСведения.Сведения);
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
+
+ ВидыСведенийНеОбработаны = Ложь;
+ КонецЕсли;
+
+ НачатьТранзакцию();
+ Попытка
+
+ ВерсияСубъектаРФ = ИнформацияОЗагрузкеВерсии(СубъектРФ).Версия;
+ Если ВерсияСубъектаРФ <> СлужебныеАдресныеСведения.Версия Тогда
+ ЗагрузитьАдресныеОбъекты(СубъектРФ, КаталогФайлов, СлужебныеАдресныеСведения.Сведения);
+ ЗагрузитьДомаЗданияСтроения(СубъектРФ, КаталогФайлов, СлужебныеАдресныеСведения.Сведения);
+ ЗагрузитьИсториюАдресныхОбъектов(СубъектРФ, КаталогФайлов, СлужебныеАдресныеСведения.Сведения);
+ ЗагрузитьПричиныИзмененияАдреса(СубъектРФ, КаталогФайлов, СлужебныеАдресныеСведения.Сведения);
+ ЗагрузитьДополнительныеСведения(СубъектРФ, КаталогФайлов, СлужебныеАдресныеСведения.Сведения);
+ ЗагрузитьАдресныеОриентиры(СубъектРФ, КаталогФайлов, СлужебныеАдресныеСведения.Сведения);
+
+ // Ставим версию данных загрузки региона.
+ УстановитьИнформациюОЗагрузкеВерсии(СубъектРФ, СлужебныеАдресныеСведения.Версия, СлужебныеАдресныеСведения.ДатаВерсии, ДатаЗагрузки);
+
+ // Очищаем загруженные данные в старом классификаторе.
+ ОчиститьСведенияУстаревшегоКлассификатора(СубъектРФ);
+ КонецЕсли;
+
+ ЗафиксироватьТранзакцию();
+ Исключение
+ ОтменитьТранзакцию();
+ ВызватьИсключение;
+ КонецПопытки;
+
+ КонецЦикла;
+
+ // 3. Обновляем список субъектов РФ - убеждаемся, что у нас есть все корневые записи.
+ РегистрыСведений.АдресныеОбъекты.ОбновитьСоставСубъектовРФПоКлассификатору();
+
+ // 4. Загружаем сокращения адресов.
+ // Эти данные будут нужны при разборах адреса из строки.
+ АдресныеСокращения = АдресныеСокращения(КаталогФайлов);
+ Набор = РегистрыСведений.УровниСокращенийАдресныхСведений.СоздатьНаборЗаписей();
+ Набор.Загрузить(АдресныеСокращения.Сведения);
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор); // Отключаем всю бизнес-логику для ускорения операции.
+
+ // 5. Очищаем временный каталог.
+ Если ТипЗнч(ОписаниеФайлов) = Тип("Строка") Тогда
+ УдалитьВременныйФайл(КаталогФайлов);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Удаляет устаревшие данные КЛАДР.
+//
+Процедура ОчиститьУстаревшиеАдресныеСведенияКЛАДР(Параметры, АдресРезультата) Экспорт
+
+ Запрос = Новый Запрос;
+ Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
+ | УдалитьАдресныйКлассификатор.Код
+ |ИЗ
+ | РегистрСведений.УдалитьАдресныйКлассификатор КАК УдалитьАдресныйКлассификатор";
+
+ РезультатЗапроса = Запрос.Выполнить().Выбрать();
+ Если РезультатЗапроса .Следующий() Тогда
+ ВесьРегистр = РегистрыСведений.УдалитьАдресныйКлассификатор.СоздатьНаборЗаписей();
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(ВесьРегистр);
+ КонецЕсли;
+
+КонецПроцедуры
+
+
+// Загрузка всех данных классификатора адресов с сайта.
+//
+// Параметры:
+// КодыСубъектовРФ - Массив - Содержит числовые коды регионов-субъектов для загрузки. Если не указано, то будут
+// загружены все регионы, по которым когда-либо загружались данные.
+// Авторизация - Структура - описание авторизации на сайте поддержки 1С. Если не указано, то будет прочитано из базы.
+// * Логин - Строка - Данные авторизации.
+// * Пароль - Строка - Данные авторизации.
+//
+Процедура ЗагрузитьКлассификаторАдресовССайта(КодыСубъектовРФ = Неопределено, ИсходнаяАвторизация = Неопределено) Экспорт
+
+ Если ИсходнаяАвторизация = Неопределено Тогда
+ Авторизация = СтандартныеПодсистемыСервер.ПараметрыАутентификацииНаСайте();
+ Иначе
+ Авторизация = ИсходнаяАвторизация;
+ КонецЕсли;
+
+ Если КодыСубъектовРФ = Неопределено Тогда
+ ВсеРегионы = СведенияОЗагрузкеСубъектовРФ();
+ ЗагруженныеРегионы = ВсеРегионы.Скопировать(Новый Структура("Загруженный", Истина));
+ КодыСубъектовРФ = ЗагруженныеРегионы.ВыгрузитьКолонку("КодСубъектаРФ");
+ КонецЕсли;
+
+ ВременныйКаталог = ПолучитьИмяВременногоФайла();
+ СоздатьКаталог(ВременныйКаталог);
+ ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ВременныйКаталог);
+
+ КодыСубъектовДляЗагрузки = Новый Массив;
+ ОписаниеФайлов = Новый Массив;
+
+ ПараметрыПолучения = Новый Структура;
+ Если Авторизация <> Неопределено Тогда
+ ПараметрыПолучения.Вставить("Пользователь", Авторизация.Логин);
+ ПараметрыПолучения.Вставить("Пароль", Авторизация.Пароль);
+ КонецЕсли;
+
+ ВсеВерсии = ДоступныеВерсииАдресныхСведений();
+ Для Каждого КодСубъекта Из КодыСубъектовРФ Цикл
+ ОписаниеРегиона = ВсеВерсии.Найти(КодСубъекта, "КодСубъектаРФ");
+ Если ОписаниеРегиона = Неопределено Тогда
+ // Возможно устаревший регион, не ошибка.
+ Продолжить;
+ КонецЕсли;
+
+ ФайлРегиона = АдресИнтернетаВключаяПорт(ОписаниеРегиона.Адрес);
+ ПутьДляСохранения = ВременныйКаталог + ВРег(ФайлРегиона.ИмяФайла);
+
+ ПараметрыПолучения.Вставить("ПутьДляСохранения", ПутьДляСохранения);
+ ЗагруженныйФайл = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(ОписаниеРегиона.Адрес, ПараметрыПолучения);
+ Если Не ЗагруженныйФайл.Статус Тогда
+ УдалитьВременныйФайл(ВременныйКаталог);
+ ВызватьИсключение ЗагруженныйФайл.СообщениеОбОшибке + Символы.ПС +
+ НСтр("ru = 'Возможные причины:
+ |• Некорректно введен или не введен логин и пароль;
+ |• Нет подключения к Интернету;
+ |• На веб-узле возникли неполадки;
+ |• Брандмауэр или другое промежуточное ПО (антивирусы и т.п.) блокируют попытки программы подключиться к Интернету;
+ |• Подключение к Интернету выполняется через прокси-сервер, но его параметры не заданы в программе.'");
+ КонецЕсли;
+
+ КодыСубъектовДляЗагрузки.Добавить(КодСубъекта);
+ ОписаниеФайлов.Добавить( Новый Структура("Имя, Хранение", ПутьДляСохранения, ПутьДляСохранения) );
+ КонецЦикла;
+
+ ЗагрузитьКлассификаторАдресов(КодыСубъектовДляЗагрузки, ОписаниеФайлов);
+ УдалитьВременныйФайл(ВременныйКаталог);
+
+КонецПроцедуры
+
+// Очистка данных классификатора адресов.
+//
+// Параметры:
+// КодыСубъектовРФ - Массив - Содержит числовые коды регионов-субъектов для очистки.
+//
+Процедура ОчиститьКлассификаторАдресов(КодыСубъектовРФ) Экспорт
+
+ // Все заказанные субъекты
+ ВсегоСубъектов = КодыСубъектовРФ.Количество();
+ НомерПоПорядку = 0;
+
+ Для Каждого СубъектРФ Из КодыСубъектовРФ Цикл
+
+ НомерПоПорядку = НомерПоПорядку + 1;
+ ДлительныеОперации.СообщитьПрогресс( , СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Очистка региона ""%1 - %2"" (осталось %3) ...'"),
+ СубъектРФ, АдресныйКлассификатор.НаименованиеРегионаПоКоду(СубъектРФ),
+ Формат(ВсегоСубъектов - НомерПоПорядку, "ЧН=")
+ ));
+
+ НачатьТранзакцию();
+ Попытка
+
+ ОчиститьАдресныеОбъекты(СубъектРФ);
+ ОчиститьДомаЗданияСтроения(СубъектРФ);
+ ОчиститьИсториюАдресныхОбъектов(СубъектРФ);
+ ОчиститьПричиныИзмененияАдреса(СубъектРФ);
+ ОчиститьДополнительныеСведения(СубъектРФ);
+ ОчиститьАдресныеОриентиры(СубъектРФ);
+
+ СброситьИнформациюОЗагрузкеВерсии(СубъектРФ);
+
+ ЗафиксироватьТранзакцию();
+ Исключение
+ ОтменитьТранзакцию();
+ ВызватьИсключение;
+ КонецПопытки;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+// Набор разрешений профилей безопасности для проверки наличия обновления на сайте 1С.
+//
+// Возвращаемое значение:
+// Массив - необходимые разрешения.
+//
+Функция РазрешенияБезопасностиОбновления() Экспорт
+
+ Разрешения = Новый Массив;
+
+ // Запрос обновления
+ Адрес = ОбщегоНазначенияКлиентСервер.СтруктураURI( АдресФайлаОписанияДоступныхВерсий() );
+ Разрешения.Добавить( РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(
+ ВРег(Адрес.Схема), Адрес.Хост, Адрес.Порт, НСтр("ru = 'Проверка обновления адресного классификатора.'")
+ ));
+
+ // Корневой каталог данных - используется только для получения разрешения.
+ // Фактический адрес для загрузки считывается из файла обновлений.
+ Адрес = ОбщегоНазначенияКлиентСервер.СтруктураURI("http://downloads.v8.1c.ru/tmplts/ITS/KLADR/");
+ Разрешения.Добавить( РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(
+ ВРег(Адрес.Схема), Адрес.Хост, Адрес.Порт, НСтр("ru = 'Загрузка данных адресного классификатора.'")
+ ));
+
+ Возврат Разрешения;
+КонецФункции
+
+// Путь к файлу на веб сервере, содержащему информацию по версиям адресных сведений.
+//
+// Возвращаемое значение:
+// Строка - путь к файлу описания данных.
+//
+Функция АдресФайлаОписанияДоступныхВерсий() Экспорт
+
+ Возврат "http://downloads.1c.ru/ipp/ITSREPV/V8Update/fias/version.zip";
+
+КонецФункции
+
+// Пространство имен для операций XDTO.
+//
+// Возвращаемое значение:
+// Строка
+//
+Функция ПространствоИмен() Экспорт
+
+ Возврат "http://www.v8.1c.ru/ssl/AddressSystem";
+
+КонецФункции
+
+// Проверяет наличие обновлений адресного классификатора на веб сервере
+// для тех объектов, которые ранее уже загружались.
+//
+// Возвращаемое значение - ТаблицаЗначений - Описание добавленных и измененных субъектов. Содержит Колонки.
+// * КодСубъектаРФ - Число - Код субъекта РФ.
+// * Наименование - Строка - Наименование субъекта РФ.
+// * Сокращение - Строка - Сокращение субъекта РФ.
+// * Индекс - Число - Почтовый индекс.
+// * Идентификатор - УникальныйИдентификатор - Идентификатор субъекта.
+// * Адрес - Строка - Адрес для скачивания файла данных региона.
+// * ДоступноОбновление - Булево - Флаг доступности обновления для данного региона.
+// * Загружено - Булево - Флаг того, что данные хоть раз загружались.
+//
+Функция ДоступныеВерсииАдресныхСведений() Экспорт
+
+ Результат = Новый ТаблицаЗначений;
+
+ ТипСтрока = Новый ОписаниеТипов("Строка");
+ ТипЧисло = Новый ОписаниеТипов("Число");
+ ТипБулево = Новый ОписаниеТипов("Булево");
+ Колонки = Результат.Колонки;
+
+ Колонки.Добавить("КодСубъектаРФ", ТипЧисло);
+ Колонки.Добавить("Наименование", ТипСтрока);
+ Колонки.Добавить("Сокращение", ТипСтрока);
+ Колонки.Добавить("Индекс", ТипЧисло);
+ Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("УникальныйИдентификатор") );
+ Колонки.Добавить("Адрес", ТипСтрока);
+ Колонки.Добавить("ДоступноОбновление", ТипБулево);
+ Колонки.Добавить("Загружено", ТипБулево);
+
+ Результат.Индексы.Добавить("КодСубъектаРФ");
+
+ АдресОписания = АдресИнтернетаВключаяПорт( АдресФайлаОписанияДоступныхВерсий() );
+ РезультатПолученияФайла = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(АдресОписания.Адрес);
+ Если Не РезультатПолученияФайла.Статус Тогда
+ ВызватьИсключение РезультатПолученияФайла.СообщениеОбОшибке;
+ КонецЕсли;
+
+ // Получен zip, внутри которого xml.
+ КаталогДляРаспаковки = ПолучитьИмяВременногоФайла();
+ Архив = Новый ЧтениеZipФайла(РезультатПолученияФайла.Путь);
+ Архив.ИзвлечьВсе(КаталогДляРаспаковки);
+ ФайлОписания = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогДляРаспаковки) + "version.xml";
+
+ ЧтениеXML = Новый ЧтениеXML;
+ ЧтениеXML.ОткрытьФайл(ФайлОписания);
+ ДоступныеДанные = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ФабрикаXDTO.Тип( ПространствоИмен(), "Publications") );
+
+ ЧтениеXML.Закрыть();
+ УдалитьВременныйФайл(КаталогДляРаспаковки);
+ УдалитьВременныйФайл(РезультатПолученияФайла.Путь);
+
+ ДатаПоследнейВерсии = '00000000';
+ ПоследняяПубликация = Неопределено;
+
+ Для Каждого Публикация Из ДоступныеДанные.ПолучитьСписок("Publication") Цикл
+ Если Публикация.UpdateDate > ДатаПоследнейВерсии Тогда
+ ДатаПоследнейВерсии = Публикация.UpdateDate;
+ ПоследняяПубликация = Публикация;
+ КонецЕсли;
+ КонецЦикла;
+
+ Если ПоследняяПубликация = Неопределено Тогда
+ // Нет данных совсем
+ Возврат Результат;
+ КонецЕсли;
+
+ // Сравниваем то что в регистре, и то что прочитали.
+ ТекущиеСубъекты = СведенияОЗагрузкеСубъектовРФ();
+
+ Для Каждого ЗаписьРегиона Из ПоследняяПубликация.ПолучитьСписок("Region") Цикл
+ Идентификатор = УникальныйИдентификаторИзДвоичныхДанных(ЗаписьРегиона.AOGUID);
+ ТекущийСубъект = ТекущиеСубъекты.Найти(Идентификатор, "Идентификатор");
+
+ СтрокаРегиона = Результат.Добавить();
+ СтрокаРегиона.КодСубъектаРФ = ЗаписьРегиона.REGIONCODE;
+ СтрокаРегиона.Наименование = ЗаписьРегиона.FORMALNAME;
+ СтрокаРегиона.Сокращение = ЗаписьРегиона.SHORTNAME;
+ СтрокаРегиона.Индекс = ЗаписьРегиона.POSTALCODE;
+ СтрокаРегиона.Идентификатор = Идентификатор;
+ СтрокаРегиона.Адрес = ЗаписьРегиона.Url;
+ СтрокаРегиона.Загружено = ТекущийСубъект <> Неопределено И ТекущийСубъект.Загружено;
+
+ СтрокаРегиона.ДоступноОбновление = ТекущийСубъект = Неопределено // Новый регион
+ Или ТекущийСубъект.ДатаВерсии < ДатаПоследнейВерсии // Обновленный регион
+ Или ( // Обновленные данные существующего субъекта.
+ ТекущийСубъект.КодСубъектаРФ <> ЗаписьРегиона.REGIONCODE
+ Или ТекущийСубъект.Представление <> ЗаписьРегиона.FORMALNAME
+ Или ТекущийСубъект.Сокращение <> ЗаписьРегиона.SHORTNAME
+ Или ТекущийСубъект.Индекс <> ЗаписьРегиона.POSTALCODE
+ );
+ КонецЦикла;
+
+ Возврат Результат;
+КонецФункции
+
+// Возвращает описание последней загрузки классификатора.
+//
+// Возвращаемое значение:
+// Структура - содержит поля:
+// * ДатаПоследнейЗагрузки - Дата - Дата последней загрузки (часовой пояс сеанса).
+// * УниверсальнаяДатаПоследнейЗагрузки - Дата - Дата последней загрузки (UTC).
+// * ДнейНазад - Число - Количество дней от последней загрузки.
+// * Представление - Строка - Описание, например "Адресный классификатор был загружен
+// сегодня.";
+// * НеобходимоОбновление - Булево - Истина, если количество дней от последней загрузки превышает
+// период актуальности.
+//
+Функция ОписаниеПоследнейЗагрузки() Экспорт
+
+ Результат = Новый Структура("ДнейНазад, ДатаПоследнейЗагрузки, УниверсальнаяДатаПоследнейЗагрузки, Представление, НеобходимоОбновление");
+
+ // Определяем дату последней загрузки.
+ Запрос = Новый Запрос("
+ |ВЫБРАТЬ ПЕРВЫЕ 1
+ | ДатаЗагрузки КАК ДатаЗагрузки
+ |ИЗ
+ | РегистрСведений.ЗагруженныеВерсииАдресныхСведений
+ |УПОРЯДОЧИТЬ ПО
+ | ДатаЗагрузки УБЫВ
+ |");
+ Выборка = Запрос.Выполнить().Выбрать();
+ Если Выборка.Следующий() Тогда
+ ДатаПоследнейЗагрузки = Выборка.ДатаЗагрузки;
+ Иначе
+ ДатаПоследнейЗагрузки = '00000000';
+ КонецЕсли;
+
+ Если ДатаПоследнейЗагрузки = '00000000' Тогда
+ Результат.НеобходимоОбновление = Ложь;
+ Результат.Представление = НСтр("ru = 'Адресный классификатор еще не загружался.'");
+ Возврат Результат;
+ КонецЕсли;
+
+ Результат.УниверсальнаяДатаПоследнейЗагрузки = ДатаПоследнейЗагрузки;
+ Результат.ДатаПоследнейЗагрузки = МестноеВремя(ДатаПоследнейЗагрузки, ЧасовойПоясСеанса());
+
+ НачалоПериода = НачалоДня(ТекущаяУниверсальнаяДата());
+ КонецПериода = НачалоДня(ДатаПоследнейЗагрузки);
+ ДнейРазницы = Цел( (НачалоПериода - КонецПериода) / 86400 );
+
+ Если ДнейРазницы = 0 Тогда
+ Представление = НСтр("ru = 'Адресный классификатор был загружен сегодня.'");
+
+ ИначеЕсли ДнейРазницы = 1 Тогда
+ Представление = НСтр("ru = 'Адресный классификатор был загружен вчера.'");
+
+ ИначеЕсли ДнейРазницы = 2 Тогда
+ Представление = НСтр("ru = 'Адресный классификатор был загружен позавчера.'");
+
+ Иначе
+ Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Адресный классификатор был загружен %1 назад.'"), ОбщегоНазначения.ИнтервалВремениСтрокой(КонецПериода, НачалоПериода)
+ );
+
+ КонецЕсли;
+
+ Результат.НеобходимоОбновление = ДнейРазницы > 30;
+ Результат.ДнейНазад = ДнейРазницы;
+ Результат.Представление = Представление;
+
+ Возврат Результат;
+КонецФункции
+
+// Проверяет наличие записей о регионах в регистре сведений АдресныеОбъекты и заполняет их в случае отсутствия.
+//
+Процедура ПроверитьНачальноеЗаполнение() Экспорт
+
+ Запрос = Новый Запрос;
+ Запрос.Текст =
+ "ВЫБРАТЬ ПЕРВЫЕ 1
+ | АдресныеОбъекты.Уровень
+ |ИЗ
+ | РегистрСведений.АдресныеОбъекты КАК АдресныеОбъекты
+ |ГДЕ
+ | АдресныеОбъекты.Уровень = 1";
+
+ РезультатЗапроса = Запрос.Выполнить().Выбрать();
+
+ Если НЕ РезультатЗапроса.Следующий() Тогда
+ ВыполнитьНачальноеЗаполнение();
+ КонецЕсли;;
+
+КонецПроцедуры
+
+
+// Возвращает настройку текущего источника данных адресов.
+//
+// Возвращаемое значение:
+// Строка - описание источника. Пустая строка - используются загружаемые в регистр данные.
+//
+Функция ИсточникДанныхАдресногоКлассификатора() Экспорт
+
+ Возврат ПолучитьФункциональнуюОпцию("ИсточникДанныхАдресногоКлассификатора");
+
+КонецФункции
+
+Процедура РассчитатьУровниСокращенийАдресныхСведений()
+
+ Запрос = Новый Запрос("
+ |ВЫБРАТЬ РАЗЛИЧНЫЕ
+ | Уровень КАК Уровень,
+ | Сокращение КАК Сокращение
+ |ИЗ
+ | РегистрСведений.АдресныеОбъекты
+ |ОБЪЕДИНИТЬ
+ |ВЫБРАТЬ
+ | Уровень, Сокращение
+ |ИЗ
+ | РегистрСведений.ИсторияАдресныхОбъектов
+ |");
+ Варианты = Запрос.Выполнить().Выгрузить();
+
+ Сокращения = РегистрыСведений.УровниСокращенийАдресныхСведений.СоздатьНаборЗаписей();
+ Сокращения.Загрузить(Варианты);
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(Сокращения);
+
+КонецПроцедуры
+
+// Вычитываем справочную информацию и информацию о версии.
+//
+Функция СлужебныеАдресныеСведения(КодСубъектаРФ, КаталогФайлов)
+
+ Набор = РегистрыСведений.СлужебныеАдресныеСведения.СоздатьНаборЗаписей();
+ Сведения = Набор.ВыгрузитьКолонки("Тип, Идентификатор, Ключ, Значение");
+ Сведения.Индексы.Добавить("Тип, Идентификатор, Ключ");
+
+ ТекущаяЗапись = Неопределено;
+ ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "ADDRSTATUS", "AddressStatuses");
+
+ Пока СледующаяЗаписьФайлаЗагрузкиСубъектаРФ(ФайлЗагрузки, ТекущаяЗапись) Цикл
+ Запись = Сведения.Добавить();
+
+ Запись.Тип = ТекущаяЗапись.TYPE;
+ Запись.Идентификатор = ТекущаяЗапись.ID;
+ Запись.Ключ = ТекущаяЗапись.KEY;
+ Запись.Значение = ТекущаяЗапись.VALUE;
+ КонецЦикла;
+
+ Результат = Новый Структура("Сведения", Сведения);
+ Результат.Вставить("Версия", ФайлЗагрузки.Версия);
+ Результат.Вставить("ДатаВерсии", ФайлЗагрузки.ДатаВерсии);
+
+ ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
+
+ Возврат Результат;
+КонецФункции
+
+
+// Вычитываем информацию о адресных сокращениях
+//
+Функция АдресныеСокращения(КаталогФайлов)
+
+ Набор = РегистрыСведений.УровниСокращенийАдресныхСведений.СоздатьНаборЗаписей();
+ Сведения = Набор.ВыгрузитьКолонки("Сокращение, Уровень, Значение");
+ Сведения.Индексы.Добавить("Сокращение, Уровень");
+
+ ТекущаяЗапись = Неопределено;
+ ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(Неопределено, КаталогФайлов, "SOCRBASE", "AddressStatuses");
+
+ Пока СледующаяЗаписьФайлаЗагрузкиСубъектаРФ(ФайлЗагрузки, ТекущаяЗапись) Цикл
+ Если ВРег(ТекущаяЗапись.TYPE) = "SOCRBASE" И ЗначениеЗаполнено(ТекущаяЗапись.KEY) Тогда
+ Запись = Сведения.Добавить();
+ Запись.Уровень = ТекущаяЗапись.ID;
+ Запись.Сокращение = ТекущаяЗапись.KEY;
+ Запись.Значение = ТекущаяЗапись.VALUE;
+ КонецЕсли;
+ КонецЦикла;
+
+ Результат = Новый Структура("Сведения", Сведения);
+ Результат.Вставить("Версия", ФайлЗагрузки.Версия);
+ Результат.Вставить("ДатаВерсии", ФайлЗагрузки.ДатаВерсии);
+
+ ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
+
+ Возврат Результат;
+КонецФункции
+
+
+Процедура ЗагрузитьАдресныеОбъекты(КодСубъектаРФ, КаталогФайлов, ВидыСведений)
+
+ Набор = РегистрыСведений.АдресныеОбъекты.СоздатьНаборЗаписей();
+ Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
+
+ ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "ADDROBJ", "AddressObjects");
+
+ ТекущаяЗапись = Неопределено;
+ Пока СледующаяЗаписьФайлаЗагрузкиСубъектаРФ(ФайлЗагрузки, ТекущаяЗапись)Цикл
+ Запись = Набор.Добавить();
+
+ Запись.КодСубъектаРФ = ТекущаяЗапись.REGIONCODE;
+ Запись.КодОкруга = ТекущаяЗапись.AUTOCODE;
+ Запись.КодРайона = ТекущаяЗапись.AREACODE;
+ Запись.КодГорода = ТекущаяЗапись.CITYCODE;
+ Запись.КодВнутригородскогоРайона = ТекущаяЗапись.CTARCODE;
+ Запись.КодНаселенногоПункта = ТекущаяЗапись.PLACECODE;
+ Запись.КодУлицы = ТекущаяЗапись.STREETCODE;
+ Запись.КодДополнительногоЭлемента = ТекущаяЗапись.EXTRCODE;
+ Запись.КодПодчиненногоЭлемента = ТекущаяЗапись.SEXTCODE;
+ Запись.Уровень = ТекущаяЗапись.AOLEVEL;
+ Запись.Идентификатор = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.AOGUID);
+ Запись.ПочтовыйИндекс = ТекущаяЗапись.POSTALCODE;
+ Запись.Наименование = ТекущаяЗапись.FORMALNAME;
+ Запись.Сокращение = ТекущаяЗапись.SHORTNAME;
+ Запись.Дополнительно = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.EXTRAGUID);
+ Запись.КодКЛАДР = ТекущаяЗапись.CODE;
+ Запись.Актуален = ?(ТекущаяЗапись.CURRSTATUS = 0, Истина, Ложь);
+ КонецЦикла;
+
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
+ ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
+
+КонецПроцедуры
+
+Процедура ЗагрузитьДомаЗданияСтроения(КодСубъектаРФ, КаталогФайлов, ВидыСведений)
+
+ Сжатие = Новый СжатиеДанных(9);
+ ТипXMLСтрока = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "string");
+
+ Набор = РегистрыСведений.ДомаЗданияСтроения.СоздатьНаборЗаписей();
+ Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
+ ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "HOUSE", "Houses");
+
+ КлючевыеКолонки = "КодСубъектаРФ, АдресныйОбъект, ПочтовыйИндекс";
+ Таблица = Набор.ВыгрузитьКолонки(КлючевыеКолонки);
+ Таблица.Индексы.Добавить(КлючевыеКолонки);
+ Фильтр = Новый Структура(КлючевыеКолонки);
+
+ ТекущаяЗапись = Неопределено;
+ Пока СледующаяЗаписьФайлаЗагрузкиСубъектаРФ(ФайлЗагрузки, ТекущаяЗапись) Цикл
+
+ Фильтр.КодСубъектаРФ = КодСубъектаРФ;
+ Фильтр.АдресныйОбъект = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.AOGUID);
+ Фильтр.ПочтовыйИндекс = ТекущаяЗапись.POSTALCODE;
+ Если Таблица.НайтиСтроки(Фильтр).Количество() > 0 Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Запись = Набор.Добавить();
+
+ Запись.КодСубъектаРФ = КодСубъектаРФ;
+ Запись.АдресныйОбъект = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.AOGUID);
+ Запись.ПочтовыйИндекс = ТекущаяЗапись.POSTALCODE;
+
+ ОписаниеЗданийXDTO = ТекущаяЗапись.ПолучитьXDTO("BUILDINGS");
+ Запись.Строения = Новый ХранилищеЗначения(ОписаниеЗданийXDTO.ЛексическоеЗначение, Сжатие);
+
+ ЗаполнитьЗначенияСвойств(Таблица.Добавить(), Запись);
+ КонецЦикла;
+
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
+ ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
+
+КонецПроцедуры
+
+Процедура ЗагрузитьДополнительныеСведения(КодСубъектаРФ, КаталогФайлов, ВидыСведений)
+
+ Набор = РегистрыСведений.ДополнительныеАдресныеСведения.СоздатьНаборЗаписей();
+ Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
+ ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "EXTRAINFO", "AdditionalAddressInfo");
+
+ ТекущаяЗапись = Неопределено;
+ Пока СледующаяЗаписьФайлаЗагрузкиСубъектаРФ(ФайлЗагрузки, ТекущаяЗапись) Цикл
+ Запись = Набор.Добавить();
+
+ Запись.КодСубъектаРФ = КодСубъектаРФ;
+ Запись.Идентификатор = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.EXTRAGUID);
+ Запись.OKATO = ТекущаяЗапись.OKATO;
+ Запись.ОКТМО = ТекущаяЗапись.OKTMO;
+ Запись.КодИФНСФЛ = ТекущаяЗапись.IFNSFL;
+ Запись.КодИФНСЮЛ = ТекущаяЗапись.IFNSUL;
+ Запись.КодУчасткаИФНСФЛ = ТекущаяЗапись.TERRIFNSFL;
+ Запись.КодУчасткаИФНСЮЛ = ТекущаяЗапись.TERRIFNSUL;
+ КонецЦикла;
+
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
+ ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
+
+КонецПроцедуры
+
+Процедура ЗагрузитьИсториюАдресныхОбъектов(КодСубъектаРФ, КаталогФайлов, ВидыСведений)
+
+ Набор = РегистрыСведений.ИсторияАдресныхОбъектов.СоздатьНаборЗаписей();
+ Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
+ ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "ARCHOBJ", "ArchiveObjects");
+
+ ТекущаяЗапись = Неопределено;
+ Пока СледующаяЗаписьФайлаЗагрузкиСубъектаРФ(ФайлЗагрузки, ТекущаяЗапись) Цикл
+
+ Запись = Набор.Добавить();
+ Запись.Уровень = ТекущаяЗапись.AOLEVEL;
+ Запись.КодСубъектаРФ = ТекущаяЗапись.REGIONCODE;
+ Запись.КодОкруга = ТекущаяЗапись.AUTOCODE;
+ Запись.КодРайона = ТекущаяЗапись.AREACODE;
+ Запись.КодГорода = ТекущаяЗапись.CITYCODE;
+ Запись.КодВнутригородскогоРайона = ТекущаяЗапись.CTARCODE;
+ Запись.КодНаселенногоПункта = ТекущаяЗапись.PLACECODE;
+ Запись.КодУлицы = ТекущаяЗапись.STREETCODE;
+ Запись.КодДополнительногоЭлемента = ТекущаяЗапись.EXTRCODE;
+ Запись.КодПодчиненногоЭлемента = ТекущаяЗапись.SEXTCODE;
+ Запись.Идентификатор = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.AOID);
+ Запись.ТекущийКодСубъектаРФ = КодСубъектаРФ;
+
+ Запись.ПочтовыйИндекс = ТекущаяЗапись.POSTALCODE;
+ Запись.Наименование = ТекущаяЗапись.FORMALNAME;
+ Запись.Сокращение = ТекущаяЗапись.SHORTNAME;
+ Запись.Дополнительно = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.EXTRAGUID);
+ Запись.КодКЛАДР = ТекущаяЗапись.CODE;
+ Запись.АдресныйОбъект = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.AOGUID);
+ Запись.НачалоДействияЗаписи = ТекущаяЗапись.STARTDATE;
+ Запись.ОкончаниеДействияЗаписи = ТекущаяЗапись.ENDDATE;
+ Запись.Операция = ТекущаяЗапись.OPERSTATUS
+ КонецЦикла;
+
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
+ ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
+
+КонецПроцедуры
+
+Процедура ЗагрузитьПричиныИзмененияАдреса(КодСубъектаРФ, КаталогФайлов, ВидыСведений)
+
+ Сжатие = Новый СжатиеДанных(9);
+
+ Набор = РегистрыСведений.ПричиныИзмененияАдресныхСведений.СоздатьНаборЗаписей();
+ Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
+ ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "ARCHDOCS", "RegulatoryDocs");
+
+ ТекущаяЗапись = Неопределено;
+ Пока СледующаяЗаписьФайлаЗагрузкиСубъектаРФ(ФайлЗагрузки, ТекущаяЗапись) Цикл
+ Запись = Набор.Добавить();
+
+ Запись.КодСубъектаРФ = КодСубъектаРФ;
+ Запись.Идентификатор = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.DOCID);
+ Запись.ИзмененныйОбъект = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.OBJID);
+ Запись.СодержитОписание = ТекущаяЗапись.ISDESCR;
+ Запись.Описание = Новый ХранилищеЗначения(ТекущаяЗапись.DESCR, Сжатие);
+ КонецЦикла;
+
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
+ ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
+
+КонецПроцедуры
+
+Процедура ЗагрузитьАдресныеОриентиры(КодСубъектаРФ, КаталогФайлов, ВидыСведений)
+
+ Сжатие = Новый СжатиеДанных(9);
+
+ Набор = РегистрыСведений.ОриентирыАдресныхОбъектов.СоздатьНаборЗаписей();
+ Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
+ ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "LANDMARKS", "Landmarks");
+
+ ТекущаяЗапись = Неопределено;
+ Пока СледующаяЗаписьФайлаЗагрузкиСубъектаРФ(ФайлЗагрузки, ТекущаяЗапись) Цикл
+ Запись = Набор.Добавить();
+
+ Запись.КодСубъектаРФ = КодСубъектаРФ;
+ Запись.Идентификатор = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.LANDGUID);
+ Запись.АдресныйОбъект = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.AOGUID);
+ Запись.ПочтовыйИндекс = ТекущаяЗапись.POSTALCODE;
+ Запись.Дополнительно = УникальныйИдентификаторИзДвоичныхДанных(ТекущаяЗапись.EXTRAGUID);
+ Запись.Описание = Новый ХранилищеЗначения(ТекущаяЗапись.LOCATION, Сжатие);
+ КонецЦикла;
+
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
+ ЗакрытьФайлЗагрузкиСубъектаРФ(ФайлЗагрузки);
+
+КонецПроцедуры
+
+Процедура УстановитьИнформациюОЗагрузкеВерсии(КодСубъектаРФ, Версия, ДатаВерсии, ДатаЗагрузки)
+
+ Набор = РегистрыСведений.ЗагруженныеВерсииАдресныхСведений.СоздатьНаборЗаписей();
+ Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
+
+ ОсновнаяЗапись = Набор.Добавить();
+ ОсновнаяЗапись.КодСубъектаРФ = КодСубъектаРФ;
+ ОсновнаяЗапись.Версия = Версия;
+ ОсновнаяЗапись.ДатаВерсии = ДатаВерсии;
+ ОсновнаяЗапись.ДатаЗагрузки = ДатаЗагрузки;
+
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
+
+КонецПроцедуры
+
+Функция ИнформацияОЗагрузкеВерсии(КодСубъектаРФ)
+
+ ПустаяДата = Дата(1, 1, 1, 0, 0, 0);
+ ИнформацияОЗагрузке = Новый Структура("Версия, ДатаВерсии, ДатаЗагрузки", 0, ПустаяДата, ПустаяДата);
+
+ Запрос = Новый Запрос;
+ Запрос.Текст =
+ "ВЫБРАТЬ
+ | ЗагруженныеВерсииАдресныхСведений.Версия,
+ | ЗагруженныеВерсииАдресныхСведений.ДатаВерсии,
+ | ЗагруженныеВерсииАдресныхСведений.ДатаЗагрузки
+ |ИЗ
+ | РегистрСведений.ЗагруженныеВерсииАдресныхСведений КАК ЗагруженныеВерсииАдресныхСведений
+ |ГДЕ
+ | ЗагруженныеВерсииАдресныхСведений.КодСубъектаРФ = &КодСубъектаРФ";
+
+ Запрос.УстановитьПараметр("КодСубъектаРФ", КодСубъектаРФ);
+ Результат = Запрос.Выполнить().Выгрузить();
+ Если Результат.Количество() > 0 Тогда
+ ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
+ ИнформацияОЗагрузке.Версия = ОписаниеТипаЧисло.ПривестиЗначение(Результат[0].Версия);
+ ИнформацияОЗагрузке.ДатаВерсии = Результат[0].ДатаВерсии;
+ ИнформацияОЗагрузке.ДатаЗагрузки = Результат[0].ДатаЗагрузки;
+ КонецЕсли;
+ Возврат ИнформацияОЗагрузке;
+
+КонецФункции
+
+Процедура СброситьИнформациюОЗагрузкеВерсии(КодСубъектаРФ)
+
+ Набор = РегистрыСведений.ЗагруженныеВерсииАдресныхСведений.СоздатьНаборЗаписей();
+ Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
+
+КонецПроцедуры
+
+Процедура ОчиститьАдресныеОбъекты(КодСубъектаРФ)
+ // Очищаем, не трогая запись региона.
+
+ Набор = РегистрыСведений.АдресныеОбъекты.СоздатьНаборЗаписей();
+ Отбор = Набор.Отбор;
+
+ Отбор.Уровень.Установить(1);
+ Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
+ Отбор.КодОкруга.Установить(0);
+ Отбор.КодРайона.Установить(0);
+ Отбор.КодГорода.Установить(0);
+ Отбор.КодВнутригородскогоРайона.Установить(0);
+ Отбор.КодНаселенногоПункта.Установить(0);
+ Отбор.КодУлицы.Установить(0);
+ Отбор.КодДополнительногоЭлемента.Установить(0);
+ Отбор.КодПодчиненногоЭлемента.Установить(0);
+ Набор.Прочитать();
+
+ Отбор.Сбросить();
+ Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
+
+КонецПроцедуры
+
+Процедура ОчиститьДомаЗданияСтроения(КодСубъектаРФ)
+
+ Набор = РегистрыСведений.ДомаЗданияСтроения.СоздатьНаборЗаписей();
+ Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
+
+КонецПроцедуры
+
+Процедура ОчиститьДополнительныеСведения(КодСубъектаРФ)
+
+ Набор = РегистрыСведений.ДополнительныеАдресныеСведения.СоздатьНаборЗаписей();
+ Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
+
+КонецПроцедуры
+
+Процедура ОчиститьИсториюАдресныхОбъектов(КодСубъектаРФ)
+
+ Набор = РегистрыСведений.ИсторияАдресныхОбъектов.СоздатьНаборЗаписей();
+ Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
+
+КонецПроцедуры
+
+Процедура ОчиститьПричиныИзмененияАдреса(КодСубъектаРФ)
+
+ Набор = РегистрыСведений.ПричиныИзмененияАдресныхСведений.СоздатьНаборЗаписей();
+ Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
+
+КонецПроцедуры
+
+Процедура ОчиститьАдресныеОриентиры(КодСубъектаРФ)
+
+ Набор = РегистрыСведений.ОриентирыАдресныхОбъектов.СоздатьНаборЗаписей();
+ Набор.Отбор.КодСубъектаРФ.Установить(КодСубъектаРФ);
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
+
+КонецПроцедуры
+
+Процедура ОчиститьСведенияУстаревшегоКлассификатора(КодСубъектаРФ)
+
+ Запрос = Новый Запрос("
+ |ВЫБРАТЬ ПЕРВЫЕ 1
+ | ТипАдресногоЭлемента,
+ | КодАдресногоОбъектаВКоде,
+ | КодРайонаВКоде,
+ | КодГородаВКоде,
+ | КодНаселенногоПунктаВКоде,
+ | КодУлицыВКоде,
+ | Код,
+ | Наименование,
+ | Сокращение,
+ | Индекс,
+ | АльтернативныеНазвания,
+ | ПризнакАктуальности
+ |ИЗ
+ | РегистрСведений.УдалитьАдресныйКлассификатор
+ |ГДЕ
+ | ТипАдресногоЭлемента = 1
+ | И КодАдресногоОбъектаВКоде = &КодСубъектаРФ
+ |");
+ Запрос.УстановитьПараметр("КодСубъектаРФ", КодСубъектаРФ);
+ Регион = Запрос.Выполнить().Выгрузить();
+
+ Набор = РегистрыСведений.УдалитьАдресныйКлассификатор.СоздатьНаборЗаписей();
+ Набор.Отбор.КодАдресногоОбъектаВКоде.Установить(КодСубъектаРФ);
+
+ Если Регион.Количество() > 0 Тогда
+ ЗаполнитьЗначенияСвойств(Набор.Добавить(), Регион[0]);
+ КонецЕсли;
+
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(Набор);
+
+КонецПроцедуры
+
+// Инициализирует структуру описания файла данных адресных сведений.
+//
+Функция ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, КлючВида, ИмяОписывающегоУзла)
+
+ Если КодСубъектаРФ = Неопределено Тогда
+ ИмяИсходногоФайла = КлючВида;
+ Иначе
+ ИмяИсходногоФайла = Формат(КодСубъектаРФ, "ЧЦ=2; ЧН=; ЧВН=") + "_" + КлючВида;
+ КонецЕсли;
+
+ Результат = Новый Структура;
+
+ // Как архив
+ Файл = НайтиФайл(КаталогФайлов, ИмяИсходногоФайла + ".ZIP");
+ Если Файл.Существует Тогда
+ ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути( ПолучитьИмяВременногоФайла() );
+
+ ЧтениеZipФайла = Новый ЧтениеZipФайла(Файл.ПолноеИмя);
+ Элемент = ЧтениеZipФайла.Элементы[0];
+ ЧтениеZipФайла.Извлечь(Элемент, ВременныйКаталог);
+
+ Результат.Вставить("Путь", ВременныйКаталог);
+ Результат.Вставить("ПолноеИмя", ВременныйКаталог + Элемент.ПолноеИмя);
+ Результат.Вставить("УдалитьПутьПриЗакрытии", Истина);
+ Иначе
+ // Как обычный файл
+ Результат.Вставить("Путь", КаталогФайлов);
+ Результат.Вставить("УдалитьПутьПриЗакрытии", Ложь);
+ Результат.Вставить("ПолноеИмя", КаталогФайлов + ИмяИсходногоФайла + ".FI");
+ КонецЕсли;
+
+ // Тип заголовка
+ СвойствоЗаголовка = ФабрикаXDTO.Пакеты.Получить(ПространствоИмен()).КорневыеСвойства.Получить(ИмяОписывающегоУзла);
+ ТипXDTOЗаголовка = СвойствоЗаголовка.Тип;
+
+ // Тип записи
+ Заголовок = ФабрикаXDTO.Создать(ТипXDTOЗаголовка);
+ ТипXDTOЗаписи = Неопределено;
+ Для Каждого Свойство Из ТипXDTOЗаголовка.Свойства Цикл
+ Если Заголовок.ПолучитьСписок(Свойство.ЛокальноеИмя) <> Неопределено Тогда
+ ТипXDTOЗаписи = Свойство.Тип;
+ Прервать;
+ КонецЕсли;
+ КонецЦикла;
+
+ Если ТипXDTOЗаписи = Неопределено Тогда
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'В файле ""%1"" не найден список записей в типе %2'"), Результат.ПолноеИмя, Результат.ТипXDTO
+ );
+ КонецЕсли;
+
+ Результат.Вставить("ТипXDTO", ТипXDTOЗаголовка);
+ Результат.Вставить("ТипXDTOЗаписи", ТипXDTOЗаписи);
+
+ Результат.Вставить("Версия");
+ Результат.Вставить("ДатаВерсии");
+ Результат.Вставить("ФайлЧтения", Новый ЧтениеFastInfoset);
+
+ ФайлЧтения = Результат.ФайлЧтения;
+ ФайлЧтения.ОткрытьФайл(Результат.ПолноеИмя);
+
+ // Встаем на первый узел с данными.
+ КореньНайден = ФайлЧтения.ПерейтиКСодержимому() <> ТипУзлаXML.Ничего;
+ Пока КореньНайден Цикл
+ Если ФайлЧтения.ТипУзла = ТипУзлаXML.НачалоЭлемента И ФайлЧтения.ЛокальноеИмя = ИмяОписывающегоУзла Тогда
+ // Корявое чтение с типизацией.
+ Результат.Версия = ТипизированныйАтрибутXDTO(ФайлЧтения, ТипXDTOЗаголовка, "Version");
+ Результат.ДатаВерсии = ТипизированныйАтрибутXDTO(ФайлЧтения, ТипXDTOЗаголовка, "UpdateDate");
+ Прервать;
+ КонецЕсли;
+ КореньНайден = ФайлЧтения.Прочитать();
+ КонецЦикла;
+
+ Если КореньНайден Тогда
+ // Позиционируемся на следующий узел.
+ ФайлЧтения.Прочитать();
+ Иначе
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'В файле ""%1"" не найден корневой узел %2'"), Результат.ПолноеИмя, ИмяОписывающегоУзла
+ );
+ КонецЕсли;
+
+ Результат.Вставить("КодСубъектаРФ", КодСубъектаРФ);
+ Результат.Вставить("КлючВида", КлючВида);
+
+ Возврат Результат;
+КонецФункции
+
+// Поиск первого файла по маске без учета регистра (особенностей операционной системы).
+//
+// Параметры:
+// Каталог - Строка - каталог, в котором ищется файл.
+// МаскаИмениФайла - Строка - имя искомого файла.
+//
+// Возвращаемое значение:
+// Структура - описание найденного файла. Содержит поля:
+// * Существует - Булево - флаг того, что указанный файл существует.
+// * Имя - Строка - характеристика найденного файла, см. описания типа Файл.
+// * ИмяБезРасширения - Строка - характеристика найденного файла, см. описания типа Файл.
+// * ПолноеИмя - Строка - характеристика найденного файла, см. описания типа Файл.
+// * Путь - Строка - характеристика найденного файла, см. описания типа Файл.
+// * Расширение - Строка - характеристика найденного файла, см. описания типа Файл.
+//
+Функция НайтиФайл(Каталог, МаскаИмениФайла)
+
+ СистемнаяИнформация = Новый СистемнаяИнформация;
+ Платформа = СистемнаяИнформация.ТипПлатформы;
+
+ НеУчитыватьРегистр = Платформа = ТипПлатформы.Windows_x86 Или Платформа = ТипПлатформы.Windows_x86_64;
+
+ Если НеУчитыватьРегистр Тогда
+ Маска = ВРег(МаскаИмениФайла);
+ Иначе
+ Маска = "";
+ Для Позиция = 1 По СтрДлина(МаскаИмениФайла) Цикл
+ Символ = Сред(МаскаИмениФайла, Позиция, 1);
+ ВерхнийРегистр = ВРег(Символ);
+ НижнийРегистр = НРег(Символ);
+ Если ВерхнийРегистр = НижнийРегистр Тогда
+ Маска = Маска + Символ;
+ Иначе
+ Маска = Маска + "[" + ВерхнийРегистр + НижнийРегистр + "]";
+ КонецЕсли;
+ КонецЦикла;
+ КонецЕсли;
+
+ Результат = Новый Структура("Существует, Имя, ИмяБезРасширения, ПолноеИмя, Путь, Расширение", Ложь);
+ Варианты = НайтиФайлы(Каталог, Маска);
+ Если Варианты.Количество() > 0 Тогда
+ Результат.Существует = Истина;
+ ЗаполнитьЗначенияСвойств(Результат, Варианты[0]);
+ КонецЕсли;
+
+ Возврат Результат;
+КонецФункции
+
+Функция ТипизированныйАтрибутXDTO(ФайлЧтения, ТипЗаписи, ИмяАтрибута)
+
+ ТипАтрибута = ТипЗаписи.Свойства.Получить(ИмяАтрибута).Тип;
+ ЗначениеXDTO = ФабрикаXDTO.Создать(ТипАтрибута, ФайлЧтения.ПолучитьАтрибут(ИмяАтрибута));
+
+ Возврат ЗначениеXDTO.Значение;
+КонецФункции
+
+// Завершает работу с набором данных.
+//
+Процедура ЗакрытьФайлЗагрузкиСубъектаРФ(ОписаниеФайла)
+
+ ОписаниеФайла.ФайлЧтения.Закрыть();
+ ОписаниеФайла.ФайлЧтения = Неопределено;
+
+ Если ОписаниеФайла.УдалитьПутьПриЗакрытии Тогда
+ УдалитьВременныйФайл(ОписаниеФайла.Путь);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Читает следующую запись
+//
+Функция СледующаяЗаписьФайлаЗагрузкиСубъектаРФ(ФайлЗагрузки, ТекущаяЗапись)
+ Чтение = ФайлЗагрузки.ФайлЧтения;
+
+ Если Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда
+ ТекущаяЗапись = Неопределено;
+ Возврат Ложь;
+ КонецЕсли;
+
+ ТекущаяЗапись = ФабрикаXDTO.ПрочитатьXML(Чтение, ФайлЗагрузки.ТипXDTOЗаписи);
+ Возврат Истина;
+КонецФункции
+
+// Противоположность ОбщегоНазначенияКлиентСервер.СтруктураURI
+//
+Функция URIПоСтруктуре(СтруктураURI)
+ Результат = "";
+
+ // Протокол
+ Если Не ПустаяСтрока(СтруктураURI.Схема) Тогда
+ Результат = Результат + СтруктураURI.Схема + "://";
+ КонецЕсли;
+
+ // Авторизация
+ Если Не ПустаяСтрока(СтруктураURI.Логин) Тогда
+ Результат = Результат + СтруктураURI.Логин + ":" + СтруктураURI.Пароль + "@";
+ КонецЕсли;
+
+ // Все остальное
+ Результат = Результат + СтруктураURI.Хост;
+ Если Не ПустаяСтрока(СтруктураURI.Порт) Тогда
+ Результат = Результат + ":" + ?(ТипЗнч(СтруктураURI.Порт) = Тип("Число"), Формат(СтруктураURI.Порт, ""), СтруктураURI.Порт);
+ КонецЕсли;
+
+ Результат = Результат + "/" + СтруктураURI.ПутьНаСервере;
+ Возврат Результат;
+
+КонецФункции
+
+// Подстановка порта в адрес загрузки для профилей безопасности.
+//
+Функция АдресИнтернетаВключаяПорт(Адрес)
+
+ Результат = Новый Структура;
+
+ СоставАдреса = ОбщегоНазначенияКлиентСервер.СтруктураURI(Адрес);
+ Если ПустаяСтрока(СоставАдреса.Порт) Тогда
+ Протокол = ВРег(СоставАдреса.Схема);
+ Если Протокол = "HTTP" Тогда
+ СоставАдреса.Порт = 80;
+ ИначеЕсли Протокол = "HTTPS" Тогда
+ СоставАдреса.Порт = 443;
+ КонецЕсли;
+
+ Результат.Вставить("Адрес", URIПоСтруктуре(СоставАдреса) );
+ Иначе
+ Результат.Вставить("Адрес", Адрес);
+ КонецЕсли;
+
+ ИмяФайла = СоставАдреса.ПутьНаСервере;
+ ПозицияПараметра = Найти(ИмяФайла, "?");
+ Если ПозицияПараметра > 0 Тогда
+ ИмяФайла = Лев(ИмяФайла, ПозицияПараметра - 1);
+ КонецЕсли;
+ ИмяФайла = СтрЗаменить(ИмяФайла, Символы.ПС, "");
+ ИмяФайла = СтрЗаменить(ИмяФайла, "/", Символы.ПС);
+ ИмяФайла = СтрЗаменить(ИмяФайла, "\", Символы.ПС);
+
+ Результат.Вставить("ИмяФайла", СокрЛП(СтрПолучитьСтроку(ИмяФайла, СтрЧислоСтрок(ИмяФайла))));
+ Возврат Результат;
+КонецФункции
+
+// Имя событие для записи в журнал регистрации.
+//
+Функция СобытиеЖурналаРегистрации()
+
+ Возврат АдресныйКлассификаторКлиентСервер.СобытиеЖурналаРегистрации();
+
+КонецФункции
+
+// Удаляет временный файл.
+// Если при попытке удаления возникает ошибка, она игнорируется - файл будет удален позднее.
+//
+Процедура УдалитьВременныйФайл(ПолноеИмяФайла) Экспорт
+
+ Если ПустаяСтрока(ПолноеИмяФайла) Тогда
+ Возврат;
+ КонецЕсли;
+
+ Попытка
+ УдалитьФайлы(ПолноеИмяФайла)
+ Исключение
+ ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение,
+ ,, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось удалить временный файл
+ |%1
+ |по причине: %2'"), ПолноеИмяФайла, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
+ КонецПопытки
+
+КонецПроцедуры
+#КонецОбласти
+
#КонецОбласти
\ No newline at end of file
diff --git a/SSL/src/CommonModules/Анкетирование/Module.bsl b/SSL/src/CommonModules/Анкетирование/Module.bsl
index 88c49d56e..4badb97a1 100644
--- a/SSL/src/CommonModules/Анкетирование/Module.bsl
+++ b/SSL/src/CommonModules/Анкетирование/Module.bsl
@@ -20,6 +20,29 @@
КонецПроцедуры
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+
+ Объекты.Вставить(Метаданные.Документы.Анкета.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Документы.НазначениеОпросов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.ПланыВидовХарактеристик.ВопросыДляАнкетирования.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ВариантыОтветовАнкет.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ВопросыШаблонаАнкеты.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ШаблоныАнкет.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+
+КонецПроцедуры
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/Module.bsl
index 7b9224fec..8079556a9 100644
--- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/Module.bsl
+++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/Module.bsl
@@ -149,6 +149,7 @@
ЗадачаОбъект.РезультатВыполнения = ИнфоОПеренаправлении.Комментарий;
ЗадачаОбъект.Выполнена = Ложь;
+ ЗадачаОбъект.ДополнительныеСвойства.Вставить("Перенаправление", Истина);
ЗадачаОбъект.ВыполнитьЗадачу();
УстановитьПривилегированныйРежим(Истина);
@@ -1052,11 +1053,11 @@
КонецЕсли;
ПодключенныеБизнесПроцессы = Новый Соответствие;
- ПодключенныеБизнесПроцессы.Вставить(Метаданные.БизнесПроцессы.Задание.ПолноеИмя());
+ ПодключенныеБизнесПроцессы.Вставить(Метаданные.БизнесПроцессы.Задание.ПолноеИмя(), "");
БизнесПроцессыИЗадачиПереопределяемый.ПриОпределенииБизнесПроцессов(ПодключенныеБизнесПроцессы);
ТипБизнесПроцесса = ЗадачаОбъект.БизнесПроцесс.Метаданные();
- СведенияОБизнесПроцессе = ПодключенныеБизнесПроцессы[ТипБизнесПроцесса.Имя];
+ СведенияОБизнесПроцессе = ПодключенныеБизнесПроцессы[ТипБизнесПроцесса.ПолноеИмя()];
Если СведенияОБизнесПроцессе <> Неопределено Тогда
БизнесПроцессы[ТипБизнесПроцесса.Имя].ПриПеренаправленииЗадачи(ЗадачаОбъект.Ссылка, НоваяЗадачаОбъект.Ссылка);
КонецЕсли;
diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/Module.bsl
index fb8c78e3e..e7daa6126 100644
--- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/Module.bsl
+++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/Module.bsl
@@ -8,7 +8,7 @@
// Вызывается для обновления данных бизнес-процесса в регистре сведений.
// ДанныеБизнесПроцессов.
//
-// Параметры
+// Параметры:
// Запись - РегистрСведенийЗапись.ДанныеБизнесПроцессов
//
Процедура ПриЗаписиСпискаБизнесПроцессов(Запись) Экспорт
@@ -29,7 +29,7 @@
// Вызывается для заполнения реквизита ГлавнаяЗадача из данных заполнения.
//
-// Параметры
+// Параметры:
// БизнесПроцессОбъект - БизнесПроцессОбъект - бизнес-процесс.
// ДанныеЗаполнения - Произвольный - данные заполнения, которые передаются в обработчик заполнения.
// СтандартнаяОбработка - Булево - если установить Ложь, то стандартная обработка заполнения не будет
@@ -83,7 +83,7 @@
// Устарела. Следует использовать ПриПроверкеПравНаОстановкуБизнесПроцесса.
// Вызывается для проверки прав на остановку и продолжение бизнес-процесса.
//
-// Параметры
+// Параметры:
// БизнесПроцесс - Ссылка на бизнес-процесс.
//
Функция ЕстьПраваНаОстановкуБизнесПроцесса(БизнесПроцесс) Экспорт
@@ -94,7 +94,7 @@
// Устарела. Следует использовать ПриЗаполненииГлавнойЗадачиБизнесПроцесса.
// Вызывается для заполнения реквизита ГлавнаяЗадача из данных заполнения.
-// Параметры
+// Параметры:
//
// БизнесПроцессОбъект - бизнес-процесс.
// ДанныеЗаполнения - данные заполнения, которые передаются в обработчик заполнения.
diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl
index c7980793b..1a5a20869 100644
--- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl
+++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl
@@ -737,6 +737,27 @@
КонецПроцедуры
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.БизнесПроцессы.Задание.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Задачи.ЗадачаИсполнителя.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.ПланыВидовХарактеристик.ОбъектыАдресацииЗадач.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ГруппыИсполнителейЗадач.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.РолиИсполнителей.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
diff --git a/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl
index 7b4445e7b..d12688200 100644
--- a/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl
+++ b/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl
@@ -1207,6 +1207,24 @@
КонецПроцедуры
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.Справочники.ВариантыОтчетов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ПользовательскиеНастройкиОтчетов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ПредопределенныеВариантыОтчетов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
////////////////////////////////////////////////////////////////////////////////
// Прочие процедуры служебного программного интерфейса.
@@ -2059,6 +2077,20 @@
Строка(Реквизит3)));
КонецПроцедуры
+// Запись предупреждения в журнале регистрации по варианту отчета.
+Процедура ПримечаниеПоВарианту(Вариант, Сообщение, Реквизит1 = Неопределено, Реквизит2 = Неопределено, Реквизит3 = Неопределено) Экспорт
+ ЗаписьЖурналаРегистрации(
+ ВариантыОтчетовКлиентСервер.НаименованиеПодсистемы(Неопределено),
+ УровеньЖурналаРегистрации.Примечание,
+ Метаданные.Справочники.ВариантыОтчетов,
+ Вариант,
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ Сообщение,
+ Строка(Реквизит1),
+ Строка(Реквизит2),
+ Строка(Реквизит3)));
+КонецПроцедуры
+
// Записывает в журнал регистрации событие запуска процедуры и открывает транзакцию.
Процедура ЗапускПроцедуры(ПредставлениеПроцедуры)
ИнформацияПоВарианту(Неопределено, НСтр("ru = 'Запуск процедуры ""%1"".'"), ПредставлениеПроцедуры);
@@ -2395,6 +2427,7 @@
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.ПредопределенныеВариантыОтчетов ГДЕ ПометкаУдаления = ЛОЖЬ");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
+ ПримечаниеПоВарианту(Выборка.Ссылка, НСтр("ru = 'Индексация схемы'"));
ВариантОбъект = Выборка.Ссылка.ПолучитьОбъект();
ВариантОбъект.ДополнительныеСвойства.Вставить("ДеревоВариантов", ДеревоВариантов);
ЗаполнитьЗначенияСвойств(СтарыеСведения, ВариантОбъект);
@@ -2460,23 +2493,37 @@
КонецПроцедуры
// [2.2.3.30] Уменьшает количество быстрых настроек в пользовательских вариантах отчетов до 2 шт.
-Процедура СократитьКоличествоБыстрыхНастроек(Параметры = Неопределено) Экспорт
+Процедура СократитьКоличествоБыстрыхНастроек(ВходящиеПараметры = Неопределено) Экспорт
ПредставлениеПроцедуры = НСтр("ru = 'Сокращение количества быстрых настроек в отчетах'");
ЗапускПроцедуры(ПредставлениеПроцедуры);
+ // Чтение сведений от предыдущего запуска с ошибками.
+ Параметры = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
+ ВариантыОтчетовКлиентСервер.ПолноеИмяПодсистемы(),
+ "СократитьКоличествоБыстрыхНастроек"
+ );
+ Запрос = Новый Запрос;
+ Если Параметры = Неопределено Тогда
+ Запрос.Текст = "ВЫБРАТЬ Ссылка, Отчет ИЗ Справочник.ВариантыОтчетов ГДЕ Пользовательский И ТипОтчета <> &Внешний";
+ Запрос.УстановитьПараметр("Внешний", Перечисления.ТипыОтчетов.Внешний);
+ НомерПопытки = 1;
+ Иначе
+ Запрос.Текст = "ВЫБРАТЬ Ссылка, Отчет ИЗ Справочник.ВариантыОтчетов ГДЕ Ссылка В (&ВариантыСОшибками)";
+ Запрос.УстановитьПараметр("ВариантыСОшибками", Параметры.ВариантыСОшибками);
+ НомерПопытки = Параметры.НомерПопытки + 1;
+ КонецЕсли;
+ ТаблицаОтчетов = Запрос.Выполнить().Выгрузить();
+
Записано = 0;
-
+ Ошибок = 0;
КэшОтчетов = Новый Соответствие;
-
ИспользуетсяПоУмолчанию = ФормаОтчетаИспользуетсяПоУмолчанию();
+ ВариантыСОшибками = Новый Массив;
- Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, Отчет ИЗ Справочник.ВариантыОтчетов ГДЕ Пользовательский И ТипОтчета <> &Внешний");
- Запрос.УстановитьПараметр("Внешний", Перечисления.ТипыОтчетов.Внешний);
- Выборка = Запрос.Выполнить().Выбрать();
- Пока Выборка.Следующий() Цикл
- ОтчетОбъект = КэшОтчетов.Получить(Выборка.Отчет); // Чтение кэша.
+ Для Каждого СтрокаТаблицы Из ТаблицаОтчетов Цикл
+ ОтчетОбъект = КэшОтчетов.Получить(СтрокаТаблицы.Отчет); // Чтение кэша.
Если ОтчетОбъект = Неопределено Тогда // Запись в кэш.
- РезультатПодключения = ПодключитьОтчетОбъект(Выборка.Отчет);
+ РезультатПодключения = ПодключитьОтчетОбъект(СтрокаТаблицы.Отчет);
Если РезультатПодключения.Подключен Тогда
ОтчетОбъект = РезультатПодключения.Объект;
ОтчетМетаданные = РезультатПодключения.Метаданные;
@@ -2486,27 +2533,70 @@
ОтчетОбъект = "";
КонецЕсли;
Иначе // Отчет не найден.
- ОшибкаПоВарианту(Выборка.Ссылка, РезультатПодключения.Ошибки);
+ ОшибкаПоВарианту(СтрокаТаблицы.Ссылка, РезультатПодключения.Ошибки);
ОтчетОбъект = "";
КонецЕсли;
- КэшОтчетов.Вставить(Выборка.Отчет, ОтчетОбъект);
+ КэшОтчетов.Вставить(СтрокаТаблицы.Отчет, ОтчетОбъект);
КонецЕсли;
Если ОтчетОбъект = "" Тогда
Продолжить;
КонецЕсли;
- ВариантОбъект = Выборка.Ссылка.ПолучитьОбъект();
- ТребуетсяЗапись = УменьшитьКоличествоБыстрыхНастроек(ВариантОбъект, ОтчетОбъект);
- Если Не ТребуетсяЗапись Тогда
- Продолжить;
+ ВариантОбъект = СтрокаТаблицы.Ссылка.ПолучитьОбъект();
+
+ ИнформацияОбОшибке = Неопределено;
+ Попытка
+ ТребуетсяЗапись = УменьшитьКоличествоБыстрыхНастроек(ВариантОбъект, ОтчетОбъект);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ТребуетсяЗапись = Ложь;
+ КонецПопытки;
+ Если ИнформацияОбОшибке <> Неопределено Тогда // Возникла проблема.
+ ТекстОшибки = НСтр("ru = 'Вариант ""%1"" отчета ""%2"":'")
+ + Символы.ПС + НСтр("ru = 'При уменьшении количества быстрых настроек пользовательского возникла ошибка:'")
+ + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
+ ОшибкаПоВарианту(ВариантОбъект.Ссылка, ТекстОшибки, ВариантОбъект.КлючВарианта, ВариантОбъект.Отчет);
+ ВариантыСОшибками.Добавить(ВариантОбъект.Ссылка);
+ Ошибок = Ошибок + 1;
+ КонецЕсли;
+
+ Если ТребуетсяЗапись Тогда
+ ВариантОбъект.ДополнительныеСвойства.Вставить("ИндексироватьСхему", Ложь);
+ ВариантОбъект.ДополнительныеСвойства.Вставить("ОтчетОбъект", ОтчетОбъект);
+ ЗаписатьПредопределенный(ВариантОбъект);
+ Записано = Записано + 1;
КонецЕсли;
- ВариантОбъект.ДополнительныеСвойства.Вставить("ИндексироватьСхему", Ложь);
- ВариантОбъект.ДополнительныеСвойства.Вставить("ОтчетОбъект", ОтчетОбъект);
- ЗаписатьПредопределенный(ВариантОбъект);
- Записано = Записано + 1;
КонецЦикла;
+ Если Ошибок > 0 Тогда
+ // Запись сведений для следующего запуска.
+ Параметры = Новый Структура;
+ Параметры.Вставить("НомерПопытки", НомерПопытки);
+ Параметры.Вставить("ВариантыСОшибками", ВариантыСОшибками);
+
+ ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(
+ ВариантыОтчетовКлиентСервер.ПолноеИмяПодсистемы(),
+ "СократитьКоличествоБыстрыхНастроек",
+ Параметры
+ );
+ ИначеЕсли НомерПопытки > 1 Тогда
+ // Удаление сведений от предыдущих запусков.
+ ОбщегоНазначения.ХранилищеОбщихНастроекУдалить(
+ ВариантыОтчетовКлиентСервер.ПолноеИмяПодсистемы(),
+ "СократитьКоличествоБыстрыхНастроек",
+ ИмяПользователя()
+ );
+ КонецЕсли;
+
ЗавершениеПроцедуры(ПредставлениеПроцедуры, Записано);
+
+ Если Ошибок > 0 И НомерПопытки <= 30 Тогда
+ // Следующий запуск должен состояться.
+ ТекстОшибки = ПредставлениеПроцедуры + ":"
+ + Символы.ПС + НСтр("ru = 'Не удалось уменьшить количество быстрых настроек %1 отчетов.'");
+ ТекстОшибки = СтрЗаменить(ТекстОшибки, "%1", Ошибок);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
@@ -3228,7 +3318,7 @@
Поля = ИнструкцияУсловногоОформления.Поля;
Если ТипЗнч(Поля) = Тип("Строка") Тогда
- Поля = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Поля, ",");
+ Поля = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Поля, ",", Истина, Истина);
КонецЕсли;
Для Каждого Поле Из Поля Цикл
ПолеКД = ЭлементУсловногоОформленияКД.Поля.Элементы.Добавить();
@@ -3711,6 +3801,10 @@
Функция УменьшитьКоличествоБыстрыхНастроек(ВариантОбъект, ОтчетОбъект) Экспорт
Перем НастройкиКД, ЭтоПредопределенный;
+ Если ВариантОбъект = Неопределено Тогда
+ Возврат Ложь; // Варианта нет в базе. Заполнение не требуется.
+ КонецЕсли;
+
// Схема компоновки, на основании которой будет выполняться отчет.
СхемаКД = ОтчетОбъект.СхемаКомпоновкиДанных;
Если СхемаКД = Неопределено Тогда
@@ -3725,55 +3819,41 @@
Возврат Ложь; // Возникла проблема.
КонецЕсли;
- ИнформацияОбОшибке = Неопределено;
- Попытка
- // Описывает связь настроек компоновки данных и схемы компоновки данных.
- КомпоновщикНастроекКД = ОтчетОбъект.КомпоновщикНастроек;
-
- // Выполняет инициализацию компоновщика и его настроек (Настройки) источником доступных настроек.
- КомпоновщикНастроекКД.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКД));
-
- // Загружает настройки в компоновщик.
- КомпоновщикНастроекКД.ЗагрузитьНастройки(НастройкиКД);
-
- УсловияВывода = Новый Структура;
- УсловияВывода.Вставить("ТолькоПользовательские", Истина);
- УсловияВывода.Вставить("ТолькоБыстрые", Истина);
- УсловияВывода.Вставить("ИдентификаторТекущегоУзлаКД", Неопределено);
- Информация = ОтчетыСервер.РасширеннаяИнформацияОНастройках(КомпоновщикНастроекКД, Неопределено, УсловияВывода);
- БыстрыеНастройки = Информация.ПользовательскиеНастройки.Скопировать(Новый Структура("ВыводРазрешен, Быстрая", Истина, Истина));
- Если БыстрыеНастройки.Количество() <= 2 Тогда
- Возврат Ложь; // Уменьшение количества не требуется.
- КонецЕсли;
-
- Исключаемые = БыстрыеНастройки.НайтиСтроки(Новый Структура("ТипЭлементов", "СтандартныйПериод"));
- Для Каждого СтрокаТаблицы Из Исключаемые Цикл
- БыстрыеНастройки.Удалить(СтрокаТаблицы);
- КонецЦикла;
-
- Потрачено = Исключаемые.Количество();
- Для Каждого СтрокаТаблицы Из БыстрыеНастройки Цикл
- Если Потрачено < 2 Тогда
- Потрачено = Потрачено + 1;
- Продолжить;
- КонецЕсли;
- СтрокаТаблицы.НастройкаВариантаКД.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
- КонецЦикла;
-
- НовыеНастройки = Новый ХранилищеЗначения(КомпоновщикНастроекКД.Настройки);
- Исключение
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- КонецПопытки;
+ // Описывает связь настроек компоновки данных и схемы компоновки данных.
+ КомпоновщикНастроекКД = ОтчетОбъект.КомпоновщикНастроек;
- Если ИнформацияОбОшибке <> Неопределено Тогда
- ТекстОшибки = НСтр("ru = 'Вариант ""%1"" отчета ""%2"":'")
- + Символы.ПС + НСтр("ru = 'При уменьшении количества быстрых настроек пользовательского возникла ошибка:'")
- + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
- ОшибкаПоВарианту(ВариантОбъект.Ссылка, ТекстОшибки, ВариантОбъект.КлючВарианта, ВариантОбъект.Отчет);
- Возврат Ложь; // Возникла проблема.
+ // Выполняет инициализацию компоновщика и его настроек (Настройки) источником доступных настроек.
+ КомпоновщикНастроекКД.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКД));
+
+ // Загружает настройки в компоновщик.
+ КомпоновщикНастроекКД.ЗагрузитьНастройки(НастройкиКД);
+
+ УсловияВывода = Новый Структура;
+ УсловияВывода.Вставить("ТолькоПользовательские", Истина);
+ УсловияВывода.Вставить("ТолькоБыстрые", Истина);
+ УсловияВывода.Вставить("ИдентификаторТекущегоУзлаКД", Неопределено);
+ Информация = ОтчетыСервер.РасширеннаяИнформацияОНастройках(КомпоновщикНастроекКД, Неопределено, УсловияВывода);
+ БыстрыеНастройки = Информация.ПользовательскиеНастройки.Скопировать(Новый Структура("ВыводРазрешен, Быстрая", Истина, Истина));
+ Если БыстрыеНастройки.Количество() <= 2 Тогда
+ Возврат Ложь; // Уменьшение количества не требуется.
КонецЕсли;
- ВариантОбъект.Настройки = НовыеНастройки;
+ Исключаемые = БыстрыеНастройки.НайтиСтроки(Новый Структура("ТипЭлементов", "СтандартныйПериод"));
+ Для Каждого СтрокаТаблицы Из Исключаемые Цикл
+ БыстрыеНастройки.Удалить(СтрокаТаблицы);
+ КонецЦикла;
+
+ Потрачено = Исключаемые.Количество();
+ Для Каждого СтрокаТаблицы Из БыстрыеНастройки Цикл
+ Если Потрачено < 2 Тогда
+ Потрачено = Потрачено + 1;
+ Продолжить;
+ КонецЕсли;
+ СтрокаТаблицы.НастройкаВариантаКД.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
+ КонецЦикла;
+
+ ВариантОбъект.Настройки = Новый ХранилищеЗначения(КомпоновщикНастроекКД.Настройки);
+
Возврат Истина;
КонецФункции
diff --git a/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl
index 1e76a45f6..6e97bc743 100644
--- a/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl
+++ b/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl
@@ -17,7 +17,8 @@
Процедура ПоказатьПанельОтчетов(ПутьКПодсистеме, ПараметрыВыполненияКоманды, Удалить_Заголовок = "") Экспорт
ФормаПараметры = Новый Структура("ПутьКПодсистеме", ПутьКПодсистеме);
ФормаОкно = ?(ПараметрыВыполненияКоманды = Неопределено, Неопределено, ПараметрыВыполненияКоманды.Окно);
- ОткрытьФорму("ОбщаяФорма.ПанельОтчетов", ФормаПараметры, , ПутьКПодсистеме, ФормаОкно);
+ ФормаСсылка = ?(ПараметрыВыполненияКоманды = Неопределено, Неопределено, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
+ ОткрытьФорму("ОбщаяФорма.ПанельОтчетов", ФормаПараметры, , ПутьКПодсистеме, ФормаОкно, ФормаСсылка);
КонецПроцедуры
// Открывает диалог настройки размещения нескольких вариантов в разделах.
diff --git a/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl b/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl
index 2944c037c..f9ee5716a 100644
--- a/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl
+++ b/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl
@@ -62,17 +62,36 @@
КонецПроцедуры
-// Записывает настройку версионирования по объекту в регистр сведений.
+// Записывает настройку версионирования объекта.
//
// Параметры:
-// ИмяОбъектаМетаданных - Строка - полное имя объекта метаданных;
-// ВариантВерсионирования - Перечисление.ВариантыВерсионированияОбъектов.
+// ТипОбъекта - Строка, Тип, ОбъектМетаданных, СправочникСсылка.ИдентификаторыОбъектовМетаданных - объект метаданных;
+// ВариантВерсионирования - ПеречислениеСсылка.ВариантыВерсионированияОбъектов - условие записи версий;
+// СрокХраненияВерсий - ПеречислениеСсылка.СрокиХраненияВерсий - срок, после которого версии подлежат очистке.
//
-Процедура ЗаписатьНастройкуВерсионированияПоОбъекту(ИмяОбъектаМетаданных, ВариантВерсионирования) Экспорт
+Процедура ЗаписатьНастройкуВерсионированияПоОбъекту(Знач ТипОбъекта, Знач ВариантВерсионирования, Знач СрокХраненияВерсий = Неопределено) Экспорт
+
+ Если ТипЗнч(ТипОбъекта) <> Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда
+ ТипОбъекта = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипОбъекта);
+ КонецЕсли;
+
Настройка = РегистрыСведений.НастройкиВерсионированияОбъектов.СоздатьМенеджерЗаписи();
- Настройка.ТипОбъекта = ИмяОбъектаМетаданных;
+ Настройка.ТипОбъекта = ТипОбъекта;
+
+ Если СрокХраненияВерсий = Неопределено Тогда
+ Настройка.Прочитать();
+ Если Настройка.Выбран() Тогда
+ СрокХраненияВерсий = Настройка.СрокХраненияВерсий;
+ Иначе
+ Настройка.ТипОбъекта = ТипОбъекта;
+ СрокХраненияВерсий = Перечисления.СрокиХраненияВерсий.Бессрочно;
+ КонецЕсли;
+ КонецЕсли;
+
+ Настройка.СрокХраненияВерсий = СрокХраненияВерсий;
Настройка.Вариант = ВариантВерсионирования;
Настройка.Записать();
+
КонецПроцедуры
// Выполняет с формой действия, необходимые для подключения подсистемы версионирования.
@@ -173,7 +192,13 @@
СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить(
"ВерсионированиеОбъектов");
-
+
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда
+ СерверныеОбработчики[
+ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить(
+ "ВерсионированиеОбъектов");
+ КонецЕсли;
+
КонецПроцедуры
// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме.
@@ -381,6 +406,21 @@
КонецПроцедуры
+// Заполняет соответствие имен методов их псевдонимам для вызова из очереди заданий.
+//
+// Параметры:
+// СоответствиеИменПсевдонимам - Соответствие
+// Ключ - Псевдоним метода, например ОчиститьОбластьДанных.
+// Значение - Имя метода для вызова, например РаботаВМоделиСервиса.ОчиститьОбластьДанных.
+// В качестве значения можно указать Неопределено, в этом случае считается что имя
+// совпадает с псевдонимом.
+//
+Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт
+
+ СоответствиеИменПсевдонимам.Вставить("ВерсионированиеОбъектов.ОчиститьУстаревшиеВерсииОбъектов");
+
+КонецПроцедуры
+
// Создает и записывает версию объекта в информационную базу.
//
Процедура СоздатьВерсиюОбъекта(Объект, СведенияОВерсииОбъекта, ЗаписьОбычнойВерсии = Истина)
@@ -733,11 +773,11 @@
НаборЗаписей = РегистрыСведений.НастройкиВерсионированияОбъектов.СоздатьНаборЗаписей();
Для Каждого НастройкаВерсионирования Из НастройкиВерсионирования Цикл
- Попытка
- ТипОбъекта = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(НастройкаВерсионирования.ИмяОбъекта);
- Исключение
+ ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(НастройкаВерсионирования.ИмяОбъекта);
+ Если ОбъектМетаданных = Неопределено Тогда
Продолжить;
- КонецПопытки;
+ КонецЕсли;
+ ТипОбъекта = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных);
Запись = НаборЗаписей.Добавить();
ЗаполнитьЗначенияСвойств(Запись, НастройкаВерсионирования);
@@ -749,7 +789,7 @@
ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборЗаписей);
КонецПроцедуры
-
+
////////////////////////////////////////////////////////////////////////////////
// Обработчики условных вызовов в эту подсистему.
@@ -921,7 +961,7 @@
//
Функция СведенияОВерсииОбъекта(Знач Ссылка, Знач НомерВерсии) Экспорт
СообщениеНеУдалосьПолучитьВерсию = НСтр("ru = 'Не удалось получить предыдущую версию объекта.'");
- Если Не ЕстьПравоНаЧтениеВерсийОбъектов() Тогда
+ Если Не Пользователи.РолиДоступны("ЧтениеВерсийОбъектов") Тогда
ВызватьИсключение СообщениеНеУдалосьПолучитьВерсию;
КонецЕсли;
@@ -953,7 +993,6 @@
Результат.ВерсияОбъекта = ДанныеВерсииОбъекта(Ссылка, НомерВерсии);
КонецЕсли;
КонецЕсли;
-
Если Результат.ВерсияОбъекта = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'Выбранная версия объекта отсутствует в программе.'");
@@ -1067,7 +1106,7 @@
Возврат СериализоватьОбъект(СсылкаНаОбъект.ПолучитьОбъект());
КонецФункции
-
+
Функция ВерсияОтличаетсяОтРанееЗаписанной(Объект)
ТекстЗапроса =
@@ -1096,6 +1135,8 @@
// Только для служебного использования.
Процедура ОчиститьУстаревшиеВерсииОбъектов() Экспорт
+ ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания();
+
УстановитьПривилегированныйРежим(Истина);
ГраницыУдаленияОбъектов = ГраницыУдаленияОбъектов();
@@ -1196,7 +1237,7 @@
Возврат Результат;
КонецФункции
-
+
Функция ГраницаУдаления(СрокХраненияВерсий)
Если СрокХраненияВерсий = Перечисления.СрокиХраненияВерсий.ЗаПоследнийГод Тогда
Возврат ДобавитьМесяц(ТекущаяДатаСеанса(), -12);
@@ -1221,12 +1262,14 @@
Возврат;
КонецЕсли;
+ УстановитьПривилегированныйРежим(Истина);
+
МенеджерЗаписи = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = СсылкаНаОбъект;
МенеджерЗаписи.НомерВерсии = НомерВерсии;
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
- Если МенеджерЗаписи.АвторВерсии = Пользователи.ТекущийПользователь() Или Пользователи.ЭтоПолноправныйПользователь() Тогда
+ Если МенеджерЗаписи.АвторВерсии = Пользователи.ТекущийПользователь() Или Пользователи.ЭтоПолноправныйПользователь(, , Ложь) Тогда
МенеджерЗаписи.Комментарий = Комментарий;
МенеджерЗаписи.Записать();
КонецЕсли;
@@ -1313,7 +1356,7 @@
Результат.Вставить("РазмерДанныхСтрокой", РазмерДанныхСтрокой(Результат.РазмерДанных));
ПоместитьВоВременноеХранилище(Результат, АдресВоВременномХранилище);
КонецПроцедуры
-
+
// Строковое представление объемов данных. Например: "1,23 Гб".
Функция РазмерДанныхСтрокой(Знач РазмерДанных) Экспорт
@@ -1341,7 +1384,7 @@
НСтр("ru = '%1 %2'"), РазмерДанных, ЕдиницаИзмерения);
КонецФункции
-
+
////////////////////////////////////////////////////////////////////////////////
// Функции для получения отчета по объекту.
@@ -1410,9 +1453,18 @@
ТабличныеЧасти = Новый Соответствие;
ЧтениеXML = Новый ЧтениеFastInfoSet;
-
ЧтениеXML.УстановитьДвоичныеДанные(ДвоичныеДанные);
+ ЗаписьXML = Новый ЗаписьXML;
+ ЗаписьXML.УстановитьСтроку();
+ Пока ЧтениеXML.Прочитать() Цикл
+ ЗаписьXML.ЗаписатьТекущий(ЧтениеXML);
+ КонецЦикла;
+ СтрокаXML = ЗаписьXML.Закрыть();
+
+ ЧтениеXML = Новый ЧтениеXML;
+ ЧтениеXML.УстановитьСтроку(СтрокаXML);
+
// Уровень позиции маркера в иерархии XML:
// 0 - уровень не задан
// 1 - первый элемент (имя объекта)
diff --git a/SSL/src/CommonModules/Взаимодействия/Module.bsl b/SSL/src/CommonModules/Взаимодействия/Module.bsl
index 481243512..9d606654b 100644
--- a/SSL/src/CommonModules/Взаимодействия/Module.bsl
+++ b/SSL/src/CommonModules/Взаимодействия/Module.bsl
@@ -173,9 +173,6 @@
СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить(
"Взаимодействия");
- СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииПредставленияПредмета"].Добавить(
- "Взаимодействия");
-
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда
СерверныеОбработчики["СтандартныеПодсистемы.УдалениеПомеченныхОбъектов\ПослеУдаленияПомеченных"].Добавить(
"Взаимодействия");
@@ -243,7 +240,6 @@
КонецПроцедуры
-
// Определить список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла".
//
// Параметры:
@@ -263,6 +259,37 @@
КонецПроцедуры
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.Документы.Встреча.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Документы.ТелефонныйЗвонок.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Документы.ЗапланированноеВзаимодействие.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Документы.ЭлектронноеПисьмоВходящее.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Документы.ЭлектронноеПисьмоИсходящее.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Документы.СообщениеSMS.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ВстречаПрисоединенныеФайлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ЗакладкиВзаимодействий.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ЗапланированноеВзаимодействиеПрисоединенныеФайлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ПапкиЭлектронныхПисем.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ПравилаОбработкиЭлектроннойПочты.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.СообщениеSMSПрисоединенныеФайлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.СтроковыеКонтактыВзаимодействий.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ТелефонныйЗвонокПрисоединенныеФайлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ЭлектронноеПисьмоВходящееПрисоединенныеФайлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@@ -270,29 +297,6 @@
////////////////////////////////////////////////////////////////////////////////
// Обработчики служебных событий подсистем БСП.
-// Устанавливает текстовое описание предмета.
-//
-// Параметры:
-// СсылкаНаПредмет - ЛюбаяСсылка - объект ссылочного типа.
-// Представление - Строка - сюда необходимо поместить текстовое описание.
-Процедура ПриОпределенииПредставленияПредмета(СсылкаНаПредмет, Представление) Экспорт
-
- Если ТипЗнч(СсылкаНаПредмет) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее") ИЛИ
- ТипЗнч(СсылкаНаПредмет) = Тип("ДокументСсылка.ЭлектронноеПисьмоИсходящее") ИЛИ
- ТипЗнч(СсылкаНаПредмет) = Тип("ДокументСсылка.ТелефонныйЗвонок") ИЛИ
- ТипЗнч(СсылкаНаПредмет) = Тип("ДокументСсылка.Встреча") ИЛИ
- ТипЗнч(СсылкаНаПредмет) = Тип("ДокументСсылка.ЗапланированноеВзаимодействие") Тогда
-
- ПредставлениеОбъекта = СсылкаНаПредмет.Метаданные().ПредставлениеОбъекта;
- Если ПустаяСтрока(ПредставлениеОбъекта) Тогда
- ПредставлениеОбъекта = СсылкаНаПредмет.Метаданные().Представление();
- КонецЕсли;
- Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- "%1 (%2)", СсылкаНаПредмет.Тема, ПредставлениеОбъекта);
- КонецЕсли;
-
-КонецПроцедуры
-
// Заполняет состав видов доступа, используемых при ограничении прав объектов метаданных.
// Если состав видов доступа не заполнен, отчет "Права доступа" покажет некорректные сведения.
//
@@ -472,7 +476,7 @@
МодульТекущиеДелаСлужебный = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСлужебный");
Если (Не Пользователи.ЭтоПолноправныйПользователь()
- И Не РольДоступна("ДобавлениеИзменениеВзаимодействий"))
+ И Не Пользователи.РолиДоступны("ДобавлениеИзменениеВзаимодействий"))
Или МодульТекущиеДелаСлужебный.ДелоОтключено("ВзаимодействияПочта") Тогда
Возврат;
КонецЕсли;
@@ -6993,7 +6997,7 @@
Запрос = Новый Запрос;
Запрос.Текст =
- "ВЫБРАТЬ
+ "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| КОЛИЧЕСТВО(Взаимодействия.Ссылка) КАК КоличествоПисем,
| Взаимодействия.УчетнаяЗапись КАК УчетнаяЗапись
|ИЗ
diff --git a/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl b/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl
index 6267197b0..2b4527959 100644
--- a/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl
+++ b/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl
@@ -17,6 +17,7 @@
СтрокаКИ = "";
Если Не ЗначениеЗаполнено(Контакт)
ИЛИ ТипЗнч(Контакт) = Тип("СправочникСсылка.СтроковыеКонтактыВзаимодействий") Тогда
+ Контакт = Неопределено;
Возврат;
КонецЕсли;
@@ -68,7 +69,8 @@
//
Функция ПолучитьНаименованиеИАдресаЭлектроннойПочтыКонтакта(Контакт) Экспорт
- Если Не ЗначениеЗаполнено(Контакт) Тогда
+ Если Не ЗначениеЗаполнено(Контакт)
+ Или ТипЗнч(Контакт) = Тип("СправочникСсылка.СтроковыеКонтактыВзаимодействий") Тогда
Возврат Неопределено;
КонецЕсли;
diff --git a/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl b/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl
index 3f97c6f30..845d3e2a9 100644
--- a/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl
+++ b/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl
@@ -199,9 +199,7 @@
Если БылИзмененКонтакт Тогда
- Если Параметр.ДляФормыУточненияКонтактов Тогда
- //Возврат БылИзмененКонтакт;
- Иначе
+ Если НЕ Параметр.ДляФормыУточненияКонтактов Тогда
ВзаимодействияВызовСервера.ПолучитьПредставлениеИВсюКонтактнуюИнформациюКонтакта(
Контакт, Параметр.Представление, Параметр.Адрес, ТипКонтактнойИнформации);
КонецЕсли;
@@ -257,7 +255,7 @@
ТекущиеДанные.ПредставлениеКонтакта = Представление;
ВзаимодействияКлиентСервер.ПроверитьЗаполнениеКонтактов(Форма.Объект,Форма,"СообщениеSMS");
-
+
ИначеЕсли ТипЗнч(Форма.Объект.Ссылка)=Тип("ДокументСсылка.ЗапланированноеВзаимодействие") Тогда
ТекущиеДанные = Форма.Элементы.Участники.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
@@ -512,7 +510,9 @@
Если ДанныеСобытия.Href <> Неопределено Тогда
СтандартнаяОбработка = ЛОЖЬ;
- ЗапуститьПриложение(ДанныеСобытия.Href);
+
+ ОбщегоНазначенияКлиент.ПерейтиПоСсылке(ДанныеСобытия.Href);
+
КонецЕсли;
КонецПроцедуры
diff --git a/SSL/src/CommonModules/ВзаимодействияКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ВзаимодействияКлиентПереопределяемый/Module.bsl
index e371e89f4..b0a56aee4 100644
--- a/SSL/src/CommonModules/ВзаимодействияКлиентПереопределяемый/Module.bsl
+++ b/SSL/src/CommonModules/ВзаимодействияКлиентПереопределяемый/Module.bsl
@@ -11,7 +11,7 @@
// чтобы вместо основной формы при их создании открывалась другая форма.
// Например, это может быть форма помощника создания нового элемента справочника.
//
-//Параметры
+// Параметры:
// ТипКонтакта - Строка - Имя справочника контакта.
// ПараметрФормы - Структура - Параметр, который передается при открытии.
//
diff --git a/SSL/src/CommonModules/ВзаимодействияКлиентСервер/Module.bsl b/SSL/src/CommonModules/ВзаимодействияКлиентСервер/Module.bsl
index 95dbe9b90..796549724 100644
--- a/SSL/src/CommonModules/ВзаимодействияКлиентСервер/Module.bsl
+++ b/SSL/src/CommonModules/ВзаимодействияКлиентСервер/Module.bsl
@@ -332,8 +332,11 @@
//
Функция ПолучитьРасширениеФайла(Знач ИмяФайла) Экспорт
- Файл = Новый Файл(ИмяФайла);
- РасширениеФайла = ?(ПустаяСтрока(Файл.Расширение), Файл.Расширение, Прав(Файл.Расширение, СтрДлина(Файл.Расширение)-1));
+ РасширениеФайла = "";
+ МассивСтрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяФайла, ".", Истина);
+ Если МассивСтрок.Количество() > 1 Тогда
+ РасширениеФайла = МассивСтрок[МассивСтрок.Количество() - 1];
+ КонецЕсли;
Возврат РасширениеФайла;
diff --git a/SSL/src/CommonModules/ВзаимодействияПереопределяемый/Module.bsl b/SSL/src/CommonModules/ВзаимодействияПереопределяемый/Module.bsl
index 2413e3d8d..e0018a032 100644
--- a/SSL/src/CommonModules/ВзаимодействияПереопределяемый/Module.bsl
+++ b/SSL/src/CommonModules/ВзаимодействияПереопределяемый/Module.bsl
@@ -29,7 +29,7 @@
// Такая необходимость может возникнуть например при массовых рассылках. В этом случае имеет смысл
// хранить одни и те же присоединенные файлы в одном месте, а не тиражировать их на все письма рассылки.
//
-//Параметры
+// Параметры:
// Письмо - ДокументСсылка, ДокументОбъект - документ электронное письмо для которого необходимо получить вложения.
//
// Возвращаемое значение:
diff --git a/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовПереопределяемый/Module.bsl b/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовПереопределяемый/Module.bsl
index be58f6cf8..be97a558d 100644
--- a/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовПереопределяемый/Module.bsl
+++ b/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовПереопределяемый/Module.bsl
@@ -13,7 +13,7 @@
// подключенного к подсистеме "Групповое изменение объектов".
// Дополнительно в значении могут быть перечислены имена экспортных функций:
// "РеквизитыНеРедактируемыеВГрупповойОбработке",
-// "РеквизитыРедактируемыеВГрупповойОбработке"
+// "РеквизитыРедактируемыеВГрупповойОбработке".
// Каждое имя должно начинаться с новой строки.
// Если указано "*", значит в модуле менеджера определены обе функции.
//
diff --git a/SSL/src/CommonModules/ДанныеЕдиныхГосРеестров/Module.bsl b/SSL/src/CommonModules/ДанныеЕдиныхГосРеестров/Module.bsl
new file mode 100644
index 000000000..e1e68956b
--- /dev/null
+++ b/SSL/src/CommonModules/ДанныеЕдиныхГосРеестров/Module.bsl
@@ -0,0 +1,715 @@
+////////////////////////////////////////////////////////////////////////////////
+// Подсистема "Работа с контрагентами".
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#Область ПрограммныйИнтерфейс
+
+// Возвращаются реквизиты юридического лица по данным ЕГРЮЛ (наименование, адрес, коды и т.д.).
+//
+// Параметры:
+// ИНН - Строка - ИНН юридического лица, реквизиты которого надо получить.
+//
+// Возвращаемое значение:
+// Структура - реквизиты юридического лица.
+// Содержание структуры - см. функцию НовыеРеквизитыЮридическогоЛица.
+//
+Функция РеквизитыЮридическогоЛицаПоИНН(Знач ИНН) Экспорт
+
+ РеквизитыЮридическогоЛица = НовыеРеквизитыЮридическогоЛица();
+ РеквизитыЮридическогоЛица.ИНН = ИНН;
+
+ ОписаниеОшибки = "";
+ Прокси = ПроксиСервиса(ОписаниеОшибки);
+ Если Прокси <> Неопределено Тогда
+ ВходныеПараметры = Прокси.ФабрикаXDTO.Создать(
+ Прокси.ФабрикаXDTO.Тип(ПространствоИмен(), "getCorporationRequisitesByINN"));
+ ВходныеПараметры.INN = ИНН;
+ ВходныеПараметры.configurationName = Метаданные.Имя;
+ Попытка
+ Ответ = Прокси.getCorporationRequisitesByINN(ВходныеПараметры);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru='ИНН %1:'"), ИНН)
+ + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
+ КонецПопытки;
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
+ ОбработатьОшибкуСервиса(ОписаниеОшибки, РеквизитыЮридическогоЛица);
+ Возврат РеквизитыЮридическогоЛица;
+ КонецЕсли;
+
+ ОбъектXDTO = Ответ.РеквизитыЮрЛица;
+
+ ЗаполнитьНаименованияЮридическогоЛица(ОбъектXDTO, РеквизитыЮридическогоЛица);
+
+ РеквизитыЮридическогоЛица.РегистрационныйНомер = ОбъектXDTO.ОГРН;
+ РеквизитыЮридическогоЛица.КПП = ОбъектXDTO.КПП;
+
+ РеквизитыЮридическогоЛица.ДатаРегистрации = ОбъектXDTO.СвНаимЮЛ.ДатаОбрЮЛ;
+
+ ЗаполнитьКодОКВЭД(ОбъектXDTO, РеквизитыЮридическогоЛица);
+
+ ЗаполнитьРегистрациюВНалоговомОргане(ОбъектXDTO, РеквизитыЮридическогоЛица);
+
+ ЗаполнитьРеквизитыПенсионногоФонда(ОбъектXDTO, РеквизитыЮридическогоЛица);
+
+ ЗаполнитьРеквизитыФондаСоциальногоСтрахования(ОбъектXDTO, РеквизитыЮридическогоЛица);
+
+ ЗаполнитьЮридическийАдрес(ОбъектXDTO, РеквизитыЮридическогоЛица);
+
+ ЗаполнитьРуководителяИНомерТелефона(ОбъектXDTO, РеквизитыЮридическогоЛица);
+
+ Возврат РеквизитыЮридическогоЛица;
+
+КонецФункции
+
+// Возвращаются реквизиты индивидуального предпринимателя по данным ЕГРИП (ФИО, свидетельство о регистрации, коды и
+// т.д.).
+//
+// Параметры:
+// ИНН - Строка - ИНН индивидуального предпринимателя, реквизиты которого надо получить.
+//
+// Возвращаемое значение:
+// Структура - реквизиты индивидуального предпринимателя.
+// Содержание структуры - см. функцию НовыеРеквизитыПредпринимателя.
+//
+Функция РеквизитыПредпринимателяПоИНН(Знач ИНН) Экспорт
+
+ РеквизитыПредпринимателя = НовыеРеквизитыПредпринимателя();
+ РеквизитыПредпринимателя.ИНН = ИНН;
+
+ ОписаниеОшибки = "";
+ Прокси = ПроксиСервиса(ОписаниеОшибки);
+ Если Прокси <> Неопределено Тогда
+ ВходныеПараметры = Прокси.ФабрикаXDTO.Создать(
+ Прокси.ФабрикаXDTO.Тип(ПространствоИмен(), "getEntrepreneurRequisitesByINN"));
+ ВходныеПараметры.INN = ИНН;
+ ВходныеПараметры.configurationName = Метаданные.Имя;
+ Попытка
+ Ответ = Прокси.getEntrepreneurRequisitesByINN(ВходныеПараметры);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru='ИНН %1:'"), ИНН)
+ + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
+ КонецПопытки;
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
+ ОбработатьОшибкуСервиса(ОписаниеОшибки, РеквизитыПредпринимателя);
+ Возврат РеквизитыПредпринимателя;
+ КонецЕсли;
+
+ ОбъектXDTO = Ответ.РеквизитыИП;
+
+ РеквизитыПредпринимателя.Фамилия = ТРег(ОбъектXDTO.СвФЛ.ФИОРус.Фамилия);
+ РеквизитыПредпринимателя.Имя = ТРег(ОбъектXDTO.СвФЛ.ФИОРус.Имя);
+ РеквизитыПредпринимателя.Отчество = ТРег(ОбъектXDTO.СвФЛ.ФИОРус.Отчество);
+ РеквизитыПредпринимателя.Пол = Ответ.РеквизитыИП.СвФЛ.Пол;
+
+ ЗаполнитьКодОКВЭД(ОбъектXDTO, РеквизитыПредпринимателя);
+
+ ЗаполнитьРегистрациюВНалоговомОргане(ОбъектXDTO, РеквизитыПредпринимателя);
+
+ ЗаполнитьРеквизитыПенсионногоФонда(ОбъектXDTO, РеквизитыПредпринимателя);
+
+ ЗаполнитьСвидетельствоОРегистрации(ОбъектXDTO, РеквизитыПредпринимателя);
+
+ РеквизитыПредпринимателя.Наименование = РеквизитыПредпринимателя.Фамилия
+ + " " + РеквизитыПредпринимателя.Имя
+ + " " + РеквизитыПредпринимателя.Отчество;
+ РеквизитыПредпринимателя.НаименованиеПолное = Ответ.РеквизитыИП.НаимВидИП
+ + " " + РеквизитыПредпринимателя.Фамилия
+ + " " + РеквизитыПредпринимателя.Имя
+ + " " + РеквизитыПредпринимателя.Отчество;
+ РеквизитыПредпринимателя.НаименованиеСокращенное = ?(ОбъектXDTO.КодВидИП = "1", "ИП ", "")
+ + РеквизитыПредпринимателя.Наименование;
+ РеквизитыПредпринимателя.РегистрационныйНомер = ОбъектXDTO.ОГРНИП;
+
+ Если ОбъектXDTO.СвГражд <> Неопределено Тогда
+ РеквизитыПредпринимателя.КодСтраныГражданства = ОбъектXDTO.СвГражд.ОКСМ;
+ КонецЕсли;
+
+ Если ОбъектXDTO.СвРегИП <> Неопределено Тогда
+ РеквизитыПредпринимателя.ДатаРегистрации = ОбъектXDTO.СвРегИП.ДатаРег;
+ КонецЕсли;
+
+ Возврат РеквизитыПредпринимателя;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ОписанияРеквизитов
+
+Функция НовыеРеквизитыЮридическогоЛица()
+
+ РеквизитыЮридическогоЛица = Новый Структура;
+
+ // Заполняется на основе данных ЕГРЮЛ.
+
+ РеквизитыЮридическогоЛица.Вставить("ИНН"); // Строка, 10
+ РеквизитыЮридическогоЛица.Вставить("КПП"); // Строка, 9
+ РеквизитыЮридическогоЛица.Вставить("Наименование"); // Строка, 0
+ РеквизитыЮридическогоЛица.Вставить("НаименованиеПолное"); // Строка, 0
+ РеквизитыЮридическогоЛица.Вставить("НаименованиеСокращенное"); // Строка, 0
+ РеквизитыЮридическогоЛица.Вставить("РегистрационныйНомер"); // Строка, 13 - ОГРН
+ // Следующие свойства могут содержать Неопределено в случае отсутствия в сервисе данных.
+ РеквизитыЮридическогоЛица.Вставить("ПравоваяФорма"); // Строка, 0
+ РеквизитыЮридическогоЛица.Вставить("ЮридическийАдрес"); // Структура из НоваяКонтактнаяИнформация().
+ РеквизитыЮридическогоЛица.Вставить("Телефон"); // Структура из НоваяКонтактнаяИнформация().
+ РеквизитыЮридическогоЛица.Вставить("Руководитель"); // Структура из НовоеКонтактноеЛицо().
+ РеквизитыЮридическогоЛица.Вставить("РегистрацияВНалоговомОргане"); // Структура из НоваяРегистрацияВНалоговомОргане().
+ РеквизитыЮридическогоЛица.Вставить("ДатаРегистрации"); // Дата
+ РеквизитыЮридическогоЛица.Вставить("РегистрацияВПенсионномФонде"); // Структура из НоваяРегистрацияВПенсионномФонде().
+ РеквизитыЮридическогоЛица.Вставить("РегистрацияВФСС"); // Структура из НоваяРегистрацияВФСС().
+ РеквизитыЮридическогоЛица.Вставить("КодОКВЭД"); // Строка, 8
+
+ // Служебный реквизит
+ РеквизитыЮридическогоЛица.Вставить("ОписаниеОшибки"); // Строка, 0
+
+ Возврат РеквизитыЮридическогоЛица;
+
+КонецФункции
+
+Функция НовыеРеквизитыПредпринимателя()
+
+ РеквизитыПредпринимателя = Новый Структура;
+
+ // Заполняется на основе данных ЕГРИП.
+
+ РеквизитыПредпринимателя.Вставить("ИНН"); // Строка, 12
+ РеквизитыПредпринимателя.Вставить("Наименование"); // Строка, 0
+ РеквизитыПредпринимателя.Вставить("НаименованиеПолное"); // Строка, 0
+ РеквизитыПредпринимателя.Вставить("НаименованиеСокращенное"); // Строка, 0
+ РеквизитыПредпринимателя.Вставить("Фамилия"); // Строка, 0
+ РеквизитыПредпринимателя.Вставить("Имя"); // Строка, 0
+ РеквизитыПредпринимателя.Вставить("Отчество"); // Строка, 0
+ РеквизитыПредпринимателя.Вставить("РегистрационныйНомер"); // Строка, 13 - ОГРН
+ // Следующие свойства могут содержать Неопределено в случае отсутствия в сервисе данных.
+ РеквизитыПредпринимателя.Вставить("Пол"); // Строка: "1" - Мужской, "2" - Женский.
+ РеквизитыПредпринимателя.Вставить("КодСтраныГражданства"); // Строка, 3
+ РеквизитыПредпринимателя.Вставить("РегистрацияВНалоговомОргане"); // Структура из НоваяРегистрацияВНалоговомОргане().
+ РеквизитыПредпринимателя.Вставить("РегистрацияВПенсионномФонде"); // Структура из НоваяРегистрацияВПенсионномФонде().
+ РеквизитыПредпринимателя.Вставить("РегистрацияВФСС"); // Структура из НоваяРегистрацияВФСС().
+ РеквизитыПредпринимателя.Вставить("ДатаРегистрации"); // Дата
+ РеквизитыПредпринимателя.Вставить("КодОКВЭД"); // Строка, 8
+ РеквизитыПредпринимателя.Вставить("СвидетельствоОРегистрации"); // Структура из НовоеСвидетельствоОРегистрации().
+
+ // Служебный реквизит
+ РеквизитыПредпринимателя.Вставить("ОписаниеОшибки"); // Строка, 0
+
+ Возврат РеквизитыПредпринимателя;
+
+КонецФункции
+
+Функция НоваяКонтактнаяИнформация()
+
+ Результат = Новый Структура;
+ Результат.Вставить("КонтактнаяИнформация"); // Строка, 0 - XML
+ Результат.Вставить("Представление"); // Строка, 0
+ Результат.Вставить("Комментарий"); // Строка, 0
+ Возврат Результат;
+
+КонецФункции
+
+Функция НовоеКонтактноеЛицо()
+
+ Результат = Новый Структура;
+ Результат.Вставить("Должность"); // Строка, 0
+ Результат.Вставить("Фамилия"); // Строка, 0
+ Результат.Вставить("Имя"); // Строка, 0
+ Результат.Вставить("Отчество"); // Строка, 0
+ Результат.Вставить("ИНН"); // Строка, 12
+ Возврат Результат;
+
+КонецФункции
+
+Функция НоваяРегистрацияВНалоговомОргане()
+
+ Результат = Новый Структура;
+ Результат.Вставить("Код"); // Строка, 4
+ Результат.Вставить("Наименование"); // Строка, 0
+ Результат.Вставить("ОКТМО"); // Строка, 11
+ Результат.Вставить("ОКАТО"); // Строка, 11
+ Возврат Результат;
+
+КонецФункции
+
+Функция НоваяРегистрацияВПенсионномФонде()
+
+ Результат = Новый Структура;
+ Результат.Вставить("РегистрационныйНомерПФР"); // Строка, 14
+ Результат.Вставить("КодОрганаПФР"); // Строка, 7
+ Результат.Вставить("НаименованиеОрганаПФР"); // Строка, 0
+ Возврат Результат;
+
+КонецФункции
+
+Функция НоваяРегистрацияВФСС()
+
+ Результат = Новый Структура;
+ Результат.Вставить("РегистрационныйНомерФСС"); // Строка, 15
+ Результат.Вставить("КодПодчиненности"); // Строка, 5
+ Результат.Вставить("КодОрганаФСС"); // Строка, 4
+ Результат.Вставить("НаименованиеОрганаФСС"); // Строка, 0
+ Возврат Результат;
+
+КонецФункции
+
+Функция НовоеСвидетельствоОРегистрации()
+
+ Результат = Новый Структура;
+ Результат.Вставить("Серия"); // Строка, 0
+ Результат.Вставить("Номер"); // Строка, 0
+ Результат.Вставить("Дата"); // Дата
+ Возврат Результат;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Процедура ЗаполнитьНаименованияЮридическогоЛица(ОбъектXDTO, Реквизиты)
+
+ ПравовыеФормы = Новый Массив;
+ ПравовыеФормы.Добавить("Общество с ограниченной ответственностью");
+ ПравовыеФормы.Добавить("Закрытое акционерное общество");
+ ПравовыеФормы.Добавить("Открытое акционерное общество");
+ ПравовыеФормы.Добавить("Публичное акционерное общество");
+ ПравовыеФормы.Добавить("Акционерное общество");
+ Если ОбъектXDTO.СвНаимЮЛ.ОПФ <> Неопределено Тогда
+ ПравоваяФормаОбъекта = Строка(ОбъектXDTO.СвНаимЮЛ.ОПФ.ПолнНаимОПФ);
+ Реквизиты.ПравоваяФорма = ПравоваяФормаОбъекта;
+ Если ПравовыеФормы.Найти(ПравоваяФормаОбъекта) = Неопределено Тогда
+ ПравовыеФормы.Добавить(ПравоваяФормаОбъекта);
+ КонецЕсли;
+ КонецЕсли;
+
+ Реквизиты.НаименованиеПолное = ОбъектXDTO.СвНаимЮЛ.НаимЮЛПолн;
+ Для каждого ПравоваяФорма Из ПравовыеФормы Цикл
+ Если ВРег(ПравоваяФорма) = ВРег(Лев(Реквизиты.НаименованиеПолное, СтрДлина(ПравоваяФорма))) Тогда
+ Реквизиты.НаименованиеПолное = ПравоваяФорма + Сред(Реквизиты.НаименованиеПолное, СтрДлина(ПравоваяФорма) + 1);
+ Прервать;
+ КонецЕсли;
+ КонецЦикла;
+
+ Реквизиты.НаименованиеСокращенное = ОбъектXDTO.СвНаимЮЛ.НаимЮЛСокр;
+ Если НЕ ЗначениеЗаполнено(Реквизиты.НаименованиеСокращенное)
+ ИЛИ Реквизиты.НаименованиеСокращенное = "-" Тогда
+ Реквизиты.НаименованиеСокращенное = Реквизиты.НаименованиеПолное;
+ КонецЕсли;
+
+ Реквизиты.Наименование = Реквизиты.НаименованиеСокращенное;
+ Поз = Найти(Реквизиты.Наименование, """");
+ Если Поз > 0 И Поз <= 10 Тогда
+ Реквизиты.Наименование = СокрП(Сред(Реквизиты.Наименование, Поз)) + " " + СокрП(Лев(Реквизиты.Наименование, Поз-1));
+ Реквизиты.Наименование = СтрЗаменить(Реквизиты.Наименование, """", "");
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ЗаполнитьОбъектXDTOКонтактнойИнформации(Фабрика, Объект, ИсходныйОбъект)
+
+ Для каждого СвойствоИсходногоОбъекта Из ИсходныйОбъект.Свойства() Цикл
+
+ СвойствоОбъекта = Объект.Свойства().Получить(СвойствоИсходногоОбъекта.Имя);
+ Если СвойствоОбъекта <> Неопределено Тогда
+
+ ЗначениеСвойства = ИсходныйОбъект[СвойствоИсходногоОбъекта.Имя];
+ Если ЗначениеСвойства = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Если ТипЗнч(ЗначениеСвойства) = Тип("ОбъектXDTO") Тогда
+
+ Объект[СвойствоОбъекта.Имя] = Фабрика.Создать(СвойствоОбъекта.Тип);
+ ЗаполнитьОбъектXDTOКонтактнойИнформации(Фабрика, Объект[СвойствоОбъекта.Имя], ИсходныйОбъект[СвойствоИсходногоОбъекта.Имя]);
+
+ ИначеЕсли ТипЗнч(ЗначениеСвойства) = Тип("СписокXDTO") Тогда
+
+ Для Каждого ИсходныйЭлемент Из ЗначениеСвойства Цикл
+
+ Элемент = Фабрика.Создать(СвойствоОбъекта.Тип);
+ ЗаполнитьОбъектXDTOКонтактнойИнформации(Фабрика, Элемент, ИсходныйЭлемент);
+ Объект[СвойствоОбъекта.Имя].Добавить(Элемент);
+
+ КонецЦикла;
+
+ ИначеЕсли ТипЗнч(ЗначениеСвойства) = Тип("Строка") Тогда
+
+ МассивСлов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивСлов(ЗначениеСвойства, " ");
+ МаксИндексСлова = ?(МассивСлов.Количество() = 1, 0, МассивСлов.Количество() - 2);
+ Для ИндексСлова = 0 По МаксИндексСлова Цикл
+ МассивСлов[ИндексСлова] = ТРег(МассивСлов[ИндексСлова]);
+ КонецЦикла;
+ Объект[СвойствоОбъекта.Имя] = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(МассивСлов, " ");
+
+ Иначе
+
+ Объект[СвойствоОбъекта.Имя] = ЗначениеСвойства;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ЗаполнитьРегистрациюВНалоговомОргане(ОбъектXDTO, Реквизиты)
+
+ Если ОбъектXDTO.СвУчетНО <> Неопределено
+ И ОбъектXDTO.СвУчетНО.СвНО <> Неопределено Тогда
+
+ Реквизиты.РегистрацияВНалоговомОргане = НоваяРегистрацияВНалоговомОргане();
+
+ Реквизиты.РегистрацияВНалоговомОргане.Код = ОбъектXDTO.СвУчетНО.СвНО.КодНО;
+ Реквизиты.РегистрацияВНалоговомОргане.Наименование = ОбъектXDTO.СвУчетНО.СвНО.НаимНО;
+
+ Если ОбъектXDTO.Свойства().Получить("СвАдрес") <> Неопределено // Адрес есть только у юридических лиц
+ И ОбъектXDTO.СвАдрес <> Неопределено
+ И ОбъектXDTO.СвАдрес.Адрес <> Неопределено Тогда
+
+ Адрес = ОбъектXDTO.СвАдрес.Адрес;
+ Реквизиты.РегистрацияВНалоговомОргане.ОКТМО = Адрес.Состав.ОКТМО;
+ Реквизиты.РегистрацияВНалоговомОргане.ОКАТО = Адрес.Состав.ОКАТО;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ЗаполнитьКодОКВЭД(ОбъектXDTO, Реквизиты)
+
+ Если ОбъектXDTO.СвОКВЭД <> Неопределено Тогда
+
+ СписокОКВЭД = ОбъектXDTO.СвОКВЭД;
+ КодОКВЭД = "";
+ ДатаОКВЭД = '00010101';
+ Для Каждого ЭлементОКВЭД Из СписокОКВЭД Цикл
+ Если ЭлементОКВЭД.ДатаНачДейств > ДатаОКВЭД
+ И ЭлементОКВЭД.ПрОснДоп = "1" Тогда
+ ДатаОКВЭД = ЭлементОКВЭД.ДатаНачДейств;
+ КодОКВЭД = ЭлементОКВЭД.КодОКВЭД;
+ КонецЕсли;
+ КонецЦикла;
+ Реквизиты.КодОКВЭД = КодОКВЭД;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ЗаполнитьРеквизитыПенсионногоФонда(ОбъектXDTO, Реквизиты)
+
+ Если ОбъектXDTO.СвРегПФ <> Неопределено Тогда
+
+ РегистрацияВПФР = НоваяРегистрацияВПенсионномФонде();
+
+ РегистрационныйНомерПФР = ОбъектXDTO.СвРегПФ.РегНомПФ;
+ РегистрационныйНомерПФР = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1-%2-%3'"),
+ Лев(РегистрационныйНомерПФР, 3), Сред(РегистрационныйНомерПФР,4, 3), Прав(РегистрационныйНомерПФР, 6));
+ РегистрацияВПФР.РегистрационныйНомерПФР = РегистрационныйНомерПФР;
+ Если ОбъектXDTO.СвРегПФ.СвОргПФ <> Неопределено Тогда
+ КодОрганаПФР = ОбъектXDTO.СвРегПФ.СвОргПФ.КодПФ;
+ КодОрганаПФР = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1-%2'"),
+ Лев(КодОрганаПФР, 3), Прав(КодОрганаПФР, 3));
+ РегистрацияВПФР.КодОрганаПФР = КодОрганаПФР;
+ РегистрацияВПФР.НаименованиеОрганаПФР = ОбъектXDTO.СвРегПФ.СвОргПФ.НаимПФ;
+ КонецЕсли;
+
+ Реквизиты.РегистрацияВПенсионномФонде = РегистрацияВПФР;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ЗаполнитьРеквизитыФондаСоциальногоСтрахования(ОбъектXDTO, Реквизиты)
+
+ Если ОбъектXDTO.СвРегФСС <> Неопределено Тогда
+
+ РегистрацияВФСС = НоваяРегистрацияВФСС();
+
+ Если СтрДлина(ОбъектXDTO.СвРегФСС.РегНомФСС) <= 10 Тогда
+ РегистрацияВФСС.РегистрационныйНомерФСС = СокрЛП(ОбъектXDTO.СвРегФСС.РегНомФСС);
+ РегистрацияВФСС.КодПодчиненности = "";
+ Иначе
+ РегистрацияВФСС.РегистрационныйНомерФСС = СокрЛП(Лев(ОбъектXDTO.СвРегФСС.РегНомФСС, 10));
+ РегистрацияВФСС.КодПодчиненности = СокрЛП(Сред(ОбъектXDTO.СвРегФСС.РегНомФСС, 11));
+ Если СтрДлина(РегистрацияВФСС.КодПодчиненности) <> 5 Тогда
+ РегистрацияВФСС.КодПодчиненности = "";
+ КонецЕсли;
+ КонецЕсли;
+
+ Если ОбъектXDTO.СвРегФСС.СвОргФСС <> Неопределено Тогда
+ РегистрацияВФСС.КодОрганаФСС = ОбъектXDTO.СвРегФСС.СвОргФСС.КодФСС;
+ РегистрацияВФСС.НаименованиеОрганаФСС = ОбъектXDTO.СвРегФСС.СвОргФСС.НаимФСС;
+ КонецЕсли;
+
+ Реквизиты.РегистрацияВФСС = РегистрацияВФСС;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ЗаполнитьСвидетельствоОРегистрации(ОбъектXDTO, Реквизиты)
+
+ Если ОбъектXDTO.СвЗапДейств <> Неопределено Тогда
+
+ Свидетельство = НовоеСвидетельствоОРегистрации();
+ Свидетельство.Дата = '00010101';
+ Для Каждого Запись Из ОбъектXDTO.СвЗапДейств Цикл
+ Для Каждого ЗаписьСвидетельства Из Запись.СвСвид Цикл
+ Если ЗначениеЗаполнено(ЗаписьСвидетельства.ДатаЗап) Тогда
+ ДатаЗап = ЗаписьСвидетельства.ДатаЗап;
+ ИначеЕсли ЗначениеЗаполнено(Запись.ДатаЗап) Тогда
+ ДатаЗап = Запись.ДатаЗап;
+ Иначе
+ ДатаЗап = '00010101';
+ КонецЕсли;
+ Если ДатаЗап > Свидетельство.Дата Тогда
+ Свидетельство.Дата = ДатаЗап;
+ Свидетельство.Серия = ЗаписьСвидетельства.Серия;
+ Свидетельство.Номер = Прав("000000000" + ЗаписьСвидетельства.Номер, 9);
+ КонецЕсли;
+ КонецЦикла;
+ КонецЦикла;
+
+ Если Свидетельство.Дата > '00010101' Тогда
+ Реквизиты.СвидетельствоОРегистрации = Свидетельство;
+ КонецЕсли
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ЗаполнитьЮридическийАдрес(ОбъектXDTO, Реквизиты)
+
+ ПространствоИменКИ = УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.ПространствоИмен();
+
+ Если ОбъектXDTO.СвАдрес <> Неопределено
+ И ОбъектXDTO.СвАдрес.Адрес <> Неопределено Тогда
+
+ АдресРФ_КИ = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИменКИ, "АдресРФ"));
+ ЗаполнитьОбъектXDTOКонтактнойИнформации(ФабрикаXDTO, АдресРФ_КИ, ОбъектXDTO.СвАдрес.Адрес.Состав);
+
+ КИ = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИменКИ, "КонтактнаяИнформация"));
+ КИ.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИменКИ, "Адрес"));
+ КИ.Состав.Страна = ОбъектXDTO.СвАдрес.Адрес.Страна;
+ КИ.Состав.Состав = АдресРФ_КИ;
+ КИ.Представление = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформации(КИ,
+ Новый Структура("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес));
+
+ СтруктураКИ = НоваяКонтактнаяИнформация();
+ СтруктураКИ.КонтактнаяИнформация = СериализацияОбъектаXDTO(КИ);
+ СтруктураКИ.Представление = КИ.Представление;
+
+ Реквизиты.ЮридическийАдрес = СтруктураКИ;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ЗаполнитьРуководителяИНомерТелефона(ОбъектXDTO, Реквизиты)
+
+ ПространствоИменКИ = УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.ПространствоИмен();
+
+ Если ОбъектXDTO.СвУправлДеят <> Неопределено
+ И ОбъектXDTO.СвУправлДеят.СведДолжнФЛ <> Неопределено Тогда
+
+ Для каждого СведенияОДолжности Из ОбъектXDTO.СвУправлДеят.СведДолжнФЛ Цикл
+ Если Найти(СведенияОДолжности.НаимВидДолжн, "Руководитель") > 0
+ И СведенияОДолжности.ФИО <> Неопределено Тогда
+
+ // Руководитель
+ СтруктураКИ = НовоеКонтактноеЛицо();
+ СтруктураКИ.Фамилия = ТРег(СведенияОДолжности.ФИО.Фамилия);
+ СтруктураКИ.Имя = ТРег(СведенияОДолжности.ФИО.Имя);
+ СтруктураКИ.Отчество = ТРег(СведенияОДолжности.ФИО.Отчество);
+ СтруктураКИ.Должность = ПредложениеСЗаглавнойБуквы(СведенияОДолжности.НаимДолжн);
+ СтруктураКИ.ИНН = СведенияОДолжности.ИННФЛ;
+
+ Реквизиты.Руководитель = СтруктураКИ;
+
+ // Номер телефона
+ Если ЗначениеЗаполнено(СведенияОДолжности.НомТел) Тогда
+ КИ = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИменКИ, "КонтактнаяИнформация"));
+ КИ.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИменКИ, "НомерТелефона"));
+ Если Лев(СведенияОДолжности.НомТел, 1) = "(" Тогда
+ КонецКодаГорода = Найти(СведенияОДолжности.НомТел, ")");
+ КИ.Состав.КодГорода = Сред(СведенияОДолжности.НомТел, 2, КонецКодаГорода - 2);
+ КИ.Состав.Номер = Сред(СведенияОДолжности.НомТел, КонецКодаГорода + 1);
+ Иначе
+ КИ.Состав.Номер = СведенияОДолжности.НомТел;
+ КонецЕсли;
+ КИ.Представление = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформации(КИ,
+ Новый Структура("Тип", Перечисления.ТипыКонтактнойИнформации.Телефон));
+ СтруктураКИ = НоваяКонтактнаяИнформация();
+ СтруктураКИ.КонтактнаяИнформация = СериализацияОбъектаXDTO(КИ);
+ СтруктураКИ.Представление = КИ.Представление;
+
+ Реквизиты.Телефон = СтруктураКИ;
+
+ КонецЕсли;
+ Прервать;
+
+ КонецЕсли;
+ КонецЦикла;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Функция ПредложениеСЗаглавнойБуквы(Строка)
+
+ Если ЗначениеЗаполнено(Строка) Тогда
+ Возврат ВРег(Лев(Строка, 1)) + НРег(Сред(Строка, 2))
+ Иначе
+ Возврат Строка;
+ КонецЕсли;
+
+КонецФункции
+
+Функция ПроксиСервиса(ОписаниеОшибки)
+
+ Прокси = Неопределено;
+ ПараметрыАутентификации = ПараметрыАутентификацииВСервисе();
+
+ Если ПараметрыАутентификации = Неопределено Тогда
+
+ // Служебный текст. Должен быть обработан на клиенте.
+ ОписаниеОшибки = "НеУказаныПараметрыАутентификации";
+
+ Иначе
+
+ Попытка
+ Прокси = ОбщегоНазначения.WSПрокси(
+ АдресСервиса(), // АдресWSDL
+ ПространствоИмен(), // URIПространстваИмен
+ "RequisitesWebServiceEndpointImplService", // ИмяСервиса
+ "RequisitesWebServiceEndpointImplPort", // ИмяТочкиПодключения
+ ПараметрыАутентификации.login, // ИмяПользователя
+ ПараметрыАутентификации.password, // Пароль
+ 30); // Таймаут
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
+ КонецПопытки;
+
+ КонецЕсли;
+
+ Возврат Прокси;
+
+КонецФункции
+
+Функция ПараметрыАутентификацииВСервисе()
+
+ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
+ Возврат Новый Структура("login,password",
+ "fresh", "fresh");
+
+ Иначе
+ ДанныеАутентификации = СтандартныеПодсистемыСервер.ПараметрыАутентификацииНаСайте();
+ Если ДанныеАутентификации <> Неопределено Тогда
+ Возврат Новый Структура("login,password",
+ ДанныеАутентификации.Логин,
+ ДанныеАутентификации.Пароль);
+ Иначе
+ Возврат Неопределено;
+ КонецЕсли;
+
+ КонецЕсли;
+
+КонецФункции
+
+Функция АдресСервиса()
+
+ Возврат "https://api.orgregister.1c.ru/orgregister/v1?wsdl";
+
+КонецФункции
+
+Функция ПространствоИмен()
+
+ Возврат "http://ws.orgregister.company1c.com/";
+
+КонецФункции
+
+Процедура ОбработатьОшибкуСервиса(ОписаниеОшибки, СтруктураРеквизитов)
+
+ КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации.
+
+ Если ОписаниеОшибки = "НеУказаныПараметрыАутентификации" Тогда
+ ТекстОшибки = "НеУказаныПараметрыАутентификации"; // Служебный текст. Должен быть обработан на клиенте.
+ ОписаниеОшибки = НСтр("ru='Не указаны логин и пароль для доступа к Интернет-поддержке'");
+ ТекстСобытия = НСтр("ru='Ошибка доступа'", КодОсновногоЯзыка);
+
+ ИначеЕсли Найти(ОписаниеОшибки, """status"":401") > 0 Тогда
+ ТекстОшибки = НСтр("ru='Неверно указаны логин и пароль для доступа к Интернет-поддержке'");
+ ТекстСобытия = НСтр("ru='Ошибка доступа'", КодОсновногоЯзыка);
+
+ ИначеЕсли Найти(ОписаниеОшибки, "SERVER-1:") > 0 Тогда
+ ТекстОшибки = НСтр("ru='Не указан ИНН юридического лица'");
+ ТекстСобытия = НСтр("ru='Ошибка получения данных'", КодОсновногоЯзыка);
+
+ ИначеЕсли Найти(ОписаниеОшибки, "SERVER-2:") > 0 Тогда
+ ТекстОшибки = НСтр("ru='ИНН юридического лица должен состоять из 10 цифр'");
+ ТекстСобытия = НСтр("ru='Ошибка получения данных'", КодОсновногоЯзыка);
+
+ ИначеЕсли Найти(ОписаниеОшибки, "SERVER-3:") > 0 Тогда
+ ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru='Не удалось найти данные для заполнения реквизитов по ИНН %1'"),
+ СтруктураРеквизитов.ИНН);
+ ТекстСобытия = НСтр("ru='Ошибка получения данных'", КодОсновногоЯзыка);
+
+ ИначеЕсли Найти(ОписаниеОшибки, "SERVER-4:") > 0 Тогда
+ ТекстОшибки = НСтр("ru='Не указан ИНН предпринимателя'");
+ ТекстСобытия = НСтр("ru='Ошибка получения данных'", КодОсновногоЯзыка);
+
+ ИначеЕсли Найти(ОписаниеОшибки, "SERVER-5:") > 0 Тогда
+ ТекстОшибки = НСтр("ru='ИНН предпринимателя должен состоять из 12 цифр'");
+ ТекстСобытия = НСтр("ru='Ошибка получения данных'", КодОсновногоЯзыка);
+
+ ИначеЕсли Найти(ОписаниеОшибки, "SERVER-6:") > 0 Тогда
+ ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru='Не удалось найти данные для заполнения реквизитов по ИНН %1'"),
+ СтруктураРеквизитов.ИНН);
+ ТекстСобытия = НСтр("ru='Ошибка получения данных'", КодОсновногоЯзыка);
+
+ ИначеЕсли Найти(ОписаниеОшибки, "SERVER-7:") > 0 Тогда
+ ТекстОшибки = НСтр("ru='Превышен лимит количества вызовов сервиса за один день'");
+ ТекстСобытия = НСтр("ru='Ошибка доступа'", КодОсновногоЯзыка);
+
+ ИначеЕсли Найти(ОписаниеОшибки, "SERVER-8:") > 0 Тогда
+ ТекстОшибки = НСтр("ru='Отсутствует действующий договор ИТС'");
+ ТекстСобытия = НСтр("ru='Ошибка доступа'", КодОсновногоЯзыка);
+
+ Иначе
+ ТекстОшибки = НСтр("ru='Ошибка при работе с сервисом (подробнее см. Журнал регистрации)'");
+ ТекстСобытия = НСтр("ru='Ошибка при работе с сервисом'", КодОсновногоЯзыка);
+ КонецЕсли;
+
+ СтруктураРеквизитов.ОписаниеОшибки = ТекстОшибки;
+
+ ИмяСобытия = НСтр("ru = 'Сервис данных единых гос_реестров.'", КодОсновногоЯзыка) + " " + ТекстСобытия;
+ ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки);
+
+КонецПроцедуры
+
+Функция СериализацияОбъектаXDTO(ОбъектXDTO) Экспорт
+
+ Запись = Новый ЗаписьXML;
+ Запись.УстановитьСтроку(Новый ПараметрыЗаписиXML(, , Ложь, Ложь, ""));
+ Если ОбъектXDTO <> Неопределено Тогда
+ ФабрикаXDTO.ЗаписатьXML(Запись, ОбъектXDTO);
+ КонецЕсли;
+
+ Возврат СтрЗаменить(Запись.Закрыть(), Символы.ПС, "
");
+
+КонецФункции
+
+#КонецОбласти
diff --git a/SSL/src/CommonModules/ДанныеЕдиныхГосРеестров/ДанныеЕдиныхГосРеестров.mdo b/SSL/src/CommonModules/ДанныеЕдиныхГосРеестров/ДанныеЕдиныхГосРеестров.mdo
new file mode 100644
index 000000000..659750a26
--- /dev/null
+++ b/SSL/src/CommonModules/ДанныеЕдиныхГосРеестров/ДанныеЕдиныхГосРеестров.mdo
@@ -0,0 +1,11 @@
+
+
+ ДанныеЕдиныхГосРеестров
+
+ ru
+ Данные ЕГРЮЛ / ЕГРИП
+
+ true
+ true
+ true
+
diff --git a/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl b/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl
index 8759796e5..1920f5897 100644
--- a/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl
+++ b/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl
@@ -6,7 +6,7 @@
#Область ПрограммныйИнтерфейс
// Проверяет наличие запрета изменения элемента данных.
-// Для работы функции требуется настройка процедуры ДанныеДляПроверкиЗапретаИзменения
+// Для работы функции требуется настройка процедуры ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения
// модуля ДатыЗапретаИзмененияПереопределяемый.
//
// Если Данные - полное имя объекта метаданных, тогда данные для проверки будут получены
diff --git a/SSL/src/CommonModules/ДатыЗапретаИзмененияПереопределяемый/Module.bsl b/SSL/src/CommonModules/ДатыЗапретаИзмененияПереопределяемый/Module.bsl
index 0e59b226c..e1286b711 100644
--- a/SSL/src/CommonModules/ДатыЗапретаИзмененияПереопределяемый/Module.bsl
+++ b/SSL/src/CommonModules/ДатыЗапретаИзмененияПереопределяемый/Module.bsl
@@ -56,6 +56,8 @@
//
// ПроверкаЗапретаИзменения - Булево - если установить Ложь проверка запрета
// изменения выполняться не будет.
+// - Строка - два значения "НоваяВерсия" и "СтараяВерсия", обозначающие,
+// что проверку нужно выполнять только для указанной версии объекта.
//
// УзелПроверкиЗапретаЗагрузки - Неопределено, ПланыОбменаСсылка -
// когда Неопределено проверка запрета загрузки не выполняется.
diff --git a/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl b/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl
index ce8a9441c..08e271375 100644
--- a/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl
@@ -416,6 +416,7 @@
ДополнительныеПараметры.Свойство("УзелПланаОбмена", УзелПланаОбмена);
ДополнительныеПараметры.Свойство("НайденныеЗапреты", НайденныеЗапреты);
КонецЕсли;
+ СтандартнаяОбработка = СтандартнаяОбработка <> Ложь;
Если ПропуститьПроверкуДатЗапрета(
Источник,
@@ -428,10 +429,10 @@
И НЕ Удаление Тогда
Если ИзменениеИлиЗагрузкаЗапрещена(
- Источник,
- Источник.Ссылка,
+ ?(СтандартнаяОбработка <> "СтараяВерсия", Источник, Источник.Метаданные().ПолноеИмя()),
+ ?(СтандартнаяОбработка <> "НоваяВерсия", Источник.Ссылка, Неопределено),
СообщитьОЗапрете,
- СтандартнаяОбработка,
+ СтандартнаяОбработка <> Ложь,
УзелПланаОбмена,
НайденныеЗапреты) Тогда
@@ -441,10 +442,10 @@
ИначеЕсли ИсточникРегистр И Замещение Тогда
Если ИзменениеИлиЗагрузкаЗапрещена(
- Источник,
- Источник.Отбор,
+ ?(СтандартнаяОбработка <> "СтараяВерсия", Источник, Источник.Метаданные().ПолноеИмя()),
+ ?(СтандартнаяОбработка <> "НоваяВерсия", Источник.Отбор, Неопределено),
СообщитьОЗапрете,
- СтандартнаяОбработка,
+ СтандартнаяОбработка <> Ложь,
УзелПланаОбмена,
НайденныеЗапреты) Тогда
@@ -453,11 +454,12 @@
ИначеЕсли ТипЗнч(Источник) = Тип("УдалениеОбъекта") Тогда
- Если ИзменениеИлиЗагрузкаЗапрещена(
- Источник.Ссылка.Метаданные.ПолноеИмя(),
+ Если СтандартнаяОбработка <> "НоваяВерсия"
+ И ИзменениеИлиЗагрузкаЗапрещена(
+ Источник.Метаданные().ПолноеИмя(),
Источник.Ссылка,
СообщитьОЗапрете,
- СтандартнаяОбработка,
+ СтандартнаяОбработка <> Ложь,
УзелПланаОбмена,
НайденныеЗапреты) Тогда
@@ -468,11 +470,12 @@
// НЕ ИсточникРегистр И Источник.ЭтоНовый()
// ИЛИ ИсточникРегистр И НЕ Замещение
// ИЛИ НЕ ИсточникРегистр И Удаление
- Если ИзменениеИлиЗагрузкаЗапрещена(
+ Если СтандартнаяОбработка <> "СтараяВерсия"
+ И ИзменениеИлиЗагрузкаЗапрещена(
Источник,
,
СообщитьОЗапрете,
- СтандартнаяОбработка,
+ СтандартнаяОбработка <> Ложь,
УзелПланаОбмена,
НайденныеЗапреты) Тогда
@@ -482,7 +485,7 @@
Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда
ДополнительныеПараметры.Вставить("СообщитьОЗапрете", СообщитьОЗапрете);
- ДополнительныеПараметры.Вставить("СтандартнаяОбработка", СтандартнаяОбработка);
+ ДополнительныеПараметры.Вставить("СтандартнаяОбработка", СтандартнаяОбработка <> Ложь);
ДополнительныеПараметры.Вставить("УзелПланаОбмена", УзелПланаОбмена);
ДополнительныеПараметры.Вставить("НайденныеЗапреты", НайденныеЗапреты);
КонецЕсли;
@@ -518,8 +521,16 @@
ДатыЗапретаИзмененияПереопределяемый.ПередПроверкойЗапретаИзменения(
Источник, СтандартнаяОбработка, УзелПланаОбмена, СообщитьОЗапрете);
- Возврат НЕ СтандартнаяОбработка // НЕ проверять запрет изменения.
- И УзелПланаОбмена = Неопределено; // НЕ проверять запрет загрузки.
+ Если ТипЗнч(СтандартнаяОбработка) <> Тип("Булево")
+ И СтандартнаяОбработка <> "НоваяВерсия"
+ И СтандартнаяОбработка <> "СтараяВерсия" Тогда
+ ВызватьИсключение
+ НСтр("ru = 'Некорректное значение параметра ПроверкаЗапретаИзменения указано в процедуре
+ |ПередПроверкойЗапретаИзменения общего модуля ДатыЗапретаИзмененияПереопределяемый.'");
+ КонецЕсли;
+
+ Возврат СтандартнаяОбработка = Ложь // НЕ проверять запрет изменения.
+ И УзелПланаОбмена = Неопределено; // НЕ проверять запрет загрузки.
КонецФункции
@@ -804,6 +815,11 @@
ПоляРегистра = ПолучитьПоляРегистра(ИсточникиДанных, Отбор.Таблица);
ЗначенияПолей = Данные.Выгрузить(, ПоляРегистра);
ЗначенияПолей.Свернуть(ПоляРегистра);
+ Если ЗначенияПолей.Колонки.Найти("Регистратор") <> Неопределено
+ И Данные.Отбор.Найти("Регистратор") <> Неопределено
+ И ОбщегоНазначения.ЭтоРегистрСведений(ОбъектМетаданных) Тогда
+ ЗначенияПолей.ЗаполнитьЗначения(Данные.Отбор.Регистратор.Значение, "Регистратор");
+ КонецЕсли;
ИдентификаторДанныхДляПредставления = Данные.Отбор;
Иначе
// Заполнение значений полей из объекта.
diff --git a/SSL/src/CommonModules/ДлительныеОперации/Module.bsl b/SSL/src/CommonModules/ДлительныеОперации/Module.bsl
index 2bedf09d9..ab724be9f 100644
--- a/SSL/src/CommonModules/ДлительныеОперации/Module.bsl
+++ b/SSL/src/CommonModules/ДлительныеОперации/Module.bsl
@@ -54,19 +54,27 @@
ПараметрыЭкспортнойПроцедуры.Добавить(АдресХранилищаДополнительный);
КонецЕсли;
- РежимОтладки = ОбщегоНазначенияКлиентСервер.РежимОтладки();
- Если РежимОтладки Тогда
-
+ ЗапущеноЗаданий = 0;
+ Если ОбщегоНазначения.ИнформационнаяБазаФайловая()
+ И Не ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы() Тогда
+ Отбор = Новый Структура;
+ Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно);
+ ЗапущеноЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор).Количество();
+ КонецЕсли;
+
+ Если ОбщегоНазначенияКлиентСервер.РежимОтладки()
+ Или ЗапущеноЗаданий > 0 Тогда
РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(ИмяЭкспортнойПроцедуры, ПараметрыЭкспортнойПроцедуры);
Результат.ЗаданиеВыполнено = Истина;
-
Иначе
-
ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(ИмяЭкспортнойПроцедуры);
ПараметрыЗадания.Добавить(ПараметрыЭкспортнойПроцедуры);
ВремяОжидания = ?(ПолучитьСкоростьКлиентскогоСоединения() = СкоростьКлиентскогоСоединения.Низкая, 4, 2);
- Задание = ФоновыеЗадания.Выполнить("РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации", ПараметрыЗадания,, НаименованиеЗадания);
+
+ Задание = СтандартныеПодсистемыСервер.ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяЭкспортнойПроцедуры,
+ ПараметрыЭкспортнойПроцедуры,, НаименованиеЗадания);
+
Попытка
Задание.ОжидатьЗавершения(ВремяОжидания);
Исключение
@@ -242,6 +250,10 @@
Функция НайтиЗаданиеПоИдентификатору(Знач ИдентификаторЗадания)
+ Если ТипЗнч(ИдентификаторЗадания) = Тип("Строка") Тогда
+ ИдентификаторЗадания = Новый УникальныйИдентификатор(ИдентификаторЗадания);
+ КонецЕсли;
+
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
Возврат Задание;
diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl
index 046a8b7f5..3de7dd111 100644
--- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl
+++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl
@@ -289,12 +289,32 @@
// ** ПоказыватьОповещение - Булево - Истина = при запуске команды будет показано стандартное оповещение.
// Не работает для команд "ОткрытиеФормы".
// ** Модификатор - Строка - Вспомогательный модификатор команды.
-// С** "ПечатьMXL" для печатных форм на основе макетов MXL.
+// *** "ПечатьMXL" для печатных форм на основе макетов MXL.
// ** Скрыть - Булево - Истина если команду необходимо скрывать в форме элемента.
// * Разрешения - Массив из ОбъектXDTO.
// {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/a.b.c.d}PermissionBase -
// Необязательный. Массив разрешений, предоставленных дополнительному отчету или обработке при работе в
// безопасном режиме.
+// * ОпределитьНастройкиФормы - Булево - Необязательный.
+// Когда Истина то дополнительный отчет имеет программный интерфейс для тесной интеграции с формой отчета,
+// в том числе может переопределять некоторые настройки формы и подписываться на ее события.
+// Если Истина и отчет подключен к общей форме ФормаОтчета,
+// тогда в модуле объекта отчета следует определить процедуру по шаблону:
+//
+// // Настройки общей формы отчета подсистемы "Варианты отчетов".
+// //
+// // Параметры:
+// // Форма - УправляемаяФорма, Неопределено - Форма отчета или форма настроек отчета.
+// // Неопределено когда вызов без контекста.
+// // КлючВарианта - Строка, Неопределено - Имя предопределенного
+// // или уникальный идентификатор пользовательского варианта отчета.
+// // Неопределено когда вызов без контекста.
+// // Настройки - Структура - см. возвращаемое значение
+// // ОтчетыКлиентСервер.ПолучитьНастройкиОтчетаПоУмолчанию().
+// //
+// Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
+// // Код процедуры.
+// КонецПроцедуры
//
Функция СведенияОВнешнейОбработке(ВерсияБСП = "") Экспорт
ПараметрыРегистрации = Новый Структура;
@@ -341,15 +361,11 @@
//
Процедура ВыполнитьНазначаемуюКомандуНаСервере(Форма, ИмяЭлемента, РезультатВыполнения) Экспорт
- Найденные = Форма.КомандыДополнительныхОбработок.НайтиСтроки(Новый Структура("ИмяЭлемента", ИмяЭлемента));
- Если Найденные.Количество() = 0 Тогда
- ВызватьИсключение НСтр("ru = 'Команда не найдена'");
- КонецЕсли;
+ ОписаниеКоманды = ОписаниеКомандыОбработки(ИмяЭлемента,
+ Форма.Команды.Найти("АдресКомандДополнительныхОбработокВоВременномХранилище").Действие);
- СтрокаТаблицы = Найденные[0];
-
- ВнешнийОбъект = ПолучитьОбъектВнешнейОбработки(СтрокаТаблицы.Ссылка);
- ИдентификаторКоманды = СтрокаТаблицы.Идентификатор;
+ ВнешнийОбъект = ПолучитьОбъектВнешнейОбработки(ОписаниеКоманды.Ссылка);
+ ИдентификаторКоманды = ОписаниеКоманды.Идентификатор;
ПараметрыКоманды = Новый Структура;
ПараметрыКоманды.Вставить("ЭтаФорма", Форма);
@@ -857,13 +873,15 @@
| Справочник.ДополнительныеОтчетыИОбработки КАК Таблица
|ГДЕ
| Таблица.ИмяОбъекта = &ИмяОбъекта
- | И Таблица.ПометкаУдаления = ЛОЖЬ
- | И Таблица.Вид = &ВидДополнительныйОтчет
| И Таблица.ИспользуетХранилищеВариантов = ИСТИНА
+ | И Таблица.ПометкаУдаления = ЛОЖЬ
+ | И (Таблица.Вид = &ВидДополнительныйОтчет
+ | ИЛИ Таблица.Вид = &ВидОтчет)
| И Таблица.Публикация = &ПубликацияИспользуется";
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ИмяОбъекта", ОтчетИнформация.ОтчетИмя);
+ Запрос.УстановитьПараметр("ВидОтчет", Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет);
Запрос.УстановитьПараметр("ВидДополнительныйОтчет", Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет);
Запрос.УстановитьПараметр("ПубликацияИспользуется", Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется);
Если ОтчетИнформация.ПодключеныВсеОтчеты Тогда
@@ -907,10 +925,12 @@
| Справочник.ДополнительныеОтчетыИОбработки КАК Таблица
|ГДЕ
| Таблица.ИспользуетХранилищеВариантов
- | И Таблица.Вид = &ВидДополнительныйОтчет
+ | И (Таблица.Вид = &ВидДополнительныйОтчет
+ | ИЛИ Таблица.Вид = &ВидОтчет)
| И НЕ Таблица.Ссылка В (&ДоступныеОтчеты)";
Запрос.УстановитьПараметр("ДоступныеОтчеты", ДоступныеОтчеты);
+ Запрос.УстановитьПараметр("ВидОтчет", Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет);
Запрос.УстановитьПараметр("ВидДополнительныйОтчет", Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет);
Выборка = Запрос.Выполнить().Выбрать();
@@ -1214,6 +1234,22 @@
КонецЦикла;
КонецПроцедуры
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.Справочники.ДополнительныеОтчетыИОбработки.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
////////////////////////////////////////////////////////////////////////////////
// Обработчики подписок на события.
@@ -2237,51 +2273,35 @@
КоманднаяПанель = Форма.КоманднаяПанель;
КонецЕсли;
Подменю = Элементы.Вставить("ПодменюДополнительныхОбработокЗаполнения", Тип("ГруппаФормы"), КоманднаяПанель);
+ Подменю.Заголовок = НСтр("ru = 'Заполнить'");
+ Подменю.Вид = ВидГруппыФормы.Подменю;
+ Подменю.Картинка = БиблиотекаКартинок.ЗаполнитьФорму;
+ Подменю.Отображение = ОтображениеКнопки.КартинкаИТекст;
Иначе
Для Каждого Элемент Из Подменю.ПодчиненныеЭлементы Цикл
ПредустановленныеКоманды.Добавить(Элемент);
КонецЦикла;
КонецЕсли;
- Подменю.Заголовок = НСтр("ru = 'Заполнить'");
- Подменю.Вид = ВидГруппыФормы.Подменю;
- Подменю.Картинка = БиблиотекаКартинок.ЗаполнитьФорму;
- Подменю.Отображение = ОтображениеКнопки.КартинкаИТекст;
- // Реквизиты
- ДобавляемыеРеквизиты = Новый Массив;
+ ТаблицаКоманд = Результат.Выгрузить();
+ ТаблицаКоманд.Колонки.Добавить("ИмяЭлемента", Новый ОписаниеТипов("Строка"));
+ ТаблицаКоманд.Колонки.Добавить("ЭтоОтчет", Новый ОписаниеТипов("Булево"));
- ИмяТаблицы = "КомандыДополнительныхОбработок";
- ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяТаблицы, Новый ОписаниеТипов("ТаблицаЗначений")));
- ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Ссылка", Новый ОписаниеТипов("СправочникСсылка.ДополнительныеОтчетыИОбработки"), ИмяТаблицы));
- ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ВариантЗапуска", Новый ОписаниеТипов("ПеречислениеСсылка.СпособыВызоваДополнительныхОбработок"), ИмяТаблицы));
- ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ИмяЭлемента", Новый ОписаниеТипов("Строка"), ИмяТаблицы));
- ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"), ИмяТаблицы));
- ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Представление", Новый ОписаниеТипов("Строка"), ИмяТаблицы));
- ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Идентификатор", Новый ОписаниеТипов("Строка"), ИмяТаблицы));
- ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ЭтоОтчет", Новый ОписаниеТипов("Булево"), ИмяТаблицы));
-
- Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
-
- // Добавление команд и элементов под команды.
- НомерЭлемента = 0;
-
- Выборка = Результат.Выбрать();
- Пока Выборка.Следующий() Цикл
- НомерЭлемента = НомерЭлемента + 1;
+ Для НомерЭлемента = 0 По ТаблицаКоманд.Количество() - 1 Цикл
+ ОписаниеКоманды = ТаблицаКоманд[НомерЭлемента];
ИмяЭлемента = "КомандаДополнительнойОбработки" + Формат(НомерЭлемента, "ЧГ=");
-
- СтрокаТаблицы = Форма.КомандыДополнительныхОбработок.Добавить();
- ЗаполнитьЗначенияСвойств(СтрокаТаблицы, Выборка);
- СтрокаТаблицы.ИмяЭлемента = ИмяЭлемента;
+ ОписаниеКоманды.ИмяЭлемента = ИмяЭлемента;
Команда = Форма.Команды.Добавить(ИмяЭлемента);
Команда.Действие = "Подключаемый_ВыполнитьНазначаемуюКоманду";
- Команда.Заголовок = СтрокаТаблицы.Представление;
+ Команда.Заголовок = ОписаниеКоманды.Представление;
Элемент = Форма.Элементы.Добавить(ИмяЭлемента, Тип("КнопкаФормы"), Подменю);
Элемент.ИмяКоманды = ИмяЭлемента;
Элемент.ТолькоВоВсехДействиях = Ложь;
КонецЦикла;
+ Команда = Форма.Команды.Добавить("АдресКомандДополнительныхОбработокВоВременномХранилище");
+ Команда.Действие = ПоместитьВоВременноеХранилище(ТаблицаКоманд, Форма.УникальныйИдентификатор);
Для Каждого Элемент Из ПредустановленныеКоманды Цикл
Элементы.Переместить(Элемент, Подменю);
@@ -2289,6 +2309,13 @@
КонецПроцедуры
+Функция ОписаниеКомандыОбработки(ИмяЭлемента, АдресТаблицыКомандВоВременномХранилище) Экспорт
+ ТаблицаКоманд = ПолучитьИзВременногоХранилища(АдресТаблицыКомандВоВременномХранилище);
+ Для Каждого КомандаОбработки Из ТаблицаКоманд.НайтиСтроки(Новый Структура("ИмяЭлемента", ИмяЭлемента)) Цикл
+ Возврат ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(КомандаОбработки);
+ КонецЦикла;
+КонецФункции
+
// Для внутреннего использования.
Функция ПолучитьТаблицуЗаписей(ПользователиСДопОбработками)
@@ -2547,7 +2574,7 @@
КонецЕсли;
- СтандартныеПодсистемыКлиентСервер.ПодготовитьОповещениеДинамическихСписков(ИзмененныеОбъекты, ПараметрыКоманды.РезультатВыполнения);
+ СтандартныеПодсистемыКлиентСервер.ОповеститьДинамическиеСписки(ПараметрыКоманды.РезультатВыполнения, ИзмененныеОбъекты);
Если ТипЗнч(АдресРезультата) = Тип("Строка") И ЭтоАдресВременногоХранилища(АдресРезультата) Тогда
ПоместитьВоВременноеХранилище(ПараметрыКоманды.РезультатВыполнения, АдресРезультата);
@@ -2657,7 +2684,7 @@
Результат.Конфликтующие = Новый СписокЗначений;
Для Каждого СтрокаТаблицы Из Конфликтующие Цикл
Результат.Конфликтующие.Добавить(СтрокаТаблицы.Ссылка, СтрокаТаблицы.Представление);
- КонецЦикла;
+ КонецЦикла;
Возврат Результат;
КонецЕсли;
КонецЕсли;
@@ -2666,15 +2693,21 @@
ИЛИ Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда
// ничего не делаем
Иначе
- Результат.КраткоеПредставлениеОшибки = НСтр("ru = 'Для подключения обработки, запускаемой в небезопасном режиме, требуются административные права.'");
+ Результат.ТекстОшибки = НСтр("ru = 'Для подключения обработки, запускаемой в небезопасном режиме, требуются административные права.'");
Возврат Результат;
КонецЕсли;
Если НЕ Объект.ЭтоНовый() И РегистрационныеДанные.Вид <> Объект.Вид Тогда
- Результат.КраткоеПредставлениеОшибки = НСтр("ru = 'Невозможно сменить вид дополнительного отчета или обработки.'");
+ Результат.ТекстОшибки =
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Вид загружаемого объекта (%1) не соответствует текущему (%2).
+ |Для загрузки нового объекта нажмите ""Создать"".'"),
+ Строка(РегистрационныеДанные.Вид),
+ Строка(Объект.Вид)
+ );
Возврат Результат;
ИначеЕсли ПараметрыРегистрации.ЭтоОтчет <> (РегистрационныеДанные.Вид = ВидДополнительныйОтчет ИЛИ РегистрационныеДанные.Вид = ВидОтчет) Тогда
- Результат.КраткоеПредставлениеОшибки = НСтр("ru = 'Вид обработки, указанный в сведениях о внешней обработке, не соответствует ее расширению.'");
+ Результат.ТекстОшибки = НСтр("ru = 'Вид обработки, указанный в сведениях о внешней обработке, не соответствует ее расширению.'");
Возврат Результат;
КонецЕсли;
@@ -2706,7 +2739,7 @@
И Метаданные.ХранилищеВариантовОтчетов.Имя = "ХранилищеВариантовОтчетов") Тогда
Объект.ИспользуетХранилищеВариантов = Истина;
КонецЕсли;
- ПараметрыРегистрации.Свойство("ОпределитьНастройкиФормы", Объект.ТеснаяИнтеграцияСФормойОтчета);
+ РегистрационныеДанные.Свойство("ОпределитьНастройкиФормы", Объект.ТеснаяИнтеграцияСФормойОтчета);
КонецЕсли;
// Загружена другая обработка (изменилось имя объекта или вид обработки).
@@ -2874,7 +2907,8 @@
КонецЕсли;
РегистрационныеДанные.Вставить("ХранилищеВариантов");
- Если РегистрационныеДанные.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда
+ Если РегистрационныеДанные.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет
+ Или РегистрационныеДанные.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет Тогда
Если ВнешнийОбъектМетаданные.ХранилищеВариантов <> Неопределено Тогда
РегистрационныеДанные.ХранилищеВариантов = ВнешнийОбъектМетаданные.ХранилищеВариантов.Имя;
КонецЕсли;
diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежиме/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежиме/Module.bsl
index 377e5bd5a..74c0f2e31 100644
--- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежиме/Module.bsl
+++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежиме/Module.bsl
@@ -314,7 +314,16 @@
СтрокаПараметров = СформироватьСтрокуПараметровДляМетодаВнешнегоОбъекта(Параметры);
Выполнить("ВнешнийОбъект." + ИмяМетода + "(" + СтрокаПараметров + ");");
- УдалитьФайлы(ВременныйФайл);
+ Попытка
+ УдалитьФайлы(ВременныйФайл);
+ Исключение
+ ДополнительныеОтчетыИОбработки.ЗаписатьПредупреждение(
+ Неопределено,
+ НСтр("ru = 'Не удалось удалить временный файл ""%1"":
+ |%2'"),
+ ВременныйФайл,
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+ КонецПопытки;
КонецПроцедуры
// Функция выполняет получение файла из сети Интернет по протоколам HTTP(S)/FTP.
diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеПовтИсп/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеПовтИсп/Module.bsl
index 8c7e8b0b9..1b8a8f66f 100644
--- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеПовтИсп/Module.bsl
+++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеПовтИсп/Module.bsl
@@ -81,13 +81,14 @@
ДобавитьПараметр(Параметры, "Protocol", НСтр("ru = 'по протоколу %1'"), НСтр("ru = 'по любому протоколу'"));
ДобавитьПараметр(Параметры, "Port", НСтр("ru = 'через порт %1'"), НСтр("ru = 'через любой порт'"));
+ Значение = Новый Структура;
+ Значение.Вставить("Представление", Представление);
+ Значение.Вставить("Описание", Описание);
+ Значение.Вставить("Параметры", Параметры);
+
Результат.Вставить(
ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.ТипПолучениеДанныхИзИнтернет(),
- Новый Структура(
- "Представление,Описание,Параметры",
- Представление,
- Описание,
- Параметры));
+ Значение);
// Конец {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/a.b.c.d}GetFileFromInternet
@@ -108,14 +109,15 @@
ДобавитьПараметр(Параметры, "Protocol", НСтр("ru = 'по протоколу %1'"), НСтр("ru = 'по любому протоколу'"));
ДобавитьПараметр(Параметры, "Port", НСтр("ru = 'через порт %1'"), НСтр("ru = 'через любой порт'"));
+ Значение = Новый Структура;
+ Значение.Вставить("Представление", Представление);
+ Значение.Вставить("Описание", Описание);
+ Значение.Вставить("Последствия", Последствия);
+ Значение.Вставить("Параметры", Параметры);
+
Результат.Вставить(
ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.ТипПередачаДанныхВИнтернет(),
- Новый Структура(
- "Представление,Описание,Последствия,Параметры",
- Представление,
- Описание,
- Последствия,
- Параметры));
+ Значение);
// Конец {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/a.b.c.d}SendFileToInternet
@@ -134,14 +136,15 @@
Параметры = ТаблицаПараметров();
ДобавитьПараметр(Параметры, "WsdlDestination", НСтр("ru = 'по адресу %1'"), НСтр("ru = 'по любому адресу'"));
+ Значение = Новый Структура;
+ Значение.Вставить("Представление", Представление);
+ Значение.Вставить("Описание", Описание);
+ Значение.Вставить("Последствия", Последствия);
+ Значение.Вставить("Параметры", Параметры);
+
Результат.Вставить(
ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.ТипWSСоединение(),
- Новый Структура(
- "Представление,Описание,Последствия,Параметры",
- Представление,
- Описание,
- Последствия,
- Параметры));
+ Значение);
// Конец {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/a.b.c.d}SoapConnect
@@ -161,14 +164,15 @@
Параметры = ТаблицаПараметров();
ДобавитьПараметр(Параметры, "ProgId", НСтр("ru = 'с программным идентификатором %1'"), НСтр("ru = 'с любым программным идентификатором'"));
+ Значение = Новый Структура;
+ Значение.Вставить("Представление", Представление);
+ Значение.Вставить("Описание", Описание);
+ Значение.Вставить("Последствия", Последствия);
+ Значение.Вставить("Параметры", Параметры);
+
Результат.Вставить(
ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.ТипСозданиеCOMОбъекта(),
- Новый Структура(
- "Представление,Описание,Последствия,Параметры",
- Представление,
- Описание,
- Последствия,
- Параметры));
+ Значение);
// Конец {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/a.b.c.d}CreateComObject
@@ -188,14 +192,15 @@
Параметры = ТаблицаПараметров();
ДобавитьПараметр(Параметры, "TemplateName", НСтр("ru = 'из макета %1'"), НСтр("ru = 'из любого макета'"));
+ Значение = Новый Структура;
+ Значение.Вставить("Представление", Представление);
+ Значение.Вставить("Описание", Описание);
+ Значение.Вставить("Последствия", Последствия);
+ Значение.Вставить("Параметры", Параметры);
+
Результат.Вставить(
ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.ТипПодключениеВнешнейКомпоненты(),
- Новый Структура(
- "Представление,Описание,Последствия,Параметры",
- Представление,
- Описание,
- Последствия,
- Параметры));
+ Значение);
// Конец {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/a.b.c.d}AttachAddin
@@ -204,12 +209,13 @@
Представление = НСтр("ru = 'Получение файлов из внешнего объекта'");
Описание = НСтр("ru = 'Дополнительному отчету или обработке будет разрешено получать файлы из внешнего программного обеспечения (например, с помощью COM-соединения или внешней компоненты)'");
+ Значение = Новый Структура;
+ Значение.Вставить("Представление", Представление);
+ Значение.Вставить("Описание", Описание);
+
Результат.Вставить(
ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.ТипПолучениеФайлаИзВнешнегоОбъекта(),
- Новый Структура(
- "Представление,Описание",
- Представление,
- Описание));
+ Значение);
// Конец {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/a.b.c.d}GetFileFromExternalSoftware
@@ -218,12 +224,13 @@
Представление = НСтр("ru = 'Передача файлов во внешний объект'");
Описание = НСтр("ru = 'Дополнительному отчету или обработке будет разрешено передавать файлы во внешнее программное обеспечение (например, с помощью COM-соединения или внешней компоненты)'");
+ Значение = Новый Структура;
+ Значение.Вставить("Представление", Представление);
+ Значение.Вставить("Описание", Описание);
+
Результат.Вставить(
ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.ТипПередачаФайлаВоВнешнийОбъект(),
- Новый Структура(
- "Представление,Описание",
- Представление,
- Описание));
+ Значение);
// Конец {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/a.b.c.d}SendFileToExternalSoftware
@@ -236,13 +243,15 @@
ДобавитьПараметр(Параметры, "DocumentType", НСтр("ru = 'документы с типом %1'"), НСтр("ru = 'любые документы'"));
ДобавитьПараметр(Параметры, "Action", НСтр("ru = 'разрешенное действие: %1'"), НСтр("ru = 'любое изменение состояния проведения'"));
+ Значение = Новый Структура;
+ Значение.Вставить("Представление", Представление);
+ Значение.Вставить("Описание", Описание);
+ Значение.Вставить("Параметры", Параметры);
+ Значение.Вставить("ОтображатьПользователю", Неопределено);
+
Результат.Вставить(
ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.ТипПроведениеДокументов(),
- Новый Структура(
- "Представление,Описание,Параметры,ОтображатьПользователю",
- Представление,
- Описание,
- Параметры));
+ Значение);
// Конец {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/a.b.c.d}SendFileToInternet
diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl
index 460d8a3ed..c45c6f4b7 100644
--- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl
@@ -282,6 +282,7 @@
Функция ВыполнитьСценарийБезопасногоРежима(Знач КлючСессии, Знач Сценарий, Знач ИсполняемыйОбъект, ПараметрыВыполнения, СохраняемыеПараметры = Неопределено, ОбъектыНазначения = Неопределено) Экспорт
Исключения = ДополнительныеОтчетыИОбработкиВБезопасномРежимеПовтИсп.ПолучитьРазрешенныеМетоды();
+ ВременныеФайлыДляУдаления = Новый Массив;
Если СохраняемыеПараметры = Неопределено Тогда
СохраняемыеПараметры = Новый Структура();
diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВызовСервера/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВызовСервера/Module.bsl
index 2857bea58..ceedc2d99 100644
--- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВызовСервера/Module.bsl
+++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВызовСервера/Module.bsl
@@ -51,4 +51,8 @@
Возврат ПоместитьВоВременноеХранилище(ХранилищеОбработки.Получить(), ИдентификаторФормы);
КонецФункции
+Функция ОписаниеКомандыОбработки(ИмяЭлемента, АдресТаблицыКомандВоВременномХранилище) Экспорт
+ Возврат ДополнительныеОтчетыИОбработки.ОписаниеКомандыОбработки(ИмяЭлемента, АдресТаблицыКомандВоВременномХранилище);
+КонецФункции
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl
index 2570d6e1d..677a7f3d5 100644
--- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl
+++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl
@@ -179,12 +179,8 @@
Функция ВыполнитьНазначаемуюКомандуНаКлиенте(Форма, ИмяЭлемента) Экспорт
ОчиститьСообщения();
- Найденные = Форма.КомандыДополнительныхОбработок.НайтиСтроки(Новый Структура("ИмяЭлемента", ИмяЭлемента));
- Если Найденные.Количество() = 0 Тогда
- ВызватьИсключение НСтр("ru = 'Команда не найдена'");
- КонецЕсли;
-
- ВыполняемаяКоманда = Найденные[0];
+ ВыполняемаяКоманда = ДополнительныеОтчетыИОбработкиВызовСервера.ОписаниеКомандыОбработки(ИмяЭлемента,
+ Форма.Команды.Найти("АдресКомандДополнительныхОбработокВоВременномХранилище").Действие);
Если ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ЗаполнениеФормы") Тогда
Возврат Ложь; // Для выполнения команды требуется контекстный вызов сервера.
@@ -228,71 +224,6 @@
КонецПроцедуры
-// Показывает диалог выбора файлов и помещает выбранные файлы во временное хранилище.
-// Совмещает работу методов глобального метода НачатьПомещениеФайла и ПоместитьФайлы,
-// возвращая идентичный результат вне зависимости от того, подключено расширение работы с файлами, или нет.
-//
-// Параметры:
-// ОбработчикРезультата - ОписаниеОповещения - Описание процедуры, принимающей результат выбора.
-// ИдентификаторФормы - УникальныйИдентификатор - Уникальный идентификатор формы, из которой выполняется размещение
-// файла.
-// НачальноеИмяФайла - Строка - Полный путь и имя файла, которые будут предложены пользователю в начале выбора.
-// ПараметрыДиалога - Структура, Неопределено - См. свойства ДиалогВыбораФайла в синтакс-помощнике.
-// Используется в случае, если удалось подключить расширение работы с файлами.
-//
-// Значение первого параметра, возвращаемого в ОбработчикРезультата:
-// ПомещенныеФайлы - Результат выбора.
-// * - Неопределено - Пользователь отказался от выбора.
-// * - Массив из ОписаниеПереданногоФайла, Структура - Пользователь выбрал файл.
-// ** Имя - Строка - Полное имя выбранного файла.
-// ** Хранение - Строка - Адрес во временном хранилище, по которому размещен файл.
-//
-// Ограничения:
-// Используется только для интерактивного выбора в диалоге.
-// Не используется для выбора каталогов - эта опция не поддерживается веб-клиентом.
-// Не поддерживается множественный выбор в веб-клиенте, если не установлено расширение работы с файлами.
-// Не поддерживается передача адреса временного хранилища.
-//
-Процедура ПоказатьПомещениеФайла(ОбработчикРезультата, ИдентификаторФормы, НачальноеИмяФайла, ПараметрыДиалога) Экспорт
-
- ДополнительныеПараметры = Новый Структура;
- ДополнительныеПараметры.Вставить("ОбработчикРезультата", ОбработчикРезультата);
-
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
-
- Если ПараметрыДиалога = Неопределено Тогда
- ПараметрыДиалога = Новый Структура;
- КонецЕсли;
- Если ПараметрыДиалога.Свойство("Режим") Тогда
- Режим = ПараметрыДиалога.Режим;
- Если Режим = РежимДиалогаВыбораФайла.ВыборКаталога Тогда
- ВызватьИсключение НСтр("ru = 'Выбор каталога не поддерживается'");
- КонецЕсли;
- Иначе
- Режим = РежимДиалогаВыбораФайла.Открытие;
- КонецЕсли;
-
- Диалог = Новый ДиалогВыбораФайла(Режим);
- Диалог.ПолноеИмяФайла = НачальноеИмяФайла;
- ЗаполнитьЗначенияСвойств(Диалог, ПараметрыДиалога);
-
- ПомещенныеФайлы = Новый Массив;
- Если ИдентификаторФормы <> Неопределено Тогда
- ВыборВыполнен = ПоместитьФайлы(, ПомещенныеФайлы, Диалог, Истина, ИдентификаторФормы);
- Иначе
- ВыборВыполнен = ПоместитьФайлы(, ПомещенныеФайлы, Диалог, Истина);
- КонецЕсли;
- ОбработатьРезультатПомещенияФайла(ВыборВыполнен, ПомещенныеФайлы, Неопределено, ДополнительныеПараметры);
-
- Иначе
-
- Обработчик = Новый ОписаниеОповещения("ОбработатьРезультатПомещенияФайла", ЭтотОбъект, ДополнительныеПараметры);
- НачатьПомещениеФайла(Обработчик, , НачальноеИмяФайла, Истина, ИдентификаторФормы);
-
- КонецЕсли;
-
-КонецПроцедуры
-
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
@@ -645,31 +576,6 @@
////////////////////////////////////////////////////////////////////////////////
// Служебные обработчики асинхронных диалогов.
-// Обработчик результата работы процедуры ПоказатьПомещениеФайла.
-Процедура ОбработатьРезультатПомещенияФайла(ВыборВыполнен, АдресИлиРезультатВыбора, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
-
- Если ТипЗнч(ДополнительныеПараметры.ОбработчикРезультата) = Тип("ОписаниеОповещения") Тогда
-
- Если ВыборВыполнен = Истина Тогда
- Если ТипЗнч(АдресИлиРезультатВыбора) = Тип("Массив") Тогда
- РезультатВыбора = АдресИлиРезультатВыбора;
- Иначе
- РезультатВыбора = Новый Массив;
- ЭлементРезультата = Новый Структура;
- ЭлементРезультата.Вставить("Хранение", АдресИлиРезультатВыбора);
- ЭлементРезультата.Вставить("Имя", ВыбранноеИмяФайла);
- РезультатВыбора.Добавить(ЭлементРезультата);
- КонецЕсли;
- Иначе
- РезультатВыбора = Неопределено;
- КонецЕсли;
-
- ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, РезультатВыбора);
-
- КонецЕсли;
-
-КонецПроцедуры
-
// Обработчик результата работы процедуры РедактироватьМногострочныйТекст.
Процедура РедактироватьМногострочныйТекстЗавершение(Текст, ПараметрыИсточника) Экспорт
@@ -705,7 +611,7 @@
КонецПроцедуры
// Обработчик результата работы процедуры ВыгрузитьВФайл.
-Процедура ВыгрузитьВФайлЗавершение(Результат, ПараметрыВыгрузки) Экспорт
+Процедура ВыгрузитьВФайлЗавершение(Подключено, ПараметрыВыгрузки) Экспорт
Перем Адрес;
ПараметрыВыгрузки.Свойство("АдресДанныхОбработки", Адрес);
@@ -713,7 +619,11 @@
Адрес = ДополнительныеОтчетыИОбработкиВызовСервера.ПоместитьВХранилище(ПараметрыВыгрузки.Ссылка, Неопределено);
КонецЕсли;
- Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
+ ДополнительныеПараметры = Новый Структура;
+ ДополнительныеПараметры.Вставить("ПараметрыВыгрузки", ПараметрыВыгрузки);
+ ДополнительныеПараметры.Вставить("Адрес", Адрес);
+
+ Если Не Подключено Тогда
ПолучитьФайл(Адрес, ПараметрыВыгрузки.ИмяФайла, Истина);
Возврат;
КонецЕсли;
@@ -725,11 +635,28 @@
ДиалогСохраненияФайла.МножественныйВыбор = Ложь;
ДиалогСохраненияФайла.Заголовок = НСтр("ru = 'Укажите файл'");
- Если ДиалогСохраненияФайла.Выбрать() Тогда
+ Обработчик = Новый ОписаниеОповещения("ВыгрузитьФайлВыборФайла", ЭтотОбъект, ДополнительныеПараметры);
+ ДиалогСохраненияФайла.Показать(Обработчик);
+
+КонецПроцедуры
+
+// Обработчик результата работы процедуры ВыгрузитьВФайл.
+Процедура ВыгрузитьФайлВыборФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
+
+ Если ВыбранныеФайлы <> Неопределено Тогда
+ ПолноеИмяФайла = ВыбранныеФайлы[0];
ПолучаемыеФайлы = Новый Массив;
- ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(, Адрес));
- ПолучитьФайлы(ПолучаемыеФайлы, , ДиалогСохраненияФайла.ПолноеИмяФайла, Ложь);
+ ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ПолноеИмяФайла, ДополнительныеПараметры.Адрес));
+
+ Обработчик = Новый ОписаниеОповещения("ВыгрузитьФайлПолучениеФайла", ЭтотОбъект);
+ НачатьПолучениеФайлов(Обработчик, ПолучаемыеФайлы, ПолноеИмяФайла, Ложь);
КонецЕсли;
+
+КонецПроцедуры
+
+// Обработчик результата работы процедуры ВыгрузитьВФайл.
+Процедура ВыгрузитьФайлПолучениеФайла(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
+ // Обработка результата не требуется.
КонецПроцедуры
#КонецОбласти
diff --git a/SSL/src/CommonModules/ЗагрузкаДанныхИзФайлаПереопределяемый/Module.bsl b/SSL/src/CommonModules/ЗагрузкаДанныхИзФайлаПереопределяемый/Module.bsl
index 97b8ca198..c91443b38 100644
--- a/SSL/src/CommonModules/ЗагрузкаДанныхИзФайлаПереопределяемый/Module.bsl
+++ b/SSL/src/CommonModules/ЗагрузкаДанныхИзФайлаПереопределяемый/Module.bsl
@@ -20,4 +20,4 @@
КонецПроцедуры
-#КонецОбласти
+#КонецОбласти
\ No newline at end of file
diff --git a/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl b/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl
index ece4477d0..d222cc90a 100644
--- a/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl
@@ -22,6 +22,22 @@
КонецПроцедуры
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.Справочники.Заметки.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@@ -90,6 +106,11 @@
КонецПроцедуры
Процедура УстановитьПометкуУдаленияЗаметкамПользователя(Источник, Отказ) Экспорт
+
+ Если Источник.ОбменДанными.Загрузка Тогда
+ Возврат;
+ КонецЕсли;
+
Если Не Источник.ПометкаУдаления Тогда
Возврат;
КонецЕсли;
diff --git a/SSL/src/CommonModules/Интеграция1СБухфон/Module.bsl b/SSL/src/CommonModules/Интеграция1СБухфон/Module.bsl
index 531b108ba..db97a48fc 100644
--- a/SSL/src/CommonModules/Интеграция1СБухфон/Module.bsl
+++ b/SSL/src/CommonModules/Интеграция1СБухфон/Module.bsl
@@ -1,8 +1,56 @@
-
-////////////////////////////////////////////////////////////////////////////
-// Подсистема "Интеграция с 1С:Бухфон".
-//
////////////////////////////////////////////////////////////////////////////////
+// Подсистема "Интеграция с 1С:Бухфон".
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#Область ПрограммныйИнтерфейс
+
+// Процедура устанавливает свойства элемента кнопки при встраивании в другие подсистемы.
+//
+Процедура ПриСозданииНаСервере(Элемент) Экспорт
+
+ НастройкиПользователя = Интеграция1СБухфонВызовСервера.НастройкиУчетнойЗаписиПользователя();
+ Элемент.Видимость = НастройкиПользователя.ВидимостьКнопки1СБухфон;
+
+ Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда
+ Элемент.Ширина = 20;
+ Элемент.Высота = 3;
+ Иначе
+ Элемент.Ширина = 16;
+ Элемент.Высота = 3;
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер.
+//
+Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт
+
+ // СЕРВЕРНЫЕ ОБРАБОТЧИКИ.
+ СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить(
+ "Интеграция1СБухфон");
+
+КонецПроцедуры
+
+// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме.
+//
+// Параметры:
+// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления
+// общего модуля ОбновлениеИнформационнойБазы.
+//
+Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
+
+ Обработчик = Обработчики.Добавить();
+ Обработчик.НачальноеЗаполнение = Истина;
+ Обработчик.Процедура = "Интеграция1СБухфон.ПервоначальноеЗаполнение";
+
+КонецПроцедуры
+
+#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@@ -66,55 +114,6 @@
КонецПроцедуры
#КонецОбласти
-
-#Область СлужебныйПрограммныйИнтерфейс
-
-// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер.
-//
-Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт
-
- // СЕРВЕРНЫЕ ОБРАБОТЧИКИ.
- СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить(
- "Интеграция1СБухфон");
-
-КонецПроцедуры
-
-// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме.
-//
-// Параметры:
-// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления
-// общего модуля ОбновлениеИнформационнойБазы.
-//
-Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
-
- Обработчик = Обработчики.Добавить();
- Обработчик.НачальноеЗаполнение = Истина;
- Обработчик.Процедура = "Интеграция1СБухфон.ПервоначальноеЗаполнение";
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область ПрограммныйИнтерфейс
-
-// Процедура устанавливает свойства элемента кнопки при встраивании в другие подсистемы.
-//
-Процедура ПриСозданииНаСервере(Элемент) Экспорт
-
- НастройкиПользователя = Интеграция1СБухфонВызовСервера.НастройкиУчетнойЗаписиПользователя();
- Элемент.Видимость = НастройкиПользователя.ВидимостьКнопки1СБухфон;
-
- Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда
- Элемент.Ширина = 20;
- Элемент.Высота = 3;
- Иначе
- Элемент.Ширина = 16;
- Элемент.Высота = 3;
- КонецЕсли;
-
-КонецПроцедуры
-
-#КонецОбласти
diff --git a/SSL/src/CommonModules/Интеграция1СБухфонВызовСервера/Module.bsl b/SSL/src/CommonModules/Интеграция1СБухфонВызовСервера/Module.bsl
index e37a15c1d..2d3a06bf3 100644
--- a/SSL/src/CommonModules/Интеграция1СБухфонВызовСервера/Module.bsl
+++ b/SSL/src/CommonModules/Интеграция1СБухфонВызовСервера/Module.bsl
@@ -1,7 +1,6 @@
-
-////////////////////////////////////////////////////////////////////////////
-// Подсистема "Интеграция с 1С:Бухфон".
-//
+////////////////////////////////////////////////////////////////////////////////
+// Подсистема "Интеграция с 1С:Бухфон".
+//
////////////////////////////////////////////////////////////////////////////////
#Область СлужебныеПроцедурыИФункции
diff --git a/SSL/src/CommonModules/Интеграция1СБухфонКлиент/Module.bsl b/SSL/src/CommonModules/Интеграция1СБухфонКлиент/Module.bsl
index ef049482a..f107e9488 100644
--- a/SSL/src/CommonModules/Интеграция1СБухфонКлиент/Module.bsl
+++ b/SSL/src/CommonModules/Интеграция1СБухфонКлиент/Module.bsl
@@ -20,51 +20,6 @@
#Область СлужебныеПроцедурыИФункции
-// Диалоговое окно для выбора файла.
-//
-// Возвращаемое значение:
-// Строка - Путь к исполняемому файлу.
-Функция ВыбратьФайл1СБухфон(ПутьКФайлу = "") Экспорт
-
- РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами();
- Если НЕ РасширениеПодключено Тогда
- ПараметрыФормы = Новый Структура;
- ПараметрыФормы.Вставить("ТекстПредложения", НСтр("ru = 'Для выбора приложения 1С-Бухфон
- |необходимо установить расширение работы с файлами.'"));
- ПараметрыФормы.Вставить("ВозможноПродолжениеБезУстановки", Ложь);
- ОткрытьФорму("ОбщаяФорма.ВопросОбУстановкеРасширенияРаботыСФайлами", ПараметрыФормы);
- Возврат "";
- КонецЕсли;
-
- Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
- Диалог.Заголовок = НСтр("ru = 'Выберите исполняемый файл 1С-Бухфон'");
- Диалог.ПолноеИмяФайла = ПутьКФайлу;
- Каталог = Новый Файл(ПутьКФайлу);
- Диалог.Каталог = Каталог.Путь;
- Фильтр = НСтр("ru = 'buhphone.exe (*.exe)|*.exe'");
- Диалог.Фильтр = Фильтр;
- Диалог.МножественныйВыбор = Ложь;
-
- Если Диалог.Выбрать() Тогда
- Возврат Диалог.ПолноеИмяФайла;
- Иначе
- Возврат "";
- КонецЕсли;
-
-КонецФункции
-
-// Проверяет наличие исполняемого файла по указанному пути.
-//
-// Возвращаемое значение:
-// Булево - При значении Истина файл запустится по указанному пути.
-//
-Функция НаличиеФайла1СБухфон(Путь) Экспорт
-
- ПроверяемыйФайл = Новый Файл(Путь);
- Возврат ПроверяемыйФайл.Существует();
-
-КонецФункции
-
// Возвращает уникальный идентификатор клиента 1С (приложение).
Функция ИдентификаторКлиента() Экспорт
@@ -84,10 +39,9 @@
Возврат Значение;
КонецЕсли;
- #Если ВебКлиент Тогда
- ЗначениеИзРеестра = "";
- #Иначе
-
+#Если ВебКлиент Тогда
+ ЗначениеИзРеестра = "";
+#Иначе
RegProv = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv");
RegProv.GetStringValue("2147483649","Software\Buhphone","ProgramPath",Значение);
@@ -98,11 +52,11 @@
КонецЕсли;
Возврат ЗначениеИзРеестра;
- #КонецЕсли
+#КонецЕсли
КонецФункции
-// Возвращает Истина, если клиентское приложение запущено под управлением ОС Linux.
+// Возвращает Истина, если клиентское приложение запущено под управлением ОС Windows.
//
// Возвращаемое значение:
// Булево. Если нет клиентского приложения, возвращается Ложь.
@@ -118,6 +72,73 @@
КонецФункции
+// Диалоговое окно для выбора файла.
+//
+// Возвращаемое значение:
+// Строка - Путь к исполняемому файлу.
+Процедура ВыбратьФайл1СБухфон(ОповещениеОЗакрытии, ПутьКФайлу = "") Экспорт
+ ДополнительныеПараметры = Новый Структура;
+ ДополнительныеПараметры.Вставить("ОповещениеОЗакрытии", ОповещениеОЗакрытии);
+ ДополнительныеПараметры.Вставить("ПутьКФайлу", ПутьКФайлу);
+
+ ТекстПредложения = НСтр("ru = 'Для выбора приложения 1С-Бухфон необходимо установить расширение работы с файлами.'");
+ Оповещение = Новый ОписаниеОповещения("ВыбратьФайл1СБухфонПослеУстановкиРасширения", ЭтотОбъект, ДополнительныеПараметры);
+ ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстПредложения, Ложь);
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+Процедура ВыбратьФайл1СБухфонПослеУстановкиРасширения(Подключено, ДополнительныеПараметры) Экспорт
+
+ Если Не Подключено Тогда
+ ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗакрытии, "");
+ Возврат;
+ КонецЕсли;
+
+ Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
+ Диалог.Заголовок = НСтр("ru = 'Выберите исполняемый файл 1С-Бухфон'");
+ Диалог.ПолноеИмяФайла = ДополнительныеПараметры.ПутьКФайлу;
+ Каталог = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ДополнительныеПараметры.ПутьКФайлу);
+ Диалог.Каталог = Каталог.Путь;
+ Фильтр = НСтр("ru = 'buhphone.exe (*.exe)|*.exe'");
+ Диалог.Фильтр = Фильтр;
+ Диалог.МножественныйВыбор = Ложь;
+
+ Оповещение = Новый ОписаниеОповещения("ВыбратьФайл1СБухфонЗавершение", ЭтотОбъект, ДополнительныеПараметры);
+ Диалог.Показать(Оповещение);
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+Процедура ВыбратьФайл1СБухфонЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
+ Если ВыбранныеФайлы <> Неопределено И ВыбранныеФайлы.Количество() > 0 Тогда
+ ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗакрытии, ВыбранныеФайлы[0]);
+ Иначе
+ ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗакрытии, "");
+ КонецЕсли;
+КонецПроцедуры
+
+// Проверяет наличие исполняемого файла по указанному пути.
+//
+// Возвращаемое значение:
+// Булево - При значении Истина файл запустится по указанному пути.
+//
+Процедура НаличиеФайла1СБухфон(ОповещениеОЗакрытии, Путь)
+ Оповещение = Новый ОписаниеОповещения("НаличиеФайла1СБухфонПослеИнициализацииФайла", ЭтотОбъект, ОповещениеОЗакрытии);
+ ПроверяемыйФайл = Новый Файл();
+ ПроверяемыйФайл.НачатьИнициализацию(Оповещение, Путь);
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+Процедура НаличиеФайла1СБухфонПослеИнициализацииФайла(Файл, ОповещениеОЗакрытии) Экспорт
+ Оповещение = Новый ОписаниеОповещения("НаличиеФайла1СБухфонПослеПроверкиСуществования", ЭтотОбъект, ОповещениеОЗакрытии);
+ Файл.НачатьПроверкуСуществования(Оповещение);
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+Процедура НаличиеФайла1СБухфонПослеПроверкиСуществования(Существует, ОповещениеОЗакрытии) Экспорт
+ ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, Существует);
+КонецПроцедуры
+
// Процедура запускает исполняемый файл 1С-Бухфон.
// При отсутствии файла 1С-Бухфон - открывает форму поиска пути к исполняемому файлу.
//
@@ -128,61 +149,74 @@
Возврат
КонецЕсли;
- #Если ВебКлиент Тогда
- Оповещение = Новый ОписаниеОповещения("Запустить1СБухфонЗавершение", Интеграция1СБухфонКлиент);
- ТекстСообщения = НСтр("ru = 'Для запуска 1С-Бухфон необходимо установить расширение работы с файлами.'");
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстСообщения, Ложь);
- #Иначе
- Запустить1СБухфонЗавершение();
- #КонецЕсли
+ Оповещение = Новый ОписаниеОповещения("Запустить1СБухфонПослеУстановкиРасширения", ЭтотОбъект);
+ ТекстСообщения = НСтр("ru = 'Для запуска 1С-Бухфон необходимо установить расширение работы с файлами.'");
+ ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстСообщения, Ложь);
КонецПроцедуры
-// Данная процедура вызывается из процедуры Запустить1СБухфон(Команда) непосредственно
-// в тонком/толстом клиенте, или через ОписаниеОповещения после установки расширения
-// работы с файлами в веб-клиенте.
-// При отсутствии файла 1С-Бухфон - открывает форму поиска пути к исполняемому файлу.
-//
-Процедура Запустить1СБухфонЗавершение(РасширениеПодключено = Истина, ДополнительныеПараметры = Неопределено) Экспорт
+// Продолжение процедуры (см. выше).
+Процедура Запустить1СБухфонПослеУстановкиРасширения(РасширениеПодключено, ДополнительныеПараметры) Экспорт
Если НЕ РасширениеПодключено Тогда
Возврат;
КонецЕсли;
// Определение параметров запуска.
- ИдентификаторКлиента = ИдентификаторКлиента();
+ ИдентификаторКлиента = ИдентификаторКлиента();
ПутьИзРеестра = ПутьКИсполняемомуФайлуИзРеестраWindows();
- ПутьИзХранилища = Интеграция1СБухфонВызовСервера.РасположениеИсполняемогоФайла(ИдентификаторКлиента);
- ПутьИзРеестраВерен = НаличиеФайла1СБухфон(ПутьИзРеестра);
- ПутьИзХранилищаВерен = НаличиеФайла1СБухфон(ПутьИзХранилища);
+ ПутьИзХранилища = Интеграция1СБухфонВызовСервера.РасположениеИсполняемогоФайла(ИдентификаторКлиента);
+
+ ДополнительныеПараметры = Новый Структура;
+ ДополнительныеПараметры.Вставить("ПутьИзРеестра", ПутьИзРеестра);
+ ДополнительныеПараметры.Вставить("ПутьИзХранилища", ПутьИзХранилища);
+
+ Оповещение = Новый ОписаниеОповещения("Запустить1СБухфонПослеПроверкиПутиИзРеестра", ЭтотОбъект, ДополнительныеПараметры);
+ НаличиеФайла1СБухфон(Оповещение, ПутьИзРеестра);
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+Процедура Запустить1СБухфонПослеПроверкиПутиИзРеестра(ПутьИзРеестраВерен, ДополнительныеПараметры) Экспорт
+
+ ДополнительныеПараметры.Вставить("ПутьИзРеестраВерен", ПутьИзРеестраВерен);
+ Оповещение = Новый ОписаниеОповещения("Запустить1СБухфонПослеПроверкиПутиИзХранилища", ЭтотОбъект, ДополнительныеПараметры);
+ НаличиеФайла1СБухфон(Оповещение, ДополнительныеПараметры.ПутьИзХранилища);
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+Процедура Запустить1СБухфонПослеПроверкиПутиИзХранилища(ПутьИзХранилищаВерен, ДополнительныеПараметры) Экспорт
+
УчетнаяЗапись = Интеграция1СБухфонВызовСервера.НастройкиУчетнойЗаписиПользователя();
ПараметрыЗапуска1СБухфон = " /StartedFrom1CConf";
- Если УчетнаяЗапись.ИспользоватьЛП Тогда
-
+ Оповещение = Новый ОписаниеОповещения("Запустить1СБухфонПослеЗапускаПриложения", ЭтотОбъект);
+ Если УчетнаяЗапись.ИспользоватьЛП Тогда
+
Если УчетнаяЗапись.Логин <> "" И УчетнаяЗапись.Пароль <> "" Тогда
ПараметрыЗапуска1СБухфон = ПараметрыЗапуска1СБухфон + " /login:" + УчетнаяЗапись.Логин + " /password:" + УчетнаяЗапись.Пароль;
КонецЕсли;
Если ПутьИзХранилищаВерен Тогда
- ЗапуститьПриложение(ПутьИзХранилища + ПараметрыЗапуска1СБухфон);
+ НачатьЗапускПриложения(Оповещение, ДополнительныеПараметры.ПутьИзХранилища + ПараметрыЗапуска1СБухфон);
Возврат;
КонецЕсли;
- Если ПутьИзРеестраВерен Тогда
- ЗапуститьПриложение(ПутьИзРеестра + ПараметрыЗапуска1СБухфон);
+ Если ДополнительныеПараметры.ПутьИзРеестраВерен Тогда
+ НачатьЗапускПриложения(Оповещение, ДополнительныеПараметры.ПутьИзРеестра + ПараметрыЗапуска1СБухфон);
Возврат;
- КонецЕсли;
+ КонецЕсли;
- Иначе
+ Иначе
Если ПутьИзХранилищаВерен Тогда
- ЗапуститьПриложение(ПутьИзХранилища + ПараметрыЗапуска1СБухфон);
+ НачатьЗапускПриложения(Оповещение, ДополнительныеПараметры.ПутьИзХранилища + ПараметрыЗапуска1СБухфон);
Возврат;
КонецЕсли;
- Если ПутьИзРеестраВерен Тогда
- ЗапуститьПриложение(ПутьИзРеестра + ПараметрыЗапуска1СБухфон);
+ Если ДополнительныеПараметры.ПутьИзРеестраВерен Тогда
+ НачатьЗапускПриложения(Оповещение, ДополнительныеПараметры.ПутьИзРеестра + ПараметрыЗапуска1СБухфон);
Возврат;
КонецЕсли;
@@ -192,6 +226,11 @@
КонецПроцедуры
+// Продолжение процедуры (см. выше).
+Процедура Запустить1СБухфонПослеЗапускаПриложения(КодВозврата, ДополнительныеПараметры) Экспорт
+ // Обработка не требуется.
+КонецПроцедуры
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/ИнтеграцияСтандартныхПодсистем/Module.bsl b/SSL/src/CommonModules/ИнтеграцияСтандартныхПодсистем/Module.bsl
index ebf3666bb..684252849 100644
--- a/SSL/src/CommonModules/ИнтеграцияСтандартныхПодсистем/Module.bsl
+++ b/SSL/src/CommonModules/ИнтеграцияСтандартныхПодсистем/Module.bsl
@@ -19,11 +19,13 @@
Процедура ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты) Экспорт
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
- Объекты.Вставить(Метаданные.Справочники["ВидыКонтактнойИнформации"].ПолноеИмя(), "");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформациейСлужебный");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
- Объекты.Вставить(Метаданные.ПланыВидовХарактеристик["ДополнительныеРеквизитыИСведения"].ПолноеИмя(), "");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты);
КонецЕсли;
КонецПроцедуры
@@ -43,129 +45,108 @@
// Каждое имя должно начинаться с новой строки.
// Если указана пустая строка, значит в модуле менеджера определены обе функции.
//
-Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
- Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БазоваяФункциональность") Тогда
- Объекты.Вставить(Метаданные.Справочники["ИдентификаторыОбъектовМетаданных"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- КонецЕсли;
+ СтандартныеПодсистемыСервер.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Анкетирование") Тогда
- Объекты.Вставить(Метаданные.Документы["Анкета"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Документы["НазначениеОпросов"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.ПланыВидовХарактеристик["ВопросыДляАнкетирования"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["ВариантыОтветовАнкет"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["ВопросыШаблонаАнкеты"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["ШаблоныАнкет"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("Анкетирование");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда
- Объекты.Вставить(Метаданные.Справочники["КлассификаторБанковРФ"].ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСБанками");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда
- Объекты.Вставить(Метаданные.БизнесПроцессы["Задание"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Задачи["ЗадачаИсполнителя"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.ПланыВидовХарактеристик["ОбъектыАдресацииЗадач"].ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["ГруппыИсполнителейЗадач"].ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["РолиИсполнителей"].ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда
- Объекты.Вставить(Метаданные.Документы["Встреча"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Документы["ТелефонныйЗвонок"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Документы["ЗапланированноеВзаимодействие"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Документы["ЭлектронноеПисьмоВходящее"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Документы["ЭлектронноеПисьмоИсходящее"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Документы["СообщениеSMS"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["ВстречаПрисоединенныеФайлы"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["ЗакладкиВзаимодействий"].ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["ЗапланированноеВзаимодействиеПрисоединенныеФайлы"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["ПапкиЭлектронныхПисем"].ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["ПравилаОбработкиЭлектроннойПочты"].ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["СообщениеSMSПрисоединенныеФайлы"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["СтроковыеКонтактыВзаимодействий"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["ТелефонныйЗвонокПрисоединенныеФайлы"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["ЭлектронноеПисьмоВходящееПрисоединенныеФайлы"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("Взаимодействия");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда
- Объекты.Вставить(Метаданные.Справочники["Валюты"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда
- Объекты.Вставить(Метаданные.Справочники["ВариантыОтчетов"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["ПользовательскиеНастройкиОтчетов"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["ПредопределенныеВариантыОтчетов"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда
- Объекты.Вставить(Метаданные.Справочники["ДополнительныеОтчетыИОбработки"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаметкиПользователя") Тогда
- Объекты.Вставить(Метаданные.Справочники["Заметки"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("ЗаметкиПользователяСлужебный");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
- Объекты.Вставить(Метаданные.Справочники["ВидыКонтактнойИнформации"].ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформациейСлужебный");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда
- Объекты.Вставить(Метаданные.Справочники["СценарииОбменовДанными"].ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Организации") Тогда
- Объекты.Вставить(Метаданные.Справочники["Организации"].ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("ОрганизацииСлужебный");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Пользователи") Тогда
- Объекты.Вставить(Метаданные.Справочники["ВнешниеПользователи"].ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["ГруппыВнешнихПользователей"].ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["Пользователи"].ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебный");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
- Объекты.Вставить(Метаданные.Справочники["ПапкиФайлов"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["Файлы"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда
- Объекты.Вставить(Метаданные.Справочники["РассылкиОтчетов"].ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда
- Объекты.Вставить(Метаданные.Справочники["УчетныеЗаписиЭлектроннойПочты"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- КонецЕсли;
-
- Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
- Объекты.Вставить(Метаданные.Справочники["ВерсииФайлов"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
- Объекты.Вставить(Метаданные.ПланыВидовХарактеристик["ДополнительныеРеквизитыИСведения"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["ЗначенияСвойствОбъектов"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["ЗначенияСвойствОбъектовИерархия"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["НаборыДополнительныхРеквизитовИСведений"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
-
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда
- Объекты.Вставить(Метаданные.Справочники["СообщенияСистемы"].ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("ОбменСообщениями");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
- Объекты.Вставить(Метаданные.Справочники["ГруппыДоступа"].ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["ПрофилиГруппДоступа"].ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда
- Объекты.Вставить(Метаданные.Справочники["ТомаХраненияФайлов"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебный");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
- Объекты.Вставить(Метаданные.Справочники["ПрограммыЭлектроннойПодписиИШифрования"].ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
- Объекты.Вставить(Метаданные.Справочники["СертификатыКлючейЭлектроннойПодписиИШифрования"].ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+ МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный");
+ МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты);
КонецЕсли;
КонецПроцедуры
diff --git a/SSL/src/CommonModules/ИнтерфейсыСообщенийВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ИнтерфейсыСообщенийВМоделиСервиса/Module.bsl
index c1342e3b1..e829b5ac6 100644
--- a/SSL/src/CommonModules/ИнтерфейсыСообщенийВМоделиСервиса/Module.bsl
+++ b/SSL/src/CommonModules/ИнтерфейсыСообщенийВМоделиСервиса/Module.bsl
@@ -190,13 +190,7 @@
Результат = Новый Соответствие();
МассивОбработчиков = ПолучитьОбработчикиИнтерфейсовОтправляемыхСообщений();
Для Каждого Обработчик Из МассивОбработчиков Цикл
-
- Попытка
- Результат.Вставить(Обработчик.Пакет(), Обработчик.ПрограммныйИнтерфейс());
- Исключение
- // Обработчик может не экспортировать программный интерфейс.
- КонецПопытки;
-
+ Результат.Вставить(Обработчик.Пакет(), Обработчик.ПрограммныйИнтерфейс());
КонецЦикла;
Возврат Новый ФиксированноеСоответствие(Результат);
@@ -216,13 +210,7 @@
Результат = Новый Соответствие();
МассивОбработчиков = ПолучитьОбработчикиИнтерфейсовОтправляемыхСообщений();
Для Каждого Обработчик Из МассивОбработчиков Цикл
-
- Попытка
- Результат.Вставить(Обработчик.ПрограммныйИнтерфейс(), Обработчик.Версия());
- Исключение
- // Обработчик может не экспортировать программный интерфейс.
- КонецПопытки;
-
+ Результат.Вставить(Обработчик.ПрограммныйИнтерфейс(), Обработчик.Версия());
КонецЦикла;
Возврат Новый ФиксированноеСоответствие(Результат);
diff --git a/SSL/src/CommonModules/ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый/Module.bsl b/SSL/src/CommonModules/ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый/Module.bsl
index bcb266c20..c5fbb9002 100644
--- a/SSL/src/CommonModules/ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый/Module.bsl
+++ b/SSL/src/CommonModules/ИнтерфейсыСообщенийВМоделиСервисаПереопределяемый/Module.bsl
@@ -10,7 +10,7 @@
// принимаемых сообщений.
//
// Параметры:
-// МассивОбработчиков - массив
+// МассивОбработчиков - массив.
//
Процедура ЗаполнитьОбработчикиПринимаемыхСообщений(МассивОбработчиков) Экспорт
@@ -20,7 +20,7 @@
// отправляемых сообщений.
//
// Параметры:
-// МассивОбработчиков - массив
+// МассивОбработчиков - массив.
//
Процедура ЗаполнитьОбработчикиОтправляемыхСообщений(МассивОбработчиков) Экспорт
diff --git a/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl b/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl
index 612e06009..0928cc763 100644
--- a/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl
+++ b/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl
@@ -17,18 +17,40 @@
"ИнформацияПриЗапускеКлиент");
// СЕРВЕРНЫЕ ОБРАБОТЧИКИ.
+ СерверныйМодуль = "ИнформацияПриЗапуске";
- СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПослеОбновленияИнформационнойБазы"].Добавить(
- "ИнформацияПриЗапуске");
+ Событие = "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления";
+ СерверныеОбработчики[Событие].Добавить(СерверныйМодуль);
- СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистемПриЗапуске"].Добавить(
- "ИнформацияПриЗапуске");
+ Событие = "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПослеОбновленияИнформационнойБазы";
+ СерверныеОбработчики[Событие].Добавить(СерверныйМодуль);
+
+ Событие = "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистемПриЗапуске";
+ СерверныеОбработчики[Событие].Добавить(СерверныйМодуль);
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Обработчики служебных событий.
+// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме.
+//
+// Параметры:
+// Обработчики - ТаблицаЗначений - Обработчики обновления.
+// См. описание метода ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления().
+//
+Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
+ Обработчик = Обработчики.Добавить();
+ Обработчик.ВыполнятьВГруппеОбязательных = Ложь;
+ Обработчик.ОбщиеДанные = Истина;
+ Обработчик.УправлениеОбработчиками = Ложь;
+ Обработчик.РежимВыполнения = "Оперативно";
+ Обработчик.Версия = "*";
+ Обработчик.Процедура = "ИнформацияПриЗапуске.ОперативноеОбновлениеОбщихДанных";
+ Обработчик.Комментарий = НСтр("ru = 'Актуализирует данные первого показа.'");
+ Обработчик.Приоритет = 100;
+КонецПроцедуры
+
// Вызывается после завершения монопольного обновления данных ИБ.
//
// Параметры:
@@ -73,6 +95,55 @@
Параметры.Вставить("ИнформацияПриЗапуске", Новый ФиксированнаяСтруктура(ГлобальныеНастройки()));
КонецПроцедуры
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+////////////////////////////////////////////////////////////////////////////////
+// Обновление информационной базы.
+
+// [*] Актуализирует данные первого показа.
+Процедура ОперативноеОбновлениеОбщихДанных() Экспорт
+
+ ОбновитьКэшПервогоПоказа(Обработки.ИнформацияПриЗапуске);
+
+КонецПроцедуры
+
+////////////////////////////////////////////////////////////////////////////////
+// Служебные процедуры и функции.
+
+// [*] Актуализирует данные первого показа.
+Процедура ОбновитьКэшПервогоПоказа(НосительМакетов) Экспорт
+
+ Кэш = КэшДляПервогоПоказа(НосительМакетов);
+ Приоритетные = Кэш.Приоритетные;
+ Кэш.Удалить("Приоритетные");
+
+ НомерПакета = 0;
+ НаборЗаписей = РегистрыСведений.ПакетыИнформацииПриЗапуске.СоздатьНаборЗаписей();
+
+ ПодготовленныеПакеты = Новый Соответствие;
+ Для Каждого ИмяМакета Из Приоритетные Цикл
+ СоставПакета = ИзвлечьФайлыПакета(НосительМакетов, ИмяМакета);
+
+ НомерПакета = НомерПакета + 1;
+ ИмяПакета = "ПодготовленныйПакет" + Формат(НомерПакета, "ЧН=; ЧГ=");
+
+ Запись = НаборЗаписей.Добавить();
+ Запись.Номер = НомерПакета;
+ Запись.Состав = Новый ХранилищеЗначения(СоставПакета);
+ ПодготовленныеПакеты.Вставить(ИмяМакета, НомерПакета);
+ КонецЦикла;
+ Кэш.Вставить("ПодготовленныеПакеты", ПодготовленныеПакеты);
+
+ Запись = НаборЗаписей.Добавить();
+ Запись.Номер = 0;
+ Запись.Состав = Новый ХранилищеЗначения(Кэш);
+
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборЗаписей, Ложь, Ложь);
+
+КонецПроцедуры
+
// Глобальные настройки подсистемы.
Функция ГлобальныеНастройки()
Настройки = Новый Структура;
@@ -118,4 +189,190 @@
Возврат Настройки;
КонецФункции
-#КонецОбласти
+// Глобальные настройки подсистемы.
+Функция КэшДляПервогоПоказа(НосительМакетов) Экспорт
+ Кэш = Новый Структура;
+
+ // Чтение макета "Описатель" (наполнение таблицы "ПакетыСтраниц").
+ ТабличныйДокумент = НосительМакетов.ПолучитьМакет("Описатель");
+
+ ПакетыСтраниц = Новый ТаблицаЗначений;
+ ПакетыСтраниц.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
+ ПакетыСтраниц.Колонки.Добавить("ИмяМакета", Новый ОписаниеТипов("Строка"));
+ ПакетыСтраниц.Колонки.Добавить("Раздел", Новый ОписаниеТипов("Строка"));
+ ПакетыСтраниц.Колонки.Добавить("НаименованиеСтартовойСтраницы", Новый ОписаниеТипов("Строка"));
+ ПакетыСтраниц.Колонки.Добавить("ИмяФайлаСтартовойСтраницы", Новый ОписаниеТипов("Строка"));
+ ПакетыСтраниц.Колонки.Добавить("ДатаНачалаПоказа", Новый ОписаниеТипов("Дата"));
+ ПакетыСтраниц.Колонки.Добавить("ДатаОкончанияПоказа", Новый ОписаниеТипов("Дата"));
+ ПакетыСтраниц.Колонки.Добавить("Приоритет", Новый ОписаниеТипов("Число"));
+
+ МинимальныйПриоритет = 100;
+ Приоритетные = Новый Массив;
+
+ КонфигурацияБазовая = СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации();
+ КонфигурацияМоделиСервиса = ОбщегоНазначенияПовтИсп.РазделениеВключено()
+ Или ПолучитьФункциональнуюОпцию("РаботаВАвтономномРежиме");
+
+ Для НомерСтроки = 3 По ТабличныйДокумент.ВысотаТаблицы Цикл
+ ПрефиксСтроки = "R"+ НомерСтроки +"C";
+
+ // Чтение данных первой колонки.
+ ИмяМакета = ДанныеЯчейки(ТабличныйДокумент, ПрефиксСтроки, 1, , "КонецТаблицы");
+ Если ВРег(ИмяМакета) = ВРег("КонецТаблицы") Тогда
+ Прервать;
+ КонецЕсли;
+
+ // Пропуск если данные не подходят к конфигурации.
+ Если КонфигурацияБазовая Тогда
+ ПоказыватьВБазовой = ДанныеЯчейки(ТабличныйДокумент, ПрефиксСтроки, 9, "Булево", Истина);
+ Если Не ПоказыватьВБазовой Тогда
+ Продолжить;
+ КонецЕсли;
+ ИначеЕсли КонфигурацияМоделиСервиса Тогда
+ ПоказыватьВМоделиСервиса = ДанныеЯчейки(ТабличныйДокумент, ПрефиксСтроки, 10, "Булево", Истина);
+ Если Не ПоказыватьВМоделиСервиса Тогда
+ Продолжить;
+ КонецЕсли;
+ Иначе
+ ПоказыватьВПроф = ДанныеЯчейки(ТабличныйДокумент, ПрефиксСтроки, 8, "Булево", Истина);
+ Если Не ПоказыватьВПроф Тогда
+ Продолжить;
+ КонецЕсли;
+ КонецЕсли;
+
+ // Регистрация информации о команде.
+ ПакетСтраниц = ПакетыСтраниц.Добавить();
+ ПакетСтраниц.ИмяМакета = ИмяМакета;
+ ПакетСтраниц.Идентификатор = Строка(НомерСтроки - 2);
+ ПакетСтраниц.Раздел = ДанныеЯчейки(ТабличныйДокумент, ПрефиксСтроки, 2);
+ ПакетСтраниц.НаименованиеСтартовойСтраницы = ДанныеЯчейки(ТабличныйДокумент, ПрефиксСтроки, 3);
+ ПакетСтраниц.ИмяФайлаСтартовойСтраницы = ДанныеЯчейки(ТабличныйДокумент, ПрефиксСтроки, 4);
+ ПакетСтраниц.ДатаНачалаПоказа = ДанныеЯчейки(ТабличныйДокумент, ПрефиксСтроки, 5, "Дата", '00010101');
+ ПакетСтраниц.ДатаОкончанияПоказа = ДанныеЯчейки(ТабличныйДокумент, ПрефиксСтроки, 6, "Дата", '29990101');
+
+ Если НРег(ПакетСтраниц.Раздел) = НРег(НСтр("ru = 'Реклама'")) Тогда
+ ПакетСтраниц.Приоритет = 0;
+ Иначе
+ ПакетСтраниц.Приоритет = ДанныеЯчейки(ТабличныйДокумент, ПрефиксСтроки, 7, "Число", 0);
+ Если ПакетСтраниц.Приоритет = 0 Тогда
+ ПакетСтраниц.Приоритет = 99;
+ КонецЕсли;
+ КонецЕсли;
+
+ Если МинимальныйПриоритет > ПакетСтраниц.Приоритет Тогда
+ МинимальныйПриоритет = ПакетСтраниц.Приоритет;
+ Приоритетные = Новый Массив;
+ Приоритетные.Добавить(ПакетСтраниц.ИмяМакета);
+ ИначеЕсли МинимальныйПриоритет = ПакетСтраниц.Приоритет
+ И Приоритетные.Найти(ПакетСтраниц.ИмяМакета) = Неопределено Тогда
+ Приоритетные.Добавить(ПакетСтраниц.ИмяМакета);
+ КонецЕсли;
+ КонецЦикла;
+
+ Кэш.Вставить("ПакетыСтраниц", ПакетыСтраниц);
+ Кэш.Вставить("Приоритетные", Приоритетные);
+ Возврат Кэш;
+КонецФункции
+
+// Считывает из табличного документа содержимое ячейки и приводит к указанному типу.
+Функция ДанныеЯчейки(ТабличныйДокумент, ПрефиксСтроки, НомерКолонки, Тип = "Строка", ЗначениеПоУмолчанию = "")
+ Результат = СокрЛП(ТабличныйДокумент.Область(ПрефиксСтроки + Строка(НомерКолонки)).Текст);
+ Если ПустаяСтрока(Результат) Тогда
+ Возврат ЗначениеПоУмолчанию;
+ ИначеЕсли Тип = "Число" Тогда
+ Возврат Число(Результат);
+ ИначеЕсли Тип = "Дата" Тогда
+ Возврат Дата(Результат);
+ ИначеЕсли Тип = "Булево" Тогда
+ Возврат Результат <> "0";
+ Иначе
+ Возврат Результат;
+ КонецЕсли;
+КонецФункции
+
+// Извлекает пакет файлов из макета обработки ИнформацияПриЗапуске.
+Функция ИзвлечьФайлыПакета(НосительМакетов, ИмяМакета) Экспорт
+ КаталогВременныхФайлов = СтандартныеПодсистемыСервер.СоздатьКаталогВременныхФайлов("extras");
+
+ // Извлечение страницы
+ АрхивПолноеИмя = КаталогВременныхФайлов + "tmp.zip";
+ Попытка
+ ДвоичныеДанные = НосительМакетов.ПолучитьМакет(ИмяМакета);
+ ДвоичныеДанные.Записать(АрхивПолноеИмя);
+ Исключение
+ ЗаписьЖурналаРегистрации(
+ НСтр("ru = 'Информация при запуске'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка,
+ ,
+ ,
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+ Возврат Неопределено;
+ КонецПопытки;
+
+ ЧтениеZipФайла = Новый ЧтениеZipФайла(АрхивПолноеИмя);
+ ЧтениеZipФайла.ИзвлечьВсе(КаталогВременныхФайлов, РежимВосстановленияПутейФайловZIP.Восстанавливать);
+ ЧтениеZipФайла.Закрыть();
+ ЧтениеZipФайла = Неопределено;
+
+ УдалитьФайлы(АрхивПолноеИмя);
+
+ Картинки = Новый ТаблицаЗначений;
+ Картинки.Колонки.Добавить("ОтносительноеИмя", Новый ОписаниеТипов("Строка"));
+ Картинки.Колонки.Добавить("ОтносительныйКаталог", Новый ОписаниеТипов("Строка"));
+ Картинки.Колонки.Добавить("Данные");
+
+ ВебСтраницы = Новый ТаблицаЗначений;
+ ВебСтраницы.Колонки.Добавить("ОтносительноеИмя", Новый ОписаниеТипов("Строка"));
+ ВебСтраницы.Колонки.Добавить("ОтносительныйКаталог", Новый ОписаниеТипов("Строка"));
+ ВебСтраницы.Колонки.Добавить("Данные");
+
+ // Регистрация ссылок страниц и создание списка картинок.
+ КаталогиФайлов = Новый СписокЗначений;
+ КаталогиФайлов.Добавить(КаталогВременныхФайлов, "");
+ Осталось = 1;
+ Пока Осталось > 0 Цикл
+ Осталось = Осталось - 1;
+ Каталог = КаталогиФайлов[0];
+ КаталогПолныйПуть = Каталог.Значение; // Полный путь в формате файловой системы.
+ КаталогОтносительныйПуть = Каталог.Представление; // Относительный путь в URL формате.
+ КаталогиФайлов.Удалить(0);
+
+ Найденные = НайтиФайлы(КаталогПолныйПуть, "*", Ложь);
+ Для Каждого Файл Из Найденные Цикл
+ ФайлОтносительноеИмя = КаталогОтносительныйПуть + Файл.Имя;
+
+ Если Файл.ЭтоКаталог() Тогда
+ Осталось = Осталось + 1;
+ КаталогиФайлов.Добавить(Файл.ПолноеИмя, ФайлОтносительноеИмя + "/");
+ Продолжить;
+ КонецЕсли;
+
+ Расширение = СтрЗаменить(НРег(Файл.Расширение), ".", "");
+
+ Если Расширение = "htm" ИЛИ Расширение = "html" Тогда
+ РазмещениеФайла = ВебСтраницы.Добавить();
+ ЧтениеТекста = Новый ЧтениеТекста(Файл.ПолноеИмя);
+ Данные = ЧтениеТекста.Прочитать();
+ ЧтениеТекста.Закрыть();
+ ЧтениеТекста = Неопределено;
+ Иначе
+ РазмещениеФайла = Картинки.Добавить();
+ Данные = Новый Картинка(Новый ДвоичныеДанные(Файл.ПолноеИмя));
+ КонецЕсли;
+ РазмещениеФайла.ОтносительноеИмя = ФайлОтносительноеИмя;
+ РазмещениеФайла.ОтносительныйКаталог = КаталогОтносительныйПуть;
+ РазмещениеФайла.Данные = Данные;
+ КонецЦикла;
+ КонецЦикла;
+
+ // Удаление временных файлов (все файлы были помещены во временные хранилища).
+ СтандартныеПодсистемыСервер.ОчиститьКаталогВременныхФайлов(КаталогВременныхФайлов);
+
+ Результат = Новый Структура;
+ Результат.Вставить("Картинки", Картинки);
+ Результат.Вставить("ВебСтраницы", ВебСтраницы);
+
+ Возврат Результат;
+КонецФункции
+
+#КонецОбласти
\ No newline at end of file
diff --git a/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl b/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl
index 1fd1862fa..a19a98caa 100644
--- a/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl
+++ b/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl
@@ -672,6 +672,12 @@
Обработчик.РежимВыполнения = "Монопольно";
Обработчик.ОбщиеДанные = Истина;
+ Обработчик = Обработчики.Добавить();
+ Обработчик.Версия = "2.2.5.23";
+ Обработчик.Процедура = "КалендарныеГрафики.УдалитьОшибочныеДанныеПроизводственногоКалендаря";
+ Обработчик.РежимВыполнения = "Монопольно";
+ Обработчик.ОбщиеДанные = Истина;
+
КонецПроцедуры
// Обновляет справочник Производственные календари из одноименного макета.
@@ -708,4 +714,74 @@
КонецПроцедуры
+// Удаляет ошибочно добавленные записи регистра сведений с упоминанием дат, не относящихся к данным годов.
+//
+Процедура УдалитьОшибочныеДанныеПроизводственногоКалендаря() Экспорт
+
+ Запрос = Новый Запрос;
+ Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
+
+ Запрос.Текст =
+ "ВЫБРАТЬ РАЗЛИЧНЫЕ
+ | ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь,
+ | ДанныеПроизводственногоКалендаря.Год
+ |ПОМЕСТИТЬ ВТОшибочныеДанные
+ |ИЗ
+ | РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
+ |ГДЕ
+ | ДанныеПроизводственногоКалендаря.Год <> ГОД(ДанныеПроизводственногоКалендаря.Дата)
+ |;
+ |
+ |////////////////////////////////////////////////////////////////////////////////
+ |ВЫБРАТЬ
+ | ДанныеКалендаря.ПроизводственныйКалендарь,
+ | ДанныеКалендаря.Дата,
+ | ДанныеКалендаря.Год,
+ | ДанныеКалендаря.ВидДня,
+ | ДанныеКалендаря.ДатаПереноса
+ |ИЗ
+ | РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеКалендаря
+ | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТОшибочныеДанные КАК ОшибочныеДанные
+ | ПО (ОшибочныеДанные.ПроизводственныйКалендарь = ДанныеКалендаря.ПроизводственныйКалендарь)
+ | И (ОшибочныеДанные.Год = ДанныеКалендаря.Год)
+ | И (ГОД(ДанныеКалендаря.Дата) = ДанныеКалендаря.Год)
+ |
+ |УПОРЯДОЧИТЬ ПО
+ | ДанныеКалендаря.ПроизводственныйКалендарь,
+ | ДанныеКалендаря.Год";
+
+ РезультатЗапроса = Запрос.Выполнить();
+ Если РезультатЗапроса.Пустой() Тогда
+ Возврат;
+ КонецЕсли;
+
+ Выборка = РезультатЗапроса.Выбрать();
+ Пока Выборка.СледующийПоЗначениюПоля("ПроизводственныйКалендарь") Цикл
+ Пока Выборка.СледующийПоЗначениюПоля("Год") Цикл
+ НаборЗаписей = РегистрыСведений.ДанныеПроизводственногоКалендаря.СоздатьНаборЗаписей();
+ Пока Выборка.Следующий() Цикл
+ ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), Выборка);
+ КонецЦикла;
+ НаборЗаписей.Отбор.ПроизводственныйКалендарь.Установить(Выборка.ПроизводственныйКалендарь);
+ НаборЗаписей.Отбор.Год.Установить(Выборка.Год);
+ НаборЗаписей.ОбменДанными.Загрузка = Истина;
+ НаборЗаписей.Записать();
+ КонецЦикла;
+ КонецЦикла;
+
+ // Обновляем связанные графики работы.
+ Запрос.Текст =
+ "ВЫБРАТЬ
+ | ПроизводственныеКалендари.Код КАК КодПроизводственногоКалендаря,
+ | ОшибочныеДанные.Год
+ |ИЗ
+ | ВТОшибочныеДанные КАК ОшибочныеДанные
+ | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПроизводственныеКалендари КАК ПроизводственныеКалендари
+ | ПО ОшибочныеДанные.ПроизводственныйКалендарь = ПроизводственныеКалендари.Ссылка";
+
+ ТаблицаДанных = Запрос.Выполнить().Выгрузить();
+ Справочники.ПроизводственныеКалендари.РаспространитьИзмененияДанныхПроизводственныхКалендарей(ТаблицаДанных);
+
+КонецПроцедуры
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/КурсыВалютСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/КурсыВалютСлужебныйВМоделиСервиса/Module.bsl
index f3da2dc3d..e825c1eb3 100644
--- a/SSL/src/CommonModules/КурсыВалютСлужебныйВМоделиСервиса/Module.bsl
+++ b/SSL/src/CommonModules/КурсыВалютСлужебныйВМоделиСервиса/Module.bsl
@@ -353,8 +353,12 @@
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
ЗаписатьТаблицуКурсов(ТаблицаКурсов.НайтиСтроки(Новый Структура("Код", СтрокаКода.Код)), ИмяВременногоФайла);
- Дескриптор = Новый Структура("ВидДанных, ДатаДобавления, ИдентификаторФайла, Характеристики",
- "КурсыОднойВалюты", ТекущаяУниверсальнаяДата(), Новый УникальныйИдентификатор, Новый Массив);
+ Дескриптор = Новый Структура;
+ Дескриптор.Вставить("ВидДанных", "КурсыОднойВалюты");
+ Дескриптор.Вставить("ДатаДобавления", ТекущаяУниверсальнаяДата());
+ Дескриптор.Вставить("ИдентификаторФайла", Новый УникальныйИдентификатор);
+ Дескриптор.Вставить("Характеристики", Новый Массив);
+
Дескриптор.Характеристики.Добавить(Новый Структура("Код, Значение, Ключевая", "Валюта", СтрокаКода.Код, Истина));
ПоставляемыеДанные.СохранитьПоставляемыеДанныеВКэш(Дескриптор, ИмяВременногоФайла);
@@ -415,8 +419,12 @@
Данные = ПоставляемыеДанные.ПоставляемыеДанныеИзКэша(КэшТекущей.ИдентификаторФайла);
Данные.Записать(ИмяВременногоФайла);
Иначе
- КэшТекущей = Новый Структура("ВидДанных, ДатаДобавления, ИдентификаторФайла, Характеристики",
- "КурсыОднойВалюты", ТекущаяУниверсальнаяДата(), Новый УникальныйИдентификатор, Новый Массив);
+ КэшТекущей = Новый Структура;
+ КэшТекущей.Вставить("ВидДанных", "КурсыОднойВалюты");
+ КэшТекущей.Вставить("ДатаДобавления", ТекущаяУниверсальнаяДата());
+ КэшТекущей.Вставить("ИдентификаторФайла", Новый УникальныйИдентификатор);
+ КэшТекущей.Вставить("Характеристики", Новый Массив);
+
КэшТекущей.Характеристики.Добавить(Новый Структура("Код, Значение, Ключевая", "Валюта", СтрокаКурсов.Код, Истина));
КонецЕсли;
@@ -456,48 +464,61 @@
Для каждого ОбластьДанных Из ОбластиДляОбновления Цикл
- ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, ОбластьДанных);
-
- ЗапросВалюты = Новый Запрос;
- ЗапросВалюты.Текст =
- "ВЫБРАТЬ
- | Валюты.Ссылка,
- | Валюты.Код
- |ИЗ
- | Справочник.Валюты КАК Валюты
- |ГДЕ
- | Валюты.СпособУстановкиКурса = ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета)";
-
- ВыборкаВалюты = ЗапросВалюты.Выполнить().Выбрать();
- НачатьТранзакцию();
- Пока ВыборкаВалюты.Следующий() Цикл
-
- Курсы = ТаблицаКурсов.НайтиСтроки(Новый Структура("Код", ВыборкаВалюты.Код));
- Если Курсы.Количество() = 0 Тогда
- Продолжить;
- КонецЕсли;
-
- НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
- НаборЗаписей.Отбор.Валюта.Установить(ВыборкаВалюты.Ссылка);
- Если ДатаКурсов <> Неопределено Тогда
- НаборЗаписей.Отбор.Период.Установить(ДатаКурсов);
- Иначе
- // Блокируем неэффективное обновление связанных валют.
- НаборЗаписей.ОбменДанными.Загрузка = Истина;
- КонецЕсли;
+ Попытка
- Для каждого СтрокаКурсов Из Курсы Цикл
- Запись = НаборЗаписей.Добавить();
- Запись.Валюта = ВыборкаВалюты.Ссылка;
- Запись.Период = СтрокаКурсов.Дата;
- Запись.Кратность = СтрокаКурсов.Кратность;
- Запись.Курс = СтрокаКурсов.Курс;
- КонецЦикла;
- НаборЗаписей.Записать();
+ ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, ОбластьДанных);
- КонецЦикла;
- ПоставляемыеДанные.ОбластьОбработана(ИдентификаторФайла, КодОбработчика, ОбластьДанных);
- ЗафиксироватьТранзакцию();
+ ЗапросВалюты = Новый Запрос;
+ ЗапросВалюты.Текст =
+ "ВЫБРАТЬ
+ | Валюты.Ссылка,
+ | Валюты.Код
+ |ИЗ
+ | Справочник.Валюты КАК Валюты
+ |ГДЕ
+ | Валюты.СпособУстановкиКурса = ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета)";
+
+ ВыборкаВалюты = ЗапросВалюты.Выполнить().Выбрать();
+ НачатьТранзакцию();
+ Пока ВыборкаВалюты.Следующий() Цикл
+
+ Курсы = ТаблицаКурсов.НайтиСтроки(Новый Структура("Код", ВыборкаВалюты.Код));
+ Если Курсы.Количество() = 0 Тогда
+ Продолжить;
+ КонецЕсли;
+
+ НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
+ НаборЗаписей.Отбор.Валюта.Установить(ВыборкаВалюты.Ссылка);
+ Если ДатаКурсов <> Неопределено Тогда
+ НаборЗаписей.Отбор.Период.Установить(ДатаКурсов);
+ Иначе
+ // Блокируем неэффективное обновление связанных валют.
+ НаборЗаписей.ОбменДанными.Загрузка = Истина;
+ КонецЕсли;
+
+ Для каждого СтрокаКурсов Из Курсы Цикл
+ Запись = НаборЗаписей.Добавить();
+ Запись.Валюта = ВыборкаВалюты.Ссылка;
+ Запись.Период = СтрокаКурсов.Дата;
+ Запись.Кратность = СтрокаКурсов.Кратность;
+ Запись.Курс = СтрокаКурсов.Курс;
+ КонецЦикла;
+ НаборЗаписей.Записать();
+
+ КонецЦикла;
+ ПоставляемыеДанные.ОбластьОбработана(ИдентификаторФайла, КодОбработчика, ОбластьДанных);
+ ЗафиксироватьТранзакцию();
+
+ Исключение
+
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Поставляемые данные.Распространение курсов валют по областям данных'", Метаданные.ОсновнойЯзык.КодЯзыка),
+ УровеньЖурналаРегистрации.Ошибка,,,
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+
+ ОтменитьТранзакцию();
+
+ КонецПопытки;
+
КонецЦикла;
КонецПроцедуры
diff --git a/SSL/src/CommonModules/НапоминанияПользователяКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяКлиентПовтИсп/Module.bsl
index cecbcd2d9..ca4d596dd 100644
--- a/SSL/src/CommonModules/НапоминанияПользователяКлиентПовтИсп/Module.bsl
+++ b/SSL/src/CommonModules/НапоминанияПользователяКлиентПовтИсп/Module.bsl
@@ -7,7 +7,11 @@
// Возвращает форму текущих оповещений пользователя.
Функция ПолучитьФормуОповещения() Экспорт
+ #Если ВебКлиент Тогда
+ Возврат ПолучитьФорму("РегистрСведений.НапоминанияПользователя.Форма.ФормаОповещения");
+ #Иначе
Возврат ПолучитьФорму("РегистрСведений.НапоминанияПользователя.Форма.ФормаОповещения",,,,ВариантОткрытияОкна.ОтдельноеОкно);
+ #КонецЕсли
КонецФункции
// Выполняет запрос по напоминаниям для текущего пользователя на 30 минут вперед от текущего времени.
diff --git a/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебный/Module.bsl b/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебный/Module.bsl
index b31a15361..a48a0033b 100644
--- a/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебный/Module.bsl
@@ -241,7 +241,7 @@
КонецФункции
-Функция СоседнийЭлемент(ПеремещаемыйЭлемент, Список, Знач Направление)
+Функция СоседнийЭлемент(ПеремещаемыйЭлемент, Список, Знач Направление) Экспорт
// Подготовка текста запроса к основной таблице списка.
@@ -294,7 +294,8 @@
АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных);
КомпоновщикНастроекКомпоновкиДанных.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
КомпоновщикНастроекКомпоновкиДанных.ЗагрузитьНастройки(Список.КомпоновщикНастроек.ПолучитьНастройки());
-
+ КомпоновщикНастроекКомпоновкиДанных.Настройки.УсловноеОформление.Элементы.Очистить();
+
УстановитьНастройкуСтруктурыВыводаРезультата(КомпоновщикНастроекКомпоновкиДанных.Настройки);
Для Каждого Параметр Из Запрос.Параметры Цикл
@@ -302,6 +303,11 @@
Параметр.Ключ, Параметр.Значение);
КонецЦикла;
+ // Проверка доступности полей в отборе
+ Если Не ПоляОтбораВСпискеДоступных(КомпоновщикНастроекКомпоновкиДанных.ПолучитьНастройки().Отбор.Элементы, КомпоновщикНастроекКомпоновкиДанных.ПолучитьНастройки().Отбор.ДоступныеПоляОтбора.Элементы) Тогда
+ ВызватьИсключение НСтр("ru = 'Для перемещения элемента необходимо отключить все отборы в списке.'");
+ КонецЕсли;
+
// Вывод результата запроса
РезультатКомпоновки = Новый ТаблицаЗначений;
@@ -466,4 +472,27 @@
КонецФункции
+Функция ПолеОтбораВСпискеДоступных(ИмяПроверяемогоПоля, КоллекцияДоступныхПолейОтбора)
+ Для Каждого ПолеОтбора Из КоллекцияДоступныхПолейОтбора Цикл
+ Если ПолеОтбора.Поле = ИмяПроверяемогоПоля Тогда
+ Возврат Истина;
+ КонецЕсли;
+ КонецЦикла;
+ Возврат Ложь;
+КонецФункции
+
+Функция ПоляОтбораВСпискеДоступных(КоллекцияПроверяемыхОтборов, КоллекцияДоступныхПолей)
+ Результат = Истина;
+ Для Каждого ПолеОтбора Из КоллекцияПроверяемыхОтборов Цикл
+ Если ПолеОтбора.Использование Тогда
+ Если ТипЗнч(ПолеОтбора) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
+ Результат = Результат И ПоляОтбораВСпискеДоступных(ПолеОтбора.Элементы, КоллекцияДоступныхПолей);
+ Иначе
+ Результат = Результат И ПолеОтбораВСпискеДоступных(ПолеОтбора.ЛевоеЗначение, КоллекцияДоступныхПолей);
+ КонецЕсли;
+ КонецЕсли;
+ КонецЦикла;
+ Возврат Результат;
+КонецФункции
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl
new file mode 100644
index 000000000..0919f4382
--- /dev/null
+++ b/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl
@@ -0,0 +1,4663 @@
+////////////////////////////////////////////////////////////////////////////////
+// Подсистема "Обмен данными".
+// Процедуры и функции для выгрузки и загрузки данных в XML-схему.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#Область ПрограммныйИнтерфейс
+
+#Область ИнициализацияОбмена
+// Добавляет строку в таблицу правил конвертации и инициализирует значение в колонке "Свойства".
+// Используется в модуле менеджера обмена при заполнении таблицы правил конвертации объектов.
+//
+// Параметры:
+// ПравилаКонвертации - таблица значений.
+//
+// Возвращаемое значение
+// Строка таблицы значений правил конвертации.
+//
+Функция ИнициализироватьПравилоКонвертацииОбъекта(ПравилаКонвертации) Экспорт
+
+ ПравилоКонвертации = ПравилаКонвертации.Добавить();
+ ПравилоКонвертации.Свойства = ИнициализироватьТаблицуСвойствДляПравилаКонвертации();
+ Возврат ПравилоКонвертации;
+
+КонецФункции
+
+// Инициализирует компоненты обмена.
+//
+// Параметры:
+// НаправлениеОбмена - строка ("Отправка" либо "Получение").
+//
+// Возвращаемое значение
+// Структура. Содержит компоненты обмена: правила обмена и параметры обмена.
+//
+Функция ИнициализироватьКомпонентыОбмена(НаправлениеОбмена) Экспорт
+
+ КомпонентыОбмена = Новый Структура("
+ |ВерсияФорматаОбмена,
+ |XMLСхема,
+ |МенеджерОбмена,
+ |УзелКорреспондента");
+
+ КомпонентыОбмена.Вставить("НаправлениеОбмена", НаправлениеОбмена);
+ КомпонентыОбмена.Вставить("ЭтоОбменЧерезПланОбмена", Истина);
+ КомпонентыОбмена.Вставить("ФлагОшибки", Ложь);
+ КомпонентыОбмена.Вставить("СтрокаСообщенияОбОшибке", "");
+ КомпонентыОбмена.Вставить("КлючСообщенияЖурналаРегистрации", ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными());
+
+ СостояниеОбменаДанными = Новый Структура;
+ СостояниеОбменаДанными.Вставить("УзелИнформационнойБазы");
+ СостояниеОбменаДанными.Вставить("ДействиеПриОбмене");
+ СостояниеОбменаДанными.Вставить("ДатаНачала");
+ СостояниеОбменаДанными.Вставить("ДатаОкончания");
+ СостояниеОбменаДанными.Вставить("РезультатВыполненияОбмена");
+
+ КомпонентыОбмена.Вставить("СостояниеОбменаДанными", СостояниеОбменаДанными);
+
+ ВедениеПротоколаДанных = Новый Структура;
+ ВедениеПротоколаДанных.Вставить("ФайлПротоколаДанных", Неопределено);
+ ВедениеПротоколаДанных.Вставить("ВыводВПротоколИнформационныхСообщений", Ложь);
+ ВедениеПротоколаДанных.Вставить("ДописыватьДанныеВПротоколОбмена", Истина);
+ КомпонентыОбмена.Вставить("ВедениеПротоколаДанных", ВедениеПротоколаДанных);
+
+ КомпонентыОбмена.Вставить("ИспользоватьТранзакции", Истина);
+
+ Если НаправлениеОбмена = "Отправка" Тогда
+
+ КомпонентыОбмена.Вставить("ВыгруженныеОбъекты", Новый Массив);
+ КомпонентыОбмена.Вставить("СчетчикВыгруженныхОбъектов", 0);
+ КомпонентыОбмена.Вставить("СоответствиеРегистрацияПоНеобходимости", Новый Соответствие);
+ КомпонентыОбмена.Вставить("ВыгруженныеПоСсылкеОбъекты", Новый Массив);
+
+ КомпонентыОбмена.Вставить("СценарийВыгрузки");
+
+ КомпонентыОбмена.Вставить("ТаблицаПравилаРегистрацииОбъектов");
+ КомпонентыОбмена.Вставить("СвойстваУзлаПланаОбмена");
+
+ Иначе
+
+ КомпонентыОбмена.Вставить("НомерВходящегоСообщения");
+ КомпонентыОбмена.Вставить("НомерСообщенияПолученногоКорреспондентом");
+
+ КомпонентыОбмена.Вставить("РежимЗагрузкиДанныхВИнформационнуюБазу", Истина);
+ КомпонентыОбмена.Вставить("СчетчикЗагруженныхОбъектов", 0);
+ КомпонентыОбмена.Вставить("КоличествоОбъектовНаТранзакцию", 0);
+
+ ДокументыДляОтложенногоПроведения = Новый ТаблицаЗначений;
+ ДокументыДляОтложенногоПроведения.Колонки.Добавить("ДокументСсылка");
+ ДокументыДляОтложенногоПроведения.Колонки.Добавить("ДатаДокумента", Новый ОписаниеТипов("Дата"));
+ ДокументыДляОтложенногоПроведения.Колонки.Добавить("ДокументПроведенУспешно", Новый ОписаниеТипов("Булево"));
+ ДокументыДляОтложенногоПроведения.Колонки.Добавить("ЭтоКоллизия", Новый ОписаниеТипов("Число"));
+ КомпонентыОбмена.Вставить("ДокументыДляОтложенногоПроведения", ДокументыДляОтложенногоПроведения);
+
+ ЗагруженныеОбъекты = Новый ТаблицаЗначений;
+ ЗагруженныеОбъекты.Колонки.Добавить("ИмяОбработчика");
+ ЗагруженныеОбъекты.Колонки.Добавить("Объект");
+ ЗагруженныеОбъекты.Колонки.Добавить("Параметры");
+ КомпонентыОбмена.Вставить("ЗагруженныеОбъекты", ЗагруженныеОбъекты);
+
+ КомпонентыОбмена.Вставить("ТаблицаДанныхЗаголовкаПакета", НоваяТаблицаДанныхЗаголовкаПакета());
+ КомпонентыОбмена.Вставить("ТаблицыДанныхСообщенияОбмена", Новый Соответствие);
+
+ КомпонентыОбмена.Вставить("ОбъектыДляОтложеннойЗаписи", Новый Соответствие);
+
+ КонецЕсли;
+
+ Возврат КомпонентыОбмена;
+
+КонецФункции
+
+// Инициализирует таблицы значений с правилами обмена и помещает их в КомпонентыОбмена.
+//
+// Параметры:
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+//
+Процедура ИнициализироватьТаблицыПравилОбмена(КомпонентыОбмена) Экспорт
+
+ НаправлениеОбмена = КомпонентыОбмена.НаправлениеОбмена;
+ XMLСхема = КомпонентыОбмена.XMLСхема;
+ МенеджерОбмена = КомпонентыОбмена.МенеджерОбмена;
+
+ // Инициализация таблиц правил обмена.
+ КомпонентыОбмена.Вставить("ПравилаОбработкиДанных", ТаблицаПравилОбработкиДанных(XMLСхема, МенеджерОбмена, НаправлениеОбмена));
+ КомпонентыОбмена.Вставить("ПравилаКонвертацииОбъектов", ТаблицаПравилКонвертации(XMLСхема, МенеджерОбмена, НаправлениеОбмена));
+
+ КомпонентыОбмена.Вставить("ПравилаКонвертацииПредопределенныхДанных",
+ ТаблицаПравилКонвертацииПредопределенныхДанных(XMLСхема, МенеджерОбмена, НаправлениеОбмена));
+
+ КомпонентыОбмена.Вставить("ПараметрыКонвертации", СтруктураПараметровКонвертации(МенеджерОбмена));
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ВедениеПротокола
+// Создает объект для записи протокола обмена и помещает его в КомпонентыОбмена.
+//
+// Параметры:
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+// ИмяФайлаПротоколаОбмена - Строка, содержит полное имя файла протокола.
+//
+Процедура ИнициализироватьВедениеПротоколаОбмена(КомпонентыОбмена, ИмяФайлаПротоколаОбмена) Экспорт
+
+ КомпонентыОбмена.ВедениеПротоколаДанных.ФайлПротоколаДанных = Неопределено;
+ Если Не ПустаяСтрока(ИмяФайлаПротоколаОбмена) Тогда
+
+ // Попытка записи в файл протокола обмена.
+ Попытка
+ КомпонентыОбмена.ВедениеПротоколаДанных.ФайлПротоколаДанных = Новый ЗаписьТекста(
+ ИмяФайлаПротоколаОбмена,
+ КодировкаТекста.ANSI,,
+ КомпонентыОбмена.ВедениеПротоколаОбмена.ДописыватьДанныеВПротоколОбмена);
+ Исключение
+
+ СтрокаСообщения = НСтр("ru = 'Ошибка при попытке записи в файл протокола данных: %1. Описание ошибки: %2'",
+ ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка());
+ СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ИмяФайлаПротоколаОбмена, ОписаниеОшибки());
+
+ ЗаписьЖурналаРегистрацииОбменДанными(СтрокаСообщения, КомпонентыОбмена, УровеньЖурналаРегистрации.Предупреждение);
+
+ КонецПопытки;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Завершает запись в протокол обмена.
+//
+// Параметры:
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+//
+Процедура ЗавершитьВедениеПротоколаОбмена(КомпонентыОбмена) Экспорт
+
+ Если КомпонентыОбмена.ВедениеПротоколаДанных.ФайлПротоколаДанных <> Неопределено Тогда
+
+ КомпонентыОбмена.ВедениеПротоколаДанных.ФайлПротоколаДанных.Закрыть();
+ КомпонентыОбмена.ВедениеПротоколаДанных.ФайлПротоколаДанных = Неопределено;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Сохраняет в протокол выполнения (или выводит на экран) сообщения указанной структуры.
+//
+// Параметры:
+// Код - Число. Код сообщения.
+// СтруктураЗаписи - Структура. Структура записи протокола.
+// ВзвестиФлагОшибок - Если истина, то - это сообщение об ошибке. Взводится ФлагОшибки.
+//
+Функция ЗаписатьВПротоколВыполнения(КомпонентыОбмена,
+ Код = "",
+ СтруктураЗаписи=Неопределено,
+ ВзвестиФлагОшибок=Истина,
+ Уровень=0,
+ Выравнивание=22,
+ БезусловнаяЗаписьВПротоколОбмена = Ложь) Экспорт
+
+ ФайлПротоколаДанных = КомпонентыОбмена.ВедениеПротоколаДанных.ФайлПротоколаДанных;
+ ВыводВПротоколИнформационныхСообщений = КомпонентыОбмена.ВедениеПротоколаДанных.ВыводВПротоколИнформационныхСообщений;
+
+ Отступ = "";
+ Для Сч = 0 По Уровень-1 Цикл
+ Отступ = Отступ + Символы.Таб;
+ КонецЦикла;
+
+ Если ТипЗнч(Код) = Тип("Число") Тогда
+
+ СообщенияОбОшибках = ОбменДаннымиПовтИсп.СообщенияОбОшибках();
+
+ Стр = СообщенияОбОшибках[Код];
+
+ Иначе
+
+ Стр = Строка(Код);
+
+ КонецЕсли;
+
+ Стр = Отступ + Стр;
+
+ Если СтруктураЗаписи <> Неопределено Тогда
+
+ Для каждого Поле Из СтруктураЗаписи Цикл
+
+ Значение = Поле.Значение;
+ Если Значение = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+ Ключ = Поле.Ключ;
+ Стр = Стр + Символы.ПС + Отступ + Символы.Таб
+ + СтроковыеФункцииКлиентСервер.ДополнитьСтроку(Поле.Ключ, Выравнивание) + " = " + Строка(Значение);
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ ЛитералПеревода = ?(ПустаяСтрока(КомпонентыОбмена.СтрокаСообщенияОбОшибке), "", Символы.ПС);
+ КомпонентыОбмена.СтрокаСообщенияОбОшибке = КомпонентыОбмена.СтрокаСообщенияОбОшибке + ЛитералПеревода + Стр;
+
+ Если ВзвестиФлагОшибок Тогда
+
+ КомпонентыОбмена.ФлагОшибки = Истина;
+ Если КомпонентыОбмена.СостояниеОбменаДанными.РезультатВыполненияОбмена = Неопределено Тогда
+ КомпонентыОбмена.СостояниеОбменаДанными.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка;
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Если ФайлПротоколаДанных <> Неопределено Тогда
+
+ Если ВзвестиФлагОшибок Тогда
+
+ ФайлПротоколаДанных.ЗаписатьСтроку(Символы.ПС + "Ошибка.");
+
+ КонецЕсли;
+
+ Если ВзвестиФлагОшибок
+ Или БезусловнаяЗаписьВПротоколОбмена
+ Или ВыводВПротоколИнформационныхСообщений Тогда
+
+ ФайлПротоколаДанных.ЗаписатьСтроку(Символы.ПС + КомпонентыОбмена.СтрокаСообщенияОбОшибке);
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Если РезультатВыполненияОбменаОшибка(КомпонентыОбмена.СостояниеОбменаДанными.РезультатВыполненияОбмена) Тогда
+
+ УровеньЖР = УровеньЖурналаРегистрации.Ошибка;
+
+ ИначеЕсли РезультатВыполненияОбменаПредупреждение(КомпонентыОбмена.СостояниеОбменаДанными.РезультатВыполненияОбмена) Тогда
+
+ УровеньЖР = УровеньЖурналаРегистрации.Предупреждение;
+
+ Иначе
+
+ УровеньЖР = УровеньЖурналаРегистрации.Информация;
+
+ КонецЕсли;
+
+ // Фиксируем событие в журнале регистрации.
+ ЗаписьЖурналаРегистрацииОбменДанными(
+ КомпонентыОбмена.СтрокаСообщенияОбОшибке,
+ КомпонентыОбмена,
+ УровеньЖР);
+
+ Возврат КомпонентыОбмена.СтрокаСообщенияОбОшибке;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ПоискПравилОбмена
+// Выполняет поиск правила конвертации объекта по имени.
+//
+// Параметры:
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+// Имя - Строка, имя правила.
+//
+// Возвращаемое значение:
+// Строка таблицы правил обмена, в которой содержится искомое правило.
+//
+Функция ПКОПоИмени(КомпонентыОбмена, Имя) Экспорт
+
+ ПравилоКонвертации = КомпонентыОбмена.ПравилаКонвертацииОбъектов.Найти(Имя, "ИмяПКО");
+
+ Если ПравилоКонвертации = Неопределено Тогда
+
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Не найдено ПКО с именем %1'"), Имя);
+
+ Иначе
+ Возврат ПравилоКонвертации;
+ КонецЕсли;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ОтправкаДанных
+// Выполняет выгрузку данных в соответствии с правилами и параметрами обмена.
+//
+// Параметры:
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+//
+Процедура ПроизвестиВыгрузкуДанных(КомпонентыОбмена) Экспорт
+
+ УзелДляОбмена = КомпонентыОбмена.УзелКорреспондента;
+
+ КомпонентыОбмена.МенеджерОбмена.ПередКонвертацией(КомпонентыОбмена);
+
+ Если КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда
+
+ НомерОтправленного = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(УзелДляОбмена, "НомерОтправленного") + 1;
+
+ Попытка
+ ВыполнитьВыгрузкуЗарегистрированныхДанных(КомпонентыОбмена, НомерОтправленного);
+ Исключение
+ ЗаписатьВПротоколВыполнения(КомпонентыОбмена, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+ КонецПопытки;
+
+ // Назначаем номер отправленного сообщения для объектов, выгруженных по ссылке.
+ Если КомпонентыОбмена.ВыгруженныеПоСсылкеОбъекты.Количество() > 0 Тогда
+
+ // Выполняем регистрацию объектов на текущем узле, которые были выгружены по ссылке.
+ Для Каждого Элемент Из КомпонентыОбмена.ВыгруженныеПоСсылкеОбъекты Цикл
+
+ ПланыОбмена.ЗарегистрироватьИзменения(УзелДляОбмена, Элемент);
+
+ КонецЦикла;
+
+ ОбменДаннымиСервер.ВыбратьИзменения(УзелДляОбмена, НомерОтправленного, КомпонентыОбмена.ВыгруженныеПоСсылкеОбъекты);
+
+ КонецЕсли;
+
+ НачатьТранзакцию();
+ Получатель = УзелДляОбмена.ПолучитьОбъект();
+ Получатель.НомерОтправленного = НомерОтправленного;
+ Получатель.ДополнительныеСвойства.Вставить("Загрузка");
+ Получатель.Записать();
+ ЗафиксироватьТранзакцию();
+
+ РазблокироватьДанныеДляРедактирования(УзелДляОбмена);
+
+ Иначе
+
+ Для Каждого Строка Из КомпонентыОбмена.СценарийВыгрузки Цикл
+
+ ПравилоОбработки = ПОДПоИмени(КомпонентыОбмена, Строка.ИмяПОД);
+
+ Попытка
+ ВыборкаДанных = ВыборкаДанных(КомпонентыОбмена, ПравилоОбработки);
+ Исключение
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Ошибка выполнения алгоритма получения выборки данных.
+ |Имя ПОД: %1
+ |Описание ошибки: %2'"),
+ ПравилоОбработки.Имя,
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+ КонецПопытки;
+
+ Для Каждого ОбъектВыборки Из ВыборкаДанных Цикл
+ ВыгрузкаОбъектаВыборки(КомпонентыОбмена, ОбъектВыборки, ПравилоОбработки);
+ КонецЦикла;
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ КомпонентыОбмена.МенеджерОбмена.ПослеКонвертации(КомпонентыОбмена);
+
+ КомпонентыОбмена.ФайлОбмена.ЗаписатьКонецЭлемента(); // Body
+ КомпонентыОбмена.ФайлОбмена.ЗаписатьКонецЭлемента(); // Message
+
+КонецПроцедуры
+
+// Выполняет преобразование структуры с данными в объект XDTO указанного типа в соответствии с правилами.
+//
+// Параметры:
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+// Источник - Структура - источник данных, которые необходимо преобразовать в объект XDTO.
+// ТипXDTO - Строка - тип объекта или тип значения XDTO, к которому надо преобразовать данные.
+// Приемник - ОбъектXDTO - объект, в который будет помещен результат.
+// СсылкиИзОбъекта - Массив - содержит общий список выгруженных по ссылкам объектов.
+//
+Функция ОбъектXDTOИзДанныхXDTO(
+ КомпонентыОбмена,
+ Знач Источник,
+ Знач ТипXDTO = Неопределено,
+ Приемник = Неопределено,
+ СсылкиИзОбъекта = Неопределено) Экспорт
+
+ Если СсылкиИзОбъекта = Неопределено Тогда
+ СсылкиИзОбъекта = Новый Массив;
+ КонецЕсли;
+
+ ПравилаКонвертации = КомпонентыОбмена.ПравилаКонвертацииОбъектов;
+ УзелКорреспондента = КомпонентыОбмена.УзелКорреспондента;
+
+ Если Приемник = Неопределено Тогда
+ Приемник = ФабрикаXDTO.Создать(ТипXDTO);
+ КонецЕсли;
+
+ Для Каждого Свойство Из ТипXDTO.Свойства Цикл
+
+ ЗначениеСвойства = Неопределено;
+ СвойствоНайдено = Ложь;
+
+ Если ТипЗнч(Источник) = Тип("Структура") Тогда
+ СвойствоНайдено = Источник.Свойство(Свойство.Имя, ЗначениеСвойства);
+ ИначеЕсли ТипЗнч(Источник) = Тип("СтрокаТаблицыЗначений")
+ И Источник.Владелец().Колонки.Найти(Свойство.Имя) <> Неопределено Тогда
+ СвойствоНайдено = Истина;
+ ЗначениеСвойства = Источник[Свойство.Имя];
+ КонецЕсли;
+
+ ТипСвойства = Неопределено;
+ Если ТипЗнч(Свойство.Тип) = Тип("ТипЗначенияXDTO") Тогда
+ ТипСвойства = "ОбычноеСвойство";
+ ИначеЕсли ТипЗнч(Свойство.Тип) = Тип("ТипОбъектаXDTO") Тогда
+
+ Если Свойство.Имя = "AdditionalInfo" Тогда
+ ТипСвойства = "AdditionalInfo";
+ ИначеЕсли ЭтоТаблицаОбъекта(Свойство) Тогда
+ ТипСвойства = "Таблица";
+ ИначеЕсли Свойство.Имя = "КлючевыеСвойства"
+ Или Найти(Свойство.Тип.Имя, "КлючевыеСвойства") > 0 Тогда
+ ТипСвойства = "КлючевыеСвойства";
+ Иначе
+ Если СвойствоНайдено Тогда
+ ТипСвойства = "СвойствоСоставногоТипа";
+ Иначе
+ ТипСвойства = "ОбщееСоставноеСвойство";
+ КонецЕсли;
+ КонецЕсли;
+
+ Иначе
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Неизвестный тип свойства <%1>. Тип объекта: %2'"),
+ Свойство.Имя,
+ Строка(ТипXDTO)
+ );
+ КонецЕсли;
+
+ Если ТипСвойства = "ОбщееСоставноеСвойство" Тогда
+
+ ЗначениеXDTO = ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, Источник, Свойство.Тип,, СсылкиИзОбъекта);
+
+ Иначе
+
+ Если Не СвойствоНайдено Тогда
+ Продолжить;
+ КонецЕсли;
+
+ // Проверка на заполненность
+ Если ЗначениеСвойства = Null
+ Или Не ЗначениеЗаполнено(ЗначениеСвойства) Тогда
+
+ Если Свойство.ВозможноПустое Тогда
+ Приемник[Свойство.Имя] = Неопределено;
+ КонецЕсли;
+
+ Продолжить;
+
+ КонецЕсли;
+
+ ЗначениеXDTO = Неопределено;
+ Если ТипСвойства = "КлючевыеСвойства" Тогда
+ ЗначениеXDTO = ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, ЗначениеСвойства, Свойство.Тип,,СсылкиИзОбъекта);
+ ИначеЕсли ТипСвойства = "ОбычноеСвойство" Тогда
+
+ Если ЭтоСсылкаXDTO(Свойство.Тип) Тогда // Конвертация ссылки
+
+ ЗначениеXDTO = КонвертироватьСсылкуВXDTO(КомпонентыОбмена, ЗначениеСвойства, Свойство.Тип);
+
+ Если СсылкиИзОбъекта.Найти(ЗначениеСвойства) = Неопределено Тогда
+ СсылкиИзОбъекта.Добавить(ЗначениеСвойства);
+ КонецЕсли;
+
+ ИначеЕсли Свойство.Тип.Фасеты <> Неопределено
+ И Свойство.Тип.Фасеты.Перечисления <> Неопределено
+ И Свойство.Тип.Фасеты.Перечисления.Количество() > 0 Тогда // Конвертация перечисления
+ ЗначениеXDTO = КонвертироватьПеречислениеВXDTO(КомпонентыОбмена, ЗначениеСвойства, Свойство.Тип);
+ Иначе // Конвертация обычного значения.
+ ЗначениеXDTO = ФабрикаXDTO.Создать(Свойство.Тип, ЗначениеСвойства);
+ КонецЕсли;
+
+ ИначеЕсли ТипСвойства = "AdditionalInfo" Тогда
+ ЗначениеXDTO = СериализаторXDTO.ЗаписатьXDTO(ЗначениеСвойства);
+
+ ИначеЕсли ТипСвойства = "Таблица" Тогда
+
+ ЗначениеXDTO = ФабрикаXDTO.Создать(Свойство.Тип);
+
+ ТипТаблицы = Свойство.Тип.Свойства[0].Тип;
+
+ ИмяСвойстваСтроки = Свойство.Тип.Свойства[0].Имя;
+
+ Для Каждого ИсточникСтрока Из ЗначениеСвойства Цикл
+
+ ПриемникСтрока = ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, ИсточникСтрока, ТипТаблицы,,СсылкиИзОбъекта);
+
+ ЗначениеXDTO[ИмяСвойстваСтроки].Добавить(ПриемникСтрока);
+
+ КонецЦикла;
+
+ ИначеЕсли ТипСвойства = "СвойствоСоставногоТипа" Тогда
+
+ Для Каждого СвойствоСоставногоТипа Из Свойство.Тип.Свойства Цикл
+
+ СоставноеЗначениеXDTO = Неопределено;
+ Если ТипЗнч(ЗначениеСвойства) = Тип("Структура")
+ И ЗначениеСвойства.ТипСоставногоСвойства = СвойствоСоставногоТипа.Тип Тогда
+
+ // Свойство составного типа, содержащие элементы только типа КлючевыеСвойства.
+ СоставноеЗначениеXDTO = ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, ЗначениеСвойства, СвойствоСоставногоТипа.Тип,,СсылкиИзОбъекта);
+ // Свойство составного типа простое, и значение простое
+ ИначеЕсли (ТипЗнч(ЗначениеСвойства) = Тип("Строка")
+ И Найти(СвойствоСоставногоТипа.Тип.Имя,"string")>0)
+ ИЛИ (ТипЗнч(ЗначениеСвойства) = Тип("Число")
+ И Найти(СвойствоСоставногоТипа.Тип.Имя,"decimal")>0)
+ ИЛИ (ТипЗнч(ЗначениеСвойства) = Тип("Булево")
+ И Найти(СвойствоСоставногоТипа.Тип.Имя,"boolean")>0)
+ ИЛИ (ТипЗнч(ЗначениеСвойства) = Тип("Дата")
+ И Найти(СвойствоСоставногоТипа.Тип.Имя,"date")>0) Тогда
+ СоставноеЗначениеXDTO = ЗначениеСвойства;
+
+ ИначеЕсли ТипЗнч(ЗначениеСвойства) = Тип("Строка")
+ И ТипЗнч(СвойствоСоставногоТипа.Тип) = Тип("ТипЗначенияXDTO")
+ И СвойствоСоставногоТипа.Тип.Фасеты <> Неопределено Тогда
+ Если СвойствоСоставногоТипа.Тип.Фасеты.Количество() = 0 Тогда
+ СоставноеЗначениеXDTO = ЗначениеСвойства;
+ Иначе
+
+ Для Каждого Фасет Из СвойствоСоставногоТипа.Тип.Фасеты Цикл
+ Если Фасет.Значение = ЗначениеСвойства Тогда
+ СоставноеЗначениеXDTO = ЗначениеСвойства;
+ Прервать;
+ КонецЕсли;
+ КонецЦикла;
+
+ КонецЕсли;
+ КонецЕсли;
+
+ Если СоставноеЗначениеXDTO <> Неопределено Тогда
+ Прервать;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ // Если передается значение с типом, которое не поддерживается в формате - не передаем.
+ Если СоставноеЗначениеXDTO = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+
+ ЗначениеXDTO = ФабрикаXDTO.Создать(Свойство.Тип);
+ ЗначениеXDTO.Установить(СвойствоСоставногоТипа, СоставноеЗначениеXDTO);
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Приемник[Свойство.Имя] = ЗначениеXDTO;
+
+ КонецЦикла;
+ Возврат Приемник;
+КонецФункции
+
+
+// Выполняет преобразование данных информационной базы в структуру с данными в соответствии с правилами.
+//
+// Параметры:
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+// Источник - Ссылка на выгружаемый объект информационной базы.
+// ПравилоКонвертации - Строка таблицы правил конвертации объектов, в соответствии с которой выполняется
+// преобразование.
+// СтекВыгрузки - массив, содержит ссылки на выгружаемые объекты с учетом вложенности.
+//
+Функция ДанныеXDTOИзДанныхИБ(КомпонентыОбмена, Источник, Знач ПравилоКонвертации, СтекВыгрузки = Неопределено) Экспорт
+
+ Приемник = Новый Структура;
+
+ Если СтекВыгрузки = Неопределено Тогда
+ СтекВыгрузки = Новый Массив;
+ КонецЕсли;
+
+ Если ПравилоКонвертации.ЭтоСсылочныйТип Тогда
+
+ Если СтекВыгрузки.Найти(Источник.Ссылка) <> Неопределено Тогда
+ Возврат Неопределено;
+ Иначе
+ СтекВыгрузки.Добавить(Источник.Ссылка);
+ КонецЕсли;
+ Иначе
+ СтекВыгрузки.Добавить(Источник);
+ КонецЕсли;
+
+ Если ПравилоКонвертации.ЭтоКонстанта Тогда
+
+ Если ПравилоКонвертации.ТипXDTO.Свойства.Количество() = 1 Тогда
+
+ Приемник.Вставить(ПравилоКонвертации.ТипXDTO.Свойства[0].Имя, Источник.Значение);
+
+ Иначе
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Ошибка XML-схемы. Для приемника должно быть задано одно свойство.
+ |Тип источника: %1
+ |Тип приемника: %2'"),
+ Строка(ТипЗнч(Источник)),
+ ПравилоКонвертации.ТипXDTO
+ );
+ КонецЕсли;
+
+ Иначе
+
+ // Выполнение ПКС, 1-й этап
+ Для Каждого ПКС Из ПравилоКонвертации.Свойства Цикл
+
+ Если ПравилоКонвертации.ОбъектДанных <> Неопределено
+ И ПКС.СвойствоКонфигурации = ""
+ И ПКС.ИспользуетсяАлгоритмКонвертации Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Если СтекВыгрузки.Количество() > 1 И Не ПКС.ОбработкаКлючевогоСвойства Тогда
+ Продолжить;
+ КонецЕсли;
+
+ ВыгрузитьСвойство(
+ КомпонентыОбмена,
+ Источник,
+ Приемник,
+ ПКС,
+ СтекВыгрузки,
+ 1);
+ КонецЦикла;
+
+ // {Обработчик: ПриОтправкеДанных} Начало
+ Если ПравилоКонвертации.ЕстьОбработчикПриОтправкеДанных Тогда
+
+ Если Не Приемник.Свойство("КлючевыеСвойства") Тогда
+ Приемник.Вставить("КлючевыеСвойства", Новый Структура);
+ КонецЕсли;
+
+ ПриОтправкеДанных(Источник, Приемник, ПравилоКонвертации.ПриОтправкеДанных, КомпонентыОбмена, СтекВыгрузки);
+
+ Если СтекВыгрузки.Количество() > 1 Тогда
+ Для Каждого КлючевоеСвойство Из Приемник.КлючевыеСвойства Цикл
+ Приемник.Вставить(КлючевоеСвойство.Ключ, КлючевоеСвойство.Значение);
+ КонецЦикла;
+ Приемник.Удалить("КлючевыеСвойства");
+ КонецЕсли;
+
+ // Выполнение ПКС, 2-й этап
+ Для Каждого ПКС Из ПравилоКонвертации.Свойства Цикл
+ Если ПКС.СвойствоФормата = ""
+ ИЛИ (СтекВыгрузки.Количество() > 1 И Не ПКС.ОбработкаКлючевогоСвойства) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ // Выполняем конвертацию, если в свойство помещена инструкция.
+ Если СтекВыгрузки.Количество() = 1 И ПКС.ОбработкаКлючевогоСвойства Тогда
+ ЗначениеСвойства = Приемник.КлючевыеСвойства[ПКС.СвойствоФормата];
+ Иначе
+ ЗначениеСвойства = Приемник[ПКС.СвойствоФормата];
+ КонецЕсли;
+
+ Если ПКС.ИспользуетсяАлгоритмКонвертации Тогда
+
+ Если ТипЗнч(ЗначениеСвойства) = Тип("Структура")
+ И ЗначениеСвойства.Свойство("Значение")
+ И ЗначениеСвойства.Свойство("ИмяПКО")
+ Или ПКС.ПравилоКонвертацииСвойства <> ""
+ И ТипЗнч(ЗначениеСвойства) <> Тип("Структура") Тогда
+
+ ВыгрузитьСвойство(
+ КомпонентыОбмена,
+ Источник,
+ Приемник,
+ ПКС,
+ СтекВыгрузки,
+ 2);
+
+ КонецЕсли;
+
+ КонецЕсли;
+ КонецЦикла;
+
+ // Выполнение ПКС для ТЧ
+ Если СтекВыгрузки.Количество() = 1 Тогда
+
+ Для Каждого ТЧИСвойства Из ПравилоКонвертации.СвойстваТабличныхЧастей Цикл
+
+ ПКСДляТЧ = ТЧИСвойства.Значение;
+ ИмяТЧПриемника = ТЧИСвойства.Ключ;
+ ТЧПриемника = Неопределено;
+ Если Не Приемник.Свойство(ИмяТЧПриемника, ТЧПриемника) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ // Убираем лишние колонки, которые могли добавить в приемнике.
+ УдаляемыеКолонки = Новый Массив;
+ Для Каждого Колонка Из ТЧПриемника.Колонки Цикл
+ Если ПКСДляТЧ.Найти(Колонка.Имя, "СвойствоФормата") = Неопределено Тогда
+ УдаляемыеКолонки.Добавить(Колонка);
+ КонецЕсли;
+ КонецЦикла;
+ Для Каждого Колонка Из УдаляемыеКолонки Цикл
+ ТЧПриемника.Колонки.Удалить(Колонка);
+ КонецЦикла;
+
+ // Создаем новую ТЗ, в которой нет ограничений типа для колонок и копируем в нее данные.
+ НоваяТЧПриемника = Новый ТаблицаЗначений;
+ Для Каждого ПКС Из ПКСДляТЧ Цикл
+ ИмяКолонки = ПКС.СвойствоФормата;
+ НоваяТЧПриемника.Колонки.Добавить(ИмяКолонки);
+ КонецЦикла;
+ Для Каждого СтрокаТЧПриемника Из ТЧПриемника Цикл
+ СтрокаНовойТЧПриемника = НоваяТЧПриемника.Добавить();
+ ЗаполнитьЗначенияСвойств(СтрокаНовойТЧПриемника, СтрокаТЧПриемника);
+ КонецЦикла;
+ Приемник[ИмяТЧПриемника] = НоваяТЧПриемника;
+
+ Для Каждого Строка Из НоваяТЧПриемника Цикл
+
+ Для Каждого ПКС Из ПКСДляТЧ Цикл
+
+ ВыгрузитьСвойство(
+ КомпонентыОбмена,
+ Источник,
+ Строка,
+ ПКС,
+ СтекВыгрузки,
+ 2);
+
+ КонецЦикла;
+
+ КонецЦикла;
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ КонецЕсли;
+ // {Обработчик: ПриОтправкеДанных} Окончание
+
+ Если СтекВыгрузки.Количество() > 1 Тогда
+ Приемник.Вставить("ТипСоставногоСвойства", ПравилоКонвертации.ТипКлючевыхСвойствОбъектаXDTO);
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Возврат Приемник;
+
+КонецФункции
+
+// Выгружает свойство объекта информационной базы в соответствии с правилами.
+//
+// Параметры:
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+// ДанныеИБ - Ссылка на выгружаемый объект информационной базы.
+// ПолучательСвойства - Структура, в которой должно храниться значение выгруженного свойства.
+// ПКС - Строка таблицы правил конвертации свойств, в соответствии с которой выполняется преобразование.
+// СтекВыгрузки - Массив, содержит ссылки на выгружаемые объекты с учетом вложенности.
+// ЭтапВыгрузки - Число
+// 1 - выгрузка до выполнения алгоритма ПриОтправкеДанных,
+// 2 - выгрузка после выполнения алгоритма ПриОтправкеДанных.
+//
+Процедура ВыгрузитьСвойство(КомпонентыОбмена, ДанныеИБ, ПолучательСвойства, ПКС, СтекВыгрузки, ЭтапВыгрузки = 1) Экспорт
+ // Свойство формата не указано - данное ПКС используется только при загрузке.
+ Если СокрЛП(ПКС.СвойствоФормата) = "" Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЗначениеСвойства = Неопределено;
+ Если ЭтапВыгрузки = 1 Тогда
+ Если ЗначениеЗаполнено(ПКС.СвойствоКонфигурации) Тогда
+ ЗначениеСвойства = ДанныеИБ[ПКС.СвойствоКонфигурации];
+ ИначеЕсли Не ДанныеИБ.Свойство(ПКС.СвойствоФормата, ЗначениеСвойства) Тогда
+ // Это ПКС из ПКО с источником-структурой и в источнике не нашлось нужного свойства.
+ Возврат;
+ КонецЕсли;
+ Иначе
+
+ Если ТипЗнч(ПолучательСвойства) = Тип("СтрокаТаблицыЗначений") Тогда
+
+ Если ПолучательСвойства.Владелец().Колонки.Найти(ПКС.СвойствоФормата) = Неопределено Тогда
+ Возврат;
+ Иначе
+ ЗначениеСвойства = ПолучательСвойства[ПКС.СвойствоФормата];
+ КонецЕсли;
+
+ ИначеЕсли Не ПолучательСвойства.Свойство(ПКС.СвойствоФормата, ЗначениеСвойства)
+ И Не (СтекВыгрузки.Количество() = 1 И ПолучательСвойства.КлючевыеСвойства.Свойство(ПКС.СвойствоФормата, ЗначениеСвойства)) Тогда
+ Возврат;
+ КонецЕсли;
+
+ КонецЕсли;
+
+ ПравилоКонвертацииСвойства = ПКС.ПравилоКонвертацииСвойства;
+
+ // Значение может быть в формате инструкции.
+ Если ТипЗнч(ЗначениеСвойства) = Тип("Структура") Тогда
+ Если ЗначениеСвойства.Свойство("ИмяПКО") Тогда
+ ПравилоКонвертацииСвойства = ЗначениеСвойства.ИмяПКО;
+ КонецЕсли;
+ Если ЗначениеСвойства.Свойство("Значение") Тогда
+ ЗначениеСвойства = ЗначениеСвойства.Значение;
+ КонецЕсли;
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(ЗначениеСвойства) Тогда
+
+ Если СокрЛП(ПравилоКонвертацииСвойства) <> "" Тогда
+
+ ПКПД = КомпонентыОбмена.ПравилаКонвертацииПредопределенныхДанных.Найти(ПравилоКонвертацииСвойства, "ИмяПКПД");
+ Если ПКПД <> Неопределено Тогда
+ ЗначениеСвойства = ПКПД.КонвертацииЗначенийПриОтправке.Получить(ЗначениеСвойства);
+ Иначе
+
+ ПравилоКонвертации = ПКОПоИмени(КомпонентыОбмена, ПравилоКонвертацииСвойства);
+
+ ОтветвлениеСтекаВыгрузки = Новый Массив;
+ Для Каждого Элемент Из СтекВыгрузки Цикл
+ ОтветвлениеСтекаВыгрузки.Добавить(Элемент);
+ КонецЦикла;
+
+ ЗначениеСвойства = ДанныеXDTOИзДанныхИБ(
+ КомпонентыОбмена,
+ ЗначениеСвойства,
+ ПравилоКонвертации,
+ ОтветвлениеСтекаВыгрузки);
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Иначе
+ ЗначениеСвойства = Неопределено;
+ КонецЕсли;
+
+ Если СтекВыгрузки.Количество() = 1 И ПКС.ОбработкаКлючевогоСвойства Тогда
+ Если Не ПолучательСвойства.Свойство("КлючевыеСвойства") Тогда
+ ПолучательСвойства.Вставить("КлючевыеСвойства", Новый Структура);
+ КонецЕсли;
+ ПолучательСвойства.КлючевыеСвойства.Вставить(ПКС.СвойствоФормата, ЗначениеСвойства);
+ Иначе
+ Если ТипЗнч(ПолучательСвойства) = Тип("СтрокаТаблицыЗначений") Тогда
+ ПолучательСвойства[ПКС.СвойствоФормата] = ЗначениеСвойства;
+ Иначе
+ ПолучательСвойства.Вставить(ПКС.СвойствоФормата, ЗначениеСвойства);
+ КонецЕсли;
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ПолучениеДанных
+
+// Возвращает объект информационной базы, соответствующий полученным данным.
+//
+// Параметры:
+// ДанныеXDTO - Структура - структура, имитирующая объект XDTO.
+//
+// ПравилоКонвертации - СтрокаТаблицыЗначений - параметры текущего правила конвертации.
+//
+// Действие - Строка - определяет цель получения объекта ИБ:
+// "ПолучитьСсылку" - идентификация объекта,
+// "КонвертироватьВПолученныеДанные" - заполнение объекта только данными, полученными в результате
+// конвертации данных XDTO "КонвертироватьИЗаписать" - получение объекта,
+// готового.
+//
+// Возвращаемое значение:
+// Структура - содержит имена (ключи) и значения затребованных реквизитов.
+// Если строка затребованных реквизитов пуста, то возвращается пустая структура.
+// Если в качестве объекта передана пустая ссылка, то все реквизиты вернутся со значением Неопределено.
+//
+Функция СтруктураОбъектаXDTOВДанныеИБ(КомпонентыОбмена, ДанныеXDTO, ПравилоКонвертации, Действие = "КонвертироватьИЗаписать") Экспорт
+
+ ДанныеИБ = Неопределено;
+ ПолученныеДанные = ИнициализироватьПолученныеДанные(ПравилоКонвертации);
+ ПолученныеДанныеСсылка = ПолученныеДанные.Ссылка;
+ ВариантИдентификации = СокрЛП(ПравилоКонвертации.ВариантИдентификации);
+
+ Если ВариантИдентификации = "ПоУникальномуИдентификатору"
+ Или ВариантИдентификации = "СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска" Тогда
+
+ ПолученныеДанныеСсылка = СсылкаОбъектаПоУИДОбъектаXDTO(
+ ДанныеXDTO.Ссылка.Значение,
+ ПравилоКонвертации.ТипДанных,
+ КомпонентыОбмена);
+
+ ПолученныеДанные.УстановитьСсылкуНового(ПолученныеДанныеСсылка);
+
+ ДанныеИБ = ПолученныеДанныеСсылка.ПолучитьОбъект();
+
+ Если Действие = "ПолучитьСсылку" Тогда
+
+ Если ДанныеИБ <> Неопределено Тогда
+ // Задача - получение ссылки.
+ // Идентификация - по УИД или УИД + поля поиска.
+ // Объект с полученной ссылкой (или с таким публичным идентификатором) существует.
+ Возврат ДанныеИБ.Ссылка;
+ ИначеЕсли ВариантИдентификации = "ПоУникальномуИдентификатору" Тогда
+ // Задача - получение ссылки.
+ // Идентификация - по УИД.
+ // Объект с полученной ссылкой (или с таким публичным идентификатором) не найден.
+ Возврат ПолученныеДанныеСсылка;
+ КонецЕсли;
+
+ КонецЕсли;
+ Иначе
+ ПолученныеДанныеСсылка = ПравилоКонвертации.МенеджерОбъекта.ПолучитьСсылку(Новый УникальныйИдентификатор());
+ ПолученныеДанные.УстановитьСсылкуНового(ПолученныеДанныеСсылка);
+ КонецЕсли;
+
+ // Определяем, какие свойства нужно конвертировать.
+ СоставСвойств = ?(Действие = "ПолучитьСсылку", "СвойстваПоиска", "Все");
+
+ // Конвертация свойств, для которых не нужно выполнение обработчика.
+ КонвертацияСвойствСтруктурыОбъектаXDTO(
+ КомпонентыОбмена,
+ ДанныеXDTO,
+ ПолученныеДанные,
+ ПравилоКонвертации,
+ 1,
+ СоставСвойств);
+
+ Если Действие = "ПолучитьСсылку" Тогда
+ ДанныеXDTO = Новый Структура("КлючевыеСвойства", ДанныеXDTO);
+ КонецЕсли;
+
+ ПриКонвертацииДанныхXDTO(
+ ДанныеXDTO,
+ ПолученныеДанные,
+ КомпонентыОбмена,
+ ПравилоКонвертации.ПриКонвертацииДанныхXDTO);
+
+ Если Действие = "ПолучитьСсылку" Тогда
+ ДанныеXDTO = ДанныеXDTO.КлючевыеСвойства;
+ КонецЕсли;
+
+ КонвертацияСвойствСтруктурыОбъектаXDTO(
+ КомпонентыОбмена,
+ ДанныеXDTO,
+ ПолученныеДанные,
+ ПравилоКонвертации,
+ 2,
+ СоставСвойств);
+
+ Если ДанныеИБ = Неопределено Тогда
+
+ Если ВариантИдентификации = "ПоПолямПоиска"
+ Или ВариантИдентификации = "СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска" Тогда
+
+ ДанныеИБ = СсылкаОбъектаПоСвойствамОбъектаXDTO(ПравилоКонвертации, ПолученныеДанные);
+ Если Не ЗначениеЗаполнено(ДанныеИБ) Тогда
+ ДанныеИБ = Неопределено;
+ КонецЕсли;
+
+ Если ДанныеИБ <> Неопределено Тогда
+
+ Если Действие = "ПолучитьСсылку" Тогда
+
+ // Задача - получение ссылки.
+ // Идентификация - по УИД + поля поиска.
+ // Объект найден по полям поиска.
+ Возврат ДанныеИБ;
+ Иначе
+ ДанныеИБ = ДанныеИБ.ПолучитьОбъект();
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Если КомпонентыОбмена.РежимЗагрузкиДанныхВИнформационнуюБазу
+ И (ВариантИдентификации = "ПоПолямПоиска"
+ Или ВариантИдентификации = "СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска") Тогда
+ Действие = "КонвертироватьИЗаписать";
+ КонецЕсли;
+
+ Если Действие = "КонвертироватьИЗаписать" Тогда
+
+ #Область ЗаписьОбъекта
+
+ Если КомпонентыОбмена.ЭтоОбменЧерезПланОбмена
+ И ДанныеИБ <> Неопределено
+ И ВариантИдентификации = "СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска" Тогда
+
+ ЗаписатьПриНеобходимостиПубличныйИдентификатор(
+ ДанныеИБ,
+ ПолученныеДанные.ПолучитьСсылкуНового(),
+ КомпонентыОбмена.УзелКорреспондента,
+ ПравилоКонвертации);
+
+ КонецЕсли;
+
+ Если ПравилоКонвертации.ЕстьОбработчикПередЗаписьюПолученныхДанных Тогда
+
+ ПередЗаписьюПолученныхДанных(
+ ПолученныеДанные,
+ ДанныеИБ,
+ КомпонентыОбмена,
+ ПравилоКонвертации.ПередЗаписьюПолученныхДанных,
+ ПравилоКонвертации.Свойства);
+
+ КонецЕсли;
+
+ Если ДанныеИБ = Неопределено Тогда
+ ДанныеДляЗаписиВИБ = ПолученныеДанные;
+ Иначе
+ Если ПолученныеДанные <> Неопределено Тогда
+ ЗаполнитьДанныеИБПоПолученнымДанным(ДанныеИБ, ПолученныеДанные, ПравилоКонвертации);
+ КонецЕсли;
+ ДанныеДляЗаписиВИБ = ДанныеИБ;
+ КонецЕсли;
+
+ ПровестиГенерациюКодаНомераПриНеобходимости(ДанныеДляЗаписиВИБ);
+
+ Если КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда
+
+ #Область СистемныйОбработчикПриПолученииДанныхОтПодчиненного
+ ПолучениеЭлемента = ПолучениеЭлементаДанных.Авто;
+ ОтправкаНазад = Ложь;
+ СтандартныеПодсистемыСервер.ПриПолученииДанныхОтПодчиненного(ДанныеДляЗаписиВИБ, ПолучениеЭлемента, ОтправкаНазад, КомпонентыОбмена.УзелКорреспондента);
+ #КонецОбласти
+
+ КонецЕсли;
+ Если ДанныеДляЗаписиВИБ.ПометкаУдаления Тогда
+ ДанныеДляЗаписиВИБ.ПометкаУдаления = Ложь;
+ КонецЕсли;
+
+ МетаданныеОбъекта = ДанныеДляЗаписиВИБ.Метаданные();
+ Если Метаданные.Документы.Содержит(МетаданныеОбъекта) Тогда
+
+ Попытка
+
+ Если ДанныеДляЗаписиВИБ.Проведен Тогда
+
+ ДанныеДляЗаписиВИБ.Проведен = Ложь;
+ Если Не ДанныеДляЗаписиВИБ.ЭтоНовый()
+ И ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДанныеДляЗаписиВИБ.Ссылка, "Проведен") Тогда
+ // Записываем новую версию документа с отменой проведения.
+ Результат = ОтменитьПроведениеОбъектаВИБ(ДанныеДляЗаписиВИБ, КомпонентыОбмена.УзелКорреспондента);
+ Иначе
+ // Записываем новую версию документа.
+ ЗаписатьОбъектВИБ(КомпонентыОбмена, ДанныеДляЗаписиВИБ, ПравилоКонвертации.ТипДанных);
+ КонецЕсли;
+
+ СтрокаТаблицы = КомпонентыОбмена.ДокументыДляОтложенногоПроведения.Добавить();
+ СтрокаТаблицы.ДокументСсылка = ДанныеДляЗаписиВИБ.Ссылка;
+ СтрокаТаблицы.ДатаДокумента = ДанныеДляЗаписиВИБ.Дата;
+
+ Иначе
+ Если ДанныеДляЗаписиВИБ.ЭтоНовый() Тогда
+ ЗаписатьОбъектВИБ(КомпонентыОбмена, ДанныеДляЗаписиВИБ, ПравилоКонвертации.ТипДанных);
+ Иначе
+ ОтменитьПроведениеОбъектаВИБ(ДанныеДляЗаписиВИБ, КомпонентыОбмена.УзелКорреспондента);
+ КонецЕсли;
+ КонецЕсли;
+
+ Исключение
+ КонецПопытки;
+
+ Иначе
+
+ ЗаписатьОбъектВИБ(КомпонентыОбмена, ДанныеДляЗаписиВИБ, ПравилоКонвертации.ТипДанных);
+
+ КомпонентыОбмена.ОбъектыДляОтложеннойЗаписи.Вставить(
+ ДанныеДляЗаписиВИБ.Ссылка, ДанныеДляЗаписиВИБ.ДополнительныеСвойства);
+
+ КонецЕсли;
+
+ ЗапомнитьОбъектДляОтложенногоЗаполнения(ДанныеДляЗаписиВИБ, ПравилоКонвертации, КомпонентыОбмена);
+
+ #КонецОбласти
+
+ Иначе
+
+ ДанныеДляЗаписиВИБ = ПолученныеДанные;
+
+ КонецЕсли;
+
+ Возврат ДанныеДляЗаписиВИБ;
+
+КонецФункции
+
+// Выполняет чтение файла данных при загрузке.
+//
+// Параметры:
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+//
+Процедура ПроизвестиЧтениеДанных(КомпонентыОбмена, ТаблицыДляЗагрузки = Неопределено) Экспорт
+
+ Если ТипЗнч(ТаблицыДляЗагрузки) = Тип("ТаблицаЗначений")
+ И ТаблицыДляЗагрузки.Количество() = 0 Тогда
+ Возврат;
+ КонецЕсли;
+
+ МассивОбъектовКУдалению = Новый Массив;
+ МассивЗагруженныхОбъектов = Новый Массив;
+
+ КомпонентыОбмена.МенеджерОбмена.ПередКонвертацией(КомпонентыОбмена);
+
+ Пока КомпонентыОбмена.ФайлОбмена.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл
+ #Область ЧтениеЭлементаXDTO
+ ОтправкаНазад = Ложь;
+ ДанныеИБ = Неопределено;
+
+ // Получаем из файла ОбъектXDTO.
+ ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(
+ КомпонентыОбмена.ФайлОбмена,
+ ФабрикаXDTO.Тип(КомпонентыОбмена.ФайлОбмена.URIПространстваИмен, КомпонентыОбмена.ФайлОбмена.ЛокальноеИмя));
+
+ // Загрузка признака удаления объекта - специфичная логика.
+ Если ОбъектXDTO.Тип().Имя = "УдалениеОбъекта" Тогда
+
+ ПрочитатьУдаление(КомпонентыОбмена, ОбъектXDTO, МассивОбъектовКУдалению, ТаблицыДляЗагрузки);
+
+ Иначе
+
+ // Отработка ПОД
+ // Ищем правило обработки данных.
+ ПравилоОбработки = ПОДПоТипуОбъектаXDTO(КомпонентыОбмена, ОбъектXDTO.Тип().Имя, Истина);
+
+ Если Не ЗначениеЗаполнено(ПравилоОбработки) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ // Конвертируем ОбъектXDTO в Структуру.
+ ДанныеXDTO = ОбъектXDTOВСтруктуру(ОбъектXDTO);
+
+ ИспользованиеПКО = Новый Структура;
+ Для Каждого ИмяПКО Из ПравилоОбработки.ИспользуемыеПКО Цикл
+ ИспользованиеПКО.Вставить(ИмяПКО, Истина);
+ КонецЦикла;
+ #КонецОбласти
+
+ #Область ПриОбработке
+ Если ЗначениеЗаполнено(ПравилоОбработки.ПриОбработке) Тогда
+ ПриОбработкеПОД(
+ КомпонентыОбмена,
+ ПравилоОбработки,
+ ДанныеXDTO,
+ ИспользованиеПКО);
+ КонецЕсли;
+ #КонецОбласти
+
+ // Массив нужен для "свертки" ПКО по видам объектов метаданных.
+ ОбработанныеТипыОбъектовМетаданных = Новый Массив;
+
+ // 1. Поиск правила конвертации.
+ Для Каждого ТекущееПКО Из ИспользованиеПКО Цикл
+
+ ПравилоКонвертации = ПКОПоИмени(КомпонентыОбмена, ТекущееПКО.Ключ);
+
+ #Область ПроверкаСоответствияТаблицеДляЗагрузки
+ Если ТаблицыДляЗагрузки <> Неопределено Тогда
+ ТипОбъектаСтрокой = ПравилоКонвертации.ТипПолученныхДанныхСтрокой;
+
+ ТипИсточникаСтрокой = ОбъектXDTO.Тип().Имя;
+ ТипПриемникаСтрокой = ПравилоКонвертации.ТипПолученныхДанныхСтрокой;
+
+ КлючТаблицыДанных = ОбменДаннымиСервер.КлючТаблицыДанных(ТипИсточникаСтрокой, ТипПриемникаСтрокой, Ложь);
+
+ Если ТаблицыДляЗагрузки.Найти(КлючТаблицыДанных) = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+ КонецЕсли;
+ #КонецОбласти
+
+ Если ТекущееПКО.Значение Тогда
+
+ ПолученныеДанныеСсылка = Неопределено;
+ ВариантИдентификации = СокрЛП(ПравилоКонвертации.ВариантИдентификации);
+ Если ВариантИдентификации = "ПоУникальномуИдентификатору"
+ Или ВариантИдентификации = "СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска" Тогда
+ ПолученныеДанныеСсылка = ПравилоКонвертации.МенеджерОбъекта.ПолучитьСсылку(Новый УникальныйИдентификатор(ДанныеXDTO.Ссылка.Значение));
+ КонецЕсли;
+
+ Если КомпонентыОбмена.РежимЗагрузкиДанныхВИнформационнуюБазу Тогда
+
+ ДанныеДляЗаписиВИБ = СтруктураОбъектаXDTOВДанныеИБ(КомпонентыОбмена, ДанныеXDTO, ПравилоКонвертации, "КонвертироватьИЗаписать");
+
+ Если ПравилоКонвертации.ВариантИдентификации = "СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска"
+ Или ПравилоКонвертации.ВариантИдентификации = "ПоУникальномуИдентификатору" Тогда
+
+ МассивЗагруженныхОбъектов.Добавить(ДанныеДляЗаписиВИБ.Ссылка);
+
+ КонецЕсли;
+
+ ИначеЕсли ТаблицыДляЗагрузки <> Неопределено Тогда
+
+ ДанныеДляЗаписиВИБ = СтруктураОбъектаXDTOВДанныеИБ(КомпонентыОбмена, ДанныеXDTO, ПравилоКонвертации, "Конвертировать");
+
+ ПровестиГенерациюКодаНомераПриНеобходимости(ДанныеДляЗаписиВИБ);
+
+ УникальныйИдентификаторСтрокой = ДанныеXDTO.Ссылка.Значение;
+
+ ТаблицаДанныхСообщенияОбмена = КомпонентыОбмена.ТаблицыДанныхСообщенияОбмена.Получить(КлючТаблицыДанных);
+
+ СтрокаТаблицы = ТаблицаДанныхСообщенияОбмена.Найти(УникальныйИдентификаторСтрокой, "УникальныйИдентификатор");
+
+ Если СтрокаТаблицы = Неопределено Тогда
+
+ СтрокаТаблицы = ТаблицаДанныхСообщенияОбмена.Добавить();
+
+ СтрокаТаблицы.ТипСтрокой = ТипПриемникаСтрокой;
+ СтрокаТаблицы.УникальныйИдентификатор = УникальныйИдентификаторСтрокой;
+
+ КонецЕсли;
+
+ // Заполняем значения свойств объекта.
+ ЗаполнитьЗначенияСвойств(СтрокаТаблицы, ДанныеДляЗаписиВИБ);
+ СтрокаТаблицы.Ссылка = ПолученныеДанныеСсылка;
+
+ КонецЕсли;
+
+ ИначеЕсли ПравилоКонвертации.ВариантИдентификации = "СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска"
+ Или ПравилоКонвертации.ВариантИдентификации = "ПоУникальномуИдентификатору" Тогда
+ МассивОбъектовКУдалению.Добавить(СсылкаОбъектаПоУИДОбъектаXDTO(ДанныеXDTO.Ссылка.Значение, ПравилоКонвертации.ТипДанных, КомпонентыОбмена));
+ КонецЕсли;
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Если КомпонентыОбмена.РежимЗагрузкиДанныхВИнформационнуюБазу Тогда
+ ПрименитьУдалениеОбъектов(КомпонентыОбмена, МассивОбъектовКУдалению, МассивЗагруженныхОбъектов);
+ ОтложенноеЗаполнениеОбъектов(КомпонентыОбмена);
+ ВыполнитьОтложенноеПроведениеДокументов(КомпонентыОбмена);
+ ВыполнитьОтложеннуюЗаписьОбъектов(КомпонентыОбмена);
+ КонецЕсли;
+
+ КомпонентыОбмена.МенеджерОбмена.ПослеКонвертации(КомпонентыОбмена);
+
+КонецПроцедуры
+
+// Выполняет чтение файла данных при загрузке в режиме анализа (при интерактивной синхронизации данных).
+//
+// Параметры:
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+//
+Процедура ПроизвестиЧтениеДанныхВРежимеАнализа(КомпонентыОбмена, ПараметрыАнализа = Неопределено) Экспорт
+
+ // Параметры по умолчанию
+ ПараметрыСбораСтатистики = Новый Структура("СобиратьСтатистикуКлассификаторов", Ложь);
+ Если ПараметрыАнализа <> Неопределено Тогда
+ ЗаполнитьЗначенияСвойств(ПараметрыСбораСтатистики, ПараметрыАнализа);
+ КонецЕсли;
+
+ КомпонентыОбмена.МенеджерОбмена.ПередКонвертацией(КомпонентыОбмена);
+
+ // Параметры по умолчанию
+ ПараметрыСбораСтатистики = Новый Структура("СобиратьСтатистикуКлассификаторов", Ложь);
+ Если ПараметрыАнализа <> Неопределено Тогда
+ ЗаполнитьЗначенияСвойств(ПараметрыСбораСтатистики, ПараметрыАнализа);
+ КонецЕсли;
+
+ МассивОбъектовКУдалению = Новый Массив;
+ МассивЗагруженныхОбъектов = Новый Массив;
+ Пока КомпонентыОбмена.ФайлОбмена.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл
+
+ // Получаем из файла ОбъектXDTO.
+ ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(
+ КомпонентыОбмена.ФайлОбмена,
+ ФабрикаXDTO.Тип(КомпонентыОбмена.ФайлОбмена.URIПространстваИмен, КомпонентыОбмена.ФайлОбмена.ЛокальноеИмя));
+
+ Если ОбъектXDTO.Тип().Имя = "УдалениеОбъекта" Тогда
+
+ ПрочитатьУдаление(КомпонентыОбмена, ОбъектXDTO, МассивОбъектовКУдалению);
+
+ Иначе
+
+ ПравилоОбработки = ПОДПоТипуОбъектаXDTO(КомпонентыОбмена, ОбъектXDTO.Тип().Имя, Истина);
+
+ Если Не ЗначениеЗаполнено(ПравилоОбработки) Тогда
+ Возврат;
+ КонецЕсли;
+
+ // Конвертируем ОбъектXDTO в Структуру.
+ ДанныеXDTO = ОбъектXDTOВСтруктуру(ОбъектXDTO);
+
+ ИспользованиеПКО = Новый Структура;
+ Для Каждого ИмяПКО Из ПравилоОбработки.ИспользуемыеПКО Цикл
+ ИспользованиеПКО.Вставить(ИмяПКО, Истина);
+ КонецЦикла;
+
+ Если ЗначениеЗаполнено(ПравилоОбработки.ПриОбработке) Тогда
+ ПриОбработкеПОД(
+ КомпонентыОбмена,
+ ПравилоОбработки,
+ ДанныеXDTO,
+ ИспользованиеПКО);
+ КонецЕсли;
+
+ // 1. Поиск правила конвертации.
+ Для Каждого ТекущееПКО Из ИспользованиеПКО Цикл
+
+ ПравилоКонвертации = КомпонентыОбмена.ПравилаКонвертацииОбъектов.Найти(ТекущееПКО.Ключ, "ИмяПКО");
+
+ Если ТекущееПКО.Значение Тогда
+
+ СтрокаТаблицы = КомпонентыОбмена.ТаблицаДанныхЗаголовкаПакета.Добавить();
+
+ СтрокаТаблицы.ТипОбъектаСтрокой = ПравилоКонвертации.ТипПолученныхДанныхСтрокой;
+ СтрокаТаблицы.КоличествоОбъектовВИсточнике = 1;
+
+ СтрокаТаблицы.ТипПриемникаСтрокой = ПравилоКонвертации.ТипПолученныхДанныхСтрокой;
+ СтрокаТаблицы.ТипИсточникаСтрокой = ОбъектXDTO.Тип().Имя;
+
+ СтрокаТаблицы.ПоляПоиска = ПравилоКонвертации.ПоляПредставленияОбъекта;
+ СтрокаТаблицы.ПоляТаблицы = ПравилоКонвертации.РеквизитыШапкиПолученныхДанныхСтрокой;
+
+ СтрокаТаблицы.СинхронизироватьПоИдентификатору = ПравилоКонвертации.ВариантИдентификации = "СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска"
+ Или ПравилоКонвертации.ВариантИдентификации = "ПоУникальномуИдентификатору";
+
+ СтрокаТаблицы.ИспользоватьПредварительныйПросмотр = СтрокаТаблицы.СинхронизироватьПоИдентификатору;
+ СтрокаТаблицы.ЭтоКлассификатор = ПравилоКонвертации.ВариантИдентификации = "СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска";
+ СтрокаТаблицы.ЭтоУдалениеОбъекта = Ложь;
+
+ Если СтрокаТаблицы.СинхронизироватьПоИдентификатору Тогда
+ МассивЗагруженныхОбъектов.Добавить(СсылкаОбъектаПоУИДОбъектаXDTO(ДанныеXDTO.Ссылка.Значение, ПравилоКонвертации.ТипДанных, КомпонентыОбмена));
+ КонецЕсли;
+
+ ИначеЕсли ПравилоКонвертации.ВариантИдентификации = "СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска"
+ Или ПравилоКонвертации.ВариантИдентификации = "ПоУникальномуИдентификатору" Тогда
+ МассивОбъектовКУдалению.Добавить(СсылкаОбъектаПоУИДОбъектаXDTO(ДанныеXDTO.Ссылка.Значение, ПравилоКонвертации.ТипДанных, КомпонентыОбмена));
+ КонецЕсли;
+
+ КонецЦикла;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ ПрименитьУдалениеОбъектов(КомпонентыОбмена, МассивОбъектовКУдалению, МассивЗагруженныхОбъектов);
+
+КонецПроцедуры
+
+// Открывает файл выгрузки данных, записывает заголовок файла в соответствие с форматом обмена.
+//
+// Параметры:
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+// ИмяФайлаОбмена - строка
+//
+Процедура ОткрытьФайлВыгрузки(КомпонентыОбмена, ИмяФайлаОбмена = "") Экспорт
+
+ ФайлОбмена = Новый ЗаписьXML;
+ Если ИмяФайлаОбмена <> "" Тогда
+ ФайлОбмена.ОткрытьФайл(ИмяФайлаОбмена);
+ Иначе
+ ФайлОбмена.УстановитьСтроку();
+ КонецЕсли;
+ ФайлОбмена.ЗаписатьОбъявлениеXML();
+
+ ЗаписьСообщения = Неопределено;
+
+ Если КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда
+
+ ЗаписьСообщения = Новый Структура("НомерПринятого, НомерСообщения, Получатель");
+ ЗаписьСообщения.Получатель = КомпонентыОбмена.УзелКорреспондента;
+
+ Если ТранзакцияАктивна() Тогда
+ ВызватьИсключение НСтр("ru = 'Блокировка на обмен данными не может быть установлена в активной транзакции.'");
+ КонецЕсли;
+
+ // Устанавливаем блокировку на узел получателя.
+ Попытка
+ ЗаблокироватьДанныеДляРедактирования(ЗаписьСообщения.Получатель);
+ Исключение
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Ошибка установки блокировки на обмен данными.
+ |Возможно, обмен данными выполняется другим сеансом.
+ |
+ |Подробности:
+ |%1'"),
+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке())
+ );
+ КонецПопытки;
+
+ ДанныеПолучателя = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЗаписьСообщения.Получатель, "НомерОтправленного, НомерПринятого, Код");
+
+ ЗаписьСообщения.НомерСообщения = ДанныеПолучателя.НомерОтправленного + 1;
+ ЗаписьСообщения.НомерПринятого = ДанныеПолучателя.НомерПринятого;
+
+ КонецЕсли;
+
+ // Записываем элемент
+ ФайлОбмена.ЗаписатьНачалоЭлемента("Message");
+ ФайлОбмена.ЗаписатьСоответствиеПространстваИмен("msg", "http://www.1c.ru/SSL/Exchange/Message");
+ ФайлОбмена.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema");
+ ФайлОбмена.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
+
+ // Записываем элемент
+ Header = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(XMLБазоваяСхема(), "Header"));
+ Header.Format = КомпонентыОбмена.XMLСхема;
+ Header.CreationDate = ТекущаяУниверсальнаяДата();
+
+ Если КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда
+
+ Confirmation = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(XMLБазоваяСхема(), "Confirmation"));
+ Если КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда
+ Confirmation.ExchangePlan = ЗаписьСообщения.Получатель.Метаданные().Имя;
+ Confirmation.To = СокрЛП(ДанныеПолучателя.Код);
+ Confirmation.From = СокрЛП(ОбменДаннымиПовтИсп.ПолучитьКодЭтогоУзлаДляПланаОбмена(Confirmation.ExchangePlan));
+ Confirmation.MessageNo = ЗаписьСообщения.НомерСообщения;
+ Confirmation.ReceivedNo = ЗаписьСообщения.НомерПринятого;
+ КонецЕсли;
+ Header.Confirmation = Confirmation;
+
+ КонецЕсли;
+
+ Если КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда
+ Для Каждого ВерсияФормата Из ВерсииФорматаОбменаМассив(КомпонентыОбмена.УзелКорреспондента) Цикл
+ Header.AvailableVersion.Добавить(ВерсияФормата);
+ КонецЦикла;
+ Иначе
+ Header.AvailableVersion.Добавить(КомпонентыОбмена.ВерсияФорматаОбмена);
+ КонецЕсли;
+
+ ФабрикаXDTO.ЗаписатьXML(ФайлОбмена, Header);
+
+ // Записываем элемент
+ ФайлОбмена.ЗаписатьНачалоЭлемента("Body");
+ ФайлОбмена.ЗаписатьСоответствиеПространстваИмен("", КомпонентыОбмена.XMLСхема);
+
+ КомпонентыОбмена.Вставить("ФайлОбмена", ФайлОбмена);
+
+КонецПроцедуры
+
+// Открывает файл загрузки данных, записывает заголовок файла в соответствие с форматом обмена.
+//
+// Параметры:
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+// ИмяФайлаОбмена - строка
+//
+Процедура ОткрытьФайлЗагрузки(КомпонентыОбмена, ИмяФайлаОбмена) Экспорт
+
+ ЭтоОбменЧерезПланОбмена = КомпонентыОбмена.ЭтоОбменЧерезПланОбмена;
+
+ ЧтениеXML = Новый ЧтениеXML;
+
+ НомерИтерации = 0;
+ КомпонентыОбмена.ФлагОшибки = Истина;
+ Пока НомерИтерации = 0 Цикл
+
+ НомерИтерации = 1;
+
+ Попытка
+ ЧтениеXML.ОткрытьФайл(ИмяФайлаОбмена);
+ ЧтениеXML.Прочитать(); // Message
+ Исключение
+
+ СтрокаСообщенияОбОшибке = НСтр("ru = 'Ошибка при загрузке данных: %1'");
+ СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ОписаниеОшибки());
+ ЗаписатьВПротоколВыполнения(КомпонентыОбмена, СтрокаСообщенияОбОшибке);
+ Прервать;
+
+ КонецПопытки;
+
+ Если (ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента
+ Или ЧтениеXML.ЛокальноеИмя <> "Message") Тогда
+ ЗаписатьВПротоколВыполнения(КомпонентыОбмена, 9);
+ Прервать;
+ КонецЕсли;
+
+ ЧтениеXML.Прочитать(); // Header
+ Если ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента
+ Или ЧтениеXML.ЛокальноеИмя <> "Header" Тогда
+ ЗаписатьВПротоколВыполнения(КомпонентыОбмена, 9);
+ Прервать;
+ КонецЕсли;
+
+ Header = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ФабрикаXDTO.Тип(XMLБазоваяСхема(), "Header"));
+ Если ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента
+ Или ЧтениеXML.ЛокальноеИмя <> "Body" Тогда
+ ЗаписатьВПротоколВыполнения(КомпонентыОбмена, 9);
+ Прервать;
+ КонецЕсли;
+
+
+ Если ЭтоОбменЧерезПланОбмена Тогда
+
+ Если Не Header.Установлено("Confirmation") Тогда
+ ЗаписатьВПротоколВыполнения(КомпонентыОбмена, 9);
+ Прервать;
+ КонецЕсли;
+
+ Confirmation = Header.Confirmation;
+
+ КодОтКого = Confirmation.From;
+ КодКому = Confirmation.To;
+ ИмяПланаОбмена = Confirmation.ExchangePlan;
+ КомпонентыОбмена.НомерВходящегоСообщения = Confirmation.MessageNo;
+ КомпонентыОбмена.НомерСообщенияПолученногоКорреспондентом = Confirmation.ReceivedNo;
+
+ Если Метаданные.ПланыОбмена.Найти(ИмяПланаОбмена) = Неопределено Тогда
+ ЗаписатьВПротоколВыполнения(КомпонентыОбмена, 177);
+ Прервать;
+ КонецЕсли;
+
+ ПолучательИзСообщения = ПланыОбмена[ИмяПланаОбмена].НайтиПоКоду(КодКому);
+ Если ПолучательИзСообщения <> ПланыОбмена[ИмяПланаОбмена].ЭтотУзел() Тогда
+ ЗаписатьВПротоколВыполнения(КомпонентыОбмена, 178);
+ Прервать;
+ КонецЕсли;
+
+ ОтправительИзСообщения = ПланыОбмена[ИмяПланаОбмена].НайтиПоКоду(КодОтКого);
+ Если ОтправительИзСообщения.Пустая()
+ Или ОтправительИзСообщения <> КомпонентыОбмена.УзелКорреспондента Тогда
+
+ СтрокаСообщения = НСтр("ru = 'Не найден узел обмена для загрузки данных. План обмена: %1, Код: %2'");
+ СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ИмяПланаОбмена, КодОтКого);
+ ВызватьИсключение СтрокаСообщения;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ ФорматОбмена = РазложитьФорматОбмена(Header.Format);
+
+ Если ЭтоОбменЧерезПланОбмена Тогда
+
+ // Проверяем базовый формат
+ МенеджерПланаОбмена = МенеджерПланаОбмена(КомпонентыОбмена.УзелКорреспондента);
+ Если МенеджерПланаОбмена.ФорматОбмена() <> ФорматОбмена.БазовыйФормат Тогда
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Формат сообщения обмена <%1> не соответствует формату плана обмена <%2>.'"),
+ ФорматОбмена.БазовыйФормат,
+ МенеджерПланаОбмена.ФорматОбмена()
+ );
+ КонецЕсли;
+
+ // Проверяем версию формата сообщения обмена.
+ Если ВерсииФорматаОбменаМассив(КомпонентыОбмена.УзелКорреспондента).Найти(ФорматОбмена.Версия) = Неопределено Тогда
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Версия формата сообщения обмена <%1> не поддерживается.'"),
+ ФорматОбмена.Версия
+ );
+ КонецЕсли;
+
+ Если ОбщегоНазначения.ЗначениеРеквизитаОбъекта(КомпонентыОбмена.УзелКорреспондента, "НомерПринятого") >= КомпонентыОбмена.НомерВходящегоСообщения Тогда
+
+ // Номер сообщения меньше либо равен ранее принятому.
+ КомпонентыОбмена.СостояниеОбменаДанными.РезультатВыполненияОбмена =
+ Перечисления.РезультатыВыполненияОбмена.Предупреждение_СообщениеОбменаБылоРанееПринято;
+
+ ЗаписатьВПротоколВыполнения(КомпонентыОбмена, 174,,,,, Истина);
+ Прервать;
+
+ КонецЕсли;
+
+ // Удаляем регистрацию изменений.
+ ПланыОбмена.УдалитьРегистрациюИзменений(КомпонентыОбмена.УзелКорреспондента, КомпонентыОбмена.НомерСообщенияПолученногоКорреспондентом);
+
+ // Снимаем признак начальной выгрузки данных.
+ РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.СнятьПризнакНачальнойВыгрузкиДанных(
+ КомпонентыОбмена.УзелКорреспондента, КомпонентыОбмена.НомерСообщенияПолученногоКорреспондентом);
+
+ КонецЕсли;
+
+
+ КомпонентыОбмена.XMLСхема = Header.Format;
+ КомпонентыОбмена.ВерсияФорматаОбмена = ФорматОбмена.Версия;
+ КомпонентыОбмена.МенеджерОбмена = МенеджерОбменаВерсииФормата(
+ КомпонентыОбмена.УзелКорреспондента,
+ КомпонентыОбмена.ВерсияФорматаОбмена);
+
+ // Проверяем возможность увеличения версии.
+ ДоступныеВерсииОтправителя = Header.AvailableVersion;
+ ДоступныеВерсииПолучателя = ВерсииФорматаОбменаМассив(КомпонентыОбмена.УзелКорреспондента);
+ НомерВерсииКорреспондента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(КомпонентыОбмена.УзелКорреспондента, "ВерсияФорматаОбмена");
+ МаксимальнаяОбщаяВерсия = НомерВерсииКорреспондента;
+ Для Каждого ДоступнаяВерсияОтправителя Из ДоступныеВерсииОтправителя Цикл
+ Если ДоступныеВерсииПолучателя.Найти(ДоступнаяВерсияОтправителя) = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+ РезультатСравненияВерсий = СравнитьВерсии(СокрЛП(ДоступнаяВерсияОтправителя), СокрЛП(МаксимальнаяОбщаяВерсия));
+ Если РезультатСравненияВерсий > 0 Тогда
+ МаксимальнаяОбщаяВерсия = ДоступнаяВерсияОтправителя;
+ КонецЕсли;
+ КонецЦикла;
+ Если МаксимальнаяОбщаяВерсия <> НомерВерсииКорреспондента Тогда
+ // Обнаружена более свежая общая версия.
+ УзелКорреспондентаОбъект = КомпонентыОбмена.УзелКорреспондента.ПолучитьОбъект();
+ УзелКорреспондентаОбъект.ВерсияФорматаОбмена = МаксимальнаяОбщаяВерсия;
+ УзелКорреспондентаОбъект.Записать();
+ ЗаписатьВПротоколВыполнения(КомпонентыОбмена,
+ НСтр("ru = 'Изменен номер версии формата обмена.'"),,Ложь,,, Истина);
+ КонецЕсли;
+
+ ЧтениеXML.Прочитать(); // Body
+
+ КомпонентыОбмена.ФлагОшибки = Ложь;
+
+ КонецЦикла;
+
+ Если КомпонентыОбмена.ФлагОшибки Тогда
+ ЧтениеXML.Закрыть();
+ Иначе
+ КомпонентыОбмена.Вставить("ФайлОбмена", ЧтениеXML);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Выполняет преобразование объекта XDTO в структуру с данными.
+//
+// Параметры:
+// ОбъектXDTO - Значение типа ОбъектXDTO, которое необходимо преобразовать.
+//
+// Возвращаемое значение:
+// Структура - Структура, имитирующая объект XDTO.
+// Ключи структуры соответствуют свойствам объекта XDTO.
+// Значения соответствуют значениям свойств объекта XDTO.
+//
+Функция ОбъектXDTOВСтруктуру(ОбъектXDTO) Экспорт
+
+ Приемник = Новый Структура;
+
+ Для Каждого Свойство Из ОбъектXDTO.Свойства() Цикл
+
+ КонвертацияСвойстваXDTOВЭлементСтруктуры(ОбъектXDTO, Свойство, Приемник);
+
+ КонецЦикла;
+
+ Если Приемник.Свойство("КлючевыеСвойства")
+ И Приемник.КлючевыеСвойства.Свойство("Ссылка") Тогда
+ Приемник.Вставить("Ссылка", Приемник.КлючевыеСвойства.Ссылка);
+ КонецЕсли;
+
+ Возврат Приемник;
+КонецФункции
+
+// Преобразует строковое представление УИД в ссылку на объект текущей информационной базы.
+// Если объект с такой ссылкой существует, она возвращается в качестве результата.
+// Если объекта с такой ссылкой нет, выполняется поиск УИД в регистре
+// ПубличныеИдентификаторыСинхронизируемыхОбъектов.
+// При удачном поиске возвращается ссылка из регистра, при неудачном возвращается изначальная ссылка.
+//
+// Параметры:
+// УИДОбъектаXDTO - Строка - Уникальный идентификатор объекта XDTO, для которого необходимо
+// получить ссылку соответствующего объекта информационной базы.
+//
+// ТипЗначенияОбъектаИБ - Тип - Тип объекта информационной базы, которому должна соответствовать
+// получаемая ссылка.
+//
+// КомпонентыОбмена - Структура - Содержит все необходимые данные, инициализированные при начале
+// выполнения обмена (ПКО, ПКПД, ПОД и т.д.).
+//
+// Возвращаемое значение:
+// Ссылка на объект информационной базы.
+//
+Функция СсылкаОбъектаПоУИДОбъектаXDTO(УИДОбъектаXDTO, ТипЗначенияОбъектаИБ, КомпонентыОбмена) Экспорт
+
+ УстановитьПривилегированныйРежим(Истина);
+
+ // Поиск ссылки по УИД
+ СсылкаПоУИД = СсылкаПоУИД(ТипЗначенияОбъектаИБ, УИДОбъектаXDTO);
+ Если Не СсылкаПоУИД.Пустая() И ОбщегоНазначения.СсылкаСуществует(СсылкаПоУИД) Тогда
+ Возврат СсылкаПоУИД; // Найден объект по уникальному идентификатору ссылки.
+ КонецЕсли;
+
+ // Определение ссылки на объект через публичную ссылку.
+ ПубличнаяСсылка = НайтиСсылкуПоПубличномуИдентификатору(УИДОбъектаXDTO, КомпонентыОбмена, ТипЗначенияОбъектаИБ);
+ Если ПубличнаяСсылка <> Неопределено Тогда
+ // Переданная ссылка не является публичной. Возврат "битой" ссылки.
+ Возврат ПубличнаяСсылка;
+ КонецЕсли;
+
+ Возврат СсылкаПоУИД;
+
+КонецФункции
+
+// Устанавливает значение параметра "Загрузка" для свойства объекта "ОбменДанными".
+//
+// Параметры:
+// Объект - объект, для которого устанавливается свойство.
+// Значение - значение устанавливаемого свойства "Загрузка".
+//
+Процедура УстановитьОбменДаннымиЗагрузка(Объект, Значение = Истина, Знач ОтправкаНазад = Ложь, УзелОбменаЗагрузкаДанных = Неопределено) Экспорт
+
+ // Не все объекты, которые участвуют в обмене, имеют свойство "ОбменДанными".
+ Попытка
+ Объект.ОбменДанными.Загрузка = Значение;
+ Исключение
+ Возврат;
+ КонецПопытки;
+
+ Если Не ОтправкаНазад
+ И УзелОбменаЗагрузкаДанных <> Неопределено
+ И НЕ УзелОбменаЗагрузкаДанных.Пустая() Тогда
+
+ Попытка
+ Объект.ОбменДанными.Отправитель = УзелОбменаЗагрузкаДанных;
+ Исключение
+ КонецПопытки;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Записывает объект в информационную базу.
+//
+// Параметры:
+// Объект - Записываемый объект.
+// Тип - Строка - Тип объекта строкой.
+//
+Процедура ЗаписатьОбъектВИБ(КомпонентыОбмена, Объект, Тип, ЗаписатьОбъект = Ложь, Знач ОтправкаНазад = Ложь, УникальныйИдентификаторСтрокой = "") Экспорт
+
+ Если ОбщегоНазначенияПовтИсп.РазделениеВключено()
+ И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных()
+ И Не ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(Объект.Метаданные().ПолноеИмя(), ОбщегоНазначенияПовтИсп.РазделительОсновныхДанных())
+ И Не ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(Объект.Метаданные().ПолноеИмя(), ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда
+
+ СтрокаСообщенияОбОшибке = НСтр("ru = 'Попытка изменение неразделенных данных (%1) в разделенном режиме.'");
+ СтрокаСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, Объект.Метаданные().ПолноеИмя());
+
+ КомпонентыОбмена.СостояниеОбменаДанными.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.ВыполненоСПредупреждениями;
+ ЗаписатьВПротоколВыполнения(КомпонентыОбмена, СтрокаСообщенияОбОшибке,, Ложь);
+
+ Возврат;
+
+ КонецЕсли;
+
+ Если КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда
+ // Устанавливаем режим загрузки данных для объекта.
+ УстановитьОбменДаннымиЗагрузка(Объект,, ОтправкаНазад, КомпонентыОбмена.УзелКорреспондента);
+ Иначе
+ УстановитьОбменДаннымиЗагрузка(Объект,, ОтправкаНазад);
+ КонецЕсли;
+
+ // Выполняем проверку на пометку удаления предопределенного элемента.
+ СнятьПометкуУдаленияСПредопределенногоЭлемента(Объект, Тип, КомпонентыОбмена);
+
+ НачатьТранзакцию();
+ Попытка
+
+ // Записываем объект в транзакцию.
+ Объект.Записать();
+
+ ЗафиксироватьТранзакцию();
+
+ Исключение
+ ОтменитьТранзакцию();
+
+ ЗаписатьОбъект = Ложь;
+
+ ЗаписатьИнформациюОбОшибкеВПротокол(26, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Объект, КомпонентыОбмена, Тип);
+
+ ВызватьИсключение КомпонентыОбмена.СтрокаСообщенияОбОшибке;
+
+ КонецПопытки;
+
+КонецПроцедуры
+
+// Выполняет отложенное проведение загруженных документов после загрузки всех данных.
+//
+// Параметры:
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+//
+Процедура ВыполнитьОтложенноеПроведениеДокументов(КомпонентыОбмена) Экспорт
+
+ ДокументыДляОтложенногоПроведения = КомпонентыОбмена.ДокументыДляОтложенногоПроведения;
+ Если ДокументыДляОтложенногоПроведения.Количество() = 0 Тогда
+ Возврат // нет документов в очереди
+ КонецЕсли;
+
+ // Сворачиваем таблицу по уникальным полям.
+ ДокументыДляОтложенногоПроведения.Свернуть("ДокументСсылка, ДатаДокумента, ДокументПроведенУспешно", "ЭтоКоллизия");
+
+ // Сортируем документы по возрастанию даты документов.
+ ДокументыДляОтложенногоПроведения.Сортировать("ДатаДокумента");
+
+ ОбменДаннымиСервер.ПропуститьПроверкуЗапретаИзменения();
+
+ Для Каждого СтрокаТаблицы Из ДокументыДляОтложенногоПроведения Цикл
+
+ Если СтрокаТаблицы.ДокументСсылка.Пустая() Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Объект = СтрокаТаблицы.ДокументСсылка.ПолучитьОбъект();
+
+ Если Объект = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+
+ ВыполнитьПроведениеДокументаПриЗагрузке(КомпонентыОбмена, Объект, Истина);
+
+ СтрокаТаблицы.ДокументПроведенУспешно = Не Объект.Проведен;
+
+ КонецЦикла;
+
+ ОбменДаннымиСервер.ПропуститьПроверкуЗапретаИзменения(Ложь);
+
+КонецПроцедуры
+
+// Выполняет проведение документа при его загрузке в информационную базу.
+//
+// Параметры:
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+// Объект - ДокументОбъект (загруженный документ).
+// РегистрироватьПроблемыВРезультатахОбмена - Булево
+//
+Процедура ВыполнитьПроведениеДокументаПриЗагрузке(
+ КомпонентыОбмена,
+ Объект,
+ РегистрироватьПроблемыВРезультатахОбмена = Ложь) Экспорт
+
+ ОписаниеОшибки = "";
+ ДокументПроведенУспешно = Ложь;
+
+ КлючСообщенияЖурналаРегистрации = КомпонентыОбмена.КлючСообщенияЖурналаРегистрации;
+ УзелКорреспондента = КомпонентыОбмена.УзелКорреспондента;
+
+ // Устанавливаем узел-отправитель для предотвращения регистрации объекта на узле, для которого производим загрузку
+ // проведение выполняем не в режиме загрузки.
+ УстановитьОбменДаннымиЗагрузка(Объект, Ложь, Ложь, УзелКорреспондента);
+
+ Попытка
+
+ Объект.ДополнительныеСвойства.Вставить("ОтложенноеПроведение");
+
+ Если Объект.ПроверитьЗаполнение() Тогда
+
+ // При проведении документа снимаем запрет на выполнение ПРО,
+ // т.к. ПРО были проигнорированы при обычной записи документа с целью оптимизации скорости загрузки данных.
+ Если Объект.ДополнительныеСвойства.Свойство("ОтключитьМеханизмРегистрацииОбъектов") Тогда
+ Объект.ДополнительныеСвойства.Удалить("ОтключитьМеханизмРегистрацииОбъектов");
+ КонецЕсли;
+
+ Объект.ДополнительныеСвойства.Вставить("ПропуститьПроверкуЗапретаИзменения");
+
+ СведенияОВерсииОбъекта = Новый Структура;
+ СведенияОВерсииОбъекта.Вставить("ОтложеннаяОбработка", Истина);
+ СведенияОВерсииОбъекта.Вставить("ТипВерсииОбъекта", "ИзмененоПользователем");
+ СведенияОВерсииОбъекта.Вставить("АвторВерсии", УзелКорреспондента);
+ Объект.ДополнительныеСвойства.Вставить("СведенияОВерсииОбъекта", СведенияОВерсииОбъекта);
+
+ // Выполняем попытку проведения документа.
+ Объект.Записать(РежимЗаписиДокумента.Проведение);
+
+ ДокументПроведенУспешно = Объект.Проведен;
+
+ КонецЕсли;
+
+ Исключение
+
+ ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
+
+ КонецПопытки;
+
+ Если Не ДокументПроведенУспешно Тогда
+
+ ОбменДаннымиСервер.ЗарегистрироватьОшибкуПроведенияДокумента(Объект, УзелКорреспондента, ОписаниеОшибки);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Отменяет проведение объекта в информационной базе.
+//
+// Параметры:
+// Объект - ДокументОбъект (документ для отмены проведения).
+// Отправитель - Ссылка на узел плана обмена, который является отправителем данных.
+//
+Функция ОтменитьПроведениеОбъектаВИБ(Объект, Отправитель) Экспорт
+
+ // Устанавливаем режим загрузки данных для объекта.
+ УстановитьОбменДаннымиЗагрузка(Объект, Истина, Ложь, Отправитель);
+
+ // Проверка на коллизии дат запрета загрузки.
+ Отказ = Ложь;
+
+ Объект.ДополнительныеСвойства.Вставить("ПропуститьПроверкуЗапретаИзменения");
+
+ НачатьТранзакцию();
+ Попытка
+
+ // Отменяем проведение документа.
+ Объект.Проведен = Ложь;
+ Объект.Записать();
+
+ УдалитьДвиженияУДокумента(Объект, Отказ);
+
+ ЗафиксироватьТранзакцию();
+
+ Возврат Истина;
+ Исключение
+ ОтменитьТранзакцию();
+ Возврат Ложь;
+ КонецПопытки;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+#Область ИнициализацияОбмена
+// Создает таблицу значений для хранения заголовка пакета с данными.
+//
+// Возвращаемое значение:
+// Таблица значений
+//
+Функция НоваяТаблицаДанныхЗаголовкаПакета() Экспорт
+
+ ТаблицаДанныхЗаголовкаПакета = Новый ТаблицаЗначений;
+ Колонки = ТаблицаДанныхЗаголовкаПакета.Колонки;
+
+ Колонки.Добавить("ТипОбъектаСтрокой", Новый ОписаниеТипов("Строка"));
+ Колонки.Добавить("КоличествоОбъектовВИсточнике", Новый ОписаниеТипов("Число"));
+ Колонки.Добавить("ПоляПоиска", Новый ОписаниеТипов("Строка"));
+ Колонки.Добавить("ПоляТаблицы", Новый ОписаниеТипов("Строка"));
+
+ Колонки.Добавить("ТипИсточникаСтрокой", Новый ОписаниеТипов("Строка"));
+ Колонки.Добавить("ТипПриемникаСтрокой", Новый ОписаниеТипов("Строка"));
+
+ Колонки.Добавить("СинхронизироватьПоИдентификатору", Новый ОписаниеТипов("Булево"));
+ Колонки.Добавить("ЭтоУдалениеОбъекта", Новый ОписаниеТипов("Булево"));
+ Колонки.Добавить("ЭтоКлассификатор", Новый ОписаниеТипов("Булево"));
+ Колонки.Добавить("ИспользоватьПредварительныйПросмотр", Новый ОписаниеТипов("Булево"));
+
+ Возврат ТаблицаДанныхЗаголовкаПакета;
+
+КонецФункции
+
+// Создает таблицу значений для хранения правил конвертации свойств объекта.
+//
+// Возвращаемое значение:
+// Таблица значений
+//
+Функция ИнициализироватьТаблицуСвойствДляПравилаКонвертации() Экспорт
+
+ ТаблицаПКС = Новый ТаблицаЗначений;
+ ТаблицаПКС.Колонки.Добавить("СвойствоКонфигурации", Новый ОписаниеТипов("Строка"));
+ ТаблицаПКС.Колонки.Добавить("СвойствоФормата", Новый ОписаниеТипов("Строка"));
+ ТаблицаПКС.Колонки.Добавить("ПравилоКонвертацииСвойства", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(50)));
+ ТаблицаПКС.Колонки.Добавить("ИспользуетсяАлгоритмКонвертации", Новый ОписаниеТипов("Булево"));
+ ТаблицаПКС.Колонки.Добавить("ОбработкаКлючевогоСвойства", Новый ОписаниеТипов("Булево"));
+ ТаблицаПКС.Колонки.Добавить("ОбработкаПоисковогоСвойства", Новый ОписаниеТипов("Булево"));
+ ТаблицаПКС.Колонки.Добавить("ИмяТЧ", Новый ОписаниеТипов("Строка"));
+
+ Возврат ТаблицаПКС;
+
+КонецФункции
+
+// Получает правила регистрации объектов для плана обмена.
+//
+// Возвращаемое значение:
+// Таблица значений
+//
+Функция ПравилаРегистрацииОбъектов(УзелПланаОбмена) Экспорт
+ ПравилаРегистрацииОбъектов = ОбменДаннымиВызовСервера.ПараметрыСеансаПравилаРегистрацииОбъектов().Получить();
+
+ Отбор = Новый Структура;
+ Отбор.Вставить("ИмяПланаОбмена", ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелПланаОбмена));
+
+ ТаблицаПравилаРегистрацииОбъектов = ПравилаРегистрацииОбъектов.Скопировать(Отбор, "ОбъектМетаданныхИмя, ИмяРеквизитаФлага");
+ ТаблицаПравилаРегистрацииОбъектов.Индексы.Добавить("ОбъектМетаданныхИмя");
+
+ Возврат ТаблицаПравилаРегистрацииОбъектов;
+
+КонецФункции
+
+// Получает свойства узла плана обмена.
+//
+// Возвращаемое значение:
+// Структура (ключ соответствует имени свойства, а значение - значению свойства).
+Функция СвойстваУзлаПланаОбмена(Узел) Экспорт
+
+ СвойстваУзлаПланаОбмена = Новый Структура;
+
+ // получаем имена реквизитов
+ ИменаРеквизитов = ОбщегоНазначения.ИменаРеквизитовПоТипу(Узел, Тип("ПеречислениеСсылка.РежимыВыгрузкиОбъектовОбмена"));
+
+ // Получаем значения реквизитов.
+ Если Не ПустаяСтрока(ИменаРеквизитов) Тогда
+
+ СвойстваУзлаПланаОбмена = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Узел, ИменаРеквизитов);
+
+ КонецЕсли;
+
+ Возврат СвойстваУзлаПланаОбмена;
+КонецФункции
+
+#КонецОбласти
+
+#Область ОтправкаДанных
+// Выполняет выгрузку объекта информационной базы.
+//
+// Параметры:
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+// Объект - Ссылка на объект информационной базы.
+// ПравилоОбработки - Строка таблицы значений правил обработки данных,
+// соответствующая правилу обработки типа выгружаемого объекта.
+// Если ПравилоОбработки не задано, оно будет найдено по объекту метаданных выгружаемого объекта.
+//
+Процедура ВыгрузкаОбъектаВыборки(КомпонентыОбмена, Объект, ПравилоОбработки = Неопределено) Экспорт
+
+ ЗаписьXML = КомпонентыОбмена.ФайлОбмена;
+ Если ТипЗнч(Объект) <> Тип("Структура") Тогда
+
+ КомпонентыОбмена.ВыгруженныеОбъекты.Добавить(Объект.Ссылка);
+
+ ОбъектМетаданныхТекущий = Объект.Метаданные();
+ ПравилоОбработки = ПОДПоОбъектуМетаданных(КомпонентыОбмена, ОбъектМетаданныхТекущий);
+
+ Иначе
+ КомпонентыОбмена.ВыгруженныеОбъекты.Добавить(Объект);
+ КонецЕсли;
+
+ // Отработка ПОД
+ ИспользованиеПКО = Новый Структура;
+ Для Каждого ИмяПКО Из ПравилоОбработки.ИспользуемыеПКО Цикл
+ ИспользованиеПКО.Вставить(ИмяПКО, Истина);
+ КонецЦикла;
+
+ Если ЗначениеЗаполнено(ПравилоОбработки.ПриОбработке) Тогда
+ ПриОбработкеПОД(
+ КомпонентыОбмена,
+ ПравилоОбработки,
+ Объект,
+ ИспользованиеПКО);
+ КонецЕсли;
+
+ // Отработка ПКО
+ НесколькоПКО = (ПравилоОбработки.ИспользуемыеПКО.Количество() > 1);
+ Для Каждого ТекущееПКО Из ИспользованиеПКО Цикл
+
+ Если Не ТекущееПКО.Значение Тогда
+ // Если правил конвертации несколько, и некоторые из них не используются -
+ // необходимо выгрузить удаление объекта на случай если ранее он был выгружен по этим правилам.
+
+ Если НесколькоПКО Тогда
+ ПравилоКонвертации = КомпонентыОбмена.ПравилаКонвертацииОбъектов.Найти(ТекущееПКО.Ключ, "ИмяПКО");
+ ВыгрузитьУдаление(КомпонентыОбмена, Объект.Ссылка, ПравилоКонвертации);
+ КонецЕсли;
+
+ Продолжить;
+ КонецЕсли;
+
+ // 1. Поиск правила конвертации.
+
+ ПравилоКонвертации = КомпонентыОбмена.ПравилаКонвертацииОбъектов.Найти(ТекущееПКО.Ключ, "ИмяПКО");
+
+ // 2. Конвертируем Данные в Структуру по правилам конвертации.
+ ДанныеXDTO = ДанныеXDTOИзДанныхИБ(КомпонентыОбмена, Объект, ПравилоКонвертации, Неопределено);
+
+ // 3. Конвертируем Структуру в ОбъектXDTO.
+ СсылкиИзОбъекта = Новый Массив;
+ ОбъектXDTO = ОбъектXDTOИзДанныхXDTO(КомпонентыОбмена, ДанныеXDTO, ПравилоКонвертации.ТипXDTO,,СсылкиИзОбъекта);
+
+ Попытка
+ ОбъектXDTO.Проверить();
+ Исключение
+ ТекстОписаниеОшибки = "" + ОписаниеОшибки() + Символы.ПС + СокрЛП(Объект);
+ ЗаписатьВПротоколВыполнения(КомпонентыОбмена, ТекстОписаниеОшибки);
+ Возврат;
+ КонецПопытки;
+
+ Если КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда
+
+ Для Каждого ЗначениеСсылки Из СсылкиИзОбъекта Цикл
+
+ Если КомпонентыОбмена.ВыгруженныеОбъекты.Найти(ЗначениеСсылки) = Неопределено
+ И ВыгружатьОбъектПоНеобходимости(КомпонентыОбмена, ЗначениеСсылки) Тогда
+
+ Если Не РегистрыСведений.ДанныеОбъектовДляРегистрацииВОбменах.ОбъектЕстьВРегистре(ЗначениеСсылки, КомпонентыОбмена.УзелКорреспондента) Тогда
+
+ ОбъектВыгружаемыйПоСсылке = Неопределено;
+
+ Попытка
+ ОбъектВыгружаемыйПоСсылке = ЗначениеСсылки.ПолучитьОбъект();
+ Исключение
+ КонецПопытки;
+
+ Если ОбъектВыгружаемыйПоСсылке <> Неопределено Тогда
+
+ ВыгрузкаОбъектаВыборки(КомпонентыОбмена, ОбъектВыгружаемыйПоСсылке);
+ КомпонентыОбмена.ВыгруженныеПоСсылкеОбъекты.Добавить(ЗначениеСсылки);
+ РегистрыСведений.ДанныеОбъектовДляРегистрацииВОбменах.ДобавитьОбъектВФильтрРазрешенныхОбъектов(ЗначениеСсылки, КомпонентыОбмена.УзелКорреспондента);
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ // 4. Записываем ОбъектXDTO в XML-файл.
+ ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ПроцедурыИФункцииВерсионированияФорматаОбмена
+// Возвращает менеджер обмена данными, соответствующий указанной версии формата обмена.
+//
+// Параметры:
+// УзелИнформационнойБазы - ссылка на узел - корреспондент.
+// ВерсияФормата - Строка
+//
+Функция МенеджерОбменаВерсииФормата(Знач УзелИнформационнойБазы, Знач ВерсияФормата) Экспорт
+
+ Результат = ВерсииФорматаОбмена(УзелИнформационнойБазы).Получить(ВерсияФормата);
+
+ Если Результат = Неопределено Тогда
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Не определен Менеджер конвертации для версии формата обмена <%1>.'"),
+ ВерсияФормата
+ );
+ КонецЕсли;
+
+ Возврат Результат;
+КонецФункции
+
+// Возвращает строку с форматом обмена.
+// Формат обмена включает:
+// Базовый формат, предусмотренный для плана обмена.
+// Версию базового формата
+//
+// Параметры:
+// УзелИнформационнойБазы - ссылка на узел - корреспондент.
+// ВерсияФормата - Строка
+//
+Функция ФорматОбмена(Знач УзелИнформационнойБазы, Знач ВерсияФормата) Экспорт
+
+ ФорматОбмена = МенеджерПланаОбмена(УзелИнформационнойБазы).ФорматОбмена();
+ ЭлементыФормата = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ФорматОбмена, "/");
+ ЭлементыФормата.Добавить(ВерсияФормата);
+
+ Возврат СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ЭлементыФормата, "/");
+КонецФункции
+
+// Возвращает строку с номером версии формата обмена, поддерживаемой получателем данных.
+//
+// Параметры:
+// Получатель - ссылка на узел плана обмена, в который производится выгрузка данных.
+//
+Функция ВерсияФорматаОбменаПриВыгрузке(Знач Получатель) Экспорт
+
+ Результат = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Получатель, "ВерсияФорматаОбмена");
+ Если Результат = Неопределено Тогда
+
+ // Если версия формата обмена не задана, то используем минимальную версию.
+ Результат = МинимальнаяВерсияФорматаОбмена(Получатель);
+
+ КонецЕсли;
+
+ Возврат СокрЛП(Результат);
+КонецФункции
+
+// Сравнить две строки версий.
+//
+// Параметры:
+// СтрокаВерсии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 Тогда
+ Возврат Результат;
+ КонецЕсли;
+ КонецЦикла;
+ Возврат Результат;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область Прочее
+
+// Процедура добавляет объект информационной базы в фильтр разрешенных объектов.
+// Параметры:
+// Данные - ссылка на объект ИБ, который необходимо добавить в фильтр разрешенных объектов.
+// Получатель - ПланОбменаСсылка - ссылка на план обмена, для которого выполняется проверка объекта.
+//
+Процедура ДобавитьОбъектВФильтрРазрешенныхОбъектов(Данные, Получатель) Экспорт
+
+ РегистрыСведений.ДанныеОбъектовДляРегистрацииВОбменах.ДобавитьОбъектВФильтрРазрешенныхОбъектов(Данные, Получатель);
+
+КонецПроцедуры
+
+// Функция возвращает массив узлов, в которые объект ранее выгружался.
+//
+// Параметры:
+// Ссылка - Ссылка на объект ИБ, для которого необходимо получить массив узлов.
+// ИмяПланаОбмена - Строка - имя плана обмена, как объекта метаданных, по которому определяются узлы.
+// ИмяРеквизитаФлага - Строка - имя реквизита плана обмена, по которому устанавливается фильтр на выборку узлов.
+// Возвращаемое значение:
+// МассивУзлов - Массив узлов плана обмена, для которых установлен признак «Выгружать при необходимости», изначально
+// пуст.
+//
+Функция МассивУзловДляРегистрацииВыгружатьПриНеобходимости(Ссылка, ИмяПланаОбмена, ИмяРеквизитаФлага) Экспорт
+
+ ТекстЗапроса = "
+ |ВЫБРАТЬ РАЗЛИЧНЫЕ
+ | ШапкаПланаОбмена.Ссылка КАК Узел
+ |ИЗ
+ | ПланОбмена.[ИмяПланаОбмена] КАК ШапкаПланаОбмена
+ |ЛЕВОЕ СОЕДИНЕНИЕ
+ | РегистрСведений.ДанныеОбъектовДляРегистрацииВОбменах КАК ДанныеОбъектовДляРегистрацииВОбменах
+ |ПО
+ | ШапкаПланаОбмена.Ссылка = ДанныеОбъектовДляРегистрацииВОбменах.УзелИнформационнойБазы
+ | И ДанныеОбъектовДляРегистрацииВОбменах.Ссылка = &Объект
+ |ГДЕ
+ | ШапкаПланаОбмена.Ссылка <> &ЭтотУзел
+ | И ШапкаПланаОбмена.[ИмяРеквизитаФлага] = ЗНАЧЕНИЕ(Перечисление.РежимыВыгрузкиОбъектовОбмена.ВыгружатьПриНеобходимости)
+ | И НЕ ШапкаПланаОбмена.ПометкаУдаления
+ | И ДанныеОбъектовДляРегистрацииВОбменах.Ссылка = &Объект
+ |";
+
+ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяПланаОбмена]", ИмяПланаОбмена);
+ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяРеквизитаФлага]", ИмяРеквизитаФлага);
+
+ Запрос = Новый Запрос;
+ Запрос.Текст = ТекстЗапроса;
+ Запрос.УстановитьПараметр("ЭтотУзел", ОбменДаннымиПовтИсп.ПолучитьЭтотУзелПланаОбмена(ИмяПланаОбмена));
+ Запрос.УстановитьПараметр("Объект", Ссылка);
+
+ МассивУзлов = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Узел");
+
+ Возврат МассивУзлов;
+
+КонецФункции
+
+// Выполняет запись сообщения в журнал регистрации.
+//
+// Параметры:
+// Комментарий - Строка, комментарий для записи в журнал регистрации.
+// Уровень - Уровень сообщения журнала регистрации (по умолчанию Ошибка).
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+//
+Процедура ЗаписьЖурналаРегистрацииОбменДанными(Комментарий, КомпонентыОбмена, Уровень = Неопределено) Экспорт
+
+ УзелКорреспондента = КомпонентыОбмена.УзелКорреспондента;
+ КлючСообщенияЖурналаРегистрации = КомпонентыОбмена.КлючСообщенияЖурналаРегистрации;
+
+ Если Уровень = Неопределено Тогда
+ Уровень = УровеньЖурналаРегистрации.Ошибка;
+ КонецЕсли;
+
+ ОбъектМетаданных = Неопределено;
+
+ Если УзелКорреспондента <> Неопределено
+ И Не УзелКорреспондента.Пустая() Тогда
+
+ ОбъектМетаданных = УзелКорреспондента.Метаданные();
+
+ КонецЕсли;
+
+ ЗаписьЖурналаРегистрации(КлючСообщенияЖурналаРегистрации, Уровень, ОбъектМетаданных,, Комментарий);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+#Область ИнициализацияОбмена
+Функция ТаблицаПравилОбработкиДанных(XMLСхема, МенеджерОбмена , НаправлениеОбмена)
+
+ // Инициализация таблицы правил обработки данных
+ ПравилаОбработкиДанных = Новый ТаблицаЗначений;
+ ПравилаОбработкиДанных.Колонки.Добавить("Имя");
+ ПравилаОбработкиДанных.Колонки.Добавить("ОбъектВыборкиФормат");
+ ПравилаОбработкиДанных.Колонки.Добавить("ТипСсылкиXDTO");
+ ПравилаОбработкиДанных.Колонки.Добавить("ОбъектВыборкиМетаданные");
+ ПравилаОбработкиДанных.Колонки.Добавить("ВыборкаДанных");
+ ПравилаОбработкиДанных.Колонки.Добавить("ИмяТаблицыДляВыборки");
+ ПравилаОбработкиДанных.Колонки.Добавить("ПриОбработке", Новый ОписаниеТипов("Строка"));
+
+ // ИспользуемыеПКО - массив, содержащий в себе имена ПКО, в которые может быть направлен объект из данного ПОД.
+ ПравилаОбработкиДанных.Колонки.Добавить("ИспользуемыеПКО", Новый ОписаниеТипов("Массив"));
+
+ МенеджерОбмена.ЗаполнитьПравилаОбработкиДанных(НаправлениеОбмена, ПравилаОбработкиДанных);
+
+ КоличествоСтрок = ПравилаОбработкиДанных.Количество();
+ Для НомерИтерации = 1 По КоличествоСтрок Цикл
+
+ ИндексСтроки = КоличествоСтрок - НомерИтерации;
+ ПОД = ПравилаОбработкиДанных.Получить(ИндексСтроки);
+
+ Если НаправлениеОбмена = "Получение" Тогда
+
+ ТипXDTO = ФабрикаXDTO.Тип(XMLСхема, ПОД.ОбъектВыборкиФормат);
+
+ Если ТипXDTO = Неопределено Тогда
+ ПравилаОбработкиДанных.Удалить(ПОД);
+ Продолжить;
+ КонецЕсли;
+
+ КлючевыеСвойства = ТипXDTO.Свойства.Получить("КлючевыеСвойства");
+ Если КлючевыеСвойства <> Неопределено Тогда
+
+ ТипКлючевыхСвойствОбъектаXDTO = КлючевыеСвойства.Тип;
+ СвойствоСсылкаXDTO = ТипКлючевыхСвойствОбъектаXDTO.Свойства.Получить("Ссылка");
+ Если СвойствоСсылкаXDTO <> Неопределено Тогда
+ ПОД.ТипСсылкиXDTO = СвойствоСсылкаXDTO.Тип;
+ КонецЕсли;
+
+ КонецЕсли;
+
+ ИначеЕсли ПОД.ОбъектВыборкиМетаданные <> Неопределено Тогда
+ ПОД.ИмяТаблицыДляВыборки = ПОД.ОбъектВыборкиМетаданные.ПолноеИмя();
+ КонецЕсли;
+
+
+ КонецЦикла;
+
+ Возврат ПравилаОбработкиДанных;
+КонецФункции
+
+Функция ТаблицаПравилКонвертации(XMLСхема, МенеджерОбмена , НаправлениеОбмена)
+
+ // Инициализация таблицы правил конвертации
+ ПравилаКонвертации = Новый ТаблицаЗначений;
+ ПравилаКонвертации.Колонки.Добавить("ИмяПКО", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(50)));
+ ПравилаКонвертации.Колонки.Добавить("ОбъектДанных");
+ ПравилаКонвертации.Колонки.Добавить("ОбъектФормата", Новый ОписаниеТипов("Строка"));
+ ПравилаКонвертации.Колонки.Добавить("ТипПолученныхДанныхСтрокой", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(300)));
+ ПравилаКонвертации.Колонки.Добавить("ИмяТаблицыПолученныхДанных", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(300)));
+ ПравилаКонвертации.Колонки.Добавить("ПредставлениеТипаПолученныхДанных", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(300)));
+ ПравилаКонвертации.Колонки.Добавить("Свойства", Новый ОписаниеТипов("ТаблицаЗначений"));
+ ПравилаКонвертации.Колонки.Добавить("ПоляПоиска", Новый ОписаниеТипов("Массив"));
+ ПравилаКонвертации.Колонки.Добавить("СвойстваТабличныхЧастей", Новый ОписаниеТипов("Структура"));
+ ПравилаКонвертации.Колонки.Добавить("ПоляПредставленияОбъекта", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(300)));
+ ПравилаКонвертации.Колонки.Добавить("РеквизитыШапкиПолученныхДанныхСтрокой", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(1000)));
+ ПравилаКонвертации.Колонки.Добавить("ПриОтправкеДанных", Новый ОписаниеТипов("Строка"));
+ ПравилаКонвертации.Колонки.Добавить("ПриКонвертацииДанныхXDTO", Новый ОписаниеТипов("Строка"));
+ ПравилаКонвертации.Колонки.Добавить("ПередЗаписьюПолученныхДанных", Новый ОписаниеТипов("Строка"));
+ ПравилаКонвертации.Колонки.Добавить("ПослеЗагрузкиВсехДанных", Новый ОписаниеТипов("Строка"));
+ ПравилаКонвертации.Колонки.Добавить("РасширеннаяСсылка", Новый ОписаниеТипов("Булево"));
+ ПравилаКонвертации.Колонки.Добавить("ПравилоДляГруппыСправочника", Новый ОписаниеТипов("Булево"));
+ ПравилаКонвертации.Колонки.Добавить("ВариантИдентификации", Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(60)));
+
+ МенеджерОбмена.ЗаполнитьПравилаКонвертацииОбъектов(НаправлениеОбмена, ПравилаКонвертации);
+
+ // Добавляем служебные поля таблицы правил конвертации
+ ПравилаКонвертации.Колонки.Добавить("ТипXDTO");
+ ПравилаКонвертации.Колонки.Добавить("ТипСсылкиXDTO");
+ ПравилаКонвертации.Колонки.Добавить("ТипКлючевыхСвойствОбъектаXDTO");
+ ПравилаКонвертации.Колонки.Добавить("ТипДанных");
+
+ ПравилаКонвертации.Колонки.Добавить("МенеджерОбъекта");
+ ПравилаКонвертации.Колонки.Добавить("ПолноеИмя");
+
+ ПравилаКонвертации.Колонки.Добавить("ЭтоДокумент");
+ ПравилаКонвертации.Колонки.Добавить("ЭтоСправочник");
+ ПравилаКонвертации.Колонки.Добавить("ЭтоПеречисление");
+ ПравилаКонвертации.Колонки.Добавить("ЭтоПланВидовХарактеристик");
+ ПравилаКонвертации.Колонки.Добавить("ЭтоБизнесПроцесс");
+ ПравилаКонвертации.Колонки.Добавить("ЭтоЗадача");
+ ПравилаКонвертации.Колонки.Добавить("ЭтоПланСчетов");
+ ПравилаКонвертации.Колонки.Добавить("ЭтоПланВидовРасчета");
+ ПравилаКонвертации.Колонки.Добавить("ЭтоКонстанта");
+
+ ПравилаКонвертации.Колонки.Добавить("ЭтоСсылочныйТип");
+
+ ПравилаКонвертации.Колонки.Добавить("ЕстьОбработчикПриОтправкеДанных", Новый ОписаниеТипов("Булево"));
+ ПравилаКонвертации.Колонки.Добавить("ЕстьОбработчикПриКонвертацииДанныхXDTO", Новый ОписаниеТипов("Булево"));
+ ПравилаКонвертации.Колонки.Добавить("ЕстьОбработчикПередЗаписьюПолученныхДанных", Новый ОписаниеТипов("Булево"));
+ ПравилаКонвертации.Колонки.Добавить("ЕстьОбработчикПослеЗагрузкиВсехДанных", Новый ОписаниеТипов("Булево"));
+
+ КоличествоСтрок = ПравилаКонвертации.Количество();
+ Для НомерИтерации = 1 По КоличествоСтрок Цикл
+
+ ИндексСтроки = КоличествоСтрок - НомерИтерации;
+ ПравилоКонвертации = ПравилаКонвертации.Получить(ИндексСтроки);
+
+ Если ЗначениеЗаполнено(ПравилоКонвертации.ОбъектФормата) Тогда
+ ПравилоКонвертации.ТипXDTO = ФабрикаXDTO.Тип(XMLСхема, ПравилоКонвертации.ОбъектФормата);
+ Если ПравилоКонвертации.ТипXDTO = Неопределено Тогда
+ ПравилаКонвертации.Удалить(ПравилоКонвертации);
+ Продолжить;
+ КонецЕсли;
+ КонецЕсли;
+
+ Если НаправлениеОбмена = "Получение" Тогда
+
+ МетаданныеОбъекта = ПравилоКонвертации.ОбъектДанных;
+
+ ПравилоКонвертации.ИмяТаблицыПолученныхДанных = МетаданныеОбъекта.ПолноеИмя();
+ ПравилоКонвертации.ПредставлениеТипаПолученныхДанных = МетаданныеОбъекта.Представление();
+ ПравилоКонвертации.ТипПолученныхДанныхСтрокой = ИмяТипаДанныхПоОбъектуМетаданных(ПравилоКонвертации.ОбъектДанных, Ложь, Ложь);
+
+ ПравилоКонвертации.ПоляПредставленияОбъекта = ?(ПравилоКонвертации.ПоляПоиска.Количество() = 0, "", ПравилоКонвертации.ПоляПоиска[0]);
+
+ // Реквизиты объекта получаемых данных
+ РеквизитыСтрокой = "";
+ Для Каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл
+ РеквизитыСтрокойКопия = РеквизитыСтрокой;
+ РеквизитыСтрокой = РеквизитыСтрокой + ?(ПустаяСтрока(РеквизитыСтрокой), "", ",") + Реквизит.Имя;
+ Если СтрДлина(РеквизитыСтрокой) > 1000 Тогда
+ РеквизитыСтрокой = РеквизитыСтрокойКопия;
+ Прервать;
+ КонецЕсли;
+ КонецЦикла;
+
+ Для Каждого Реквизит Из МетаданныеОбъекта.СтандартныеРеквизиты Цикл
+ Если Реквизит.Имя = "Наименование"
+ ИЛИ Реквизит.Имя = "Код"
+ ИЛИ Реквизит.Имя = "Родитель"
+ ИЛИ Реквизит.Имя = "Владелец"
+ ИЛИ Реквизит.Имя = "Дата"
+ ИЛИ Реквизит.Имя = "Номер" Тогда
+ РеквизитыСтрокойКопия = РеквизитыСтрокой;
+ РеквизитыСтрокой = РеквизитыСтрокой + ?(ПустаяСтрока(РеквизитыСтрокой), "", ",") + Реквизит.Имя;
+ Если СтрДлина(РеквизитыСтрокой) > 1000 Тогда
+ РеквизитыСтрокой = РеквизитыСтрокойКопия;
+ Прервать;
+ КонецЕсли;
+ КонецЕсли;
+ КонецЦикла;
+ ПравилоКонвертации.РеквизитыШапкиПолученныхДанныхСтрокой = РеквизитыСтрокой;
+
+ ПравилоКонвертации.ЕстьОбработчикПриКонвертацииДанныхXDTO = Не ПустаяСтрока(ПравилоКонвертации.ПриКонвертацииДанныхXDTO);
+ ПравилоКонвертации.ЕстьОбработчикПередЗаписьюПолученныхДанных = Не ПустаяСтрока(ПравилоКонвертации.ПередЗаписьюПолученныхДанных);
+ ПравилоКонвертации.ЕстьОбработчикПослеЗагрузкиВсехДанных = Не ПустаяСтрока(ПравилоКонвертации.ПослеЗагрузкиВсехДанных);
+
+ Иначе
+ ПравилоКонвертации.ЕстьОбработчикПриОтправкеДанных = Не ПустаяСтрока(ПравилоКонвертации.ПриОтправкеДанных);
+ КонецЕсли;
+
+ Если ПравилоКонвертации.ОбъектДанных <> Неопределено Тогда
+
+ ПравилоКонвертации.ПолноеИмя = ПравилоКонвертации.ОбъектДанных.ПолноеИмя();
+ ПравилоКонвертации.МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПравилоКонвертации.ПолноеИмя);
+
+ ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ПравилоКонвертации.ОбъектДанных);
+
+ ПравилоКонвертации.ТипДанных = Тип(ИмяТипаДанныхПоОбъектуМетаданных(ПравилоКонвертации.ОбъектДанных, Ложь, Ложь));
+
+ Иначе
+ ИмяБазовогоТипа = "";
+ КонецЕсли;
+
+ ПравилоКонвертации.ЭтоДокумент = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаДокументы());
+ ПравилоКонвертации.ЭтоСправочник = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаСправочники());
+ ПравилоКонвертации.ЭтоПеречисление = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПеречисления());
+ ПравилоКонвертации.ЭтоПланВидовХарактеристик = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПланыВидовХарактеристик());
+ ПравилоКонвертации.ЭтоБизнесПроцесс = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаБизнесПроцессы());
+ ПравилоКонвертации.ЭтоЗадача = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаЗадачи());
+ ПравилоКонвертации.ЭтоПланСчетов = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПланыСчетов());
+ ПравилоКонвертации.ЭтоПланВидовРасчета = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПланыВидовРасчета());
+ ПравилоКонвертации.ЭтоКонстанта = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаКонстанты());
+
+ ПравилоКонвертации.ЭтоСсылочныйТип = ПравилоКонвертации.ЭтоДокумент
+ Или ПравилоКонвертации.ЭтоСправочник
+ Или ПравилоКонвертации.ЭтоПланВидовХарактеристик
+ Или ПравилоКонвертации.ЭтоБизнесПроцесс
+ Или ПравилоКонвертации.ЭтоЗадача
+ Или ПравилоКонвертации.ЭтоПланСчетов
+ Или ПравилоКонвертации.ЭтоПланВидовРасчета;
+
+ Если ЗначениеЗаполнено(ПравилоКонвертации.ОбъектФормата) Тогда
+ КлючевыеСвойства = ПравилоКонвертации.ТипXDTO.Свойства.Получить("КлючевыеСвойства");
+ Если КлючевыеСвойства <> Неопределено Тогда
+
+ ТипКлючевыхСвойствОбъектаXDTO = КлючевыеСвойства.Тип;
+ ПравилоКонвертации.ТипКлючевыхСвойствОбъектаXDTO = ТипКлючевыхСвойствОбъектаXDTO;
+
+ ТаблицаПКС = ПравилоКонвертации.Свойства;
+ Для Каждого ПКС Из ТаблицаПКС Цикл
+
+ Если ТипКлючевыхСвойствОбъектаXDTO.Свойства.Получить(ПКС.СвойствоФормата) <> Неопределено Тогда
+ ПКС.ОбработкаКлючевогоСвойства = Истина;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ СвойствоСсылкаXDTO = ТипКлючевыхСвойствОбъектаXDTO.Свойства.Получить("Ссылка");
+ Если СвойствоСсылкаXDTO <> Неопределено Тогда
+
+ ПравилоКонвертации.ТипСсылкиXDTO = СвойствоСсылкаXDTO.Тип;
+
+ Если ПравилоКонвертации.ЭтоСсылочныйТип
+ И НаправлениеОбмена = "Отправка" Тогда
+ ПКСДляСсылки = ТаблицаПКС.Добавить();
+ ПКСДляСсылки.СвойствоКонфигурации = "Ссылка";
+ ПКСДляСсылки.СвойствоФормата = "Ссылка";
+ ПКСДляСсылки.ОбработкаКлючевогоСвойства = "Истина";
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЕсли;
+ КонецЕсли;
+
+ Если ПравилоКонвертации.ВариантИдентификации = "ПоПолямПоиска"
+ Или ПравилоКонвертации.ВариантИдентификации = "СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска" Тогда
+
+ ТаблицаПКС = ПравилоКонвертации.Свойства;
+ Для Каждого ПКС Из ТаблицаПКС Цикл
+
+ Если ЗначениеЗаполнено(ПравилоКонвертации.ПоляПоиска) Тогда
+ Для Каждого ЭлементПолейПоиска Из ПравилоКонвертации.ПоляПоиска Цикл
+ ПоляПоискаМассивом = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ЭлементПолейПоиска, ",",, Истина);
+ Для Каждого ПолеПоиска Из ПоляПоискаМассивом Цикл
+ Если ПолеПоиска = ПКС.СвойствоКонфигурации Тогда
+ ПКС.ОбработкаПоисковогоСвойства = Истина;
+ Прервать;
+ КонецЕсли;
+ КонецЦикла;
+ КонецЦикла;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ Для Каждого ТЧ Из ПравилоКонвертации.СвойстваТабличныхЧастей Цикл
+ Для Каждого ПКС Из ТЧ.Значение Цикл
+
+ ПКС.ИмяТЧ = ТЧ.Ключ;
+
+ КонецЦикла;
+ КонецЦикла;
+
+ КонецЦикла;
+
+ // Добавляем индексы таблицы правил конвертации
+ Если НаправлениеОбмена = "Отправка" Тогда
+
+ ПравилаКонвертации.Индексы.Добавить("ТипДанных");
+ ПравилаКонвертации.Индексы.Добавить("ТипXDTO");
+ ПравилаКонвертации.Индексы.Добавить("РасширеннаяСсылка");
+
+ Иначе
+
+ ПравилаКонвертации.Индексы.Добавить("ТипXDTO");
+ ПравилаКонвертации.Индексы.Добавить("ТипСсылкиXDTO");
+ ПравилаКонвертации.Индексы.Добавить("ТипДанных");
+
+ КонецЕсли;
+
+ Возврат ПравилаКонвертации;
+КонецФункции
+
+Функция ТаблицаПравилКонвертацииПредопределенныхДанных(XMLСхема, МенеджерОбмена , НаправлениеОбмена)
+
+ // Инициализация таблицы правил конвертации.
+ ПравилаКонвертации = Новый ТаблицаЗначений;
+ ПравилаКонвертации.Колонки.Добавить("ТипДанных");
+ ПравилаКонвертации.Колонки.Добавить("ТипXDTO");
+ ПравилаКонвертации.Колонки.Добавить("КонвертацииЗначенийПриПолучении");
+ ПравилаКонвертации.Колонки.Добавить("КонвертацииЗначенийПриОтправке");
+
+ ПравилаКонвертации.Колонки.Добавить("ИмяПКПД", Новый ОписаниеТипов("Строка"));
+
+ МенеджерОбмена.ЗаполнитьПравилаКонвертацииПредопределенныхДанных(НаправлениеОбмена, ПравилаКонвертации);
+
+ Для Каждого ПравилоКонвертации Из ПравилаКонвертации Цикл
+
+ ПравилоКонвертации.ТипXDTO = ФабрикаXDTO.Тип(XMLСхема, ПравилоКонвертации.ТипXDTO);
+ ПравилоКонвертации.ТипДанных = Тип(ИмяТипаДанныхПоОбъектуМетаданных(ПравилоКонвертации.ТипДанных, Ложь, Ложь));
+
+ КонецЦикла;
+
+ // Добавляем индексы таблицы правил конвертации.
+ Если НаправлениеОбмена = "Отправка" Тогда
+
+ ПравилаКонвертации.Индексы.Добавить("ТипДанных");
+ ПравилаКонвертации.Индексы.Добавить("ТипXDTO");
+
+ Иначе
+
+ ПравилаКонвертации.Индексы.Добавить("ТипXDTO");
+ ПравилаКонвертации.Индексы.Добавить("ТипДанных");
+
+ КонецЕсли;
+
+ Возврат ПравилаКонвертации;
+
+КонецФункции
+
+Функция СтруктураПараметровКонвертации(МенеджерОбмена)
+ // Инициализация структуры с параметрами конвертации.
+ // Возможно, в будущем понадобится не структура, а таблица (если потребуется передавать параметры из одной базы в
+ // другую).
+ ПараметрыКонвертации = Новый Структура();
+ МенеджерОбмена.ЗаполнитьПараметрыКонвертации(ПараметрыКонвертации);
+ Возврат ПараметрыКонвертации;
+КонецФункции
+
+#КонецОбласти
+
+#Область ОтправкаДанных
+
+Процедура ВыполнитьВыгрузкуЗарегистрированныхДанных(КомпонентыОбмена, НомерСообщения)
+
+ УзелДляОбмена = КомпонентыОбмена.УзелКорреспондента;
+
+ НачальнаяВыгрузкаДанных = ОбменДаннымиСервер.УстановленПризнакНачальнойВыгрузкиДанных(УзелДляОбмена);
+
+ // Получаем выборку измененных данных.
+ ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелДляОбмена, НомерСообщения);
+
+ УзелДляОбменаОбъект = УзелДляОбмена.ПолучитьОбъект();
+
+ // Алгоритм выгрузки данных в XML-файл:
+ // 1. Получаем Данные из ИБ
+ // 2. Отправляем информацию об удалении либо выгружаем данные.
+ // 3. Конвертируем Данные в Структуру по правилу конвертации.
+ // 4. Конвертируем Данные в Структуру в обработчике ПриОтправкеДанных.
+ // 5. Конвертируем Структуру в ОбъектXDTO.
+ // 6. Записываем ОбъектXDTO в XML-файл.
+
+ Пока ВыборкаИзменений.Следующий() Цикл
+
+ // 1. Получаем Данные из ИБ
+ Данные = ВыборкаИзменений.Получить();
+
+ // 2. Отправляем информацию об удалении либо выгружаем данные.
+ Если ТипЗнч(Данные) = Тип("УдалениеОбъекта") Тогда
+ ВыгрузитьУдаление(КомпонентыОбмена, Данные.Ссылка);
+ Иначе
+
+ ОтправкаЭлемента = ОтправкаЭлементаДанных.Авто;
+ ОбменДаннымиСобытия.ПриОтправкеДанныхКорреспонденту(Данные, ОтправкаЭлемента, НачальнаяВыгрузкаДанных, УзелДляОбменаОбъект);
+
+ Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить Тогда
+ ВыгрузитьУдаление(КомпонентыОбмена, Данные.Ссылка);
+ ИначеЕсли ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда
+ // Ситуация, когда объект не соответствует условиям фильтра, но его не нужно отправлять как удаление.
+ // Возникает в случае первоначальной выгрузки данных.
+ Продолжить;
+ Иначе
+ ВыгрузкаОбъектаВыборки(КомпонентыОбмена, Данные);
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Функция ЭтоСсылкаXDTO(Знач Тип)
+
+ Возврат ФабрикаXDTO.Тип(XMLБазоваяСхема(), "Ref").ЭтоПотомок(Тип);
+
+КонецФункции
+
+Функция ВыгружатьОбъектПоНеобходимости(КомпонентыОбмена, Объект)
+
+ ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(Объект));
+
+ Если ОбъектМетаданных = Неопределено Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ // Получаем настройку из КЭШа
+ РегистрацияПоНеобходимости = КомпонентыОбмена.СоответствиеРегистрацияПоНеобходимости.Получить(ОбъектМетаданных);
+ Если РегистрацияПоНеобходимости <> Неопределено Тогда
+ Возврат РегистрацияПоНеобходимости;
+ КонецЕсли;
+
+ РегистрацияПоНеобходимости = Ложь;
+
+ Отбор = Новый Структура("ОбъектМетаданныхИмя", ОбъектМетаданных.ПолноеИмя());
+ МассивПравил = КомпонентыОбмена.ТаблицаПравилаРегистрацииОбъектов.НайтиСтроки(Отбор);
+
+ Для Каждого Правило Из МассивПравил Цикл
+
+ Если Не ПустаяСтрока(Правило.ИмяРеквизитаФлага) Тогда
+
+ ЗначениеРеквизитаФлага = Неопределено;
+ КомпонентыОбмена.СвойстваУзлаПланаОбмена.Свойство(Правило.ИмяРеквизитаФлага, ЗначениеРеквизитаФлага);
+
+ РегистрацияПоНеобходимости = (ЗначениеРеквизитаФлага = Перечисления.РежимыВыгрузкиОбъектовОбмена.ВыгружатьПриНеобходимости
+ Или ЗначениеРеквизитаФлага = Перечисления.РежимыВыгрузкиОбъектовОбмена.ПустаяСсылка());
+
+ Если РегистрацияПоНеобходимости Тогда
+ Прервать;
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ // Сохраняем полученное значение в кэше.
+ КомпонентыОбмена.СоответствиеРегистрацияПоНеобходимости.Вставить(ОбъектМетаданных, РегистрацияПоНеобходимости);
+ Возврат РегистрацияПоНеобходимости;
+
+КонецФункции
+
+Процедура ЗаписатьУдалениеОбъектаXDTO(КомпонентыОбмена, Ссылка, ТипСсылкиXDTO)
+
+ УИДОбъектаXDTO = РегистрыСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов.ПубличныйИдентификаторПоСсылкеОбъекта(
+ КомпонентыОбмена.УзелКорреспондента, Ссылка);
+
+ Если НЕ ЗначениеЗаполнено(УИДОбъектаXDTO) Тогда
+ Возврат;
+ КонецЕсли;
+
+ XMLСхема = КомпонентыОбмена.XMLСхема;
+ ТипXDTO = ФабрикаXDTO.Тип(XMLСхема, "УдалениеОбъекта");
+
+ Для Каждого Свойство Из ТипXDTO.Свойства[0].Тип.Свойства[0].Тип.Свойства Цикл
+ Если Свойство.Тип = ТипСсылкиXDTO Тогда
+
+ ЗначениеXDTOЛюбаяСсылка = ФабрикаXDTO.Создать(Свойство.Тип, УИДОбъектаXDTO);
+ ЛюбаяСсылкаОбъект = ФабрикаXDTO.Создать(ТипXDTO.Свойства[0].Тип);
+ ЛюбаяСсылкаОбъект.СсылкаНаОбъект = ФабрикаXDTO.Создать(ТипXDTO.Свойства[0].Тип.Свойства[0].Тип);
+ ЛюбаяСсылкаОбъект.СсылкаНаОбъект.Установить(Свойство, ЗначениеXDTOЛюбаяСсылка);
+
+ ДанныеXDTO = ФабрикаXDTO.Создать(ТипXDTO);
+ ДанныеXDTO.СсылкаНаОбъект = ФабрикаXDTO.Создать(ТипXDTO.Свойства[0].Тип);
+ ДанныеXDTO.Установить(ТипXDTO.Свойства[0], ЛюбаяСсылкаОбъект);
+ ФабрикаXDTO.ЗаписатьXML(КомпонентыОбмена.ФайлОбмена, Данные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 = Неопределено Тогда
+
+ НайденныеПравила = ПравилаКонвертацииПредопределенныхДанных.НайтиСтроки(Новый Структура("ТипДанных", Тип));
+
+ Если НайденныеПравила.Количество() = 1 Тогда
+
+ ПравилоКонвертации = НайденныеПравила[0];
+
+ Возврат ПравилоКонвертации;
+
+ ИначеЕсли НайденныеПравила.Количество() > 1 Тогда
+
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Ошибка правил конвертации предопределенных данных.
+ |Задано более одного правила конвертации для типа источника <%1>.'"),
+ Строка(Тип)
+ );
+
+ КонецЕсли;
+
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Ошибка правил конвертации предопределенных данных.
+ |Правило конвертации не определено для типа источника <%1>.'"),
+ Строка(Тип)
+ );
+
+ Иначе
+
+ НайденныеПравила = ПравилаКонвертацииПредопределенныхДанных.НайтиСтроки(Новый Структура("ТипДанных, ТипXDTO", Тип, ТипXDTO, Ложь));
+
+ Если НайденныеПравила.Количество() = 1 Тогда
+
+ ПравилоКонвертации = НайденныеПравила[0];
+
+ Возврат ПравилоКонвертации;
+
+ ИначеЕсли НайденныеПравила.Количество() > 1 Тогда
+
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Ошибка правил конвертации предопределенных данных.
+ |Задано более одного правила конвертации для типа источника <%1> и типа приемника <%2>.'"),
+ Строка(Тип),
+ Строка(ТипXDTO)
+ );
+
+ КонецЕсли;
+
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Ошибка правил конвертации предопределенных данных.
+ |Правило конвертации не определено для типа источника <%1> и типа приемника <%2>.'"),
+ Строка(Тип),
+ Строка(ТипXDTO)
+ );
+
+ КонецЕсли;
+
+КонецФункции
+
+Функция ЗначениеПеречисленияXDTO(Знач КонвертацииЗначений, Знач Значение)
+
+ ЗначениеXDTO = КонвертацииЗначений.Получить(Значение);
+
+ Если ЗначениеXDTO = Неопределено Тогда
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Не найдено правило конвертации для значения предопределенных данных.
+ |Тип значения источника: <%1>
+ |Значение источника: <%2>'"),
+ ТипЗнч(Значение),
+ Строка(Значение)
+ );
+ КонецЕсли;
+
+ Возврат ЗначениеXDTO;
+КонецФункции
+
+Функция КонвертироватьСсылкуВXDTO(КомпонентыОбмена, ЗначениеСсылки, ТипСсылкиXDTO)
+
+ Если КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда
+
+ УИДОбъектаXDTO = РегистрыСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов.ПубличныйИдентификаторПоСсылкеОбъекта(
+ КомпонентыОбмена.УзелКорреспондента, ЗначениеСсылки);
+ ЗначениеXDTO = ФабрикаXDTO.Создать(ТипСсылкиXDTO, УИДОбъектаXDTO);
+
+ Возврат ЗначениеXDTO;
+
+ Иначе
+ Возврат СокрЛП(ЗначениеСсылки.УникальныйИдентификатор());
+ КонецЕсли;
+
+КонецФункции
+
+Функция ЭтоТаблицаОбъекта(Знач СвойствоXDTO)
+
+ Если ТипЗнч(СвойствоXDTO.Тип) = Тип("ТипОбъектаXDTO")
+ И СвойствоXDTO.Тип.Свойства.Количество() = 1 Тогда
+
+ Возврат СвойствоXDTO.Тип.Свойства[0].ВерхняяГраница <> 1;
+
+ КонецЕсли;
+
+ Возврат Ложь;
+КонецФункции
+
+#КонецОбласти
+
+#Область ПолучениеДанных
+
+#Область КонвертацияОбъектов
+
+#Область КонвертацияXDTOВСтруктуру
+
+Процедура КонвертацияСвойстваXDTOВЭлементСтруктуры(Источник, Свойство, Приемник, ИмяДляСвойстваСоставногоТипа = "")
+
+ Если Не Источник.Установлено(Свойство) Тогда
+ Возврат;
+ КонецЕсли;
+
+ ИмяСвойства = ?(ИмяДляСвойстваСоставногоТипа = "", Свойство.Имя, ИмяДляСвойстваСоставногоТипа);
+
+ ЗначениеXDTO = Источник.ПолучитьXDTO(Свойство);
+
+ Если ТипЗнч(ЗначениеXDTO) = Тип("ЗначениеXDTO") Тогда
+
+ Значение = ПрочитатьЗначениеXDTO(ЗначениеXDTO);
+
+ Если ТипЗнч(Приемник) = Тип("Структура") Тогда
+ Приемник.Вставить(ИмяСвойства, Значение);
+ Иначе
+ Приемник[ИмяСвойства] = Значение;
+ КонецЕсли;
+
+ ИначеЕсли ТипЗнч(ЗначениеXDTO) = Тип("ОбъектXDTO") Тогда
+
+ // В свойстве могут находиться:
+ // - дополнительная информация
+ // - табличная часть
+ // - набор ключевых свойств
+ // - набор общих свойств
+ // - свойство составного типа.
+
+ Если ИмяСвойства = "AdditionalInfo" Тогда // Дополнительная информация
+
+ Значение = СериализаторXDTO.ПрочитатьXDTO(ЗначениеXDTO);
+ Приемник.Вставить(ИмяСвойства, Значение);
+
+ ИначеЕсли ЭтоТаблицаОбъекта(Свойство) Тогда
+
+ // Инициализируем таблицу значений, которая отображает табличную часть объекта.
+ Значение = ТаблицаОбъектаПоТипу(Свойство.Тип.Свойства[0].Тип);
+
+ ТабличнаяЧастьXDTO = Источник[ИмяСвойства].Строка;
+
+ Для Индекс = 0 По ТабличнаяЧастьXDTO.Количество() - 1 Цикл
+
+ СтрокаТЧ = Значение.Добавить();
+ СтрокаXDTO = ТабличнаяЧастьXDTO.ПолучитьXDTO(Индекс);
+ Для Каждого СвойствоСтрокиТЧ Из СтрокаXDTO.Свойства() Цикл
+
+ КонвертацияСвойстваXDTOВЭлементСтруктуры(СтрокаXDTO, СвойствоСтрокиТЧ, СтрокаТЧ);
+
+ КонецЦикла;
+
+ КонецЦикла;
+
+ Приемник.Вставить(ИмяСвойства, Значение);
+
+ ИначеЕсли Найти(ЗначениеXDTO.Тип().Имя, "КлючевыеСвойства") > 0 Тогда
+
+ Значение = Новый Структура("ЭтоНаборКлючевыхСвойств");
+ Значение.Вставить("ТипЗначения", СтрЗаменить(ЗначениеXDTO.Тип().Имя, "КлючевыеСвойства", ""));
+ Для Каждого КлючевоеСвойство Из ЗначениеXDTO.Свойства() Цикл
+ КонвертацияСвойстваXDTOВЭлементСтруктуры(ЗначениеXDTO, КлючевоеСвойство, Значение);
+ КонецЦикла;
+
+
+ Если ТипЗнч(Приемник) = Тип("Структура") Тогда
+ Приемник.Вставить(ИмяСвойства, Значение);
+ Иначе
+ Приемник[ИмяСвойства] = Значение;
+ КонецЕсли;
+
+ ИначеЕсли Найти(ЗначениеXDTO.Тип().Имя, "ОбщиеСвойства") > 0 Тогда
+
+ Для Каждого ПодСвойство Из ЗначениеXDTO.Свойства() Цикл
+
+ КонвертацияСвойстваXDTOВЭлементСтруктуры(ЗначениеXDTO, ПодСвойство, Приемник);
+
+ КонецЦикла;
+
+ Иначе
+
+ // Свойство составного типа
+ Значение = Неопределено;
+ Для Каждого ПодСвойство Из ЗначениеXDTO.Свойства() Цикл
+
+ Если НЕ ЗначениеXDTO.Установлено(ПодСвойство) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ КонвертацияСвойстваXDTOВЭлементСтруктуры(ЗначениеXDTO, ПодСвойство, Приемник, ИмяСвойства);
+ Прервать;
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Функция ПрочитатьЗначениеXDTO(ЗначениеXDTO)
+
+ Если ЗначениеXDTO = Неопределено Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ Если ЭтоСсылкаXDTO(ЗначениеXDTO.Тип()) Тогда // Конвертация ссылки
+ Значение = ПрочитатьЗначениеXDTOСложногоТипа(ЗначениеXDTO, "Ссылка");
+ ИначеЕсли ЗначениеXDTO.Тип().Фасеты <> Неопределено
+ И ЗначениеXDTO.Тип().Фасеты.Перечисления <> Неопределено
+ И ЗначениеXDTO.Тип().Фасеты.Перечисления.Количество() > 0 Тогда // Конвертация перечисления
+
+ Значение = ПрочитатьЗначениеXDTOСложногоТипа(ЗначениеXDTO, "Перечисление");
+ Иначе // Конвертация обычного значения.
+
+ Значение = ЗначениеXDTO.Значение;
+
+ КонецЕсли;
+
+ Возврат Значение;
+
+КонецФункции
+
+Функция ПрочитатьЗначениеXDTOСложногоТипа(ЗначениеXDTO, СложныйТип)
+
+ СтруктураXDTO = Новый Структура;
+ СтруктураXDTO.Вставить("ЭтоСсылка", СложныйТип = "Ссылка");
+ СтруктураXDTO.Вставить("ЭтоПеречисление", СложныйТип = "Перечисление");
+ СтруктураXDTO.Вставить("ТипЗначенияXDTO", ЗначениеXDTO.Тип());
+ СтруктураXDTO.Вставить("Значение", ЗначениеXDTO.Значение);
+
+ Возврат СтруктураXDTO;
+
+КонецФункции
+
+Функция ТаблицаОбъектаПоТипу(Знач Тип)
+
+ Результат = Новый ТаблицаЗначений;
+
+ Для Каждого Колонка Из Тип.Свойства Цикл
+
+ Если Найти(Колонка.Тип.Имя, "ОбщиеСвойства") > 0 Тогда
+
+ Для Каждого ПодКолонка Из Колонка.Тип.Свойства Цикл
+
+ Результат.Колонки.Добавить(ПодКолонка.Имя);
+
+ КонецЦикла;
+
+ Иначе
+ Результат.Колонки.Добавить(Колонка.Имя);
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Возврат Результат;
+КонецФункции
+
+#КонецОбласти
+
+#Область КонвертацияСтруктурыВДанныеИБ
+
+Процедура КонвертацияСвойствСтруктурыОбъектаXDTO(
+ КомпонентыОбмена,
+ ДанныеXDTO,
+ ПолученныеДанные,
+ ПравилоКонвертации,
+ НомерЭтапа = 1,
+ СоставСвойств = "Все")
+
+ Для Каждого ПКС Из ПравилоКонвертации.Свойства Цикл
+
+ Если СоставСвойств = "СвойстваПоиска"
+ И Не ПКС.ОбработкаПоисковогоСвойства Тогда
+ Продолжить;
+ КонецЕсли;
+
+ КонвертацияСвойстваСтруктурыОбъектаXDTO(
+ КомпонентыОбмена,
+ ДанныеXDTO,
+ ПолученныеДанные.ДополнительныеСвойства,
+ ПолученныеДанные,
+ ПКС,
+ НомерЭтапа);
+
+ КонецЦикла;
+
+ Если СоставСвойств = "СвойстваПоиска" Или НомерЭтапа = 1 Тогда
+ // Табличные части конвертируются только после выполнения обработчика ПКО.
+ Возврат;
+ КонецЕсли;
+
+ Для Каждого ТЧ Из ПравилоКонвертации.СвойстваТабличныхЧастей Цикл
+
+ Если ПолученныеДанные.ДополнительныеСвойства.Свойство(ТЧ.Ключ) Тогда
+
+ МассивСтруктурСДаннымиСтрок = ПолученныеДанные.ДополнительныеСвойства[ТЧ.Ключ];
+ Для НомерСтроки = 1 По МассивСтруктурСДаннымиСтрок.Количество() Цикл
+
+ СтруктураСДаннымиСтроки = МассивСтруктурСДаннымиСтрок[НомерСтроки - 1];
+
+ Если НомерЭтапа = 2 Тогда
+ СтрокаТЧ = ПолученныеДанные[ТЧ.Ключ].Добавить();
+ КонецЕсли;
+
+ Для Каждого ПКС Из ТЧ.Значение Цикл
+
+ КонвертацияСвойстваСтруктурыОбъектаXDTO(
+ КомпонентыОбмена,
+ ДанныеXDTO,
+ ПолученныеДанные.ДополнительныеСвойства,
+ СтрокаТЧ,
+ ПКС,
+ НомерЭтапа);
+
+ КонецЦикла;
+
+ КонецЦикла;
+
+ Иначе
+ Продолжить;
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура КонвертацияСвойстваСтруктурыОбъектаXDTO(
+ КомпонентыОбмена,
+ ДанныеXDTO,
+ ДополнительныеСвойства,
+ ПриемникДанных,
+ ПКС,
+ НомерЭтапа = 1)
+ // Обрабатывается ПКС где указано только свойство формата - оно используется только при выгрузке.
+ Если СокрЛП(ПКС.СвойствоКонфигурации) = "" Тогда
+ Возврат;
+ КонецЕсли;
+
+ ПравилоКонвертацииСвойства = ПКС.ПравилоКонвертацииСвойства;
+
+ Если НомерЭтапа = 1 Тогда
+
+ Если Не ЗначениеЗаполнено(ПКС.СвойствоФормата) Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если ПКС.ОбработкаКлючевогоСвойства
+ И Не ДанныеXDTO.Свойство("ЭтоНаборКлючевыхСвойств") Тогда
+ ИсточникДанных = ДанныеXDTO.КлючевыеСвойства;
+ Иначе
+ ИсточникДанных = ДанныеXDTO;
+ КонецЕсли;
+
+ Если ИсточникДанных.Свойство(ПКС.СвойствоФормата) Тогда
+ ЗначениеСвойства = ИсточникДанных[ПКС.СвойствоФормата];
+ КонецЕсли;
+
+ ИначеЕсли НомерЭтапа = 2 Тогда
+
+ Если НомерЭтапа = 2 И Не ПКС.ИспользуетсяАлгоритмКонвертации Тогда
+ Возврат;
+ КонецЕсли;
+
+ // На 2-м этапе значения свойств получаются из дополнительных свойств объекта полученных данных
+ // и представляют из себя структуру, содержащую инструкцию для конвертации, либо значение XDTO.
+ // Если приемником значения является строка табличной части, то значение свойства располагается
+ // в ДополнительныеСвойства[ИмяТабличнойЧасти][ИндексСтроки].
+ Если ЗначениеЗаполнено(ПКС.ИмяТЧ) Тогда
+ ИсточникДанных = ДополнительныеСвойства[ПКС.ИмяТЧ][ПриемникДанных.НомерСтроки - 1];
+ Иначе
+ ИсточникДанных = ДополнительныеСвойства;
+ КонецЕсли;
+
+ Если ИсточникДанных.Свойство(ПКС.СвойствоКонфигурации) Тогда
+ ЗначениеСвойства = ИсточникДанных[ПКС.СвойствоКонфигурации];
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Если Не ЗначениеЗаполнено(ЗначениеСвойства) Тогда
+ Возврат;
+ КонецЕсли;
+
+ // Значением является инструкция.
+ Если ТипЗнч(ЗначениеСвойства) = Тип("Структура")
+ И ЗначениеСвойства.Количество() < 3 Тогда
+
+ Если ЗначениеСвойства.Свойство("ИмяПКО") Тогда
+ ПравилоКонвертацииСвойства = ЗначениеСвойства.ИмяПКО;
+ КонецЕсли;
+
+ Если ЗначениеСвойства.Свойство("Значение") Тогда
+ ЗначениеСвойства = ЗначениеСвойства.Значение;
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Если ТипЗнч(ЗначениеСвойства) = Тип("Структура") Тогда
+
+ ПКПД = КомпонентыОбмена.ПравилаКонвертацииПредопределенныхДанных.Найти(ПравилоКонвертацииСвойства, "ИмяПКПД");
+ Если ПКПД <> Неопределено Тогда
+
+ Значение = ПКПД.КонвертацииЗначенийПриПолучении.Получить(ЗначениеСвойства.Значение);
+ ПриемникДанных[ПКС.СвойствоКонфигурации] = Значение;
+ Возврат;
+
+ Иначе
+ ПравилоКонвертацииСвойства = ПКОПоИмени(КомпонентыОбмена, ПравилоКонвертацииСвойства);
+ КонецЕсли;
+ Иначе
+ // Конвертацию простых свойств выполняем только на 1-м этапе.
+ ПриемникДанных[ПКС.СвойствоКонфигурации] = ЗначениеСвойства;
+ Возврат;
+ КонецЕсли;
+
+ ДанныеДляЗаписиВИБ = СтруктураОбъектаXDTOВДанныеИБ(КомпонентыОбмена, ЗначениеСвойства, ПравилоКонвертацииСвойства, "ПолучитьСсылку");
+
+ ПриемникДанных[ПКС.СвойствоКонфигурации] = ДанныеДляЗаписиВИБ.Ссылка;
+
+КонецПроцедуры
+
+Функция СсылкаОбъектаПоСвойствамОбъектаXDTO(ПравилоКонвертации, ПолученныеДанные)
+
+ Результат = Неопределено;
+ // ПравилоКонвертации.ПоляПоискаОбъекта - массив, содержит разные варианты поиска
+ // элементы массива - таблица значений с полями поиска.
+ Если ПравилоКонвертации.ПоляПоиска = Неопределено ИЛИ
+ ТипЗнч(ПравилоКонвертации.ПоляПоиска) <> Тип("Массив") Тогда
+ Возврат Результат;
+ КонецЕсли;
+
+ Для Каждого ПопыткаПоиска Из ПравилоКонвертации.ПоляПоиска Цикл
+ ПоляПоиска = Новый Структура(ПопыткаПоиска);
+ ЗаполнитьЗначенияСвойств(ПоляПоиска, ПолученныеДанные);
+
+ Если ПравилоКонвертации.ЭтоДокумент
+ И ПоляПоиска.Количество() = 2
+ И ПоляПоиска.Свойство("Дата")
+ И ПоляПоиска.Свойство("Номер")
+ Тогда
+
+ Результат = ПравилоКонвертации.МенеджерОбъекта.НайтиПоНомеру(ПоляПоиска.Номер, ПоляПоиска.Дата);
+
+ Результат = ?(Результат.Пустая(), Неопределено, Результат);
+ ИначеЕсли ПравилоКонвертации.ЭтоСправочник
+ И ПоляПоиска.Количество() = 1
+ И ПоляПоиска.Свойство("Наименование") Тогда
+ Результат = ПравилоКонвертации.МенеджерОбъекта.НайтиПоНаименованию(ПоляПоиска.Наименование, Истина);
+ ИначеЕсли ПравилоКонвертации.ЭтоСправочник
+ И ПоляПоиска.Количество() = 1
+ И ПоляПоиска.Свойство("Код") Тогда
+ Результат = ПравилоКонвертации.МенеджерОбъекта.НайтиПоКоду(ПоляПоиска.Код);
+ Иначе
+ Запрос = Новый Запрос;
+
+ ТекстЗапроса =
+ "ВЫБРАТЬ
+ | Таблица.Ссылка КАК Ссылка
+ |ИЗ
+ | [ПолноеИмя] КАК Таблица
+ |ГДЕ
+ | [УсловиеОтбора]";
+
+ Отбор = Новый Массив;
+
+ Для Каждого ПолеПоиска Из ПоляПоиска Цикл
+
+ Запрос.УстановитьПараметр(ПолеПоиска.Ключ, ПолеПоиска.Значение);
+
+ Отбор.Добавить(СтрЗаменить("Таблица.[Ключ] = &[Ключ]", "[Ключ]", ПолеПоиска.Ключ));
+
+ КонецЦикла;
+
+ УсловиеОтбора = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(Отбор, " И ");
+ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[УсловиеОтбора]", УсловиеОтбора);
+ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПолноеИмя]", ПравилоКонвертации.ПолноеИмя);
+ Запрос.Текст = ТекстЗапроса;
+
+ РезультатЗапроса = Запрос.Выполнить();
+
+ Если Не РезультатЗапроса.Пустой() Тогда
+
+ Выборка = РезультатЗапроса.Выбрать();
+ Выборка.Следующий();
+
+ Результат = Выборка.Ссылка;
+
+ КонецЕсли;
+
+ КонецЕсли;
+ Если ЗначениеЗаполнено(Результат) Тогда
+ Прервать;
+ КонецЕсли;
+ КонецЦикла;
+ Возврат Результат;
+КонецФункции
+
+Процедура ЗаполнитьДанныеИБПоПолученнымДанным(ДанныеИБ, ПолученныеДанные, ПравилоКонвертации)
+
+ ПоляКопии = ПравилоКонвертации.Свойства.ВыгрузитьКолонку("СвойствоКонфигурации");
+ Если ПоляКопии.Количество() > 0 Тогда
+ ПоляКопии = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ПоляКопии, ",", Истина);
+ ЗаполнитьЗначенияСвойств(ДанныеИБ, ПолученныеДанные, ПоляКопии);
+ КонецЕсли;
+
+ Для Каждого ТабличнаяЧасть Из ПравилоКонвертации.СвойстваТабличныхЧастей Цикл
+ ДанныеИБ[ТабличнаяЧасть.Ключ].Очистить();
+ ДанныеИБ[ТабличнаяЧасть.Ключ].Загрузить(ПолученныеДанные[ТабличнаяЧасть.Ключ].Выгрузить());
+ КонецЦикла;
+КонецПроцедуры
+
+Функция ИнициализироватьПолученныеДанные(ПравилоКонвертации)
+
+ Если ПравилоКонвертации.ЭтоДокумент Тогда
+ ПолученныеДанные = ПравилоКонвертации.МенеджерОбъекта.СоздатьДокумент();
+ ИначеЕсли ПравилоКонвертации.ЭтоСправочник
+ Или ПравилоКонвертации.ЭтоПланВидовХарактеристик Тогда
+ Если ПравилоКонвертации.ПравилоДляГруппыСправочника Тогда
+ ПолученныеДанные = ПравилоКонвертации.МенеджерОбъекта.СоздатьГруппу();
+ Иначе
+ ПолученныеДанные = ПравилоКонвертации.МенеджерОбъекта.СоздатьЭлемент();
+ КонецЕсли;
+ КонецЕсли;
+
+ Возврат ПолученныеДанные
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область ЗагрузкаТЧ
+
+Функция СоответствиеСтарыхИНовыхДанныхТЧ(ТабличнаяЧастьОбъектаПослеОбработки, ТабличнаяЧастьОбъектаДоОбработки, МассивКлючевыхПолей)
+
+ СоответствиеСтрокНовойТЧСтрокамСтаройТЧ = Новый Соответствие;
+
+ Для Каждого СтрокаНовойТЧ Из ТабличнаяЧастьОбъектаПослеОбработки Цикл
+
+ НайденнаяСтрокаСтаройТЧ = Неопределено;
+
+ СтруктураПоиска = Новый Структура;
+ Для Каждого КлючевоеПоле Из МассивКлючевыхПолей Цикл
+ СтруктураПоиска.Вставить(КлючевоеПоле, СтрокаНовойТЧ[КлючевоеПоле]);
+ КонецЦикла;
+
+ НайденныеСтрокиНовойТЧ = ТабличнаяЧастьОбъектаПослеОбработки.НайтиСтроки(СтруктураПоиска);
+
+ Если НайденныеСтрокиНовойТЧ.Количество() = 1 Тогда
+
+ НайденныеСтрокиСтаройТЧ = ТабличнаяЧастьОбъектаДоОбработки.НайтиСтроки(СтруктураПоиска);
+
+ Если НайденныеСтрокиСтаройТЧ.Количество() = 1 Тогда
+ НайденнаяСтрокаСтаройТЧ = НайденныеСтрокиСтаройТЧ[0];
+ КонецЕсли;
+
+ КонецЕсли;
+
+ СоответствиеСтрокНовойТЧСтрокамСтаройТЧ.Вставить(СтрокаНовойТЧ, НайденнаяСтрокаСтаройТЧ);
+
+ КонецЦикла;
+
+ Возврат СоответствиеСтрокНовойТЧСтрокамСтаройТЧ;
+
+КонецФункции
+
+// Процедура заполняет табличную часть объекта с учетом предыдущей версии табличной части (до загрузки данных).
+//
+// Параметры:
+// ТабличнаяЧастьОбъектаПослеОбработки - Табличная часть, которая содержит измененные данные.
+// ТабличнаяЧастьОбъектаДоОбработки - Таблица значений, содержимое табличной части объекта до загрузки данных.
+// КлючевыеПоля - Колонки, по которым происходит поиск строк в табличной части (строка через
+// запятую).
+// КолонкиДляВключения - Другие колонки (кроме ключевых), значения которых должны измениться (строка
+// через запятую).
+// КолонкиДляИсключения - Колонки, значения которых не должны измениться (строка через запятую).
+//
+Процедура ЗаполнитьТабличнуюЧастьОбъектаНачальнымиДанными(
+ ТабличнаяЧастьОбъектаПослеОбработки,
+ ТабличнаяЧастьОбъектаДоОбработки,
+ Знач КлючевыеПоля = "",
+ КолонкиДляВключения = "",
+ КолонкиДляИсключения = "") Экспорт
+
+ Если ТипЗнч(КлючевыеПоля) = Тип("Строка") Тогда
+ Если КлючевыеПоля = "" Тогда
+ Возврат; // Без ключевых полей нельзя получить соответствие новых и старых данных.
+ Иначе
+ КлючевыеПоля = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(КлючевыеПоля, ",");
+ КонецЕсли;
+ КонецЕсли;
+
+ СоответствиеСтарыхИНовыхДанныхТЧ = СоответствиеСтарыхИНовыхДанныхТЧ(
+ ТабличнаяЧастьОбъектаПослеОбработки,
+ ТабличнаяЧастьОбъектаДоОбработки,
+ КлючевыеПоля);
+
+ Для Каждого СтрокаНовойТЧ Из ТабличнаяЧастьОбъектаПослеОбработки Цикл
+ СтрокаСтаройТЧ = СоответствиеСтарыхИНовыхДанныхТЧ.Получить(СтрокаНовойТЧ);
+ Если СтрокаСтаройТЧ <> Неопределено Тогда
+ ЗаполнитьЗначенияСвойств(СтрокаНовойТЧ, СтрокаСтаройТЧ, КолонкиДляВключения, КолонкиДляИсключения);
+ КонецЕсли;
+ КонецЦикла;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СервисныеПроцедурыИФункции
+
+Процедура ПровестиГенерациюКодаНомераПриНеобходимости(Объект)
+
+ ИмяТипаОбъекта = ОбщегоНазначения.ВидОбъектаПоТипу(ТипЗнч(Объект.Ссылка));
+
+ // По типу документа смотрим заполнен кол или номер.
+ Если ИмяТипаОбъекта = "Документ"
+ ИЛИ ИмяТипаОбъекта = "БизнесПроцесс"
+ ИЛИ ИмяТипаОбъекта = "Задача" Тогда
+
+ Если НЕ ЗначениеЗаполнено(Объект.Номер) Тогда
+
+ Объект.УстановитьНовыйНомер();
+
+ КонецЕсли;
+
+ ИначеЕсли ИмяТипаОбъекта = "Справочник"
+ ИЛИ ИмяТипаОбъекта = "ПланВидовХарактеристик"
+ ИЛИ ИмяТипаОбъекта = "ПланОбмена" Тогда
+
+ Если НЕ ЗначениеЗаполнено(Объект.Код) Тогда
+
+ Объект.УстановитьНовыйКод();
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура СнятьПометкуУдаленияСПредопределенногоЭлемента(Объект, ТипОбъекта, КомпонентыОбмена)
+
+ Попытка
+ ПометкаУдаления = Объект.ПометкаУдаления;
+ Исключение
+ ПометкаУдаления = Ложь;
+ КонецПопытки;
+
+ Если ПометкаУдаления Тогда
+
+ Попытка
+ Предопределенный = Объект.Предопределенный;
+ Исключение
+ Предопределенный = Ложь;
+ КонецПопытки;
+
+ Если Предопределенный Тогда
+
+ Объект.ПометкаУдаления = Ложь;
+
+ // фиксируем событие в ЖР
+ ЗП = ПолучитьСтруктуруЗаписиПротокола(80);
+ ЗП.ТипОбъекта = ТипОбъекта;
+ ЗП.Объект = Строка(Объект);
+
+ КомпонентыОбмена.СостояниеОбменаДанными.РезультатВыполненияОбмена =
+ Перечисления.РезультатыВыполненияОбмена.ВыполненоСПредупреждениями;
+ ЗаписатьВПротоколВыполнения(КомпонентыОбмена, 80, ЗП, Ложь);
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ОтложенныеОперации
+Процедура ЗапомнитьОбъектДляОтложенногоЗаполнения(ДанныеДляЗаписиВИБ, ПравилоКонвертации, КомпонентыОбмена)
+
+ Если ПравилоКонвертации.ЕстьОбработчикПослеЗагрузкиВсехДанных Тогда
+
+ // Занесем данные об объекте в таблицу отложенной обработки.
+ НоваяСтрока = КомпонентыОбмена.ЗагруженныеОбъекты.Добавить();
+ НоваяСтрока.ИмяОбработчика = ПравилоКонвертации.ПослеЗагрузкиВсехДанных;
+ НоваяСтрока.Объект = ДанныеДляЗаписиВИБ;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ОтложенноеЗаполнениеОбъектов(КомпонентыОбмена)
+
+ ПараметрыКонвертации = КомпонентыОбмена.ПараметрыКонвертации;
+ ЗагруженныеОбъекты = КомпонентыОбмена.ЗагруженныеОбъекты;
+
+ КомпонентыОбмена.МенеджерОбмена.ПередОтложеннымЗаполнением(КомпонентыОбмена);
+
+ Для Каждого СтрокаТаблицы Из ЗагруженныеОбъекты Цикл
+
+ Если СтрокаТаблицы.Объект.ЭтоНовый() Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Объект = СтрокаТаблицы.Объект.Ссылка.ПолучитьОбъект();
+
+ // Перенос дополнительных свойств.
+ Для Каждого Свойство Из СтрокаТаблицы.Объект.ДополнительныеСвойства Цикл
+ Объект.ДополнительныеСвойства.Вставить(Свойство.Ключ, Свойство.Значение);
+ КонецЦикла;
+
+ ИмяОбработчика = СтрокаТаблицы.ИмяОбработчика;
+
+ МенеджерОбмена = КомпонентыОбмена.МенеджерОбмена;
+ СтруктураПараметров = Новый Структура();
+ СтруктураПараметров.Вставить("Объект", Объект);
+ СтруктураПараметров.Вставить("КомпонентыОбмена", КомпонентыОбмена);
+ СтруктураПараметров.Вставить("ОбъектМодифицирован", Истина);
+
+ Попытка
+ МенеджерОбмена.ВыполнитьПроцедуруМодуляМенеджера(ИмяОбработчика, СтруктураПараметров);
+ Исключение
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Ошибка выполнения обработчика ПослеКонвертацииВсехДанных.
+ |Тип источника: %1
+ |Описание ошибки: %2'"),
+ Строка(Объект),
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())
+ );
+ КонецПопытки;
+
+ ОбъектМодифицирован = СтруктураПараметров.ОбъектМодифицирован;
+
+ Если ОбъектМодифицирован Тогда
+ УстановитьОбменДаннымиЗагрузка(Объект, Истина, Ложь, КомпонентыОбмена.УзелКорреспондента);
+ Объект.Записать();
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ВыполнитьОтложеннуюЗаписьОбъектов(КомпонентыОбмена)
+
+ Если КомпонентыОбмена.ОбъектыДляОтложеннойЗаписи.Количество() = 0 Тогда
+ Возврат // Нет объектов в очереди
+ КонецЕсли;
+
+ Для Каждого ОбъектСоответствия Из КомпонентыОбмена.ОбъектыДляОтложеннойЗаписи Цикл
+
+ Если ОбъектСоответствия.Ключ.Пустая() Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Объект = ОбъектСоответствия.Ключ.ПолучитьОбъект();
+
+ Если Объект = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+
+ // Устанавливаем узел-отправитель для предотвращения регистрации объекта на узле, для которого производим загрузку
+ // проведение выполняем не в режиме загрузки.
+ УстановитьОбменДаннымиЗагрузка(Объект, Ложь, Ложь, КомпонентыОбмена.УзелКорреспондента);
+
+ ОписаниеОшибки = "";
+ ОбъектЗаписанУспешно = Ложь;
+
+ Попытка
+
+ ДополнительныеСвойства = ОбъектСоответствия.Значение;
+
+ Для Каждого Свойство Из ДополнительныеСвойства Цикл
+
+ Объект.ДополнительныеСвойства.Вставить(Свойство.Ключ, Свойство.Значение);
+
+ КонецЦикла;
+
+ Объект.ДополнительныеСвойства.Вставить("ОтложеннаяЗапись");
+
+ Если Объект.ПроверитьЗаполнение() Тогда
+
+ // При проведении документа снимаем запрет на выполнение ПРО,
+ // т.к. ПРО были проигнорированы при обычной записи с целью оптимизации скорости загрузки данных.
+ Если Объект.ДополнительныеСвойства.Свойство("ОтключитьМеханизмРегистрацииОбъектов") Тогда
+ Объект.ДополнительныеСвойства.Удалить("ОтключитьМеханизмРегистрацииОбъектов");
+ КонецЕсли;
+
+ ОбменДаннымиСервер.ПропуститьПроверкуЗапретаИзменения();
+ Объект.ДополнительныеСвойства.Вставить("ПропуститьПроверкуЗапретаИзменения");
+
+ СведенияОВерсииОбъекта = Новый Структура;
+ СведенияОВерсииОбъекта.Вставить("ОтложеннаяОбработка", Истина);
+ СведенияОВерсииОбъекта.Вставить("ТипВерсииОбъекта", "ИзмененоПользователем");
+ СведенияОВерсииОбъекта.Вставить("АвторВерсии", КомпонентыОбмена.УзелКорреспондента);
+ Объект.ДополнительныеСвойства.Вставить("СведенияОВерсииОбъекта", СведенияОВерсииОбъекта);
+
+ // Выполняем попытку записи объекта.
+ Объект.Записать();
+
+ ОбъектЗаписанУспешно = Истина;
+
+ Иначе
+
+ ОбъектЗаписанУспешно = Ложь;
+
+ ОписаниеОшибки = НСтр("ru = 'Ошибка проверки заполнения реквизитов'");
+
+ КонецЕсли;
+
+ Исключение
+
+ ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
+
+ ОбъектЗаписанУспешно = Ложь;
+
+ КонецПопытки;
+
+ ОбменДаннымиСервер.ПропуститьПроверкуЗапретаИзменения(Ложь);
+
+ Если Не ОбъектЗаписанУспешно Тогда
+
+ ОбменДаннымиСервер.ЗарегистрироватьОшибкуЗаписиОбъекта(Объект, КомпонентыОбмена.УзелКорреспондента, ОписаниеОшибки);
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Прочее
+
+Функция РазложитьФорматОбмена(Знач ФорматОбмена)
+
+ Результат = Новый Структура("БазовыйФормат, Версия");
+
+ ЭлементыФормата = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ФорматОбмена, "/");
+
+ Если ЭлементыФормата.Количество() = 0 Тогда
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Неканоническое имя формата обмена <%1>'"),
+ ФорматОбмена
+ );
+ КонецЕсли;
+
+ Результат.Версия = ЭлементыФормата[ЭлементыФормата.ВГраница()];
+
+ ПроверитьВерсию(Результат.Версия);
+
+ ЭлементыФормата.Удалить(ЭлементыФормата.ВГраница());
+
+ Результат.БазовыйФормат = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ЭлементыФормата, "/");
+
+ Возврат Результат;
+КонецФункции
+
+Функция СсылкаПоУИД(ТипЗначенияОбъектаИБ, УИДОбъектаXDTO)
+
+ МассивТипов = Новый Массив;
+ МассивТипов.Добавить(ТипЗначенияОбъектаИБ);
+ ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
+ ПустаяСсылка = ОписаниеТипов.ПривестиЗначение();
+
+ МенеджерОбъектаМетаданных = ОбщегоНазначения.МенеджерОбъектаПоСсылке(ПустаяСсылка);
+
+ Возврат МенеджерОбъектаМетаданных.ПолучитьСсылку(Новый УникальныйИдентификатор(УИДОбъектаXDTO));
+
+КонецФункции
+
+Функция НайтиСсылкуПоПубличномуИдентификатору(УИДОбъектаXDTO, КомпонентыОбмена, ТипЗначенияОбъектаИБ)
+
+ Запрос = Новый Запрос("
+ |ВЫБРАТЬ
+ | Ссылка
+ |ИЗ РегистрСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов
+ |ГДЕ УзелИнформационнойБазы = &УзелИнформационнойБазы И
+ | Идентификатор = &Идентификатор");
+ Запрос.УстановитьПараметр("УзелИнформационнойБазы", КомпонентыОбмена.УзелКорреспондента);
+ Запрос.УстановитьПараметр("Идентификатор", УИДОбъектаXDTO);
+ Выборка = Запрос.Выполнить().Выбрать();
+ Если Выборка.Количество() > 0 Тогда
+ КоличествоСсылокПодходящегоТипа = 0;
+ НайденнаяСсылка = Неопределено;
+ Пока Выборка.Следующий() Цикл
+ Если ТипЗнч(Выборка.Ссылка) = ТипЗначенияОбъектаИБ Тогда
+ НайденнаяСсылка = Выборка.Ссылка;
+ КоличествоСсылокПодходящегоТипа = КоличествоСсылокПодходящегоТипа + 1;
+ Если КоличествоСсылокПодходящегоТипа > 1 Тогда
+ Прервать;
+ КонецЕсли;
+ КонецЕсли;
+ КонецЦикла;
+ Если КоличествоСсылокПодходящегоТипа > 1 Тогда
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Для уникального идентификатора <%1> и узла <%2> назначено несколько ссылок.'"),
+ Строка(УИДОбъекта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(УникальныйИдентификаторСтрокой, ПравилоКонвертации.ТипДанных, КомпонентыОбмена));
+ КонецЕсли;
+ КонецЦикла;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ПрименитьУдалениеОбъектов(КомпонентыОбмена, МассивОбъектовКУдалению, МассивЗагруженныхОбъектов)
+
+ Для Каждого ЗагруженныйОбъект Из МассивЗагруженныхОбъектов Цикл
+ Пока МассивОбъектовКУдалению.Найти(ЗагруженныйОбъект) <> Неопределено Цикл
+ МассивОбъектовКУдалению.Удалить(МассивОбъектовКУдалению.Найти(ЗагруженныйОбъект));
+ КонецЦикла;
+ КонецЦикла;
+
+ Для Каждого ЭлементКУдалению Из МассивОбъектовКУдалению Цикл
+
+ // Собственно удаление ссылки
+ Объект = ЭлементКУдалению.ПолучитьОбъект();
+ Если Объект = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Если КомпонентыОбмена.РежимЗагрузкиДанныхВИнформационнуюБазу Тогда
+ Если Метаданные.Документы.Содержит(Объект.Метаданные()) И Объект.Проведен Тогда
+ ОтменитьПроведениеОбъектаВИБ(Объект, КомпонентыОбмена.УзелКорреспондента);
+ КонецЕсли;
+ УдалитьОбъект(Объект, Ложь);
+ Иначе
+
+ ТипПолученныхДанныхСтрокой = ИмяТипаДанныхПоОбъектуМетаданных(Объект.Метаданные(), Ложь, Ложь);
+
+ СтрокаТаблицы = КомпонентыОбмена.ТаблицаДанныхЗаголовкаПакета.Добавить();
+
+ СтрокаТаблицы.ТипОбъектаСтрокой =ТипПолученныхДанныхСтрокой;
+ СтрокаТаблицы.КоличествоОбъектовВИсточнике = 1;
+ СтрокаТаблицы.ТипПриемникаСтрокой = ТипПолученныхДанныхСтрокой;
+ СтрокаТаблицы.ЭтоУдалениеОбъекта = Истина;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура УдалитьОбъект(Объект, УдалитьНепосредственно)
+
+ Попытка
+
+ Предопределенный = Объект.Предопределенный;
+
+ Исключение
+
+ Предопределенный = Ложь;
+
+ КонецПопытки;
+
+ Если Предопределенный Тогда
+
+ Возврат;
+
+ КонецЕсли;
+
+ Если УдалитьНепосредственно Тогда
+
+ Объект.Удалить();
+
+ Иначе
+
+ УстановитьПометкуУдаленияУОбъекта(Объект);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Устанавливает пометку удаления.
+//
+// Параметры:
+// Объект - Объект для установки пометки.
+// ПометкаУдаления - Булево - Флаг пометки удаления.
+// ИмяТипаОбъекта - Строка - Тип объекта строкой.
+//
+Процедура УстановитьПометкуУдаленияУОбъекта(Объект)
+
+ Если Объект.ДополнительныеСвойства.Свойство("НайденЗапретЗагрузкиДанных") Тогда
+ Возврат;
+ КонецЕсли;
+
+ УстановитьОбменДаннымиЗагрузка(Объект);
+
+ // Дли иерархических объектов пометку удаления только у конкретного объекта ставим.
+ ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(Объект.Метаданные());
+ Если ИмяБазовогоТипа = "Справочники"
+ Или ИмяБазовогоТипа = "ПланыВидовХарактеристик"
+ Или ИмяБазовогоТипа = "ПланыСчетов" Тогда
+ Объект.УстановитьПометкуУдаления(Истина, Ложь);
+ Иначе
+ Объект.УстановитьПометкуУдаления(Истина);
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область ПоискПравилОбмена
+
+Функция ПОДПоТипуСсылкиXDTO(КомпонентыОбмена, ТипСсылкиXDTO, ВозвращатьПустоеЗначение = Ложь)
+
+ ПравилоОбработки = КомпонентыОбмена.ПравилаОбработкиДанных.Найти(ТипСсылкиXDTO, "ТипСсылкиXDTO");
+ Если ПравилоОбработки = Неопределено Тогда
+
+ Если ВозвращатьПустоеЗначение Тогда
+ Возврат ПравилоОбработки;
+ Иначе
+
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Не найдено ПОД для типа ссылки XDTO.
+ |Тип ссылки XDTO: %1
+ |Описание ошибки: %2'"),
+ Строка(ТипСсылкиXDTO),
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())
+ );
+
+ КонецЕсли;
+
+ Иначе
+ Возврат ПравилоОбработки;
+ КонецЕсли;
+
+КонецФункции
+
+Функция ПОДПоТипуОбъектаXDTO(КомпонентыОбмена, ТипОбъектаXDTO, ВозвращатьПустоеЗначение = Ложь)
+
+ ПравилоОбработки = КомпонентыОбмена.ПравилаОбработкиДанных.Найти(ТипОбъектаXDTO, "ОбъектВыборкиФормат");
+ Если ПравилоОбработки = Неопределено Тогда
+
+ Если ВозвращатьПустоеЗначение Тогда
+ Возврат ПравилоОбработки;
+ Иначе
+
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Не найдено ПОД для типа объекта XDTO.
+ |Тип объекта XDTO: %1
+ |Описание ошибки: %2'"),
+ Строка(ТипОбъектаXDTO),
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())
+ );
+
+ КонецЕсли;
+
+ Иначе
+ Возврат ПравилоОбработки;
+ КонецЕсли;
+
+КонецФункции
+
+Функция ПОДПоОбъектуМетаданных(КомпонентыОбмена, ОбъектМетаданных)
+
+ ПравилоОбработки = КомпонентыОбмена.ПравилаОбработкиДанных.Найти(ОбъектМетаданных, "ОбъектВыборкиМетаданные");
+
+ Если ПравилоОбработки = Неопределено Тогда
+
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Не найдено ПОД для объекта метаданных.
+ |Объект метаданных: %1'"),
+ Строка(ОбъектМетаданных));
+
+ Иначе
+ Возврат ПравилоОбработки;
+ КонецЕсли;
+
+КонецФункции
+
+Функция ПОДПоИмени(КомпонентыОбмена, Имя)
+
+ ПравилоОбработки = КомпонентыОбмена.ПравилаОбработкиДанных.Найти(Имя, "Имя");
+
+ Если ПравилоОбработки = Неопределено Тогда
+
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Не найдено ПОД с именем %1'"), Имя);
+
+ Иначе
+ Возврат ПравилоОбработки;
+ КонецЕсли;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ОбработчикиСобытийПравилОбмена
+
+#Область ОбработчикиСобытийПравилОбработкиДанных
+// Процедура - "обертка" вызова обработчика ПОД ПриОбработке.
+//
+// Параметры:
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+// ПравилоОбработки - Строка таблицы правил обработки данных, соответствующая обрабатываемому ПОД
+// ОбъектОбработки - Ссылка на объект, подлежащий обработке
+// либо структура, соответствующая объекту XDTO (при загрузке),
+// либо ссылка на объект информационной базы (при выгрузке).
+// ИспользованиеПКО - Структура, определяющая по каким ПКО будет выгружен объект
+// ключи соответствуют именам ПКО,
+// значения - признак использования ПКО для конкретного объекта обработки.
+//
+Процедура ПриОбработкеПОД(КомпонентыОбмена, ПравилоОбработки, Знач ОбъектОбработки, ИспользованиеПКО) Экспорт
+
+ МенеджерОбмена = КомпонентыОбмена.МенеджерОбмена;
+ СтруктураПараметров = Новый Структура();
+ СтруктураПараметров.Вставить("ОбъектОбработки", ОбъектОбработки);
+ СтруктураПараметров.Вставить("ИспользованиеПКО", ИспользованиеПКО);
+ СтруктураПараметров.Вставить("КомпонентыОбмена", КомпонентыОбмена);
+
+ Попытка
+ МенеджерОбмена.ВыполнитьПроцедуруМодуляМенеджера(ПравилоОбработки.ПриОбработке, СтруктураПараметров);
+ Исключение
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Ошибка выполнения обработчика ПОД ПриОбработке.
+ |Объект: %1
+ |Описание ошибки: %2'"),
+ Строка(ОбъектОбработки),
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())
+ );
+ КонецПопытки;
+
+ ОбъектОбработки = СтруктураПараметров.ОбъектОбработки;
+ ИспользованиеПКО = СтруктураПараметров.ИспользованиеПКО;
+ КомпонентыОбмена = СтруктураПараметров.КомпонентыОбмена;
+
+КонецПроцедуры
+
+// Функция - "обертка" вызова обработчика ПОД ВыборкаДанных.
+//
+// Параметры:
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+// ПравилоОбработки - Строка таблицы правил обработки данных, соответствующая обрабатываемому ПОД
+//
+// Возвращаемое значение - то что вернет обработчик ВыборкаДанных (например, выборка результата запроса).
+//
+Функция ВыборкаДанных(КомпонентыОбмена, ПравилоОбработки) Экспорт
+
+ АлгоритмВыборки = ПравилоОбработки.ВыборкаДанных;
+ Если ЗначениеЗаполнено(АлгоритмВыборки) Тогда
+
+ МенеджерОбмена = КомпонентыОбмена.МенеджерОбмена;
+ СтруктураПараметров = Новый Структура();
+ СтруктураПараметров.Вставить("КомпонентыОбмена", КомпонентыОбмена);
+
+ Попытка
+ ВыборкаДанных = МенеджерОбмена.ВыполнитьФункциюМодуляМенеджера(ПравилоОбработки.ВыборкаДанных, СтруктураПараметров);
+ Исключение
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Ошибка выполнения обработчика ПОД ВыборкаДанных.
+ |Имя ПОД: %1
+ |Описание ошибки: %2'"),
+ ПравилоОбработки.Имя,
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+ КонецПопытки;
+
+ Иначе
+ Запрос = Новый Запрос;
+ Запрос.Текст =
+ "ВЫБРАТЬ
+ | Ссылка
+ |ИЗ
+ | " + ПравилоОбработки.ИмяТаблицыДляВыборки;
+
+ ВыборкаДанных = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
+ КонецЕсли;
+
+ Возврат ВыборкаДанных;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ОбработчикиСобытийПравилКонвертации
+// Функция - "обертка" вызова обработчика ПКО ПриОтправкеДанных.
+//
+// Параметры:
+// ДанныеИБ - Ссылка на выгружаемый объект информационной базы.
+// Может быть также структура ключевых свойств, если выгружается не объект, а ссылка.
+// ДанныеXDTO - Структура, в которую выгружаются данные. По составу идентичная объекту XDTO.
+// ИмяОбработчика - Строка, имя процедуры-обработчика в модуле менеджера.
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+// СтекВыгрузки - Массив, содержит ссылки на выгружаемые объекты с учетом вложенности.
+//
+Процедура ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, Знач ИмяОбработчика, КомпонентыОбмена, СтекВыгрузки) Экспорт
+ МенеджерОбмена = КомпонентыОбмена.МенеджерОбмена;
+ СтруктураПараметров = Новый Структура();
+ СтруктураПараметров.Вставить("ДанныеИБ", ДанныеИБ);
+ СтруктураПараметров.Вставить("ДанныеXDTO", ДанныеXDTO);
+ СтруктураПараметров.Вставить("КомпонентыОбмена", КомпонентыОбмена);
+ СтруктураПараметров.Вставить("СтекВыгрузки", СтекВыгрузки);
+
+ Попытка
+ МенеджерОбмена.ВыполнитьПроцедуруМодуляМенеджера(ИмяОбработчика, СтруктураПараметров);
+ Исключение
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Ошибка выполнения обработчика ПриОтправкеДанных.
+ |Объект: %1
+ |Описание ошибки: %2'"),
+ Строка(ДанныеИБ),
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())
+ );
+ КонецПопытки;
+
+ ДанныеXDTO = СтруктураПараметров.ДанныеXDTO;
+ КомпонентыОбмена = СтруктураПараметров.КомпонентыОбмена;
+ СтекВыгрузки = СтруктураПараметров.СтекВыгрузки;
+
+КонецПроцедуры
+
+// Функция - "обертка" вызова обработчика ПКО ПриКонвертацииДанныхXDTO.
+//
+// Параметры:
+// ПолученныеДанные - Объект информационной базы, в который происходит загрузка данных.
+// ДанныеXDTO - Структура, из которой загружаются данные. По составу идентичная загружаемому объекту XDTO.
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+// ИмяОбработчика - Строка, имя процедуры-обработчика в модуле менеджера.
+//
+Процедура ПриКонвертацииДанныхXDTO(ДанныеXDTO, ПолученныеДанные, КомпонентыОбмена, Знач ИмяОбработчика) Экспорт
+
+ МенеджерОбмена = КомпонентыОбмена.МенеджерОбмена;
+ СтруктураПараметров = Новый Структура();
+ СтруктураПараметров.Вставить("ДанныеXDTO", ДанныеXDTO);
+ СтруктураПараметров.Вставить("ПолученныеДанные", ПолученныеДанные);
+ СтруктураПараметров.Вставить("КомпонентыОбмена", КомпонентыОбмена);
+
+ Попытка
+ МенеджерОбмена.ВыполнитьПроцедуруМодуляМенеджера(ИмяОбработчика, СтруктураПараметров);
+ Исключение
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Ошибка выполнения обработчика ПриКонвертацииДанныхXDTO.
+ |Тип источника: %1
+ |Описание ошибки: %2'"),
+ Строка(ДанныеXDTO),
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())
+ );
+ КонецПопытки;
+
+ ДанныеXDTO = СтруктураПараметров.ДанныеXDTO;
+ ПолученныеДанные = СтруктураПараметров.ПолученныеДанные;
+ КомпонентыОбмена = СтруктураПараметров.КомпонентыОбмена;
+
+КонецПроцедуры
+
+// Функция - "обертка" вызова обработчика ПКО ПередЗаписьюПолученныхДанных.
+//
+// Параметры:
+// ПолученныеДанные - Объект информационной базы, в который происходит загрузка данных.
+// ДанныеИБ - Объект информационной базы, который найден при идентификации загружаемых данных.
+// Если объект соответствующий загружаемому не найден, ДанныеИБ = Неопределено.
+// КомпонентыОбмена - Структура - содержит все правила и параметры обмена.
+// ИмяОбработчика - Строка, имя процедуры-обработчика в модуле менеджера.
+// КонвертацияСвойств - Таблица значений, правила конвертации свойств объекта.
+// Используется для определения состава свойств, подлежащих переносу из ПолученныеДанные в
+// ДанныеИБ.
+//
+Процедура ПередЗаписьюПолученныхДанных(ПолученныеДанные, ДанныеИБ, КомпонентыОбмена, ИмяОбработчика, КонвертацияСвойств) Экспорт
+
+ МенеджерОбмена = КомпонентыОбмена.МенеджерОбмена;
+ СтруктураПараметров = Новый Структура();
+ СтруктураПараметров.Вставить("ДанныеИБ", ДанныеИБ);
+ СтруктураПараметров.Вставить("ПолученныеДанные", ПолученныеДанные);
+ СтруктураПараметров.Вставить("КомпонентыОбмена", КомпонентыОбмена);
+ СтруктураПараметров.Вставить("КонвертацияСвойств", КонвертацияСвойств);
+
+ Попытка
+ МенеджерОбмена.ВыполнитьПроцедуруМодуляМенеджера(ИмяОбработчика, СтруктураПараметров);
+ Исключение
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Ошибка выполнения обработчика ПередЗаписьюПолученныхДанных.
+ |Объект: %1
+ |Описание ошибки: %2'"),
+ Строка(ДанныеИБ),
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())
+ );
+ КонецПопытки;
+
+ ДанныеИБ = СтруктураПараметров.ДанныеИБ;
+ ПолученныеДанные = СтруктураПараметров.ПолученныеДанные;
+ КомпонентыОбмена = СтруктураПараметров.КомпонентыОбмена;
+ КонвертацияСвойств = СтруктураПараметров.КонвертацияСвойств;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область ВедениеПротокола
+
+// Возвращает объект типа структура, содержащий все возможные поля
+// записи протокола выполнения (сообщения об ошибках и т.п.).
+//
+// Параметры:
+// КСообщенияОбОшибках - Строка, содержит код ошибки.
+// СтрокаОшибки - Строка, содержит строку модуля где возникла ошибка.
+//
+// Возвращаемое значение:
+// Объект типа структура
+//
+Функция ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках = "", Знач СтрокаОшибки = "")
+
+ СтруктураОшибки = Новый Структура();
+ СтруктураОшибки.Вставить("ИмяПКО");
+ СтруктураОшибки.Вставить("ИмяПОД");
+ СтруктураОшибки.Вставить("Нпп");
+ СтруктураОшибки.Вставить("ГНпп");
+ СтруктураОшибки.Вставить("Источник");
+ СтруктураОшибки.Вставить("ТипОбъекта");
+ СтруктураОшибки.Вставить("Свойство");
+ СтруктураОшибки.Вставить("Значение");
+ СтруктураОшибки.Вставить("ТипЗначения");
+ СтруктураОшибки.Вставить("ПКО");
+ СтруктураОшибки.Вставить("ПКС");
+ СтруктураОшибки.Вставить("ПКГС");
+ СтруктураОшибки.Вставить("ПВД");
+ СтруктураОшибки.Вставить("ПОД");
+ СтруктураОшибки.Вставить("Объект");
+ СтруктураОшибки.Вставить("СвойствоПриемника");
+ СтруктураОшибки.Вставить("КонвертируемоеЗначение");
+ СтруктураОшибки.Вставить("Обработчик");
+ СтруктураОшибки.Вставить("ОписаниеОшибки");
+ СтруктураОшибки.Вставить("ПозицияМодуля");
+ СтруктураОшибки.Вставить("Текст");
+ СтруктураОшибки.Вставить("КСообщенияОбОшибках");
+ СтруктураОшибки.Вставить("УзелПланаОбмена");
+
+ СтрокаМодуля = ОтделитьРазделителем(СтрокаОшибки, "{");
+ ОписаниеОшибки = ОтделитьРазделителем(СтрокаМодуля, "}: ");
+
+ Если ОписаниеОшибки <> "" Тогда
+
+ СтруктураОшибки.ОписаниеОшибки = ОписаниеОшибки;
+ СтруктураОшибки.ПозицияМодуля = СтрокаМодуля;
+
+ КонецЕсли;
+
+ Если СтруктураОшибки.КСообщенияОбОшибках <> "" Тогда
+
+ СтруктураОшибки.КСообщенияОбОшибках = КСообщенияОбОшибках;
+
+ КонецЕсли;
+
+ Возврат СтруктураОшибки;
+
+КонецФункции
+
+Процедура ЗаписатьИнформациюОбОшибкеВПротокол(КСообщенияОбОшибках, СтрокаОшибки, Объект, КомпонентыОбмена, ТипОбъекта = Неопределено)
+
+ ЗП = ПолучитьСтруктуруЗаписиПротокола(КСообщенияОбОшибках, СтрокаОшибки);
+ ЗП.Объект = Объект;
+
+ Если ТипОбъекта <> Неопределено Тогда
+ ЗП.ТипОбъекта = ТипОбъекта;
+ КонецЕсли;
+
+ ЗаписатьВПротоколВыполнения(КомпонентыОбмена, КСообщенияОбОшибках, ЗП);
+
+КонецПроцедуры
+
+Функция РезультатВыполненияОбменаОшибка(РезультатВыполненияОбмена)
+
+ Возврат РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка
+ Или РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка_ТранспортСообщения;
+
+КонецФункции
+
+Функция РезультатВыполненияОбменаПредупреждение(РезультатВыполненияОбмена)
+
+ Возврат РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.ВыполненоСПредупреждениями
+ Или РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Предупреждение_СообщениеОбменаБылоРанееПринято;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ПроцедурыИФункцииВерсионированияФорматаОбмена
+
+Функция ВерсииФорматаОбмена(Знач УзелИнформационнойБазы)
+
+ ВерсииФорматаОбмена = Новый Соответствие;
+
+ МенеджерПланаОбмена(УзелИнформационнойБазы).ПолучитьВерсииФорматаОбмена(ВерсииФорматаОбмена);
+
+ Если ВерсииФорматаОбмена.Количество() = 0 Тогда
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Не заданы версии формата обмена.
+ |Имя плана обмена: %1
+ |Процедура: ПолучитьВерсииФорматаОбмена(<ВерсииФорматаОбмена>)'"),
+ УзелИнформационнойБазы.Метаданные().Имя
+ );
+ КонецЕсли;
+
+ Результат = Новый Соответствие;
+
+ Для Каждого Версия Из ВерсииФорматаОбмена Цикл
+
+ Результат.Вставить(СокрЛП(Версия.Ключ), Версия.Значение);
+
+ КонецЦикла;
+
+ Возврат Результат;
+КонецФункции
+
+Функция СортироватьВерсииФормата(Знач ВерсииФормата)
+
+ Результат = Новый ТаблицаЗначений;
+ Результат.Колонки.Добавить("Версия");
+
+ Для Каждого Версия Из ВерсииФормата Цикл
+
+ Результат.Добавить().Версия = Версия.Ключ;
+
+ КонецЦикла;
+
+ Результат.Сортировать("Версия Убыв");
+
+ Возврат Результат.ВыгрузитьКолонку("Версия");
+КонецФункции
+
+Процедура ПроверитьВерсию(Знач Версия)
+
+ Версии = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Версия, ".");
+
+ Если Версии.Количество() = 0 Тогда
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Неканоническое представление версии формата обмена: <%1>.'"),
+ Версия
+ );
+ КонецЕсли;
+
+КонецПроцедуры
+
+Функция МинимальнаяВерсияФорматаОбмена(Знач УзелИнформационнойБазы)
+
+ Результат = Неопределено;
+
+ ВерсииФормата = ВерсииФорматаОбмена(УзелИнформационнойБазы);
+
+ Для Каждого ВерсияФормата Из ВерсииФормата Цикл
+
+ Если Результат = Неопределено Тогда
+ Результат = ВерсияФормата.Ключ;
+ Продолжить;
+ КонецЕсли;
+ Если СравнитьВерсии(СокрЛП(Результат), СокрЛП(ВерсияФормата.Ключ)) > 0 Тогда
+ Результат = ВерсияФормата.Ключ;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Возврат Результат;
+КонецФункции
+
+// Получает массив версий формата обмена, сортированные по убыванию.
+// Параметры:
+// УзелИнформационнойБазы - ссылка на узел-корреспондент.
+//
+Функция ВерсииФорматаОбменаМассив(Знач УзелИнформационнойБазы) Экспорт
+
+ Возврат СортироватьВерсииФормата(ВерсииФорматаОбмена(УзелИнформационнойБазы));
+
+КонецФункции
+
+#КонецОбласти
+
+#Область Прочее
+
+// Разбирает строку на две части: до подстроки разделителя и после.
+//
+// Параметры:
+// Стр - разбираемая строка;
+// Разделитель - подстрока-разделитель:
+// Режим - 0 - разделитель в возвращаемые подстроки не включается;
+// 1 - разделитель включается в левую подстроку;
+// 2 - разделитель включается в правую подстроку.
+//
+// Возвращаемое значение:
+// Правая часть строки - до символа-разделителя.
+//
+Функция ОтделитьРазделителем(Стр, Знач Разделитель, Режим=0)
+
+ ПраваяЧасть = "";
+ ПозРазделителя = Найти(Стр, Разделитель);
+ ДлинаРазделителя = СтрДлина(Разделитель);
+ Если ПозРазделителя > 0 Тогда
+ ПраваяЧасть = Сред(Стр, ПозРазделителя + ?(Режим=2, 0, ДлинаРазделителя));
+ Стр = СокрЛП(Лев(Стр, ПозРазделителя - ?(Режим=1, -ДлинаРазделителя + 1, 1)));
+ КонецЕсли;
+
+ Возврат(ПраваяЧасть);
+
+КонецФункции // ОтделитьРазделителем()
+
+Функция ИмяТипаДанныхПоОбъектуМетаданных(Знач ОбъектМетаданных, Знач ЭтоОбъект, Знач ЭтоКонстанта)
+
+ Если ЭтоКонстанта = Неопределено Тогда
+ ИмяБазовогоТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных);
+ ЭтоКонстанта = (ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаКонстанты());
+ КонецЕсли;
+
+ ЛитералыТипа = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ОбъектМетаданных.ПолноеИмя(), ".");
+
+ Если ЭтоКонстанта Тогда
+ Результат = "[ТипТаблицы]МенеджерЗначения.[ИмяТаблицы]";
+ Иначе
+ Если ЭтоОбъект Тогда
+ Результат = "[ТипТаблицы]Объект.[ИмяТаблицы]";
+ Иначе
+ Результат = "[ТипТаблицы]Ссылка.[ИмяТаблицы]";
+ КонецЕсли;
+ КонецЕсли;
+
+ Результат = СтрЗаменить(Результат, "[ТипТаблицы]", ЛитералыТипа[0]);
+ Результат = СтрЗаменить(Результат, "[ИмяТаблицы]", ЛитералыТипа[1]);
+ Возврат Результат;
+КонецФункции
+
+// Процедура удаления существующих движений документа при перепроведении (отмене проведения).
+Процедура УдалитьДвиженияУДокумента(ДокументОбъект, Отказ)
+
+ МассивОбрабатываемыхСтрокТаблицыДвижений = Новый Массив();
+
+ // Получение списка регистров, по которым существуют движения.
+ ТаблицаДвижений = ОпределитьНаличиеДвиженийПоДокументу(ДокументОбъект.Ссылка);
+ ТаблицаДвижений.Колонки.Добавить("НаборЗаписей");
+ ТаблицаДвижений.Колонки.Добавить("БезусловноеУдаление", Новый ОписаниеТипов("Булево"));
+
+ Для Каждого СтрокаДвижения Из ТаблицаДвижений Цикл
+ // Имя регистра передается как значение, полученное с помощью
+ // функции ПолноеИмя() метаданных регистра.
+ ПозицияТочки = Найти(СтрокаДвижения.Имя, ".");
+ ТипРегистра = Лев(СтрокаДвижения.Имя, ПозицияТочки - 1);
+ ИмяРегистра = СокрП(Сред(СтрокаДвижения.Имя, ПозицияТочки + 1));
+
+ МассивОбрабатываемыхСтрокТаблицыДвижений.Добавить(СтрокаДвижения);
+
+ Если ТипРегистра = "РегистрНакопления" Тогда
+ МетаданныеНабора = Метаданные.РегистрыНакопления[ИмяРегистра];
+ Набор = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей();
+
+ ИначеЕсли ТипРегистра = "РегистрБухгалтерии" Тогда
+ МетаданныеНабора = Метаданные.РегистрыБухгалтерии[ИмяРегистра];
+ Набор = РегистрыБухгалтерии[ИмяРегистра].СоздатьНаборЗаписей();
+
+ ИначеЕсли ТипРегистра = "РегистрСведений" Тогда
+ МетаданныеНабора = Метаданные.РегистрыСведений[ИмяРегистра];
+ Набор = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей();
+
+ ИначеЕсли ТипРегистра = "РегистрРасчета" Тогда
+ МетаданныеНабора = Метаданные.РегистрыРасчета[ИмяРегистра];
+ Набор = РегистрыРасчета[ИмяРегистра].СоздатьНаборЗаписей();
+
+ КонецЕсли;
+
+ Если НЕ ПравоДоступа("Изменение", Набор.Метаданные()) Тогда
+ // Отсутствуют права на всю таблицу регистра.
+ ВызватьИсключение НСтр("ru = 'Нарушение прав доступа:'") + " " + СтрокаДвижения.Имя;
+ Возврат;
+ КонецЕсли;
+
+ Набор.Отбор.Регистратор.Установить(ДокументОбъект.Ссылка);
+
+ // Набор не записывается сразу, чтобы не откатывать транзакцию, если впоследствии
+ // выяснится, что на один из регистров не хватает прав.
+ СтрокаДвижения.НаборЗаписей = Набор;
+
+ КонецЦикла;
+
+ Для Каждого СтрокаДвижения Из МассивОбрабатываемыхСтрокТаблицыДвижений Цикл
+ Попытка
+ СтрокаДвижения.НаборЗаписей.Записать();
+ Исключение
+ // Возможно «сработал» RLS или подсистема даты запрета изменения.
+ ВызватьИсключение НСтр("ru = 'Операция не выполнена:'") + " " + СтрокаДвижения.Имя
+ + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
+ КонецПопытки;
+ КонецЦикла;
+
+ Для Каждого Движение Из ДокументОбъект.Движения Цикл
+ Если Движение.Количество() > 0 Тогда
+ Движение.Очистить();
+ КонецЕсли;
+ КонецЦикла;
+
+ // Удаление записей регистрации из всех последовательностей.
+ ТекстЗапроса = "";
+ Для Каждого Последовательность Из ДокументОбъект.ПринадлежностьПоследовательностям Цикл
+ // В запросе получаем имена последовательностей, в которых документ зарегистрирован.
+ ТекстЗапроса = ТекстЗапроса + "
+ |" + ?(ТекстЗапроса = "", "", "ОБЪЕДИНИТЬ ВСЕ ") + "
+ |ВЫБРАТЬ """ + Последовательность.Метаданные().Имя
+ + """ КАК Имя ИЗ " + Последовательность.Метаданные().ПолноеИмя()
+ + " ГДЕ Регистратор = &Регистратор";
+
+ КонецЦикла;
+
+ Если ТекстЗапроса = "" Тогда
+ ТаблицаРегистраций = Новый ТаблицаЗначений();
+ Иначе
+ Запрос = Новый Запрос(ТекстЗапроса);
+ Запрос.УстановитьПараметр("Регистратор", ДокументОбъект.Ссылка);
+ ТаблицаРегистраций = Запрос.Выполнить().Выгрузить();
+ КонецЕсли;
+
+ КоллекцияПоследовательностей = ДокументОбъект.ПринадлежностьПоследовательностям;
+ Для Каждого НаборЗаписейРегистрацииВПоследовательности Из КоллекцияПоследовательностей Цикл
+ Если (НаборЗаписейРегистрацииВПоследовательности.Количество() > 0)
+ ИЛИ (НЕ ТаблицаРегистраций.Найти(НаборЗаписейРегистрацииВПоследовательности.Метаданные().Имя,"Имя") = Неопределено) Тогда
+ НаборЗаписейРегистрацииВПоследовательности.Очистить();
+ КонецЕсли;
+ КонецЦикла;
+
+КонецПроцедуры
+
+Функция ОпределитьНаличиеДвиженийПоДокументу(ДокументСсылка)
+ ТекстЗапроса = "";
+ // Для исключения падения для документов, проводящимся более чем по 256 таблицам.
+ счетчик_таблиц = 0;
+
+ МетаданныеДокумента = ДокументСсылка.Метаданные();
+
+ Если МетаданныеДокумента.Движения.Количество() = 0 Тогда
+ Возврат Новый ТаблицаЗначений;
+ КонецЕсли;
+
+ Для Каждого Движение Из МетаданныеДокумента.Движения Цикл
+ // В запросе получаем имена регистров, по которым есть хотя бы одно движение
+ // например,
+ // ВЫБРАТЬ Первые 1 «РегистрНакопления.ТоварыНаСкладах»
+ // ИЗ РегистрНакопления.ТоварыНаСкладах
+ // ГДЕ Регистратор = &Регистратор
+
+ // Имя регистра приводим к Строка(200), см. ниже.
+ ТекстЗапроса = ТекстЗапроса + "
+ |" + ?(ТекстЗапроса = "", "", "ОБЪЕДИНИТЬ ВСЕ ") + "
+ |ВЫБРАТЬ ПЕРВЫЕ 1 ВЫРАЗИТЬ(""" + Движение.ПолноеИмя()
+ + """ КАК Строка(200)) КАК Имя ИЗ " + Движение.ПолноеИмя()
+ + " ГДЕ Регистратор = &Регистратор";
+
+ // Если в запрос попадает более 256 таблиц - разбиваем его на две части
+ // (вариант документа с проведением по 512 регистрам считаем нежизненным).
+ счетчик_таблиц = счетчик_таблиц + 1;
+ Если счетчик_таблиц = 256 Тогда
+ Прервать;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Запрос = Новый Запрос(ТекстЗапроса);
+ Запрос.УстановитьПараметр("Регистратор", ДокументСсылка);
+ // При выгрузке для колонки «Имя» тип устанавливается по самой длинной строке из запроса
+ // при втором проходе по таблице новое имя может не «влезть», по этому сразу в запросе
+ // приводится к строка(200).
+ ТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
+
+ // Если количество таблиц не превысило 256 - возвращаем таблицу.
+ Если счетчик_таблиц = МетаданныеДокумента.Движения.Количество() Тогда
+ Возврат ТаблицаЗапроса;
+ КонецЕсли;
+
+ // Таблиц больше чем 256, делаем доп. запрос и дополняем строки таблицы.
+
+ ТекстЗапроса = "";
+ Для Каждого Движение Из МетаданныеДокумента.Движения Цикл
+
+ Если счетчик_таблиц > 0 Тогда
+ счетчик_таблиц = счетчик_таблиц - 1;
+ Продолжить;
+ КонецЕсли;
+
+ ТекстЗапроса = ТекстЗапроса + "
+ |" + ?(ТекстЗапроса = "", "", "ОБЪЕДИНИТЬ ВСЕ ") + "
+ |ВЫБРАТЬ ПЕРВЫЕ 1 """ + Движение.ПолноеИмя() + """ КАК Имя ИЗ "
+ + Движение.ПолноеИмя() + " ГДЕ Регистратор = &Регистратор";
+
+
+ КонецЦикла;
+ Запрос.Текст = ТекстЗапроса;
+ Выборка = Запрос.Выполнить().Выбрать();
+ Пока Выборка.Следующий() Цикл
+ СтрокаТаблицы = ТаблицаЗапроса.Добавить();
+ ЗаполнитьЗначенияСвойств(СтрокаТаблицы, Выборка);
+ КонецЦикла;
+
+ Возврат ТаблицаЗапроса;
+
+КонецФункции
+
+Процедура ЗаписатьПриНеобходимостиПубличныйИдентификатор(ДанныеДляЗаписиВИБ, ПолученныеДанныеСсылка, УзелОбмена, ПравилоКонвертации)
+
+ ВариантИдентификации = СокрЛП(ПравилоКонвертации.ВариантИдентификации);
+ Если Не ВариантИдентификации = "СначалаПоУникальномуИдентификаторуПотомПоПолямПоиска" Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если ДанныеДляЗаписиВИБ.ЭтоНовый() Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если ПолученныеДанныеСсылка = ДанныеДляЗаписиВИБ.Ссылка Тогда
+ Возврат;
+ КонецЕсли;
+
+ СтруктураЗаписи = Новый Структура;
+ СтруктураЗаписи.Вставить("Идентификатор", ПолученныеДанныеСсылка.УникальныйИдентификатор());
+ СтруктураЗаписи.Вставить("Ссылка", ДанныеДляЗаписиВИБ.Ссылка);
+ СтруктураЗаписи.Вставить("УзелИнформационнойБазы", УзелОбмена);
+
+ Если РегистрыСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов.ЗаписьЕстьВРегистре(СтруктураЗаписи) Тогда
+ Возврат;
+ КонецЕсли;
+
+ РегистрыСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов.ДобавитьЗапись(СтруктураЗаписи, Истина);
+
+КонецПроцедуры
+
+Функция XMLБазоваяСхема()
+
+ Возврат "http://www.1c.ru/SSL/Exchange/Message";
+
+КонецФункции
+
+Функция МенеджерПланаОбмена(Знач УзелИнформационнойБазы)
+
+ Возврат ПланыОбмена[УзелИнформационнойБазы.Метаданные().Имя];
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
\ No newline at end of file
diff --git a/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/ОбменДаннымиXDTOСервер.mdo b/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/ОбменДаннымиXDTOСервер.mdo
new file mode 100644
index 000000000..da7bcfc65
--- /dev/null
+++ b/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/ОбменДаннымиXDTOСервер.mdo
@@ -0,0 +1,11 @@
+
+
+ ОбменДаннымиXDTOСервер
+
+ ru
+ Обмен данными XDTO сервер
+
+ true
+ true
+ true
+
diff --git a/SSL/src/CommonModules/ОбменДаннымиВнешнееСоединение/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВнешнееСоединение/Module.bsl
index b49f6cc44..eeb2d1bba 100644
--- a/SSL/src/CommonModules/ОбменДаннымиВнешнееСоединение/Module.bsl
+++ b/SSL/src/CommonModules/ОбменДаннымиВнешнееСоединение/Module.bsl
@@ -73,9 +73,9 @@
// Возвращаемое значение:
// Зачитанные правила конвертации объектов.
//
-Функция ПолучитьПравилаКонвертацииОбъектов(ИмяПланаОбмена) Экспорт
+Функция ПолучитьПравилаКонвертацииОбъектов(ИмяПланаОбмена, ПолучатьПравилаКорреспондента = Ложь) Экспорт
- Возврат ОбменДаннымиСервер.ПолучитьПравилаКонвертацииОбъектовЧерезВнешнееСоединение(ИмяПланаОбмена);
+ Возврат ОбменДаннымиСервер.ПолучитьПравилаКонвертацииОбъектовЧерезВнешнееСоединение(ИмяПланаОбмена, ПолучатьПравилаКорреспондента);
КонецФункции
diff --git a/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl
index cf7c2bcfe..b2752702b 100644
--- a/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl
+++ b/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl
@@ -470,15 +470,7 @@
//
Процедура УдалитьНастройкуСинхронизации(Знач УзелИнформационнойБазы) Экспорт
- ОбменДаннымиСервер.ПроверитьВозможностьАдминистрированияОбменов();
-
- ОбъектУзла = УзелИнформационнойБазы.ПолучитьОбъект();
- Если ОбъектУзла = Неопределено Тогда
- Возврат;
- КонецЕсли;
-
- УстановитьПривилегированныйРежим(Истина);
- ОбъектУзла.Удалить();
+ ОбменДаннымиСервер.УдалитьНастройкуСинхронизации(УзелИнформационнойБазы);
КонецПроцедуры
diff --git a/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl
index 861f5301e..a1ac7530b 100644
--- a/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl
+++ b/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl
@@ -498,7 +498,14 @@
Возврат;
КонецЕсли;
- ЗапуститьПриложение(ПолноеИмяФайла);
+ Оповещение = Новый ОписаниеОповещения("ОбработчикОткрытияФайлаИлиКаталогаПослеНачалаЗапускаПриложения", ЭтотОбъект);
+ НачатьЗапускПриложения(Оповещение, ПолноеИмяФайла);
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+Процедура ОбработчикОткрытияФайлаИлиКаталогаПослеНачалаЗапускаПриложения(КодВозврата, ДополнительныеПараметры) Экспорт
+ // Обработка не требуется.
КонецПроцедуры
// Открывает диалог для выбора файлового каталога, запрашивая установку расширения для работы с файлами.
@@ -680,36 +687,141 @@
КонецЕсли;
// Расширение успешно установлено.
- ДанныеФайлов = ДополнительныеПараметры.ДанныеФайлов;
- СписокДляПередачи = Новый Массив;
+ ПараметрыЗаполненияСпискаДляПередачи = Новый Структура;
+ ПараметрыЗаполненияСпискаДляПередачи.Вставить("ДанныеФайлов", ДополнительныеПараметры.ДанныеФайлов);
+ ПараметрыЗаполненияСпискаДляПередачи.Вставить("СписокДляПередачи", Новый Массив);
+ ПараметрыЗаполненияСпискаДляПередачи.Вставить("БылиОшибки", Ложь);
+ ПараметрыЗаполненияСпискаДляПередачи.Вставить("НомерПозиции", 0);
+ ДополнительныеПараметры.Вставить("ПараметрыЗаполненияСпискаДляПередачи", ПараметрыЗаполненияСпискаДляПередачи);
- БылиОшибки = Ложь;
- Для Каждого Элемент Из ДанныеФайлов Цикл
- ИмяФайла = Элемент.Имя;
-
- Файл = Новый Файл(ИмяФайла);
- Если Не Файл.Существует() Или Файл.ЭтоКаталог() Тогда
- БылиОшибки = Истина;
- Элемент.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Файл ""%1"" не существует или к нему нет доступа'"), ИмяФайла);
+ ПередатьФайлНаСерверЗавершениеПодключенияРасширенияЗаполнитьСписокДляПередачи(ДополнительныеПараметры);
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+//
+Процедура ПередатьФайлНаСерверЗавершениеПодключенияРасширенияЗаполнитьСписокДляПередачи(ДополнительныеПараметры)
+
+ ПараметрыЗаполненияСпискаДляПередачи = ДополнительныеПараметры.ПараметрыЗаполненияСпискаДляПередачи;
+ Путь = ПараметрыЗаполненияСпискаДляПередачи.ДанныеФайлов[ПараметрыЗаполненияСпискаДляПередачи.НомерПозиции].Имя;
+ Оповещение = Новый ОписаниеОповещения(
+ "ПередатьФайлНаСерверЗавершениеПодключенияРасширенияПослеИнициализацииФайла",
+ ЭтотОбъект,
+ ДополнительныеПараметры);
+
+ ПроверяемыйФайл = Новый Файл();
+ ПроверяемыйФайл.НачатьИнициализацию(Оповещение, Путь);
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+//
+Процедура ПередатьФайлНаСерверЗавершениеПодключенияРасширенияПослеИнициализацииФайла(Файл, ДополнительныеПараметры) Экспорт
+
+ ДополнительныеПараметры.ПараметрыЗаполненияСпискаДляПередачи.Вставить("Файл", Файл);
+ Оповещение = Новый ОписаниеОповещения(
+ "ПередатьФайлНаСерверЗавершениеПодключенияРасширенияПослеПроверкиСуществованияФайла",
+ ЭтотОбъект,
+ ДополнительныеПараметры);
+
+ Файл.НачатьПроверкуСуществования(Оповещение);
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+//
+Процедура ПередатьФайлНаСерверЗавершениеПодключенияРасширенияПослеПроверкиСуществованияФайла(Существует, ДополнительныеПараметры) Экспорт
+
+ ПараметрыЗаполненияСпискаДляПередачи = ДополнительныеПараметры.ПараметрыЗаполненияСпискаДляПередачи;
+ Если Не Существует Тогда
+ ПараметрыЗаполненияСпискаДляПередачи.БылиОшибки = Истина;
+ Элемент = ПараметрыЗаполненияСпискаДляПередачи.ДанныеФайлов[ПараметрыЗаполненияСпискаДляПередачи.НомерПозиции];
+ Элемент.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Файл ""%1"" не существует или к нему нет доступа'"), Элемент.Имя);
+
+ // Переходим к следующему файлу, либо завершаем заполнение списка для передачи.
+ Если ПараметрыЗаполненияСпискаДляПередачи.НомерПозиции = ПараметрыЗаполненияСпискаДляПередачи.ДанныеФайлов.ВГраница() Тогда
+ ПередатьФайлНаСерверЗавершениеПодключенияРасширенияДействияПослеЗаполненияСпискаПередачи(ДополнительныеПараметры);
Иначе
- СписокДляПередачи.Добавить( Новый ОписаниеПередаваемогоФайла(ИмяФайла) );
+ ПараметрыЗаполненияСпискаДляПередачи.НомерПозиции = ПараметрыЗаполненияСпискаДляПередачи.НомерПозиции + 1;
+ ПередатьФайлНаСерверЗавершениеПодключенияРасширенияЗаполнитьСписокДляПередачи(ДополнительныеПараметры);
КонецЕсли;
- КонецЦикла;
-
- Если Не БылиОшибки Тогда
- ПомещенныеФайлы = Новый Массив;
+ Иначе
- ПоместитьФайлы(СписокДляПередачи, ПомещенныеФайлы, , Ложь, ДополнительныеПараметры.ИдентификаторФормы);
+ Оповещение = Новый ОписаниеОповещения(
+ "ПередатьФайлНаСерверЗавершениеПодключенияРасширенияПослеПроверкиНаКаталог",
+ ЭтотОбъект,
+ ДополнительныеПараметры);
- Для Индекс = 0 По ПомещенныеФайлы.ВГраница() Цикл
- ДанныеФайлов[Индекс].Хранение = ПомещенныеФайлы[Индекс].Хранение;
- КонецЦикла;
+ ДополнительныеПараметры.ПараметрыЗаполненияСпискаДляПередачи.Файл.НачатьПроверкуЭтоКаталог(Оповещение);
КонецЕсли;
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+//
+Процедура ПередатьФайлНаСерверЗавершениеПодключенияРасширенияПослеПроверкиНаКаталог(ЭтоКаталог, ДополнительныеПараметры) Экспорт
+
+ ПараметрыЗаполненияСпискаДляПередачи = ДополнительныеПараметры.ПараметрыЗаполненияСпискаДляПередачи;
+ Элемент = ПараметрыЗаполненияСпискаДляПередачи.ДанныеФайлов[ПараметрыЗаполненияСпискаДляПередачи.НомерПозиции];
+
+ Если ЭтоКаталог Тогда
+ ПараметрыЗаполненияСпискаДляПередачи.БылиОшибки = Истина;
+ Элемент.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Файл ""%1"" не существует или к нему нет доступа'"), Элемент.Имя);
+ Иначе
+ ПараметрыЗаполненияСпискаДляПередачи.СписокДляПередачи.Добавить(Новый ОписаниеПередаваемогоФайла(Элемент.Имя));
+ КонецЕсли;
+
+ // Переходим к следующему файлу, либо завершаем заполнение списка для передачи.
+ Если ПараметрыЗаполненияСпискаДляПередачи.НомерПозиции = ПараметрыЗаполненияСпискаДляПередачи.ДанныеФайлов.ВГраница() Тогда
+ ПередатьФайлНаСерверЗавершениеПодключенияРасширенияДействияПослеЗаполненияСпискаПередачи(ДополнительныеПараметры);
+ Иначе
+ ПараметрыЗаполненияСпискаДляПередачи.НомерПозиции = ПараметрыЗаполненияСпискаДляПередачи.НомерПозиции + 1;
+ ПередатьФайлНаСерверЗавершениеПодключенияРасширенияЗаполнитьСписокДляПередачи(ДополнительныеПараметры);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+//
+Процедура ПередатьФайлНаСерверЗавершениеПодключенияРасширенияДействияПослеЗаполненияСпискаПередачи(ДополнительныеПараметры)
+
+ ПараметрыЗаполненияСпискаДляПередачи = ДополнительныеПараметры.ПараметрыЗаполненияСпискаДляПередачи;
+
+ Если ПараметрыЗаполненияСпискаДляПередачи.БылиОшибки Тогда
+
+ // Оповещаем исходного вызывающего.
+ ВыполнитьОбработкуОповещения(ДополнительныеПараметры.Оповещение, ДополнительныеПараметры.ДанныеФайлов);
+
+ Иначе
+ ПомещенныеФайлы = Новый Массив;
+
+ ОписаниеОповещения = Новый ОписаниеОповещения("ПередатьФайлНаСерверЗавершениеПодключенияРасширенияДействияПослеПомещенияФайлов",
+ ЭтотОбъект, ДополнительныеПараметры);
+
+ НачатьПомещениеФайлов(
+ ОписаниеОповещения,
+ ПараметрыЗаполненияСпискаДляПередачи.СписокДляПередачи,,
+ Ложь,
+ ДополнительныеПараметры.ИдентификаторФормы);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+//
+Процедура ПередатьФайлНаСерверЗавершениеПодключенияРасширенияДействияПослеПомещенияФайлов(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт
+
+ Для Индекс = 0 По ПомещенныеФайлы.ВГраница() Цикл
+ ДополнительныеПараметры.ДанныеФайлов[Индекс].Хранение = ПомещенныеФайлы[Индекс].Хранение;
+ КонецЦикла;
+
// Оповещаем исходного вызывающего.
- ВыполнитьОбработкуОповещения(ДополнительныеПараметры.Оповещение, ДанныеФайлов);
+ ВыполнитьОбработкуОповещения(ДополнительныеПараметры.Оповещение, ДополнительныеПараметры.ДанныеФайлов);
+
КонецПроцедуры
// Передает файл на сервер интерактивно, без расширения для работы с файлами.
@@ -726,18 +838,33 @@
//
Процедура ВыбратьИПередатьФайлНаСервер(ОповещениеЗавершения, Знач ПараметрыДиалога = Неопределено, Знач ИдентификаторФормы = Неопределено) Экспорт
+ ДополнительныеПараметры = Новый Структура;
+ ДополнительныеПараметры.Вставить("ОповещениеЗавершения", ОповещениеЗавершения);
+ ДополнительныеПараметры.Вставить("ПараметрыДиалога", ПараметрыДиалога);
+ ДополнительныеПараметры.Вставить("ИдентификаторФормы", ИдентификаторФормы);
+
+ ОповещениеПодключенияРасширенияРаботыСФайлами = Новый ОписаниеОповещения(
+ "ВыбратьИПередатьФайлНаСерверПослеПодключенияРасширенияРаботыСФайлами",
+ ЭтотОбъект, ДополнительныеПараметры);
+
+ НачатьПодключениеРасширенияРаботыСФайлами(ОповещениеПодключенияРасширенияРаботыСФайлами);
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+//
+Процедура ВыбратьИПередатьФайлНаСерверПослеПодключенияРасширенияРаботыСФайлами(Подключено, ДополнительныеПараметры) Экспорт
+
Результат = Новый Структура("Имя, Хранение, ОписаниеОшибки");
+ ДополнительныеПараметры.Вставить("Результат", Результат);
+ Оповещение = Новый ОписаниеОповещения("ВыбратьИПередатьФайлыНаСерверЗавершение", ЭтотОбъект, ДополнительныеПараметры);
- Оповещение = Новый ОписаниеОповещения("ВыбратьИПередатьФайлыНаСерверЗавершение", ЭтотОбъект, Новый Структура);
- Оповещение.ДополнительныеПараметры.Вставить("ОповещениеЗавершения", ОповещениеЗавершения);
- Оповещение.ДополнительныеПараметры.Вставить("Результат", Результат);
-
- Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если Не Подключено Тогда
// У нас нет расширения, используем диалог выбора из НачатьПомещениеФайла.
- НачатьПомещениеФайла(Оповещение, , , Истина, ИдентификаторФормы);
+ НачатьПомещениеФайла(Оповещение, , , Истина, ДополнительныеПараметры.ИдентификаторФормы);
Возврат;
КонецЕсли;
-
+
// У нас есть расширение, используем диалог.
УмолчанияДиалога = Новый Структура;
УмолчанияДиалога.Вставить("ПроверятьСуществованиеФайла", Истина);
@@ -745,17 +872,29 @@
УмолчанияДиалога.Вставить("МножественныйВыбор", Ложь);
УмолчанияДиалога.Вставить("ПредварительныйПросмотр", Ложь);
- УстановитьЗначенияСтруктурыПоУмолчанию(ПараметрыДиалога, УмолчанияДиалога);
+ УстановитьЗначенияСтруктурыПоУмолчанию(ДополнительныеПараметры.ПараметрыДиалога, УмолчанияДиалога);
ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
- ЗаполнитьЗначенияСвойств(ДиалогВыбора, ПараметрыДиалога);
+ ЗаполнитьЗначенияСвойств(ДиалогВыбора, ДополнительныеПараметры.ПараметрыДиалога);
- Если ДиалогВыбора.Выбрать() Тогда
- НачатьПомещениеФайла(Оповещение, , ДиалогВыбора.ПолноеИмяФайла, Ложь, ИдентификаторФормы);
- КонецЕсли;
+ ОписаниеОповещенияДиалогаВыбора = Новый ОписаниеОповещения("ВыбратьИПередатьФайлНаСерверПослеВыбораВДиалоге", ЭтотОбъект, ДополнительныеПараметры);
+ ДиалогВыбора.Показать(ОписаниеОповещенияДиалогаВыбора);
КонецПроцедуры
+// Продолжение процедуры (см. выше).
+//
+Процедура ВыбратьИПередатьФайлНаСерверПослеВыбораВДиалоге(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
+
+ Если ВыбранныеФайлы <> Неопределено
+ И ВыбранныеФайлы.Количество() = 1 Тогда
+
+ Оповещение = Новый ОписаниеОповещения("ВыбратьИПередатьФайлыНаСерверЗавершение", ЭтотОбъект, ДополнительныеПараметры);
+ НачатьПомещениеФайла(Оповещение, , ВыбранныеФайлы[0], Ложь, ДополнительныеПараметры.ИдентификаторФормы);
+ КонецЕсли;
+
+КонецПроцедуры
+
// Обработчик немодального завершения выбора и передачи файлов на сервер.
//
Процедура ВыбратьИПередатьФайлыНаСерверЗавершение(Знач Успешно, Знач Адрес, Знач ВыбранноеИмяФайла, Знач ДополнительныеПараметры) Экспорт
@@ -779,9 +918,25 @@
//
Процедура ВыбратьИСохранитьФайлНаКлиенте(Знач ПолучаемыйФайл, Знач ПараметрыДиалога = Неопределено) Экспорт
- Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
+ ДополнительныеПараметры = Новый Структура;
+ ДополнительныеПараметры.Вставить("ПолучаемыйФайл", ПолучаемыйФайл);
+ ДополнительныеПараметры.Вставить("ПараметрыДиалога", ПараметрыДиалога);
+
+ ОповещениеПодключенияРасширенияРаботыСФайлами = Новый ОписаниеОповещения(
+ "ВыбратьИСохранитьФайлНаКлиентеПослеПодключенияРасширенияРаботыСФайлами",
+ ЭтотОбъект, ДополнительныеПараметры);
+
+ НачатьПодключениеРасширенияРаботыСФайлами(ОповещениеПодключенияРасширенияРаботыСФайлами);
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+//
+Процедура ВыбратьИСохранитьФайлНаКлиентеПослеПодключенияРасширенияРаботыСФайлами(Подключено, ДополнительныеПараметры) Экспорт
+
+ Если Не Подключено Тогда
// У нас нет расширения, используем диалог выбора из ПолучитьФайл.
- ПолучитьФайл(ПолучаемыйФайл.Хранение, ПолучаемыйФайл.Имя, Истина);
+ ПолучитьФайл(ДополнительныеПараметры.ПолучаемыйФайл.Хранение, ДополнительныеПараметры.ПолучаемыйФайл.Имя, Истина);
Возврат;
КонецЕсли;
@@ -791,16 +946,27 @@
УмолчанияДиалога.Вставить("МножественныйВыбор", Ложь);
УмолчанияДиалога.Вставить("ПредварительныйПросмотр", Ложь);
- УстановитьЗначенияСтруктурыПоУмолчанию(ПараметрыДиалога, УмолчанияДиалога);
+ УстановитьЗначенияСтруктурыПоУмолчанию(ДополнительныеПараметры.ПараметрыДиалога, УмолчанияДиалога);
ДиалогСохранения = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
- ЗаполнитьЗначенияСвойств(ДиалогСохранения, ПараметрыДиалога);
+ ЗаполнитьЗначенияСвойств(ДиалогСохранения, ДополнительныеПараметры.ПараметрыДиалога);
Получаемые = Новый Массив;
- Получаемые.Добавить( Новый ОписаниеПередаваемогоФайла(ПолучаемыйФайл.Имя, ПолучаемыйФайл.Хранение) );
+ Получаемые.Добавить( Новый ОписаниеПередаваемогоФайла(ДополнительныеПараметры.ПолучаемыйФайл.Имя,
+ ДополнительныеПараметры.ПолучаемыйФайл.Хранение) );
- Полученные = Новый Массив;
- ПолучитьФайлы(Получаемые, Полученные, ДиалогСохранения, Истина);
+ ОписаниеОповещенияПолученияФайлов = Новый ОписаниеОповещения(
+ "ВыбратьИСохранитьФайлНаКлиентеПослеПолученияФайлов",
+ ЭтотОбъект, ДополнительныеПараметры);
+
+ НачатьПолучениеФайлов(ОписаниеОповещенияПолученияФайлов, Получаемые, ДиалогСохранения, Истина);
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+//
+Процедура ВыбратьИСохранитьФайлНаКлиентеПослеПолученияФайлов(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
+ // Обработка не требуется.
КонецПроцедуры
// Добавляет поля в целевую структуру, если их там нет.
@@ -948,16 +1114,6 @@
ПараметрыФормы.Вставить("РасширенныйРежимДополненияВыгрузки", Истина);
ИмяФормы = "Обработка.ПомощникИнтерактивногоОбменаДанными.Форма";
-
- Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ОбменДаннымиXDTO") Тогда
-
- МодульОбменДаннымиXDTOКлиентПовтИсп = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбменДаннымиXDTOКлиентПовтИсп");
- Если МодульОбменДаннымиXDTOКлиентПовтИсп.ЭтоПланОбменаXDTO(УзелИнформационнойБазы) Тогда
- ИмяФормы = "Обработка.ПомощникИнтерактивногоОбменаДаннымиЧерезXDTO.Форма";
- КонецЕсли;
-
- КонецЕсли;
-
ОткрытьФорму(ИмяФормы, ПараметрыФормы, Владелец, УзелИнформационнойБазы);
КонецЕсли;
@@ -977,16 +1133,6 @@
ПараметрыФормы = Новый Структура("УзелИнформационнойБазы", УзелИнформационнойБазы);
ИмяФормы = "Обработка.ПомощникИнтерактивногоОбменаДанными.Форма";
-
- Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ОбменДаннымиXDTO") Тогда
-
- МодульОбменДаннымиXDTOКлиентПовтИсп = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбменДаннымиXDTOКлиентПовтИсп");
- Если МодульОбменДаннымиXDTOКлиентПовтИсп.ЭтоПланОбменаXDTO(УзелИнформационнойБазы) Тогда
- ИмяФормы = "Обработка.ПомощникИнтерактивногоОбменаДаннымиЧерезXDTO.Форма";
- КонецЕсли;
-
- КонецЕсли;
-
ОткрытьФорму(ИмяФормы, ПараметрыФормы, Владелец, УзелИнформационнойБазы, , , ,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
diff --git a/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl
index c1c6f5918..94536562a 100644
--- a/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl
+++ b/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl
@@ -171,7 +171,158 @@
Возврат Результат;
КонецФункции
+// Определяет, входит ли план обмена в список планов обмена, которые используют обмен данными по формату XDTO.
//
+// Параметры:
+// ПланОбмена - Ссылка на узел плана обмена или имя плана обмена.
+//
+// Возвращаемое значение: Булево.
+//
+Функция ЭтоПланОбменаXDTO(ПланОбмена) Экспорт
+ Если ТипЗнч(ПланОбмена) = Тип("Строка") Тогда
+ ИмяПланаОбмена = ПланОбмена;
+ Иначе
+ ИмяПланаОбмена = ПланОбмена.Метаданные().Имя;
+ КонецЕсли;
+ Возврат ОбменДаннымиСервер.ЗначениеНастройкиПланаОбмена(ИмяПланаОбмена, "ЭтоПланОбменаXDTO");
+КонецФункции
+
+// Определяет номер версии подсистемы учета синхронизируемых объектов для узла информационной базы.
+//
+// Параметры:
+// УзелИнформационнойБазы - ПланыОбменаСсылка.
+//
+// Возвращаемое значение - Число, номер версии
+// 1 - с использованием регистра СоответствиеОбъектовИнформационныхБаз
+// 2 - с использованием регистров ПубличныеИдентификаторыСинхронизируемыхОбъектов и
+// ДанныеОбъектовДляРегистрацииВОбменах.
+//
+Функция ВерсияПодсистемыУчетаСинхронизируемыхОбъектов(Знач УзелИнформационнойБазы) Экспорт
+ Запрос = Новый Запрос("
+ |ВЫБРАТЬ ПЕРВЫЕ 1
+ | 1
+ |ИЗ
+ | РегистрСведений.СоответствияОбъектовИнформационныхБаз
+ |ГДЕ
+ | УзелИнформационнойБазы = &УзелИнформационнойБазы");
+ Запрос.УстановитьПараметр("УзелИнформационнойБазы", УзелИнформационнойБазы);
+ РезультатЗапроса = Запрос.Выполнить();
+ Возврат ?(РезультатЗапроса.Пустой(),2,1);
+КонецФункции
+
+// Заполняет перечень кодов возможных ошибок.
+//
+// Возвращаемое значение:
+// Соответствие. Ключ - код ошибки (число), значение - описание ошибки (строка).
+//
+Функция СообщенияОбОшибках() Экспорт
+
+ СообщенияОбОшибках = Новый Соответствие;
+
+ СообщенияОбОшибках.Вставить(2, НСтр("ru = 'Ошибка распаковки файла обмена. Файл заблокирован.'"));
+ СообщенияОбОшибках.Вставить(3, НСтр("ru = 'Указанный файл правил обмена не существует.'"));
+ СообщенияОбОшибках.Вставить(4, НСтр("ru = 'Ошибка при создании COM-объекта Msxml2.DOMDocument'"));
+ СообщенияОбОшибках.Вставить(5, НСтр("ru = 'Ошибка открытия файла обмена'"));
+ СообщенияОбОшибках.Вставить(6, НСтр("ru = 'Ошибка при загрузке правил обмена'"));
+ СообщенияОбОшибках.Вставить(7, НСтр("ru = 'Ошибка формата правил обмена'"));
+ СообщенияОбОшибках.Вставить(8, НСтр("ru = 'Не корректно указано имя файла для выгрузки данных'"));
+ СообщенияОбОшибках.Вставить(9, НСтр("ru = 'Ошибка формата файла обмена'"));
+ СообщенияОбОшибках.Вставить(10, НСтр("ru = 'Не указано имя файла для выгрузки данных (Имя файла данных)'"));
+ СообщенияОбОшибках.Вставить(11, НСтр("ru = 'Ссылка на несуществующий объект метаданных в правилах обмена'"));
+ СообщенияОбОшибках.Вставить(12, НСтр("ru = 'Не указано имя файла с правилами обмена (Имя файла правил)'"));
+
+ СообщенияОбОшибках.Вставить(13, НСтр("ru = 'Ошибка получения значения свойства объекта (по имени свойства источника)'"));
+ СообщенияОбОшибках.Вставить(14, НСтр("ru = 'Ошибка получения значения свойства объекта (по имени свойства приемника)'"));
+
+ СообщенияОбОшибках.Вставить(15, НСтр("ru = 'Не указано имя файла для загрузки данных (Имя файла для загрузки)'"));
+
+ СообщенияОбОшибках.Вставить(16, НСтр("ru = 'Ошибка получения значения свойства подчиненного объекта (по имени свойства источника)'"));
+ СообщенияОбОшибках.Вставить(17, НСтр("ru = 'Ошибка получения значения свойства подчиненного объекта (по имени свойства приемника)'"));
+ СообщенияОбОшибках.Вставить(18, НСтр("ru = 'Ошибка при создании обработки с кодом обработчиков'"));
+ СообщенияОбОшибках.Вставить(19, НСтр("ru = 'Ошибка в обработчике события ПередЗагрузкойОбъекта'"));
+ СообщенияОбОшибках.Вставить(20, НСтр("ru = 'Ошибка в обработчике события ПриЗагрузкеОбъекта'"));
+ СообщенияОбОшибках.Вставить(21, НСтр("ru = 'Ошибка в обработчике события ПослеЗагрузкиОбъекта'"));
+ СообщенияОбОшибках.Вставить(22, НСтр("ru = 'Ошибка в обработчике события ПередЗагрузкойДанных (конвертация)'"));
+ СообщенияОбОшибках.Вставить(23, НСтр("ru = 'Ошибка в обработчике события ПослеЗагрузкиДанных (конвертация)'"));
+ СообщенияОбОшибках.Вставить(24, НСтр("ru = 'Ошибка при удалении объекта'"));
+ СообщенияОбОшибках.Вставить(25, НСтр("ru = 'Ошибка при записи документа'"));
+ СообщенияОбОшибках.Вставить(26, НСтр("ru = 'Ошибка записи объекта'"));
+ СообщенияОбОшибках.Вставить(27, НСтр("ru = 'Ошибка в обработчике события ПередОбработкойПравилаОчистки'"));
+ СообщенияОбОшибках.Вставить(28, НСтр("ru = 'Ошибка в обработчике события ПослеОбработкиПравилаОчистки'"));
+ СообщенияОбОшибках.Вставить(29, НСтр("ru = 'Ошибка в обработчике события ПередУдалениемОбъекта'"));
+
+ СообщенияОбОшибках.Вставить(31, НСтр("ru = 'Ошибка в обработчике события ПередОбработкойПравилаВыгрузки'"));
+ СообщенияОбОшибках.Вставить(32, НСтр("ru = 'Ошибка в обработчике события ПослеОбработкиПравилаВыгрузки'"));
+ СообщенияОбОшибках.Вставить(33, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкойОбъекта'"));
+ СообщенияОбОшибках.Вставить(34, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузкиОбъекта'"));
+
+ СообщенияОбОшибках.Вставить(41, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкойОбъекта'"));
+ СообщенияОбОшибках.Вставить(42, НСтр("ru = 'Ошибка в обработчике события ПриВыгрузкеОбъекта'"));
+ СообщенияОбОшибках.Вставить(43, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузкиОбъекта'"));
+
+ СообщенияОбОшибках.Вставить(45, НСтр("ru = 'Не найдено правило конвертации объектов'"));
+
+ СообщенияОбОшибках.Вставить(48, НСтр("ru = 'Ошибка в обработчике события ПередОбработкойВыгрузки группы свойств'"));
+ СообщенияОбОшибках.Вставить(49, НСтр("ru = 'Ошибка в обработчике события ПослеОбработкиВыгрузки группы свойств'"));
+ СообщенияОбОшибках.Вставить(50, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкой (объекта коллекции)'"));
+ СообщенияОбОшибках.Вставить(51, НСтр("ru = 'Ошибка в обработчике события ПриВыгрузке (объекта коллекции)'"));
+ СообщенияОбОшибках.Вставить(52, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузки (объекта коллекции)'"));
+ СообщенияОбОшибках.Вставить(53, НСтр("ru = 'Ошибка в глобальном обработчике события ПередЗагрузкойОбъекта (конвертация)'"));
+ СообщенияОбОшибках.Вставить(54, НСтр("ru = 'Ошибка в глобальном обработчике события ПослеЗагрузкиОбъекта (конвертация)'"));
+ СообщенияОбОшибках.Вставить(55, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкой (свойства)'"));
+ СообщенияОбОшибках.Вставить(56, НСтр("ru = 'Ошибка в обработчике события ПриВыгрузке (свойства)'"));
+ СообщенияОбОшибках.Вставить(57, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузки (свойства)'"));
+
+ СообщенияОбОшибках.Вставить(62, НСтр("ru = 'Ошибка в обработчике события ПередВыгрузкойДанных (конвертация)'"));
+ СообщенияОбОшибках.Вставить(63, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузкиДанных (конвертация)'"));
+ СообщенияОбОшибках.Вставить(64, НСтр("ru = 'Ошибка в глобальном обработчике события ПередКонвертациейОбъекта (конвертация)'"));
+ СообщенияОбОшибках.Вставить(65, НСтр("ru = 'Ошибка в глобальном обработчике события ПередВыгрузкойОбъекта (конвертация)'"));
+ СообщенияОбОшибках.Вставить(66, НСтр("ru = 'Ошибка получения коллекции подчиненных объектов из входящих данных'"));
+ СообщенияОбОшибках.Вставить(67, НСтр("ru = 'Ошибка получения свойства подчиненного объекта из входящих данных'"));
+ СообщенияОбОшибках.Вставить(68, НСтр("ru = 'Ошибка получения свойства объекта из входящих данных'"));
+
+ СообщенияОбОшибках.Вставить(69, НСтр("ru = 'Ошибка в глобальном обработчике события ПослеВыгрузкиОбъекта (конвертация)'"));
+
+ СообщенияОбОшибках.Вставить(71, НСтр("ru = 'Не найдено соответствие для значения Источника'"));
+
+ СообщенияОбОшибках.Вставить(72, НСтр("ru = 'Ошибка при выгрузке данных для узла плана обмена'"));
+
+ СообщенияОбОшибках.Вставить(73, НСтр("ru = 'Ошибка в обработчике события ПоследовательностьПолейПоиска'"));
+ СообщенияОбОшибках.Вставить(74, НСтр("ru = 'Необходимо перезагрузить правила обмена для выгрузки данных.'"));
+
+ СообщенияОбОшибках.Вставить(75, НСтр("ru = 'Ошибка в обработчике события ПослеЗагрузкиПравилОбмена (конвертация)'"));
+ СообщенияОбОшибках.Вставить(76, НСтр("ru = 'Ошибка в обработчике события ПередОтправкойИнформацииОбУдалении (конвертация)'"));
+ СообщенияОбОшибках.Вставить(77, НСтр("ru = 'Ошибка в обработчике события ПриПолученииИнформацииОбУдалении (конвертация)'"));
+
+ СообщенияОбОшибках.Вставить(78, НСтр("ru = 'Ошибка при выполнении алгоритма после загрузки значений параметров'"));
+
+ СообщенияОбОшибках.Вставить(79, НСтр("ru = 'Ошибка в обработчике события ПослеВыгрузкиОбъектаВФайл'"));
+
+ СообщенияОбОшибках.Вставить(80, НСтр("ru = 'Ошибка установки свойства предопределенного элемента.
+ |Нельзя помечать на удаление предопределенный элемент. Пометка на удаление для объекта не установлена.'"));
+ //
+ СообщенияОбОшибках.Вставить(81, НСтр("ru = 'Возникла коллизия изменений объектов.
+ |Объект этой информационной базы был заменен версией объекта из второй информационной базы.'"));
+ //
+ СообщенияОбОшибках.Вставить(82, НСтр("ru = 'Возникла коллизия изменений объектов.
+ |Объект из второй информационной базы не принят. Объект этой информационной базы не изменен.'"));
+ //
+ СообщенияОбОшибках.Вставить(83, НСтр("ru = 'Ошибка обращения к табличной части объекта. Табличная часть объекта не может быть изменена.'"));
+ СообщенияОбОшибках.Вставить(84, НСтр("ru = 'Коллизия дат запрета изменения.'"));
+
+ СообщенияОбОшибках.Вставить(174, НСтр("ru = 'Сообщение обмена было принято ранее'"));
+ СообщенияОбОшибках.Вставить(175, НСтр("ru = 'Ошибка в обработчике события ПередПолучениемИзмененныхОбъектов (конвертация)'"));
+ СообщенияОбОшибках.Вставить(176, НСтр("ru = 'Ошибка в обработчике события ПослеПолученияИнформацииОбУзлахОбмена (конвертация)'"));
+
+ СообщенияОбОшибках.Вставить(177, НСтр("ru = 'Имя плана обмена из сообщения обмена не соответствует ожидаемому.'"));
+ СообщенияОбОшибках.Вставить(178, НСтр("ru = 'Получатель из сообщения обмена не соответствует ожидаемому.'"));
+
+ СообщенияОбОшибках.Вставить(1000, НСтр("ru = 'Ошибка при создании временного файла выгрузки данных'"));
+
+ Возврат СообщенияОбОшибках;
+
+КонецФункции
+
// Для внутреннего использования.
//
@@ -530,7 +681,7 @@
// Истина - узел принадлежит плану обмена РИБ, иначе Ложь.
//
Функция ЭтоУзелРаспределеннойИнформационнойБазы(Знач УзелИнформационнойБазы) Экспорт
-
+
Возврат УзелИнформационнойБазы.Метаданные().РаспределеннаяИнформационнаяБаза;
КонецФункции
@@ -544,16 +695,8 @@
// Истина - узел принадлежит плану обмена стандартного обмена, иначе Ложь.
//
Функция ЭтоУзелСтандартногоОбменаДанными(УзелИнформационнойБазы) Экспорт
-
- Если ОбщегоНазначения.ПодсистемаСуществует("ОбменДаннымиXDTO") Тогда
-
- МодульОбменДаннымиXDTOПовтИсп = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиXDTOПовтИсп");
- МодульОбменДаннымиXDTOСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиXDTOСервер");
-
- Если МодульОбменДаннымиXDTOПовтИсп.ЭтоПланОбменаXDTO(УзелИнформационнойБазы) Тогда
- Возврат Ложь;
- КонецЕсли;
-
+ Если ЭтоПланОбменаXDTO(УзелИнформационнойБазы) Тогда
+ Возврат Ложь;
КонецЕсли;
Возврат Не ЭтоУзелРаспределеннойИнформационнойБазы(УзелИнформационнойБазы)
@@ -571,18 +714,12 @@
//
Функция ЭтоУзелУниверсальногоОбменаДанными(УзелИнформационнойБазы) Экспорт
- Если ОбщегоНазначения.ПодсистемаСуществует("ОбменДаннымиXDTO") Тогда
-
- МодульОбменДаннымиXDTOПовтИсп = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиXDTOПовтИсп");
- МодульОбменДаннымиXDTOСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиXDTOСервер");
-
- Если МодульОбменДаннымиXDTOПовтИсп.ЭтоПланОбменаXDTO(УзелИнформационнойБазы) Тогда
- Возврат Истина;
- КонецЕсли;
+ Если ЭтоПланОбменаXDTO(УзелИнформационнойБазы) Тогда
+ Возврат Истина;
+ Иначе
+ Возврат Не ЭтоУзелРаспределеннойИнформационнойБазы(УзелИнформационнойБазы)
+ И ЕстьМакетПланаОбмена(ПолучитьИмяПланаОбмена(УзелИнформационнойБазы), "ПравилаОбмена");
КонецЕсли;
-
- Возврат Не ЭтоУзелРаспределеннойИнформационнойБазы(УзелИнформационнойБазы)
- И ЕстьМакетПланаОбмена(ПолучитьИмяПланаОбмена(УзелИнформационнойБазы), "ПравилаОбмена");
//
КонецФункции
@@ -922,11 +1059,19 @@
КонецФункции
-// Функция-обертка одноименной функции модуля ОбменДаннымиСервер.
+// Для внутреннего использования.
//
-Функция ОбработкаДляЗагрузкиДанных(Отказ, Знач УзелИнформационнойБазы, Знач ИмяФайлаСообщенияОбмена) Экспорт
+Функция СтруктураНастроекОбменаДляСеансаИнтерактивнойЗагрузки(УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена) Экспорт
- Возврат ОбменДаннымиСервер.ОбработкаДляЗагрузкиДанных(Отказ, УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена);
+ СтруктураНастроекОбмена = ОбменДаннымиСервер.ПолучитьСтруктуруНастроекОбменаДляУзлаИнформационнойБазы(
+ УзелИнформационнойБазы,
+ Перечисления.ДействияПриОбмене.ЗагрузкаДанных,
+ Неопределено,
+ Ложь);
+
+ СтруктураНастроекОбмена.ОбработкаОбменаДанными.ИмяФайлаОбмена = ИмяФайлаСообщенияОбмена;
+
+ Возврат СтруктураНастроекОбмена;
КонецФункции
diff --git a/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl
index 72950d02d..9e41f9d4a 100644
--- a/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl
+++ b/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl
@@ -1256,7 +1256,7 @@
Параметры.Вставить("ОтображатьЗначенияПоУмолчаниюНаУзле", Истина);
Параметры.Вставить("ОтображатьНастройкуОтборовНаУзлеБазыКорреспондента", Истина);
Параметры.Вставить("ОтображатьЗначенияПоУмолчаниюНаУзлеБазыКорреспондента", Истина);
-
+ Параметры.Вставить("ЭтоПланОбменаXDTO", Ложь);
Возврат Параметры;
КонецФункции
@@ -1293,6 +1293,43 @@
КонецФункции
+// Выполняет действия по удалению настройки синхронизации данных.
+//
+// Параметры:
+// УзелИнформационнойБазы - ПланОбменаСсылка - Ссылка на удаляемый узел плана обмена.
+//
+Процедура УдалитьНастройкуСинхронизации(УзелИнформационнойБазы) Экспорт
+
+ ПроверитьВозможностьАдминистрированияОбменов();
+
+ ОбъектУзла = УзелИнформационнойБазы.ПолучитьОбъект();
+ Если ОбъектУзла = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+
+ УстановитьПривилегированныйРежим(Истина);
+ ОбъектУзла.Удалить();
+
+КонецПроцедуры
+
+// Выполняет действия по удалению настройки синхронизации данных с главным узлом РИБ.
+//
+// Параметры:
+// УзелИнформационнойБазы - ПланОбменаСсылка - Ссылка на главный узел.
+//
+Процедура УдалитьНастройкиСинхронизацииСГлавнымУзломРИБ(УзелИнформационнойБазы) Экспорт
+
+ УдалитьНастройкуСинхронизации(УзелИнформационнойБазы);
+
+ НастройкаПодчиненногоУзлаРИБЗавершена = Константы.НастройкаПодчиненногоУзлаРИБЗавершена.СоздатьМенеджерЗначения();
+ НастройкаПодчиненногоУзлаРИБЗавершена.Прочитать();
+ Если НастройкаПодчиненногоУзлаРИБЗавершена.Значение Тогда
+ НастройкаПодчиненногоУзлаРИБЗавершена.Значение = Ложь;
+ ОбновлениеИнформационнойБазы.ЗаписатьДанные(НастройкаПодчиненногоУзлаРИБЗавершена);
+ КонецЕсли;
+
+КонецПроцедуры
+
////////////////////////////////////////////////////////////////////////////////
// Работа с объектом FTP-соединение.
@@ -1499,7 +1536,14 @@
Параметры.Вставить("ГлавныйУзел", ГлавныйУзел());
Если ОткрытьПомощникСозданияОбменаДаннымиДляНастройкиПодчиненногоУзла() Тогда
+
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда
+ МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия");
+ МодульВзаимодействия.ВыполнитьПолныйПерерасчетСостояний();
+ КонецЕсли;
+
Параметры.Вставить("ОткрытьПомощникСозданияОбменаДаннымиДляНастройкиПодчиненногоУзла");
+
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
@@ -1727,6 +1771,22 @@
КонецПроцедуры
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.Справочники.СценарииОбменовДанными.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
////////////////////////////////////////////////////////////////////////////////
// Обработчики условных вызовов в другие подсистемы.
@@ -2819,6 +2879,7 @@
Если СтруктураНастроекОбмена.ПроизводитьЗагрузкуДанных Тогда
+ СозданВременныйФайл = Ложь;
Если ПолноеИмяФайлаСообщенияОбмена = ""
И СообщениеОбмена <> "" Тогда
@@ -2826,6 +2887,7 @@
ТекстовыйФайл = Новый ТекстовыйДокумент;
ТекстовыйФайл.УстановитьТекст(СообщениеОбмена);
ТекстовыйФайл.Записать(ПолноеИмяФайлаСообщенияОбмена);
+ СозданВременныйФайл = Истина;
КонецЕсли;
ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ПолноеИмяФайлаСообщенияОбмена, СообщениеОбмена);
@@ -2840,6 +2902,16 @@
СтандартнаяОбработка);
// {Обработчик: ПослеЧтенияСообщенияОбмена} Окончание
+ Если СозданВременныйФайл Тогда
+
+ Попытка
+ УдалитьФайлы(ПолноеИмяФайлаСообщенияОбмена);
+ Исключение
+ ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(),
+ УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+ КонецПопытки;
+ КонецЕсли;
+
ИначеЕсли СтруктураНастроекОбмена.ПроизводитьВыгрузкуДанных Тогда
ЗаписатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ПолноеИмяФайлаСообщенияОбмена, СообщениеОбмена);
@@ -2917,7 +2989,7 @@
// Для внутреннего использования.
//
-Функция ПолучитьПравилаКонвертацииОбъектовЧерезВнешнееСоединение(ИмяПланаОбмена) Экспорт
+Функция ПолучитьПравилаКонвертацииОбъектовЧерезВнешнееСоединение(ИмяПланаОбмена, ПолучатьПравилаКорреспондента = Ложь) Экспорт
УстановитьПривилегированныйРежим(Истина);
@@ -4287,6 +4359,22 @@
КонецФункции
+// Определяет, входит ли план обмена в список планов обмена, которые используют обмен данными по формату XDTO.
+//
+// Параметры:
+// ПланОбмена - Ссылка на узел плана обмена или имя плана обмена.
+//
+// Возвращаемое значение: Булево.
+//
+Функция ЭтоПланОбменаXDTO(ПланОбмена) Экспорт
+ Если ТипЗнч(ПланОбмена) = Тип("Строка") Тогда
+ ИмяПланаОбмена = ПланОбмена;
+ Иначе
+ ИмяПланаОбмена = ПланОбмена.Метаданные().Имя;
+ КонецЕсли;
+ Возврат ЗначениеНастройкиПланаОбмена(ИмяПланаОбмена, "ЭтоПланОбменаXDTO");
+КонецФункции
+
////////////////////////////////////////////////////////////////////////////////
// Транспорт сообщений обмена
@@ -8955,71 +9043,6 @@
КонецПроцедуры
-//
-
-// Для внутреннего использования.
-//
-Функция ОбработкаОбменаДляЗагрузкиДанных(Отказ, Знач УзелИнформационнойБазы, Знач ИмяФайлаСообщенияОбмена) Экспорт
-
- Возврат ОбменДаннымиПовтИсп.ОбработкаДляЗагрузкиДанных(Отказ, УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена);
-
-КонецФункции
-
-// Возвращает инициализированную обработку КонвертацияОбъектовИнформационныхБаз для выполнения загрузки данных.
-// Обработка сохраняется в платформенном КЭШе для многократного использования для одного узла плана обмена
-// и конкретного файла сообщения обмена с уникальным полным именем.
-//
-// Параметры:
-// УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена.
-// ИмяФайлаСообщенияОбмена - Строка - уникальное имя файла сообщения обмена для загрузки данных.
-//
-// Возвращаемое значение:
-// ОбработкаОбъект.КонвертацияОбъектовИнформационныхБаз - инициализированная обработка для загрузки данных.
-//
-Функция ОбработкаДляЗагрузкиДанных(Отказ, Знач УзелИнформационнойБазы, Знач ИмяФайлаСообщенияОбмена) Экспорт
-
- // ИНИЦИАЛИЗАЦИЯ ОБРАБОТКИ ДЛЯ ЗАГРУЗКИ ДАННЫХ
- МенеджерОбработки = Обработки.КонвертацияОбъектовИнформационныхБаз;
-
- Если ОбщегоНазначения.ПодсистемаСуществует("ОбменДаннымиXDTO") Тогда
-
- МодульОбменДаннымиXDTOПовтИсп = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиXDTOПовтИсп");
- МодульОбменДаннымиXDTOСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиXDTOСервер");
-
- Если МодульОбменДаннымиXDTOПовтИсп.ЭтоПланОбменаXDTO(УзелИнформационнойБазы) Тогда
- МенеджерОбработки = МодульОбменДаннымиXDTOСервер.ОбработкаКонвертацииДанныхДляУниверсальногоОбмена();
- КонецЕсли;
-
- КонецЕсли;
-
- ОбработкаОбменаДанными = МенеджерОбработки.Создать();
-
- ОбработкаОбменаДанными.РежимОбмена = "Загрузка";
-
- ОбработкаОбменаДанными.ВыводВОкноСообщенийИнформационныхСообщений = Ложь;
- ОбработкаОбменаДанными.ВыводВПротоколИнформационныхСообщений = Ложь;
- ОбработкаОбменаДанными.ДописыватьДанныеВПротоколОбмена = Ложь;
- ОбработкаОбменаДанными.ВыгружатьТолькоРазрешенные = Ложь;
- ОбработкаОбменаДанными.ПродолжитьПриОшибке = Ложь;
-
- ОбработкаОбменаДанными.ИмяФайлаПротоколаОбмена = "";
-
- ОбработкаОбменаДанными.КлючСообщенияЖурналаРегистрации = ПолучитьКлючСообщенияЖурналаРегистрации(УзелИнформационнойБазы, Перечисления.ДействияПриОбмене.ЗагрузкаДанных);
-
- ОбработкаОбменаДанными.УзелОбменаЗагрузкаДанных = УзелИнформационнойБазы;
- ОбработкаОбменаДанными.ИмяФайлаОбмена = ИмяФайлаСообщенияОбмена;
-
- ОбработкаОбменаДанными.КоличествоОбъектовНаТранзакцию = КоличествоЭлементовВТранзакцииЗагрузкиДанных();
-
- ИмяПланаОбмена = ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелИнформационнойБазы);
-
- Если ОбработкаОбменаДанными.Метаданные().Реквизиты.Найти("ОтладкаОбработчиковЗагрузки") <> Неопределено Тогда
- УстановитьНастройкиОтладкиЗагрузкиДляПравилОбмена(ОбработкаОбменаДанными, ИмяПланаОбмена);
- КонецЕсли;
-
- Возврат ОбработкаОбменаДанными;
-КонецФункции
-
// Работа с паролями синхронизации данных.
// Возвращает значения пароля синхронизации данных для заданного узла.
@@ -9642,16 +9665,10 @@
СтруктураНастроекОбмена.УзелИнформационнойБазыКод = СтруктураСвойств.Код;
СтруктураНастроекОбмена.УзелИнформационнойБазыНаименование = СтруктураСвойств.Наименование;
- //
СтруктураНастроекОбмена.НастройкиТранспорта = РегистрыСведений.НастройкиТранспортаОбмена.НастройкиТранспорта(СтруктураНастроекОбмена.УзелИнформационнойБазы);
Если КоличествоЭлементовВТранзакции = Неопределено Тогда
-
- КоличествоЭлементовВТранзакции = ?(СтруктураНастроекОбмена.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ЗагрузкаДанных,
- СтруктураНастроекОбмена.НастройкиТранспорта.КоличествоЭлементовВТранзакцииЗагрузкиДанных,
- СтруктураНастроекОбмена.НастройкиТранспорта.КоличествоЭлементовВТранзакцииВыгрузкиДанных);
- //
-
+ КоличествоЭлементовВТранзакции = КоличествоЭлементовВТранзакцииВыполняемогоДействия(ДействиеПриОбмене);
КонецЕсли;
СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции = КоличествоЭлементовВТранзакции;
@@ -9731,6 +9748,14 @@
Возврат СтруктураНастроекОбмена;
КонецФункции
+// Для внутреннего использования.
+//
+Функция СтруктураНастроекОбменаДляСеансаИнтерактивнойЗагрузки(Знач УзелИнформационнойБазы, Знач ИмяФайлаСообщенияОбмена) Экспорт
+
+ Возврат ОбменДаннымиПовтИсп.СтруктураНастроекОбменаДляСеансаИнтерактивнойЗагрузки(УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена);
+
+КонецФункции
+
// Получает структуру настроек транспорта для выполнения обмена данными.
//
Функция ПолучитьСтруктуруНастроекТранспорта(УзелИнформационнойБазы, ВидТранспортаСообщенийОбмена) Экспорт
@@ -9860,9 +9885,7 @@
КонецЕсли;
- СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции = ?(СтруктураНастроекОбмена.ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ЗагрузкаДанных,
- СтруктураНастроекОбмена.НастройкиТранспорта.КоличествоЭлементовВТранзакцииЗагрузкиДанных,
- СтруктураНастроекОбмена.НастройкиТранспорта.КоличествоЭлементовВТранзакцииВыгрузкиДанных);
+ СтруктураНастроекОбмена.КоличествоЭлементовВТранзакции = КоличествоЭлементовВТранзакцииВыполняемогоДействия(СтруктураНастроекОбмена.ДействиеПриОбмене);
Если СтруктураНастроекОбмена.НастройкиТранспорта.Свойство("WSИспользоватьПередачуБольшогоОбъемаДанных") Тогда
СтруктураНастроекОбмена.ИспользоватьПередачуБольшогоОбъемаДанных = СтруктураНастроекОбмена.НастройкиТранспорта.WSИспользоватьПередачуБольшогоОбъемаДанных;
@@ -10148,18 +10171,9 @@
//
Функция ПолучитьОбработкуОбменаДаннымиДляВыгрузки(СтруктураНастроекОбмена)
- МенеджерОбработки = Обработки.КонвертацияОбъектовИнформационныхБаз;
-
- Если ОбщегоНазначения.ПодсистемаСуществует("ОбменДаннымиXDTO") Тогда
-
- МодульОбменДаннымиXDTOПовтИсп = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиXDTOПовтИсп");
- МодульОбменДаннымиXDTOСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиXDTOСервер");
-
- Если МодульОбменДаннымиXDTOПовтИсп.ЭтоПланОбменаXDTO(СтруктураНастроекОбмена.УзелИнформационнойБазы) Тогда
- МенеджерОбработки = МодульОбменДаннымиXDTOСервер.ОбработкаКонвертацииДанныхДляУниверсальногоОбмена();
- КонецЕсли;
-
- КонецЕсли;
+ МенеджерОбработки = ?(ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(СтруктураНастроекОбмена.УзелИнформационнойБазы),
+ Обработки.КонвертацияОбъектовXDTO,
+ Обработки.КонвертацияОбъектовИнформационныхБаз);
ОбработкаОбменаДанными = МенеджерОбработки.Создать();
@@ -10189,18 +10203,9 @@
//
Функция ПолучитьОбработкуОбменаДаннымиДляЗагрузки(СтруктураНастроекОбмена)
- МенеджерОбработки = Обработки.КонвертацияОбъектовИнформационныхБаз;
-
- Если ОбщегоНазначения.ПодсистемаСуществует("ОбменДаннымиXDTO") Тогда
-
- МодульОбменДаннымиXDTOПовтИсп = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиXDTOПовтИсп");
- МодульОбменДаннымиXDTOСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиXDTOСервер");
-
- Если МодульОбменДаннымиXDTOПовтИсп.ЭтоПланОбменаXDTO(СтруктураНастроекОбмена.УзелИнформационнойБазы) Тогда
- МенеджерОбработки = МодульОбменДаннымиXDTOСервер.ОбработкаКонвертацииДанныхДляУниверсальногоОбмена();
- КонецЕсли;
-
- КонецЕсли;
+ МенеджерОбработки = ?(ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(СтруктураНастроекОбмена.УзелИнформационнойБазы),
+ Обработки.КонвертацияОбъектовXDTO,
+ Обработки.КонвертацияОбъектовИнформационныхБаз);
ОбработкаОбменаДанными = МенеджерОбработки.Создать();
diff --git a/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl
index 904a84af2..7ffca53b0 100644
--- a/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl
+++ b/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl
@@ -427,19 +427,9 @@
// Для данных, выгружаемых по ссылке, дополнительно заносим сведения в фильтр разрешенных к выгрузке объектов.
// Это нужно для того, чтобы данные прошли фильтр при выгрузке и были выгружены в сообщение обмена.
- СтандартнаяОбработка = Истина;
- Если ОбщегоНазначения.ПодсистемаСуществует("ОбменДаннымиXDTO") Тогда
-
- МодульОбменДаннымиXDTOПовтИсп = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиXDTOПовтИсп");
- МодульОбменДаннымиXDTOСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиXDTOСервер");
-
- Если МодульОбменДаннымиXDTOПовтИсп.ЭтоПланОбменаXDTO(Получатель) Тогда
- МодульОбменДаннымиXDTOСервер.ДобавитьОбъектВФильтрРазрешенныхОбъектов(Данные.Ссылка, Получатель);
- СтандартнаяОбработка = Ложь;
- КонецЕсли;
- КонецЕсли;
-
- Если СтандартнаяОбработка Тогда
+ Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(Получатель) Тогда
+ ОбменДаннымиXDTOСервер.ДобавитьОбъектВФильтрРазрешенныхОбъектов(Данные.Ссылка, Получатель);
+ Иначе
РегистрыСведений.СоответствияОбъектовИнформационныхБаз.ДобавитьОбъектВФильтрРазрешенныхОбъектов(Данные.Ссылка, Получатель);
КонецЕсли;
@@ -1426,20 +1416,10 @@
МассивУзлов = Новый Массив;
- СтандартнаяОбработка = Истина;
- Если ОбщегоНазначения.ПодсистемаСуществует("ОбменДаннымиXDTO") Тогда
-
- МодульОбменДаннымиXDTOПовтИсп = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиXDTOПовтИсп");
- МодульОбменДаннымиXDTOСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиXDTOСервер");
-
- Если МодульОбменДаннымиXDTOПовтИсп.ЭтоПланОбменаXDTO(ИмяПланаОбмена) Тогда
- СтандартнаяОбработка = Ложь;
- МассивУзлов = МодульОбменДаннымиXDTOСервер.МассивУзловДляРегистрацииВыгружатьПриНеобходимости(
- Ссылка, ИмяПланаОбмена, ИмяРеквизитаФлага);
- КонецЕсли;
- КонецЕсли;
-
- Если СтандартнаяОбработка Тогда
+ Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(ИмяПланаОбмена) Тогда
+ МассивУзлов = ОбменДаннымиXDTOСервер.МассивУзловДляРегистрацииВыгружатьПриНеобходимости(
+ Ссылка, ИмяПланаОбмена, ИмяРеквизитаФлага);
+ Иначе
ТекстЗапроса = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
@@ -2077,6 +2057,10 @@
Результат = Последовательности[ОбъектМетаданных.Имя].СоздатьНаборЗаписей();
+ ИначеЕсли ИмяБазовогоТипа = ОбщегоНазначения.ИмяТипаПерерасчеты() Тогда
+
+ Результат = РегистрыРасчета[ОбъектМетаданных.Родитель().Имя].Перерасчеты[ОбъектМетаданных.Имя].СоздатьНаборЗаписей();
+
Иначе
СтрокаСообщения = НСтр("ru = 'Для объекта метаданных %1 не предусмотрено набора записей.'");
diff --git a/SSL/src/CommonModules/ОбменСообщениями/Module.bsl b/SSL/src/CommonModules/ОбменСообщениями/Module.bsl
index 9e9dbcbb2..17e85d83b 100644
--- a/SSL/src/CommonModules/ОбменСообщениями/Module.bsl
+++ b/SSL/src/CommonModules/ОбменСообщениями/Module.bsl
@@ -411,6 +411,22 @@
КонецПроцедуры
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.Справочники.СообщенияСистемы.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
diff --git a/SSL/src/CommonModules/ОбменСообщениямиВнутренний/Module.bsl b/SSL/src/CommonModules/ОбменСообщениямиВнутренний/Module.bsl
index eccf9acf5..5775fe9ae 100644
--- a/SSL/src/CommonModules/ОбменСообщениямиВнутренний/Module.bsl
+++ b/SSL/src/CommonModules/ОбменСообщениямиВнутренний/Module.bsl
@@ -410,232 +410,249 @@
// Только для внутреннего использования.
Процедура ОбработатьОчередьСообщенийСистемы(Отбор = Неопределено) Экспорт
-
- УстановитьПривилегированныйРежим(Истина);
-
- Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда
-
- ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЭтойПодсистемы(),
- УровеньЖурналаРегистрации.Информация,,,
- НСтр("ru = 'Обработка очереди сообщений системы запущена из сеанса с установленными
+
+ УстановитьПривилегированныйРежим(Истина);
+
+ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда
+
+ ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЭтойПодсистемы(),
+ УровеньЖурналаРегистрации.Информация,,,
+ НСтр("ru = 'Обработка очереди сообщений системы запущена из сеанса с установленными
|значениями разделителей. Обработка будет производиться только для сообщений,
|сохраненных в разделенном справочнике, в элементах со значениями разделителей,
- |совпадающих со значениями разделителей сеанса.'")
- );
-
- ОбрабатыватьСообщенияВНеразделенныхДанных = Ложь;
-
- Иначе
-
- ОбрабатыватьСообщенияВНеразделенныхДанных = Истина;
-
- КонецЕсли;
-
- МодульРаботаВМоделиСервиса = Неопределено;
- Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда
- МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
- КонецЕсли;
-
- ОбработчикиСообщений = ОбработчикиСообщений();
-
- ТекстЗапроса = "";
- СправочникиСообщений = ОбменСообщениямиПовтИсп.ПолучитьСправочникиСообщений();
- Для Каждого СправочникСообщений Из СправочникиСообщений Цикл
-
- ПолноеИмяСправочника = СправочникСообщений.ПустаяСсылка().Метаданные().ПолноеИмя();
- ЭтоНеразделенныйСправочник = Не ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() ИЛИ
- Не ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(ПолноеИмяСправочника, ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных());
-
- Если ЭтоНеразделенныйСправочник И Не ОбрабатыватьСообщенияВНеразделенныхДанных Тогда
- Продолжить;
- КонецЕсли;
-
- Если Не ПустаяСтрока(ТекстЗапроса) Тогда
-
- ТекстЗапроса = ТекстЗапроса + "
- |
- |ОБЪЕДИНИТЬ ВСЕ
- |"
-
- КонецЕсли;
-
- Подзапрос = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- "ВЫБРАТЬ
- | ТаблицаСообщений.ОбластьДанныхВспомогательныеДанные КАК ОбластьДанных,
- | ТаблицаСообщений.Ссылка КАК Ссылка,
- | ТаблицаСообщений.Код КАК Код,
- | ТаблицаСообщений.Отправитель.Заблокирована КАК КонечнаяТочкаЗаблокирована
- |ИЗ
- | %1 КАК ТаблицаСообщений
- |ГДЕ
- | ТаблицаСообщений.Получатель = &Получатель
- | И (НЕ ТаблицаСообщений.Заблокировано)
- | [Отбор]"
- , ПолноеИмяСправочника);
-
- Если ЭтоНеразделенныйСправочник Тогда
- Подзапрос = СтрЗаменить(Подзапрос, "ТаблицаСообщений.ОбластьДанныхВспомогательныеДанные КАК ОбластьДанных", "-1 КАК ОбластьДанных");
- КонецЕсли;
-
- ТекстЗапроса = ТекстЗапроса + Подзапрос;
-
- КонецЦикла;
-
- СтрокаОтбора = ?(Отбор = Неопределено, "", "И ТаблицаСообщений.Ссылка В(&Отбор)");
-
- ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[Отбор]", СтрокаОтбора);
-
- ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 100
- | ВложенныйЗапрос.ОбластьДанных,
- | ВложенныйЗапрос.Ссылка,
- | ВложенныйЗапрос.Код,
- | ВложенныйЗапрос.КонечнаяТочкаЗаблокирована
- |ИЗ
- | (" + ТекстЗапроса + ") КАК ВложенныйЗапрос
- |
- |УПОРЯДОЧИТЬ ПО
- | Код";
-
- Запрос = Новый Запрос;
- Запрос.УстановитьПараметр("Получатель", ЭтотУзел());
- Запрос.УстановитьПараметр("Отбор", Отбор);
- Запрос.Текст = ТекстЗапроса;
-
- РезультатЗапроса = ОбщегоНазначения.ВыполнитьЗапросВнеТранзакции(Запрос);
-
- Выборка = РезультатЗапроса.Выбрать();
-
- Пока Выборка.Следующий() Цикл
-
- Попытка
- ЗаблокироватьДанныеДляРедактирования(Выборка.Ссылка);
- Исключение
- Продолжить; // переходим дальше
- КонецПопытки;
-
- // Проверка блокировки области.
- Если МодульРаботаВМоделиСервиса <> Неопределено
- И Выборка.ОбластьДанных <> -1
- И МодульРаботаВМоделиСервиса.ОбластьДанныхЗаблокирована(Выборка.ОбластьДанных) Тогда
-
- // Область заблокирована, перейти к следующей записи.
- Продолжить;
- КонецЕсли;
-
- Попытка
-
- НачатьТранзакцию();
- Попытка
- ОбъектСообщения = Выборка.Ссылка.ПолучитьОбъект();
- ЗафиксироватьТранзакцию();
- Исключение
- ОтменитьТранзакцию();
- ВызватьИсключение;
- КонецПопытки;
-
- ЗаголовокСообщения = Новый Структура("КаналСообщений, Отправитель", ОбъектСообщения.Наименование, ОбъектСообщения.Отправитель);
-
- НайденныеСтроки = ОбработчикиСообщений.НайтиСтроки(Новый Структура("Канал", ЗаголовокСообщения.КаналСообщений));
-
- СообщениеОбработано = Истина;
-
- // Обрабатываем сообщение
- Попытка
-
- Если Выборка.КонечнаяТочкаЗаблокирована Тогда
- ОбъектСообщения.Заблокировано = Истина;
- ВызватьИсключение НСтр("ru = 'Попытка обработки сообщения, полученного от заблокированной конечной точки.'");
- КонецЕсли;
-
- Если НайденныеСтроки.Количество() = 0 Тогда
- ОбъектСообщения.Заблокировано = Истина;
- ВызватьИсключение НСтр("ru = 'Не назначен обработчик для сообщения.'");
- КонецЕсли;
-
- Для Каждого СтрокаТаблицы Из НайденныеСтроки Цикл
-
- СтрокаТаблицы.Обработчик.ОбработатьСообщение(ЗаголовокСообщения.КаналСообщений, ОбъектСообщения.ТелоСообщения.Получить(), ЗаголовокСообщения.Отправитель);
-
- Если ТранзакцияАктивна() Тогда
- Пока ТранзакцияАктивна() Цикл
- ОтменитьТранзакцию();
- КонецЦикла;
- ОбъектСообщения.Заблокировано = Истина;
- ВызватьИсключение НСтр("ru = 'В обработчике сообщения не была зафиксирована транзакция.'");
- КонецЕсли;
-
- КонецЦикла;
- Исключение
-
- Пока ТранзакцияАктивна() Цикл
- ОтменитьТранзакцию();
- КонецЦикла;
-
- СообщениеОбработано = Ложь;
-
- ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
- ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЭтойПодсистемы(),
- УровеньЖурналаРегистрации.Ошибка,,,
- СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Ошибка обработки сообщения %1: %2'"),
- ЗаголовокСообщения.КаналСообщений, ПодробноеПредставлениеОшибки));
- КонецПопытки;
-
- Если СообщениеОбработано Тогда
-
- // Удаляем сообщение
- Если ЗначениеЗаполнено(ОбъектСообщения.Отправитель)
- И ОбъектСообщения.Отправитель <> ЭтотУзел() Тогда
-
- ОбъектСообщения.ОбменДанными.Получатели.Добавить(ОбъектСообщения.Отправитель);
- ОбъектСообщения.ОбменДанными.Получатели.АвтоЗаполнение = Ложь;
-
- КонецЕсли;
-
- // Наличие ссылок на справочник не должно препятствовать или замедлять удаление элементов справочника.
- ОбъектСообщения.ОбменДанными.Загрузка = Истина;
- ОбщегоНазначения.УдалитьВспомогательныеДанные(ОбъектСообщения);
+ |совпадающих со значениями разделителей сеанса.'"));
+
+ ОбрабатыватьСообщенияВНеразделенныхДанных = Ложь;
+
+ Иначе
+
+ ОбрабатыватьСообщенияВНеразделенныхДанных = Истина;
+
+ КонецЕсли;
+
+ МодульРаботаВМоделиСервиса = Неопределено;
+ Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда
+ МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
+ КонецЕсли;
+
+ ОбработчикиСообщений = ОбработчикиСообщений();
+
+ ТекстЗапроса = "";
+ СправочникиСообщений = ОбменСообщениямиПовтИсп.ПолучитьСправочникиСообщений();
+ Для Каждого СправочникСообщений Из СправочникиСообщений Цикл
+
+ ПолноеИмяСправочника = СправочникСообщений.ПустаяСсылка().Метаданные().ПолноеИмя();
+ ЭтоНеразделенныйСправочник = Не ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация()
+ ИЛИ Не ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(ПолноеИмяСправочника, ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных());
+
+ Если ЭтоНеразделенныйСправочник И Не ОбрабатыватьСообщенияВНеразделенныхДанных Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Если Не ПустаяСтрока(ТекстЗапроса) Тогда
+
+ ТекстЗапроса = ТекстЗапроса + "
+ |
+ |ОБЪЕДИНИТЬ ВСЕ
+ |"
+
+ КонецЕсли;
+
+ Подзапрос = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ "ВЫБРАТЬ
+ | ТаблицаСообщений.ОбластьДанныхВспомогательныеДанные КАК ОбластьДанных,
+ | ТаблицаСообщений.Ссылка КАК Ссылка,
+ | ТаблицаСообщений.Код КАК Код,
+ | ТаблицаСообщений.Отправитель.Заблокирована КАК КонечнаяТочкаЗаблокирована
+ |ИЗ
+ | %1 КАК ТаблицаСообщений
+ |ГДЕ
+ | ТаблицаСообщений.Получатель = &Получатель
+ | И (НЕ ТаблицаСообщений.Заблокировано)
+ | [Отбор]"
+ , ПолноеИмяСправочника);
+
+ Если ЭтоНеразделенныйСправочник Тогда
+ Подзапрос = СтрЗаменить(Подзапрос, "ТаблицаСообщений.ОбластьДанныхВспомогательныеДанные КАК ОбластьДанных", "-1 КАК ОбластьДанных");
+ КонецЕсли;
+
+ ТекстЗапроса = ТекстЗапроса + Подзапрос;
+
+ КонецЦикла;
+
+ СтрокаОтбора = ?(Отбор = Неопределено, "", "И ТаблицаСообщений.Ссылка В(&Отбор)");
+
+ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[Отбор]", СтрокаОтбора);
+
+ ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 100
+ | ВложенныйЗапрос.ОбластьДанных,
+ | ВложенныйЗапрос.Ссылка,
+ | ВложенныйЗапрос.Код,
+ | ВложенныйЗапрос.КонечнаяТочкаЗаблокирована
+ |ИЗ
+ | (" + ТекстЗапроса + ") КАК ВложенныйЗапрос
+ |
+ |УПОРЯДОЧИТЬ ПО
+ | Код";
+
+ Запрос = Новый Запрос;
+ Запрос.УстановитьПараметр("Получатель", ЭтотУзел());
+ Запрос.УстановитьПараметр("Отбор", Отбор);
+ Запрос.Текст = ТекстЗапроса;
+
+ РезультатЗапроса = ОбщегоНазначения.ВыполнитьЗапросВнеТранзакции(Запрос);
+
+ Выборка = РезультатЗапроса.Выбрать();
+
+ Пока Выборка.Следующий() Цикл
+
+ Попытка
+ ЗаблокироватьДанныеДляРедактирования(Выборка.Ссылка);
+ Исключение
+ Продолжить; // переходим дальше
+ КонецПопытки;
+
+ // Проверка блокировки области.
+ Если МодульРаботаВМоделиСервиса <> Неопределено
+ И Выборка.ОбластьДанных <> -1
+ И МодульРаботаВМоделиСервиса.ОбластьДанныхЗаблокирована(Выборка.ОбластьДанных) Тогда
+
+ // Область заблокирована, перейти к следующей записи.
+ РазблокироватьДанныеДляРедактирования(Выборка.Ссылка);
+ Продолжить;
+ КонецЕсли;
+
+ Попытка
+
+ НачатьТранзакцию();
+ Попытка
+ ОбъектСообщения = Выборка.Ссылка.ПолучитьОбъект();
+ СчетчикПопыток = ОбъектСообщения.КоличествоПопытокОбработкиСообщения + 1;
+ Если СчетчикПопыток > 3 Тогда
+ Если НЕ ЗначениеЗаполнено(ОбъектСообщения.ПодробноеПредставлениеОшибки) Тогда
+ ОбъектСообщения.ПодробноеПредставлениеОшибки = НСтр("ru = 'Исчерпано количество попыток обработки сообщения.'");
+ КонецЕсли;
+ ОбъектСообщения.Заблокировано = Истина;
+ Иначе
+ ОбъектСообщения.КоличествоПопытокОбработкиСообщения = СчетчикПопыток;
+ КонецЕсли;
+ ОбщегоНазначения.ЗаписатьВспомогательныеДанные(ОбъектСообщения);
+ ОбъектСообщения.Прочитать();
+ ЗафиксироватьТранзакцию();
+ Исключение
+ ОтменитьТранзакцию();
+ ВызватьИсключение;
+ КонецПопытки;
+
+ Если ОбъектСообщения.Заблокировано Тогда
+ РазблокироватьДанныеДляРедактирования(Выборка.Ссылка);
+
+ ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЭтойПодсистемы(),
+ УровеньЖурналаРегистрации.Ошибка,,,
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Исчерпано количество попыток обработки сообщения %1'"),
+ ОбъектСообщения.Наименование));
+
+ Продолжить;
+ КонецЕсли;
+
+ ЗаголовокСообщения = Новый Структура("КаналСообщений, Отправитель", ОбъектСообщения.Наименование, ОбъектСообщения.Отправитель);
+
+ НайденныеСтроки = ОбработчикиСообщений.НайтиСтроки(Новый Структура("Канал", ЗаголовокСообщения.КаналСообщений));
+
+ СообщениеОбработано = Истина;
+
+ // Обрабатываем сообщение
+ Попытка
+
+ Если Выборка.КонечнаяТочкаЗаблокирована Тогда
+ ОбъектСообщения.Заблокировано = Истина;
+ ВызватьИсключение НСтр("ru = 'Попытка обработки сообщения, полученного от заблокированной конечной точки.'");
+ КонецЕсли;
+
+ Если НайденныеСтроки.Количество() = 0 Тогда
+ ОбъектСообщения.Заблокировано = Истина;
+ ВызватьИсключение НСтр("ru = 'Не назначен обработчик для сообщения.'");
+ КонецЕсли;
+
+ Для Каждого СтрокаТаблицы Из НайденныеСтроки Цикл
+
+ СтрокаТаблицы.Обработчик.ОбработатьСообщение(ЗаголовокСообщения.КаналСообщений, ОбъектСообщения.ТелоСообщения.Получить(), ЗаголовокСообщения.Отправитель);
+
+ Если ТранзакцияАктивна() Тогда
+ Пока ТранзакцияАктивна() Цикл
+ ОтменитьТранзакцию();
+ КонецЦикла;
+ ОбъектСообщения.Заблокировано = Истина;
+ ВызватьИсключение НСтр("ru = 'В обработчике сообщения не была зафиксирована транзакция.'");
+ КонецЕсли;
+
+ КонецЦикла;
+ Исключение
+
+ Пока ТранзакцияАктивна() Цикл
+ ОтменитьТранзакцию();
+ КонецЦикла;
+
+ СообщениеОбработано = Ложь;
+
+ ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
+ ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЭтойПодсистемы(),
+ УровеньЖурналаРегистрации.Ошибка,,,
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Ошибка обработки сообщения %1: %2'"),
+ ЗаголовокСообщения.КаналСообщений, ПодробноеПредставлениеОшибки));
+ КонецПопытки;
+
+ Если СообщениеОбработано Тогда
+
+ // Удаляем сообщение
+ Если ЗначениеЗаполнено(ОбъектСообщения.Отправитель)
+ И ОбъектСообщения.Отправитель <> ЭтотУзел() Тогда
+
+ ОбъектСообщения.ОбменДанными.Получатели.Добавить(ОбъектСообщения.Отправитель);
+ ОбъектСообщения.ОбменДанными.Получатели.АвтоЗаполнение = Ложь;
+
+ КонецЕсли;
+
+ // Наличие ссылок на справочник не должно препятствовать или замедлять удаление элементов справочника.
+ ОбъектСообщения.ОбменДанными.Загрузка = Истина;
+ ОбщегоНазначения.УдалитьВспомогательныеДанные(ОбъектСообщения);
Иначе
- ОбъектСообщения.КоличествоПопытокОбработкиСообщения = ОбъектСообщения.КоличествоПопытокОбработкиСообщения + 1;
ОбъектСообщения.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки;
-
- Если ОбъектСообщения.КоличествоПопытокОбработкиСообщения >= 3 Тогда
- ОбъектСообщения.Заблокировано = Истина;
- КонецЕсли;
-
ОбщегоНазначения.ЗаписатьВспомогательныеДанные(ОбъектСообщения);
-
- КонецЕсли;
-
- Если ОбрабатыватьСообщенияВНеразделенныхДанных И ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда
-
- ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'После обработки сообщения канала %1 не было выключено разделение сеанса!'"),
- ЗаголовокСообщения.КаналСообщений);
-
- ЗаписьЖурналаРегистрации(
- СобытиеЖурналаРегистрацииЭтойПодсистемы(),
- УровеньЖурналаРегистрации.Ошибка,
- ,
- ,
- ТекстСообщенияОбОшибке);
-
- ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь);
-
- КонецЕсли;
-
- Исключение
- ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЭтойПодсистемы(),
- УровеньЖурналаРегистрации.Ошибка,,,
- ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
- КонецПопытки;
-
- РазблокироватьДанныеДляРедактирования(Выборка.Ссылка);
-
- КонецЦикла;
-
+
+ КонецЕсли;
+
+ Если ОбрабатыватьСообщенияВНеразделенныхДанных И ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда
+
+ ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'После обработки сообщения канала %1 не было выключено разделение сеанса!'"),
+ ЗаголовокСообщения.КаналСообщений);
+
+ ЗаписьЖурналаРегистрации(
+ СобытиеЖурналаРегистрацииЭтойПодсистемы(),
+ УровеньЖурналаРегистрации.Ошибка,
+ ,
+ ,
+ ТекстСообщенияОбОшибке);
+
+ ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь);
+
+ КонецЕсли;
+
+ Исключение
+ ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЭтойПодсистемы(),
+ УровеньЖурналаРегистрации.Ошибка,,,
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+ КонецПопытки;
+
+ РазблокироватьДанныеДляРедактирования(Выборка.Ссылка);
+
+ КонецЦикла;
+
КонецПроцедуры
// Только для внутреннего использования.
diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl
index c934d9935..3ab8a27c4 100644
--- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl
+++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl
@@ -138,8 +138,7 @@
Параметры.Вставить("ОперативноеОбновление", ОперативноеОбновление);
Параметры.Вставить("ВФоне", Ложь);
- Возврат ОбновлениеИнформационнойБазыСлужебный.ВыполнитьИтерациюОбновления(ИтерацияОбновления,
- ХодВыполненияОбработчиков, ОперативноеОбновление);
+ Возврат ОбновлениеИнформационнойБазыСлужебный.ВыполнитьИтерациюОбновления(ИтерацияОбновления, Параметры);
КонецФункции
diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl
index 89903c62d..d3efe4a84 100644
--- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl
+++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl
@@ -28,7 +28,7 @@
Процедура ПриДобавленииПодсистемы(Описание) Экспорт
Описание.Имя = "СтандартныеПодсистемы";
- Описание.Версия = "2.2.4.45";
+ Описание.Версия = "2.2.5.34";
КонецПроцедуры
diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl
index 0a6d56934..91a8c29bb 100644
--- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl
@@ -1781,7 +1781,8 @@
МодульДатыЗапретаИзмененияСлужебный.ПропуститьПроверкуЗапретаИзменения(Истина);
КонецЕсли;
- Если Не ВыполнитьОтложенныйОбработчикОбновления(СведенияОбОбновлении) Тогда
+ Если Не ВыполнитьОтложенныйОбработчикОбновления(СведенияОбОбновлении)
+ Или ВыполненыВсеОтложенныеОбработчики(СведенияОбОбновлении) Тогда
ОтключитьОтложенноеОбновление();
КонецЕсли;
@@ -3126,6 +3127,37 @@
КонецПроцедуры
+// Только для внутреннего использования.
+//
+Функция ВыполненыВсеОтложенныеОбработчики(СведенияОбОбновлении)
+
+ ВыполненоОбработчиков = 0;
+ ВсегоОбработчиков = 0;
+ Для Каждого СтрокаДереваБиблиотека Из СведенияОбОбновлении.ДеревоОбработчиков.Строки Цикл
+ Для Каждого СтрокаДереваВерсия Из СтрокаДереваБиблиотека.Строки Цикл
+ ВсегоОбработчиков = ВсегоОбработчиков + СтрокаДереваВерсия.Строки.Количество();
+ Для Каждого Обработчик Из СтрокаДереваВерсия.Строки Цикл
+
+ Если Обработчик.Статус = "Выполнено" Тогда
+ ВыполненоОбработчиков = ВыполненоОбработчиков + 1;
+ КонецЕсли;
+
+ КонецЦикла;
+ КонецЦикла;
+ КонецЦикла;
+
+ Если ВсегоОбработчиков = ВыполненоОбработчиков Тогда
+ СведенияОбОбновлении.ВремяОкончаниеОтложенногоОбновления = ТекущаяДатаСеанса();
+ СведенияОбОбновлении.ОтложенноеОбновлениеЗавершеноУспешно = Истина;
+ ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении);
+
+ Возврат Истина;
+ Иначе
+ Возврат Ложь;
+ КонецЕсли;
+
+КонецФункции
+
// Только для внутреннего использования.
//
Функция ВыполнитьОтложенныйОбработчикОбновления(СведенияОбОбновлении, ВыполнитьНеудачные = Ложь)
@@ -3237,10 +3269,6 @@
Прервать;
КонецЦикла;
- Если Не ОбработчикиВыполнялись И ЕстьНеудачные И Не ВыполнитьНеудачные Тогда
- Возврат ВыполнитьОтложенныйОбработчикОбновления(СведенияОбОбновлении, Истина);
- КонецЕсли;
-
Если ЕстьНеудачные Или ОбработчикиВыполнялись Тогда
Прервать;
Иначе
@@ -3255,16 +3283,20 @@
КонецЦикла;
+ Если Не ОбработчикиВыполнялись И ЕстьНеудачные И Не ВыполнитьНеудачные Тогда
+ Возврат ВыполнитьОтложенныйОбработчикОбновления(СведенияОбОбновлении, Истина);
+ КонецЕсли;
+
Если ЕстьНеудачные Или ОбработчикиВыполнялись Тогда
Прервать;
Иначе
Если ЕстьПропущенныеОбработчики Тогда
- ДеревоОбработчиковБиблиотека.Статус = "ЕстьПропущенныеОбработчики";
- Прервать;
+ ДеревоОбработчиковВерсия.Статус = "ЕстьПропущенныеОбработчики";
+ Иначе
+ ДеревоОбработчиковВерсия.Статус = "Завершено";
КонецЕсли;
- ДеревоОбработчиковБиблиотека.Статус = "Завершено";
КонецЕсли;
КонецЦикла;
diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl
index f81e0f73f..2a5db7494 100644
--- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl
+++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl
@@ -374,6 +374,11 @@
// возможной конкуренции при доступе к таблицам объектов метаданных, разделенных
// в режиме "Независимо и совместно" (что будет менее эффективно, нежели в
// выполнение в монопольном режиме).
+ СтрокаСообщения = НСтр("ru = 'Не удалось установить монопольный режим. Описание ошибки: %1'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка());
+ СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+
+ ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(),
+ УровеньЖурналаРегистрации.Предупреждение, , , СтрокаСообщения);
КонецПопытки;
КонецЕсли;
diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl
index aa4c468ab..648519125 100644
--- a/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl
+++ b/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl
@@ -172,33 +172,49 @@
// Строка - короткое имя конфигурации.
Функция КороткоеИмяКонфигурации(СтруктураНастройки)
- Значение = ОбновлениеКонфигурацииПереопределяемый.КороткоеИмяКонфигурации();
- Если Не ЗначениеЗаполнено(Значение) Тогда
- Значение = "";
- КонецЕсли;
- ОбновлениеКонфигурацииПереопределяемый.ПриОпределенииКраткогоИмениКонфигурации(Значение);
-
- Значение = Значение + "/";
-
- // Определение редакции конфигурации.
- ПодстрокиВерсии = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Метаданные.Версия, ".");
- Если ПодстрокиВерсии.Количество() > 1 Тогда
- Значение = Значение + ПодстрокиВерсии[0] + ПодстрокиВерсии[1] + "/";
- КонецЕсли;
- // Определение версии платформы.
- ИнформацияСистемная = Новый СистемнаяИнформация;
- ПодстрокиВерсии = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИнформацияСистемная.ВерсияПриложения, ".");
- Значение = Значение + ПодстрокиВерсии[0] + ПодстрокиВерсии[1] + "/";
-
+ // Значение задано в инструменте разработчика
Если СтруктураНастройки <> Неопределено Тогда // Значение из настроек пользователя.
ИспользоватьЗначениеНастройки = Ложь;
СтруктураНастройки.Свойство("ИспользоватьЗначениеНастройкиКороткоеИмяКонфигурации", ИспользоватьЗначениеНастройки);
Если ИспользоватьЗначениеНастройки = Истина Тогда
- Значение = СтруктураНастройки.КороткоеИмяКонфигурации;
+ Возврат СтруктураНастройки.КороткоеИмяКонфигурации;
КонецЕсли;
КонецЕсли;
- Возврат Значение;
+ // Определение короткого имени
+ КороткоеИмя = ОбновлениеКонфигурацииПереопределяемый.КороткоеИмяКонфигурации();
+ Если Не ЗначениеЗаполнено(КороткоеИмя) Тогда
+ КороткоеИмя = "";
+ КонецЕсли;
+ ОбновлениеКонфигурацииПереопределяемый.ПриОпределенииКраткогоИмениКонфигурации(КороткоеИмя);
+ КороткоеИмя = КороткоеИмя + "/";
+
+ // Определение редакции конфигурации.
+ НомерРедакции = "";
+ ПодстрокиВерсии = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Метаданные.Версия, ".");
+ Если ПодстрокиВерсии.Количество() > 1 Тогда
+ НомерРедакции = ПодстрокиВерсии[0] + ПодстрокиВерсии[1] + "/";
+ КонецЕсли;
+
+ // Определение версии платформы.
+ ИнформацияСистемная = Новый СистемнаяИнформация;
+ ПодстрокиВерсии = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИнформацияСистемная.ВерсияПриложения, ".");
+ ВерсияПлатформы = ПодстрокиВерсии[0] + ПодстрокиВерсии[1] + "/";
+
+ // Определение группы версий
+ ГруппаВерсий = "";
+ ОбновлениеКонфигурацииПереопределяемый.ПриОпределенииГруппыВерсий(ГруппаВерсий);
+ Если Не ПустаяСтрока(ГруппаВерсий) Тогда
+ ГруппаВерсий = Строка(ГруппаВерсий) + "/";
+ КонецЕсли;
+
+ ШаблонИмени = "[КороткоеИмя][НомерРедакции][ВерсияПлатформы][ГруппаВерсий]";
+ КороткоеИмяКонфигурации = СтрЗаменить(ШаблонИмени, "[КороткоеИмя]", КороткоеИмя);
+ КороткоеИмяКонфигурации = СтрЗаменить(КороткоеИмяКонфигурации, "[НомерРедакции]", НомерРедакции);
+ КороткоеИмяКонфигурации = СтрЗаменить(КороткоеИмяКонфигурации, "[ВерсияПлатформы]", ВерсияПлатформы);
+ КороткоеИмяКонфигурации = СтрЗаменить(КороткоеИмяКонфигурации, "[ГруппаВерсий]", ГруппаВерсий);
+
+ Возврат КороткоеИмяКонфигурации;
КонецФункции
diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl
index ca287347f..834e3b497 100644
--- a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl
+++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl
@@ -124,7 +124,7 @@
ВременныйФайл = ПараметрыОбновления.КаталогФайловОбновления + ПараметрыОбновления.ИмяФайлаПроверкиНаличияОбновления;
// При необходимости, создаем каталог для временного файла.
- КаталогВременногоФайла = ПолучитьКаталогФайла(ВременныйФайл);
+ КаталогВременногоФайла = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ВременныйФайл).Путь;
КаталогВременногоФайлаОбъект = Новый Файл(КаталогВременногоФайла);
Если НЕ КаталогВременногоФайлаОбъект.Существует() Тогда
Попытка
@@ -187,11 +187,11 @@
Если НЕ Файл.Существует() Тогда
Возврат НСтр("ru = 'Файл описания обновлений не получен'");
КонецЕсли;
- ТД = Новый ТекстовыйДокумент();
- ТД.Прочитать(Файл.ПолноеИмя);
+ ТекстовыйДокумент = Новый ТекстовыйДокумент();
+ ТекстовыйДокумент.Прочитать(Файл.ПолноеИмя);
ПараметрыКомплекта = Новый Структура();
- Для Н = 1 По ТД.КоличествоСтрок() Цикл
- ВременнаяСтрока = НРег(СокрЛП(ТД.ПолучитьСтроку(Н)));
+ Для НомерСтроки = 1 По ТекстовыйДокумент.КоличествоСтрок() Цикл
+ ВременнаяСтрока = НРег(СокрЛП(ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки)));
Если ПустаяСтрока(ВременнаяСтрока) Тогда
Продолжить;
КонецЕсли;
@@ -252,16 +252,15 @@
СтруктураПараметров.Вставить("ДатаВремяОбновленияУстановлена" , Ложь);
// Интернет
- СтруктураПараметров.Вставить("ИмяZipФайлаСпискаШаблонов" , "v8upd11.zip");
- СтруктураПараметров.Вставить("ИмяФайлаСпискаШаблонов" , "v8cscdsc.xml");
- СтруктураПараметров.Вставить("ИмяФайлаОписанияОбновления" , "news.htm");
- СтруктураПараметров.Вставить("ИмяФайлаПорядкаОбновления" , "update.htm");
+ СтруктураПараметров.Вставить("ИмяZipФайлаСпискаШаблонов" , "v8upd11.zip");
+ СтруктураПараметров.Вставить("ИмяФайлаСпискаШаблонов" , "v8cscdsc.xml");
+ СтруктураПараметров.Вставить("ИмяФайлаОписанияОбновления", "news.htm");
+ СтруктураПараметров.Вставить("ИмяФайлаПорядкаОбновления" , "update.htm");
// Имена служебных файлов
- СтруктураПараметров.Вставить("ИмяИсполняемогоФайлаКонфигуратора", "1cv8.exe");
- СтруктураПараметров.Вставить("ИмяИсполняемогоФайлаКлиента", СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИмяИсполняемогоФайлаКлиента);
-
- СтруктураПараметров.Вставить("СобытиеЖурналаРегистрации" , НСтр("ru = 'Обновление информационной базы'"));
+ СтруктураПараметров.Вставить("ИмяИсполняемогоФайлаКонфигуратора", СтандартныеПодсистемыКлиент.ИмяИсполняемогоФайлаПриложения(Истина));
+ СтруктураПараметров.Вставить("ИмяИсполняемогоФайлаКлиента" , СтандартныеПодсистемыКлиент.ИмяИсполняемогоФайлаПриложения());
+ СтруктураПараметров.Вставить("СобытиеЖурналаРегистрации" , СобытиеЖурналаРегистрации());
// Определение каталога временных файлов.
СтруктураПараметров.Вставить("КаталогФайловОбновления" , КаталогLocalAppData() + "1C\1Cv8Update\");
@@ -620,9 +619,10 @@
// Функция, открывает интерактивно адрес в сети Интернет.
//
-//Параметры :
-// АдресСтраницы - строка, путь к странице в сети Интернет, которую надо открыть.
-// Заголовок - строка, заголовок окна "браузера".
+// Параметры:
+// АдресСтраницы - строка, путь к странице в сети Интернет, которую надо открыть.
+// Заголовок - строка, заголовок окна "браузера".
+//
Процедура ОткрытьВебСтраницу(Знач АдресСтраницы, Знач Заголовок = "") Экспорт
ОткрытьФорму("Обработка.ОбновлениеКонфигурации.Форма.Обозреватель",
diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПереопределяемый/Module.bsl
index b4d3dbbcc..25dbdf275 100644
--- a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПереопределяемый/Module.bsl
+++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПереопределяемый/Module.bsl
@@ -34,7 +34,7 @@
// предлагается самостоятельно устранить причины, после чего
// повторить попытку обновления.
//
-// Параметры
+// Параметры:
// КонфигурацияГотоваКОбновлению - Булево - признак готовности ИБ к проведению обновления.
//
// Пример реализации:
diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентСервер/Module.bsl
index fa841f444..2de638819 100644
--- a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентСервер/Module.bsl
+++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентСервер/Module.bsl
@@ -41,7 +41,7 @@
Результат.Вставить("ПарольСервераОбновлений", "");
Результат.Вставить("ЗапомнитьПарольСервераОбновлений", Истина);
Результат.Вставить("ПроверятьНаличиеОбновленияПриЗапуске", Ложь);
- Результат.Вставить("ИсточникОбновления", 2);
+ Результат.Вставить("ИсточникОбновления", 0);
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Результат.Вставить("РежимОбновления", ?(ОбщегоНазначения.ИнформационнаяБазаФайловая(), 0, 2));
Результат.Вставить("ДатаВремяОбновления", ДобавитьДни(НачалоДня(ТекущаяДатаСеанса()), 1));
diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииПереопределяемый/Module.bsl
index 32343bc19..702c6215c 100644
--- a/SSL/src/CommonModules/ОбновлениеКонфигурацииПереопределяемый/Module.bsl
+++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииПереопределяемый/Module.bsl
@@ -75,4 +75,14 @@
КонецПроцедуры
+// Определяет группу версий конфигурации. Для каждой конфигурации возможно сквозное
+// (без разрыва цепочки и необходимости запуска) обновление в пределах одной группы.
+//
+// Параметры:
+// ГруппаВерсий - Число - Группа версий конфигурации.
+//
+Процедура ПриОпределенииГруппыВерсий(ГруппаВерсий) Экспорт
+
+КонецПроцедуры
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl
index f057227b3..570ff1d66 100644
--- a/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl
+++ b/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl
@@ -439,8 +439,11 @@
ДлиннаяТранзакция = Истина;
Если Параметры <> Неопределено Тогда
- ЗначениеПараметра = Неопределено;
+ ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(
+ "ОбщегоНазначения.ЗаменитьСсылки", "Параметры", Параметры, Тип("Структура"));
+
+ ЗначениеПараметра = Неопределено;
Если Параметры.Свойство("СпособУдаления", ЗначениеПараметра) Тогда
Если ЗначениеПараметра = "Непосредственно" Тогда
ПараметрыЗамены.УдалятьНепосредственно = Истина;
@@ -448,31 +451,37 @@
ИначеЕсли ЗначениеПараметра = "Пометка" Тогда
ПараметрыЗамены.УдалятьНепосредственно = Ложь;
ПараметрыЗамены.ПомечатьНаУдаление = Истина;
+ Иначе
+ ТекстОшибки = НСтр("ru = 'Недопустимое значение параметра %1 в %2.
+ |Ожидалось: %3 или %4; передано значение: %5 (тип %6).'");
+ ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки,
+ "Параметры.СпособУдаления",
+ "ОбщегоНазначения.ЗаменитьСсылки",
+ "Непосредственно",
+ "Пометка",
+ ?(ЗначениеПараметра <> Неопределено, ЗначениеПараметра, "Неопределено"),
+ ТипЗнч(ЗначениеПараметра));
+ ВызватьИсключение ТекстОшибки;
КонецЕсли;
КонецЕсли;
+
Если Параметры.Свойство("ВключатьБизнесЛогику", ЗначениеПараметра) Тогда
- Если ЗначениеПараметра = Истина Тогда
- ПараметрыЗамены.КонтрольПриЗаписи = Истина;
- ИначеЕсли ЗначениеПараметра = Ложь Тогда
- ПараметрыЗамены.КонтрольПриЗаписи = Ложь;
- КонецЕсли;
+ ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(
+ "ОбщегоНазначения.ЗаменитьСсылки", "Параметры.КонтрольПриЗаписи", ЗначениеПараметра, Тип("Булево"));
+ ПараметрыЗамены.КонтрольПриЗаписи = ЗначениеПараметра;
КонецЕсли;
Если Параметры.Свойство("ЗаменаПарыВТранзакции", ЗначениеПараметра) Тогда
- Если ЗначениеПараметра = Истина Тогда
- ДлиннаяТранзакция = Истина;
- ИначеЕсли ЗначениеПараметра = Ложь Тогда
- ДлиннаяТранзакция = Ложь;
- КонецЕсли;
+ ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(
+ "ОбщегоНазначения.ЗаменитьСсылки", "Параметры.ЗаменаПарыВТранзакции", ЗначениеПараметра, Тип("Булево"));
+ ДлиннаяТранзакция = ЗначениеПараметра;
КонецЕсли;
Если Параметры.Свойство("ПривилегированнаяЗапись", ЗначениеПараметра) Тогда
- Если ЗначениеПараметра = Истина Тогда
- ПараметрыЗамены.ПривилегированнаяЗапись = Истина;
- ИначеЕсли ЗначениеПараметра = Ложь Тогда
- ПараметрыЗамены.ПривилегированнаяЗапись = Ложь;
- КонецЕсли;
+ ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(
+ "ОбщегоНазначения.ЗаменитьСсылки", "Параметры.ПривилегированнаяЗапись", ЗначениеПараметра, Тип("Булево"));
+ ПараметрыЗамены.ПривилегированнаяЗапись = ЗначениеПараметра;
КонецЕсли;
КонецЕсли;
@@ -492,32 +501,6 @@
Возврат РезультатЗамены;
КонецЕсли;
- Если ПараметрыЗамены.КонтрольПриЗаписи И ПодсистемаСуществует("СтандартныеПодсистемы.ПоискИУдалениеДублей") Тогда
- МодульПоискИУдалениеДублей = ОбщийМодуль("ПоискИУдалениеДублей");
- Ошибки = МодульПоискИУдалениеДублей.ПроверитьВозможностьЗаменыЭлементов(ПарыЗамен, Параметры);
- Если Ошибки.Количество() > 0 Тогда
- Для Каждого КлючЗначение Из Ошибки Цикл
- Что = КлючЗначение.Ключ;
- НаЧто = ПарыЗамен[Что];
- ТекстОшибки = КлючЗначение.Значение;
- Причина = ОписаниеОшибкиЗамены("ОшибкаЗаписи", НаЧто, ПредметСтрокой(НаЧто), ТекстОшибки);
- ДобавитьРезультатЗамены(РезультатЗамены, Что, Причина);
- КонецЦикла;
- Для Каждого КлючЗначение Из ПарыЗамен Цикл
- Если Ошибки[КлючЗначение.Ключ] = Неопределено Тогда
- Что = КлючЗначение.Ключ;
- НаЧто = КлючЗначение.Значение;
- ТекстОшибки = НСтр("ru = 'Замена не была выполнена из-за предыдущих проблем.'");
- Причина = ОписаниеОшибкиЗамены("ОшибкаЗаписи", НаЧто, ПредметСтрокой(НаЧто), ТекстОшибки);
- ДобавитьРезультатЗамены(РезультатЗамены, Что, Причина);
- КонецЕсли;
- КонецЦикла;
- Возврат РезультатЗамены;
- КонецЕсли;
- КонецЕсли;
-
- КэшМетаданных = Новый Соответствие;
-
СписокСсылок = Новый Массив;
Для Каждого КлючЗначение Из ПарыЗамен Цикл
ТекущаяСсылка = КлючЗначение.Ключ;
@@ -531,6 +514,23 @@
СписокСсылок.Добавить(ТекущаяСсылка);
КонецЦикла;
+ Если ПараметрыЗамены.КонтрольПриЗаписи И ПодсистемаСуществует("СтандартныеПодсистемы.ПоискИУдалениеДублей") Тогда
+ МодульПоискИУдалениеДублей = ОбщийМодуль("ПоискИУдалениеДублей");
+ Ошибки = МодульПоискИУдалениеДублей.ПроверитьВозможностьЗаменыЭлементов(ПарыЗамен, Параметры);
+ Для Каждого КлючЗначение Из Ошибки Цикл
+ Что = КлючЗначение.Ключ;
+ НаЧто = ПарыЗамен[Что];
+ ТекстОшибки = КлючЗначение.Значение;
+ Причина = ОписаниеОшибкиЗамены("ОшибкаЗаписи", НаЧто, ПредметСтрокой(НаЧто), ТекстОшибки);
+ ДобавитьРезультатЗамены(РезультатЗамены, Что, Причина);
+
+ Индекс = СписокСсылок.Найти(Что);
+ Если Индекс <> Неопределено Тогда
+ СписокСсылок.Удалить(Индекс); // пропускаем проблемный элемент
+ КонецЕсли;
+ КонецЦикла;
+ КонецЕсли;
+
ТаблицаПоиска = МестаИспользования(СписокСсылок);
// Для каждой ссылки объекта будем производить замены в порядке "Константа", "Объект", "Набор".
@@ -546,6 +546,7 @@
Конфигурация.Вставить("ТипВсеСсылки", ОписаниеТипаВсеСсылки() );
Конфигурация.Вставить("МетаКонстанты", Метаданные.Константы);
Конфигурация.Вставить("ТипКлючЗаписи", ОписаниеТипаКлючиЗаписей() );
+ Конфигурация.Вставить("МетаПоследовательности", Метаданные.Последовательности);
// Определяем порядок обработки и проверяем то, что мы можем обработать.
ПроизводимыеЗамены = Новый Массив;
@@ -942,31 +943,31 @@
// XML - текст в формате XML или ЧтениеXML.
//
// Схема XML:
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
-//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
//
-//
+//
//
// Примеры XML-файлов см. в демонстрационной конфигурации.
//
// Пример использования:
-// КлассификаторТаблица = ПрочитатьXMLВТаблицу(РегистрыСведений.АдресныйКлассификатор.
-// ПолучитьМакет("КлассификаторАдресныхОбъектовРоссии").ПолучитьТекст());
+// КлассификаторТаблица = ПрочитатьXMLВТаблицу(
+// Справочники.Валюты.ПолучитьМакет("ОбщероссийскийКлассификаторВалют").ПолучитьТекст()).Данные;
//
// Возвращаемое значение:
// Структура - с полями
@@ -1589,7 +1590,7 @@
КонецЕсли;
Индекс = МассивПараметровДляОчистки.Найти("ПараметрыКлиентаНаСервере");
- Если Индекс > 0 Тогда
+ Если Индекс <> Неопределено Тогда
МассивПараметровДляОчистки.Удалить(Индекс);
КонецЕсли;
@@ -1710,6 +1711,25 @@
//
Функция ОбъектXDTOВСтрокуXML(Знач ОбъектXDTO, Знач Фабрика = Неопределено) Экспорт
+ Если ОбщегоНазначенияКлиентСервер.РежимОтладки() Тогда
+ ОбъектXDTO.Проверить();
+ Иначе
+ ИнформацияОбОшибке = Неопределено;
+ Попытка
+ ОбъектXDTO.Проверить();
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ КонецПопытки;
+ Если ИнформацияОбОшибке <> Неопределено Тогда
+ ЗаписьЖурналаРегистрации(
+ НСтр("ru = 'Стандартные подсистемы'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка,
+ ,
+ ,
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
+ КонецЕсли;
+ КонецЕсли;
+
Если Фабрика = Неопределено Тогда
Фабрика = ФабрикаXDTO;
КонецЕсли;
@@ -1933,6 +1953,7 @@
ОбщиеПараметры.Вставить("РаботаВПрограммеЗапрещена", Ложь); // Блокировать запуск, если версия ниже минимальной.
ОбщиеПараметры.Вставить("ЗапрашиватьПодтверждениеПриЗавершенииПрограммы", Истина);
ОбщиеПараметры.Вставить("ОтключитьСправочникИдентификаторыОбъектовМетаданных", Ложь);
+ ОбщиеПараметры.Вставить("РекомендуемыйОбъемОперативнойПамяти", 2);
ОбщегоНазначенияПереопределяемый.ПриОпределенииОбщихПараметровБазовойФункциональности(ОбщиеПараметры);
@@ -2130,6 +2151,77 @@
КонецФункции
+// Функция склоняет переданную фразу.
+// Только для работы на ОС Windows.
+//
+// Параметры:
+// ФИО - Строка - фамилия, имя и отчество в именительном падеже,
+// которые необходимо просклонять.
+// Падеж - Число - падеж, в который необходимо поставить ФИО:
+// 1 - Именительный
+// 2 - Родительный
+// 3 - Дательный
+// 4 - Винительный
+// 5 - Творительный
+// 6 - Предложный
+// Результат - Строка - в этот параметр помещается результат склонения.
+// Если ФИО не удалось просклонять, то возвращается значение ФИО.
+// Пол - Число - пол физического лица, 1 - мужской, 2 - женский.
+//
+// Возвращаемое значение:
+// Булево - Истина, если ФИО удалось просклонять.
+//
+Функция Просклонять(Знач ФИО, Падеж, Результат, Пол = Неопределено) Экспорт
+
+ ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаСклоненияФИО", "Decl");
+ Компонента = Новый("AddIn.Decl.CNameDecl");
+
+ Результат = "";
+
+ МассивСтрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ФИО, " ");
+
+ // Выделим первые 3 слова, так как компонента не умеет склонять фразу большую 3х символов.
+ НомерНесклоняемогоСимвола = 4;
+ Для Номер = 1 По Мин(МассивСтрок.Количество(), 3) Цикл
+ Если Не ФизическиеЛицаКлиентСервер.ФИОНаписаноВерно(МассивСтрок[Номер-1], Истина) Тогда
+ НомерНесклоняемогоСимвола = Номер;
+ Прервать;
+ КонецЕсли;
+
+ Результат = Результат + ?(Номер > 1, " ", "") + МассивСтрок[Номер-1];
+ КонецЦикла;
+
+ Если ПустаяСтрока(Результат) Тогда
+ Результат = ФИО;
+ Возврат Ложь;
+ КонецЕсли;
+
+ Попытка
+ Если Пол = Неопределено Тогда
+ Результат = Компонента.Просклонять(Результат, Падеж) + " ";
+
+ Иначе
+ Результат = Компонента.Просклонять(Результат, Падеж, Пол) + " ";
+
+ КонецЕсли;
+
+ Исключение
+ Результат = ФИО;
+ Возврат Ложь;
+
+ КонецПопытки;
+
+ // Остальные символы добавим без склонения.
+ Для Номер = НомерНесклоняемогоСимвола По МассивСтрок.Количество() Цикл
+ Результат = Результат + " " + МассивСтрок[Номер-1];
+ КонецЦикла;
+
+ Результат = СокрЛП(Результат);
+
+ Возврат Истина;
+
+КонецФункции
+
////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции для работы с формами.
@@ -2419,6 +2511,10 @@
ИначеЕсли Метаданные.РегламентныеЗадания.Содержит(ОбъектМетаданных) Тогда
Возврат ИмяТипаРегламентныеЗадания();
+ ИначеЕсли Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных.Родитель())
+ И ОбъектМетаданных.Родитель().Перерасчеты.Найти(ОбъектМетаданных.Имя) = ОбъектМетаданных Тогда
+ Возврат ИмяТипаПерерасчеты();
+
Иначе
Возврат "";
@@ -3851,6 +3947,17 @@
КонецФункции
+// Возвращает значение для идентификации общего типа "Перерасчеты".
+//
+// Возвращаемое значение:
+// Строка.
+//
+Функция ИмяТипаПерерасчеты() Экспорт
+
+ Возврат "Перерасчеты";
+
+КонецФункции
+
////////////////////////////////////////////////////////////////////////////////
// Сохранение, чтение и удаление настроек из хранилищ.
@@ -5010,7 +5117,12 @@
ДанныеWSDL.Записать(ИмяФайлаWSDL);
- Определения = Новый WSОпределения(ИмяФайлаWSDL);
+ ИнтернетПрокси = Неопределено;
+ Если ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда
+ МодульПолучениеФайловИзИнтернетаКлиентСервер = ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиентСервер");
+ ИнтернетПрокси = МодульПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси(АдресWSDL);
+ КонецЕсли;
+ Определения = Новый WSОпределения(ИмяФайлаWSDL, ИмяПользователя, Пароль, ИнтернетПрокси, Таймаут);
Попытка
УдалитьФайлы(ИмяФайлаWSDL);
@@ -5217,8 +5329,13 @@
ВызватьИсключение(НСтр("ru = 'Ошибка получения файла описания web-сервиса:'") + Символы.ПС + ОписаниеФайла.СообщениеОбОшибке)
КонецЕсли;
- // Попробуем создать WS определения на основе полученного файла.
- Определения = Новый WSОпределения(ОписаниеФайла.Путь);
+ ИнтернетПрокси = Неопределено;
+ Если ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда
+ МодульПолучениеФайловИзИнтернетаКлиентСервер = ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиентСервер");
+ ИнтернетПрокси = МодульПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси(Адрес);
+ КонецЕсли;
+ Определения = Новый WSОпределения(ОписаниеФайла.Путь, ИмяПользователя, Пароль, ИнтернетПрокси, Таймаут);
+
Если Определения.Сервисы.Количество() = 0 Тогда
ШаблонСообщения = НСтр("ru = 'Ошибка получения файла описания web-сервиса:
|В полученном файле не содержится ни одного описания сервиса.
@@ -5550,6 +5667,7 @@
ТипКлючЗаписи = Конфигурация.ТипКлючЗаписи;
МетаКонстанты = Конфигурация.МетаКонстанты;
+ МетаПоследовательности = Конфигурация.МетаПоследовательности;
ТипВсеСсылки = Конфигурация.ТипВсеСсылки;
ТипКлючЗаписей = Конфигурация.ТипКлючЗаписи;
@@ -5571,6 +5689,10 @@
МестоИспользования.КлючЗамены = "Константа";
МестоИспользования.ЦелеваяСсылка = ЦелеваяСсылка;
+ ИначеЕсли МетаПоследовательности.Содержит(МетаданныеМеста) Тогда
+ МестоИспользования.КлючЗамены = "Последовательность";
+ МестоИспользования.ЦелеваяСсылка = ЦелеваяСсылка;
+
Иначе
ТипДанных = ТипЗнч(МестоИспользования.Данные);
Если ТипВсеСсылки.СодержитТип(ТипДанных) Тогда
@@ -5856,7 +5978,8 @@
ПредставлениеДанных = Строка(Данные);
// Будем производить сразу все замены для этих данных.
- Фильтр = Новый Структура("Данные, КлючЗамены", Данные, "КлючЗаписи");
+ Фильтр = Новый Структура("Данные, КлючЗамены");
+ ЗаполнитьЗначенияСвойств(Фильтр, МестоИспользования);
ОбрабатываемыеСтроки = МестоИспользования.Владелец().НайтиСтроки(Фильтр);
ОписаниеНабора = ОписаниеКлючаЗаписи(Мета);
@@ -5903,7 +6026,7 @@
Если СостояниеОперации = "" Тогда
НаборЗаписей.Прочитать();
- ЗаменитьВКоллекцииСтрок(НаборЗаписей, ОписаниеНабора.СписокПолей, ПарыЗамен);
+ ЗаменитьВКоллекцииСтрок("НаборЗаписей", "НаборЗаписей", НаборЗаписей, НаборЗаписей, ОписаниеНабора.СписокПолей, ПарыЗамен);
Если НаборЗаписей.Модифицированность() Тогда
// Пытаемся сохранить
@@ -6000,37 +6123,63 @@
Имя = КлючЗначение.Ключ;
ЦелеваяСсылка = ПарыЗамен[ Объект[Имя] ];
Если ЦелеваяСсылка <> Неопределено Тогда
+ ЗарегистрироватьФактЗамены(Объект, Объект[Имя], ЦелеваяСсылка, "Реквизиты", Имя);
Объект[Имя] = ЦелеваяСсылка;
КонецЕсли;
КонецЦикла;
-
+
// Стандартные реквизиты
Для Каждого КлючЗначение Из Описание.СтандартныеРеквизиты Цикл
Имя = КлючЗначение.Ключ;
ЦелеваяСсылка = ПарыЗамен[ Объект[Имя] ];
Если ЦелеваяСсылка <> Неопределено Тогда
+ ЗарегистрироватьФактЗамены(Объект, Объект[Имя], ЦелеваяСсылка, "Реквизиты", Имя);
Объект[Имя] = ЦелеваяСсылка;
КонецЕсли;
КонецЦикла;
// Табличные части
Для Каждого Элемент Из Описание.ТабличныеЧасти Цикл
- ЗаменитьВКоллекцииСтрок(Объект[Элемент.Имя], Элемент.СписокПолей, ПарыЗамен);
+ ЗаменитьВКоллекцииСтрок(
+ "ТабличныеЧасти",
+ Элемент.Имя,
+ Объект,
+ Объект[Элемент.Имя],
+ Элемент.СписокПолей,
+ ПарыЗамен);
КонецЦикла;
// Стандартные табличные части.
Для Каждого Элемент Из Описание.СтандартныеТабличныеЧасти Цикл
- ЗаменитьВКоллекцииСтрок(Объект[Элемент.Имя], Элемент.СписокПолей, ПарыЗамен);
+ ЗаменитьВКоллекцииСтрок(
+ "СтандартныеТабличныеЧасти",
+ Элемент.Имя,
+ Объект,
+ Объект[Элемент.Имя],
+ Элемент.СписокПолей,
+ ПарыЗамен);
КонецЦикла;
// Движения
Для Каждого ОписаниеДвижения Из ОписаниеДвижений Цикл
- ЗаменитьВКоллекцииСтрок(ОписаниеДвижения.НаборЗаписей, ОписаниеДвижения.СписокПолей, ПарыЗамен);
+ ЗаменитьВКоллекцииСтрок(
+ "Движения",
+ ОписаниеДвижения.ПространствоБлокировки,
+ ОписаниеДвижения.НаборЗаписей,
+ ОписаниеДвижения.НаборЗаписей,
+ ОписаниеДвижения.СписокПолей,
+ ПарыЗамен);
КонецЦикла;
// Последовательности
Для Каждого ОписаниеПоследовательности Из ОписаниеПоследовательностей Цикл
- ЗаменитьВКоллекцииСтрок(ОписаниеПоследовательности.НаборЗаписей, ОписаниеПоследовательности.СписокПолей, ПарыЗамен);
+ ЗаменитьВКоллекцииСтрок(
+ "Последовательности",
+ ОписаниеПоследовательности.ПространствоБлокировки,
+ ОписаниеПоследовательности.НаборЗаписей,
+ ОписаниеПоследовательности.НаборЗаписей,
+ ОписаниеПоследовательности.СписокПолей,
+ ПарыЗамен);
КонецЦикла;
Для Каждого ОписаниеДвижения Из ОписаниеДвижений Цикл
@@ -6053,6 +6202,30 @@
Возврат Измененные;
КонецФункции
+Процедура ЗарегистрироватьФактЗамены(Объект, СсылкаДубля, СсылкаОригинала, ВидРеквизита, ИмяРеквизита, Индекс = Неопределено, ИмяКолонки = Неопределено)
+ Структура = Новый Структура("ДополнительныеСвойства");
+ ЗаполнитьЗначенияСвойств(Структура, Объект);
+ Если ТипЗнч(Структура.ДополнительныеСвойства) <> Тип("Структура") Тогда
+ Возврат;
+ КонецЕсли;
+ ДопСвойства = Объект.ДополнительныеСвойства;
+ ДопСвойства.Вставить("ЗаменаСсылок", Истина);
+ ВыполненныеЗамены = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ДопСвойства, "ВыполненныеЗамены");
+ Если ВыполненныеЗамены = Неопределено Тогда
+ ВыполненныеЗамены = Новый Массив;
+ ДопСвойства.Вставить("ВыполненныеЗамены", ВыполненныеЗамены);
+ КонецЕсли;
+ ОписаниеЗамены = Новый Структура;
+ ОписаниеЗамены.Вставить("СсылкаДубля", СсылкаДубля);
+ ОписаниеЗамены.Вставить("СсылкаОригинала", СсылкаОригинала);
+ ОписаниеЗамены.Вставить("ВидРеквизита", ВидРеквизита);
+ ОписаниеЗамены.Вставить("ИмяРеквизита", ИмяРеквизита);
+ ОписаниеЗамены.Вставить("Индекс", Индекс);
+ ОписаниеЗамены.Вставить("ИмяКолонки", ИмяКолонки);
+ ВыполненныеЗамены.Добавить(ОписаниеЗамены);
+КонецПроцедуры
+
+
Процедура УдалитьСсылкиПометкой(РезультатУдаления, Знач СписокСсылок, Знач ПараметрыЗаписи, Знач ВнутренняяТранзакция = Истина)
УдалитьСсылкиНемонопольно(РезультатУдаления, СписокСсылок, ПараметрыЗаписи, ВнутренняяТранзакция, Ложь);
@@ -6419,6 +6592,9 @@
ИначеЕсли Метаданные.РегистрыРасчета.Содержит(Мета) Тогда
НаборЗаписей = РегистрыРасчета[Мета.Имя].СоздатьНаборЗаписей();
+ ИначеЕсли Метаданные.Последовательности.Содержит(Мета) Тогда
+ НаборЗаписей = Последовательности[Мета.Имя].СоздатьНаборЗаписей();
+
Иначе
НаборЗаписей = Неопределено;
КонецЕсли;
@@ -6505,10 +6681,9 @@
КонецФункции
Процедура ДобавитьРезультатЗамены(Таблица, Знач Ссылка, Знач ОписаниеОшибки)
+
Строка = Таблица.Добавить();
-
Строка.Ссылка = Ссылка;
-
Строка.ПредставлениеОбъектаОшибки = ОписаниеОшибки.ПредставлениеОбъектаОшибки;
Строка.ОбъектОшибки = ОписаниеОшибки.ОбъектОшибки;
Строка.ТекстОшибки = ОписаниеОшибки.ТекстОшибки;
@@ -6527,7 +6702,7 @@
Возврат Результат;
КонецФункции
-Процедура ЗаменитьВКоллекцииСтрок(Коллекция, Знач СписокПолей, Знач ПарыЗамен)
+Процедура ЗаменитьВКоллекцииСтрок(ВидКоллекции, ИмяКоллекции, Объект, Коллекция, Знач СписокПолей, Знач ПарыЗамен)
РабочаяКоллекция = Коллекция.Выгрузить();
Модифицировано = Ложь;
@@ -6537,6 +6712,7 @@
Имя = КлючЗначение.Ключ;
ЦелеваяСсылка = ПарыЗамен[ Строка[Имя] ];
Если ЦелеваяСсылка <> Неопределено Тогда
+ ЗарегистрироватьФактЗамены(Объект, Строка[Имя], ЦелеваяСсылка, ВидКоллекции, ИмяКоллекции, РабочаяКоллекция.Индекс(Строка), Имя);
Строка[Имя] = ЦелеваяСсылка;
Модифицировано = Истина;
КонецЕсли;
@@ -6642,6 +6818,13 @@
КонецЦикла;
+ // Для последовательностей право "Изменение" может отсутствовать даже у роли "АдминистраторСистемы".
+ Если ЭтоПоследовательность(МетаданныеОбъекта)
+ И Не ПравоДоступа("Изменение", МетаданныеОбъекта)
+ И ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы().ЭтоАдминистраторПрограммы Тогда
+ УстановитьПривилегированныйРежим(Истина);
+ КонецЕсли;
+
// Просто запись
ОбработатьОбъектСПерехватомСообщений(Объект, "Запись", Неопределено, ПараметрыЗаписи);
КонецПроцедуры
@@ -6655,8 +6838,6 @@
Объект.ОбменДанными.Получатели.АвтоЗаполнение = Не ПараметрыЗаписи.НеПроверять;
КонецЕсли;
- Объект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", ПараметрыЗаписи.НеПроверять);
-
КонецПроцедуры
Функция СобытиеЖурналаРегистрацииЗаменыСсылок()
@@ -6692,6 +6873,12 @@
Для Каждого МестоИспользования Из МестаИспользования Цикл
ПроизвестиЗаменуВНаборе(РезультатЗамены, МестоИспользования, ПараметрыЗаписи);
КонецЦикла;
+
+ ФильтрСсылок.КлючЗамены = "Последовательность";
+ МестаИспользования = ТаблицаПоиска.НайтиСтроки(ФильтрСсылок);
+ Для Каждого МестоИспользования Из МестаИспользования Цикл
+ ПроизвестиЗаменуВНаборе(РезультатЗамены, МестоИспользования, ПараметрыЗаписи);
+ КонецЦикла;
КонецЦикла;
// Окончательные действия
@@ -6729,6 +6916,9 @@
МестаИспользованияНаборы = ТаблицаПоиска.НайтиСтроки(Новый Структура("Ссылка, КлючЗамены", Ссылка, "КлючЗаписи"));
ДобавитьОбъектыБлокировкиНаборы(Блокировка, МестаИспользованияНаборы);
+
+ МестаИспользованияПоследовательности = ТаблицаПоиска.НайтиСтроки(Новый Структура("Ссылка, КлючЗамены", Ссылка, "Последовательность"));
+ ДобавитьОбъектыБлокировкиПоследовательности(Блокировка, МестаИспользованияПоследовательности);
НачатьТранзакцию();
Попытка
@@ -6779,6 +6969,17 @@
СостояниеОперации = "ОшибкаЗаписи";
КонецЕсли;
+ Если КоличествоОшибок = РезультатЗамены.Количество() Тогда
+ Для Каждого МестоИспользования Из МестаИспользованияПоследовательности Цикл
+ ПроизвестиЗаменуВНаборе(РезультатЗамены, МестоИспользования, ПараметрыЗаписи, Ложь);
+ Если КоличествоОшибок <> РезультатЗамены.Количество() Тогда
+ Прервать;
+ КонецЕсли;
+ КонецЦикла;
+ Иначе
+ СостояниеОперации = "ОшибкаЗаписи";
+ КонецЕсли;
+
КонецЕсли;
// 3. Удаление
@@ -6835,33 +7036,12 @@
Для Каждого Элемент Из ОписаниеДвижений Цикл
// Все по регистратору
Блокировка.Добавить(Элемент.ПространствоБлокировки + ".НаборЗаписей").УстановитьЗначение("Регистратор", Данные);
-
- // Все кандидаты - измерения для сохранения итогов.
- Для Каждого КлючЗначение Из Элемент.СписокИзмерений Цикл
- ТипИзмерения = КлючЗначение.Значение;
- Для Каждого МестоИспользования Из СтрокиИспользования Цикл
- ТекущаяСсылка = МестоИспользования.Ссылка;
- Если ТипИзмерения.СодержитТип(ТипЗнч(ТекущаяСсылка)) Тогда
- Блокировка.Добавить(Элемент.ПространствоБлокировки).УстановитьЗначение(КлючЗначение.Ключ, МестоИспользования.Ссылка);
- КонецЕсли;
- КонецЦикла;
- КонецЦикла;
КонецЦикла;
// Последовательности
ОписаниеПоследовательностей = ОписаниеПоследовательностей(Мета);
Для Каждого Элемент Из ОписаниеПоследовательностей Цикл
Блокировка.Добавить(Элемент.ПространствоБлокировки).УстановитьЗначение("Регистратор", Данные);
-
- Для Каждого КлючЗначение Из Элемент.СписокИзмерений Цикл
- ТипИзмерения = КлючЗначение.Значение;
- Для Каждого МестоИспользования Из СтрокиИспользования Цикл
- ТекущаяСсылка = МестоИспользования.Ссылка;
- Если ТипИзмерения.СодержитТип(ТипЗнч(ТекущаяСсылка)) Тогда
- Блокировка.Добавить(Элемент.ПространствоБлокировки).УстановитьЗначение(КлючЗначение.Ключ, ТекущаяСсылка);
- КонецЕсли;
- КонецЦикла;
- КонецЦикла;
КонецЦикла;
КонецЦикла;
@@ -6896,6 +7076,31 @@
КонецПроцедуры
+Процедура ДобавитьОбъектыБлокировкиПоследовательности(Блокировка, Знач СтрокиИспользования)
+
+ Для Каждого МестоИспользования Из СтрокиИспользования Цикл
+ Данные = МестоИспользования.Данные;
+ Мета = МестоИспользования.Метаданные;
+
+ ОписаниеПоследовательностей = ОписаниеПоследовательностей(Мета);
+ Для Каждого Элемент Из ОписаниеПоследовательностей Цикл
+ Блокировка.Добавить(Элемент.ПространствоБлокировки).УстановитьЗначение("Регистратор", Данные);
+
+ Для Каждого КлючЗначение Из Элемент.СписокИзмерений Цикл
+ ТипИзмерения = КлючЗначение.Значение;
+ Для Каждого МестоИспользования Из СтрокиИспользования Цикл
+ ТекущаяСсылка = МестоИспользования.Ссылка;
+ Если ТипИзмерения.СодержитТип(ТипЗнч(ТекущаяСсылка)) Тогда
+ Блокировка.Добавить(Элемент.ПространствоБлокировки).УстановитьЗначение(КлючЗначение.Ключ, ТекущаяСсылка);
+ КонецЕсли;
+ КонецЦикла;
+ КонецЦикла;
+ КонецЦикла;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
Функция ВычислитьЗначениеДанныхПоПути(Знач Данные, Знач ПутьДанных)
ЧастиПути = СтрЗаменить(ПутьДанных, ".", Символы.ПС);
КоличествоЧастейПути = СтрЧислоСтрок(ЧастиПути);
diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl
index f6c6cb9ac..94ac9782a 100644
--- a/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl
+++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl
@@ -113,49 +113,23 @@
Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещенияОЗакрытии, ТекстПредложения = "",
ВозможноПродолжениеБезУстановки = Истина) Экспорт
- Оповещение = Новый ОписаниеОповещения("ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиЗавершение", ЭтотОбъект, ОписаниеОповещенияОЗакрытии);
+ ОписаниеОповещенияЗавершение = Новый ОписаниеОповещения("ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиЗавершение",
+ ЭтотОбъект, ОписаниеОповещенияОЗакрытии);
+
#Если Не ВебКлиент Тогда
// В тонком и толстом клиентах расширение подключено всегда.
- ВыполнитьОбработкуОповещения(Оповещение);
+ ВыполнитьОбработкуОповещения(ОписаниеОповещенияЗавершение, "ПодключениеНеТребуется");
Возврат;
#КонецЕсли
- // Если расширение и так уже подключено, незачем про него спрашивать.
- РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами();
- Если РасширениеПодключено Тогда
- ВыполнитьОбработкуОповещения(Оповещение);
- Возврат;
- КонецЕсли;
+ ДополнительныеПараметры = Новый Структура;
+ ДополнительныеПараметры.Вставить("ОписаниеОповещенияЗавершение", ОписаниеОповещенияЗавершение);
+ ДополнительныеПараметры.Вставить("ТекстПредложения", ТекстПредложения);
+ ДополнительныеПараметры.Вставить("ВозможноПродолжениеБезУстановки", ВозможноПродолжениеБезУстановки);
- // В веб клиенте под MacOS расширение не доступно.
- СистемнаяИнформация = Новый СистемнаяИнформация;
- ЭтоMacКлиент = (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86
- Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86_64);
- Если ЭтоMacКлиент Тогда
- ВыполнитьОбработкуОповещения(Оповещение);
- Возврат;
- КонецЕсли;
-
- ПервоеОбращениеЗаСеанс = ПараметрыПриложения["СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами"] = Неопределено;
-
- ИмяПараметра = "СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами";
- Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда
- ПараметрыПриложения.Вставить(ИмяПараметра, ПредлагатьУстановкуРасширенияРаботыСФайлами());
- КонецЕсли;
-
- Если ВозможноПродолжениеБезУстановки И Не ПараметрыПриложения["СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами"] Тогда
- ВыполнитьОбработкуОповещения(Оповещение);
- Возврат;
- КонецЕсли;
-
- Если НЕ ВозможноПродолжениеБезУстановки ИЛИ ПервоеОбращениеЗаСеанс Тогда
- ПараметрыФормы = Новый Структура;
- ПараметрыФормы.Вставить("ТекстПредложения", ТекстПредложения);
- ПараметрыФормы.Вставить("ВозможноПродолжениеБезУстановки", ВозможноПродолжениеБезУстановки);
- ОткрытьФорму("ОбщаяФорма.ВопросОбУстановкеРасширенияРаботыСФайлами", ПараметрыФормы,,,,,Оповещение);
- Иначе
- ВыполнитьОбработкуОповещения(Оповещение);
- КонецЕсли;
+ Оповещение = Новый ОписаниеОповещения("ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиПриУстановкеРасширения",
+ ЭтотОбъект, ДополнительныеПараметры);
+ НачатьПодключениеРасширенияРаботыСФайлами(Оповещение);
КонецПроцедуры
@@ -192,7 +166,7 @@
Параметры = Новый Структура("ОписаниеОповещенияОЗакрытии,ТекстПредупреждения",
ОписаниеОповещенияОЗакрытии, ТекстПредупреждения, );
- Оповещение = Новый ОписаниеОповещения("РасширениеРаботыСФайламиПодключеноЗавершение", ЭтотОбъект, Параметры);
+ Оповещение = Новый ОписаниеОповещения("ПроверитьРасширениеРаботыСФайламиПодключеноЗавершение", ЭтотОбъект, Параметры);
ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстПредложения);
КонецПроцедуры
@@ -230,6 +204,13 @@
Возврат;
КонецЕсли;
+ ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента();
+
+ Если ПараметрыРаботыКлиента.ЭтоБазоваяВерсияКонфигурации
+ Или ПараметрыРаботыКлиента.ЭтоУчебнаяПлатформа Тогда
+ Возврат;
+ КонецЕсли;
+
ТекстКоманды = "regsvr32.exe /n /i:user /s comcntr.dll";
КодВозврата = Неопределено;
@@ -377,6 +358,22 @@
КонецФункции
+// Выполняет переход по ссылке на объект информационной базы или внешний объект.
+// (например, ссылка на сайт или путь к папке).
+//
+// Параметры:
+// Ссылка - Строка - ссылка для перехода.
+//
+Процедура ПерейтиПоСсылке(Ссылка) Экспорт
+
+ #Если ТолстыйКлиентОбычноеПриложение Тогда
+ ЗапуститьПриложение(Ссылка);
+ #Иначе
+ ПерейтиПоНавигационнойСсылке(Ссылка);
+ #КонецЕсли
+
+КонецПроцедуры
+
////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции для обработки событий и вызова необязательных подсистем.
@@ -835,35 +832,70 @@
#Область СлужебныеПроцедурыИФункции
+Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиПриУстановкеРасширения(Подключено, ДополнительныеПараметры) Экспорт
+
+ // Если расширение и так уже подключено, незачем про него спрашивать.
+ Если Подключено Тогда
+ ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияЗавершение, "ПодключениеНеТребуется");
+ Возврат;
+ КонецЕсли;
+
+ // В веб клиенте под MacOS расширение не доступно.
+ СистемнаяИнформация = Новый СистемнаяИнформация;
+ ЭтоMacКлиент = (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86
+ Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.MacOS_x86_64);
+ Если ЭтоMacКлиент Тогда
+ ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияЗавершение);
+ Возврат;
+ КонецЕсли;
+
+ ИмяПараметра = "СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами";
+ ПервоеОбращениеЗаСеанс = ПараметрыПриложения[ИмяПараметра] = Неопределено;
+ Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда
+ ПараметрыПриложения.Вставить(ИмяПараметра, ПредлагатьУстановкуРасширенияРаботыСФайлами());
+ КонецЕсли;
+ ПредлагатьУстановкуРасширенияРаботыСФайлами = ПараметрыПриложения[ИмяПараметра] Или ПервоеОбращениеЗаСеанс;
+
+ Если ДополнительныеПараметры.ВозможноПродолжениеБезУстановки И Не ПредлагатьУстановкуРасширенияРаботыСФайлами Тогда
+ ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияЗавершение);
+ Возврат;
+ КонецЕсли;
+
+ ПараметрыФормы = Новый Структура;
+ ПараметрыФормы.Вставить("ТекстПредложения", ДополнительныеПараметры.ТекстПредложения);
+ ПараметрыФормы.Вставить("ВозможноПродолжениеБезУстановки", ДополнительныеПараметры.ВозможноПродолжениеБезУстановки);
+ ОткрытьФорму("ОбщаяФорма.ВопросОбУстановкеРасширенияРаботыСФайлами", ПараметрыФормы,,,,,ДополнительныеПараметры.ОписаниеОповещенияЗавершение);
+
+КонецПроцедуры
+
Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиЗавершение(Действие, ОповещениеОЗакрытии) Экспорт
+ РасширениеПодключено = (Действие = "РасширениеПодключено" Или Действие = "ПодключениеНеТребуется");
#Если ВебКлиент Тогда
- Если Действие = "БольшеНеПредлагать" Тогда
+ Если Действие = "БольшеНеПредлагать"
+ Или Действие = "РасширениеПодключено" Тогда
СистемнаяИнформация = Новый СистемнаяИнформация();
ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента;
ПараметрыПриложения["СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами"] = Ложь;
ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить(
- "НастройкиПрограммы/ПредлагатьУстановкуРасширенияРаботыСФайлами", ИдентификаторКлиента,
- ПараметрыПриложения["СтандартныеПодсистемы.ПредлагатьУстановкуРасширенияРаботыСФайлами"]);
+ "НастройкиПрограммы/ПредлагатьУстановкуРасширенияРаботыСФайлами", ИдентификаторКлиента, Ложь);
КонецЕсли;
#КонецЕсли
- ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, ПодключитьРасширениеРаботыСФайлами());
+ ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, РасширениеПодключено);
-КонецПроцедуры
+КонецПроцедуры
-Процедура РасширениеРаботыСФайламиПодключеноЗавершение(Действие, Параметры) Экспорт
+Процедура ПроверитьРасширениеРаботыСФайламиПодключеноЗавершение(РасширениеПодключено, ДополнительныеПараметры) Экспорт
- ТекстСообщения = "";
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
- ВыполнитьОбработкуОповещения(Параметры.ОписаниеОповещенияОЗакрытии);
+ Если РасширениеПодключено Тогда
+ ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗакрытии);
Возврат;
КонецЕсли;
- Если ПустаяСтрока(Параметры.ТекстПредупреждения) Тогда
+ ТекстСообщения = ДополнительныеПараметры.ТекстПредупреждения;
+ Если ПустаяСтрока(ТекстСообщения) Тогда
ТекстСообщения = НСтр("ru = 'Действие недоступно, так как не установлено расширение для веб-клиента 1С:Предприятие.'")
- Иначе
- ТекстСообщения = Параметры.ТекстПредупреждения;
КонецЕсли;
ПоказатьПредупреждение(, ТекстСообщения);
diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl
index 6810d1ee5..ffe1931b7 100644
--- a/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl
+++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl
@@ -2117,15 +2117,28 @@
// Добавить или заменить существующий элемент отбора динамического списка.
//
// Параметры:
-// ДинамическийСписок - ДинамическийСписок - реквизит формы, для которого требуется установить отбор.
-// ИмяПоля - Строка - имя поля компоновки данных (заполняется всегда).
-// ПравоеЗначение - произвольный - сравниваемое значение.
-// ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения.
-// Представление - Строка - представление элемента компоновки данных.
-// Использование - Булево - использование элемента.
-// РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - режим отображения.
-// ИдентификаторПользовательскойНастройки - Строка - см. ОтборКомпоновкиДанных.ИдентификаторПользовательскойНастройки
-// в синтакс-помощнике.
+// ДинамическийСписок - ДинамическийСписок - Список, в котором требуется установить отбор.
+// ИмяПоля - Строка - Поле, по которому необходимо установить отбор.
+// ПравоеЗначение - Произвольный - Значение отбора.
+// Необязательный. Значение по умолчанию: Неопределено.
+// Внимание! Если передать Неопределено, то значение не будет изменено.
+// ВидСравнения - ВидСравненияКомпоновкиДанных - Условие отбора.
+// Представление - Строка - Представление элемента компоновки данных.
+// Необязательный. Значение по умолчанию: Неопределено.
+// Если указано, то выводится только флажок использования с указанным представлением (значение не выводится).
+// Для очистки (чтобы значение снова выводилось) следует передать пустую строку.
+// Использование - Булево - Флажок использования этого отбора.
+// Необязательный. Значение по умолчанию: Неопределено.
+// РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - Способ отображения этого отбора
+// пользователю.
+// * РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ - В группе быстрых настроек над списком.
+// * РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный - В настройка списка (в подменю Еще).
+// * РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный - Запретить пользователю менять этот отбор.
+// ИдентификаторПользовательскойНастройки - Строка - Уникальный идентификатор этого отбора.
+// Используется для связи с пользовательскими настройками.
+//
+// См. также:
+// Одноименные свойства объекта "ЭлементОтбораКомпоновкиДанных" в синтакс-помощнике.
//
Процедура УстановитьЭлементОтбораДинамическогоСписка(ДинамическийСписок, ИмяПоля,
ПравоеЗначение = Неопределено,
@@ -2342,8 +2355,8 @@
//
// Получает ссылку предопределенного элемента по его полному имени.
-// Поддерживаются только те таблицы, которые могут содержать предопределенные элементы:
-// справочники, планы видов характеристик, планы счетов и планы видов расчета.
+// Предопределенные элементы могут содержаться только в следующих объектах:
+// справочники, планы видов характеристик, планы счетов и планы видов расчета.
//
// Параметры:
// ПолноеИмяПредопределенного - Строка - Полный путь к предопределенному элементу, включая его имя.
@@ -2354,8 +2367,8 @@
// "ПланВидовРасчета.Начисления.ОплатаПоОкладу"
//
// Возвращаемое значение:
-// ЛюбаяСсылка - Ссылка предопределенного элемента.
-// Неопределено - Если элемент не найден.
+// ЛюбаяСсылка - ссылка на предопределенный элемент.
+// Неопределено - если элемент не найден, или на него нет прав.
//
Функция ПредопределенныйЭлемент(ПолноеИмяПредопределенного) Экспорт
Если ВРег(Прав(ПолноеИмяПредопределенного, 13)) = ".ПУСТАЯССЫЛКА" Тогда
@@ -2476,18 +2489,43 @@
//
Функция ЗаменитьНедопустимыеСимволыXML(Знач Текст, СимволЗамены = " ") Экспорт
- #Если НЕ ВебКлиент Тогда
+#Если НЕ ВебКлиент Тогда
ПозицияНачала = 1;
Позиция = НайтиНедопустимыеСимволыXML(Текст, ПозицияНачала);
Пока Позиция > 0 Цикл
НедопустимыйСимвол = Сред(Текст, Позиция, 1);
Текст = СтрЗаменить(Текст, НедопустимыйСимвол, СимволЗамены);
- ПозицияНачала = Позиция + 1;
+ ПозицияНачала = Позиция + СтрДлина(СимволЗамены);
+ Если ПозицияНачала > СтрДлина(Текст) Тогда
+ Прервать;
+ КонецЕсли;
Позиция = НайтиНедопустимыеСимволыXML(Текст, ПозицияНачала);
КонецЦикла;
- #КонецЕсли
Возврат Текст;
+#Иначе
+ // Коды символов от 0 до 2^16-1, которые метод НайтиНедопустимыеСимволыXML
+ // считает недопустимыми: 0-8, 11-12, 14-31, 55296-57343.
+ Итог = "";
+ ДлинаСтроки = СтрДлина(Текст);
+
+ Для НомерСимвола = 1 По ДлинаСтроки Цикл
+ Символ = Сред(Текст, НомерСимвола, 1);
+ КодСимвола = КодСимвола(Символ);
+
+ Если КодСимвола < 9
+ Или КодСимвола > 10 И КодСимвола < 13
+ Или КодСимвола > 13 И КодСимвола < 32
+ Или КодСимвола > 55295 И КодСимвола < 57344 Тогда
+
+ Символ = " ";
+ КонецЕсли;
+ Итог = Итог + Символ;
+ КонецЦикла;
+
+ Возврат Итог;
+#КонецЕсли
+
КонецФункции
// Удаляет недопустимые символы в XML-строке.
@@ -2646,10 +2684,6 @@
//
Процедура Проверить(Знач Условие, Знач Сообщение = "", Знач КонтекстПроверки = "") Экспорт
- Если Не РежимОтладки() Тогда
- Возврат;
- КонецЕсли;
-
Если Условие <> Истина Тогда
Если ПустаяСтрока(Сообщение) Тогда
ТекстИсключения = НСтр("ru = 'Недопустимая операция'"); // Assertion failed
diff --git a/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl
index 057f9e336..8e9bfa130 100644
--- a/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl
+++ b/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl
@@ -56,7 +56,7 @@
// Устанавливает текстовое описание предмета.
//
-// Параметры
+// Параметры:
// СсылкаНаПредмет - ЛюбаяСсылка - объект ссылочного типа.
// Представление - Строка - сюда необходимо поместить текстовое описание.
Процедура УстановитьПредставлениеПредмета(СсылкаНаПредмет, Представление) Экспорт
@@ -156,6 +156,7 @@
// * ОтключитьСправочникИдентификаторыОбъектовМетаданных - Булево - отключает заполнение справочника.
// ИдентификаторыОбъектовМетаданных, процедуры выгрузки и загрузки элементов справочника в узлах РИБ.
// Для частичного встраивании отдельных функций библиотеки в конфигурации без постановки на поддержку.
+// * РекомендуемыйОбъемОперативнойПамяти - Число - объем памяти в гигабайтах, рекомендуемый для комфортной работы в программе.
//
Процедура ПриОпределенииОбщихПараметровБазовойФункциональности(ОбщиеПараметры) Экспорт
diff --git a/SSL/src/CommonModules/ОрганизацииСлужебный/Module.bsl b/SSL/src/CommonModules/ОрганизацииСлужебный/Module.bsl
index 16a06a0e4..43317c471 100644
--- a/SSL/src/CommonModules/ОрганизацииСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/ОрганизацииСлужебный/Module.bsl
@@ -19,7 +19,7 @@
КонецФункции
// Возвращает признак использования нескольких организаций.
-Функция ИспользуетсяНесколькоОрганизация() Экспорт
+Функция ИспользуетсяНесколькоОрганизаций() Экспорт
Возврат ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоОрганизаций");
@@ -60,7 +60,7 @@
Обработчик = Обработчики.Добавить();
Обработчик.Версия = "2.1.3.16";
Обработчик.НачальноеЗаполнение = Истина;
- Обработчик.Процедура = "ОрганизацииСлужебный.ОбновитьПредопределенныеВидыКонтактнойИнформацииОрганизаций";
+ Обработчик.Процедура = "Справочники.Организации.ОбновитьПредопределенныеВидыКонтактнойИнформацииОрганизаций";
Обработчик = Обработчики.Добавить();
Обработчик.Версия = "2.2.1.12";
@@ -135,46 +135,6 @@
КонецПроцедуры
-// Вызывается при переходе на версию конфигурации 2.1.3.16.
-//
-Процедура ОбновитьПредопределенныеВидыКонтактнойИнформацииОрганизаций() Экспорт
-
- Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
- Возврат;
- КонецЕсли;
-
- ПараметрыПроверкиАдреса = Новый Структура;
- ПараметрыПроверкиАдреса.Вставить("АдресТолькоРоссийский", Истина);
- ПараметрыПроверкиАдреса.Вставить("ПроверятьКорректность", Ложь);
- ПараметрыПроверкиАдреса.Вставить("ЗапрещатьВводНекорректного", Ложь);
- ПараметрыПроверкиАдреса.Вставить("СкрыватьНеактуальныеАдреса", Ложь);
- ПараметрыПроверкиАдреса.Вставить("ВключатьСтрануВПредставление", Ложь);
-
- МодульКИ = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
-
- МодульКИ.ОбновитьВидКонтактнойИнформации("ЮрАдресОрганизации", "Адрес", НСтр("ru='Юридический адрес организации'"),
- Истина, Ложь, Ложь, 1, , ПараметрыПроверкиАдреса);
-
- МодульКИ.ОбновитьВидКонтактнойИнформации("ФактАдресОрганизации", "Адрес", НСтр("ru='Фактический адрес организации'"),
- Истина, Ложь, Ложь, 2);
-
- МодульКИ.ОбновитьВидКонтактнойИнформации("ТелефонОрганизации", "Телефон", НСтр("ru='Телефон организации'"),
- Истина, Ложь, Ложь, 3, Истина);
-
- МодульКИ.ОбновитьВидКонтактнойИнформации("ФаксОрганизации", "Факс", НСтр("ru='Факс организации'"),
- Истина, Ложь, Ложь, 4, Истина);
-
- МодульКИ.ОбновитьВидКонтактнойИнформации("EmailОрганизации", "АдресЭлектроннойПочты", НСтр("ru='Адрес электронной почты организации'"),
- Истина, Ложь, Ложь, 5, Истина);
-
- МодульКИ.ОбновитьВидКонтактнойИнформации("ПочтовыйАдресОрганизации", "Адрес", НСтр("ru='Почтовый адрес организации'"),
- Истина, Ложь, Ложь, 6);
-
- МодульКИ.ОбновитьВидКонтактнойИнформации("ДругаяИнформацияОрганизации", "Другое", НСтр("ru='Любая другая контактная информация'"),
- Истина, Ложь, Ложь, 7);
-
-КонецПроцедуры
-
// Обработчик подписки на событие ПроверитьЗначениеОпцииИспользоватьНесколькоОрганизаций.
// Вызывается при записи элемента справочника "Организации".
//
@@ -192,4 +152,23 @@
КонецПроцедуры
+////////////////////////////////////////////////////////////////////////////////
+// Условные вызовы подсистем БСП.
+
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.Справочники.Организации.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl b/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl
index 5c91d0ce5..e1ead6e02 100644
--- a/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl
+++ b/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl
@@ -107,7 +107,7 @@
Если ДополнительныеНастройки.ЗначенияДляВыбора.НайтиПоЗначению(ЗначениеВФорме) <> Неопределено Тогда
Продолжить;
КонецЕсли;
- ЗаполнитьЗначенияСвойств(ДополнительныеНастройки.ЗначенияДляВыбора.Добавить(), ЭлементСпискаВФорме);
+ ЗаполнитьЗначенияСвойств(ДополнительныеНастройки.ЗначенияДляВыбора.Добавить(), ЭлементСпискаВФорме, "Значение, Представление");
КонецЕсли;
Если ЭлементСпискаВФорме.Пометка Тогда
Если ТипЗнч(ЗначениеВФорме) = Тип("ОписаниеТипов") Тогда
@@ -128,6 +128,9 @@
ПользовательскаяНастройкаКД.Использование = Истина;
Форма.ПользовательскиеНастройкиМодифицированы = Истина;
+ #Если ВебКлиент Тогда
+ Форма.ОбновитьОтображениеДанных();
+ #КонецЕсли
КонецПроцедуры
Функция НайтиПользовательскуюНастройкуЭлемента(Форма, ИдентификаторЭлемента) Экспорт
diff --git a/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl
index bfe75d474..5e9652729 100644
--- a/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl
+++ b/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl
@@ -1994,7 +1994,9 @@
Иначе
- ВызватьИсключение НСтр("ru = 'Копирование элементов не поддерживается'");
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Копирование элементов ""%1"" не поддерживается'"),
+ ТипЭлемента);
КонецЕсли;
diff --git a/SSL/src/CommonModules/ОтчетыСервер/Module.bsl b/SSL/src/CommonModules/ОтчетыСервер/Module.bsl
index f2ed024d0..40f3e9f2e 100644
--- a/SSL/src/CommonModules/ОтчетыСервер/Module.bsl
+++ b/SSL/src/CommonModules/ОтчетыСервер/Module.bsl
@@ -3,14 +3,6 @@
//
////////////////////////////////////////////////////////////////////////////////
-#Область ПрограммныйИнтерфейс
-
-#КонецОбласти
-
-#Область ОбработчикиСобытий
-
-#КонецОбласти
-
#Область СлужебныеПроцедурыИФункции
////////////////////////////////////////////////////////////////////////////////
@@ -57,6 +49,8 @@
Информация.Вставить("Поиск", Новый Структура);
Информация.Поиск.Вставить("НастройкиВариантаПоПолюКД", Новый Соответствие);
Информация.Поиск.Вставить("ПользовательскиеНастройки", Новый Соответствие);
+ Информация.Вставить("ЕстьБыстрыеНастройки", Ложь);
+ Информация.Вставить("ЕстьОбычныеНастройки", Ложь);
Для Каждого ПользовательскаяНастройкаКД Из ПользовательскиеНастройкиКД.Элементы Цикл
СвойстваНастройки = Информация.ПользовательскиеНастройки.Добавить();
@@ -269,6 +263,7 @@
Результат.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Результат.Колонки.Добавить("ВыводРазрешен", Новый ОписаниеТипов("Булево"));
Результат.Колонки.Добавить("ВыводитьФлажок", Новый ОписаниеТипов("Булево"));
+ Результат.Колонки.Добавить("ВыборГруппИЭлементов");
Возврат Результат;
КонецФункции
@@ -441,7 +436,7 @@
КонецЦикла;
- Найденные = ДеревоВарианта.Строки.НайтиСтроки(Новый Структура("Глобальная", Истина), Истина);
+ Найденные = ДеревоВарианта.Строки.НайтиСтроки(Новый Структура("Тип", "Настройки"), Истина);
Для Каждого СтрокаДерева Из Найденные Цикл
// Настройки, свойство ПараметрыДанных, метод НайтиЗначениеПараметра().
@@ -590,6 +585,12 @@
Или НастройкаВарианта.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке
Или НастройкаВарианта.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии Тогда
НастройкаВарианта.ВводСписком = Истина;
+ НастройкаВарианта.ВыборГруппИЭлементов = ГруппыИЭлементы.ГруппыИЭлементы;
+ ИначеЕсли НастройкаВарианта.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии
+ Или НастройкаВарианта.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВИерархии Тогда
+ НастройкаВарианта.ВыборГруппИЭлементов = ГруппыИЭлементы.Группы;
+ Иначе
+ НастройкаВарианта.ВыборГруппИЭлементов = ОтчетыКлиентСервер.ПривестиЗначениеКТипуГруппыИЭлементы(ДоступнаяНастройкаКД.ВыборГруппИЭлементов);
КонецЕсли;
НастройкаВарианта.ОписаниеТипов = ДоступнаяНастройкаКД.ТипЗначения;
@@ -933,8 +934,10 @@
Если РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ Тогда
СвойстваНастройки.Быстрая = Истина;
+ Информация.ЕстьБыстрыеНастройки = Истина;
ИначеЕсли РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный Тогда
СвойстваНастройки.Обычная = Истина;
+ Информация.ЕстьОбычныеНастройки = Истина;
ИначеЕсли Информация.ТолькоПользовательские Тогда
Возврат СвойстваНастройки;
КонецЕсли;
@@ -1043,7 +1046,7 @@
КонецЕсли;
Если СвойстваНастройки.ВыборГруппИЭлементов = Неопределено Тогда
- СвойстваНастройки.ВыборГруппИЭлементов = ОтчетыКлиентСервер.ПривестиЗначениеКТипуГруппыИЭлементы(СвойстваНастройки.ДоступнаяНастройкаКД.ВыборГруппИЭлементов);
+ СвойстваНастройки.ВыборГруппИЭлементов = НастройкаВарианта.ВыборГруппИЭлементов;
КонецЕсли;
ИначеЕсли СвойстваНастройки.Тип = "ВыбранныеПоля"
@@ -1183,14 +1186,9 @@
Или СвойстваНастройки.Тип = "ГруппировкаТаблицы"
Или СвойстваНастройки.Тип = "ГруппировкаДиаграммы" Тогда
- ПоляГруппировки = НастройкаВариантаКД.ПоляГруппировки;
- Если ПоляГруппировки.Элементы.Количество() = 0 Тогда
- ЭлементЗаголовок = НСтр("ru = '<Детальные записи>'");
- Иначе
- ЭлементЗаголовок = СокрЛП(Строка(ПоляГруппировки));
- КонецЕсли;
+ ЭлементЗаголовок = СокрЛП(Строка(НастройкаВариантаКД.ПоляГруппировки));
Если ПустаяСтрока(ЭлементЗаголовок) Тогда
- ЭлементЗаголовок = НСтр("ru = 'Группировка'");
+ ЭлементЗаголовок = НСтр("ru = '<Детальные записи>'");
КонецЕсли;
ИначеЕсли СвойстваНастройки.Тип = "Таблица" Тогда
@@ -1437,6 +1435,10 @@
ПолеВвода.УстановитьДействие("НачалоВыбора", "Подключаемый_СписокКомпоновщика_Значение_НачалоВыбора");
КонецЕсли;
+ Если СвойстваНастройки.Тип = "ЗначениеПараметраНастроек" Тогда
+ ПолеВвода.АвтоОтметкаНезаполненного = СвойстваНастройки.ДоступнаяНастройкаКД.ЗапрещатьНезаполненныеЗначения;
+ КонецЕсли;
+
ИначеЕсли СвойстваНастройки.ТипЭлементов = "ПолеВвода" Тогда
ЭлементВывода.ИмяЭлемента2 = ЗначениеИмя;
diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl
index 5df0ec5dd..7d49e292b 100644
--- a/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl
+++ b/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl
@@ -27,6 +27,11 @@
КонецЕсли;
ИмяПараметра = "СтандартныеПодсистемы.ОценкаПроизводительностиЗамерВремени";
+
+ Если ПараметрыПриложения = Неопределено Тогда
+ ПараметрыПриложения = Новый Соответствие;
+ КонецЕсли;
+
Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда
ТекущийПериодЗаписи = ОценкаПроизводительностиВызовСервераПолныеПрава.ПериодЗаписи();
ДатаИВремяНаСервере = ОценкаПроизводительностиВызовСервераПолныеПрава.ДатаИВремяНаСервере();
@@ -70,22 +75,22 @@
// либо Строка - название ключевой операции.
// ВремяНачала - Число или Дата.
Процедура ЗакончитьЗамерВремени(КлючеваяОперация, ВремяНачала) Экспорт
-
- ДатаОкончания = ЗначениеТаймера(Ложь);
- ВремяОкончания = ЗначениеТаймера();
- Если ТипЗнч(ВремяНачала) = Тип("Число") Тогда
- Длительность = (ВремяОкончания - ВремяНачала);
- ДатаНачала = ДатаОкончания - Длительность;
- Иначе
- Длительность = (ДатаОкончания - ВремяНачала);
- ДатаНачала = ВремяНачала;
- КонецЕсли;
- ОценкаПроизводительностиВызовСервераПолныеПрава.ЗафиксироватьДлительностьКлючевойОперации(
+ Если ОценкаПроизводительностиВызовСервераПовтИсп.ВыполнятьЗамерыПроизводительности() Тогда
+ ДатаОкончания = ЗначениеТаймера(Ложь);
+ ВремяОкончания = ЗначениеТаймера();
+ Если ТипЗнч(ВремяНачала) = Тип("Число") Тогда
+ Длительность = (ВремяОкончания - ВремяНачала);
+ ДатаНачала = ДатаОкончания - Длительность;
+ Иначе
+ Длительность = (ДатаОкончания - ВремяНачала);
+ ДатаНачала = ВремяНачала;
+ КонецЕсли;
+ ОценкаПроизводительностиВызовСервераПолныеПрава.ЗафиксироватьДлительностьКлючевойОперации(
КлючеваяОперация,
Длительность,
ДатаНачала,
ДатаОкончания);
-
+ КонецЕсли;
КонецПроцедуры
// Функция вызывается при старте замера времени и его завершении.
diff --git a/SSL/src/CommonModules/ОчередьЗаданий/Module.bsl b/SSL/src/CommonModules/ОчередьЗаданий/Module.bsl
index deab3182d..d59ab70d1 100644
--- a/SSL/src/CommonModules/ОчередьЗаданий/Module.bsl
+++ b/SSL/src/CommonModules/ОчередьЗаданий/Module.bsl
@@ -142,7 +142,7 @@
Для Каждого СправочникЗаданий Из СправочникиЗаданий Цикл
Отказ = Ложь;
- ИмяСправочника = СправочникЗаданий.СоздатьЭлемент().Метаданные().ПолноеИмя();
+ ИмяСправочника = Метаданные.НайтиПоТипу(ТипЗнч(СправочникЗаданий)).ПолноеИмя();
Если Не ПолучатьРазделенные Тогда
diff --git a/SSL/src/CommonModules/ОчередьЗаданийПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОчередьЗаданийПереопределяемый/Module.bsl
index ddcb0e4d2..5318b1f84 100644
--- a/SSL/src/CommonModules/ОчередьЗаданийПереопределяемый/Module.bsl
+++ b/SSL/src/CommonModules/ОчередьЗаданийПереопределяемый/Module.bsl
@@ -45,7 +45,7 @@
// Параметры
// НомерПопытки
// КоличествоПовторовПриАварийномЗавершении
-// ДатаНачалаПоследнегоЗапуска
+// ДатаНачалаПоследнегоЗапуска.
//
Процедура ПриОпределенииОбработчиковОшибок(ОбработчикиОшибок) Экспорт
diff --git a/SSL/src/CommonModules/ОчередьЗаданийСлужебный/Module.bsl b/SSL/src/CommonModules/ОчередьЗаданийСлужебный/Module.bsl
index d48f55177..a82481c3e 100644
--- a/SSL/src/CommonModules/ОчередьЗаданийСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/ОчередьЗаданийСлужебный/Module.bsl
@@ -460,6 +460,7 @@
|УПОРЯДОЧИТЬ ПО
| ЭксклюзивноеВыполнение УБЫВ,
| ЗапланированныйМоментЗапуска,
+ | ДатаЗавершенияПоследнегоЗапуска,
| Идентификатор";
Запрос.Текст = ТекстЗапроса;
@@ -514,6 +515,7 @@
Прервать;
Исключение
// Не удалось установить блокировку.
+ БлокировкаУстановлена = Ложь;
КонецПопытки;
КонецЦикла;
@@ -585,9 +587,10 @@
Попытка
+ ПараметрыОбработчикаОшибок = ПолучитьПараметрыОбработчикаОшибок(Задание, ИнформацияОбОшибкеВыполненияЗадания);
+
ЗаблокироватьДанныеДляРедактирования(Задание);
- ПараметрыОбработчикаОшибок = ПолучитьПараметрыОбработчикаОшибок(Задание, ИнформацияОбОшибкеВыполненияЗадания);
Если ПараметрыОбработчикаОшибок.ОбработчикСуществует Тогда
ВыполнитьМетодКонфигурации(ПараметрыОбработчикаОшибок.ИмяМетода, ПараметрыОбработчикаОшибок.ПараметрыВызоваОбработчика);
КонецЕсли;
diff --git a/SSL/src/CommonModules/ПоискИУдалениеДублей/Module.bsl b/SSL/src/CommonModules/ПоискИУдалениеДублей/Module.bsl
index 842827e33..fb98323b4 100644
--- a/SSL/src/CommonModules/ПоискИУдалениеДублей/Module.bsl
+++ b/SSL/src/CommonModules/ПоискИУдалениеДублей/Module.bsl
@@ -211,5 +211,57 @@
ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
КонецПроцедуры
+
+////////////////////////////////////////////////////////////////////////////////
+// Условное оформление.
+
+// Описание инструкции для добавления элемента условного оформления.
+Функция ИнструкцияУсловногоОформления() Экспорт
+ Возврат Новый Структура("Отборы, Оформление, Поля", Новый Соответствие, Новый Соответствие, "");
+КонецФункции
+
+// Добавляет элемент условного оформления согласно описанию из инструкции.
+Функция ДобавитьЭлементУсловногоОформления(Форма, ИнструкцияУсловногоОформления) Экспорт
+ ЭлементУсловногоОформленияКД = Форма.УсловноеОформление.Элементы.Добавить();
+ ЭлементУсловногоОформленияКД.Использование = Истина;
+ Для Каждого КлючИЗначение Из ИнструкцияУсловногоОформления.Отборы Цикл
+ ЭлементОтбораКД = ЭлементУсловногоОформленияКД.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
+ ЭлементОтбораКД.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(КлючИЗначение.Ключ);
+ Настройка = КлючИЗначение.Значение;
+ Тип = ТипЗнч(Настройка);
+ Если Тип = Тип("Структура") Тогда
+ ЭлементОтбораКД.ВидСравнения = ВидСравненияКомпоновкиДанных[Настройка.Вид];
+ ЭлементОтбораКД.ПравоеЗначение = Настройка.Значение;
+ ИначеЕсли Тип = Тип("Массив") Тогда
+ ЭлементОтбораКД.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
+ ЭлементОтбораКД.ПравоеЗначение = Настройка;
+ ИначеЕсли Тип = Тип("ВидСравненияКомпоновкиДанных") Тогда
+ ЭлементОтбораКД.ВидСравнения = Настройка;
+ Иначе
+ ЭлементОтбораКД.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
+ ЭлементОтбораКД.ПравоеЗначение = Настройка;
+ КонецЕсли;
+ ЭлементОтбораКД.Применение = ТипПримененияОтбораКомпоновкиДанных.Элементы;
+ КонецЦикла;
+
+ Для Каждого КлючИЗначение Из ИнструкцияУсловногоОформления.Оформление Цикл
+ ЭлементУсловногоОформленияКД.Оформление.УстановитьЗначениеПараметра(
+ Новый ПараметрКомпоновкиДанных(КлючИЗначение.Ключ),
+ КлючИЗначение.Значение);
+ КонецЦикла;
+
+ Поля = ИнструкцияУсловногоОформления.Поля;
+ Если ТипЗнч(Поля) = Тип("Строка") Тогда
+ Поля = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Поля, ",", Истина, Истина);
+ КонецЕсли;
+ Для Каждого Поле Из Поля Цикл
+ ПолеКД = ЭлементУсловногоОформленияКД.Поля.Элементы.Добавить();
+ ПолеКД.Использование = Истина;
+ ПолеКД.Поле = Новый ПолеКомпоновкиДанных(Поле);
+ КонецЦикла;
+
+ Возврат ЭлементУсловногоОформленияКД;
+КонецФункции
+
#КонецОбласти
\ No newline at end of file
diff --git a/SSL/src/CommonModules/ПоискИУдалениеДублейПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПоискИУдалениеДублейПереопределяемый/Module.bsl
index 926e37e40..1d6a483e8 100644
--- a/SSL/src/CommonModules/ПоискИУдалениеДублейПереопределяемый/Module.bsl
+++ b/SSL/src/CommonModules/ПоискИУдалениеДублейПереопределяемый/Module.bsl
@@ -15,7 +15,7 @@
// В значении могут быть перечислены имена экспортных процедур:
// "ПараметрыПоискаДублей",
// "ПриПоискеДублей",
-// "ВозможностьЗаменыЭлементов"
+// "ВозможностьЗаменыЭлементов".
// Каждое имя должно начинаться с новой строки.
// Если указана пустая строка, значит в модуле менеджера определены все процедуры.
//
diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl
index b6b8224a7..4cd297ba5 100644
--- a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl
+++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl
@@ -278,14 +278,16 @@
Соединение.Получить(ПутьКФайлуНаСервере, ПутьДляСохранения);
ЗаголовкиОтвета = Неопределено;
Иначе
- HTTPЗапрос = Новый HTTPЗапрос(ПутьКФайлуНаСервере, Заголовки);
- HTTPЗапрос.Заголовки.Вставить("Accept-Charset", "utf-8");
- HTTPОтвет = Соединение.Получить(HTTPЗапрос, ПутьДляСохранения);
+
+ HTTPОтвет = ПолучитьHTTPОтвет(ПутьКФайлуНаСервере, ПутьДляСохранения, Соединение, Заголовки);
+
Если HTTPОтвет.КодСостояния < 200 Или HTTPОтвет.КодСостояния >= 300 Тогда
ФайлОтвета = Новый ЧтениеТекста(ПутьДляСохранения, КодировкаТекста.UTF8);
ВызватьИсключение СтроковыеФункцииКлиентСервер.ИзвлечьТекстИзHTML(ФайлОтвета.Прочитать(5 * 1024));
КонецЕсли;
+
ЗаголовкиОтвета = HTTPОтвет.Заголовки;
+
КонецЕсли;
Исключение
@@ -313,6 +315,22 @@
КонецФункции
+Функция ПолучитьHTTPОтвет(ПутьКФайлуНаСервере, ПутьДляСохранения, Соединение, Заголовки)
+
+ HTTPЗапрос = Новый HTTPЗапрос(ПутьКФайлуНаСервере, Заголовки);
+ HTTPЗапрос.Заголовки.Вставить("Accept-Charset", "utf-8");
+ HTTPОтвет = Соединение.Получить(HTTPЗапрос, ПутьДляСохранения);
+
+ Если HTTPОтвет.КодСостояния = 301 Тогда
+ ПутьКФайлуНаСервере = HTTPОтвет.Заголовки["Location"];
+ HTTPОтвет = ПолучитьHTTPОтвет(ПутьКФайлуНаСервере, ПутьДляСохранения, Соединение, Заголовки);
+ КонецЕсли;
+
+ Возврат HTTPОтвет;
+
+КонецФункции
+
+
// Возвращает прокси по настройкам НастройкаПроксиСервера для заданного протокола Протокол.
//
// Параметры:
diff --git a/SSL/src/CommonModules/Пользователи/Module.bsl b/SSL/src/CommonModules/Пользователи/Module.bsl
index 898a80cf6..d26c1703c 100644
--- a/SSL/src/CommonModules/Пользователи/Module.bsl
+++ b/SSL/src/CommonModules/Пользователи/Module.bsl
@@ -101,11 +101,11 @@
// Для текущего пользователя ИБ проверяются роли не в записанном пользователе ИБ,
// а роли в текущем сеансе.
Если ПроверитьРольПолныеПрава
- И НЕ РольДоступна(Метаданные.Роли.ПолныеПрава) Тогда
+ И НЕ РольДоступна(Метаданные.Роли.ПолныеПрава) Тогда // Не заменять на РолиДоступны.
Возврат Ложь;
КонецЕсли;
Если ПроверитьРольАдминистратораСистемы
- И НЕ РольДоступна(РольАдминистратораСистемы(Истина)) Тогда
+ И НЕ РольДоступна(РольАдминистратораСистемы(Истина)) Тогда // Не заменять на РолиДоступны.
Возврат Ложь;
КонецЕсли;
Возврат Истина;
@@ -149,10 +149,16 @@
КонецЕсли;
МассивИменРолей = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИменаРолей);
+
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
+ МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный");
+ МодульУправлениеДоступомСлужебный.ПередПроверкойДоступностиРолей(МассивИменРолей);
+ КонецЕсли;
+
Для каждого ИмяРоли Из МассивИменРолей Цикл
Если Свойства.УказанТекущийПользовательИБ Тогда
- Если РольДоступна(СокрЛП(ИмяРоли)) Тогда
+ Если РольДоступна(СокрЛП(ИмяРоли)) Тогда // Не заменять на РолиДоступны.
Возврат Истина;
КонецЕсли;
Иначе
@@ -614,13 +620,25 @@
////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции для работы с пользователями информационной базы.
-// Возвращает полное имя не указанного пользователя для отображения в интерфейсах.
+// Возвращает полное имя неуказанного пользователя для отображения в интерфейсах.
Функция ПолноеИмяНеуказанногоПользователя() Экспорт
Возврат НСтр("ru = '<Не указан>'");
КонецФункции
+// Возвращает ссылку неуказанного пользователя.
+//
+// Возвращаемое значение:
+// СправочникСсылка.Пользователи - неуказанный пользователь существует в справочнике.
+// Неопределено - неуказанный пользователь не существует в справочнике.
+//
+Функция СсылкаНеуказанногоПользователя() Экспорт
+
+ Возврат ПользователиСлужебный.СвойстваНеуказанногоПользователя().Ссылка;
+
+КонецФункции
+
// Проверяет сопоставлен ли пользовательИБ с элементом справочника Пользователи или
// с элементом справочника ВнешниеПользователи.
//
@@ -999,7 +1017,7 @@
СтруктураИсключаемыхСвойств = Новый Структура;
КонецЕсли;
- Если ПользователиСлужебный.ЭтоУчебнаяПлатформа() Тогда
+ Если СтандартныеПодсистемыСервер.ЭтоУчебнаяПлатформа() Тогда
СтруктураИсключаемыхСвойств.Вставить("АутентификацияОС");
СтруктураИсключаемыхСвойств.Вставить("ПользовательОС");
КонецЕсли;
diff --git a/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl
index 812459d2e..76694e6db 100644
--- a/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl
@@ -450,8 +450,8 @@
Если ТребуетсяСоздатьАдминистратора Тогда
- Если РольДоступна(Метаданные.Роли.ПолныеПрава)
- И (РольДоступна(Пользователи.РольАдминистратораСистемы(Истина))
+ Если РольДоступна(Метаданные.Роли.ПолныеПрава) // Не заменять на РолиДоступны.
+ И (РольДоступна(Пользователи.РольАдминистратораСистемы(Истина)) // Не заменять на РолиДоступны.
ИЛИ ОбщегоНазначенияПовтИсп.РазделениеВключено() ) Тогда
Пользователь = Пользователи.СоздатьАдминистратора(ТекущийПользовательИБ);
@@ -643,25 +643,6 @@
КонецФункции
-// Проверят, что выполнение происходит на учебной платформе,
-// на которой, например, недоступно получение свойства ПользовательОС.
-//
-Функция ЭтоУчебнаяПлатформа() Экспорт
-
- УстановитьПривилегированныйРежим(Истина);
-
- ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
-
- Попытка
- ПользовательОС = ТекущийПользователь.ПользовательОС;
- Исключение
- ТекущийПользователь = Неопределено;
- КонецПопытки;
-
- Возврат ТекущийПользователь = Неопределено;
-
-КонецФункции
-
// При первом запуске подчиненного узла очищает идентификаторы
// пользователей ИБ, скопированные при создании начального образа.
//
@@ -720,93 +701,6 @@
////////////////////////////////////////////////////////////////////////////////
// Обработчики событий подсистем БСП.
-// Заполняет список текущих дел пользователя.
-//
-// Параметры:
-// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками:
-// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела".
-// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя.
-// * Важное - Булево - если Истина, дело будет выделено красным цветом.
-// * Представление - Строка - представление дела, выводимое пользователю.
-// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела.
-// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку
-// дела на панели "Текущие дела".
-// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя.
-// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего
-// или объект метаданных подсистема.
-// * Подсказка - Строка - текст подсказки.
-//
-Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт
-
- Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
- Возврат; // В модели сервиса дело не выводится.
- КонецЕсли;
-
- МодульТекущиеДелаСлужебный = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСлужебный");
- Если Не Пользователи.ЭтоПолноправныйПользователь(, Истина)
- Или МодульТекущиеДелаСлужебный.ДелоОтключено("НекорректныеСведенияОПользователях") Тогда
- Возврат;
- КонецЕсли;
- МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер");
-
- НекорректныхПользователей = ПользователиДобавленныеСПомощьюКонфигуратора();
-
- // Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь
- // не делается проверка существования подсистемы.
- Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Справочники.Пользователи.ПолноеИмя());
-
- Если Разделы = Неопределено Тогда
- Возврат;
- КонецЕсли;
-
- Для Каждого Раздел Из Разделы Цикл
-
- ИдентификаторПользователи = "НекорректныеСведенияОПользователях" + СтрЗаменить(Раздел.ПолноеИмя(), ".", "");
- Дело = ТекущиеДела.Добавить();
- Дело.Идентификатор = ИдентификаторПользователи;
- Дело.ЕстьДела = НекорректныхПользователей > 0;
- Дело.Количество = НекорректныхПользователей;
- Дело.Представление = НСтр("ru = 'Некорректные сведения о пользователях'");
- Дело.Форма = "Справочник.Пользователи.Форма.ПользователиИБ";
- Дело.Владелец = Раздел;
-
- КонецЦикла;
-
-КонецПроцедуры
-
-// Определить список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла".
-//
-// Параметры:
-// ЗагружаемыеСправочники - ТаблицаЗначений - список справочников, в которые возможна загрузка данных.
-// * ПолноеИмя - Строка - полное имя справочника (как в метаданных).
-// * Представление - Строка - представление справочника в списке выбора.
-// * ПрикладнаяЗагрузка - Булево - если Истина, значит справочник использует собственный алгоритм загрузки и
-// в модуле менеджера справочника определены функции.
-//
-Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт
-
- // Загрузка в справочник ВнешниеПользователи запрещена.
- СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ВнешниеПользователи.ПолноеИмя(), "ПолноеИмя");
- Если СтрокаТаблицы <> Неопределено Тогда
- ЗагружаемыеСправочники.Удалить(СтрокаТаблицы);
- КонецЕсли;
-
- // Загрузка в справочник Пользователи запрещена.
- СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.Пользователи.ПолноеИмя(), "ПолноеИмя");
- Если СтрокаТаблицы <> Неопределено Тогда
- ЗагружаемыеСправочники.Удалить(СтрокаТаблицы);
- КонецЕсли;
-
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-////////////////////////////////////////////////////////////////////////////////
-// Обработчики событий подсистем БСП.
-
// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме.
//
// Параметры:
@@ -869,6 +763,7 @@
Обработчики.Вставить("ТекущийПользователь", "ПользователиСлужебный.УстановкаПараметровСеанса");
Обработчики.Вставить("ТекущийВнешнийПользователь", "ПользователиСлужебный.УстановкаПараметровСеанса");
+ Обработчики.Вставить("АвторизованныйПользователь", "ПользователиСлужебный.УстановкаПараметровСеанса");
КонецПроцедуры
@@ -886,6 +781,7 @@
Процедура ПриДобавленииПараметровРаботыКлиента(Параметры) Экспорт
Параметры.Вставить("ЭтоПолноправныйПользователь", Пользователи.ЭтоПолноправныйПользователь());
+ Параметры.Вставить("ЭтоУчебнаяПлатформа", СтандартныеПодсистемыСервер.ЭтоУчебнаяПлатформа());
КонецПроцедуры
@@ -1033,6 +929,86 @@
КонецПроцедуры
+// Заполняет список текущих дел пользователя.
+//
+// Параметры:
+// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками:
+// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела".
+// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя.
+// * Важное - Булево - если Истина, дело будет выделено красным цветом.
+// * Представление - Строка - представление дела, выводимое пользователю.
+// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела.
+// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку
+// дела на панели "Текущие дела".
+// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя.
+// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего
+// или объект метаданных подсистема.
+// * Подсказка - Строка - текст подсказки.
+//
+Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт
+
+ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
+ Возврат; // В модели сервиса дело не выводится.
+ КонецЕсли;
+
+ МодульТекущиеДелаСлужебный = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСлужебный");
+ Если Не Пользователи.ЭтоПолноправныйПользователь(, Истина)
+ Или МодульТекущиеДелаСлужебный.ДелоОтключено("НекорректныеСведенияОПользователях") Тогда
+ Возврат;
+ КонецЕсли;
+ МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер");
+
+ НекорректныхПользователей = ПользователиДобавленныеСПомощьюКонфигуратора();
+
+ // Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь
+ // не делается проверка существования подсистемы.
+ Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Справочники.Пользователи.ПолноеИмя());
+
+ Если Разделы = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+
+ Для Каждого Раздел Из Разделы Цикл
+
+ ИдентификаторПользователи = "НекорректныеСведенияОПользователях" + СтрЗаменить(Раздел.ПолноеИмя(), ".", "");
+ Дело = ТекущиеДела.Добавить();
+ Дело.Идентификатор = ИдентификаторПользователи;
+ Дело.ЕстьДела = НекорректныхПользователей > 0;
+ Дело.Количество = НекорректныхПользователей;
+ Дело.Представление = НСтр("ru = 'Некорректные сведения о пользователях'");
+ Дело.Форма = "Справочник.Пользователи.Форма.ПользователиИБ";
+ Дело.Владелец = Раздел;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+// Определить список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла".
+//
+// Параметры:
+// ЗагружаемыеСправочники - ТаблицаЗначений - список справочников, в которые возможна загрузка данных.
+// * ПолноеИмя - Строка - полное имя справочника (как в метаданных).
+// * Представление - Строка - представление справочника в списке выбора.
+// * ПрикладнаяЗагрузка - Булево - если Истина, значит справочник использует собственный алгоритм загрузки и
+// в модуле менеджера справочника определены функции.
+//
+Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт
+
+ // Загрузка в справочник ВнешниеПользователи запрещена.
+ СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.ВнешниеПользователи.ПолноеИмя(), "ПолноеИмя");
+ Если СтрокаТаблицы <> Неопределено Тогда
+ ЗагружаемыеСправочники.Удалить(СтрокаТаблицы);
+ КонецЕсли;
+
+ // Загрузка в справочник Пользователи запрещена.
+ СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.Пользователи.ПолноеИмя(), "ПолноеИмя");
+ Если СтрокаТаблицы <> Неопределено Тогда
+ ЗагружаемыеСправочники.Удалить(СтрокаТаблицы);
+ КонецЕсли;
+
+
+КонецПроцедуры
+
// Обработчики событий подсистемы Управление доступом.
// Заполняет состав видов доступа, используемых при ограничении прав объектов метаданных.
@@ -1760,9 +1736,15 @@
ИЛИ Роли.Найти(Пользователи.РольАдминистратораСистемы().Имя) = Неопределено Тогда
// Подготовка текста вопроса при записи первого администратора.
- Текст = НСтр("ru = 'В список пользователей программы добавляется первый пользователь,
- |поэтому ему автоматически будет назначена роль ""Полные права"".
- |Продолжить?'");
+ Если ВРег(Пользователи.РольАдминистратораСистемы().Имя) = ВРег("ПолныеПрава") Тогда
+ Текст = НСтр("ru = 'В список пользователей программы добавляется первый пользователь,
+ |поэтому ему автоматически будет назначена роль ""Полные права"".
+ |Продолжить?'");
+ Иначе
+ Текст = НСтр("ru = 'В список пользователей программы добавляется первый пользователь, поэтому ему
+ |автоматически будут назначены роли ""Администратор системы"" и ""Полные права"".
+ |Продолжить?'");
+ КонецЕсли;
Если НЕ ЗапретРедактированияРолей() Тогда
Возврат Истина;
@@ -1979,7 +1961,7 @@
Если ОписаниеПользователяИБ.Свойство("ПользовательОС") Тогда
Если Не ПустаяСтрока(ОписаниеПользователяИБ.ПользовательОС)
- И Не ЭтоУчебнаяПлатформа() Тогда
+ И Не СтандартныеПодсистемыСервер.ЭтоУчебнаяПлатформа() Тогда
УстановитьПривилегированныйРежим(Истина);
Попытка
@@ -3046,17 +3028,18 @@
//
// Параметры:
// МассивПользователей - Массив - пользователи, которых нужно перенести в новую группу.
-// ГруппаИсточник - СправочникСсылка.ГруппыПользователей - группа, из которой происходит
-// перенос пользователей.
// ГруппаПриемник - СправочникСсылка.ГруппыПользователей - группа, в которую переносятся
// пользователи.
// Перемещение - Булево - если Истина, то пользователь удаляется из старой группы.
+// МассивНеПеремещенныхПользователей - Массив - пользователи, которых не удалось переместить в группу.
+// ГруппаИсточник - СправочникСсылка.ГруппыПользователей - группа, из которой происходит
+// перенос пользователей.
//
// ВозвращаемоеЗначение:
// Строка - Сообщение пользователю.
//
Функция ФормированиеСообщенияПользователю(МассивПользователей, ГруппаПриемник,
- Перемещение, МассивНеПеремещенныхПользователей, ГруппаИсточник = Неопределено) Экспорт
+ Перемещение, МассивНеПеремещенныхПользователей, ГруппаИсточник = Неопределено) Экспорт
КоличествоПользователей = МассивПользователей.Количество();
НаименованиеГруппы = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ГруппаПриемник, "Наименование");
@@ -3073,19 +3056,19 @@
Если КоличествоНеПеремещенныхПользователей = 1 Тогда
Предмет = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(МассивНеПеремещенныхПользователей[0], "Наименование");
ТипПользователяСовпадаетСГруппой = (ТипЗнч(МассивНеПеремещенныхПользователей[0].ОбъектАвторизации) =
- ТипЗнч(ГруппаПриемник.ТипОбъектовАвторизации));
+ ТипЗнч(ГруппаПриемник.ТипОбъектовАвторизации));
УведомлениеПользователя.Пользователи = Неопределено;
СообщениеПользователю = НСтр("ru = 'Пользователь ""%1"" не может быть включен в группу ""%2"",'");
СообщениеПользователю = СообщениеПользователю + Символы.ПС +
- ?(Не ТипПользователяСовпадаетСГруппой,
- НСтр("ru = 'т.к. в состав ее участников входят только %3.'"),
- НСтр("ru = 'т.к. у группы стоит признак ""Все пользователи заданного типа"".'"));
+ ?(Не ТипПользователяСовпадаетСГруппой,
+ НСтр("ru = 'т.к. в состав ее участников входят только %3.'"),
+ НСтр("ru = 'т.к. у группы стоит признак ""Все пользователи заданного типа"".'"));
Иначе
Предмет = "";
УведомлениеПользователя.Пользователи = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(МассивНеПеремещенныхПользователей, Символы.ПС);
СообщениеПользователю = НСтр("ru = 'Не все пользователи могут быть включены в группу ""%2"",
- |т.к. в состав ее участников входят только %3
- |или у группы стоит признак ""Все пользователи заданного типа"".'");
+ |т.к. в состав ее участников входят только %3
+ |или у группы стоит признак ""Все пользователи заданного типа"".'");
КонецЕсли;
ЭлементПредставленияТипаОбъектаАвторизации = Метаданные.НайтиПоТипу(ТипЗнч(ГруппаПриемник.ТипОбъектовАвторизации)).Синоним;
@@ -3365,21 +3348,27 @@
Процедура ОбновитьПредопределенныеВидыКонтактнойИнформацииПользователей() Экспорт
Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда
- Возврат;
+ Возврат;
КонецЕсли;
МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией");
- МодульУправлениеКонтактнойИнформацией.ОбновитьВидКонтактнойИнформации(
- Справочники["ВидыКонтактнойИнформации"].EmailПользователя,
- Перечисления["ТипыКонтактнойИнформации"].АдресЭлектроннойПочты,
- НСтр("ru='Адрес электронной почты пользователя'"), Истина, Ложь, Ложь, 1, Истина);
+ ПараметрыВида = МодульУправлениеКонтактнойИнформацией.ПараметрыВидаКонтактнойИнформации("АдресЭлектроннойПочты");
+ ПараметрыВида.Вид = "EmailПользователя";
+ ПараметрыВида.Подсказка = НСтр("ru='Адрес электронной почты пользователя'");
+ ПараметрыВида.МожноИзменятьСпособРедактирования = Истина;
+ ПараметрыВида.РазрешитьВводНесколькихЗначений = Истина;
+ ПараметрыВида.Порядок = 1;
+ МодульУправлениеКонтактнойИнформацией.УстановитьСвойстваВидаКонтактнойИнформации(ПараметрыВида);
+
+ ПараметрыВида = МодульУправлениеКонтактнойИнформацией.ПараметрыВидаКонтактнойИнформации("Телефон");
+ ПараметрыВида.Вид = "ТелефонПользователя";
+ ПараметрыВида.Подсказка = НСтр("ru='Контактный телефон пользователя'");
+ ПараметрыВида.МожноИзменятьСпособРедактирования = Истина;
+ ПараметрыВида.РазрешитьВводНесколькихЗначений = Истина;
+ ПараметрыВида.Порядок = 2;
+ МодульУправлениеКонтактнойИнформацией.УстановитьСвойстваВидаКонтактнойИнформации(ПараметрыВида);
- МодульУправлениеКонтактнойИнформацией.ОбновитьВидКонтактнойИнформации(
- Справочники["ВидыКонтактнойИнформации"].ТелефонПользователя,
- Перечисления["ТипыКонтактнойИнформации"].Телефон,
- НСтр("ru='Контактный телефон пользователя'"), Истина, Ложь, Ложь, 2, Истина);
-
КонецПроцедуры
// Вызывается при переходе на версию конфигурации 2.1.4.19.
@@ -3565,6 +3554,27 @@
КонецПроцедуры
+////////////////////////////////////////////////////////////////////////////////
+// Обработчики условных вызовов из других подсистемы.
+
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.Справочники.ВнешниеПользователи.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ГруппыВнешнихПользователей.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.Пользователи.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
// Обработчики записи пользователей и групп пользователей.
// Доопределяет действия, необходимые после завершения обновления
@@ -4832,9 +4842,7 @@
КонецЕсли;
// Заполнение автоматических свойств пользователя ИБ.
- Если ОписаниеПользователяИБ.Свойство("ПолноеИмя") Тогда
- ОписаниеПользователяИБ.Вставить("ПолноеИмя", ПользовательОбъект.Наименование);
- КонецЕсли;
+ ОписаниеПользователяИБ.Вставить("ПолноеИмя", ПользовательОбъект.Наименование);
ХранимыеСвойства = ХранимыеСвойстваПользователяИБ(ПользовательОбъект);
Если ПараметрыОбработки.СтарыйПользовательИБСуществует Тогда
diff --git a/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl
index 1f4b6d0b6..7c53c2fcc 100644
--- a/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl
+++ b/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl
@@ -3,7 +3,7 @@
//
////////////////////////////////////////////////////////////////////////////////
-#Область СлужебныеПроцедурыИФункции
+#Область СлужебныйПрограммныйИнтерфейс
// Содержит сохраненные параметры, используемые подсистемой.
Функция Параметры() Экспорт
@@ -42,6 +42,10 @@
КонецФункции
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
// Возвращает дерево ролей с подсистемами или без них.
// Если роль не принадлежит ни одной подсистеме она добавляется "в корень".
//
@@ -77,7 +81,8 @@
Для каждого Роль Из Метаданные.Роли Цикл
Если НедоступныеРоли.Получить(Роль.Имя) <> Неопределено
- ИЛИ ВРег(Лев(Роль.Имя, СтрДлина("Удалить"))) = ВРег("Удалить") Тогда
+ ИЛИ ВРег(Лев(Роль.Имя, СтрДлина("Удалить"))) = ВРег("Удалить")
+ ИЛИ ВРег(Лев(Роль.Имя, СтрДлина("Профиль"))) = ВРег("Профиль") Тогда
Продолжить;
КонецЕсли;
diff --git a/SSL/src/CommonModules/ПоставляемыеДанные/Module.bsl b/SSL/src/CommonModules/ПоставляемыеДанные/Module.bsl
index 12eba19bc..4467a56b9 100644
--- a/SSL/src/CommonModules/ПоставляемыеДанные/Module.bsl
+++ b/SSL/src/CommonModules/ПоставляемыеДанные/Module.bsl
@@ -94,9 +94,12 @@
// Приводим дескриптор к каноническому виду.
Если ТипЗнч(Дескриптор) = Тип("Структура") Тогда
- НаАнглийском = Новый Структура("DataType, CreationDate, FileGUID, Properties",
- Дескриптор.ВидДанных, Дескриптор.ДатаДобавления, Дескриптор.ИдентификаторФайла,
- Новый Структура("Property", Новый Массив));
+ НаАнглийском = Новый Структура;
+ НаАнглийском.Вставить("DataType", Дескриптор.ВидДанных);
+ НаАнглийском.Вставить("CreationDate", Дескриптор.ДатаДобавления);
+ НаАнглийском.Вставить("FileGUID", Дескриптор.ИдентификаторФайла);
+ НаАнглийском.Вставить("Properties", Новый Структура("Property", Новый Массив));
+
Если ТипЗнч(Дескриптор.Характеристики) = Тип("Массив") Тогда
Для каждого Характеристика Из Дескриптор.Характеристики Цикл
НаАнглийском.Properties.Property.Добавить(Новый Структура("Code, Value, IsKey",
@@ -644,11 +647,11 @@
КонецФункции
Функция ЗапросПоИменамХарактеристик(Знач ВидДанных, Знач Характеристики)
-//ВЫБРАТЬ Ссылка
-//ИЗ Характеристики
-//ГДЕ (ИмяХарактеристики = '' И ЗначениеХарактеристики = '') ИЛИ ..(N)
-//СГРУППИРОВАТЬ ПО ДанныеИд
-//ИМЕЮЩИЕ Количество(*) = N
+// ВЫБРАТЬ Ссылка
+// ИЗ Характеристики
+// ГДЕ (ИмяХарактеристики = '' И ЗначениеХарактеристики = '') ИЛИ ..(N)
+// СГРУППИРОВАТЬ ПО ДанныеИд
+// ИМЕЮЩИЕ Количество(*) = N
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСервер/Module.bsl b/SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСервер/Module.bsl
index 8ebb6ce19..3ca9a16ed 100644
--- a/SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСервер/Module.bsl
+++ b/SSL/src/CommonModules/ПрефиксацияОбъектовКлиентСервер/Module.bsl
@@ -6,19 +6,19 @@
#Область ПрограммныйИнтерфейс
// Удаляет префикс информационной базы и префикс организации из переданной строки НомерОбъекта.
-// Переменная НомерОбъекта должна соответствовать шаблону: ООГГ-ХХХ...ХХ или ГГ-ХХХ...ХХ, где.
-// ОО - префикс организации;
-// ГГ - префикс информационной базы;
-// "-" - разделитель;
-// ХХХ...ХХ - номер/код объекта.
+// Переменная НомерОбъекта должна соответствовать шаблону: ООГГ-ХХХ...ХХ или ГГ-ХХХ...ХХ, где:
+// ОО - префикс организации;
+// ГГ - префикс информационной базы;
+// "-" - разделитель;
+// ХХХ...ХХ - номер/код объекта.
// Незначащие символы префиксов (символ ноль - "0") также удаляются.
//
// Параметры:
// НомерОбъекта - Строка - номер или код объекта из которого требуется удалить префиксы.
-// УдалитьПрефиксОрганизации - Булево (необязательный) - признак удаления префикса организации; по умолчанию равен
-// Ложь;
-// УдалитьПрефиксИнформационнойБазы - Булево (необязательный) - признак удаления префикса информационной базы; по
-// умолчанию равен Ложь;
+// УдалитьПрефиксОрганизации - Булево (необязательный) - признак удаления префикса организации;
+// по умолчанию равен Ложь.
+// УдалитьПрефиксИнформационнойБазы - Булево (необязательный) - признак удаления префикса информационной базы;
+// по умолчанию равен Ложь.
//
// Примеры:
// УдалитьПрефиксыИзНомераОбъекта("0ФГЛ-000001234", Истина, Истина) = "000001234"
@@ -146,9 +146,8 @@
Символ = Сред(НомерПолный, Индекс, 1);
Если Найти(СтрокаЦифровыхСимволов, Символ) > 0 Тогда
-
- Номер = Номер + Символ;
-
+ Номер = Сред(НомерПолный, Индекс);
+ Прервать;
КонецЕсли;
КонецЦикла;
diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлы/Module.bsl b/SSL/src/CommonModules/ПрисоединенныеФайлы/Module.bsl
index 866a10c62..eb222a5ce 100644
--- a/SSL/src/CommonModules/ПрисоединенныеФайлы/Module.bsl
+++ b/SSL/src/CommonModules/ПрисоединенныеФайлы/Module.bsl
@@ -15,13 +15,13 @@
//
Функция ПолучитьДвоичныеДанныеФайла(Знач ПрисоединенныйФайл) Экспорт
+ ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла", "ПрисоединенныйФайл",
+ ПрисоединенныйФайл, Метаданные.РегистрыСведений.ПрисоединенныеФайлы.Измерения.ПрисоединенныйФайл.Тип);
+
ФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект();
-
- Если ФайлОбъект = Неопределено Тогда
- ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Не найден присоединенный файл ""%1"".'"),
- Строка(ПрисоединенныйФайл));
- КонецЕсли;
+ ОбщегоНазначенияКлиентСервер.Проверить(ФайлОбъект <> Неопределено,
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не найден присоединенный файл ""%1"" (%2)'"),
+ Строка(ПрисоединенныйФайл), ПрисоединенныйФайл.Метаданные()));
УстановитьПривилегированныйРежим(Истина);
@@ -42,6 +42,18 @@
Если Выборка.Следующий() Тогда
Возврат Выборка.ХранимыйФайл.Получить();
Иначе
+ // Запись в журнал регистрации.
+ СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Двоичные данные файла отсутствуют в регистре ПрисоединенныеФайлы
+ |
+ |Ссылка на файл: ""%1"".'"),
+ ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл));
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Открытие файла'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка,
+ Метаданные.Справочники[ПрисоединенныйФайл.Метаданные().Имя],
+ ПрисоединенныйФайл,
+ СообщениеОбОшибке);
+
ВызватьИсключение ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаФайлНеНайденВХранилищеФайлов(
ФайлОбъект.Наименование + "." + ФайлОбъект.Расширение, Ложь);
КонецЕсли;
@@ -49,13 +61,11 @@
ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(ФайлОбъект.Том) + ФайлОбъект.ПутьКФайлу;
Попытка
- Возврат Новый ДвоичныеДанные(ПолныйПуть)
+ Возврат Новый ДвоичныеДанные(ПолныйПуть);
Исключение
// Запись в журнал регистрации.
СообщениеОбОшибке = ТекстОшибкиПриПолученииФайла(ИнформацияОбОшибке(), ПрисоединенныйФайл);
- ЗаписьЖурналаРегистрации(
- НСтр("ru = 'Файлы.Получение файла из тома'",
- ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Получение файла из тома'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка,
Метаданные.Справочники[ПрисоединенныйФайл.Метаданные().Имя],
ПрисоединенныйФайл,
@@ -80,6 +90,8 @@
// ПолучатьСсылкуНаДвоичныеДанные - Булево - если передать Ложь, то ссылка на двоичные данные
// не будет получена, что существенно ускорит выполнение для больших двоичных данных.
//
+// ДляРедактирования - Булево - если указать Истина, то свободный файл будет захвачен для редактирования.
+//
// Возвращаемое значение:
// Структура - со свойствами:
// * СсылкаНаДвоичныеДанныеФайла - Строка - адрес во временном хранилище.
@@ -97,14 +109,20 @@
//
Функция ПолучитьДанныеФайла(Знач ПрисоединенныйФайл,
Знач ИдентификаторФормы = Неопределено,
- Знач ПолучатьСсылкуНаДвоичныеДанные = Истина) Экспорт
+ Знач ПолучатьСсылкуНаДвоичныеДанные = Истина,
+ Знач ДляРедактирования = Ложь) Экспорт
+ ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ПрисоединенныеФайлы.ПолучитьДанныеФайла", "ПрисоединенныйФайл",
+ ПрисоединенныйФайл, Метаданные.РегистрыСведений.ПрисоединенныеФайлы.Измерения.ПрисоединенныйФайл.Тип);
+
ФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект();
+ ОбщегоНазначенияКлиентСервер.Проверить(ФайлОбъект <> Неопределено,
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не найден присоединенный файл ""%1"" (%2)'"),
+ Строка(ПрисоединенныйФайл), ПрисоединенныйФайл.Метаданные()));
- Если ФайлОбъект = Неопределено Тогда
- ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Не найден присоединенный файл ""%1"".'"),
- Строка(ПрисоединенныйФайл));
+ Если ДляРедактирования И Не ЗначениеЗаполнено(ФайлОбъект.Редактирует) Тогда
+ ФайлОбъект.Заблокировать();
+ ПрисоединенныеФайлыСлужебный.ЗанятьФайлДляРедактированияСервер(ФайлОбъект);
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
@@ -113,80 +131,39 @@
Если ПолучатьСсылкуНаДвоичныеДанные Тогда
- Если ФайлОбъект.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда
- ТекстЗапроса =
- "ВЫБРАТЬ
- | ПрисоединенныеФайлы.ХранимыйФайл
- |ИЗ
- | РегистрСведений.ПрисоединенныеФайлы КАК ПрисоединенныеФайлы
- |ГДЕ
- | ПрисоединенныеФайлы.ПрисоединенныйФайл = &ПрисоединенныйФайл";
-
- Запрос = Новый Запрос(ТекстЗапроса);
- Запрос.УстановитьПараметр("ПрисоединенныйФайл", ПрисоединенныйФайл);
-
- Выборка = Запрос.Выполнить().Выбрать();
- ДвоичныеДанные = Неопределено;
- Если Выборка.Следующий() Тогда
- ДвоичныеДанные = Выборка.ХранимыйФайл.Получить();
- КонецЕсли;
-
- Если ТипЗнч(ИдентификаторФормы) = Тип("УникальныйИдентификатор") Тогда
- СсылкаНаДвоичныеДанныеФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ИдентификаторФормы);
- Иначе
- СсылкаНаДвоичныеДанныеФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
- КонецЕсли;
+ ДвоичныеДанные = ПолучитьДвоичныеДанныеФайла(ПрисоединенныйФайл);
+ Если ТипЗнч(ИдентификаторФормы) = Тип("УникальныйИдентификатор") Тогда
+ СсылкаНаДвоичныеДанныеФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ИдентификаторФормы);
Иначе
- ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(ФайлОбъект.Том) + ФайлОбъект.ПутьКФайлу;
-
- Попытка
- ДвоичныеДанные = Новый ДвоичныеДанные(ПолныйПуть);
- Если ТипЗнч(ИдентификаторФормы) = Тип("УникальныйИдентификатор") Тогда
- СсылкаНаДвоичныеДанныеФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ИдентификаторФормы);
- Иначе
- СсылкаНаДвоичныеДанныеФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
- КонецЕсли;
- Исключение
- СообщениеОбОшибке = ТекстОшибкиПриПолученииФайла(ИнформацияОбОшибке(), ПрисоединенныйФайл);
- ЗаписьЖурналаРегистрации(
- НСтр("ru = 'Файлы.Открытие файла'",
- ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
- УровеньЖурналаРегистрации.Ошибка,
- Метаданные.Справочники[ПрисоединенныйФайл.Метаданные().Имя],
- ПрисоединенныйФайл,
- СообщениеОбОшибке);
-
- ВызватьИсключение ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаФайлНеНайденВХранилищеФайлов(
- ФайлОбъект.Наименование + "." + ФайлОбъект.Расширение);
- КонецПопытки;
+ СсылкаНаДвоичныеДанныеФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
КонецЕсли;
КонецЕсли;
- ДополнительнаяИнформация = Новый Структура;
- ДополнительнаяИнформация.Вставить("СсылкаНаДвоичныеДанныеФайла", СсылкаНаДвоичныеДанныеФайла);
- ДополнительнаяИнформация.Вставить("ОтносительныйПуть", ПолучитьИдентификаторОбъекта(ФайлОбъект.ВладелецФайла) + "\");
- ДополнительнаяИнформация.Вставить("ДатаМодификацииУниверсальная", ФайлОбъект.ДатаМодификацииУниверсальная);
- ДополнительнаяИнформация.Вставить("ИмяФайла", ФайлОбъект.Наименование + "." + ФайлОбъект.Расширение);
- ДополнительнаяИнформация.Вставить("Наименование", ФайлОбъект.Наименование);
- ДополнительнаяИнформация.Вставить("Расширение", ФайлОбъект.Расширение);
- ДополнительнаяИнформация.Вставить("Размер", ФайлОбъект.Размер);
- ДополнительнаяИнформация.Вставить("Редактирует", ФайлОбъект.Редактирует);
- ДополнительнаяИнформация.Вставить("ПодписанЭП", ФайлОбъект.ПодписанЭП);
- ДополнительнаяИнформация.Вставить("Зашифрован", ФайлОбъект.Зашифрован);
- ДополнительнаяИнформация.Вставить("ФайлРедактируется", ЗначениеЗаполнено(ФайлОбъект.Редактирует));
- ДополнительнаяИнформация.Вставить("ФайлРедактируетТекущийПользователь",
- ?(ДополнительнаяИнформация.ФайлРедактируется, ФайлОбъект.Редактирует = Пользователи.АвторизованныйПользователь(), Ложь) );
+ Результат = Новый Структура;
+ Результат.Вставить("СсылкаНаДвоичныеДанныеФайла", СсылкаНаДвоичныеДанныеФайла);
+ Результат.Вставить("ОтносительныйПуть", ПолучитьИдентификаторОбъекта(ФайлОбъект.ВладелецФайла) + "\");
+ Результат.Вставить("ДатаМодификацииУниверсальная", ФайлОбъект.ДатаМодификацииУниверсальная);
+ Результат.Вставить("ИмяФайла", ФайлОбъект.Наименование + "." + ФайлОбъект.Расширение);
+ Результат.Вставить("Наименование", ФайлОбъект.Наименование);
+ Результат.Вставить("Расширение", ФайлОбъект.Расширение);
+ Результат.Вставить("Размер", ФайлОбъект.Размер);
+ Результат.Вставить("Редактирует", ФайлОбъект.Редактирует);
+ Результат.Вставить("ПодписанЭП", ФайлОбъект.ПодписанЭП);
+ Результат.Вставить("Зашифрован", ФайлОбъект.Зашифрован);
+ Результат.Вставить("ФайлРедактируется", ЗначениеЗаполнено(ФайлОбъект.Редактирует));
+ Результат.Вставить("ФайлРедактируетТекущийПользователь",
+ ?(Результат.ФайлРедактируется, ФайлОбъект.Редактирует = Пользователи.АвторизованныйПользователь(), Ложь) );
Если ФайлОбъект.Зашифрован Тогда
МассивСертификатовШифрования = Новый Массив;
Для Каждого СтрокаТЧ Из ФайлОбъект.СертификатыШифрования Цикл
МассивСертификатовШифрования.Добавить(Новый Структура("Отпечаток, Представление", СтрокаТЧ.Отпечаток, СтрокаТЧ.Представление));
КонецЦикла;
- ДополнительнаяИнформация.Вставить("МассивСертификатовШифрования", МассивСертификатовШифрования);
+ Результат.Вставить("МассивСертификатовШифрования", МассивСертификатовШифрования);
КонецЕсли;
- Возврат ДополнительнаяИнформация;
+ Возврат Результат;
КонецФункции
@@ -273,9 +250,8 @@
Если Не Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(НоваяСсылкаНаФайл))
Или Не ЗначениеЗаполнено(НоваяСсылкаНаФайл) Тогда
- ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Ошибка при добавлении присоединенного файла.
- |Ссылка на новый файл не заполнена.'"));
+ ВызватьИсключение НСтр("ru = 'Ошибка при добавлении присоединенного файла.
+ |Ссылка на новый файл не заполнена.'");
КонецЕсли;
ИмяСправочника = ПрисоединенныеФайлыСлужебный.ИмяСправочникаХраненияФайлов(
@@ -413,8 +389,9 @@
//
Процедура ОбновитьПрисоединенныйФайл(Знач ПрисоединенныйФайл, Знач ИнформацияОФайле) Экспорт
- Перем Отказ;
-
+ ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла", "ПрисоединенныйФайл",
+ ПрисоединенныйФайл, Метаданные.РегистрыСведений.ПрисоединенныеФайлы.Измерения.ПрисоединенныйФайл.Тип);
+
РеквизитыЗначения = Новый Структура;
Если ИнформацияОФайле.Свойство("ИмяБезРасширения") И ЗначениеЗаполнено(ИнформацияОФайле.ИмяБезРасширения) Тогда
@@ -733,6 +710,9 @@
ПрисоединенныйФайлСсылка = ПрисоединенныйФайл.Ссылка;
КонецЕсли;
+ ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ПрисоединенныеФайлы.ДобавитьПодписьКФайлу", "ПрисоединенныйФайл",
+ ПрисоединенныйФайлСсылка, Метаданные.РегистрыСведений.ПрисоединенныеФайлы.Измерения.ПрисоединенныйФайл.Тип);
+
Если ЗначениеЗаполнено(СтруктураРеквизитов.Редактирует) Тогда
ВызватьИсключение ФайловыеФункцииСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗанятогоФайла(ПрисоединенныйФайлСсылка);
КонецЕсли;
diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлыКлиент/Module.bsl b/SSL/src/CommonModules/ПрисоединенныеФайлыКлиент/Module.bsl
index 7e4c0c82f..a83139b68 100644
--- a/SSL/src/CommonModules/ПрисоединенныеФайлыКлиент/Module.bsl
+++ b/SSL/src/CommonModules/ПрисоединенныеФайлыКлиент/Module.bsl
@@ -22,7 +22,7 @@
Параметры.Вставить("ДляРедактирования", ДляРедактирования);
ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьФайлРасширениеПредложено", ПрисоединенныеФайлыСлужебныйКлиент, Параметры);
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения);
+ ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения);
КонецПроцедуры
@@ -49,7 +49,7 @@
Параметры.Вставить("Фильтр", Фильтр);
ОписаниеОповещения = Новый ОписаниеОповещения("ДобавитьФайлыРасширениеПредложено", ПрисоединенныеФайлыСлужебныйКлиент, Параметры);
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения);
+ ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения);
КонецПроцедуры
@@ -134,114 +134,6 @@
КонецПроцедуры
-// Помещает данные файла с сервера в рабочий каталог на диске.
-// Требуется наличие подключенного расширения для работы с файлами.
-//
-// Параметры:
-// АдресДвоичныхДанныхФайла - Строка - адрес во временном хранилище с двоичными данными,
-// либо навигационная ссылка на данные файла в ИБ.
-// ОтносительныйПуть - Строка - путь к файлу относительно рабочего каталога.
-// ДатаМодификацииУниверсальная - Дата - универсальная дата модификации файла.
-// ИмяФайла - Строка - имя файла (с расширением).
-// РабочийКаталогПользователя - Строка - путь к рабочему каталогу.
-// ПолноеИмяФайлаНаКлиенте - Строка - (возвращаемое значение) устанавливается при успешном выполнении.
-//
-// Возвращаемое значение:
-// Булево - если Истина, тогда файл получен и сохранен успешно, иначе Ложь.
-//
-Функция ПолучитьФайлВРабочийКаталог(Знач АдресДвоичныхДанныхФайла,
- Знач ОтносительныйПуть,
- Знач ДатаМодификацииУниверсальная,
- Знач ИмяФайла,
- Знач РабочийКаталогПользователя = "",
- ПолноеИмяФайлаНаКлиенте) Экспорт
-
- Если РабочийКаталогПользователя = Неопределено
- ИЛИ ПустаяСтрока(РабочийКаталогПользователя) Тогда
-
- Возврат Ложь;
- КонецЕсли;
-
- КаталогСохранения = РабочийКаталогПользователя + ОтносительныйПуть;
-
- Попытка
- СоздатьКаталог(КаталогСохранения);
- Исключение
- СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
- СообщениеОбОшибке = НСтр("ru = 'Ошибка создания каталога на диске:'") + " " + СообщениеОбОшибке;
- ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СообщениеОбОшибке);
- Возврат Ложь;
- КонецПопытки;
-
- Файл = Новый Файл(КаталогСохранения + ИмяФайла);
- Если Файл.Существует() Тогда
- Файл.УстановитьТолькоЧтение(Ложь);
- УдалитьФайлы(КаталогСохранения + ИмяФайла);
- КонецЕсли;
-
- ПолучаемыйФайл = Новый ОписаниеПередаваемогоФайла(КаталогСохранения + ИмяФайла, АдресДвоичныхДанныхФайла);
- ПолучаемыеФайлы = Новый Массив;
- ПолучаемыеФайлы.Добавить(ПолучаемыйФайл);
-
- ПолученныеФайлы = Новый Массив;
-
- Если ПолучитьФайлы(ПолучаемыеФайлы, ПолученныеФайлы, , Ложь) Тогда
- ПолноеИмяФайлаНаКлиенте = ПолученныеФайлы[0].Имя;
- Файл = Новый Файл(ПолноеИмяФайлаНаКлиенте);
- Файл.УстановитьУниверсальноеВремяИзменения(ДатаМодификацииУниверсальная);
- Возврат Истина;
- КонецЕсли;
-
- Возврат Ложь;
-
-КонецФункции
-
-// Помещает файл с диска клиента во временное хранилище.
-//
-// Параметры:
-// ПутьКФайлу - Строка - полный путь к файлу.
-// ИдентификаторФормы - УникальныйИдентификатор - идентификатор управляемой формы.
-//
-// Возвращаемое значение:
-// Структура - данные файла, помещенного во временное хранилище.
-//
-Функция ПоместитьФайлВХранилище(Знач ПутьКФайлу, Знач ИдентификаторФормы) Экспорт
-
- Результат = Новый Структура;
- Результат.Вставить("ФайлПомещенВХранилище", Ложь);
-
- Файл = Новый Файл(ПутьКФайлу);
- ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла(Файл);
-
- АдресВременногоХранилищаТекста = "";
- Если Не ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами().ИзвлекатьТекстыФайловНаСервере Тогда
- АдресВременногоХранилищаТекста = ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище(ПутьКФайлу, ИдентификаторФормы);
- КонецЕсли;
-
- ПомещаемыеФайлы = Новый Массив;
- ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ПутьКФайлу));
- ПомещенныеФайлы = Новый Массив;
-
- Если НЕ ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ИдентификаторФормы) Тогда
- ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
- СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Ошибка при помещении файла
- |""%1""
- |во временное хранилище.'"),
- ПутьКФайлу) );
- Возврат Результат;
- КонецЕсли;
-
- Результат.Вставить("ФайлПомещенВХранилище", Истина);
- Результат.Вставить("ДатаМодификацииУниверсальная", Файл.ПолучитьУниверсальноеВремяИзменения());
- Результат.Вставить("АдресФайлаВоВременномХранилище", ПомещенныеФайлы[0].Хранение);
- Результат.Вставить("АдресВременногоХранилищаТекста", АдресВременногоХранилищаТекста);
- Результат.Вставить("Расширение", Прав(Файл.Расширение, СтрДлина(Файл.Расширение)-1));
-
- Возврат Результат;
-
-КонецФункции
-
// Сохраняет файл в каталог на диске.
// Так же используется, как вспомогательная функция при сохранении файла с ЭП.
//
@@ -257,7 +149,7 @@
Параметры.Вставить("ДанныеФайла", ДанныеФайла);
ОписаниеОповещения = Новый ОписаниеОповещения("СохранитьФайлКакРасширениеПредложено", ПрисоединенныеФайлыСлужебныйКлиент, Параметры);
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения);
+ ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения);
КонецПроцедуры
@@ -340,17 +232,115 @@
// См. эту функцию в модуле ПрисоединенныеФайлы.
Функция ПолучитьДанныеФайла(Знач ПрисоединенныйФайл,
Знач ИдентификаторФормы = Неопределено,
- Знач ПолучатьСсылкуНаДвоичныеДанные = Истина) Экспорт
+ Знач ПолучатьСсылкуНаДвоичныеДанные = Истина,
+ Знач ДляРедактирования = Ложь) Экспорт
Возврат ПрисоединенныеФайлыСлужебныйВызовСервера.ПолучитьДанныеФайла(
- ПрисоединенныйФайл, ИдентификаторФормы, ПолучатьСсылкуНаДвоичныеДанные);
+ ПрисоединенныйФайл, ИдентификаторФормы, ПолучатьСсылкуНаДвоичныеДанные, ДляРедактирования);
КонецФункции
+// Получает файл из хранилища файлов в рабочий каталог пользователя.
+// Аналог интерактивного действия Просмотреть или Редактировать без открытия полученного файла.
+// Свойство ТолькоПросмотр полученного файла будет установлено в зависимости от того захвачен
+// файл для редактирования или нет. Если не захвачен - устанавливается только просмотр.
+// Если в рабочем каталоге уже существует файл, тогда он будет удален и заменен файлом,
+// полученным из хранилища файлов.
+//
+// Параметры:
+// Оповещение - ОписаниеОповещения - оповещение, которое выполняется после получения файла в
+// рабочий каталог пользователя. В качестве результата возвращается Структура со свойствами:
+// * ПолноеИмяФайла - Строка - полное имя файла (с путем).
+// * ОписаниеОшибки - Строка - текст ошибки, если получить файл не удалось.
+//
+// ПрисоединенныйФайл - СправочникСсылка - ссылка на справочник с именем "*ПрисоединенныеФайлы".
+// ИдентификаторФормы - УникальныйИдентификатор - идентификатор управляемой формы.
+//
+// ДополнительныеПараметры - Неопределено - использовать значения по умолчанию.
+// - Структура - с необязательными свойствами:
+// * ДляРедактирования - Булево - начальное значение Ложь. Если Истина,
+// тогда файл будет захвачен для редактирования.
+// * ДанныеФайла - Структура - свойства файла, которые можно передать для ускорения
+// если они ранее были получены на клиент с сервера.
+//
+Процедура ПолучитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры = Неопределено) Экспорт
+
+ ПрисоединенныеФайлыСлужебныйКлиент.ПолучитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры);
+
+КонецПроцедуры
+
+// Помещает файл из рабочего каталога пользователя в хранилище файлов.
+// Аналог интерактивного действия Закончить редактирование.
+//
+// Параметры:
+// Оповещение - ОписаниеОповещения - оповещение, которое выполняется после помещения файла в
+// хранилище файлов. В качестве результата возвращается Структура со свойствами:
+// * ОписаниеОшибки - Строка - текст ошибки, если поместить файл не удалось.
+//
+// ПрисоединенныйФайл - СправочникСсылка - ссылка на справочник с именем "*ПрисоединенныеФайлы".
+// ИдентификаторФормы - УникальныйИдентификатор - идентификатор управляемой формы.
+//
+// ДополнительныеПараметры - Неопределено - использовать значения по умолчанию.
+// - Структура - с необязательными свойствами:
+// * ПолноеИмяФайла - Строка - если заполнено, то указанный файл будет помещен в рабочий каталог
+// пользователя, а затем в хранилище файлов.
+// * ДанныеФайла - Структура - свойства файла, которые можно передать для ускорения
+// если они ранее были получены на клиент с сервера.
+//
+Процедура ПоместитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры = Неопределено) Экспорт
+
+ ПрисоединенныеФайлыСлужебныйКлиент.ПоместитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры);
+
+КонецПроцедуры
+
////////////////////////////////////////////////////////////////////////////////
// Устаревшие процедуры и функции.
-// Устарела. Следует использовать ПоместитьФайлВХранилище.
+// Устарела. Следует использовать ПолучитьПрисоединенныйФайл.
+// Требуется наличие подключенного расширения для работы с файлами.
+//
+// Параметры:
+// АдресДвоичныхДанныхФайла - Строка - адрес во временном хранилище с двоичными данными,
+// либо навигационная ссылка на данные файла в ИБ.
+// ОтносительныйПуть - Строка - путь к файлу относительно рабочего каталога.
+// ДатаМодификацииУниверсальная - Дата - универсальная дата модификации файла.
+// ИмяФайла - Строка - имя файла (с расширением).
+// РабочийКаталогПользователя - Строка - путь к рабочему каталогу.
+// ПолноеИмяФайлаНаКлиенте - Строка - (возвращаемое значение) устанавливается при успешном выполнении.
+//
+// Возвращаемое значение:
+// Булево - если Истина, тогда файл получен и сохранен успешно, иначе Ложь.
+//
+Функция ПолучитьФайлВРабочийКаталог(Знач АдресДвоичныхДанныхФайла,
+ Знач ОтносительныйПуть,
+ Знач ДатаМодификацииУниверсальная,
+ Знач ИмяФайла,
+ Знач РабочийКаталогПользователя = "",
+ ПолноеИмяФайлаНаКлиенте) Экспорт
+
+ Возврат ПрисоединенныеФайлыСлужебныйКлиент.ПолучитьФайлВРабочийКаталог(
+ АдресДвоичныхДанныхФайла, ОтносительныйПуть, ДатаМодификацииУниверсальная,
+ ИмяФайла, РабочийКаталогПользователя, ПолноеИмяФайлаНаКлиенте);
+
+КонецФункции
+
+// Устарела. Следует использовать ПоместитьПрисоединенныйФайл.
+// Требуется наличие подключенного расширения для работы с файлами.
+//
+// Параметры:
+// ПутьКФайлу - Строка - полный путь к файлу.
+// ИдентификаторФормы - УникальныйИдентификатор - идентификатор управляемой формы.
+//
+// Возвращаемое значение:
+// Структура - данные файла, помещенного во временное хранилище.
+//
+Функция ПоместитьФайлВХранилище(Знач ПутьКФайлу, Знач ИдентификаторФормы) Экспорт
+
+ Возврат ПрисоединенныеФайлыСлужебныйКлиент.ПоместитьФайлВХранилище(ПутьКФайлу, ИдентификаторФормы);
+
+КонецФункции
+
+// Устарела. Следует использовать НачатьПолучениеПрисоединенногоФайла.
//
// Помещает файл с диска клиента во временное хранилище.
//
diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйВызовСервера/Module.bsl
index 6966ec016..f5c16c0f6 100644
--- a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйВызовСервера/Module.bsl
+++ b/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйВызовСервера/Module.bsl
@@ -37,10 +37,11 @@
// См. эту функцию в модуле ПрисоединенныеФайлы.
Функция ПолучитьДанныеФайла(Знач ПрисоединенныйФайл,
Знач ИдентификаторФормы = Неопределено,
- Знач ПолучатьСсылкуНаДвоичныеДанные = Истина) Экспорт
+ Знач ПолучатьСсылкуНаДвоичныеДанные = Истина,
+ Знач ДляРедактирования = Ложь) Экспорт
Возврат ПрисоединенныеФайлы.ПолучитьДанныеФайла(
- ПрисоединенныйФайл, ИдентификаторФормы, ПолучатьСсылкуНаДвоичныеДанные);
+ ПрисоединенныйФайл, ИдентификаторФормы, ПолучатьСсылкуНаДвоичныеДанные, ДляРедактирования);
КонецФункции
diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйКлиент/Module.bsl
index 6ce17c22b..b5301b863 100644
--- a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйКлиент/Module.bsl
+++ b/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйКлиент/Module.bsl
@@ -5,6 +5,92 @@
#Область СлужебныеПроцедурыИФункции
+// См. одноименную функцию в общем модуле ПрисоединенныеФайлыКлиент.
+Функция ПолучитьФайлВРабочийКаталог(Знач АдресДвоичныхДанныхФайла,
+ Знач ОтносительныйПуть,
+ Знач ДатаМодификацииУниверсальная,
+ Знач ИмяФайла,
+ Знач РабочийКаталогПользователя,
+ ПолноеИмяФайлаНаКлиенте) Экспорт
+
+ Если РабочийКаталогПользователя = Неопределено
+ ИЛИ ПустаяСтрока(РабочийКаталогПользователя) Тогда
+
+ Возврат Ложь;
+ КонецЕсли;
+
+ КаталогСохранения = РабочийКаталогПользователя + ОтносительныйПуть;
+
+ Попытка
+ СоздатьКаталог(КаталогСохранения);
+ Исключение
+ СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
+ СообщениеОбОшибке = НСтр("ru = 'Ошибка создания каталога на диске:'") + " " + СообщениеОбОшибке;
+ ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СообщениеОбОшибке);
+ Возврат Ложь;
+ КонецПопытки;
+
+ Файл = Новый Файл(КаталогСохранения + ИмяФайла);
+ Если Файл.Существует() Тогда
+ Файл.УстановитьТолькоЧтение(Ложь);
+ УдалитьФайлы(КаталогСохранения + ИмяФайла);
+ КонецЕсли;
+
+ ПолучаемыйФайл = Новый ОписаниеПередаваемогоФайла(КаталогСохранения + ИмяФайла, АдресДвоичныхДанныхФайла);
+ ПолучаемыеФайлы = Новый Массив;
+ ПолучаемыеФайлы.Добавить(ПолучаемыйФайл);
+
+ ПолученныеФайлы = Новый Массив;
+
+ Если ПолучитьФайлы(ПолучаемыеФайлы, ПолученныеФайлы, , Ложь) Тогда
+ ПолноеИмяФайлаНаКлиенте = ПолученныеФайлы[0].Имя;
+ Файл = Новый Файл(ПолноеИмяФайлаНаКлиенте);
+ Файл.УстановитьУниверсальноеВремяИзменения(ДатаМодификацииУниверсальная);
+ Возврат Истина;
+ КонецЕсли;
+
+ Возврат Ложь;
+
+КонецФункции
+
+// См. одноименную функцию в общем модуле ПрисоединенныеФайлыКлиент.
+Функция ПоместитьФайлВХранилище(Знач ПутьКФайлу, Знач ИдентификаторФормы) Экспорт
+
+ Результат = Новый Структура;
+ Результат.Вставить("ФайлПомещенВХранилище", Ложь);
+
+ Файл = Новый Файл(ПутьКФайлу);
+ ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла(Файл);
+
+ АдресВременногоХранилищаТекста = "";
+ Если Не ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами().ИзвлекатьТекстыФайловНаСервере Тогда
+ АдресВременногоХранилищаТекста = ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище(ПутьКФайлу, ИдентификаторФормы);
+ КонецЕсли;
+
+ ПомещаемыеФайлы = Новый Массив;
+ ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ПутьКФайлу));
+ ПомещенныеФайлы = Новый Массив;
+
+ Если НЕ ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ИдентификаторФормы) Тогда
+ ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Ошибка при помещении файла
+ |""%1""
+ |во временное хранилище.'"),
+ ПутьКФайлу) );
+ Возврат Результат;
+ КонецЕсли;
+
+ Результат.Вставить("ФайлПомещенВХранилище", Истина);
+ Результат.Вставить("ДатаМодификацииУниверсальная", Файл.ПолучитьУниверсальноеВремяИзменения());
+ Результат.Вставить("АдресФайлаВоВременномХранилище", ПомещенныеФайлы[0].Хранение);
+ Результат.Вставить("АдресВременногоХранилищаТекста", АдресВременногоХранилищаТекста);
+ Результат.Вставить("Расширение", Прав(Файл.Расширение, СтрДлина(Файл.Расширение)-1));
+
+ Возврат Результат;
+
+КонецФункции
+
// Добавляет файлы перетаскиванием в список файлов.
//
// Параметры:
@@ -77,11 +163,11 @@
ИмяФайла = ВыбранноеИмяФайла;
ВладелецФайла = ДополнительныеПараметры.ВладелецФайла;
- СтрокиПути = ОбщегоНазначенияКлиентСервер.РазложитьСтрокуПоТочкамИСлэшам(ИмяФайла);
+ СтруктураПути = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ВыбранноеИмяФайла);
- Если СтрокиПути.Количество() >= 2 Тогда
- Расширение = СтрокиПути[СтрокиПути.Количество()-1];
- ИмяБезРасширения = СтрокиПути[СтрокиПути.Количество()-2];
+ Если Не ПустаяСтрока(СтруктураПути.Расширение) Тогда
+ Расширение = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураПути.Расширение);
+ ИмяБезРасширения = СтруктураПути.ИмяБезРасширения;
Иначе
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Ошибка при помещении файла
@@ -127,7 +213,7 @@
Параметры.Вставить("ИдентификаторФормы", ИдентификаторФормы);
ОписаниеОповещения = Новый ОписаниеОповещения("ПоместитьРедактируемыйФайлНаДискеВХранилищеРасширениеПредложено", ЭтотОбъект, Параметры);
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения);
+ ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения);
КонецПроцедуры
@@ -144,7 +230,7 @@
ИнформацияОФайле = Неопределено;
Файл = Новый Файл(ПолноеИмяФайлаНаКлиенте);
Если Файл.Существует() Тогда
- ИнформацияОФайле = ПрисоединенныеФайлыКлиент.ПоместитьФайлВХранилище(ПолноеИмяФайлаНаКлиенте, ИдентификаторФормы);
+ ИнформацияОФайле = ПоместитьФайлВХранилище(ПолноеИмяФайлаНаКлиенте, ИдентификаторФормы);
Иначе
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Файл не найден в рабочем каталоге.'"));
@@ -211,7 +297,7 @@
Параметры.Вставить("ИдентификаторФормы", ИдентификаторФормы);
ОписаниеОповещения = Новый ОписаниеОповещения("ВыбратьФайлНаДискеИПоместитьВХранилищеРасширениеПредложено", ЭтотОбъект, Параметры);
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения);
+ ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения);
КонецПроцедуры
@@ -231,12 +317,12 @@
ИнформацияОФайле = Неопределено;
Если ВыборФайла.Выбрать() Тогда
- ИнформацияОФайле = ПрисоединенныеФайлыКлиент.ПоместитьФайлВХранилище(ВыборФайла.ПолноеИмяФайла, ИдентификаторФормы);
+ ИнформацияОФайле = ПоместитьФайлВХранилище(ВыборФайла.ПолноеИмяФайла, ИдентификаторФормы);
КонецЕсли;
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ИнформацияОФайле);
Иначе
- ОписаниеОповещения = Новый ОписаниеОповещения("ВыбратьФайлНаДискеИПоместитьВХранилищеВыполненоПомещение", ЭтотОбъект);
+ ОписаниеОповещения = Новый ОписаниеОповещения("ВыбратьФайлНаДискеИПоместитьВХранилищеВыполненоПомещение", ЭтотОбъект, ДополнительныеПараметры);
ПоместитьФайлНаДискеВХранилищеВеб(ОписаниеОповещения, ДанныеФайла, ИдентификаторФормы);
КонецЕсли;
@@ -282,14 +368,14 @@
Возврат;
КонецЕсли;
- СтрокиПути = ОбщегоНазначенияКлиентСервер.РазложитьСтрокуПоТочкамИСлэшам(ВыбранноеИмяФайла);
+ СтруктураПути = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ВыбранноеИмяФайла);
- Если СтрокиПути.Количество() >= 2 Тогда
- НовоеИмя = СтрокиПути[СтрокиПути.Количество()-2];
- НовоеРасширение = СтрокиПути[СтрокиПути.Количество()-1];
+ Если Не ПустаяСтрока(СтруктураПути.Расширение) Тогда
+ НовоеИмя = СтруктураПути.ИмяБезРасширения;
+ НовоеРасширение = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураПути.Расширение);
ИмяФайла = НовоеИмя + "." + НовоеРасширение;
- ИначеЕсли СтрокиПути.Количество() = 1 Тогда
- НовоеИмя = СтрокиПути[0];
+ ИначеЕсли Не ПустаяСтрока(СтруктураПути.ИмяБезРасширения) Тогда
+ НовоеИмя = СтруктураПути.ИмяБезРасширения;
НовоеРасширение = "";
ИмяФайла = НовоеИмя;
КонецЕсли;
@@ -297,6 +383,7 @@
ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьРасширениеФайлаДляЗагрузки(НовоеРасширение);
ИнформацияОФайле = Новый Структура;
+ ИнформацияОФайле.Вставить("ФайлПомещенВХранилище", Истина);
ИнформацияОФайле.Вставить("ДатаМодификацииУниверсальная", Неопределено);
ИнформацияОФайле.Вставить("АдресФайлаВоВременномХранилище", АдресВременногоХранилищаФайла);
ИнформацияОФайле.Вставить("АдресВременногоХранилищаТекста", "");
@@ -319,7 +406,7 @@
Параметры.Вставить("ДанныеФайла", ДанныеФайла);
ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьКаталогСФайломРасширениеПредложено", ЭтотОбъект, Параметры);
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения);
+ ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения);
КонецПроцедуры
@@ -370,7 +457,7 @@
ПолныйПуть = ДополнительныеПараметры.ПолныйПуть;
ПолноеИмяФайлаНаКлиенте = "";
- ПрисоединенныеФайлыКлиент.ПолучитьФайлВРабочийКаталог(
+ ПолучитьФайлВРабочийКаталог(
ДанныеФайла.СсылкаНаДвоичныеДанныеФайла,
ДанныеФайла.ОтносительныйПуть,
ДанныеФайла.ДатаМодификацииУниверсальная,
@@ -382,6 +469,326 @@
КонецПроцедуры
+
+// См. одноименную процедуру в общем модуле ПрисоединенныеФайлыКлиент.
+Процедура ПоместитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры = Неопределено) Экспорт
+
+ Если ДополнительныеПараметры = Неопределено Тогда
+ ДополнительныеПараметры = Новый Структура;
+ КонецЕсли;
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл);
+ Контекст.Вставить("ИдентификаторФормы", ИдентификаторФормы);
+ Контекст.Вставить("ДанныеФайла", Неопределено);
+ Контекст.Вставить("ПолноеИмяПомещаемогоФайла", Неопределено);
+ ДополнительныеПараметры.Свойство("ДанныеФайла", Контекст.ДанныеФайла);
+ ДополнительныеПараметры.Свойство("ПолноеИмяФайла", Контекст.ПолноеИмяПомещаемогоФайла);
+
+ Если ТипЗнч(Контекст.ДанныеФайла) <> Тип("Структура") Тогда
+ Контекст.Вставить("ДанныеФайла", ПрисоединенныеФайлыСлужебныйВызовСервера.ПолучитьДанныеФайла(
+ Контекст.ПрисоединенныйФайл, Контекст.ИдентификаторФормы, Ложь));
+ КонецЕсли;
+
+ Контекст.Вставить("ЗаголовокОшибки",
+ НСтр("ru = 'Не удалось поместить файл с компьютера в хранилище файлов по причине:'") + Символы.ПС);
+
+ ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Новый ОписаниеОповещения(
+ "ПоместитьПрисоединенныйФайлПослеПодключенияРасширения", ЭтотОбъект, Контекст),, Ложь);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПоместитьПрисоединенныйФайл.
+Процедура ПоместитьПрисоединенныйФайлПослеПодключенияРасширения(РасширениеПодключено, Контекст) Экспорт
+
+ Если Не РасширениеПодключено Тогда
+ Результат = Новый Структура;
+ Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки +
+ НСтр("ru = 'В обозреватель интернет не установлено расширение для работы с файлами.'"));
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+ Возврат;
+ КонецЕсли;
+
+ ФайловыеФункцииСлужебныйКлиент.ПолучитьРабочийКаталогПользователя(Новый ОписаниеОповещения(
+ "ПоместитьПрисоединенныйФайлПослеПолученияРабочегоКаталога", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры ПоместитьПрисоединенныйФайл.
+Процедура ПоместитьПрисоединенныйФайлПослеПолученияРабочегоКаталога(Результат, Контекст) Экспорт
+
+ Если ЗначениеЗаполнено(Результат.ОписаниеОшибки) Тогда
+ Результат = Новый Структура;
+ Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + Результат.ОписаниеОшибки);
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+ Возврат;
+ КонецЕсли;
+
+ Контекст.Вставить("РабочийКаталогПользователя", Результат.Каталог);
+ Контекст.Вставить("КаталогФайла", Контекст.РабочийКаталогПользователя + Контекст.ДанныеФайла.ОтносительныйПуть);
+ Контекст.Вставить("ПолноеИмяФайла", Контекст.КаталогФайла + Контекст.ДанныеФайла.ИмяФайла);
+
+ Если Не ЗначениеЗаполнено(Контекст.ПолноеИмяПомещаемогоФайла) Тогда
+ Контекст.ПолноеИмяПомещаемогоФайла = Контекст.ПолноеИмяФайла;
+ КонецЕсли;
+
+ ДействияСФайлом = Новый Массив;
+
+ Если Контекст.ПолноеИмяФайла <> Контекст.ПолноеИмяПомещаемогоФайла Тогда
+ Действие = Новый Структура;
+ Действие.Вставить("Действие", "СоздатьКаталог");
+ Действие.Вставить("Файл", Контекст.КаталогФайла);
+ Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки +
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Создание каталога не выполнено по причине:'"), Контекст.КаталогФайла));
+ ДействияСФайлом.Добавить(Действие);
+
+ Действие = Новый Структура;
+ Действие.Вставить("Действие", "УстановитьСвойства");
+ Действие.Вставить("Файл", Контекст.ПолноеИмяФайла);
+ Действие.Вставить("Свойства", Новый Структура("ТолькоЧтение", Ложь));
+ Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки +
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Изменение свойства файла ""Только просмотр"" не выполнено по причине:'"), Контекст.ПолноеИмяФайла));
+ ДействияСФайлом.Добавить(Действие);
+
+ Действие = Новый Структура;
+ Действие.Вставить("Действие", "Удалить");
+ Действие.Вставить("Файл", Контекст.ПолноеИмяФайла);
+ Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки +
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Удаление файла не выполнено по причине:'"), Контекст.ПолноеИмяФайла));
+ ДействияСФайлом.Добавить(Действие);
+
+ Действие = Новый Структура;
+ Действие.Вставить("Действие", "СкопироватьИзИсточника");
+ Действие.Вставить("Файл", Контекст.ПолноеИмяФайла);
+ Действие.Вставить("Источник", Контекст.ПолноеИмяПомещаемогоФайла);
+ Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки +
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Копирование файла не выполнено по причине:'"), Контекст.ПолноеИмяФайла));
+ ДействияСФайлом.Добавить(Действие);
+ КонецЕсли;
+
+ Действие = Новый Структура;
+ Действие.Вставить("Действие", "УстановитьСвойства");
+ Действие.Вставить("Файл", Контекст.ПолноеИмяФайла);
+ Действие.Вставить("Свойства", Новый Структура("ТолькоЧтение", Истина));
+ Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки +
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Изменение свойства файла ""Только просмотр"" не выполнено по причине:'"), Контекст.ПолноеИмяФайла));
+ ДействияСФайлом.Добавить(Действие);
+
+ Контекст.Вставить("СвойстваФайла", Новый Структура);
+ Контекст.СвойстваФайла.Вставить("УниверсальноеВремяИзменения");
+ Контекст.СвойстваФайла.Вставить("ИмяБезРасширения");
+ Контекст.СвойстваФайла.Вставить("Расширение");
+
+ Действие = Новый Структура;
+ Действие.Вставить("Действие", "ПолучитьСвойства");
+ Действие.Вставить("Файл", Контекст.ПолноеИмяФайла);
+ Действие.Вставить("Свойства", Контекст.СвойстваФайла);
+ Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки +
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Получение свойств файла не выполнено по причине:'"), Контекст.ПолноеИмяФайла));
+ ДействияСФайлом.Добавить(Действие);
+
+ Контекст.Вставить("ДействиеПомещения", Новый Структура);
+ Контекст.ДействиеПомещения.Вставить("Действие", "Поместить");
+ Контекст.ДействиеПомещения.Вставить("Файл", Контекст.ПолноеИмяФайла);
+ Контекст.ДействиеПомещения.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки);
+ ДействияСФайлом.Добавить(Контекст.ДействиеПомещения);
+
+ ФайловыеФункцииСлужебныйКлиент.ОбработатьФайл(Новый ОписаниеОповещения(
+ "ПоместитьПрисоединенныйФайлПослеОбработкиФайла", ЭтотОбъект, Контекст),
+ ДействияСФайлом, Контекст.ИдентификаторФормы);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПоместитьПрисоединенныйФайл.
+Процедура ПоместитьПрисоединенныйФайлПослеОбработкиФайла(РезультатДействий, Контекст) Экспорт
+
+ Результат = Новый Структура;
+
+ Если ЗначениеЗаполнено(РезультатДействий.ОписаниеОшибки) Тогда
+ Результат.Вставить("ОписаниеОшибки", РезультатДействий.ОписаниеОшибки);
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+ Возврат;
+ КонецЕсли;
+
+ Результат.Вставить("ОписаниеОшибки", "");
+
+ Расширение = Контекст.СвойстваФайла.Расширение;
+
+ ИнформацияОФайле = Новый Структура;
+ ИнформацияОФайле.Вставить("ДатаМодификацииУниверсальная", Контекст.СвойстваФайла.УниверсальноеВремяИзменения);
+ ИнформацияОФайле.Вставить("АдресФайлаВоВременномХранилище", Контекст.ДействиеПомещения.Адрес);
+ ИнформацияОФайле.Вставить("АдресВременногоХранилищаТекста", "");
+ ИнформацияОФайле.Вставить("ИмяБезРасширения", Контекст.СвойстваФайла.ИмяБезРасширения);
+ ИнформацияОФайле.Вставить("Расширение", Прав(Расширение, СтрДлина(Расширение)-1));
+ ИнформацияОФайле.Вставить("Редактирует", Неопределено);
+
+ Попытка
+ ПрисоединенныеФайлыСлужебныйВызовСервера.ОбновитьПрисоединенныйФайл(
+ Контекст.ПрисоединенныйФайл, ИнформацияОФайле);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + Символы.ПС
+ + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+ КонецПопытки;
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+
+КонецПроцедуры
+
+
+// См. одноименную процедуру в общем модуле ПрисоединенныеФайлыКлиент.
+Процедура ПолучитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры = Неопределено) Экспорт
+
+ Если ДополнительныеПараметры = Неопределено Тогда
+ ДополнительныеПараметры = Новый Структура;
+ КонецЕсли;
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл);
+ Контекст.Вставить("ИдентификаторФормы", ИдентификаторФормы);
+ Контекст.Вставить("ДляРедактирования", Ложь);
+ Контекст.Вставить("ДанныеФайла", Неопределено);
+ ДополнительныеПараметры.Свойство("ДляРедактирования", Контекст.ДляРедактирования);
+ ДополнительныеПараметры.Свойство("ДанныеФайла", Контекст.ДанныеФайла);
+
+ Если ТипЗнч(Контекст.ДанныеФайла) <> Тип("Структура")
+ Или Не ЗначениеЗаполнено(Контекст.ДанныеФайла.СсылкаНаДвоичныеДанныеФайла) Тогда
+
+ Контекст.Вставить("ДанныеФайла", ПрисоединенныеФайлыСлужебныйВызовСервера.ПолучитьДанныеФайла(
+ Контекст.ПрисоединенныйФайл, Контекст.ИдентификаторФормы, Истина, Контекст.ДляРедактирования));
+ КонецЕсли;
+
+ Контекст.Вставить("ЗаголовокОшибки",
+ НСтр("ru = 'Не удалось получить файл на компьютер из хранилища файлов по причине:'") + Символы.ПС);
+
+ Если Контекст.ДляРедактирования
+ И Контекст.ДанныеФайла.Редактирует <> ПользователиКлиентСервер.АвторизованныйПользователь() Тогда
+
+ Результат = Новый Структура;
+ Результат.Вставить("ПолноеИмяФайла", "");
+ Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Файл уже редактирует пользователь %1.'"), Строка(Контекст.ДанныеФайла.Редактирует)));
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+ Возврат;
+ КонецЕсли;
+
+ Контекст.Вставить("ДляРедактирования", ЗначениеЗаполнено(Контекст.ДанныеФайла.Редактирует));
+
+ ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Новый ОписаниеОповещения(
+ "ПолучитьПрисоединенныйФайлПослеПодключенияРасширения", ЭтотОбъект, Контекст),, Ложь);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьПрисоединенныйФайл.
+Процедура ПолучитьПрисоединенныйФайлПослеПодключенияРасширения(РасширениеПодключено, Контекст) Экспорт
+
+ Если Не РасширениеПодключено Тогда
+ Результат = Новый Структура;
+ Результат.Вставить("ПолноеИмяФайла", "");
+ Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки +
+ НСтр("ru = 'В обозреватель интернет не установлено расширение для работы с файлами.'"));
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+ Возврат;
+ КонецЕсли;
+
+ ФайловыеФункцииСлужебныйКлиент.ПолучитьРабочийКаталогПользователя(Новый ОписаниеОповещения(
+ "ПолучитьПрисоединенныйФайлПослеПолученияРабочегоКаталога", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьПрисоединенныйФайл.
+Процедура ПолучитьПрисоединенныйФайлПослеПолученияРабочегоКаталога(Результат, Контекст) Экспорт
+
+ Если ЗначениеЗаполнено(Результат.ОписаниеОшибки) Тогда
+ Результат = Новый Структура;
+ Результат.Вставить("ПолноеИмяФайла", "");
+ Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + Результат.ОписаниеОшибки);
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+ Возврат;
+ КонецЕсли;
+
+ Контекст.Вставить("РабочийКаталогПользователя", Результат.Каталог);
+ Контекст.Вставить("КаталогФайла", Контекст.РабочийКаталогПользователя + Контекст.ДанныеФайла.ОтносительныйПуть);
+ Контекст.Вставить("ПолноеИмяФайла", Контекст.КаталогФайла + Контекст.ДанныеФайла.ИмяФайла);
+
+ ДействияСФайлом = Новый Массив;
+
+ Действие = Новый Структура;
+ Действие.Вставить("Действие", "СоздатьКаталог");
+ Действие.Вставить("Файл", Контекст.КаталогФайла);
+ Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки +
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Создание каталога не выполнено по причине:'"), Контекст.КаталогФайла));
+ ДействияСФайлом.Добавить(Действие);
+
+ Действие = Новый Структура;
+ Действие.Вставить("Действие", "УстановитьСвойства");
+ Действие.Вставить("Файл", Контекст.ПолноеИмяФайла);
+ Действие.Вставить("Свойства", Новый Структура("ТолькоЧтение", Ложь));
+ Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки +
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Изменение свойства файла ""Только просмотр"" не выполнено по причине:'"), Контекст.ПолноеИмяФайла));
+ ДействияСФайлом.Добавить(Действие);
+
+ Действие = Новый Структура;
+ Действие.Вставить("Действие", "Удалить");
+ Действие.Вставить("Файл", Контекст.ПолноеИмяФайла);
+ Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки +
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Удаление файла не выполнено по причине:'"), Контекст.ПолноеИмяФайла));
+ ДействияСФайлом.Добавить(Действие);
+
+ Действие = Новый Структура;
+ Действие.Вставить("Действие", "Получить");
+ Действие.Вставить("Файл", Контекст.ПолноеИмяФайла);
+ Действие.Вставить("Адрес", Контекст.ДанныеФайла.СсылкаНаДвоичныеДанныеФайла);
+ Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки);
+ ДействияСФайлом.Добавить(Действие);
+
+ СвойстваФайла = Новый Структура;
+ СвойстваФайла.Вставить("ТолькоЧтение", Не Контекст.ДляРедактирования);
+ СвойстваФайла.Вставить("УниверсальноеВремяИзменения", Контекст.ДанныеФайла.ДатаМодификацииУниверсальная);
+
+ Действие = Новый Структура;
+ Действие.Вставить("Действие", "УстановитьСвойства");
+ Действие.Вставить("Файл", Контекст.ПолноеИмяФайла);
+ Действие.Вставить("Свойства", СвойстваФайла);
+ Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки +
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Установка свойств файла не выполнено по причине:'"), Контекст.ПолноеИмяФайла));
+ ДействияСФайлом.Добавить(Действие);
+
+ ФайловыеФункцииСлужебныйКлиент.ОбработатьФайл(Новый ОписаниеОповещения(
+ "ПолучитьПрисоединенныйФайлПослеОбработкиФайла", ЭтотОбъект, Контекст),
+ ДействияСФайлом, Контекст.ИдентификаторФормы);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьПрисоединенныйФайл.
+Процедура ПолучитьПрисоединенныйФайлПослеОбработкиФайла(РезультатДействий, Контекст) Экспорт
+
+ Результат = Новый Структура;
+
+ Если ЗначениеЗаполнено(РезультатДействий.ОписаниеОшибки) Тогда
+ Результат.Вставить("ПолноеИмяФайла", "");
+ Результат.Вставить("ОписаниеОшибки", РезультатДействий.ОписаниеОшибки);
+ Иначе
+ Результат.Вставить("ПолноеИмяФайла", Контекст.ПолноеИмяФайла);
+ Результат.Вставить("ОписаниеОшибки", "");
+ КонецЕсли;
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+
+КонецПроцедуры
+
////////////////////////////////////////////////////////////////////////////////
// Работа с электронными подписями.
@@ -403,7 +810,6 @@
ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'"));
ОписаниеДанных.Вставить("Представление", ПрисоединенныйФайл);
ОписаниеДанных.Вставить("ПоказатьКомментарий", Истина);
- ОписаниеДанных.Вставить("ИдентификаторФормы", ИдентификаторФормы);
ОписаниеДанных.Вставить("Данные", ПараметрыВыполнения.ДанныеФайла.СсылкаНаДвоичныеДанныеФайла);
@@ -435,7 +841,6 @@
ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'"));
ОписаниеДанных.Вставить("Представление", ПрисоединенныйФайл);
ОписаниеДанных.Вставить("ПоказатьКомментарий", Истина);
- ОписаниеДанных.Вставить("ИдентификаторФормы", ИдентификаторФормы);
Если ОбработчикПриПолученииПодписи = Неопределено Тогда
ОписаниеДанных.Вставить("Объект", ПрисоединенныйФайл);
@@ -549,7 +954,6 @@
ДополнительныеПараметры.Вставить("ИдентификаторФормы", ИдентификаторФормы);
ОписаниеДанных = Новый Структура;
- ОписаниеДанных.Вставить("ИдентификаторФормы", ДополнительныеПараметры.ИдентификаторФормы);
ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Шифрование файла'"));
ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'"));
ОписаниеДанных.Вставить("Данные", ДанныеФайла.СсылкаНаДвоичныеДанныеФайла);
@@ -601,17 +1005,19 @@
ОповеститьОбИзменении(ПрисоединенныйФайл);
Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ПрисоединенныйФайл);
- Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Файл ""%1""
- |зашифрован.'"),
- ПрисоединенныйФайл) );
-
+ Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
+ МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент");
+ МодульЭлектроннаяПодписьКлиент.ИнформироватьОШифрованииОбъекта(
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Файл: %1'"), ПрисоединенныйФайл));
+ КонецЕсли;
+
Параметры = Новый Структура;
Параметры.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл);
Параметры.Вставить("ДанныеФайла", ДанныеФайла);
ОписаниеОповещения = Новый ОписаниеОповещения("ОповеститьОбИзмененииИУдалитьФайлВРабочемКаталогеРасширениеПредложено", ЭтотОбъект, Параметры);
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения);
+ ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения);
КонецПроцедуры
@@ -692,7 +1098,6 @@
ДополнительныеПараметры.Вставить("ИдентификаторФормы", ИдентификаторФормы);
ОписаниеДанных = Новый Структура;
- ОписаниеДанных.Вставить("ИдентификаторФормы", ДополнительныеПараметры.ИдентификаторФормы);
ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Расшифровка файла'"));
ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'"));
ОписаниеДанных.Вставить("Данные", ДанныеФайла.СсылкаНаДвоичныеДанныеФайла);
@@ -765,10 +1170,13 @@
ОповеститьОбИзменении(ПрисоединенныйФайл);
Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ПрисоединенныйФайл);
- Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Файл ""%1""
- |расшифрован.'"),
- ПрисоединенныйФайл) );
+ Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
+ Возврат;
+ КонецЕсли;
+ МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент");
+ МодульЭлектроннаяПодписьКлиент.ИнформироватьОРасшифровкеОбъекта(
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Файл: %1'"), ПрисоединенныйФайл));
КонецПроцедуры
@@ -926,12 +1334,8 @@
ОткрытьФайлДиалогПоказан(ПолучитьФайл, ДополнительныеПараметры);
Иначе
- Если ДанныеФайла.ФайлРедактируется И ДанныеФайла.ФайлРедактируетТекущийПользователь Тогда
- ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьФайлНапоминаниеПоказано", ЭтотОбъект, ДополнительныеПараметры);
- ФайловыеФункцииСлужебныйКлиент.ВывестиНапоминаниеПриРедактировании(ОписаниеОповещения);
- КонецЕсли;
-
- ПолучитьФайл(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, ДанныеФайла.ИмяФайла, Истина);
+ ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьФайлНапоминаниеПоказано", ЭтотОбъект, ДополнительныеПараметры);
+ ФайловыеФункцииСлужебныйКлиент.ВывестиНапоминаниеПриРедактировании(ОписаниеОповещения);
КонецЕсли;
КонецПроцедуры
@@ -951,7 +1355,7 @@
ФайлМожноОткрывать = Истина;
Если ПолучитьФайл Тогда
ПолноеИмяФайлаНаКлиенте = "";
- ФайлМожноОткрывать = ПрисоединенныеФайлыКлиент.ПолучитьФайлВРабочийКаталог(
+ ФайлМожноОткрывать = ПолучитьФайлВРабочийКаталог(
ДанныеФайла.СсылкаНаДвоичныеДанныеФайла,
ДанныеФайла.ОтносительныйПуть,
ДанныеФайла.ДатаМодификацииУниверсальная,
@@ -1051,10 +1455,12 @@
// Продолжение процедуры ПрисоединенныеФайлыКлиент.СохранитьВместеСЭП.
// Вызывается из подсистемы ЭлектроннаяПодпись после выбора подписей для сохранения.
//
-Процедура ПриСохраненииДанныхФайла(ОбработкаСохраненияПодписей, ПараметрыВыполнения) Экспорт
+Процедура ПриСохраненииДанныхФайла(Параметры, ПараметрыВыполнения) Экспорт
- ПараметрыВыполнения.Вставить("ОбработчикЗавершения", ОбработкаСохраненияПодписей);
- СохранитьФайлКакРасширениеПредложено(ПодключитьРасширениеРаботыСФайлами(), ПараметрыВыполнения);
+ РасширениеПодключено = ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено();
+
+ ПараметрыВыполнения.Вставить("ОбработчикЗавершения", Параметры.Оповещение);
+ СохранитьФайлКакРасширениеПредложено(РасширениеПодключено, ПараметрыВыполнения);
КонецПроцедуры
@@ -1103,7 +1509,8 @@
КонецЕсли;
Если ДополнительныеПараметры.Свойство("ОбработчикЗавершения") Тогда
- ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикЗавершения, ПолноеИмяФайла);
+ ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикЗавершения,
+ Новый Структура("ПолноеИмяФайла", ПолноеИмяФайла));
КонецЕсли;
КонецПроцедуры
@@ -1151,7 +1558,7 @@
Процедура ОткрытьФайлПриложением(Знач ИмяОткрываемогоФайла, ДанныеФайла)
- РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами();
+ РасширениеПодключено = ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено();
Если РасширениеПодключено Тогда
ЗаголовокСтрока = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(
diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентов/Module.bsl b/SSL/src/CommonModules/ПроверкаКонтрагентов/Module.bsl
new file mode 100644
index 000000000..56e2a08cd
--- /dev/null
+++ b/SSL/src/CommonModules/ПроверкаКонтрагентов/Module.bsl
@@ -0,0 +1,4181 @@
+////////////////////////////////////////////////////////////////////////////////
+// Проверка одного или нескольких контрагентов при помощи веб-сервиса ФНС.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#Область ПрограммныйИнтерфейс
+
+#Область Проверка
+
+#Область ПроверкаОдногоКонтрагента
+
+// Подписка на событие. Добавление в регистр набора ИНН и КПП для последующей проверки регламентным заданием.
+//
+// Параметры:
+// КонтрагентОбъект - СправочникОбъект.<Контрагенты> - записываемый контрагент.
+// Отказ - Булево - Параметр обработчика подписки на событие.
+Процедура СохранитьРезультатПроверкиКонтрагентаПриЗаписи(КонтрагентОбъект, Отказ) Экспорт
+
+ Если КонтрагентОбъект.ОбменДанными.Загрузка Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если НЕ ПроверкаКонтрагентовВызовСервера.ИспользованиеПроверкиВозможно()
+ ИЛИ СправочникКонтрагентовИерархический() И КонтрагентОбъект.ЭтоГруппа Тогда
+ Возврат;
+ КонецЕсли;
+
+ СостояниеКонтрагента = Перечисления.СостоянияСуществованияКонтрагента.ПустаяСсылка();
+ КонтрагентОбъект.ДополнительныеСвойства.Свойство("ПроверкаКонтрагентовСостояниеКонтрагента", СостояниеКонтрагента);
+
+ СвойстваСправочникаКонтрагенты = ПроверкаКонтрагентовКлиентСервер.СвойстваСправочникаКонтрагенты();
+
+ ДанныеКонтрагента = Новый Структура;
+
+ ДанныеКонтрагента.Вставить("Контрагент", КонтрагентОбъект.Ссылка);
+ ДанныеКонтрагента.Вставить("ИНН", КонтрагентОбъект[СвойстваСправочникаКонтрагенты.ИНН]);
+ ДанныеКонтрагента.Вставить("КПП", КонтрагентОбъект[СвойстваСправочникаКонтрагенты.КПП]);
+ ДанныеКонтрагента.Вставить("Дата", НачалоДня(ТекущаяДатаСеанса()));
+ ДанныеКонтрагента.Вставить("Состояние", СостояниеКонтрагента);
+
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда
+ ДанныеКонтрагента.Вставить("ОбластьДанныхВспомогательныеДанные", ОбщегоНазначения.ЗначениеРазделителяСеанса());
+ КонецЕсли;
+
+ УстановитьПривилегированныйРежим(Истина);
+ СохранитьРезультатыПроверкиКонтрагентаВРегистр(ДанныеКонтрагента);
+
+КонецПроцедуры
+
+// Процедура - Метод фонового задания по проверке контрагента из формы контрагента.
+//
+// Параметры:
+// Параметры - Структура - Параметры запуска фонового задания. Ключи структуры:
+// "Контрагент" - СправочникСсылка.<Контрагенты> - Проверяемый контрагент.
+// "ИНН" - Строка - ИНН Контрагента
+// "КПП" - Строка - КПП Контрагента
+// "Дата" - Дата - Дата, на которую выполняется проверка контрагента. Может быть не указана, тогда берется текущая
+// дата "СохранятьРезультатСразуПослеПроверки" - Булево - Признак, указывающий нужно ли результат
+// проверки контрагента сразу сохранять в регистр
+// "АдресХранилища" - Строка - Адрес, в который будет помещен результат проверки контрагента.
+Процедура ПроверитьКонтрагентаФоновоеЗадание(Параметры) Экспорт
+
+ // Присвоение даты находится здесь, так как ТекущаяДатаСеанса работает только на сервере.
+ Если НЕ Параметры.Свойство("Дата") Тогда
+ Параметры.Вставить("Дата", НачалоДня(ТекущаяДатаСеанса()));
+ КонецЕсли;
+
+ Попытка
+ ПроверитьКонтрагента(Параметры, Параметры.АдресХранилища);
+ Исключение
+
+ КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации.
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Проверка контрагентов.Проверка контрагента из карточки контрагента'", КодОсновногоЯзыка),
+ УровеньЖурналаРегистрации.Ошибка,,,ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
+
+ КонецПопытки;
+
+КонецПроцедуры
+
+// Процедура - Проверка одного контрагента по ИНН, КПП и Дате.
+//
+// Параметры:
+// Параметры - Структура - Параметры запуска фонового задания. Ключи структуры:
+// "Контрагент" - СправочникСсылка.<Контрагенты> - Проверяемый контрагент.
+// "ИНН" - Строка - ИНН Контрагента.
+// "КПП" - Строка - КПП Контрагента.
+// "Дата" - Дата - Дата, на которую выполняется проверка контрагента. Может быть не указана,
+// тогда берется текущая дата.
+// "СохранятьРезультатСразуПослеПроверки" - Булево - Признак, указывающий нужно ли результат
+// проверки контрагента сразу сохранять в регистр.
+// "АдресХранилища" - Строка - Адрес, в который будет помещен результат проверки контрагента.
+// АдресХранилища - Строка - Адрес временного хранилища, в который будет помещен результат проверки контрагента.
+Процедура ПроверитьКонтрагента(Параметры, АдресХранилища) Экспорт
+
+ // Готовим данные в нужном формате для передачи на проверку.
+ ДанныеКонтрагентов = ШаблонТаблицыДанныеКонтрагента();
+
+ НоваяСтрока = ДанныеКонтрагентов.Добавить();
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда
+ НоваяСтрока.ОбластьДанныхВспомогательныеДанные = ОбщегоНазначения.ЗначениеРазделителяСеанса();
+ КонецЕсли;
+ ЗаполнитьЗначенияСвойств(НоваяСтрока, Параметры);
+
+ ПроверитьКонтрагентов(ДанныеКонтрагентов, АдресХранилища, Истина, Параметры.СохранятьРезультатСразуПослеПроверки);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ПроверкаНесколькихКонтрагентов
+
+// Процедура - Проверка нескольких контрагентов.
+//
+// Параметры:
+// ДанныеКонтрагентов - ТаблицаЗначений - Содержит данные проверяемых контрагентов.
+// Структуру колонок таблицы см в функции ШаблонТаблицыДанныеКонтрагента.
+// АдресХранилища - Строка - Адрес, в который будет помещен результат проверки контрагента.
+// ЭтоПроверкаСправочника - Булево - Указывает, выполняется ли проверка справочника.
+// Для справочника результат проверки сохраняется во временное хранилище, либо записывается в регистр.
+// Для остальных объектов результат проверки заполняется в колонке Состояние таблицы ДанныеКонтрагентов.
+// СохранятьРезультатСразуПослеПроверки - Булево - Признак, указывающий нужно ли результат проверки контрагента.
+Процедура ПроверитьКонтрагентов(ДанныеКонтрагентов, АдресХранилища = Неопределено, ЭтоПроверкаСправочника = Истина, СохранятьРезультатСразуПослеПроверки = Ложь) Экспорт
+
+ // Если нет доступа к веб-сервису, то проверку не выполняем.
+ Если НЕ ЕстьДоступКВебСервисуФНС() Тогда
+ Возврат;
+ КонецЕсли;
+
+ // Если по некоторым контрагентам можно определить, что они не существуют, не обращаясь к сервису, то к сервису по ним
+ // обращаться не будем.
+ Если ЭтоПроверкаСправочника Тогда
+ ПолучитьСостоянияКонтрагентовИзКэша(ДанныеКонтрагентов);
+ КонецЕсли;
+
+ // Приведение данных к нужному формату, выявление записей с ошибками.
+ ПодготовитьДанныеКПроверке(ДанныеКонтрагентов);
+
+ // Получение результатов проверки от веб-сервиса.
+ // Проверяем только тех контрагентов, у которых неопределено состояние существования и у которых нет ошибок.
+ Отбор = Новый Структура();
+ Отбор.Вставить("Состояние", Перечисления.СостоянияСуществованияКонтрагента.ПустаяСсылка());
+ ПолучитьРезультатПроверкиВебСервисом(ДанныеКонтрагентов, Отбор);
+
+ // Сохраняем результаты проверки, если это справочник.
+ Если ЭтоПроверкаСправочника Тогда
+ УстановитьПривилегированныйРежим(Истина);
+ СохранитьРезультатыПроверкиСправочника(ДанныеКонтрагентов, АдресХранилища, СохранятьРезультатСразуПослеПроверки);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Метод фонового задания по проверки контрагентов в документе.
+//
+// Параметры:
+// Параметры - Структура - Параметры фонового задания. Ключи:
+// "ДанныеКонтрагентов" - ТаблицаЗначений - - Содержит данные проверяемых контрагентов.
+// Структуру колонок таблицы см в функции ШаблонТаблицыДанныеКонтрагентаДляДокумента.
+// "АдресХранилища" - Строка - Адрес, в который будет помещен результат проверки контрагента
+// "СохранятьРезультатСразуПослеПроверки" - Булево - Признак, указывающий нужно ли результат проверки контрагента
+// сразу сохранять в регистр.
+Процедура ПроверитьКонтрагентовВДокументе(Параметры) Экспорт
+
+ ПроверяемыеКонтрагенты = Параметры.ДанныеКонтрагентов;
+ АдресХранилища = Параметры.АдресХранилища;
+
+ // Если нет доступа к веб-сервису, то проверку не выполняем.
+ Если ЕстьДоступКВебСервисуФНС() Тогда
+
+ ДанныеКонтрагентов = ПроверяемыеКонтрагенты.Скопировать();
+ ПроверитьКонтрагентов(ДанныеКонтрагентов, , Ложь);
+
+ ЗаполнитьСостояния(ПроверяемыеКонтрагенты, ДанныеКонтрагентов);
+
+ Результат = Новый Структура;
+ Результат.Вставить("ДанныеКонтрагентов", ПроверяемыеКонтрагенты);
+ Иначе
+ Результат = Новый Структура;
+ Результат.Вставить("НетДоступаКВебСервисуФНС", Истина);
+ КонецЕсли;
+
+ Результат.Вставить("СохранятьРезультатСразуПослеПроверки", Параметры.СохранятьРезультатСразуПослеПроверки);
+
+ ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
+
+КонецПроцедуры
+
+// Процедура - метод регламентного задания по проверке контрагентов в справочнике.
+// В модели сервиса обновляет состояния контрагентов по каждой записи регистра.
+// В локальном режима записывает недостающих контрагентов в регистр и обновляет состояния по каждой записи регистра.
+Процедура ПроверитьКонтрагентовРегламентноеЗадание() Экспорт
+
+ ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания();
+
+ // Проверяем, включен ли механизм.
+ Если НЕ ПроверкаКонтрагентовВключена() Тогда
+ Возврат;
+ КонецЕсли;
+
+ Запрос = Новый Запрос;
+ Запрос.Текст =
+ "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
+ | СостоянияКонтрагентов.Контрагент,
+ | СостоянияКонтрагентов.ИНН,
+ | СостоянияКонтрагентов.КПП,
+ | СостоянияКонтрагентов.ОбластьДанныхВспомогательныеДанные КАК ОбластьДанныхВспомогательныеДанные,
+ | &Дата КАК Дата
+ |ИЗ
+ | РегистрСведений.СостоянияКонтрагентов КАК СостоянияКонтрагентов
+ |ГДЕ
+ | СостоянияКонтрагентов.Состояние <> ЗНАЧЕНИЕ(Перечисление.СостоянияСуществованияКонтрагента.НеПодлежитПроверке)";
+
+ Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда
+
+ Запрос.Текст = СтрЗаменить(
+ Запрос.Текст,
+ "СостоянияКонтрагентов.ОбластьДанныхВспомогательныеДанные КАК ОбластьДанныхВспомогательныеДанные,",
+ "");
+
+ КонецЕсли;
+
+ // Указываем дату, на которую будет выполняться проверка.
+ Запрос.УстановитьПараметр("Дата", НачалоДня(ТекущаяДатаСеанса()));
+ ДанныеКонтрагентов = Запрос.Выполнить().Выгрузить();
+
+ // Выполняется проверка только тех ИНН и КПП, которые записаны в регистр.
+ ПроверитьКонтрагентов(ДанныеКонтрагентов);
+
+ // Дозаписываем недостающие ИНН и КПП в регистр в локальном режиме.
+ Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
+ ПроверитьНепроверенныхКонтрагентов(Ложь);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Выполняет первоначальное заполнение регистра на основе справочника контрагентов.
+// Заполнение выполняется:
+// 1. После ручного включения проверки фоновым заданием.
+// 2. В режиме сервисов - обновлением ИБ в каждой области отдельно.
+//
+// Параметры:
+// Параметры - Структура или Неопределено - Параметры очереди заданий в модели сервиса.
+// В локальной версии - Неопределено.
+Процедура ПроверитьКонтрагентовПослеВключенияПроверки(Параметры = Неопределено) Экспорт
+
+ ЭтоОбновлениеИБВМоделиСервиса = Ложь;
+ РазмерПорции = 1000;
+
+ Если Параметры = Неопределено Тогда
+ // Это заполнение регистра после включения проверки.
+ Иначе
+ // Это обновление ИБ.
+ // Обновление должно выполняться только в модели сервиса.
+ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
+ ЭтоОбновлениеИБВМоделиСервиса = Истина;
+ Иначе
+ Возврат;
+ КонецЕсли;
+ КонецЕсли;
+
+ // Дозаписываем недостающие ИНН и КПП в регистр в локальном режиме,
+ // либо в модели сервисов в отложенном обновлении из областей данных.
+ Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
+ ПроверитьНепроверенныхКонтрагентов(ЭтоОбновлениеИБВМоделиСервиса, Параметры);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Запуск фонового задания по проверке контрагентов после
+// включения проверки в предложении на подключение или из настроек.
+Процедура ПроверитьКонтрагентовПослеВключенияПроверкиФоновоеЗадание() Экспорт
+
+ Попытка
+
+ ФоновыеЗадания.Выполнить("ПроверкаКонтрагентов.ПроверитьКонтрагентовПослеВключенияПроверки",
+ , "ПроверкаПослеВключенияМеханизма", НСтр("ru = 'Проверка контрагентов'"));
+
+ Исключение
+
+ // Исключение возникнет при попытке запуска фонового задания, пока не отработало предыдущее фоновое задание.
+ // Специальной обработки не требуется.
+
+ КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации.
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Проверка контрагентов.Проверка контрагентов в фоновом задании'", КодОсновногоЯзыка),
+ УровеньЖурналаРегистрации.Ошибка,,,ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
+
+ КонецПопытки;
+
+КонецПроцедуры
+
+// Процедура - Контрагенты проверяются по данным ФНС.
+// По завершению проверки в переданную таблицу добавляется колонка c состоянием контрагента.
+//
+// Параметры:
+// ДанныеКонтрагентов - ТаблицаЗначений - Таблица, содержащая контрагентов на проверку.
+// Колонки таблицы: Контрагент, ИНН, КПП, Дата.
+// ВидПроверки - Строка - Может принимать одно следующих значений:
+// - ИзКэша - результат проверки выбирается только из кэша.
+// - АктуальныеДанные - результат проверки получается только на основе данных, возвращенных веб-сервисом проверки.
+// - Смешанный - сначала выбираются данные из кэша, затем идет обращение к веб-сервису проверки.
+Процедура ВыполнитьПроверкуКонтрагентов(ПроверяемыеКонтрагенты, Знач ВидПроверки = "Смешанный") Экспорт
+
+ ВидПроверки = ВРег(ВидПроверки);
+
+ // Проверка корректности переданного параметра.
+ Если ВидПроверки <> "ИЗКЭША" И ВидПроверки <> "АКТУАЛЬНЫЕДАННЫЕ" И ВидПроверки <> "СМЕШАННЫЙ" Тогда
+ ВызватьИсключение(НСтр("ru = 'Недопустимое значение параметра (параметр номер ''2'')'"));
+ КонецЕсли;
+
+ // Добавляем колонку с результатом проверки.
+ ПроверяемыеКонтрагенты.Колонки.Добавить("Состояние",Новый ОписаниеТипов("ПеречислениеСсылка.СостоянияСуществованияКонтрагента"));
+ ДанныеКонтрагентов = ПроверяемыеКонтрагенты.Скопировать();
+
+ // Приведение данных к нужному формату, выявление записей с ошибками.
+ ПодготовитьДанныеКПроверке(ДанныеКонтрагентов);
+
+ Если ВидПроверки = "ИЗКЭША" ИЛИ ВидПроверки = "СМЕШАННЫЙ" Тогда
+ ПолучитьСостоянияКонтрагентовИзКэша(ДанныеКонтрагентов, Истина);
+ КонецЕсли;
+
+ // Получение результатов проверки от веб-сервиса.
+ // Проверяем только тех контрагентов, у которых неопределено состояние существования и у которых нет ошибок.
+ Если ВидПроверки = "АКТУАЛЬНЫЕДАННЫЕ" ИЛИ ВидПроверки = "СМЕШАННЫЙ" Тогда
+ Отбор = Новый Структура();
+ Отбор.Вставить("Состояние", Перечисления.СостоянияСуществованияКонтрагента.ПустаяСсылка());
+ ПолучитьРезультатПроверкиВебСервисом(ДанныеКонтрагентов, Отбор);
+ КонецЕсли;
+
+ ЗаполнитьСостояния(ПроверяемыеКонтрагенты, ДанныеКонтрагентов);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область ВспомогательныеПроцедурыИФункции
+
+// Процедура - Добавление описания расположения контрагента в документе в таблицу описаний.
+//
+// Параметры:
+// Описание - ТаблицаЗначений - таблица, хранящая описание расположения контрагентов в документе.
+// Ссылка - ДокументСсылка - Документ, в котором выполняется проверка контрагента.
+// Элемент - Элемент коллекции ЭлементыФормы - Элемент, в котором находится проверяемый контрагент или счет-фактура.
+// Контрагент - СправочникСсылка.<Контрагенты> - Проверяемый контрагент.
+// ЭлементРодитель - Элемент коллекции ЭлементыФормы - Группа, которая содержит элемент с контрагентом или
+// счетом-фактурой.
+// Данный элемент будет подкрашен по результату проверки контрагентов. Может не указываться.
+Процедура ДополнитьОписание(
+ Описание,
+ Ссылка,
+ Элемент,
+ Контрагент,
+ ЭлементРодитель = Неопределено) Экспорт
+
+ СтрокаОписания = Описание.Добавить();
+ СтрокаОписания.Ссылка = Ссылка;
+ СтрокаОписания.Элемент = Элемент;
+ СтрокаОписания.ЭлементРодитель = ЭлементРодитель;
+ СтрокаОписания.Контрагент = Контрагент;
+
+КонецПроцедуры
+
+// Процедура - Добавление записи к таблице описания расположения контрагентов в табличных частях документа.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+// Описание - ТаблицаЗначений - Таблица с описанием расположения контрагентов в табличной части документа.
+// ИмяТаблицыФормы - Строка - Имя таблицы формы, в которой расположен контрагент.
+// ИмяПоляСКонтрагентом - Строка - Имя колонки с контрагентом в таблице формы, в которой расположен контрагент.
+// ИмяПоляСДатой - Строка - Имя колонки с датой в таблице формы, на которую выполняется проверка контрагента.
+// Если в таблице формы нет такой колонки, то не заполняется.
+//
+Процедура ДополнитьОписаниеТабличныхЧастей(Форма, Описание, ИмяТаблицыФормы, ИмяПоляСКонтрагентом, ИмяПоляСДатой) Экспорт
+
+ Если КолонкаТаблицыСкрытаФункциональнойОпцией(Форма, ИмяТаблицыФормы, ИмяПоляСКонтрагентом) Тогда
+ Возврат;
+ КонецЕсли;
+
+ СтрокаОписания = Описание.Добавить();
+
+ // ТЧ
+ СтрокаОписания.ИмяТаблицыФормы = ИмяТаблицыФормы;
+ СтрокаОписания.ИмяТабличнойЧасти = ИмяРеквизита(Форма, ИмяТаблицыФормы);
+
+ // Контрагент
+ СтрокаОписания.ИмяПоляСКонтрагентом = ИмяПоляСКонтрагентом;
+ СтрокаОписания.ИмяКолонкиСКонтрагентом = ИмяРеквизита(Форма, ИмяПоляСКонтрагентом);
+
+ // Дата
+ СтрокаОписания.ИмяПоляСДатой = ИмяПоляСДатой;
+ СтрокаОписания.ИмяКолонкиСДатой = ИмяРеквизита(Форма, ИмяПоляСДатой);
+
+КонецПроцедуры
+
+// Процедура - Устанавливает текст и видимость предупреждения про тестовый режим работы сервиса.
+Процедура УстановитьВидимостьИЗаголовокПредупрежденияПроТестовыйРежим(Элемент) Экспорт
+
+ Если ТестовыйРежимРаботыСервисаЗавершился() Тогда
+ Элемент.Видимость = Ложь;
+ Иначе
+ Элемент.Видимость = Истина;
+ Элемент.Заголовок =
+ НСтр("ru = 'В настоящее время веб-сервис ФНС работает в тестовом режиме'");
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Функция - Тестовый режим работы сервиса завершился.
+// Возвращаемое значение:
+// Булево - Истина, если тестовый режим работы сервиса завершился.
+Функция ТестовыйРежимРаботыСервисаЗавершился() Экспорт
+
+ Возврат Ложь;
+
+КонецФункции
+
+// Процедура - Установка надписей в панели проверки контрагентов в отчета при создании на сервере.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма отчета, в котором выводится результат проверки контрагентов.
+Процедура УстановитьНадписиВПанелиОтчетаПриСозданииНаСервере(Форма) Экспорт
+
+ СсылкаНаИнструкцию = Новый ФорматированнаяСтрока(" ", ПроверкаКонтрагентовКлиентСерверПовтИсп.СсылкаНаИнструкцию());
+
+ // Все контрагенты корректны
+ ЭлементФормы = Форма.Элементы.Найти("ТекстПриКорректныхКонтрагентах");
+ Если ЭлементФормы <> Неопределено Тогда
+ ЭлементФормы.Заголовок = Новый ФорматированнаяСтрока(НСтр("ru = 'Проверка контрагентов по данным ФНС выполнена успешно'"), СсылкаНаИнструкцию);
+ КонецЕсли;
+
+ // Есть некорректные контрагенты.
+ ЭлементФормы = Форма.Элементы.Найти("ТекстПриНекорректныхКонтрагентах");
+ Если ЭлементФормы <> Неопределено Тогда
+ ЭлементФормы.Заголовок = Новый ФорматированнаяСтрока(НСтр("ru = 'Обнаружены недействующие контрагенты по данным ФНС'"), СсылкаНаИнструкцию);
+ КонецЕсли;
+
+ // Выполняется проверка
+ ЭлементФормы = Форма.Элементы.Найти("ТекстПриПроверкеВПроцессеВыполнения");
+ Если ЭлементФормы <> Неопределено Тогда
+ ЭлементФормы.Заголовок = Новый ФорматированнаяСтрока(НСтр("ru = 'Выполняется проверка контрагентов согласно данным ФНС'"), СсылкаНаИнструкцию);
+ КонецЕсли;
+
+ // Нет доступа к сервису
+ ЭлементФормы = Форма.Элементы.Найти("ТекстНетДоступаКСервису");
+ Если ЭлементФормы <> Неопределено Тогда
+ ЭлементФормы.Заголовок = Новый ФорматированнаяСтрока(НСтр("ru = 'Не удалось произвести проверку контрагентов: сервис ФНС временно недоступен'"), СсылкаНаИнструкцию);
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ПроверкаКонтрагентовВДокументах
+
+// Процедура - Запуск фонового задания по проверке контрагента.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+// ДополнительныеПараметры - ТаблицаФормы - Если изменения контрагента или даты произошли в табличной части.
+// - ПолеФормы - Элемент управления, содержащий контрагента или счет-фактуру, в случае,
+// если произошло изменение в контрагенте, находящегося в шапке или в счете-фактуре, находящегося в подвале.
+// - Дата - Дата документа, в случае если произошло изменение даты
+// - Неопределено - если требуется проверка всех контрагентов в документе.
+// - Булево - если это запуск проверки контрагента при создании на сервере.
+Процедура ПроверитьКонтрагентовВДокументеФоновоеЗадание(Форма, ПараметрыФоновогоЗадания) Экспорт
+
+ ОчиститьРезультатыПредыдущихПроверок(Форма, ПараметрыФоновогоЗадания);
+ ПоказатьПредварительныйРезультатПроверкиКонтрагентовИзКэша(Форма, ПараметрыФоновогоЗадания);
+
+ // Заполняем данные проверяемых контрагентов.
+ ДанныеКонтрагентов = ДанныеКонтрагентовВДокументе(Форма);
+ ДанныеКонтрагентов.ЗаполнитьЗначения(Перечисления.СостоянияСуществованияКонтрагента.ПустаяСсылка(), "Состояние");
+
+ Если ДанныеКонтрагентов.Количество() > 0 Тогда
+
+ // Инициализируем параметры фонового задания.
+ Форма.РеквизитыПроверкиКонтрагентов.АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, Форма.УникальныйИдентификатор);
+ Форма.РеквизитыПроверкиКонтрагентов.ИдентификаторЗадания = Неопределено;
+ Форма.РеквизитыПроверкиКонтрагентов.ЗаданиеВыполнено = Ложь;
+
+ СохранятьРезультатСразуПослеПроверки = ПараметрыФоновогоЗадания.Свойство("СохранятьРезультатСразуПослеПроверки")
+ И ПараметрыФоновогоЗадания.СохранятьРезультатСразуПослеПроверки;
+
+ ПараметрыЗапуска = Новый Структура;
+ ПараметрыЗапуска.Вставить("ДанныеКонтрагентов", ДанныеКонтрагентов);
+ ПараметрыЗапуска.Вставить("АдресХранилища", Форма.РеквизитыПроверкиКонтрагентов.АдресХранилища);
+ ПараметрыЗапуска.Вставить("СохранятьРезультатСразуПослеПроверки", СохранятьРезультатСразуПослеПроверки);
+
+ Параметры = Новый Массив;
+ Параметры.Добавить(ПараметрыЗапуска);
+
+ Попытка
+ ФоновоеЗадание = ФоновыеЗадания.Выполнить("ПроверкаКонтрагентов.ПроверитьКонтрагентовВДокументе",
+ Параметры, , НСтр("ru = 'Проверка контрагентов в документе'"));
+
+ Если ФоновоеЗадание <> Неопределено Тогда
+
+ Форма.РеквизитыПроверкиКонтрагентов.ИдентификаторЗадания = ФоновоеЗадание.УникальныйИдентификатор;
+ Форма.РеквизитыПроверкиКонтрагентов.ЗаданиеВыполнено
+ = ПроверкаКонтрагентовВызовСервера.ЗаданиеВыполнено(ФоновоеЗадание.УникальныйИдентификатор);
+
+ КонецЕсли;
+ Исключение
+
+ // Исключение возникнет при попытке запуска фонового задания, пока не отработало предыдущее фоновое задание.
+ // Специальной обработки не требуется.
+ КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации.
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Проверка контрагентов.Проверка контрагентов фоновым заданием в документе'", КодОсновногоЯзыка),
+ УровеньЖурналаРегистрации.Ошибка,,,ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
+
+ КонецПопытки;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ПоказатьПредварительныйРезультатПроверкиКонтрагентовИзКэша(Форма, ПараметрыФоновогоЗадания)
+
+ ДанныеКонтрагентов = ДанныеКонтрагентовВДокументе(Форма);
+ ПроверяемыеКонтрагенты = ДанныеКонтрагентов.Скопировать();
+
+ СвернутьДанныеКонтрагентов(ДанныеКонтрагентов);
+ ПолучитьСостоянияКонтрагентовИзКэша(ДанныеКонтрагентов, Истина);
+
+ ЗаполнитьСостояния(ПроверяемыеКонтрагенты, ДанныеКонтрагентов);
+
+ СохранятьРезультатСразуПослеПроверки = ПараметрыФоновогоЗадания.Свойство("СохранятьРезультатСразуПослеПроверки")
+ И ПараметрыФоновогоЗадания.СохранятьРезультатСразуПослеПроверки;
+
+ // Формируем результат в формате, необходимом для отображения в документе.
+ Результат = Новый Структура;
+ Результат.Вставить("ДанныеКонтрагентов", ПроверяемыеКонтрагенты);
+ Результат.Вставить("СохранятьРезультатСразуПослеПроверки", СохранятьРезультатСразуПослеПроверки);
+
+ Форма.РеквизитыПроверкиКонтрагентов.АдресХранилища = ПоместитьВоВременноеХранилище(Результат, Новый УникальныйИдентификатор);
+ ОтобразитьРезультатПроверкиКонтрагентаВДокументе(Форма);
+
+ Форма.РеквизитыПроверкиКонтрагентов.АдресДанныхКонтрагентовИзКэша = ПоместитьВоВременноеХранилище(ПроверяемыеКонтрагенты, Новый УникальныйИдентификатор);
+ Форма.РеквизитыПроверкиКонтрагентов.АдресХранилища = Неопределено;
+
+КонецПроцедуры
+
+// Процедура - Отображение результата проверки контрагентов в документе.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+Процедура ОтобразитьРезультатПроверкиКонтрагентаВДокументе(Форма) Экспорт
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+
+ СтандартнаяОбработка = Истина;
+ ПроверкаКонтрагентовПереопределяемый.ОтобразитьРезультатПроверкиКонтрагентаВДокументе(Форма, СтандартнаяОбработка);
+
+ // Если действия по отображению результата проверки переопределили, то стандартную обработку не выполняем.
+ Если НЕ СтандартнаяОбработка Тогда
+ Возврат;
+ КонецЕсли;
+
+ ПредотвратитьСбросРедактируемогоЗначения(Форма);
+
+ СостояниеПроверки = Перечисления.СостоянияПроверкиКонтрагентов.ПроверкаВыполнена;
+
+ Если ЗначениеЗаполнено(Форма.РеквизитыПроверкиКонтрагентов.АдресХранилища) И
+ ЭтоАдресВременногоХранилища(Форма.РеквизитыПроверкиКонтрагентов.АдресХранилища) Тогда
+
+ РезультатРаботыФоновогоЗадания = ПолучитьИзВременногоХранилища(Форма.РеквизитыПроверкиКонтрагентов.АдресХранилища);
+
+ Если РезультатРаботыФоновогоЗадания <> Неопределено Тогда
+
+ Если РезультатРаботыФоновогоЗадания.Свойство("НетДоступаКВебСервисуФНС") Тогда
+ // Нет доступа к сервису
+ СостояниеПроверки = Перечисления.СостоянияПроверкиКонтрагентов.НетДоступаКВебСервису;
+ Иначе
+ СостояниеПроверки = Перечисления.СостоянияПроверкиКонтрагентов.ПроверкаВыполнена;
+
+ // Фоновое задание отработало
+ ДанныеКонтрагентов = РезультатРаботыФоновогоЗадания.ДанныеКонтрагентов;
+ ЗапомнитьРезультатПроверкиКонтрагентов(Форма, ДанныеКонтрагентов);
+
+ Если РезультатРаботыФоновогоЗадания.СохранятьРезультатСразуПослеПроверки Тогда
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументОбъект = ОбъектИСсылкаПоФорме.Объект;
+
+ СохранитьРезультатПроверкиКонтрагентов(Форма, ДокументОбъект);
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ // Очищаем свойства фонового задания.
+ Форма.РеквизитыПроверкиКонтрагентов.АдресХранилища = Неопределено;
+ Форма.РеквизитыПроверкиКонтрагентов.ИдентификаторЗадания = Неопределено;
+ Форма.РеквизитыПроверкиКонтрагентов.ЗаданиеВыполнено = Истина;
+
+ ПрорисоватьСостоянияКонтрагентовВДокументе(Форма, СостояниеПроверки);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Устанавливаются параметры динамического списка документов и применяется условное оформление.
+//
+// Параметры:
+// Список - ДинамическийСписок - Список документов.
+Процедура ПриСозданииНаСервереСписокДокументов(Список) Экспорт
+
+ УстановитьПараметрыДинамическогоСписка(Список);
+ УстановитьУсловноеОформлениеСпискаДокументов(Список);
+
+КонецПроцедуры
+
+// Процедура - Запоминание результатов проверки контрагентов в дополнительные свойства для последующего сохранения
+// в регистр при помощи подписки на события.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+// ТекущийОбъект - ДокументОбъект - документ, запись которого выполняется.
+Процедура ПередЗаписьюНаСервереДокумент(Форма, ТекущийОбъект) Экспорт
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+
+ // Для документов с табличными частями.
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВТабличнойЧасти(Форма) Тогда
+
+ ДанныеКонтрагентов = ДанныеКонтрагентовВДокументе(Форма);
+ ТекущийОбъект.ДополнительныеСвойства.Вставить("ДанныеКонтрагентов", ДанныеКонтрагентов);
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Запуск проверки контрагента, установка условного оформления.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+// Параметры - Структура - Если изменения произошли в табличной части.
+// В записи с ключем ИмяТаблицы указывается ИмяТаблицы, в записи с ключем Идентификатор указывается Идентификатор
+// строки, в которой произошло изменение контрагента или даты.
+// - Строка - Имя элемента управления формы, в случае если произошло изменение в контрагенте, находящегося в шапке.
+// - Дата - Дата документа, в случае если произошло изменение даты
+// - Неопределено - если требуется проверка всех контрагентов в документе.
+Процедура ПриСозданииНаСервереДокумент(Форма, Параметры) Экспорт
+
+ ИнициализироватьРеквизитыФормыДокумент(Форма);
+
+ Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется = ПроверкаКонтрагентовВызовСервера.ИспользованиеПроверкиВозможно();
+ Форма.РеквизитыПроверкиКонтрагентов.НужноПоказатьПредложениеВключитьПроверкуКонтрагентов =
+ НужноПоказатьПредложениеВключитьПроверкуКонтрагентов();
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументСсылка = ОбъектИСсылкаПоФорме.Ссылка;
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+
+ УправлениеФормойПриСозданииНаСервере(Форма);
+
+ // Фоновое задание не запускаем, если это новый документ.
+ Если ЗначениеЗаполнено(ДокументСсылка) ИЛИ ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда
+
+ ДополнительныеПараметры = Истина;
+ ПараметрыФоновогоЗадания = ПроверкаКонтрагентовКлиентСервер.ПараметрыФоновогоЗадания(ДополнительныеПараметры);
+ Форма.ПроверитьКонтрагентовФоновоеЗадание(ПараметрыФоновогоЗадания);
+
+ КонецЕсли;
+
+ Иначе
+ ПрорисоватьСостоянияКонтрагентовВДокументе(Форма, Перечисления.СостоянияПроверкиКонтрагентов.ПроверкаНеИспользуется);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Восстановление результатов проверки контрагентов в табличной части после записи.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+// ТекущийОбъект - ДокументОбъект - документ, запись которого выполняется.
+Процедура ПослеЗаписиНаСервере(Форма, ТекущийОбъект) Экспорт
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВТабличнойЧасти(Форма) Тогда
+ ВосстановитьРезультатПроверкиКонтрагентовВТабличныхЧастяхПослеЗаписи(Форма, ТекущийОбъект);
+ КонецЕсли;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Сохранение результатов проверки контрагентов в регистр при записи.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+// ТекущийОбъект - ДокументОбъект - документ, запись которого выполняется.
+Процедура ПриЗаписиНаСервере(Форма, ТекущийОбъект) Экспорт
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+ СохранитьРезультатПроверкиКонтрагентов(Форма, ТекущийОбъект);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Вспомогательный API. Инициализировать реквизиты проверки контрагента в форме документа.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+Процедура ИнициализироватьРеквизитыФормыДокумент(Форма) Экспорт
+
+ НовыеРеквизиты = Новый Структура;
+
+ ЭтоДокументСКонтрагентомВШапке = ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВШапке(Форма);
+ ЭтоДокументСКонтрагентомВТабличнойЧасти = ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВТабличнойЧасти(Форма);
+ ЭтоДокументСоСчетомФактуройВПодвале = ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСоСчетомФактуройВПодвале(Форма);
+ ЭтоСчетФактура = ПроверкаКонтрагентовКлиентСервер.ЭтоСчетФактура(Форма);
+
+ // Служебный реквизит для работы фонового задания.
+ НовыеРеквизиты.Вставить("АдресХранилища");
+ // Служебный реквизит для работы фонового задания.
+ НовыеРеквизиты.Вставить("ИдентификаторЗадания", Новый УникальныйИдентификатор);
+ // Служебный реквизит для работы фонового задания.
+ НовыеРеквизиты.Вставить("ЗаданиеВыполнено", Истина);
+ // Включена ли проверка и есть ли доступ на использование проверки.
+ НовыеРеквизиты.Вставить("ПроверкаИспользуется", Ложь);
+ // Результат проверки контрагентов в документе. Содержит ли документ некорректных контрагентов.
+ НовыеРеквизиты.Вставить("ЭтоДокументСОшибкой", Ложь);
+ // Результат проверки контрагентов в документе. Итоговое состояние контрагентов в документе.
+ НовыеРеквизиты.Вставить("СостояниеКонтрагентов", Перечисления.СостоянияПроверкиКонтрагентов.ПустаяСсылка());
+ // Служебный реквизит
+ НовыеРеквизиты.Вставить("НужноПоказатьПредложениеВключитьПроверкуКонтрагентов");
+ // Позволяет не прорисовывать результат проверки контрагентов,
+ // если начато редактирование табличной части документа.
+ // Позволяет избежать ошибки сброса редактируемого значений при выводе результатов проверки.
+ НовыеРеквизиты.Вставить("ОтложитьПрорисовкуРезультатаПроверкиКонтрагентов", Ложь);
+ // Служебный реквизит
+ НовыеРеквизиты.Вставить("АдресДанныхКонтрагентовИзКэша", Неопределено);
+
+ Если ЭтоДокументСКонтрагентомВШапке Тогда
+ // Результат проверки контрагента в шапке документа.
+ НовыеРеквизиты.Вставить("СостояниеКонтрагента", Перечисления.СостоянияПроверкиКонтрагентов.ПустаяСсылка());
+ КонецЕсли;
+
+ // Результат проверки контрагентов в счете-фактуре.
+ Если ЭтоДокументСоСчетомФактуройВПодвале ИЛИ ЭтоСчетФактура Тогда
+ // Итоговое состояние контрагентов в счете-фактуре.
+ НовыеРеквизиты.Вставить("СостояниеКонтрагентовВСчетеФактуре", Перечисления.СостоянияПроверкиКонтрагентов.ПустаяСсылка());
+ // Итоговое состояние счета-фактуры.
+ НовыеРеквизиты.Вставить("ЭтоСчетФактураСОшибкой", Ложь);
+ КонецЕсли;
+
+ Если ЭтоСчетФактура Тогда
+
+ // Состояния проверки каждого контрагента в счете-фактуре.
+ Описание = ОписаниеДокументов(Форма);
+ Для Каждого СтрокаОписания Из Описание Цикл
+ ИмяРеквизитаСчетаФактуры = ИмяРеквизита(Форма, СтрокаОписания.Элемент.Имя);
+ НовыеРеквизиты.Вставить(ИмяРеквизитаСостоянияКонтрагентаВСчетеФактуре(ИмяРеквизитаСчетаФактуры),
+ Перечисления.СостоянияПроверкиКонтрагентов.ПустаяСсылка());
+ КонецЦикла;
+
+ КонецЕсли;
+
+ Форма.РеквизитыПроверкиКонтрагентов = НовыеРеквизиты;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ПроверкаКонтрагентовВОтчетах
+
+// Процедура - Инициализация данных для проверки.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов.
+Процедура ПередФормированиемОтчета(Форма) Экспорт
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+ Форма.РеквизитыПроверкиКонтрагентов.ЕстьДоступКВебСервисуФНС = ЕстьДоступКВебСервисуФНС();
+ Форма.РеквизитыПроверкиКонтрагентов.ВыведеныВсеСтроки = Истина;
+ Форма.ПроверкаКонтрагентовПереключательРежимаОтображения = "Все";
+ Форма.ПроверкаКонтрагентовНедействующиеКонтрагенты.Очистить();
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Добавление контрагента на проверку.
+//
+// Параметры:
+// СтруктураПараметров - Структура - Параметры формирования отчета.
+// Для проверки контрагентов в отчете важно наличие ключа "ДанныеДляПроверкиКонтрагентов".
+// Данный ключ формируется в процедуре ДобавитьПараметрыДляПроверкиКонтрагентов.
+// НомерСтрокиТабличногоДокумента - Число - Номер строки табличного документа, содержащей контрагент.
+// Контрагент - СправочникСсылка - Проверяемый контрагент в строке отчета.
+// ИНН - Строка - ИНН контрагента.
+// КПП - Строка - ИНН контрагента.
+// Дата - Дата - Дата, на которую необходимо выполнять проверку контрагента.
+Процедура ДобавитьКонтрагентаНаПроверку(СтруктураПараметров, НомерСтрокиТабличногоДокумента, Контрагент, ИНН, КПП, Дата) Экспорт
+
+ ДанныеДляПроверкиКонтрагентов = СтруктураПараметров.ДанныеДляПроверкиКонтрагентов;
+
+ // Если проверка не включена, то не добавляем контрагентов на проверку.
+ Если НЕ ДанныеДляПроверкиКонтрагентов.ПроверкаКонтрагентовИспользуется Тогда
+ Возврат;
+ КонецЕсли;
+
+ НедействующиеКонтрагенты = ДанныеДляПроверкиКонтрагентов.НедействующиеКонтрагенты;
+
+ // Проверяем условия, при которых добавлять контрагентов на проверку не нужно.
+ Если НедействующиеКонтрагенты = Неопределено
+ ИЛИ НЕ ЗначениеЗаполнено(Контрагент)
+ ИЛИ ДанныеДляПроверкиКонтрагентов.ВыводитьТолькоНекорректныхКонтрагентов Тогда
+ Возврат;
+ КонецЕсли;
+
+ // Проверка заполненности даты события.
+ Если НЕ ЗначениеЗаполнено(Дата) Тогда
+ Возврат;
+ КонецЕсли;
+
+ НоваяСтрока = НедействующиеКонтрагенты.Добавить();
+ НоваяСтрока.СтрокаТабличногоДокумента = НомерСтрокиТабличногоДокумента;
+ НоваяСтрока.Контрагент = Контрагент;
+ НоваяСтрока.Дата = НачалоДня(Дата);
+ НоваяСтрока.ИНН = ИНН;
+ НоваяСтрока.КПП = КПП;
+
+КонецПроцедуры
+
+// Функция - Определяет, нужно ли выводить данную строку в отчете по некорректным контрагентам.
+//
+// Параметры:
+// СтруктураПараметров - Структура - Параметры формирования отчета.
+// Для проверки контрагентов в отчете важно наличие ключа "ДанныеДляПроверкиКонтрагентов".
+// Данный ключ формируется в процедуре ДобавитьПараметрыДляПроверкиКонтрагентов.
+// Контрагент - СправочникСсылка - Проверяемый контрагент в строке отчета.
+// ИНН - Строка - ИНН контрагента.
+// КПП - Строка - ИНН контрагента.
+// Дата - Дата - Дата, на которую необходимо выполнять проверку контрагента.
+// Возвращаемое значение:
+// Булево - Истина, если данную строку необходимо выводить в отчете по некорректным контрагентам.
+Функция ВыводитьСтрокуОтчета(СтруктураПараметров, Контрагент, ИНН, КПП, Дата) Экспорт
+
+ Если НЕ ЭтоОтчетПоНекорректнымКонтрагентам(СтруктураПараметров) Тогда
+ Возврат Истина;
+ КонецЕсли;
+
+ ВыводитьСтроку = Истина;
+ СтандартнаяОбработка = Истина;
+ ПроверкаКонтрагентовПереопределяемый.ОпределитьНужноЛиВыводитьСтрокуОтчета(
+ СтруктураПараметров, Контрагент, ИНН, КПП, Дата, ВыводитьСтроку, СтандартнаяОбработка);
+
+ // Если действия переопределили, то стандартную обработку не выполняем.
+ Если НЕ СтандартнаяОбработка Тогда
+ Возврат ВыводитьСтроку;
+ КонецЕсли;
+
+ ДанныеДляПроверкиКонтрагентов = СтруктураПараметров.ДанныеДляПроверкиКонтрагентов;
+ НедействующиеКонтрагенты = ДанныеДляПроверкиКонтрагентов.НедействующиеКонтрагенты;
+
+ ВыводитьСтроку = НедействующиеКонтрагенты.НайтиСтроки(
+ Новый Структура("Контрагент, ИНН, КПП, Дата", Контрагент, ИНН, КПП, НачалоДня(Дата))).Количество() > 0;
+
+ Возврат ВыводитьСтроку;
+
+КонецФункции
+
+// Процедура - Запоминает данные отчета полученные при первоначальном формировании отчета
+// и используемые в дальнейшем для проверки контрагентов в отчете.
+//
+// Параметры:
+// СтруктураПараметров - Структура - Параметры формирования отчета.
+// Для проверки контрагентов в отчете важно наличие ключа "ДанныеДляПроверкиКонтрагентов".
+// Данный ключ формируется в процедуре ДобавитьПараметрыДляПроверкиКонтрагентов.
+// ДанныеОтчета - РезультатЗапроса - Данные отчета полученные при первоначальном формировании отчета
+// и используемые в дальнейшем для проверки контрагентов.
+Процедура ЗапомнитьДанныеОтчета(СтруктураПараметров, ДанныеОтчета) Экспорт
+
+ Если СтруктураПараметров.Свойство("ДанныеДляПроверкиКонтрагентов")
+ И СтруктураПараметров.ДанныеДляПроверкиКонтрагентов.ПроверкаКонтрагентовИспользуется
+ И НЕ СтруктураПараметров.ДанныеДляПроверкиКонтрагентов.ВыводитьТолькоНекорректныхКонтрагентов
+ И СтруктураПараметров.ДанныеДляПроверкиКонтрагентов.Свойство("ПроверкаКонтрагентовАдресДанныхОтчета") Тогда
+
+ СтруктураПараметров.ДанныеДляПроверкиКонтрагентов.ПроверкаКонтрагентовАдресДанныхОтчета =
+ ПоместитьВоВременноеХранилище(ДанныеОтчета, СтруктураПараметров.ДанныеДляПроверкиКонтрагентов.ПроверкаКонтрагентовАдресДанныхОтчета);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Сохранение таблицы с контрагентами, участвующими в отчете.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов.
+// РезультатВыполнения - Структура - Результат формирования отчета, содержащий свойство ДанныеДляПроверкиКонтрагентов.
+Процедура ЗапомнитьРезультатФормированияОтчета(Форма, РезультатВыполнения) Экспорт
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется И РезультатВыполнения.Свойство("ДанныеДляПроверкиКонтрагентов") Тогда
+
+ ДанныеДляПроверкиКонтрагентов = РезультатВыполнения.ДанныеДляПроверкиКонтрагентов;
+
+ Если ДанныеДляПроверкиКонтрагентов.Свойство("ПроверкаКонтрагентовАдресДанныхОтчета") Тогда
+ Форма.РеквизитыПроверкиКонтрагентов.АдресДанныхОтчета = ДанныеДляПроверкиКонтрагентов.ПроверкаКонтрагентовАдресДанныхОтчета;
+ КонецЕсли;
+
+ Форма.ЗначениеВРеквизитФормы(ДанныеДляПроверкиКонтрагентов.НедействующиеКонтрагенты, "ПроверкаКонтрагентовНедействующиеКонтрагенты");
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Добавление в параметры формирования отчета данных, необходимых для проверки контрагентов в отчете.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов.
+// ПараметрыОтчета - Структура - Параметры формирования отчета.
+// ЭтоПервоеФормированиеОтчета - Булево - Истина, если это формирование отчета перед проверкой контрагентов
+// Ложь, если это формирование отчета при проверке контрагентов.
+// ПолныйОтчет - ТабличныйДокумент - Табличный документ, содержащий в себе сформированный отчет
+// в исходном виде (до проверки контрагентов). Если ЭтоПервоеФормированиеОтчета = Истина, то ПолныйОтчет можно не
+// передавать.
+Процедура ДобавитьПараметрыДляПроверкиКонтрагентов(Форма, ПараметрыОтчета, ЭтоПервоеФормированиеОтчета, ПолныйОтчет = Неопределено) Экспорт
+
+ ДанныеДляПроверкиКонтрагентов = Новый Структура;
+ ДанныеДляПроверкиКонтрагентов.Вставить("ПроверкаКонтрагентовИспользуется", Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется);
+
+ Если ЭтоПервоеФормированиеОтчета Тогда
+ ДанныеДляПроверкиКонтрагентов.Вставить("ПроверкаКонтрагентовАдресДанныхОтчета", ПоместитьВоВременноеХранилище(Неопределено, Форма.УникальныйИдентификатор));
+ Иначе
+ ДанныеДляПроверкиКонтрагентов.Вставить("ДанныеОтчета", ПолучитьИзВременногоХранилища(Форма.РеквизитыПроверкиКонтрагентов.АдресДанныхОтчета));
+ ДанныеДляПроверкиКонтрагентов.Вставить("ПолныйОтчет", ПолныйОтчет);
+ КонецЕсли;
+
+ ДанныеДляПроверкиКонтрагентов.Вставить("НедействующиеКонтрагенты",
+ Форма.РеквизитФормыВЗначение("ПроверкаКонтрагентовНедействующиеКонтрагенты", Тип("ТаблицаЗначений")));
+ ДанныеДляПроверкиКонтрагентов.Вставить("ВыводитьТолькоНекорректныхКонтрагентов", НЕ ЭтоПервоеФормированиеОтчета);
+
+ ПараметрыОтчета.Вставить("ДанныеДляПроверкиКонтрагентов", ДанныеДляПроверкиКонтрагентов);
+
+КонецПроцедуры
+
+// Функция - Определяем, формируется ли отчет стандартным способом.
+//
+// Параметры:
+// СтруктураПараметров - Структура - Параметры формирования отчета.
+// Для проверки контрагентов в отчете важно наличие ключа "ДанныеДляПроверкиКонтрагентов".
+// Данный ключ формируется в процедуре ДобавитьПараметрыДляПроверкиКонтрагентов.
+// ДанныеОтчета - РезультатЗапроса - Данные отчета полученные при первоначальном формировании отчета
+// и используемые в дальнейшем для проверки контрагентов.
+// Возвращаемое значение:
+// Булево - Истина, если это формирование отчета до проверки контрагентов.
+Функция ФормироватьОтчетСтандартнымСпособом(СтруктураПараметров, ДанныеОтчета) Экспорт
+
+ ФормироватьОтчетСтандартнымСпособом = Истина;
+ ДанныеДляПроверкиКонтрагентов = СтруктураПараметров.ДанныеДляПроверкиКонтрагентов;
+ Если ДанныеДляПроверкиКонтрагентов.ПроверкаКонтрагентовИспользуется И ДанныеДляПроверкиКонтрагентов.ВыводитьТолькоНекорректныхКонтрагентов Тогда
+ ДанныеОтчета = ДанныеДляПроверкиКонтрагентов.ДанныеОтчета;
+ ФормироватьОтчетСтандартнымСпособом = Ложь;
+ КонецЕсли;
+
+ Возврат ФормироватьОтчетСтандартнымСпособом;
+
+КонецФункции
+
+// Процедура - Дополнение результата формирования отчета результатами проверки контрагентов.
+//
+// Параметры:
+// РезультатФормирования - Структура - Результат формирования отчета.
+// СтруктураПараметров - Структура - Результат проверки контрагентов.
+//
+Процедура ДополнитьРезультатФормированияОтчетаДаннымиПоПроверкеКонтрагентов(РезультатФормирования, СтруктураПараметров) Экспорт
+
+ ДанныеДляПроверкиКонтрагентов = СтруктураПараметров.ДанныеДляПроверкиКонтрагентов;
+ РезультатФормирования.Вставить("ДанныеДляПроверкиКонтрагентов", ДанныеДляПроверкиКонтрагентов);
+
+КонецПроцедуры
+
+// Процедура - Метод фонового задания по проверке контрагентов в отчете.
+//
+// Параметры:
+// СтруктураПараметров - Структура - Параметры формирования отчета.
+// Для проверки контрагентов в отчете важно наличие ключа "ДанныеДляПроверкиКонтрагентов".
+// Данный ключ формируется в процедуре ДобавитьПараметрыДляПроверкиКонтрагентов.
+// АдресХранилища - Строка - Адрес временного хранилища, в который помещается результат
+// выполнения фонового задания по проверке контрагентов.
+//
+Процедура ОпределитьНедействующихКонтрагентовВОтчетеФоновоеЗадание(СтруктураПараметров, АдресХранилища) Экспорт
+
+ ДанныеДляПроверкиКонтрагентов = СтруктураПараметров.ДанныеДляПроверкиКонтрагентов;
+ ПолныйОтчет = ДанныеДляПроверкиКонтрагентов.ПолныйОтчет;
+
+ Если ЕстьДоступКВебСервисуФНС() Тогда
+
+ // Проверяем контрагентов на корректность.
+ ПроверяемыеКонтрагенты = ДанныеДляПроверкиКонтрагентов.НедействующиеКонтрагенты;
+
+ Если НедействующиеКонтрагентыОпределены(ПроверяемыеКонтрагенты) Тогда
+
+ Если ПроверяемыеКонтрагенты.Количество() > 0 Тогда
+
+ ВыделитьКонтрагентовСОшибкамиВОтчете(ПроверяемыеКонтрагенты, ПолныйОтчет);
+
+ ДанныеДляПроверкиКонтрагентов.НедействующиеКонтрагенты = ПроверяемыеКонтрагенты;
+
+ // Формируем отчет, в котором оставляем только некорректных контрагентов.
+ ПроверкаКонтрагентовОтчетПоНекорректнымКонтрагентам = Новый ТабличныйДокумент;
+ ПроверкаКонтрагентовПереопределяемый.СформироватьОтчет(СтруктураПараметров, ПроверкаКонтрагентовОтчетПоНекорректнымКонтрагентам);
+
+ Результат = Новый Структура;
+ Результат.Вставить("НедействующиеКонтрагенты", ПроверяемыеКонтрагенты);
+ // Отчет, содержащий только некорректных контрагентов.
+ Результат.Вставить("ПроверкаКонтрагентовОтчетПоНекорректнымКонтрагентам", ПроверкаКонтрагентовОтчетПоНекорректнымКонтрагентам);
+ // Отчет, содержащий всех контрагентов; некорректные подсвечены красным.
+ Результат.Вставить("РезультатФормированияОтчета", ПолныйОтчет);
+
+ Иначе
+
+ Результат = Новый Структура;
+ Результат.Вставить("НедействующиеКонтрагенты", ПроверяемыеКонтрагенты);
+ Результат.Вставить("ПроверкаКонтрагентовОтчетПоНекорректнымКонтрагентам", Новый ТабличныйДокумент);
+ Результат.Вставить("РезультатФормированияОтчета", ПолныйОтчет);// Исходный отчет без изменений.
+
+ КонецЕсли;
+
+ Иначе
+
+ Результат = Новый Структура;
+ Результат.Вставить("НетДоступаКВебСервисуФНС", Истина);
+
+ КонецЕсли;
+
+ Иначе
+ Результат = Новый Структура;
+ Результат.Вставить("НетДоступаКВебСервисуФНС", Истина);
+ КонецЕсли;
+
+ ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
+
+КонецПроцедуры
+
+// Процедура - Запуск фонового задания по проверке контрагентов в отчете.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов.
+// СтруктураПараметров - Структура - Параметры формирования отчета.
+// Для проверки контрагентов в отчете важно наличие ключа "ДанныеДляПроверкиКонтрагентов".
+// Данный ключ формируется в процедуре ДобавитьПараметрыДляПроверкиКонтрагентов.
+Процедура ПроверитьКонтрагентовВОтчете(Форма, СтруктураПараметров) Экспорт
+
+ Форма.РеквизитыПроверкиКонтрагентов.ИдентификаторЗадания = Неопределено;
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ОтчетПоНекорректнымКонтрагентам <> Неопределено Тогда
+ Форма.РеквизитыПроверкиКонтрагентов.ОтчетПоНекорректнымКонтрагентам.Очистить();
+ КонецЕсли;
+
+ НаименованиеЗадания = НСтр("ru = 'Проверка контрагентов в отчете'");
+
+ РезультатПроверки = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
+ Форма.УникальныйИдентификатор,
+ "ПроверкаКонтрагентов.ОпределитьНедействующихКонтрагентовВОтчетеФоновоеЗадание",
+ СтруктураПараметров,
+ НаименованиеЗадания);
+
+ Форма.РеквизитыПроверкиКонтрагентов.АдресХранилища = РезультатПроверки.АдресХранилища;
+ Форма.РеквизитыПроверкиКонтрагентов.ИдентификаторЗадания = РезультатПроверки.ИдентификаторЗадания;
+ Форма.РеквизитыПроверкиКонтрагентов.ЗаданиеВыполнено = РезультатПроверки.ЗаданиеВыполнено;
+
+КонецПроцедуры
+
+// Процедура - Отображение результата проверки контрагента в отчете.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов.
+// ПолеТабличногоДокумента - ПолеФормы с видом ПолеТабличногоДокумента - поле, в которое необходимо выводить отчет.
+// РезультатФормированияОтчета - ТабличныйДокумент - Документ, предназначенный для вывода в поле формы.
+Процедура ОтобразитьРезультатПроверкиКонтрагентаВОтчете(Форма, ПолеТабличногоДокумента, РезультатФормированияОтчета) Экспорт
+
+ РезультатПроверки = ПолучитьИзВременногоХранилища(Форма.РеквизитыПроверкиКонтрагентов.АдресХранилища);
+
+ Если РезультатПроверки.Свойство("НетДоступаКВебСервисуФНС") Тогда
+ // Не удалось проверить контрагентов.
+ Форма.РеквизитыПроверкиКонтрагентов.ЕстьДоступКВебСервисуФНС = Ложь;
+ Иначе
+ // Множество некорректных контрагентов.
+ Форма.ЗначениеВРеквизитФормы(
+ РезультатПроверки.НедействующиеКонтрагенты, "ПроверкаКонтрагентовНедействующиеКонтрагенты");
+ // Отчет, содержащий только некорректных контрагентов.
+ Форма.РеквизитыПроверкиКонтрагентов.ОтчетПоНекорректнымКонтрагентам =
+ РезультатПроверки.ПроверкаКонтрагентовОтчетПоНекорректнымКонтрагентам;
+ // Отчет, содержащий всех контрагентов, некорректные подсвечены красным.
+ РезультатФормированияОтчета =
+ РезультатПроверки.РезультатФормированияОтчета;
+ КонецЕсли;
+ Форма.РеквизитыПроверкиКонтрагентов.ПроверкаВыполнялась = Истина;
+
+ СтандартнаяОбработка = Истина;
+ ПроверкаКонтрагентовПереопределяемый.ОтобразитьРезультатПроверкиКонтрагентаВОтчете(Форма, СтандартнаяОбработка);
+
+ // Если действия по отображению результата проверки переопределили, то стандартную обработку не выполняем.
+ Если НЕ СтандартнаяОбработка Тогда
+ Возврат;
+ КонецЕсли;
+
+ ПроверкаКонтрагентовКлиентСервер.ВывестиНужнуюПанельПроверкиКонтрагентовВОтчете(Форма);
+ ВывестиОтчет(Форма, ПолеТабличногоДокумента, РезультатФормированияОтчета);
+
+КонецПроцедуры
+
+// Процедура - Вывод результата проверки контрагента в поле табличного документа.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов.
+// ПолеТабличногоДокумента - ПолеФормы с видом ПолеТабличногоДокумента - поле, в которое необходимо выводить отчет.
+// РезультатФормированияОтчета - ТабличныйДокумент - Документ, предназначенный для вывода в поле формы.
+Процедура ВывестиОтчет(Форма, ПолеТабличногоДокумента, РезультатФормированияОтчета) Экспорт
+
+ СтандартнаяОбработка = Истина;
+
+ ПроверкаКонтрагентовПереопределяемый.ВывестиОтчет(Форма, ПолеТабличногоДокумента, РезультатФормированияОтчета, СтандартнаяОбработка);
+
+ // Если действия переопределили, то стандартную обработку не выполняем.
+ Если НЕ СтандартнаяОбработка Тогда
+ Возврат;
+ КонецЕсли;
+
+ ПолеТабличногоДокумента.Очистить();
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется
+ // Пользователь выбрал режим просмотра - "Только контрагенты с ошибками".
+ И НЕ Форма.РеквизитыПроверкиКонтрагентов.ВыведеныВсеСтроки Тогда
+
+ // Выводим только контрагентов с ошибками.
+ ПолеТабличногоДокумента.Вывести(Форма.РеквизитыПроверкиКонтрагентов.ОтчетПоНекорректнымКонтрагентам);
+ Иначе
+ ПолеТабличногоДокумента.Вывести(РезультатФормированияОтчета);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Отображение результата проверки контрагента в отчете.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов.
+// ПолеТабличногоДокумента - ПолеФормы с видом ПолеТабличногоДокумента - поле, в которое необходимо выводить отчет.
+// РезультатФормированияОтчета - ТабличныйДокумент - Документ, предназначенный для вывода в поле формы.
+Процедура ПереключитьРежимОтображенияОтчета(Форма, ПолеТабличногоДокумента, РезультатФормированияОтчета) Экспорт
+
+ Форма.РеквизитыПроверкиКонтрагентов.ВыведеныВсеСтроки = НЕ Форма.РеквизитыПроверкиКонтрагентов.ВыведеныВсеСтроки;
+
+ ПроверкаКонтрагентовКлиентСервер.УстановитьВидПанелиПроверкиКонтрагентовВОтчете(Форма, "НайденыНекорректныеКонтрагенты");
+
+ ВывестиОтчет(Форма, ПолеТабличногоДокумента, РезультатФормированияОтчета);
+
+КонецПроцедуры
+
+// Процедура - Устанавливается вид панели с результатом проверки.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов.
+Процедура ПриСозданииНаСервереОтчет(Форма) Экспорт
+
+ ИнициализироватьРеквизитыФормыОтчета(Форма);
+
+ Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется = ПроверкаКонтрагентовВызовСервера.ИспользованиеПроверкиВозможно();
+ Форма.РеквизитыПроверкиКонтрагентов.НужноПоказатьПредложениеВключитьПроверкуКонтрагентов =
+ НужноПоказатьПредложениеВключитьПроверкуКонтрагентов();
+
+ УстановитьНадписиВПанелиОтчетаПриСозданииНаСервере(Форма);
+ ПроверкаКонтрагентовКлиентСервер.УстановитьВидПанелиПроверкиКонтрагентовВОтчете(Форма);
+
+КонецПроцедуры
+
+// Процедура - Вспомогательный API. Инициализировать реквизиты проверки контрагента в форме отчета.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов.
+Процедура ИнициализироватьРеквизитыФормыОтчета(Форма) Экспорт
+
+ НовыеРеквизиты = Новый Структура;
+
+ // Служебный реквизит для работы фонового задания.
+ НовыеРеквизиты.Вставить("АдресХранилища");
+ // Служебный реквизит для работы фонового задания.
+ НовыеРеквизиты.Вставить("ИдентификаторЗадания", Новый УникальныйИдентификатор);
+ // Служебный реквизит для работы фонового задания.
+ НовыеРеквизиты.Вставить("ЗаданиеВыполнено", Истина);
+ // Служебный реквизит для отображения отчета.
+ НовыеРеквизиты.Вставить("ВыведеныВсеСтроки", Истина);
+ // Служебный реквизит для отображения отчета.
+ НовыеРеквизиты.Вставить("ПроверкаВыполнялась", Ложь);
+ // Служебный реквизит для отображения отчета.
+ НовыеРеквизиты.Вставить("АдресДанныхОтчета");
+ // Наличие доступа к сервису проверки.
+ НовыеРеквизиты.Вставить("ЕстьДоступКВебСервисуФНС", Истина);
+ // Включена ли проверка и есть ли доступ на использование проверки.
+ НовыеРеквизиты.Вставить("ПроверкаИспользуется", Ложь);
+ // Табличный документ, отчет, содержащий только некорректных контрагентов.
+ НовыеРеквизиты.Вставить("ОтчетПоНекорректнымКонтрагентам", Новый ТабличныйДокумент);
+ // Служебный реквизит
+ НовыеРеквизиты.Вставить("НужноПоказатьПредложениеВключитьПроверкуКонтрагентов");
+
+ Форма.РеквизитыПроверкиКонтрагентов = НовыеРеквизиты;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ПроверкаКонтрагентовВСправочнике
+
+// Процедура - Проверка наличия доступа к проверке контрагентов, запуск проверки.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Карточка контрагента.
+Процедура ПриСозданииНаСервереКонтрагент(Форма, Параметры) Экспорт
+
+ ИнициализироватьРеквизитыФормыКонтрагент(Форма);
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ КонтрагентОбъект = ОбъектИСсылкаПоФорме.Объект;
+ КонтрагентСсылка = ОбъектИСсылкаПоФорме.Ссылка;
+
+ ПроверкаКонтрагентовИспользуется = ПроверкаКонтрагентовВызовСервера.ИспользованиеПроверкиВозможно();
+
+ Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется = ПроверкаКонтрагентовИспользуется;
+ Форма.РеквизитыПроверкиКонтрагентов.НужноПоказатьПредложениеВключитьПроверкуКонтрагентов =
+ НужноПоказатьПредложениеВключитьПроверкуКонтрагентов();
+
+ Если ПроверкаКонтрагентовИспользуется Тогда
+
+ СвойстваСправочникаКонтрагенты = ПроверкаКонтрагентовКлиентСервер.СвойстваСправочникаКонтрагенты();
+
+ ИНН = КонтрагентОбъект[СвойстваСправочникаКонтрагенты.ИНН];
+ КПП = КонтрагентОбъект[СвойстваСправочникаКонтрагенты.КПП];
+
+ Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагента =
+ ПроверкаКонтрагентовВызовСервера.ТекущееСохраненноеСостояниеКонтрагента(КонтрагентСсылка, ИНН, КПП);
+
+ Если ЗначениеЗаполнено(Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагента) Тогда
+ ПроверкаКонтрагентовКлиентСервер.ОтобразитьРезультатПроверкиКонтрагентаВСправочнике(Форма);
+ Иначе
+
+ Если (ЗначениеЗаполнено(КонтрагентСсылка) ИЛИ ЗначениеЗаполнено(Параметры.ЗначениеКопирования))
+ И (ЗначениеЗаполнено(ИНН) ИЛИ ЗначениеЗаполнено(КПП)) Тогда
+
+ ПроверкаКонтрагентовКлиентСервер.ПроверитьКонтрагентаИзКарточки(Форма, Истина);
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Устанавливаются параметры динамического списка документов.
+//
+// Параметры:
+// Список - ДинамическийСписок - Список документов.
+Процедура ПриСозданииНаСервереСписокКонтрагентов(Список) Экспорт
+
+ УстановитьПараметрыДинамическогоСписка(Список);
+ УстановитьУсловноеОформлениеСпискаКонтрагентов(Список);
+
+ Состояния = Новый Массив;
+ Состояния.Добавить(Перечисления.СостоянияСуществованияКонтрагента.КППНеСоответствуетИНН);
+ Состояния.Добавить(Перечисления.СостоянияСуществованияКонтрагента.ОтсутствуетВРеестре);
+ Состояния.Добавить(Перечисления.СостоянияСуществованияКонтрагента.ПрекратилДеятельность);
+
+ Список.Параметры.УстановитьЗначениеПараметра("Состояния", Состояния);
+
+КонецПроцедуры
+
+// Процедура - Добавляет в дополнительные свойства результат проверки контрагента
+// для последующей записи его в регистр в подписке на событие.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма карточки контрагента.
+// Объект - ДанныеФормыСтруктура - Контрагент-объект
+Процедура ПередЗаписьюНаСервереКонтрагент(Форма, Объект) Экспорт
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+
+ Объект.ДополнительныеСвойства.Вставить("ПроверкаКонтрагентовСостояниеКонтрагента", Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагента);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Вспомогательный API. Инициализировать реквизиты проверки контрагента в карточке контрагента.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Карточка контрагента, проверка которого выполняется.
+Процедура ИнициализироватьРеквизитыФормыКонтрагент(Форма) Экспорт
+
+ НовыеРеквизиты = Новый Структура;
+
+ // Результат проверки контрагента.
+ НовыеРеквизиты.Вставить("СостояниеКонтрагента");
+ // Включена ли проверка и есть ли доступ на использование проверки.
+ НовыеРеквизиты.Вставить("ПроверкаИспользуется", Ложь);
+ // Служебный реквизит для работы фонового задания.
+ НовыеРеквизиты.Вставить("ИнтервалПроверкиРезультата", 1);
+ // Служебный реквизит для работы фонового задания.
+ НовыеРеквизиты.Вставить("ИдентификаторЗадания", Новый УникальныйИдентификатор);
+ // Служебный реквизит для работы фонового задания.
+ НовыеРеквизиты.Вставить("ФоновоеЗаданиеЗапущено", Ложь);
+ // Служебный реквизит для работы фонового задания.
+ НовыеРеквизиты.Вставить("АдресХранилища");
+ // Служебный реквизит
+ НовыеРеквизиты.Вставить("НужноПоказатьПредложениеВключитьПроверкуКонтрагентов");
+
+ Форма.РеквизитыПроверкиКонтрагентов = НовыеРеквизиты;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область РаботаСРегистромСостоянияКонтрагентов
+
+// Процедура - Вспомогательный API. Позволяет очистить регистр СостоянияКонтрагентов.
+//
+// Параметры:
+// Контрагенты - Массив - Массив контрагентов. Если нужно очистить весь регистр, то параметр не указывается.
+Процедура УдалитьРезультатПроверкиКонтрагентов(Контрагенты = Неопределено) Экспорт
+
+ НачатьТранзакцию();
+
+ Попытка
+
+ Запрос = Новый Запрос;
+ Запрос.Текст =
+ "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
+ | СостоянияКонтрагентов.Контрагент,
+ | ЗНАЧЕНИЕ(Перечисление.СостоянияСуществованияКонтрагента.ПустаяСсылка) КАК Состояние,
+ | СостоянияКонтрагентов.ОбластьДанныхВспомогательныеДанные,
+ | СостоянияКонтрагентов.ИНН,
+ | СостоянияКонтрагентов.КПП
+ |ИЗ
+ | РегистрСведений.СостоянияКонтрагентов КАК СостоянияКонтрагентов
+ |ГДЕ
+ | (&ОчищатьПоВсемКонтрагентам
+ | ИЛИ СостоянияКонтрагентов.Контрагент В (&Контрагенты))";
+
+ Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда
+
+ Запрос.Текст = СтрЗаменить(
+ Запрос.Текст,
+ "СостоянияКонтрагентов.ОбластьДанныхВспомогательныеДанные,",
+ "");
+
+ КонецЕсли;
+
+ Если Контрагенты = Неопределено Тогда
+ Запрос.УстановитьПараметр("ОчищатьПоВсемКонтрагентам", Истина);
+ Запрос.УстановитьПараметр("Контрагенты", Новый Массив);
+ Иначе
+ Запрос.УстановитьПараметр("ОчищатьПоВсемКонтрагентам", Ложь);
+ Запрос.УстановитьПараметр("Контрагенты", Контрагенты);
+ КонецЕсли;
+
+ УстановитьПривилегированныйРежим(Истина);
+ ДанныеКонтрагентов = Запрос.Выполнить().Выгрузить();
+
+ НаборЗаписей = РегистрыСведений.СостоянияКонтрагентов.СоздатьНаборЗаписей();
+ НаборЗаписей.Загрузить(ДанныеКонтрагентов);
+ НаборЗаписей.Записать();
+
+ ЗафиксироватьТранзакцию();
+
+ Исключение
+
+ ОтменитьТранзакцию();
+
+ КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации.
+ ЗаписьЖурналаРегистрации(
+ НСтр("ru = 'Проверка контрагентов.Очистка предыдущих результатов проверок'", КодОсновногоЯзыка),
+ УровеньЖурналаРегистрации.Ошибка,,,
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+
+ КонецПопытки;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область РаботаСРегистромДокументыСОшибкамиПроверкиКонтрагентов
+
+// Процедура - Вспомогательный API. Позволяет очистить регистр ДокументыСОшибкамиПроверкиКонтрагентов.
+//
+// Параметры:
+// Документы - Массив - Документы, по которым нужно очистить результат проверки.
+// Если нужно очистить весь регистр, то параметр не указывается.
+Процедура УдалитьРезультатПроверкиКонтрагентовПоДокументам(Документы = Неопределено) Экспорт
+
+ НачатьТранзакцию();
+
+ Попытка
+
+ УстановитьПривилегированныйРежим(Истина);
+
+ Если Документы = Неопределено Тогда
+
+ НаборЗаписей = РегистрыСведений.ДокументыСОшибкамиПроверкиКонтрагентов.СоздатьНаборЗаписей();
+ НаборЗаписей.Записать();
+
+ Иначе
+
+ Для каждого Документ Из Документы Цикл
+
+ НаборЗаписей = РегистрыСведений.ДокументыСОшибкамиПроверкиКонтрагентов.СоздатьНаборЗаписей();
+ НаборЗаписей.Отбор.Документ.Установить(Документ);
+ НаборЗаписей.Очистить();
+ НаборЗаписей.Записать();
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ ЗафиксироватьТранзакцию();
+
+ Исключение
+
+ ОтменитьТранзакцию();
+
+ КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации.
+ ЗаписьЖурналаРегистрации(
+ НСтр("ru = 'Проверка контрагентов.Очистка предыдущих результатов проверок контрагентов в документах'", КодОсновногоЯзыка),
+ УровеньЖурналаРегистрации.Ошибка,,,
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+
+ КонецПопытки;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ОбновлениеИБИПодпискаНаПрограммныеСобытия
+
+// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер.
+//
+Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт
+
+ // СЕРВЕРНЫЕ ОБРАБОТЧИКИ.
+ СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить(
+ "ПроверкаКонтрагентов");
+
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда
+ СерверныеОбработчики[
+ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить(
+ "ПроверкаКонтрагентов");
+ КонецЕсли;
+
+ Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда
+ СерверныеОбработчики[
+ "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПослеЗагрузкиДанных"].Добавить(
+ "ПроверкаКонтрагентов");
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме.
+//
+// Параметры:
+// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления
+// общего модуля ОбновлениеИнформационнойБазы.
+//
+Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
+
+ Обработчик = Обработчики.Добавить();
+ Обработчик.Версия = "2.2.5.14";
+ Обработчик.Процедура = "ПроверкаКонтрагентов.ВключитьПроверкуКонтрагентовДляРежимаСервисов";
+ Обработчик.НачальноеЗаполнение = Истина;
+ Обработчик.ОбщиеДанные = Истина;
+
+ Обработчик = Обработчики.Добавить();
+ Обработчик.Версия = "2.2.5.14";
+ Обработчик.Процедура = "ПроверкаКонтрагентов.ПроверитьКонтрагентовПослеВключенияПроверки";
+ Обработчик.НачальноеЗаполнение = Истина;
+ Обработчик.РежимВыполнения = "Отложенно";
+ Обработчик.Комментарий = НСтр("ru = 'Проверяет существование контрагентов по базе ФНС.
+ |До завершения выполнения существование контрагента может быть определено не для всех контрагентов'");
+
+КонецПроцедуры
+
+// Заполняет соответствие имен методов их псевдонимам для вызова из очереди заданий.
+//
+// Параметры:
+// СоответствиеИменПсевдонимам - Соответствие
+// Ключ - Псевдоним метода, например ОчиститьОбластьДанных.
+// Значение - Имя метода для вызова, например РаботаВМоделиСервиса.ОчиститьОбластьДанных.
+// В качестве значения можно указать Неопределено, в этом случае считается что имя
+// совпадает с псевдонимом.
+//
+Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт
+
+ СоответствиеИменПсевдонимам.Вставить("ПроверкаКонтрагентов.ПроверитьКонтрагентовПослеВключенияПроверки");
+
+КонецПроцедуры
+
+// Вызывается после загрузки данных.
+//
+// Параметры:
+// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер
+// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий
+// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера.
+//
+Процедура ПослеЗагрузкиДанных(Контейнер) Экспорт
+
+ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
+
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда
+ ПараметрыЗадания = Новый Структура;
+ ПараметрыЗадания.Вставить("ИмяМетода", "ПроверкаКонтрагентов.ПроверитьКонтрагентовПослеВключенияПроверки");
+ ПараметрыЗадания.Вставить("КоличествоПовторовПриАварийномЗавершении", 3);
+
+ МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий");
+ МодульОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания);
+ КонецЕсли;
+
+ Иначе
+
+ // Запуск фонового задания после включения проверки не требуется.
+ ВключитьВыключитьПроверкуКонтрагентов(Истина);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область НастройкиПроверки
+
+// Процедура - Включение или отключение использования сервиса путем установки значения константе
+// ИспользоватьПроверкуКонтрагентов.
+//
+// Параметры:
+// ИспользоватьСервис - Булево - Истина, чтобы включить использование сервиса. Ложь - чтобы отключить.
+Процедура ВключитьВыключитьПроверкуКонтрагентов(ВключитьПроверку) Экспорт
+
+ // Устанавливаем значение константы.
+ Константы.ИспользоватьПроверкуКонтрагентов.Установить(ВключитьПроверку);
+
+КонецПроцедуры
+
+// Процедура - Запуск проверки контрагентов в фоне после включения проверки.
+Процедура ЗапуститьФоновуюПроверкуКонтрагентовПослеИзмененияНастройкиПриНеобходимости() Экспорт
+
+ ИспользоватьСервис = Константы.ИспользоватьПроверкуКонтрагентов.Получить();
+
+ ЗапуститьФоновуюПроверку = ИспользоватьСервис
+ И НЕ ОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы();
+
+ Если ЗапуститьФоновуюПроверку Тогда
+ ПроверитьКонтрагентовПослеВключенияПроверкиФоновоеЗадание();
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Метод обновления информационной базы для режима сервисов.
+Процедура ВключитьПроверкуКонтрагентовДляРежимаСервисов() Экспорт
+
+ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
+ // Запуск фонового задания после включения проверки не требуется.
+ ВключитьВыключитьПроверкуКонтрагентов(Истина);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Функция - Показывает, включена ли проверка контрагентов.
+// Возвращаемое значение:
+// Булево - Значение константы ИспользоватьПроверкуКонтрагентов - включена ли проверка контрагентов в базе.
+Функция ПроверкаКонтрагентовВключена() Экспорт
+
+ // Проверка, что сервис включен.
+ НастройкиСервиса = ПараметрыРаботыСервиса();
+ ИспользоватьСервис = НастройкиСервиса.ИспользоватьСервис;
+
+ Возврат ИспользоватьСервис;
+
+КонецФункции
+
+// Функция - Определяем наличие права на использование проверки контрагентов.
+// Возвращаемое значение:
+// Булево - наличие права на использование проверки контрагентов.
+Функция ЕстьПравоНаИспользованиеПроверки() Экспорт
+
+ Возврат ПравоДоступа("Чтение", Метаданные.Константы.ИспользоватьПроверкуКонтрагентов);
+
+КонецФункции
+
+// Функция - Определяем наличие права на включение проверки контрагентов.
+// Возвращаемое значение:
+// Булево - наличие права на включение проверки контрагентов.
+Функция ЕстьПравоНаРедактированиеНастроек() Экспорт
+
+ Возврат ПравоДоступа("Изменение", Метаданные.Константы.ИспользоватьПроверкуКонтрагентов);
+
+КонецФункции
+
+// Функция - Проверяет наличие доступа к веб-сервису ФНС.
+// Возвращаемое значение:
+// Булево - наличие доступа к веб-сервису ФНС.
+Функция ЕстьДоступКВебСервисуФНС() Экспорт
+
+ Прокси = ПроксиСервиса();
+
+ Если Прокси = Неопределено Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ // Проверяем на конкретных данных
+ ДанныеКонтрагента = Новый Структура();
+ ДанныеКонтрагента.Вставить("ИНН", "7709860400");
+ ДанныеКонтрагента.Вставить("КПП", "770901001");
+ ДанныеКонтрагента.Вставить("Дата", ДатаСтрокой(ТекущаяДатаСеанса()));
+
+ ПространствоИмен = ПространствоИменОтвета();
+ WSЗапрос = Прокси.ФабрикаXDTO.Создать(Прокси.ФабрикаXDTO.Тип(ПространствоИмен, "NdsRequest"));
+
+ ДобавитьКонтрагентаВЗапросКСервису(WSЗапрос, Прокси, ПространствоИмен, ДанныеКонтрагента);
+
+ NdsResponse = ОтветСервисаФНС(Прокси, WSЗапрос);
+
+ Если NdsResponse = Неопределено Тогда
+ Возврат Ложь;
+ Иначе
+ Возврат Истина;
+ КонецЕсли;
+
+КонецФункции
+
+// Функция - Определяет, отказался ли пользователь от использования сервиса в предложении на подключение.
+// Возвращаемое значение:
+// Булево - пользователь отказался от использования сервиса в предложении на подключение.
+Функция БольшеНеПоказыватьПредложениеПодключиться() Экспорт
+
+ Возврат ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПроверкаКонтрагентов", "ПроверкаКонтрагентов_БольшеНеПоказыватьПредложениеИспользоватьСервис") = Истина;
+
+КонецФункции
+
+// Процедура - Сохраняет дату последнего отображения предложения на использование сервиса.
+Процедура СохранитьДатуПоследнегоОтображенияПредложенияПодключиться() Экспорт
+
+ ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ПроверкаКонтрагентов", "ПроверкаКонтрагентов_ДатаПоследнегоОтображенияПредложенияНаВключениеСервиса", ТекущаяДатаСеанса());
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+#Область РаботаСВебСервисом
+
+// Функция - Значения настроек
+// Возвращаемое значение:
+// Структура - Признак использования сервиса и адрес веб-сервиса ФНС. Ключи - "ИспользоватьСервис", "АдресСервиса".
+Функция ПараметрыРаботыСервиса()
+
+ // заполняем общие настройки
+ ИспользоватьСервис = Константы.ИспользоватьПроверкуКонтрагентов.Получить();
+ АдресСервиса = "http://npchk.nalog.ru/FNSNDSCAWS?wsdl";
+
+ Возврат Новый Структура("ИспользоватьСервис, АдресСервиса", ИспользоватьСервис, АдресСервиса);
+
+КонецФункции
+
+Функция ПроксиСервиса()
+
+ WSПрокси = Неопределено;
+ Попытка
+
+ НастройкиСервиса = ПараметрыРаботыСервиса();
+ АдресСервиса = НастройкиСервиса.АдресСервиса;
+
+ Если ЗначениеЗаполнено(АдресСервиса) Тогда
+ WSПрокси = ПолучитьWSПрокси(АдресСервиса);
+ КонецЕсли;
+
+ Исключение
+
+ КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации.
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Проверка контрагентов.Ошибка доступа к веб-сервису проверки контрагентов'", КодОсновногоЯзыка),
+ УровеньЖурналаРегистрации.Ошибка,,,ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
+
+ КонецПопытки;
+
+ Возврат WSПрокси;
+
+КонецФункции
+
+Процедура ПолучитьРезультатПроверкиВебСервисом(ДанныеКонтрагентов, Отбор)
+
+ // Проверяем только тех контрагентов, которые соответствуют указанному отбору.
+ ДанныеКонтрагентовДляПроверкиСервисом = ДанныеКонтрагентов.НайтиСтроки(Отбор);
+ КоличествоКонтрагентов = ДанныеКонтрагентовДляПроверкиСервисом.Количество();
+
+ Если КоличествоКонтрагентов = 0 Тогда
+ // Нет данных для проверки
+ Возврат;
+ КонецЕсли;
+
+ Если НЕ ЕстьДоступКВебСервисуФНС() Тогда
+ // Нет доступа к веб-сервису
+ Возврат;
+ КонецЕсли;
+
+ Прокси = ПроксиСервиса();
+
+ ПространствоИмен = ПространствоИменОтвета();
+
+ РазмерПорции = 10000;
+
+ // Разбиваем всю таблицу на блоки запросов.
+ КоличествоЗапросов = ?(КоличествоКонтрагентов % РазмерПорции = 0, КоличествоКонтрагентов / РазмерПорции, Цел(КоличествоКонтрагентов / РазмерПорции) + 1);
+
+ // Выполняем несколько запросов. В каждом запросе не более 10000 строк.
+ Для НомерПорции = 1 По КоличествоЗапросов Цикл
+
+ МинимальныйНомерКонтрагента = Мин(РазмерПорции * (НомерПорции - 1), КоличествоКонтрагентов);
+ МаксимальныйНомерКонтрагента = Мин(РазмерПорции * НомерПорции, КоличествоКонтрагентов) - 1;
+
+ WSЗапрос = Прокси.ФабрикаXDTO.Создать(Прокси.ФабрикаXDTO.Тип(ПространствоИмен, "NdsRequest"));
+
+ Для ИндексТекущегоКонтрагента = МинимальныйНомерКонтрагента По МаксимальныйНомерКонтрагента Цикл
+
+ ДанныеКонтрагента = ДанныеКонтрагентовДляПроверкиСервисом[ИндексТекущегоКонтрагента];
+ ДобавитьКонтрагентаВЗапросКСервису(WSЗапрос, Прокси, ПространствоИмен, ДанныеКонтрагента);
+
+ КонецЦикла;
+
+ Если WSЗапрос.NP.Количество() = 0 Тогда
+ Продолжить;
+ КонецЕсли;
+
+ // Получаем результат проверки от сервиса.
+ NdsResponse = ОтветСервисаФНС(Прокси, WSЗапрос);
+
+ Если NdsResponse <> Неопределено Тогда
+ ОбработатьОтветСервиса(NdsResponse, ДанныеКонтрагентовДляПроверкиСервисом, МинимальныйНомерКонтрагента, МаксимальныйНомерКонтрагента);
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Функция ОтветСервисаФНС(Прокси, WSЗапрос)
+
+ // Получаем результат проверки от сервиса.
+ Попытка
+ NdsResponse = Прокси.NdsRequest(WSЗапрос);
+ Исключение
+
+ // Страхуемся от ошибки "Timeout was reached".
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Проверка контрагентов.NdsRequest'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+
+ NdsResponse = Неопределено;
+
+ КонецПопытки;
+
+ Возврат NdsResponse;
+
+КонецФункции
+
+Процедура ДобавитьКонтрагентаВЗапросКСервису(WSЗапрос, Прокси, ПространствоИмен, ДанныеКонтрагента)
+
+ Попытка
+
+ WSКонтрагент = Прокси.ФабрикаXDTO.Создать(Прокси.ФабрикаXDTO.Тип(ПространствоИмен, "NdsRequest_NP"));
+
+ // Указываем ИНН, КПП и Дату
+ WSКонтрагент.INN = ДанныеКонтрагента.ИНН;
+ Если ЗначениеЗаполнено(ДанныеКонтрагента.КПП) Тогда
+ WSКонтрагент.KPP = ДанныеКонтрагента.КПП;
+ КонецЕсли;
+ Если ЗначениеЗаполнено(ДанныеКонтрагента.Дата)Тогда
+ WSКонтрагент.DT = ДатаСтрокой(ДанныеКонтрагента.Дата);
+ КонецЕсли;
+
+ // Добавляем данные по контрагенту в список на проверку.
+ WSЗапрос.NP.Добавить(WSКонтрагент);
+
+ Исключение
+
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+
+ ДанныеКонтрагента.Состояние = Перечисления.СостоянияСуществованияКонтрагента.СодержитОшибкиВДанных;
+
+ КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации.
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Проверка контрагентов.Формирование данных для обращения к сервису ФНС'", КодОсновногоЯзыка),
+ УровеньЖурналаРегистрации.Ошибка,,,ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
+ КонецПопытки;
+
+КонецПроцедуры
+
+Процедура ОбработатьОтветСервиса(NdsResponse, ДанныеКонтрагентовДляПроверкиСервисом, МинимальныйНомерКонтрагента, МаксимальныйНомерКонтрагента) Экспорт
+
+ ИндексТекущегоОтвета = 0;
+ Для ИндексТекущегоКонтрагента = МинимальныйНомерКонтрагента По МаксимальныйНомерКонтрагента Цикл
+ ДанныеКонтрагента = ДанныеКонтрагентовДляПроверкиСервисом[ИндексТекущегоКонтрагента];
+ Если ДанныеКонтрагента.Состояние <> Перечисления.СостоянияСуществованияКонтрагента.СодержитОшибкиВДанных Тогда
+
+ Попытка
+
+ // Ответ от сервиса
+ ОтветПоКонтрагенту = NdsResponse.NP[ИндексТекущегоОтвета];
+ СостояниеВОтвете = ОтветПоКонтрагенту.State;
+ ДанныеКонтрагента.Состояние = СостояниеНаОсновеОтветаСервиса(ДанныеКонтрагента, СостояниеВОтвете);
+
+ Исключение
+
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+
+ КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации.
+ ЗаписьЖурналаРегистрации(
+ НСтр("ru = 'Проверка контрагентов.Обработка ответа от веб-сервиса'", КодОсновногоЯзыка),
+ УровеньЖурналаРегистрации.Ошибка,,,
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
+
+ КонецПопытки;
+
+ ИндексТекущегоОтвета = ИндексТекущегоОтвета + 1;
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Функция ПространствоИменОтвета()
+
+ Возврат "http://ws.unisoft/FNSNDSCAWS/Request";
+
+КонецФункции
+
+#Область НастройкиВебСервиса
+
+Функция ПолучитьWSПрокси(АдресСервиса)
+
+ WSПрокси = ОбщегоНазначения.WSПрокси(
+ АдресWSDL(АдресСервиса),
+ "http://ws.unisoft",
+ "FNSNDSCAWS",
+ "FNSNDSCAWS_Port",
+ Неопределено,
+ Неопределено,
+ 120);
+
+ Возврат WSПрокси;
+
+КонецФункции
+
+Функция АдресWSDL(URI)
+
+ Адрес = СокрЛП(URI);
+ Если Найти(НРег(Адрес), "?wsdl") = СтрДлина(Адрес) - 4 Тогда
+ Возврат Адрес;
+ Иначе
+ Возврат Адрес + "?wsdl";
+ КонецЕсли;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область ПрочиеПроцедуры
+
+Процедура СохранитьРезультатыПроверкиКонтрагентаВРегистр(ДанныеКонтрагента)
+
+ Если НЕ ЗначениеЗаполнено(ДанныеКонтрагента["ИНН"]) Тогда
+ Возврат;
+ КонецЕсли;
+
+ Попытка
+
+ Контрагент = ДанныеКонтрагента.Контрагент;
+
+ // Блокируем по Контрагенту
+ СтруктураКлюча = Новый Структура();
+ СтруктураКлюча.Вставить("Контрагент", Контрагент);
+
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда
+ ОбластьДанныхВспомогательныеДанные = ДанныеКонтрагента.ОбластьДанныхВспомогательныеДанные;
+ СтруктураКлюча.Вставить("ОбластьДанныхВспомогательныеДанные", ОбластьДанныхВспомогательныеДанные);
+ КонецЕсли;
+
+ Ключ = РегистрыСведений.СостоянияКонтрагентов.СоздатьКлючЗаписи(СтруктураКлюча);
+ ЗаблокироватьДанныеДляРедактирования(Ключ);
+
+ // Записываем данные в регистр.
+ НаборЗаписей = РегистрыСведений.СостоянияКонтрагентов.СоздатьНаборЗаписей();
+ НаборЗаписей.Отбор.Контрагент.Установить(Контрагент);
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда
+ НаборЗаписей.Отбор.ОбластьДанныхВспомогательныеДанные.Установить(ОбластьДанныхВспомогательныеДанные);
+ КонецЕсли;
+ НаборЗаписей.Очистить();
+
+ Запись = НаборЗаписей.Добавить();
+ ЗаполнитьЗначенияСвойств(Запись, ДанныеКонтрагента);
+
+ НаборЗаписей.Записать();
+
+ Исключение
+
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+
+ КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации.
+
+ ЗаписьЖурналаРегистрации(
+ НСтр("ru = 'Проверка контрагентов.Запись результатов проверки контрагентов в регистр'", КодОсновногоЯзыка),
+ УровеньЖурналаРегистрации.Ошибка,,,
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
+
+ КонецПопытки;
+
+КонецПроцедуры
+
+Процедура СохранитьРезультатыПроверкиКонтрагентовВРегистр(ДанныеКонтрагентов)
+
+ Для каждого ДанныеКонтрагента Из ДанныеКонтрагентов Цикл
+ СохранитьРезультатыПроверкиКонтрагентаВРегистр(ДанныеКонтрагента);
+ КонецЦикла;
+
+КонецПроцедуры
+
+// Процедура - Сохраняет документ в регистр ДокументыСОшибкамиПроверкиКонтрагентов,
+// если в контрагентах есть ошибка; и удаляет из регистра - если ошибки нет.
+//
+// Параметры:
+// СохраняемыйРезультат - Соответствие - Ключ - сохраняемый документ, Значение - признак наличия ошибки в документе.
+Процедура СохранитьРезультатыПроверкиКонтрагентовВДокументеВРегистр(СохраняемыйРезультат) Экспорт
+
+ Если СохраняемыйРезультат = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+
+ НачатьТранзакцию();
+
+ Попытка
+
+ // Устанавливаем блокировку сразу на все документы.
+ Блокировка = Новый БлокировкаДанных;
+ Для каждого СохраняемыйРезультатПоДокументу Из СохраняемыйРезультат Цикл
+
+ ДокументСсылка = СохраняемыйРезультатПоДокументу.Ключ;
+
+ Если НЕ ЗначениеЗаполнено(ДокументСсылка) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ // Объектная блокировка.
+ СтруктураКлюча = Новый Структура("Документ", ДокументСсылка);
+ Ключ = РегистрыСведений.ДокументыСОшибкамиПроверкиКонтрагентов.СоздатьКлючЗаписи(СтруктураКлюча);
+ ЗаблокироватьДанныеДляРедактирования(Ключ);
+
+ // Транзакционная блокировка.
+ ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ДокументыСОшибкамиПроверкиКонтрагентов");
+ ЭлементБлокировки.УстановитьЗначение("Документ", ДокументСсылка);
+
+ КонецЦикла;
+ Блокировка.Заблокировать();
+
+ // Записываем данные в регистр.
+ Для каждого СохраняемыйРезультатПоДокументу Из СохраняемыйРезультат Цикл
+
+ ДокументСсылка = СохраняемыйРезультатПоДокументу.Ключ;
+ ЭтоДокументСОшибкой = СохраняемыйРезультатПоДокументу.Значение;
+
+ Если НЕ ЗначениеЗаполнено(ДокументСсылка) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ // Записываем данные в регистр.
+ НаборЗаписей = РегистрыСведений.ДокументыСОшибкамиПроверкиКонтрагентов.СоздатьНаборЗаписей();
+ НаборЗаписей.Отбор.Документ.Установить(ДокументСсылка);
+
+ Если ЭтоДокументСОшибкой Тогда
+ // Записываем документ в регистр.
+ Запись = НаборЗаписей.Добавить();
+ Запись.Документ = ДокументСсылка;
+ Иначе
+ // Очищаем регистр
+ КонецЕсли;
+
+ НаборЗаписей.Записать();
+
+ КонецЦикла;
+
+ ЗафиксироватьТранзакцию();
+
+ Исключение
+
+ ОтменитьТранзакцию();
+
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+
+ КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации.
+
+ ЗаписьЖурналаРегистрации(
+ НСтр("ru = 'Проверка контрагентов.Запись результатов проверки контрагентов в документе в регистр'", КодОсновногоЯзыка),
+ УровеньЖурналаРегистрации.Ошибка,,,
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
+
+ КонецПопытки;
+
+КонецПроцедуры
+
+// Проверка ошибок, удаление дублей.
+Процедура ПодготовитьДанныеКПроверке(ДанныеКонтрагентовДляПроверки)
+
+ // Создаем таблицу
+ ДанныеКонтрагентов = ШаблонТаблицыДанныеКонтрагента();
+
+ // Копируем таблицу, сохраняя типы колонок.
+ Для каждого ДанныеКонтрагентаДляПроверки Из ДанныеКонтрагентовДляПроверки Цикл
+ // Копируем данные из таблицы с "сырыми данными" в таблицу с "типизированными" колонками.
+ ДанныеКонтрагента = ДанныеКонтрагентов.Добавить();
+
+ // В зависимости от наличия колонки ОбластьДанныхВспомогательныеДанные, копируем разный набор данных.
+ Если ДанныеКонтрагентовДляПроверки.Колонки.Найти("ОбластьДанныхВспомогательныеДанные") = Неопределено
+ ИЛИ НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда
+ ЗаполнитьЗначенияСвойств(ДанныеКонтрагента, ДанныеКонтрагентаДляПроверки, "Контрагент, ИНН, КПП, Состояние, Дата");
+ Иначе
+ ЗаполнитьЗначенияСвойств(ДанныеКонтрагента, ДанныеКонтрагентаДляПроверки, "Контрагент, ИНН, КПП, Состояние, Дата, ОбластьДанныхВспомогательныеДанные");
+ КонецЕсли;
+
+ Если ДанныеКонтрагента.Состояние <> Перечисления.СостоянияСуществованияКонтрагента.СодержитОшибкиВДанных Тогда
+ // Проверяем ошибки, приводим данные к нужному формату.
+ ПодготовитьДанныеКПроверкеПоКаждомуКонтрагенту(ДанныеКонтрагента);
+ КонецЕсли;
+ КонецЦикла;
+
+ СвернутьДанныеКонтрагентов(ДанныеКонтрагентов);
+
+ ДанныеКонтрагентовДляПроверки = ДанныеКонтрагентов;
+
+КонецПроцедуры
+
+Процедура СвернутьДанныеКонтрагентов(ДанныеКонтрагентов)
+
+ // Удаляем из таблицы дубли
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда
+ ДанныеКонтрагентов.Свернуть("Контрагент, ИНН, КПП, Дата, Состояние, ОбластьДанныхВспомогательныеДанные");
+ Иначе
+ ДанныеКонтрагентов.Свернуть("Контрагент, ИНН, КПП, Дата, Состояние");
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Проверка ошибок по одному контрагенту.
+Процедура ПодготовитьДанныеКПроверкеПоКаждомуКонтрагенту(ДанныеКонтрагента)
+
+ Ошибка = "";
+
+ // Обращение к реквизитам справочника возможно только из разделенного сеанса.
+ // При запуске из неразделенного сеанса проверка будет выполнена веб-сервисом.
+ Если ОбщегоНазначенияПовтИсп.РазделениеВключено()
+ И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных()
+ ИЛИ НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
+
+ // Проверяем только российских контрагентов.
+ Если ЭтоИностранныйКонтрагент(ДанныеКонтрагента.Контрагент)Тогда
+ ДанныеКонтрагента.Состояние = Перечисления.СостоянияСуществованияКонтрагента.НеПодлежитПроверке;
+ Возврат;
+ КонецЕсли;
+
+ КонецЕсли;
+
+ // ЭтоЮридическоеЛицо
+ ДлинаИНН = СтрДлина(СокрЛП(ДанныеКонтрагента.ИНН));
+ ДлинаКПП = СтрДлина(СокрЛП(ДанныеКонтрагента.КПП));
+
+ ЭтоЮридическоеЛицо = Ложь;
+ Если ДлинаИНН = 10 И ДлинаКПП = 9 Тогда
+ ЭтоЮридическоеЛицо = Истина;
+ ИначеЕсли ДлинаИНН = 12 И ДлинаКПП = 0 Тогда
+ ЭтоЮридическоеЛицо = Ложь;
+ ИначеЕсли ДлинаИНН = 0 ИЛИ ДлинаКПП = 0 Тогда
+ ДанныеКонтрагента.Состояние = Перечисления.СостоянияСуществованияКонтрагента.ПустойИННКПП;
+ Возврат;
+ Иначе
+ ДанныеКонтрагента.Состояние = Перечисления.СостоянияСуществованияКонтрагента.СодержитОшибкиВДанных;
+ Возврат;
+ КонецЕсли;
+
+ // Дата
+ Если Не ЗначениеЗаполнено(ДанныеКонтрагента.Дата) Тогда
+ ДанныеКонтрагента.Дата = НачалоДня(ТекущаяДатаСеанса());
+ ИначеЕсли ТипЗнч(ДанныеКонтрагента.Дата) = Тип("Дата")
+ И (ДанныеКонтрагента.Дата < Дата(1900, 1, 1) ИЛИ ДанныеКонтрагента.Дата > Дата(2100, 1, 1)) Тогда
+ ДанныеКонтрагента.Состояние = Перечисления.СостоянияСуществованияКонтрагента.СодержитОшибкиВДанных;
+ Возврат;
+ КонецЕсли;
+
+ // ИНН
+ ДанныеКонтрагента.ИНН = СокрЛП(ДанныеКонтрагента.ИНН);
+ ИНН = ДанныеКонтрагента.ИНН;
+ ИННСоответствуетТребованиям = РегламентированныеДанныеКлиентСервер.ИННСоответствуетТребованиям(ИНН, ЭтоЮридическоеЛицо, Ошибка);
+ Если Лев(ИНН, 2) = "00" ИЛИ НЕ ИННСоответствуетТребованиям Тогда
+ ДанныеКонтрагента.Состояние = Перечисления.СостоянияСуществованияКонтрагента.СодержитОшибкиВДанных;
+ Возврат;
+ КонецЕсли;
+
+ // КПП
+ Если ЭтоЮридическоеЛицо Тогда
+ ДанныеКонтрагента.КПП = СокрЛП(ДанныеКонтрагента.КПП);
+ КПП = ДанныеКонтрагента.КПП;
+ КППСоответствуетТребованиям = РегламентированныеДанныеКлиентСервер.КППСоответствуетТребованиям(КПП, Ошибка);
+ Если НЕ КППСоответствуетТребованиям Тогда
+ ДанныеКонтрагента.Состояние = Перечисления.СостоянияСуществованияКонтрагента.СодержитОшибкиВДанных;
+ Возврат;
+ КонецЕсли;
+ КонецЕсли;
+
+КонецПроцедуры
+
+Функция ЭтоИностранныйКонтрагент(КонтрагентСсылка)
+
+ ЯвляетсяИностранным = Ложь;
+ ПроверкаКонтрагентовПереопределяемый.ОпределитьЯвляетсяЛиКонтрагентИностранным(КонтрагентСсылка, ЯвляетсяИностранным);
+ Возврат ЯвляетсяИностранным;
+
+КонецФункции
+
+Процедура ПолучитьСостоянияКонтрагентовИзКэша(ДанныеКонтрагентов, ПолучатьВсеСостоянияИзРегистра = Ложь)
+
+ Запрос = Новый Запрос;
+ Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
+ | ДанныеКонтрагентов.Контрагент,
+ | ДанныеКонтрагентов.ИНН,
+ | ДанныеКонтрагентов.КПП,
+ | ДанныеКонтрагентов.ОбластьДанныхВспомогательныеДанные,
+ | ДанныеКонтрагентов.Дата
+ |ПОМЕСТИТЬ ДанныеКонтрагентов
+ |ИЗ
+ | &ДанныеКонтрагентов КАК ДанныеКонтрагентов
+ |;
+ |
+ |////////////////////////////////////////////////////////////////////////////////
+ |ВЫБРАТЬ РАЗРЕШЕННЫЕ
+ | ДанныеКонтрагентов.Контрагент,
+ | ДанныеКонтрагентов.ИНН,
+ | ДанныеКонтрагентов.КПП,
+ | ДанныеКонтрагентов.Дата,
+ | ДанныеКонтрагентов.ОбластьДанныхВспомогательныеДанные,
+ | ВЫБОР
+ | КОГДА &ПолучатьВсеСостоянияИзРегистра
+ | ТОГДА СостоянияКонтрагентов.Состояние
+ | ИНАЧЕ ВЫБОР
+ | КОГДА СостоянияКонтрагентов.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияСуществованияКонтрагента.СодержитОшибкиВДанных)
+ | ТОГДА ЗНАЧЕНИЕ(Перечисление.СостоянияСуществованияКонтрагента.СодержитОшибкиВДанных)
+ | ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.СостоянияСуществованияКонтрагента.ПустаяСсылка)
+ | КОНЕЦ
+ | КОНЕЦ КАК Состояние
+ |ИЗ
+ | ДанныеКонтрагентов КАК ДанныеКонтрагентов
+ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияКонтрагентов КАК СостоянияКонтрагентов
+ | ПО ДанныеКонтрагентов.Контрагент = СостоянияКонтрагентов.Контрагент
+ | И ДанныеКонтрагентов.ИНН = СостоянияКонтрагентов.ИНН
+ | И ДанныеКонтрагентов.КПП = СостоянияКонтрагентов.КПП
+ | И ДанныеКонтрагентов.ОбластьДанныхВспомогательныеДанные = СостоянияКонтрагентов.ОбластьДанныхВспомогательныеДанные";
+
+ Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда
+
+ Запрос.Текст = СтрЗаменить(
+ Запрос.Текст,
+ "ДанныеКонтрагентов.ОбластьДанныхВспомогательныеДанные,",
+ "");
+
+ Запрос.Текст = СтрЗаменить(
+ Запрос.Текст,
+ "И ДанныеКонтрагентов.ОбластьДанныхВспомогательныеДанные = СостоянияКонтрагентов.ОбластьДанныхВспомогательныеДанные",
+ "");
+
+ КонецЕсли;
+
+ Запрос.УстановитьПараметр("ПолучатьВсеСостоянияИзРегистра", ПолучатьВсеСостоянияИзРегистра);
+
+ Запрос.УстановитьПараметр("ДанныеКонтрагентов", ДанныеКонтрагентов);
+ ДанныеКонтрагентов = Запрос.Выполнить().Выгрузить();
+
+КонецПроцедуры
+
+Функция ДатаСтрокой(Дата)
+
+ Результат = Неопределено;
+ Если ТипЗнч(Дата) = Тип("Строка") Тогда
+ // Дата уже в нужном формате в виде строки.
+ Результат = Дата;
+ ИначеЕсли ТипЗнч(Дата) = Тип("Дата") Тогда
+ Результат = Формат(Дата, "ДФ=dd.MM.yyyy");
+ КонецЕсли;
+
+ Возврат Результат;
+
+КонецФункции
+
+Функция СостояниеНаОсновеОтветаСервиса(ДанныеКонтрагента, Ответ)
+
+ Если Ответ = "0" Тогда
+ Состояние = Перечисления.СостоянияСуществованияКонтрагента.Действует;
+ ИначеЕсли Ответ = "1" Тогда
+ Состояние = Перечисления.СостоянияСуществованияКонтрагента.ПрекратилДеятельность;
+ ИначеЕсли Ответ = "3" Тогда
+ Состояние = Перечисления.СостоянияСуществованияКонтрагента.КППНеСоответствуетИНН;
+ ИначеЕсли Ответ = "4" Тогда
+ Состояние = Перечисления.СостоянияСуществованияКонтрагента.ОтсутствуетВРеестре;
+ КонецЕсли;
+
+ Возврат Состояние;
+
+КонецФункции
+
+Процедура ПроверитьНепроверенныхКонтрагентов(ЭтоОбновлениеИБВМоделиСервиса, Параметры = Неопределено)
+
+ // Выбираем контрагентов, которых нет в регистре сведений и у которых заполнен ИНН.
+ Текст =
+ "ВЫБРАТЬ РАЗРЕШЕННЫЕ
+ | Контрагенты.Ссылка КАК Контрагент,
+ | Контрагенты.%ИНН КАК ИНН,
+ | Контрагенты.%КПП КАК КПП,
+ | &ОбластьДанныхВспомогательныеДанные КАК ОбластьДанныхВспомогательныеДанные,
+ | &Дата КАК Дата
+ |ИЗ
+ | Справочник.%Имя КАК Контрагенты
+ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияКонтрагентов КАК СостоянияКонтрагентов
+ | ПО Контрагенты.Ссылка = СостоянияКонтрагентов.Контрагент
+ |ГДЕ
+ | (СостоянияКонтрагентов.Состояние ЕСТЬ NULL
+ | ИЛИ СостоянияКонтрагентов.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияСуществованияКонтрагента.ПустаяСсылка))
+ | И Контрагенты.ИНН <> """"
+ | %Условие";
+
+ Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда
+
+ Текст = СтрЗаменить(
+ Текст,
+ "&ОбластьДанныхВспомогательныеДанные КАК ОбластьДанныхВспомогательныеДанные,",
+ "");
+
+ КонецЕсли;
+
+ СвойстваСправочника = ПроверкаКонтрагентовКлиентСервер.СвойстваСправочникаКонтрагенты();
+ Текст = СтрЗаменить(Текст, "%ИНН", СвойстваСправочника.ИНН);
+ Текст = СтрЗаменить(Текст, "%КПП", СвойстваСправочника.КПП);
+ Текст = СтрЗаменить(Текст, "%Имя", СвойстваСправочника.Имя);
+
+ Если СправочникКонтрагентовИерархический() Тогда
+ Текст = СтрЗаменить(Текст, "%Условие", "И Контрагенты.ЭтоГруппа = ЛОЖЬ");
+ Иначе
+ Текст = СтрЗаменить(Текст, "%Условие", "");
+ КонецЕсли;
+
+ Запрос = Новый Запрос;
+ Запрос.Текст = Текст;
+
+ Если ЭтоОбновлениеИБВМоделиСервиса Тогда
+ РазмерПорции = 1000;
+ Запрос.Текст = СтрЗаменить(Запрос.Текст, "РАЗЛИЧНЫЕ", "РАЗЛИЧНЫЕ ПЕРВЫЕ "+ Формат(РазмерПорции, "ЧГ=0"));
+ КонецЕсли;
+
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда
+ Запрос.УстановитьПараметр("ОбластьДанныхВспомогательныеДанные", ОбщегоНазначения.ЗначениеРазделителяСеанса());
+ КонецЕсли;
+
+ Запрос.УстановитьПараметр("Дата", НачалоДня(ТекущаяДатаСеанса()));
+ ДанныеКонтрагентов = Запрос.Выполнить().Выгрузить();
+
+ // Прерываем обновление, если не осталось необработанных данных.
+ Если ЭтоОбновлениеИБВМоделиСервиса Тогда
+ Параметры.ОбработкаЗавершена = ДанныеКонтрагентов.Количество() = 0;
+ Если Параметры.ОбработкаЗавершена Тогда
+ Возврат;
+ КонецЕсли;
+ КонецЕсли;
+
+ ПроверитьКонтрагентов(ДанныеКонтрагентов);
+
+КонецПроцедуры
+
+Процедура ЗаполнитьСостояния(ПроверяемыеКонтрагенты, ДанныеКонтрагентов, Состояния = Неопределено)
+
+ // Соединяем результаты проверки с исходной таблицей.
+ Запрос = Новый Запрос;
+ Если ПроверяемыеКонтрагенты.Колонки.Найти("Состояние") <> Неопределено Тогда
+ ПроверяемыеКонтрагенты.Колонки.Удалить("Состояние");
+ КонецЕсли;
+
+ ПоместитьТаблицуЗначенийВоВременнуюТаблицу(ПроверяемыеКонтрагенты, Запрос, "ПроверяемыеКонтрагенты");
+ ПоместитьТаблицуЗначенийВоВременнуюТаблицу(ДанныеКонтрагентов, Запрос, "ДанныеКонтрагентов");
+
+ // По всем контрагентам определяем состояние.
+ // В таблице оставляем только контрагентов с ошибками.
+ Запрос.Текст = Запрос.Текст + "
+ |ВЫБРАТЬ РАЗЛИЧНЫЕ
+ | " + ПредставлениеКолонок(ПроверяемыеКонтрагенты, "ПроверяемыеКонтрагенты.") + ",
+ | ДанныеКонтрагентов.Состояние КАК Состояние
+ |ИЗ
+ | ПроверяемыеКонтрагенты КАК ПроверяемыеКонтрагенты
+ | ЛЕВОЕ СОЕДИНЕНИЕ ДанныеКонтрагентов КАК ДанныеКонтрагентов
+ | ПО ПроверяемыеКонтрагенты.Контрагент = ДанныеКонтрагентов.Контрагент
+ | И ПроверяемыеКонтрагенты.ИНН = ДанныеКонтрагентов.ИНН
+ | И ПроверяемыеКонтрагенты.КПП = ДанныеКонтрагентов.КПП
+ | И (НАЧАЛОПЕРИОДА(ПроверяемыеКонтрагенты.Дата, День) = НАЧАЛОПЕРИОДА(ДанныеКонтрагентов.Дата, День)
+ | ИЛИ НАЧАЛОПЕРИОДА(ПроверяемыеКонтрагенты.Дата, День) = ДатаВремя(1,1,1))";
+
+ Если Состояния <> Неопределено Тогда
+ Запрос.Текст = Запрос.Текст + "
+ |
+ |ГДЕ
+ | ДанныеКонтрагентов.Состояние В (&Состояния)";
+
+ Запрос.УстановитьПараметр("Состояния", Состояния);
+ КонецЕсли;
+
+ ПроверяемыеКонтрагенты = Запрос.Выполнить().Выгрузить();
+
+КонецПроцедуры
+
+Процедура ПоместитьТаблицуЗначенийВоВременнуюТаблицу(Таблица, Запрос, ИмяВременнойТаблицы, ПостфиксСинонима = "")
+
+ ПредставлениеКолонок = ПредставлениеКолонок(Таблица);
+
+ Запрос.Текст = Запрос.Текст + "
+ |ВЫБРАТЬ
+ | " + ПредставлениеКолонок + "
+ | ПОМЕСТИТЬ " + ИмяВременнойТаблицы + "
+ | ИЗ &" + ИмяВременнойТаблицы + " КАК " + ИмяВременнойТаблицы + ";
+ |//////////////////////////////////////////////////////////////////////////////////////////////////";
+
+ Запрос.УстановитьПараметр(ИмяВременнойТаблицы, Таблица);
+
+КонецПроцедуры
+
+Функция ПредставлениеКолонок(Таблица, СинонимТаблицы = "", ПостфиксСинонима = "")
+
+ КолонкиИсходнойТаблицы = Новый Массив;
+ Для Каждого Колонка Из Таблица.Колонки Цикл
+
+ ИмяПоля = СинонимТаблицы + Колонка.Имя;
+ СинонимПоля = Колонка.Имя + ПостфиксСинонима;
+
+ КолонкиИсходнойТаблицы.Добавить(ИмяПоля + " КАК " + СинонимПоля);
+
+ КонецЦикла;
+
+ ПредставлениеКолонок = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(КолонкиИсходнойТаблицы, "," + Символы.ПС);
+ Возврат ПредставлениеКолонок;
+
+КонецФункции
+
+// Получение имени реквизита документа по имени реквизита формы.
+Функция ИмяРеквизита(Форма, ИмяЭлемента)
+
+ Если ИмяЭлемента = "" Тогда
+
+ ИмяРеквизита = "";
+
+ Иначе
+
+ Элемент = Форма.Элементы[ИмяЭлемента];
+ ПутьКДанным = Элемент.ПутьКДанным;
+
+ // Из пути к данным получаем имя реквизита.
+ МассивПодстрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПутьКДанным, ".");
+ КоличествоПодстрок = МассивПодстрок.Количество();
+ ИмяРеквизита = МассивПодстрок[КоличествоПодстрок - 1];
+
+ КонецЕсли;
+
+ Возврат ИмяРеквизита;
+
+КонецФункции
+
+Функция НедействующиеКонтрагентыОпределены(ПроверяемыеКонтрагенты)
+
+ // Подготавливаем данные для проверки.
+ ДанныеКонтрагентов = ПроверяемыеКонтрагенты.Скопировать();
+
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда
+ ДобавитьКолонкуОбластьДанных(ДанныеКонтрагентов);
+ ДанныеКонтрагентов.ЗаполнитьЗначения(ОбщегоНазначения.ЗначениеРазделителяСеанса(), "ОбластьДанныхВспомогательныеДанные");
+ КонецЕсли;
+
+ // Удаляем пустую колонку из исходной таблицы.
+ Если ПроверяемыеКонтрагенты.Колонки.Найти("Состояние") <> Неопределено Тогда
+ ПроверяемыеКонтрагенты.Колонки.Удалить("Состояние");
+ КонецЕсли;
+
+ // Проверка веб-сервисом ФНС
+ ПроверитьКонтрагентов(ДанныеКонтрагентов, , Ложь);
+
+ Если ЕстьНепроверенныеКонтрагенты(ДанныеКонтрагентов) Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ Состояния = ПроверкаКонтрагентовКлиентСерверПовтИсп.СостоянияНедействующегоКонтрагента(Истина);
+
+ ЗаполнитьСостояния(ПроверяемыеКонтрагенты, ДанныеКонтрагентов, Состояния);
+
+ Возврат Истина;
+
+КонецФункции
+
+Функция СправочникКонтрагентовИерархический()
+
+ СвойстваСправочника = ПроверкаКонтрагентовКлиентСервер.СвойстваСправочникаКонтрагенты();
+ Возврат Метаданные.Справочники[СвойстваСправочника.Имя].Иерархический;
+
+КонецФункции
+
+// Функция - Нужно показать предложение включить проверку контрагентов.
+// Определяет, нужно ли показывать предложение на включение проверки с учетом следующего:
+// 1. Что есть право на использование или настройку проверки.
+// 2. Что проверка еще не включена.
+// 3. Что пользователь не нажал кнопку "БольшеНеПоказывать".
+// 4. Что с момента последнего отображения предложения уже прошло определенное время.
+// Возвращаемое значение:
+// Булево - Истина, если предложение нужно показывать.
+//
+Функция НужноПоказатьПредложениеВключитьПроверкуКонтрагентов() Экспорт
+
+ НужноПоказатьПредложение =
+ // В модели сервисов предложение не показываем.
+ НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено()
+ // Проверяем наличие прав
+ И (ЕстьПравоНаИспользованиеПроверки()
+ ИЛИ ЕстьПравоНаРедактированиеНастроек())
+ // Определяем, включен ли сервис.
+ И НЕ ПроверкаКонтрагентовВключена()
+ // Проверяем, не нажал ли пользователь кнопку "Больше не показывать" в предложении на включение сервиса.
+ И НЕ БольшеНеПоказыватьПредложениеПодключиться()
+ // Проверяем, давно ли в последний раз показывалось предложение на включение сервиса.
+ И ПоследнееОтображениеПредложенияНаВключениеСервисаБылоДавно();
+
+ Возврат НужноПоказатьПредложение;
+
+КонецФункции
+
+Функция ПоследнееОтображениеПредложенияНаВключениеСервисаБылоДавно()
+
+ ЧетыреЧаса = 60*60*4;
+ ДатаПоследнегоОтображенияПредложенияНаВключениеСервиса = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(
+ "ПроверкаКонтрагентов", "ПроверкаКонтрагентов_ДатаПоследнегоОтображенияПредложенияНаВключениеСервиса");
+
+ // Предложение включить сервис не показывалось вообще,
+ // либо с момента последнего отображения предупреждения уже прошло 4 часа.
+ ПредложениеПоказывалосьДавно = ДатаПоследнегоОтображенияПредложенияНаВключениеСервиса = Неопределено ИЛИ
+ ДатаПоследнегоОтображенияПредложенияНаВключениеСервиса + ЧетыреЧаса < ТекущаяДатаСеанса();
+
+ Возврат ПредложениеПоказывалосьДавно;
+
+КонецФункции
+
+Функция ЕстьНепроверенныеКонтрагенты(ДанныеКонтрагентов)
+
+ Отбор = Новый Структура();
+ Отбор.Вставить("Состояние", Перечисления.СостоянияСуществованияКонтрагента.ПустаяСсылка());
+
+ КоличествоКонтрагентовСПустымСостоянием = ДанныеКонтрагентов.НайтиСтроки(Отбор).Количество();
+
+ Возврат КоличествоКонтрагентовСПустымСостоянием <> 0;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ШаблоныИЗаполнениеТаблиц
+
+// Функция - Шаблон таблицы, используемой для передачи данных в веб-сервис ФНС.
+// Возвращаемое значение:
+// ТаблицаЗначений - пустая таблица с колонками "Контрагент", "ИНН", "КПП", "Дата", "Состояние",
+// "ОбластьДанныхВспомогательныеДанные"(если есть подсистема РаботаВМоделиСервиса).
+Функция ШаблонТаблицыДанныеКонтрагента()
+
+ // Создаем таблицу
+ ДанныеКонтрагентов = Новый ТаблицаЗначений;
+
+ СвойстваСправочника = ПроверкаКонтрагентовКлиентСервер.СвойстваСправочникаКонтрагенты();
+ Тип = "СправочникСсылка." + СвойстваСправочника.Имя;
+
+ // Проверяемый контрагент
+ ДанныеКонтрагентов.Колонки.Добавить("Контрагент", Новый ОписаниеТипов(Тип));
+ // ИНН контрагента
+ ДанныеКонтрагентов.Колонки.Добавить("ИНН", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(12)));
+ // КПП контрагента
+ ДанныеКонтрагентов.Колонки.Добавить("КПП", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(9)));
+ // Дата, на которую выполняется проверка контрагента.
+ ДанныеКонтрагентов.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата",,,Новый КвалификаторыДаты(ЧастиДаты.Дата)));
+ // Результат проверки контрагента.
+ ДанныеКонтрагентов.Колонки.Добавить("Состояние", Новый ОписаниеТипов("ПеречислениеСсылка.СостоянияСуществованияКонтрагента"));
+ // Область данных
+ ДобавитьКолонкуОбластьДанных(ДанныеКонтрагентов);
+
+ Возврат ДанныеКонтрагентов;
+
+КонецФункции
+
+Функция ШаблонТаблицыДанныеКонтрагентаДляДокумента()
+
+ // Создаем таблицу
+ ДанныеКонтрагентов = ШаблонТаблицыДанныеКонтрагента();
+ // Ссылка на документ, которому соответствует строка таблицы.
+ ДанныеКонтрагентов.Колонки.Добавить("Ссылка", Документы.ТипВсеСсылки());
+
+ Возврат ДанныеКонтрагентов;
+
+КонецФункции
+
+// Процедура - Заполнение данных контрагента в документе.
+//
+// Параметры:
+// Ссылка - ДокументСсылка - Документ, в котором выполняется проверка контрагентов.
+// ДанныеКонтрагентов - ТаблицаЗначений - Содержит данные проверяемых контрагентов.
+// Структуру колонок таблицы см в функции ШаблонТаблицыДанныеКонтрагента.
+// Контрагент - СправочникСсылка.<Контрагенты> - Контрагент, данными которого дополняются данные таблицы
+// ДанныеКонтрагентов.
+// Дата - Дата - Дата, на которую выполняется проверка контрагента.
+// Состояние - Перечисления.СостоянияСуществованияКонтрагента - Результат проверки контрагента.
+Процедура ДополнитьДанныеКонтрагентовВДокументе(
+ Ссылка,
+ ДанныеКонтрагентов,
+ Контрагент,
+ Дата,
+ Состояние = Неопределено)
+
+ // Добавляем новую строку в таблицу, только если такой строки еще нет.
+ Отбор = Новый Структура("Ссылка, Контрагент, Дата", Ссылка, Контрагент, Дата);
+ НайденныеСтроки = ДанныеКонтрагентов.НайтиСтроки(Отбор);
+
+ Если НайденныеСтроки.Количество() = 0 Тогда
+
+ СтрокаОписания = ДанныеКонтрагентов.Добавить();
+ СтрокаОписания.Ссылка = Ссылка;
+ СтрокаОписания.Контрагент = Контрагент;
+ СтрокаОписания.Дата = Дата;
+ СтрокаОписания.Состояние = Состояние;
+
+ // Заполнение ИНН и КПП
+ СвойстваСправочника = ПроверкаКонтрагентовКлиентСервер.СвойстваСправочникаКонтрагенты();
+ РеквизитыКонтрагента = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Контрагент, СвойстваСправочника.ИНН + "," + СвойстваСправочника.КПП);
+ ЗаполнитьЗначенияСвойств(СтрокаОписания, РеквизитыКонтрагента);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Функция ШаблонТаблицыОписания()
+
+ Описание = Новый ТаблицаЗначений();
+
+ // ДокументСсылка - Документ-основание или счет-фактура.
+ // Если описывается счет-фактура, находящаяся в подвале документа, то указывается ссылка на счет-фактуру.
+ Описание.Колонки.Добавить("Ссылка");
+ // Дата, на которую должна выполняться проверка контрагента.
+ Описание.Колонки.Добавить("Дата");
+ // Элемент формы - поле контрагента или счета-фактуры, в котором отображается результат проверки контрагента.
+ Описание.Колонки.Добавить("Элемент");
+ // Элемент формы - группа, которая должна выделятся цветом, в зависимости от результата проверки контрагента.
+ // Может быть пустой, тогда выделения фона цветом не будет.
+ Описание.Колонки.Добавить("ЭлементРодитель");
+ // СправочникСсылка - проверяемый контрагент.
+ Описание.Колонки.Добавить("Контрагент");
+ // Перечисления.СостоянияСуществованияКонтрагента - состояние контрагента.
+ Описание.Колонки.Добавить("СостояниеКонтрагента");
+
+ Возврат Описание;
+
+КонецФункции
+
+Функция ОписаниеДокументов(Форма)
+
+ ОбщееОписание = ШаблонТаблицыОписания();
+
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВШапке(Форма) Тогда
+
+ Описание = ШаблонТаблицыОписания();
+ ПроверкаКонтрагентовПереопределяемый.СформироватьОписаниеДокументовСКонтрагентомВШапке(Форма, Описание);
+
+ // Дополняем описание состоянием.
+ Для Каждого СтрокаОписания Из Описание Цикл
+ СтрокаОписания.СостояниеКонтрагента = Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагента;
+ КонецЦикла;
+
+ ПрисоединитьОписание(ОбщееОписание, Описание);
+
+ КонецЕсли;
+
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСоСчетомФактуройВПодвале(Форма) Тогда
+
+ Описание = ШаблонТаблицыОписания();
+ ПроверкаКонтрагентовПереопределяемый.СформироватьОписаниеДокументовСоСчетомФактуройВПодвале(Форма, Описание);
+
+ // Дополняем описание состоянием.
+ Для Каждого СтрокаОписания Из Описание Цикл
+ СтрокаОписания.СостояниеКонтрагента = Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагентовВСчетеФактуре;
+ КонецЦикла;
+
+ ПрисоединитьОписание(ОбщееОписание, Описание);
+
+ КонецЕсли;
+
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоСчетФактура(Форма) Тогда
+
+ Описание = ШаблонТаблицыОписания();
+ ПроверкаКонтрагентовПереопределяемый.СформироватьОписаниеСчетовФактур(Форма, Описание);
+
+ // Дополняем описание состоянием.
+ Если Форма.РеквизитыПроверкиКонтрагентов <> Неопределено Тогда
+ Для Каждого СтрокаОписания Из Описание Цикл
+
+ ИмяРеквизитаСчетаФактуры = ИмяРеквизита(Форма, СтрокаОписания.Элемент.Имя);
+ СтрокаОписания.СостояниеКонтрагента = Форма.РеквизитыПроверкиКонтрагентов[ИмяРеквизитаСостоянияКонтрагентаВСчетеФактуре(ИмяРеквизитаСчетаФактуры)];
+
+ КонецЦикла;
+ КонецЕсли;
+
+ ПрисоединитьОписание(ОбщееОписание, Описание);
+
+ КонецЕсли;
+
+ Возврат ОбщееОписание;
+
+КонецФункции
+
+Функция ШаблонТаблицыОписанияТабличныхЧастей()
+
+ Описание = Новый ТаблицаЗначений();
+
+ // Имя таблицы формы, в которой располагается проверяемый контрагент.
+ Описание.Колонки.Добавить("ИмяТаблицыФормы");
+ // Имя табличной части документа, в которой располагается проверяемый контрагент.
+ Описание.Колонки.Добавить("ИмяТабличнойЧасти");
+ // Имя колонки таблицы формы, в которой находится контрагент.
+ Описание.Колонки.Добавить("ИмяПоляСКонтрагентом");
+ // Имя колонки табличной части документа, в которой находится контрагент.
+ Описание.Колонки.Добавить("ИмяКолонкиСКонтрагентом");
+ // Имя колонки таблицы формы, в которой находится дата, на которую необходимо выполнять проверку.
+ // Может быть пустой, если в табличной части нет даты.
+ Описание.Колонки.Добавить("ИмяПоляСДатой");
+ // Имя колонки табличной части документа, в которой находится дата, на которую необходимо выполнять проверку.
+ // Может быть пустой, если в табличной части нет даты.
+ Описание.Колонки.Добавить("ИмяКолонкиСДатой");
+
+ Возврат Описание;
+
+КонецФункции
+
+Функция ШаблонТаблицыОписанияКонтрагентовВСчетеФактуре()
+
+ Описание = Новый ТаблицаЗначений();
+
+ // Имя реквизита документа, содержащего контрагента.
+ Описание.Колонки.Добавить("ИмяРеквизита");
+ // Имя реквизита формы, содержащего состояние контрагента.
+ Описание.Колонки.Добавить("ИмяРеквизитаССостоянием");
+
+ Возврат Описание;
+
+КонецФункции
+
+Процедура ДополнитьОписаниеКонтрагентовВСчетеФактуре(
+ Описание,
+ ИмяРеквизита,
+ ИмяРеквизитаССостоянием)
+
+ СтрокаОписания = Описание.Добавить();
+ // Имя реквизита документа, содержащего контрагента.
+ СтрокаОписания.ИмяРеквизита = ИмяРеквизита;
+ // Имя реквизита формы, содержащего состояние контрагента.
+ СтрокаОписания.ИмяРеквизитаССостоянием = ИмяРеквизитаССостоянием;
+
+КонецПроцедуры
+
+Функция ОписаниеКонтрагентовВСчетеФактуре(Тип)
+
+ ИменаРеквизитовКонтрагентов = Новый Массив;
+ ПроверкаКонтрагентовПереопределяемый.ПолучитьИменаРеквизитовКонтрагентовВСчетеФактуре(Тип, ИменаРеквизитовКонтрагентов);
+
+ Описание = ШаблонТаблицыОписанияКонтрагентовВСчетеФактуре();
+
+ Для каждого ИмяРеквизитаКонтрагента Из ИменаРеквизитовКонтрагентов Цикл
+ ДополнитьОписаниеКонтрагентовВСчетеФактуре(
+ Описание,
+ ИмяРеквизитаКонтрагента,
+ ИмяРеквизитаСостоянияКонтрагентаВСчетеФактуре(ИмяРеквизитаКонтрагента));
+
+ КонецЦикла;
+
+ Возврат Описание;
+
+КонецФункции
+
+// Функция - Описание табличных частей.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+// Возвращаемое значение:
+// Описание - ТаблицаЗначений - Таблица с описанием расположения контрагентов в табличной части документа.
+Функция ОписаниеТабличныхЧастей(Форма) Экспорт
+
+ ОписаниеТабличныхЧастей = ШаблонТаблицыОписанияТабличныхЧастей();
+ ПроверкаКонтрагентовПереопределяемый.СформироватьОписаниеДокументовСТабличнымиЧастями(Форма, ОписаниеТабличныхЧастей);
+
+ Возврат ОписаниеТабличныхЧастей;
+
+КонецФункции
+
+Процедура ДобавитьКолонкуОбластьДанных(Таблица)
+
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда
+ Таблица.Колонки.Добавить("ОбластьДанныхВспомогательныеДанные", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(7, 0, ДопустимыйЗнак.Неотрицательный)));
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ПроверкаКонтрагентовВДокументах
+
+Процедура УстановитьУсловноеОформлениеСпискаДокументов(Список)
+
+ СтандартнаяОбработка = Истина;
+ ПроверкаКонтрагентовПереопределяемый.УстановитьУсловноеОформлениеСпискаДокументов(Список, СтандартнаяОбработка);
+
+ // Если действия переопределили, то стандартную обработку не выполняем.
+ Если НЕ СтандартнаяОбработка Тогда
+ Возврат;
+ КонецЕсли;
+
+ Оформление = Список.УсловноеОформление.Элементы.Добавить();
+ Отбор = Оформление.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
+ Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
+ Отбор.Использование = Истина;
+ Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СодержитНекорректныхКонтрагентов");
+ Отбор.ПравоеЗначение = Истина;
+ ЦветФона = Оформление.Оформление.Элементы.Найти("ЦветФона");
+ Цвета = ПроверкаКонтрагентовВызовСервераПовтИсп.ЦветаРезультатовПроверки();
+ ЦветФона.Значение = Цвета.ЦветФонаДокументаСНекорректнымиКонтрагентамиВСпискеДокументов;
+ ЦветФона.Использование = Истина;
+
+КонецПроцедуры
+
+Процедура УстановитьПараметрыДинамическогоСписка(Список)
+
+ ИспользованиеПроверкиВозможно = ПроверкаКонтрагентовВызовСервера.ИспользованиеПроверкиВозможно();
+ Список.Параметры.УстановитьЗначениеПараметра("ИспользованиеПроверкиВозможно", ИспользованиеПроверкиВозможно);
+
+КонецПроцедуры
+
+Процедура ЗапомнитьНаличиеНекорректныхКонтрагентов(Форма)
+
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоСчетФактура(Форма) Тогда
+
+ Форма.РеквизитыПроверкиКонтрагентов.ЭтоСчетФактураСОшибкой =
+ ПроверкаКонтрагентовКлиентСерверПовтИсп.ЭтоСостояниеНедействующегоКонтрагента(Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагентов, Истина);
+
+ Иначе
+
+ Форма.РеквизитыПроверкиКонтрагентов.ЭтоДокументСОшибкой = ЭтоДокументСОшибкой(Форма);
+
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСоСчетомФактуройВПодвале(Форма) Тогда
+ Форма.РеквизитыПроверкиКонтрагентов.ЭтоСчетФактураСОшибкой =
+ ПроверкаКонтрагентовКлиентСерверПовтИсп.ЭтоСостояниеНедействующегоКонтрагента(Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагентовВСчетеФактуре, Истина);
+ КонецЕсли;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Функция ДанныеКонтрагентовВДокументе(Форма)
+
+ ДанныеКонтрагентов = ШаблонТаблицыДанныеКонтрагентаДляДокумента();
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоСчетФактура(Форма) Тогда
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументОбъект = ОбъектИСсылкаПоФорме.Объект;
+
+ ЗаполнитьДанныеКонтрагентовВСчетеФактуре(ДокументОбъект, ДанныеКонтрагентов);
+ Иначе
+
+ // Заполняем данные по контрагенту из документа-основания.
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВШапке(Форма) Тогда
+ ЗаполнитьДанныеКонтрагентовВДокументеОсновании(Форма, ДанныеКонтрагентов);
+ КонецЕсли;
+
+ // Заполняем данные по контрагенту из счета-фактуры.
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСоСчетомФактуройВПодвале(Форма) Тогда
+
+ СчетФактура = ПроверкаКонтрагентовКлиентСервер.СчетФактура(Форма);
+ Если ЗначениеЗаполнено(СчетФактура) Тогда
+ ЗаполнитьДанныеКонтрагентовВСчетеФактуре(СчетФактура, ДанныеКонтрагентов);
+ КонецЕсли;
+
+ КонецЕсли;
+
+ // Заполняем данные по контрагентам из табличных частей.
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВТабличнойЧасти(Форма) Тогда
+ ЗаполнитьДанныеКонтрагентовВТабличнойЧасти(Форма, ДанныеКонтрагентов);
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Возврат ДанныеКонтрагентов;
+
+КонецФункции
+
+Процедура ЗапомнитьРезультатПроверкиКонтрагентовВДокументе(Форма, ДанныеКонтрагентов)
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументОбъект = ОбъектИСсылкаПоФорме.Объект;
+ ДокументСсылка = ОбъектИСсылкаПоФорме.Ссылка;
+
+ Описание = ОписаниеДокументов(Форма);
+
+ // Если контрагент в шапке
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВШапке(Форма) Тогда
+
+ СтрокиПоДокументу = Описание.НайтиСтроки(Новый Структура("Ссылка", ДокументСсылка));
+ Для каждого СтрокаОписания Из СтрокиПоДокументу Цикл
+
+ Дата = ДатаВДокументе(ДокументОбъект);
+
+ Отбор = Новый Структура("Ссылка, Контрагент, Дата", ДокументСсылка, СтрокаОписания.Контрагент, Дата);
+ ИтоговоеСостояние = ИтоговоеСостояниеКонтрагентаВДокументе(ДанныеКонтрагентов, Отбор);
+ Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагента = ИтоговоеСостояние.СостояниеКонтрагента;
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ // Если есть счет-фактура на форме.
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСоСчетомФактуройВПодвале(Форма) Тогда
+
+ СчетФактура = ПроверкаКонтрагентовКлиентСервер.СчетФактура(Форма);
+
+ Отбор = Новый Структура("Ссылка", СчетФактура);
+ ИтоговоеСостояние = ИтоговоеСостояниеКонтрагентаВДокументе(ДанныеКонтрагентов, Отбор);
+ Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагентовВСчетеФактуре = ИтоговоеСостояние.СостояниеКонтрагента;
+
+ КонецЕсли;
+
+ // Если контрагент в ТЧ
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВТабличнойЧасти(Форма) Тогда
+
+ ЗапомнитьРезультатПроверкиКонтрагентовВТабличнойЧасти(Форма, ДанныеКонтрагентов);
+
+ КонецЕсли;
+
+
+КонецПроцедуры
+
+Процедура ЗапомнитьРезультатПроверкиКонтрагентовВТабличнойЧасти(Форма, ДанныеКонтрагентов)
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументОбъект = ОбъектИСсылкаПоФорме.Объект;
+ ДокументСсылка = ОбъектИСсылкаПоФорме.Ссылка;
+
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВТабличнойЧасти(Форма) Тогда
+
+ ОписаниеТабличныхЧастей = ОписаниеТабличныхЧастей(Форма);
+
+ // Перебираем все табличные части.
+ Для каждого ОписаниеТабличнойЧасти Из ОписаниеТабличныхЧастей Цикл
+
+ ИмяТабличнойЧасти = ОписаниеТабличнойЧасти.ИмяТабличнойЧасти;
+ ИмяКолонкиСКонтрагентом = ОписаниеТабличнойЧасти.ИмяКолонкиСКонтрагентом;
+
+ ТабличнаяЧасть = ДокументОбъект[ОписаниеТабличнойЧасти.ИмяТабличнойЧасти];
+
+ Для каждого СтрокаТабличнойЧасти Из ТабличнаяЧасть Цикл
+
+ // Определение даты
+ Дата = ДатаВСтрокеТабличнойЧасти(ДокументОбъект, ОписаниеТабличнойЧасти, СтрокаТабличнойЧасти);
+ Контрагент = СтрокаТабличнойЧасти[ИмяКолонкиСКонтрагентом];
+
+ // В результате проверки контрагента ищем нужного контрагента с нужной датой.
+ СтрокиДанныхКонтрагентов = ДанныеКонтрагентов.НайтиСтроки(
+ Новый Структура("Ссылка, Контрагент, Дата", ДокументСсылка, Контрагент, Дата));
+
+ Для каждого СтрокиДанныхКонтрагента Из СтрокиДанныхКонтрагентов Цикл
+ СтрокаТабличнойЧасти.Состояние = СтрокиДанныхКонтрагента.Состояние;
+ СтрокаТабличнойЧасти.ЭтоНекорректныйКонтрагент =
+ ПроверкаКонтрагентовКлиентСерверПовтИсп.ЭтоСостояниеНедействующегоКонтрагента(СтрокиДанныхКонтрагента.Состояние, Истина);
+ КонецЦикла;
+
+ КонецЦикла;
+
+ КонецЦикла;
+ КонецЕсли;
+
+КонецПроцедуры
+
+Функция РезультатПроверкиКонтрагентовВДокументе(Форма, ТекущийОбъект)
+
+ ДокументОбъект = ТекущийОбъект;
+ ДокументСсылка = ДокументОбъект.Ссылка;
+
+ ЭтоДокументСКонтрагентомВШапке = ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВШапке(Форма);
+ ЭтоДокументСКонтрагентомВТабличнойЧасти = ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВТабличнойЧасти(Форма);
+ ЭтоДокументСоСчетомФактуройВПодвале = ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСоСчетомФактуройВПодвале(Форма);
+ ЭтоСчетФактура = ПроверкаКонтрагентовКлиентСервер.ЭтоСчетФактура(Форма);
+
+ СохраняемоеЗначение = Новый Соответствие;
+
+ Если ЭтоДокументСКонтрагентомВШапке ИЛИ ЭтоДокументСКонтрагентомВТабличнойЧасти Тогда
+ // Документ-основание
+ Если ЗначениеЗаполнено(Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагентов) Тогда
+ СохраняемоеЗначение.Вставить(ДокументСсылка, Форма.РеквизитыПроверкиКонтрагентов.ЭтоДокументСОшибкой);
+ КонецЕсли;
+ КонецЕсли;
+
+ Если ЭтоДокументСоСчетомФактуройВПодвале Тогда
+ // Счет-фактура
+ СчетФактура = ПроверкаКонтрагентовКлиентСервер.СчетФактура(Форма);
+ Если ЗначениеЗаполнено(СчетФактура) И ЗначениеЗаполнено(Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагентовВСчетеФактуре) Тогда
+ СохраняемоеЗначение.Вставить(СчетФактура, Форма.РеквизитыПроверкиКонтрагентов.ЭтоСчетФактураСОшибкой);
+ КонецЕсли;
+ КонецЕсли;
+
+ Если ЭтоСчетФактура Тогда
+ Если ЗначениеЗаполнено(Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагентов) Тогда
+ СохраняемоеЗначение.Вставить(ДокументСсылка, Форма.РеквизитыПроверкиКонтрагентов.ЭтоСчетФактураСОшибкой);
+ КонецЕсли;
+ КонецЕсли;
+
+ Возврат СохраняемоеЗначение;
+
+КонецФункции
+
+Процедура ЗаполнитьДанныеКонтрагентовВТабличнойЧасти(Форма, ДанныеКонтрагентов)
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументОбъект = ОбъектИСсылкаПоФорме.Объект;
+ ДокументСсылка = ОбъектИСсылкаПоФорме.Ссылка;
+
+ ОписаниеТабличныхЧастей = ОписаниеТабличныхЧастей(Форма);
+
+ Для каждого ОписаниеТабличнойЧасти Из ОписаниеТабличныхЧастей Цикл
+
+ ИмяТабличнойЧасти = ОписаниеТабличнойЧасти.ИмяТабличнойЧасти;
+ ИмяКолонкиСКонтрагентом = ОписаниеТабличнойЧасти.ИмяКолонкиСКонтрагентом;
+
+ ТабличнаяЧасть = ДокументОбъект[ОписаниеТабличнойЧасти.ИмяТабличнойЧасти];
+
+ Для каждого СтрокаТабличнойЧасти Из ТабличнаяЧасть Цикл
+
+ // Определение даты
+ Дата = ДатаВСтрокеТабличнойЧасти(ДокументОбъект, ОписаниеТабличнойЧасти, СтрокаТабличнойЧасти);
+
+ // Заполнение данных контрагента.
+ ДополнитьДанныеКонтрагентовВДокументе(
+ ДокументСсылка,
+ ДанныеКонтрагентов,
+ СтрокаТабличнойЧасти[ИмяКолонкиСКонтрагентом],
+ Дата,
+ СтрокаТабличнойЧасти.Состояние);
+
+ КонецЦикла;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ЗаполнитьДанныеКонтрагентовВДокументеОсновании(Форма, ДанныеКонтрагентов)
+
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВШапке(Форма) Тогда
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументОбъект = ОбъектИСсылкаПоФорме.Объект;
+ ДокументСсылка = ОбъектИСсылкаПоФорме.Ссылка;
+
+ ДополнитьДанныеКонтрагентовВДокументе(
+ ДокументСсылка,
+ ДанныеКонтрагентов,
+ ДокументОбъект.Контрагент,
+ ДатаВДокументе(ДокументОбъект),
+ Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагента);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ОчиститьРезультатыПредыдущихПроверок(Форма, ДополнительныеПараметры)
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументСсылка = ОбъектИСсылкаПоФорме.Ссылка;
+
+ ЭтоДокументСКонтрагентомВШапке = ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВШапке(Форма);
+ ЭтоДокументСКонтрагентомВТабличнойЧасти = ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВТабличнойЧасти(Форма);
+ ЭтоДокументСоСчетомФактуройВПодвале = ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСоСчетомФактуройВПодвале(Форма);
+ ЭтоСчетФактура = ПроверкаКонтрагентовКлиентСервер.ЭтоСчетФактура(Форма);
+
+ Если ЭтоДокументСКонтрагентомВШапке ИЛИ ЭтоДокументСоСчетомФактуройВПодвале ИЛИ ЭтоСчетФактура Тогда
+
+ Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура")
+ И ДополнительныеПараметры.Свойство("ИзменившаясяТаблица") Тогда
+ // Изменилась строка в ТЧ. Ничего делать не нужно.
+ Иначе
+
+ ПустоеСостояние = Перечисления.СостоянияСуществованияКонтрагента.ПустаяСсылка();
+
+ Если ЭтоСчетФактура Тогда
+
+ // Очищаем состояние для каждого контрагента.
+ Описание = ОписаниеКонтрагентовВСчетеФактуре(ТипЗнч(ДокументСсылка));
+ Для каждого СтрокаОписания Из Описание Цикл
+ Если Форма.РеквизитыПроверкиКонтрагентов.Свойство(СтрокаОписания.ИмяРеквизитаССостоянием) Тогда
+ Форма.РеквизитыПроверкиКонтрагентов[СтрокаОписания.ИмяРеквизитаССостоянием] = ПустоеСостояние;
+ КонецЕсли;
+ КонецЦикла;
+
+ // Очищаем итоговое состояние
+ Форма.РеквизитыПроверкиКонтрагентов.ЭтоСчетФактураСОшибкой = Ложь;
+
+ Иначе
+
+ ОчиститьРеквизитФормы(Форма, "СостояниеКонтрагента", ПустоеСостояние);
+ ОчиститьРеквизитФормы(Форма, "СостояниеКонтрагентовВСчетеФактуре", ПустоеСостояние);
+ ОчиститьРеквизитФормы(Форма, "ЭтоСчетФактураСОшибкой", Ложь);
+ ОчиститьРеквизитФормы(Форма, "ЭтоДокументСОшибкой", Ложь);
+
+ КонецЕсли;
+ КонецЕсли;
+ КонецЕсли;
+
+ Если ЭтоДокументСКонтрагентомВТабличнойЧасти Тогда
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументОбъект = ОбъектИСсылкаПоФорме.Объект;
+
+ // Очищаем состояния в определенной строке.
+ Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура")
+ И ДополнительныеПараметры.Свойство("ИзменившаясяТаблица") Тогда
+
+ // Это передано имя таблицы формы и идентификатор строки.
+ СвойстваТаблица = ДополнительныеПараметры.ИзменившаясяТаблица;
+
+ ОписаниеТабличныхЧастей = ОписаниеТабличныхЧастей(Форма);
+ ОписанияТабличныхЧастей = ОписаниеТабличныхЧастей.НайтиСтроки(Новый Структура("ИмяТаблицыФормы", СвойстваТаблица.ИмяТаблицы));
+
+ Для каждого ОписаниеТабличнойЧасти Из ОписанияТабличныхЧастей Цикл
+ ТабличнаяЧасть = ДокументОбъект[ОписаниеТабличнойЧасти.ИмяТабличнойЧасти];
+ СтрокаТабличнойЧасти = ТабличнаяЧасть.НайтиПоИдентификатору(СвойстваТаблица.Идентификатор);
+
+ ОчиститьРезультатПроверкиВСтроке(СтрокаТабличнойЧасти);
+
+ КонецЦикла;
+
+ Иначе
+ // Очищаем состояния в нескольких строках.
+ ОчиститьРезультатПроверкиВСтроках(Форма, ДополнительныеПараметры);
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Если ЭтоДокументСКонтрагентомВШапке ИЛИ ЭтоДокументСКонтрагентомВТабличнойЧасти Тогда
+ Форма.РеквизитыПроверкиКонтрагентов.ЭтоДокументСОшибкой = ЭтоДокументСОшибкой(Форма);
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ОчиститьРезультатПроверкиВСтроках(Форма, ДополнительныеПараметры)
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументОбъект = ОбъектИСсылкаПоФорме.Объект;
+
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВТабличнойЧасти(Форма) Тогда
+
+ ОписаниеТабличныхЧастей = ОписаниеТабличныхЧастей(Форма);
+
+ // Перебираем все табличные части.
+ Для каждого ОписаниеТабличнойЧасти Из ОписаниеТабличныхЧастей Цикл
+
+ ИмяТабличнойЧасти = ОписаниеТабличнойЧасти.ИмяТабличнойЧасти;
+ ИмяКолонкиСКонтрагентом = ОписаниеТабличнойЧасти.ИмяКолонкиСКонтрагентом;
+ ИмяКолонкиСДатой = ОписаниеТабличнойЧасти.ИмяКолонкиСДатой;
+
+ ТабличнаяЧасть = ДокументОбъект[ОписаниеТабличнойЧасти.ИмяТабличнойЧасти];
+
+ СтрокиТабличнойЧасти = ТабличнаяЧасть;
+ Если ДополнительныеПараметры.Свойство("ИзменившийсяСчетФактура") Тогда // Произошла запись счета-фактуры.
+ // Очищаем все строки
+ СтрокиТабличнойЧасти = ТабличнаяЧасть;
+ ИначеЕсли ДополнительныеПараметры.Свойство("ИзменившаясяДата")
+ И ЗначениеЗаполнено(ИмяКолонкиСДатой) Тогда // Изменилась дата в шапке документа.
+ // Очищаем строки с пустой датой.
+ СтрокиТабличнойЧасти = ТабличнаяЧасть.НайтиСтроки(Новый Структура(ИмяКолонкиСДатой, Дата(1,1,1)));
+ ИначеЕсли ДополнительныеПараметры.Свойство("ИзменившаясяДата")
+ И НЕ ЗначениеЗаполнено(ИмяКолонкиСДатой) Тогда // Изменилась дата в шапке документа.
+ // Если в табличной части нет поля с датой, то очищаем все состояния при изменении даты.
+ СтрокиТабличнойЧасти = ТабличнаяЧасть;
+ ИначеЕсли ДополнительныеПараметры.Свойство("ИзменившийсяКонтрагент") Тогда // Произошло событие записи контрагента.
+ // Очищаем строки с указанным контрагентом.
+ Контрагент = ДополнительныеПараметры.ИзменившийсяКонтрагент;
+ СтрокиТабличнойЧасти = ТабличнаяЧасть.НайтиСтроки(Новый Структура(ИмяКолонкиСКонтрагентом, Контрагент));
+ ИначеЕсли ДополнительныеПараметры.Свойство("ИзменившеесяПоле") Тогда // Изменился контрагент в шапке.
+ // Ничего делать не нужно
+ Возврат;
+ Иначе
+ СтрокиТабличнойЧасти = ТабличнаяЧасть;
+ КонецЕсли;
+
+ Для каждого СтрокаТабличнойЧасти Из СтрокиТабличнойЧасти Цикл
+ ОчиститьРезультатПроверкиВСтроке(СтрокаТабличнойЧасти);
+ КонецЦикла;
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ОчиститьРезультатПроверкиВСтроке(Строка)
+
+ Строка.Состояние = ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.ПустаяСсылка");
+ Строка.ЭтоНекорректныйКонтрагент = Ложь;
+
+КонецПроцедуры
+
+Функция ДатаВДокументе(ДокументОбъект)
+
+ Дата = Дата(1,1,1);
+ ПроверкаКонтрагентовПереопределяемый.ОпределитьДатуВДокументе(ДокументОбъект, Дата);
+
+ Возврат НачалоДня(Дата);
+
+КонецФункции
+
+Функция ЭтоДокументСОшибкой(Форма)
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументОбъект = ОбъектИСсылкаПоФорме.Объект;
+
+ ЭтоДокументСКонтрагентомВШапке = ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВШапке(Форма);
+ ЭтоДокументСКонтрагентомВТабличнойЧасти = ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВТабличнойЧасти(Форма);
+
+ ЕстьОшибкаВШапке = Ложь;
+ ЕстьОшибкаВТабличнойЧасти = Ложь;
+
+ Если ЭтоДокументСКонтрагентомВШапке Тогда
+ ЕстьОшибкаВШапке = ПроверкаКонтрагентовКлиентСерверПовтИсп.ЭтоСостояниеНедействующегоКонтрагента(Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагента, Истина);
+ Если ЕстьОшибкаВШапке Тогда
+ Возврат Истина;
+ КонецЕсли;
+ КонецЕсли;
+
+ Если ЭтоДокументСКонтрагентомВТабличнойЧасти Тогда
+
+ ОписаниеТабличныхЧастей = ОписаниеТабличныхЧастей(Форма);
+
+ // Перебираем все табличные части.
+ Для каждого ОписаниеТабличнойЧасти Из ОписаниеТабличныхЧастей Цикл
+
+ ИмяТабличнойЧасти = ОписаниеТабличнойЧасти.ИмяТабличнойЧасти;
+ ТабличнаяЧасть = ДокументОбъект[ОписаниеТабличнойЧасти.ИмяТабличнойЧасти];
+
+ Для каждого СтрокаТабличнойЧасти Из ТабличнаяЧасть Цикл
+ ЕстьОшибкаВТабличнойЧасти = ПроверкаКонтрагентовКлиентСерверПовтИсп.ЭтоСостояниеНедействующегоКонтрагента(СтрокаТабличнойЧасти.Состояние, Истина);
+ Если ЕстьОшибкаВТабличнойЧасти Тогда
+ Возврат Истина;
+ КонецЕсли;
+
+ КонецЦикла;
+ КонецЦикла;
+ КонецЕсли;
+
+ Возврат ЕстьОшибкаВШапке ИЛИ ЕстьОшибкаВТабличнойЧасти;
+
+КонецФункции
+
+Процедура ОчиститьРеквизитФормы(Форма, ИмяРеквизита, НовоеЗначение)
+
+ Если ЕстьРеквизитФормы(Форма, "РеквизитыПроверкиКонтрагентов")
+ И Форма.РеквизитыПроверкиКонтрагентов.Свойство(ИмяРеквизита) Тогда
+
+ Форма.РеквизитыПроверкиКонтрагентов[ИмяРеквизита] = НовоеЗначение;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ВосстановитьРезультатПроверкиКонтрагентовВТабличныхЧастяхПослеЗаписи(Форма, ТекущийОбъект)
+
+ ЭтоДокументСКонтрагентомВТабличнойЧасти = ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВТабличнойЧасти(Форма);
+
+ // Восстанавливаем результат проверки в табличной части.
+ Если ЭтоДокументСКонтрагентомВТабличнойЧасти Тогда
+
+ ДанныеКонтрагентов = Неопределено;
+ Если ТекущийОбъект.ДополнительныеСвойства.Свойство("ДанныеКонтрагентов", ДанныеКонтрагентов) Тогда
+ ЗапомнитьРезультатПроверкиКонтрагентовВТабличнойЧасти(Форма, ДанныеКонтрагентов);
+ КонецЕсли;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ПрисоединитьОписание(Приемник, Источник)
+
+ Для Каждого СтрокаИсточника Из Источник Цикл
+ НоваяСтрокаПриемника = Приемник.Добавить();
+ ЗаполнитьЗначенияСвойств(НоваяСтрокаПриемника, СтрокаИсточника);
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура УправлениеФормойПриСозданииНаСервере(Форма)
+
+ ЭтоДокументСКонтрагентомВТабличнойЧасти = ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВТабличнойЧасти(Форма);
+
+ Если ЭтоДокументСКонтрагентомВТабличнойЧасти Тогда
+ // Реквизиты объекта
+ ДобавитьКолонкиТабличнойЧастиСРезультатамиПроверкиВТабличныеЧасти(Форма);
+ // Элементы формы
+ ДобавитьКолонкиТаблицыФормыСРезультатамиПроверкиВТабличныеЧасти(Форма);
+ // Условное оформление
+ УстановитьУсловноеОформлениеТабличнойЧастиДокумента(Форма);
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ЗапомнитьРезультатПроверкиКонтрагентов(Форма, ДанныеКонтрагентов)
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументСсылка = ОбъектИСсылкаПоФорме.Ссылка;
+
+ // Корректность каждого контрагента.
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоСчетФактура(Форма) Тогда
+ ЗапомнитьРезультатПроверкиКонтрагентовВСчетеФактуре(Форма, ДанныеКонтрагентов);
+ Иначе
+ ЗапомнитьРезультатПроверкиКонтрагентовВДокументе(Форма, ДанныеКонтрагентов);
+ КонецЕсли;
+
+ // Общее состояние по счету-фактуре.
+ Отбор = Новый Структура("Ссылка", ДокументСсылка);
+ ИтоговоеСостояние = ИтоговоеСостояниеКонтрагентаВДокументе(ДанныеКонтрагентов, Отбор);
+ Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагентов = ИтоговоеСостояние.СостояниеКонтрагента;
+
+ // Корректность всего документа в целом.
+ ЗапомнитьНаличиеНекорректныхКонтрагентов(Форма);
+
+ // Обновляем кэш
+ ЗапомнитьСостояниеКонтрагентовНеСовпадающихСКэшем(Форма, ДанныеКонтрагентов);
+
+КонецПроцедуры
+
+Процедура ЗапомнитьСостояниеКонтрагентовНеСовпадающихСКэшем(Форма, ДанныеКонтрагентов)
+
+ // Получаем результат проверки контрагента из кэша
+ ДанныеКонтрагентовИзКэша = Неопределено;
+ Если ЗначениеЗаполнено(Форма.РеквизитыПроверкиКонтрагентов.АдресДанныхКонтрагентовИзКэша)
+ И ЭтоАдресВременногоХранилища(Форма.РеквизитыПроверкиКонтрагентов.АдресДанныхКонтрагентовИзКэша) Тогда
+
+ ДанныеКонтрагентовИзКэша = ПолучитьИзВременногоХранилища(Форма.РеквизитыПроверкиКонтрагентов.АдресДанныхКонтрагентовИзКэша);
+ Иначе
+ Возврат;
+ КонецЕсли;
+
+ РазличающиесяДанныеКонтрагентов = ДанныеКонтрагентовРазличающиесяМеждуКэшемИСервисомФНС(ДанныеКонтрагентов, ДанныеКонтрагентовИзКэша).Выгрузить();
+
+ СегодняшнийДень = НачалоДня(ТекущаяДатаСеанса());
+
+ // Сохраняем в кэш обновленные состояния только за сегодняшний день.
+ Для каждого ДанныеКонтрагента Из РазличающиесяДанныеКонтрагентов Цикл
+
+ Если ЗначениеЗаполнено(ДанныеКонтрагента.Дата)
+ И НачалоДня(ДанныеКонтрагента.Дата) = СегодняшнийДень Тогда
+
+ СохранитьРезультатыПроверкиКонтрагентаВРегистр(ДанныеКонтрагента);
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ПрорисоватьСостоянияКонтрагентовВДокументе(Форма, СостояниеПроверки, ДополнительныеПараметры = Неопределено)
+
+ СтандартнаяОбработка = Истина;
+ ПроверкаКонтрагентовПереопределяемый.ПрорисоватьСостоянияКонтрагентовВДокументе(Форма, СостояниеПроверки,
+ ДополнительныеПараметры, СтандартнаяОбработка);
+
+ // Если действия по отображению результата проверки переопределили, то стандартную обработку не выполняем.
+ Если НЕ СтандартнаяОбработка Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЭтоДокументСКонтрагентомВШапке = ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВШапке(Форма);
+ ЭтоДокументСКонтрагентомВТабличнойЧасти = ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСКонтрагентомВТабличнойЧасти(Форма);
+ ЭтоДокументСоСчетомФактуройВПодвале = ПроверкаКонтрагентовКлиентСервер.ЭтоДокументСоСчетомФактуройВПодвале(Форма);
+ ЭтоСчетФактура = ПроверкаКонтрагентовКлиентСервер.ЭтоСчетФактура(Форма);
+
+ Если ЭтоДокументСКонтрагентомВШапке
+ ИЛИ ЭтоДокументСоСчетомФактуройВПодвале
+ ИЛИ ЭтоСчетФактура Тогда
+
+ Если ДополнительныеПараметры = Неопределено Тогда
+ Элемент = Неопределено;
+ ИначеЕсли ДополнительныеПараметры.Свойство("ИзменившаясяТаблица") Тогда
+ // Изменилась строка в ТЧ. Ничего делать не нужно.
+ Возврат;
+ ИначеЕсли ДополнительныеПараметры.Свойство("ИзменившеесяПоле") Тогда
+ // Это поле с контрагентом или счетом-фактурой.
+ Элемент = Форма.Элементы[ДополнительныеПараметры.ИзменившеесяПоле];
+ Иначе
+ Элемент = Неопределено;
+ КонецЕсли;
+
+ Описание = ОписаниеДокументов(Форма);
+ СчетФактура = ПроверкаКонтрагентовКлиентСервер.СчетФактура(Форма);
+
+ Для каждого СтрокаОписания Из Описание Цикл
+
+ // Прорисовываем результат либо для всех элементов, либо только для переданного.
+ Если Элемент = Неопределено ИЛИ Элемент = СтрокаОписания.Элемент Тогда
+
+ ПараметрыПрорисовки = Новый Структура;
+ ПараметрыПрорисовки.Вставить("СостояниеКонтрагента", СтрокаОписания.СостояниеКонтрагента);
+
+ ПараметрыПрорисовки.Вставить("ЭлементРодитель", СтрокаОписания.ЭлементРодитель);
+ ПараметрыПрорисовки.Вставить("Элемент", СтрокаОписания.Элемент);
+
+ // Разный алгоритм для счета-фактуры и обычного контрагента.
+ Если ЭтоДокументСоСчетомФактуройВПодвале И СчетФактура = СтрокаОписания.Ссылка Тогда
+ КонтрагентЗаполнен = ВСчетеФактуреЗаполненХотяБыОдинКонтрагент(СчетФактура);
+ КонтрагентовНесколько = Истина;
+ Иначе
+ КонтрагентЗаполнен = ЗначениеЗаполнено(СтрокаОписания.Контрагент);
+ КонтрагентовНесколько = Ложь;
+ КонецЕсли;
+ ПараметрыПрорисовки.Вставить("КонтрагентЗаполнен", КонтрагентЗаполнен);
+ ПараметрыПрорисовки.Вставить("КонтрагентовНесколько", КонтрагентовНесколько);
+
+
+ ПроверкаКонтрагентовКлиентСервер.УстановитьТекстПодсказкиВДокументе(ПараметрыПрорисовки, СостояниеПроверки);
+ КонецЕсли;
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура СохранитьРезультатПроверкиКонтрагентов(Форма, ТекущийОбъект)
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+
+ СохраняемоеЗначение = РезультатПроверкиКонтрагентовВДокументе(Форма, ТекущийОбъект);
+
+ УстановитьПривилегированныйРежим(Истина);
+ СохранитьРезультатыПроверкиКонтрагентовВДокументеВРегистр(СохраняемоеЗначение);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Функция РезультатПроверкиКонтрагентовВДокументеСовпадаетСДаннымиФНС(РеквизитыПроверкиКонтрагентов) Экспорт
+
+ // Соединяем результаты проверки с исходной таблицей.
+ Запрос = Новый Запрос;
+
+ // Получаем данные контрагентов как результат работы фонового задания.
+ ДанныеКонтрагентов = Неопределено;
+ Если ЗначениеЗаполнено(РеквизитыПроверкиКонтрагентов.АдресХранилища)
+ И ЭтоАдресВременногоХранилища(РеквизитыПроверкиКонтрагентов.АдресХранилища) Тогда
+
+ РезультатРаботыФоновогоЗадания = ПолучитьИзВременногоХранилища(РеквизитыПроверкиКонтрагентов.АдресХранилища);
+
+ Если РезультатРаботыФоновогоЗадания = Неопределено Тогда
+ // Если фоновое задание завершилось, но результат пустой, то прорисовываем результат из кэша.
+ Возврат Истина;
+ Иначе
+ Если РезультатРаботыФоновогоЗадания.Свойство("НетДоступаКВебСервисуФНС") Тогда
+ // Если нет доступа к сервису ФНС, то прорисовываем результат из кэша.
+ Возврат Истина;
+ Иначе
+ // Фоновое задание отработало
+ ДанныеКонтрагентов = РезультатРаботыФоновогоЗадания.ДанныеКонтрагентов;
+ КонецЕсли;
+ КонецЕсли;
+ Иначе
+ // Если фоновое задание завершилось, но результат пустой, то прорисовываем результат из кэша.
+ Возврат Истина;
+ КонецЕсли;
+
+ Если ДанныеКонтрагентов = Неопределено Тогда
+ // Если фоновое задание завершилось, но результат пустой, то прорисовываем результат из кэша.
+ Возврат Истина;
+ КонецЕсли;
+
+ // Получаем результат проверки контрагента из кэша
+ ДанныеКонтрагентовИзКэша = Неопределено;
+ Если ЗначениеЗаполнено(РеквизитыПроверкиКонтрагентов.АдресДанныхКонтрагентовИзКэша)
+ И ЭтоАдресВременногоХранилища(РеквизитыПроверкиКонтрагентов.АдресДанныхКонтрагентовИзКэша) Тогда
+
+ ДанныеКонтрагентовИзКэша = ПолучитьИзВременногоХранилища(РеквизитыПроверкиКонтрагентов.АдресДанныхКонтрагентовИзКэша);
+
+ Иначе
+ // Если фоновое задание завершилось, но в кэше пусто, то прорисовываем результат от сервиса ФНС.
+ Возврат Ложь;
+ КонецЕсли;
+
+ ВыборкаНесовпадающихСостояний = ДанныеКонтрагентовРазличающиесяМеждуКэшемИСервисомФНС(ДанныеКонтрагентов, ДанныеКонтрагентовИзКэша).Выбрать();
+
+ Возврат ВыборкаНесовпадающихСостояний.Количество() = 0;
+
+КонецФункции
+
+Функция ДанныеКонтрагентовРазличающиесяМеждуКэшемИСервисомФНС(ДанныеКонтрагентов, ДанныеКонтрагентовИзКэша)
+
+ Запрос = Новый Запрос;
+
+ ПоместитьТаблицуЗначенийВоВременнуюТаблицу(ДанныеКонтрагентовИзКэша, Запрос, "ДанныеКонтрагентовИзКэша", "ИзКэша");
+ ПоместитьТаблицуЗначенийВоВременнуюТаблицу(ДанныеКонтрагентов, Запрос, "ДанныеКонтрагентов");
+
+ // В таблице оставляем строки с различающимся состоянием
+ Запрос.Текст = Запрос.Текст + "
+ |ВЫБРАТЬ
+ | " + ПредставлениеКолонок(ДанныеКонтрагентовИзКэша, "ДанныеКонтрагентовИзКэша.", "ИзКэша") + ",
+ | " + ПредставлениеКолонок(ДанныеКонтрагентов, "ДанныеКонтрагентов.") + "
+ |ИЗ
+ | ДанныеКонтрагентовИзКэша КАК ДанныеКонтрагентовИзКэша
+ | ПОЛНОЕ СОЕДИНЕНИЕ ДанныеКонтрагентов КАК ДанныеКонтрагентов
+ | ПО ДанныеКонтрагентовИзКэша.Контрагент = ДанныеКонтрагентов.Контрагент
+ | И ДанныеКонтрагентовИзКэша.ИНН = ДанныеКонтрагентов.ИНН
+ | И ДанныеКонтрагентовИзКэша.КПП = ДанныеКонтрагентов.КПП
+ | И ДанныеКонтрагентовИзКэша.Ссылка = ДанныеКонтрагентов.Ссылка
+ | И (НАЧАЛОПЕРИОДА(ДанныеКонтрагентовИзКэша.Дата, ДЕНЬ) = НАЧАЛОПЕРИОДА(ДанныеКонтрагентов.Дата, ДЕНЬ))
+ |ГДЕ
+ | ЕСТЬNULL(ДанныеКонтрагентов.Состояние,Неопределено) <> ЕСТЬNULL(ДанныеКонтрагентовИзКэша.Состояние,Неопределено)";
+
+ Возврат Запрос.Выполнить();
+
+КонецФункции
+
+Процедура ПредотвратитьСбросРедактируемогоЗначения(Форма)
+
+ // Обход особенности платформы, когда затирается редактируемое значение
+ // в текущем элементе при изменении формы.
+ Если НЕ ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() Тогда
+ Если ТипЗнч(Форма.ТекущийЭлемент) = Тип("ПолеФормы") И Форма.ТекущийЭлемент.Вид = ВидПоляФормы.ПолеВвода Тогда
+ Форма.ТекущийЭлемент.ОбновлениеТекстаРедактирования = ОбновлениеТекстаРедактирования.ПриИзмененииЗначения;
+ КонецЕсли;
+ КонецЕсли;
+
+КонецПроцедуры
+
+#Область УправлениеФормами
+
+Процедура УстановитьУсловноеОформлениеТабличнойЧастиДокумента(Форма)
+
+ СтандартнаяОбработка = Истина;
+ ПроверкаКонтрагентовПереопределяемый.УстановитьУсловноеОформлениеТабличнойЧастиДокумента(Форма, СтандартнаяОбработка);
+
+ // Если действия переопределили, то стандартную обработку не выполняем.
+ Если НЕ СтандартнаяОбработка Тогда
+ Возврат;
+ КонецЕсли;
+
+ СостоянияНедействующегоКонтрагента = ПроверкаКонтрагентовКлиентСерверПовтИсп.СостоянияНедействующегоКонтрагента(Истина);
+ СписокСостоянийНедействующегоКонтрагента = Новый СписокЗначений;
+ СписокСостоянийНедействующегоКонтрагента.ЗагрузитьЗначения(СостоянияНедействующегоКонтрагента);
+
+ ОписаниеТабличныхЧастей = ОписаниеТабличныхЧастей(Форма);
+ Для каждого ОписаниеТабличнойЧасти Из ОписаниеТабличныхЧастей Цикл
+
+ ИмяТабличнойЧасти = ОписаниеТабличнойЧасти.ИмяТабличнойЧасти;
+ ИмяПоляСКонтрагентом = ОписаниеТабличнойЧасти.ИмяПоляСКонтрагентом;
+ ПолеСКонтрагентом = Форма.Элементы[ОписаниеТабличнойЧасти.ИмяПоляСКонтрагентом];
+
+ // Если поле с контрагентом скрыто функциональной опцией, то условное оформление не добавляем.
+ Если ПолеКонтрагентаСкрытоФункциональнойОпцией(Форма, ОписаниеТабличнойЧасти) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ // Условное оформление
+ Оформление = Форма.УсловноеОформление.Элементы.Добавить();
+ Отбор = Оформление.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
+ Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
+ Отбор.Использование = Истина;
+
+ ПутьКСостоянию = "Объект.%1.Состояние";
+ ПутьКСостоянию = СтрЗаменить(ПутьКСостоянию, "%1", ИмяТабличнойЧасти);
+
+ Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКСостоянию);
+ Отбор.ПравоеЗначение = СписокСостоянийНедействующегоКонтрагента;
+
+ ЦветФона = Оформление.Оформление.Элементы.Найти("ЦветТекста");
+ Цвета = ПроверкаКонтрагентовВызовСервераПовтИсп.ЦветаРезультатовПроверки();
+ ЦветФона.Значение = Цвета.ЦветТекстаНекорректногоКонтрагента;
+ ЦветФона.Использование = Истина;
+
+ ОформляемоеПоле = Оформление.Поля.Элементы.Добавить();
+ ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяПоляСКонтрагентом);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ДобавитьКолонкиТабличнойЧастиСРезультатамиПроверкиВТабличныеЧасти(Форма)
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументОбъект = ОбъектИСсылкаПоФорме.Объект;
+
+ ОписаниеТабличныхЧастей = ОписаниеТабличныхЧастей(Форма);
+
+ Для каждого ОписаниеТабличнойЧасти Из ОписаниеТабличныхЧастей Цикл
+
+ // Если поле с контрагентом скрыто функциональной опцией, то колонку для отображения результата проверки контрагента
+ // не выводим.
+ Если ПолеКонтрагентаСкрытоФункциональнойОпцией(Форма, ОписаниеТабличнойЧасти) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ ТаблицаФормы = Форма.Элементы[ОписаниеТабличнойЧасти.ИмяТаблицыФормы];
+ ТабличнаяЧасть = ДокументОбъект[ОписаниеТабличнойЧасти.ИмяТабличнойЧасти];
+
+ // Колонка с признаком корректности контрагента.
+ ЕстьЭтоНекорректныйКонтрагент = ЕстьРеквизитФормы(ТабличнаяЧасть, "ЭтоНекорректныйКонтрагент");
+ Если НЕ ЕстьЭтоНекорректныйКонтрагент Тогда
+ ДобавитьРеквизитЭтоНекорректныйКонтрагент(Форма, ОписаниеТабличнойЧасти, ТаблицаФормы.ПутьКДанным);
+ КонецЕсли;
+
+ // Колонка с результатом проверки.
+ ЕстьСостояние = ЕстьРеквизитФормы(ТабличнаяЧасть, "Состояние");
+ Если НЕ ЕстьСостояние Тогда
+ ДобавитьРеквизитСостояние(Форма, ОписаниеТабличнойЧасти, ТаблицаФормы.ПутьКДанным);
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ДобавитьКолонкиТаблицыФормыСРезультатамиПроверкиВТабличныеЧасти(Форма)
+
+ СтандартнаяОбработка = Истина;
+ ПроверкаКонтрагентовПереопределяемый.ДобавитьКолонкиТаблицыФормыСРезультатамиПроверкиВТабличныеЧасти(Форма, СтандартнаяОбработка);
+
+ // Если действия переопределили, то стандартную обработку не выполняем.
+ Если НЕ СтандартнаяОбработка Тогда
+ Возврат;
+ КонецЕсли;
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументСсылка = ОбъектИСсылкаПоФорме.Ссылка;
+
+ ОписаниеТабличныхЧастей = ОписаниеТабличныхЧастей(Форма);
+ Для каждого ОписаниеТабличнойЧасти Из ОписаниеТабличныхЧастей Цикл
+
+ // Если поле с контрагентом скрыто функциональной опцией, то колонку для отображения результата проверки контрагента
+ // не выводим.
+ Если ПолеКонтрагентаСкрытоФункциональнойОпцией(Форма, ОписаниеТабличнойЧасти) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ ИмяТабличнойЧасти = ОписаниеТабличнойЧасти.ИмяТабличнойЧасти;
+ ИмяКолонкиСКонтрагентом = ОписаниеТабличнойЧасти.ИмяКолонкиСКонтрагентом;
+
+ // Программно добавляем колонку и группу колонок.
+ Элементы = Форма.Элементы;
+ ТаблицаФормы = Элементы[ОписаниеТабличнойЧасти.ИмяТаблицыФормы];
+
+ ПолеСКонтрагентом = Форма.Элементы[ОписаниеТабличнойЧасти.ИмяПоляСКонтрагентом];
+ НовоеПолеКартинки = Форма.Элементы.Найти(ПроверкаКонтрагентовКлиентСервер.ИмяПоляКартинки(ТаблицаФормы));
+ НоваяГруппаКолонок = Форма.Элементы.Найти(ПолеСКонтрагентом.Имя + "Группа");
+
+ // Если колонки с результатом проверки контрагента нет в табличной части, то добавляем ее.
+ Если НовоеПолеКартинки = Неопределено Тогда
+
+ НовоеПолеКартинки = НовоеПолеКартинки(Форма, ТаблицаФормы, ПолеСКонтрагентом.Родитель, ПолеСКонтрагентом);
+ НоваяГруппаКолонок = НоваяГруппаКолонок(Форма, ПолеСКонтрагентом.Родитель, ПолеСКонтрагентом, ОписаниеТабличнойЧасти);
+
+ // Перемещаем колонки в группу.
+ Элементы.Переместить(ПолеСКонтрагентом, НоваяГруппаКолонок);
+ Элементы.Переместить(НовоеПолеКартинки, НоваяГруппаКолонок);
+
+ КонецЕсли;
+
+ // Корректируем свойства колонки с контрагентом.
+ ПолеСКонтрагентом.ОтображатьВШапке = Ложь;
+ ПолеСКонтрагентом.ФиксацияВТаблице = ФиксацияВТаблице.Нет;
+ ПолеСКонтрагентом.РастягиватьПоГоризонтали = Ложь;
+
+ // Заголовок группы
+ Заголовок = ПолеСКонтрагентом.Заголовок;
+ Если НЕ ЗначениеЗаполнено(Заголовок) Тогда
+ Заголовок = ДокументСсылка.Метаданные().ТабличныеЧасти[ИмяТабличнойЧасти].Реквизиты[ИмяКолонкиСКонтрагентом].Синоним;
+ КонецЕсли;
+ НоваяГруппаКолонок.Заголовок = Заголовок;
+
+ // Устанавливаем видимость такую же как и у колонки с контрагентом.
+ НовоеПолеКартинки.Видимость = ПолеСКонтрагентом.Видимость;
+ НоваяГруппаКолонок.Видимость = ПолеСКонтрагентом.Видимость;
+
+ УстановитьВидимостьСостоянияКакУКонтрагента(Форма, ПолеСКонтрагентом, НовоеПолеКартинки);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Функция ПолеКонтрагентаСкрытоФункциональнойОпцией(Форма, ОписаниеТабличнойЧасти)
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументСсылка = ОбъектИСсылкаПоФорме.Ссылка;
+
+ ИмяДокумента = ДокументСсылка.Метаданные().Имя;
+ ИмяТабличнойЧасти = ОписаниеТабличнойЧасти.ИмяТабличнойЧасти;
+ ИмяКолонки = ОписаниеТабличнойЧасти.ИмяКолонкиСКонтрагентом;
+
+ ИскомыйОбъект = Метаданные.Документы[ИмяДокумента].ТабличныеЧасти[ИмяТабличнойЧасти].Реквизиты[ИмяКолонки];
+ ПолеСкрыто = НЕ ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(ИскомыйОбъект);
+
+ Возврат ПолеСкрыто;
+
+КонецФункции
+
+Функция КолонкаТаблицыСкрытаФункциональнойОпцией(Форма, ИмяТаблицыФормы, ИмяПоляСКонтрагентом)
+
+ ИмяТабличнойЧасти = ИмяРеквизита(Форма, ИмяТаблицыФормы);
+ ИмяКолонкиСКонтрагентом = ИмяРеквизита(Форма, ИмяПоляСКонтрагентом);
+
+ ОписаниеТабличнойЧасти = Новый Структура("ИмяТабличнойЧасти, ИмяКолонкиСКонтрагентом", ИмяТабличнойЧасти, ИмяКолонкиСКонтрагентом);
+
+ Возврат ПолеКонтрагентаСкрытоФункциональнойОпцией(Форма, ОписаниеТабличнойЧасти);
+
+КонецФункции
+
+Функция НовоеПолеКартинки(Форма, ТаблицаФормы, Родитель, СледующийЭлемент)
+
+ Элементы = Форма.Элементы;
+
+ НовоеПоле = Элементы.Вставить(ПроверкаКонтрагентовКлиентСервер.ИмяПоляКартинки(ТаблицаФормы), Тип("ПолеФормы"), Родитель, СледующийЭлемент);
+ НовоеПоле.Заголовок = НСтр("ru = 'Есть ошибка по данным ФНС'");
+ НовоеПоле.Вид = ВидПоляФормы.ПолеКартинки;
+ НовоеПоле.КартинкаЗначений = БиблиотекаКартинок.НекорректныйКонтрагент;
+ НовоеПоле.ПутьКДанным = ТаблицаФормы.ПутьКДанным + "." + "ЭтоНекорректныйКонтрагент";
+ НовоеПоле.ОтображатьВШапке = Ложь;
+ НовоеПоле.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
+ НовоеПоле.Ширина = 2;
+ НовоеПоле.РастягиватьПоГоризонтали = Ложь;
+ НовоеПоле.ГиперссылкаЯчейки = Истина;
+
+ Возврат НовоеПоле;
+
+КонецФункции
+
+Функция НоваяГруппаКолонок(Форма, Родитель, СледующийЭлемент, ОписаниеТабличнойЧасти)
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументСсылка = ОбъектИСсылкаПоФорме.Ссылка;
+
+ Элементы = Форма.Элементы;
+
+ НоваяГруппаКолонок = Элементы.Вставить(СледующийЭлемент.Имя + "Группа", Тип("ГруппаФормы"), Родитель, СледующийЭлемент);
+
+ Заголовок = СледующийЭлемент.Заголовок;
+ Если НЕ ЗначениеЗаполнено(Заголовок) Тогда
+
+ ИмяТабличнойЧасти = ОписаниеТабличнойЧасти.ИмяТабличнойЧасти;
+ ИмяКолонкиСКонтрагентом = ОписаниеТабличнойЧасти.ИмяКолонкиСКонтрагентом;
+
+ Заголовок = ДокументСсылка.Метаданные().ТабличныеЧасти[ИмяТабличнойЧасти].Реквизиты[ИмяКолонкиСКонтрагентом].Синоним;
+ КонецЕсли;
+
+ НоваяГруппаКолонок.Заголовок = Заголовок;
+ НоваяГруппаКолонок.Вид = ВидГруппыФормы.ГруппаКолонок;
+ НоваяГруппаКолонок.ОтображатьЗаголовок = Истина;
+ НоваяГруппаКолонок.Группировка = ГруппировкаКолонок.Горизонтальная;
+ НоваяГруппаКолонок.ОтображатьВШапке = Истина;
+ НоваяГруппаКолонок.ФиксацияВТаблице = СледующийЭлемент.ФиксацияВТаблице;
+ НоваяГруппаКолонок.Ширина = 17;
+ НоваяГруппаКолонок.РастягиватьПоГоризонтали = Ложь;
+
+ Возврат НоваяГруппаКолонок;
+
+КонецФункции
+
+Процедура ДобавитьРеквизитЭтоНекорректныйКонтрагент(Форма, ОписаниеТабличнойЧасти, Путь)
+
+ ДобавитьРеквизит(
+ Форма,
+ ОписаниеТабличнойЧасти,
+ "ЭтоНекорректныйКонтрагент",
+ Новый ОписаниеТипов("Булево"),
+ Путь);
+
+КонецПроцедуры
+
+Процедура ДобавитьРеквизитСостояние(Форма, ОписаниеТабличнойЧасти, Путь)
+
+ ДобавитьРеквизит(
+ Форма,
+ ОписаниеТабличнойЧасти,
+ "Состояние",
+ Новый ОписаниеТипов("ПеречислениеСсылка.СостоянияСуществованияКонтрагента"),
+ Путь);
+
+КонецПроцедуры
+
+Процедура ДобавитьРеквизит(Форма, ОписаниеТабличнойЧасти, ИмяРеквизита, Тип, Путь)
+
+ РеквизитУжеЕсть = РеквизитТабличнойЧастиУжеЕсть(Форма, ОписаниеТабличнойЧасти, ИмяРеквизита);
+ Если НЕ РеквизитУжеЕсть Тогда
+
+ НовыйРеквизит = Новый РеквизитФормы(ИмяРеквизита, Тип, Путь);
+ ДобавляемыеРеквизиты = Новый Массив;
+ ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
+ Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Функция РеквизитТабличнойЧастиУжеЕсть(Форма, ОписаниеТабличнойЧасти, ИмяРеквизита)
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументОбъект = ОбъектИСсылкаПоФорме.Объект;
+
+ ТабличнаяЧасть = ДокументОбъект[ОписаниеТабличнойЧасти.ИмяТабличнойЧасти];
+ ВыгрузкаТабличнойЧасти = ТабличнаяЧасть.Выгрузить();// Преобразуем в таблицу значений.
+ РеквизитУжеЕсть = ВыгрузкаТабличнойЧасти.Колонки.Найти(ИмяРеквизита) <> Неопределено;
+ ВыгрузкаТабличнойЧасти = Неопределено;
+
+ Возврат РеквизитУжеЕсть;
+
+КонецФункции
+
+Функция ДатаВСтрокеТабличнойЧасти(ДокументОбъект, ОписаниеТабличнойЧасти, СтрокаТабличнойЧасти)
+
+ ИмяКолонкиСДатой = ОписаниеТабличнойЧасти.ИмяКолонкиСДатой;
+
+ Дата = Дата(1,1,1);
+ ДатаВДокументе = ДатаВДокументе(ДокументОбъект);
+ Если ЗначениеЗаполнено(ИмяКолонкиСДатой) Тогда
+ // Определение даты из ТЧ
+ ДатаВСтроке = НачалоДня(СтрокаТабличнойЧасти[ИмяКолонкиСДатой]);
+ Дата = ?(ЗначениеЗаполнено(ДатаВСтроке), ДатаВСтроке, ДатаВДокументе);
+ Иначе
+ // В табличной части нет колонки с датой, то берем дату из шапки документа.
+ Дата = ДатаВДокументе;
+ КонецЕсли;
+
+ Возврат Дата;
+
+КонецФункции
+
+Процедура УстановитьВидимостьСостоянияКакУКонтрагента(Форма, ПолеСКонтрагентом, НовоеПолеКартинки)
+
+ УсловноеОформлениеФормы = Форма.УсловноеОформление;
+ Для каждого УсловноеОформление Из УсловноеОформлениеФормы.Элементы Цикл
+
+ Видимость = УсловноеОформление.Оформление.Элементы.Найти("Видимость");
+ ИспользуетсяУправлениеВидимостью = Видимость.Использование;
+
+ Если ИспользуетсяУправлениеВидимостью Тогда
+
+ Для каждого ЭлементПоля Из УсловноеОформление.Поля.Элементы Цикл
+ Если ЭлементПоля.Поле = Новый ПолеКомпоновкиДанных(ПолеСКонтрагентом.Имя) Тогда
+
+ НовоеОформляемоеПоле = УсловноеОформление.Поля.Элементы.Добавить();
+ НовоеОформляемоеПоле.Использование = Истина;
+ НовоеОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(НовоеПолеКартинки.Имя);
+
+ Прервать;
+
+ КонецЕсли;
+ КонецЦикла;
+ КонецЕсли;
+ КонецЦикла;
+
+КонецПроцедуры
+
+Функция ЕстьРеквизитФормы(Источник, ИмяРеквизита) Экспорт
+
+ ИскомыеРеквизиты = Новый Структура(ИмяРеквизита, NULL);
+ ЗаполнитьЗначенияСвойств(ИскомыеРеквизиты, Источник);
+
+ РеквизитСуществует = Ложь;
+ Если ИскомыеРеквизиты[ИмяРеквизита] <> NULL Тогда
+ РеквизитСуществует = Истина;
+ КонецЕсли;
+
+ Возврат РеквизитСуществует;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область СчетаФактуры
+
+Процедура ЗапомнитьРезультатПроверкиКонтрагентовВСчетеФактуре(Форма, ДанныеКонтрагентов)
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументОбъект = ОбъектИСсылкаПоФорме.Объект;
+ ДокументСсылка = ОбъектИСсылкаПоФорме.Ссылка;
+
+ Если ПроверкаКонтрагентовКлиентСервер.ЭтоСчетФактура(Форма) Тогда
+
+ Описание = ОписаниеКонтрагентовВСчетеФактуре(ТипЗнч(ДокументСсылка));
+ Для каждого СтрокаОписания Из Описание Цикл
+
+ ИмяРеквизитаКонтрагента = СтрокаОписания.ИмяРеквизита;
+ Контрагент = ДокументОбъект[ИмяРеквизитаКонтрагента];
+
+ Если ЗначениеЗаполнено(Контрагент) Тогда
+ Отбор = Новый Структура("Контрагент", Контрагент);
+ ИтоговоеСостояние = ИтоговоеСостояниеКонтрагентаВДокументе(ДанныеКонтрагентов, Отбор);
+ Форма.РеквизитыПроверкиКонтрагентов[СтрокаОписания.ИмяРеквизитаССостоянием] = ИтоговоеСостояние.СостояниеКонтрагента;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ЗаполнитьДанныеКонтрагентовВСчетеФактуре(ДокументОбъект, ДанныеКонтрагентов, Форма = Неопределено)
+
+ Если ДокументОбъект = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+
+ ДокументСсылка = ДокументОбъект.Ссылка;
+ Дата = ДатаВСчетеФактуре(ДокументОбъект);
+
+ Описание = ОписаниеКонтрагентовВСчетеФактуре(ТипЗнч(ДокументСсылка));
+ Для каждого СтрокаОписания Из Описание Цикл
+
+ ИмяРеквизитаКонтрагента = СтрокаОписания.ИмяРеквизита;
+ Контрагент = ДокументОбъект[ИмяРеквизитаКонтрагента];
+
+ Если ЗначениеЗаполнено(Контрагент) Тогда
+
+ ДополнитьДанныеКонтрагентовВДокументе(
+ ДокументСсылка,
+ ДанныеКонтрагентов,
+ Контрагент,
+ Дата);
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Функция ИтоговоеСостояниеКонтрагентаВДокументе(ДанныеКонтрагентов, Отбор = Неопределено)
+
+ // Инициализируем
+ СостояниеКонтрагента = ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.ПустаяСсылка");
+
+ ЕстьНепустойКонтрагент = Ложь;
+ КонтрагентовНесколько = Ложь;
+
+ Если Отбор = Неопределено Тогда
+ ДанныеПоКонтрагентам = ДанныеКонтрагентов.Скопировать();
+ Иначе
+ ДанныеПоКонтрагентам = ДанныеКонтрагентов.Скопировать(Отбор);
+ КонецЕсли;
+
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда
+ ДанныеПоКонтрагентам.Свернуть("Ссылка, Контрагент, ИНН, КПП, Дата, ОбластьДанныхВспомогательныеДанные, Состояние");
+ Иначе
+ ДанныеПоКонтрагентам.Свернуть("Ссылка, Контрагент, ИНН, КПП, Дата, Состояние");
+ КонецЕсли;
+
+ Если ДанныеПоКонтрагентам.Количество() = 1 Тогда
+
+ ДанныеПоКонтрагенту = ДанныеПоКонтрагентам[0];
+ ЕстьНепустойКонтрагент = ЗначениеЗаполнено(ДанныеПоКонтрагенту.Контрагент);
+ СостояниеКонтрагента = ДанныеПоКонтрагенту.Состояние;
+ КонтрагентовНесколько = Ложь;
+
+ Иначе
+
+ // Прорисовываем результат проверки в счет-фактуре.
+ ЕстьНедействующиеКонтрагенты = Ложь;
+ ЕстьДействующиеКонтрагенты = Ложь;
+ ЕстьКонтрагентыСОшибками = Ложь;
+ ЕстьКонтрагентыНеПодлежащиеПроверке = Ложь;
+ ЕстьКонтрагентыСПустымИННКПП = Ложь;
+
+ Для каждого ДанныеПоКонтрагенту Из ДанныеПоКонтрагентам Цикл
+
+ // Заполненность контрагента
+ Если ЗначениеЗаполнено(ДанныеПоКонтрагенту.Контрагент) Тогда
+ ЕстьНепустойКонтрагент = Истина;
+ КонецЕсли;
+
+ // Состояние существования
+ Если ПроверкаКонтрагентовКлиентСерверПовтИсп.ЭтоСостояниеНедействующегоКонтрагента(ДанныеПоКонтрагенту.Состояние) Тогда
+ ЕстьНедействующиеКонтрагенты = Истина;
+ КонецЕсли;
+
+ Если ПроверкаКонтрагентовКлиентСерверПовтИсп.ЭтоСостояниеДействующегоКонтрагента(ДанныеПоКонтрагенту.Состояние)
+ И ДанныеПоКонтрагенту.Состояние <> ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.СодержитОшибкиВДанных")
+ И ДанныеПоКонтрагенту.Состояние <> ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.ПустаяСсылка")
+ И ДанныеПоКонтрагенту.Состояние <> ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.НеПодлежитПроверке") Тогда
+ ЕстьДействующиеКонтрагенты = Истина;
+ КонецЕсли;
+
+ Если ДанныеПоКонтрагенту.Состояние = ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.СодержитОшибкиВДанных") Тогда
+ ЕстьКонтрагентыСОшибками = Истина;
+ КонецЕсли;
+
+ Если ДанныеПоКонтрагенту.Состояние = ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.НеПодлежитПроверке") Тогда
+ ЕстьКонтрагентыНеПодлежащиеПроверке = Истина;
+ КонецЕсли;
+
+ Если ДанныеПоКонтрагенту.Состояние = ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.ПустойИННКПП") Тогда
+ ЕстьКонтрагентыСПустымИННКПП = Истина;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Если ЕстьНепустойКонтрагент Тогда
+ КонтрагентовНесколько = Истина;
+ КонецЕсли;
+
+ Если НЕ ЕстьНедействующиеКонтрагенты И НЕ ЕстьДействующиеКонтрагенты И НЕ ЕстьКонтрагентыСОшибками Тогда
+ // Контрагент не проверен
+ СостояниеКонтрагента = ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.ПустаяСсылка");
+ ИначеЕсли ЕстьНедействующиеКонтрагенты Тогда
+ СостояниеКонтрагента = ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.ОтсутствуетВРеестре");
+ ИначеЕсли ЕстьКонтрагентыСОшибками Тогда
+ СостояниеКонтрагента = ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.СодержитОшибкиВДанных");
+ ИначеЕсли ЕстьКонтрагентыНеПодлежащиеПроверке Тогда
+ СостояниеКонтрагента = ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.НеПодлежитПроверке");
+ ИначеЕсли ЕстьКонтрагентыСПустымИННКПП Тогда
+ СостояниеКонтрагента = ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.ПустойИННКПП");
+ Иначе
+ СостояниеКонтрагента = ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.Действует");
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Результат = Новый Структура;
+ Результат.Вставить("КонтрагентЗаполнен", ЕстьНепустойКонтрагент);
+ Результат.Вставить("СостояниеКонтрагента", СостояниеКонтрагента);
+ Результат.Вставить("КонтрагентовНесколько", КонтрагентовНесколько);
+
+ Возврат Результат;
+
+КонецФункции
+
+Функция ДатаВСчетеФактуре(СчетФактураОбъект)
+
+ Дата = Дата(1,1,1);
+ ПроверкаКонтрагентовПереопределяемый.ОпределитьДатуВСчетеФактуре(СчетФактураОбъект, Дата);
+
+ Возврат Дата;
+
+КонецФункции
+
+Функция ИмяРеквизитаСостоянияКонтрагентаВСчетеФактуре(ИмяРеквизитаКонтрагента)
+
+ Возврат "Состояние" + ИмяРеквизитаКонтрагента;
+
+КонецФункции
+
+// Функция - Определяет, заполнен ли хотя бы один контрагент в счете-фактуре.
+//
+// Параметры:
+// СчетФактураОбъект - ДанныеФормыСтруктура - счет-фактура, для которой необходимо определить заполненность
+// контрагентов.
+// Возвращаемое значение:
+// Булево - Истина, если заполнен хотя бы один контрагент.
+Функция ВСчетеФактуреЗаполненХотяБыОдинКонтрагент(СчетФактураОбъект)
+
+ Если СчетФактураОбъект = Неопределено Тогда
+ ЗаполненХотяБыОдинКонтрагент = Истина;
+ Иначе
+ СчетФактураСсылка = СчетФактураОбъект.Ссылка;
+
+ Описание = ОписаниеКонтрагентовВСчетеФактуре(ТипЗнч(СчетФактураСсылка));
+
+ ЗаполненХотяБыОдинКонтрагент = Ложь;
+ Для каждого СтрокаОписания Из Описание Цикл
+
+ ИмяРеквизитаКонтрагента = СтрокаОписания.ИмяРеквизита;
+ Контрагент = СчетФактураОбъект[ИмяРеквизитаКонтрагента];
+
+ Если ЗначениеЗаполнено(Контрагент) Тогда
+ ЗаполненХотяБыОдинКонтрагент = Истина;
+ Прервать;
+ КонецЕсли;
+ КонецЦикла;
+
+ КонецЕсли;
+
+ Возврат ЗаполненХотяБыОдинКонтрагент;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область ПроверкаКонтрагентовВСправочнике
+
+Процедура УстановитьУсловноеОформлениеСпискаКонтрагентов(Список)
+
+ СтандартнаяОбработка = Истина;
+ ПроверкаКонтрагентовПереопределяемый.УстановитьУсловноеОформлениеСпискаКонтрагентов(Список, СтандартнаяОбработка);
+
+ // Если действия переопределили, то стандартную обработку не выполняем.
+ Если НЕ СтандартнаяОбработка Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЦветаРезультатовПроверки = ПроверкаКонтрагентовВызовСервераПовтИсп.ЦветаРезультатовПроверки();
+
+ // Условное оформление
+ НовоеУсловноеОформление = Список.УсловноеОформление.Элементы.Добавить();
+
+ // ПроверкаКонтрагентовКонтрагентНеСуществует Равно "Истина"
+ Отбор = НовоеУсловноеОформление.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
+ Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
+ Отбор.Использование = Истина;
+ Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПроверкаКонтрагентовКонтрагентНеСуществует");
+ Отбор.ПравоеЗначение = Истина;
+
+ // ПроверкаКонтрагентовСостояние Не равно "Перечисление.СостоянияСуществованияКонтрагента.ПрекратилДеятельность".
+ Отбор = НовоеУсловноеОформление.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
+ Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
+ Отбор.Использование = Истина;
+ Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПроверкаКонтрагентовСостояние");
+ Отбор.ПравоеЗначение = Перечисления.СостоянияСуществованияКонтрагента.ПрекратилДеятельность;
+
+ // Красные ИНН и КПП
+ Оформление = НовоеУсловноеОформление.Оформление.Элементы.Найти("ЦветТекста");
+ Оформление.Значение = ЦветаРезультатовПроверки.ЦветТекстаНекорректногоКонтрагента;
+ Оформление.Использование = Истина;
+
+ СвойстваСправочникаКонтрагенты = ПроверкаКонтрагентовКлиентСервер.СвойстваСправочникаКонтрагенты();
+ // ИНН
+ ОформляемоеПоле = НовоеУсловноеОформление.Поля.Элементы.Добавить();
+ ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(СвойстваСправочникаКонтрагенты.ИНН);
+ ОформляемоеПоле.Использование = Истина;
+
+ // КПП
+ ОформляемоеПоле = НовоеУсловноеОформление.Поля.Элементы.Добавить();
+ ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(СвойстваСправочникаКонтрагенты.КПП);
+ ОформляемоеПоле.Использование = Истина;
+
+ НовоеУсловноеОформление = Список.УсловноеОформление.Элементы.Добавить();
+
+ // ПроверкаКонтрагентовКонтрагентНеСуществует Равно "Истина"
+ Отбор = НовоеУсловноеОформление.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
+ Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
+ Отбор.Использование = Истина;
+ Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПроверкаКонтрагентовКонтрагентНеСуществует");
+ Отбор.ПравоеЗначение = Истина;
+
+ // ПроверкаКонтрагентовСостояние Равно "Перечисление.СостоянияСуществованияКонтрагента.ПрекратилДеятельность"
+ Отбор = НовоеУсловноеОформление.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
+ Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
+ Отбор.Использование = Истина;
+ Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПроверкаКонтрагентовСостояние");
+ Отбор.ПравоеЗначение = Перечисления.СостоянияСуществованияКонтрагента.ПрекратилДеятельность;
+
+ // Серым вся строка
+ Оформление = НовоеУсловноеОформление.Оформление.Элементы.Найти("ЦветТекста");
+ Оформление.Значение = ЦветаРезультатовПроверки.ЦветТекстаКонтрагентаПрекратившегоДеятельность;
+ Оформление.Использование = Истина;
+
+КонецПроцедуры
+
+// Проверка нескольких контрагентов.
+Процедура СохранитьРезультатыПроверкиСправочника(ДанныеКонтрагентов, АдресХранилища = Неопределено, СохранятьРезультатСразуПослеПроверки = Ложь)
+
+ Если ДанныеКонтрагентов.Количество() = 1 Тогда
+
+ ДанныеКонтрагента = ДанныеКонтрагентов[0];
+
+ // Сохраняем во временное хранилище.
+ Если ЗначениеЗаполнено(АдресХранилища) Тогда
+ ПоместитьВоВременноеХранилище(ДанныеКонтрагента.Состояние, АдресХранилища);
+ КонецЕсли;
+
+ // Сохраняем в регистр
+ Если ЗначениеЗаполнено(ДанныеКонтрагента.Контрагент)
+ И (НЕ ЗначениеЗаполнено(АдресХранилища) ИЛИ СохранятьРезультатСразуПослеПроверки) Тогда
+
+ СохранитьРезультатыПроверкиКонтрагентовВРегистр(ДанныеКонтрагентов);
+
+ КонецЕсли;
+
+ Иначе
+
+ СохранитьРезультатыПроверкиКонтрагентовВРегистр(ДанныеКонтрагентов);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ПроверкаКонтрагентовВОтчетах
+
+Функция ЭтоОтчетПоНекорректнымКонтрагентам(СтруктураПараметров)
+
+ Если НЕ СтруктураПараметров.Свойство("ДанныеДляПроверкиКонтрагентов") Тогда
+ // Проверка контрагентов отключена.
+ Возврат Ложь;
+ КонецЕсли;
+
+ ДанныеДляПроверкиКонтрагентов = СтруктураПараметров.ДанныеДляПроверкиКонтрагентов;
+ ПроверкаКонтрагентовИспользуется = ДанныеДляПроверкиКонтрагентов.ПроверкаКонтрагентовИспользуется;
+
+ Если НЕ ПроверкаКонтрагентовИспользуется Тогда
+ // Проверка контрагентов отключена.
+ Возврат Ложь;
+ КонецЕсли;
+
+ // Есть два режима формирования отчета:
+ // Выводить все строки или только с некорректными контрагентами.
+ ВыводитьТолькоНекорректныхКонтрагентов = ДанныеДляПроверкиКонтрагентов.ВыводитьТолькоНекорректныхКонтрагентов;
+
+ Если НЕ ВыводитьТолькоНекорректныхКонтрагентов Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ Возврат Истина;
+
+КонецФункции
+
+Процедура ВыделитьКонтрагентовСОшибкамиВОтчете(НедействующиеКонтрагенты, ТабличныйДокумент) Экспорт
+
+ // Подкрашиваем контрагентов с ошибками.
+ Для каждого СтрокаСНедействующимКонтрагентом Из НедействующиеКонтрагенты Цикл
+
+ ПроверкаКонтрагентовПереопределяемый.ВыделитьКонтрагентаСОшибкойВСтрокеОтчета(ТабличныйДокумент,
+ СтрокаСНедействующимКонтрагентом.СтрокаТабличногоДокумента);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
+
diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентов/ПроверкаКонтрагентов.mdo b/SSL/src/CommonModules/ПроверкаКонтрагентов/ПроверкаКонтрагентов.mdo
new file mode 100644
index 000000000..bcf383f88
--- /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..08737231d
--- /dev/null
+++ b/SSL/src/CommonModules/ПроверкаКонтрагентовВызовСервера/Module.bsl
@@ -0,0 +1,241 @@
+////////////////////////////////////////////////////////////////////////////////
+// Проверка одного или нескольких контрагентов при помощи веб-сервиса ФНС.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#Область ПрограммныйИнтерфейс
+
+// Процедура - Запуск фонового задания по проверке контрагента в карточке контрагента.
+// Запускается при редактировании реквизитов внутри карточки контрагента.
+//
+// Параметры:
+// ПараметрыЗапуска - Структура - Параметры запуска фонового задания. Ключи:
+// "Контрагент"
+// "ИНН"
+// "КПП"
+// "СохранятьРезультатСразуПослеПроверки"
+// "АдресХранилища"
+Процедура ПроверитьКонтрагентаПриИзменении(ПараметрыЗапуска) Экспорт
+
+ Попытка
+
+ Параметры = Новый Массив;
+ Параметры.Добавить(ПараметрыЗапуска);
+
+ ФоновыеЗадания.Выполнить("ПроверкаКонтрагентов.ПроверитьКонтрагентаФоновоеЗадание",
+ Параметры, ПараметрыЗапуска.ИНН + " " + ПараметрыЗапуска.КПП, НСтр("ru = 'Проверка контрагента'"));
+
+ Исключение
+
+ // Исключение возникнет в случае запуска фонового задания с таким же ключем.
+ // Специальной обработки не требуется.
+ КодОсновногоЯзыка = ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(); // Для записи события в журнал регистрации.
+
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Проверка контрагентов.Проверка контрагента в фоновом задании'", КодОсновногоЯзыка),
+ УровеньЖурналаРегистрации.Ошибка,,,ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
+
+ КонецПопытки;
+
+КонецПроцедуры
+
+// Функция - Определяет, завершилось ли фоновое задание.
+//
+// Параметры:
+// ИдентификаторЗадания - УникальныйИдентификатор - Идентификатор фонового задания по проверке контрагента.
+// Возвращаемое значение:
+// Булево - Истина, если фоновое задание завершилось.
+//
+Функция ЗаданиеВыполнено(ИдентификаторЗадания) Экспорт
+
+ Возврат ДлительныеОперации.ЗаданиеВыполнено(ИдентификаторЗадания);
+
+КонецФункции
+
+#Область ОпределениеСостоянияКонтрагента
+
+// Функция - На основе результата предыдущей проверки (записи в регистр) определяет,
+// существует ли контрагент.
+//
+// Параметры:
+// КонтрагентСсылка - СправочникСсылка.<Контрагенты> - Проверяемый контрагент.
+// ИНН - Строка - ИНН контрагента.
+// КПП - Строка - КПП контрагента.
+// Возвращаемое значение:
+// Булево - Истина, если контрагент существует.
+//
+Функция КонтрагентСуществует(КонтрагентСсылка, ИНН, КПП) Экспорт
+
+ КонтрагентСуществует = Истина;
+
+ // Определяем, включен ли сервис.
+ ИспользованиеПроверкиВозможно = ИспользованиеПроверкиВозможно();
+ Если ИспользованиеПроверкиВозможно Тогда
+
+ // Получаем состояние контрагента из регистра сведений.
+ Состояние = ТекущееСохраненноеСостояниеКонтрагента(КонтрагентСсылка, ИНН, КПП);
+
+ // По состоянию определяем, существует ли контрагент или нет.
+ КонтрагентСуществует = ПроверкаКонтрагентовКлиентСерверПовтИсп.ЭтоСостояниеДействующегоКонтрагента(Состояние);
+
+ Иначе
+ КонтрагентСуществует = Истина;
+ КонецЕсли;
+
+ Возврат КонтрагентСуществует;
+
+КонецФункции
+
+// Функция - Получает состояние контрагента из регистра сведений.
+//
+// Параметры:
+// КонтрагентСсылка - СправочникСсылка.<Контрагенты> - Проверяемый контрагент.
+// ИНН - Строка - ИНН контрагента.
+// КПП - Строка - КПП контрагента.
+// Возвращаемое значение:
+// ПеречислениеСсылка.СостоянияСуществованияКонтрагента - Состояние контрагента.
+//
+Функция ТекущееСохраненноеСостояниеКонтрагента(КонтрагентСсылка, ИНН, КПП) Экспорт
+
+ Если ЗначениеЗаполнено(КонтрагентСсылка) Тогда
+
+ Запрос = Новый Запрос;
+ Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
+ | СостоянияКонтрагентов.Состояние
+ |ИЗ
+ | РегистрСведений.СостоянияКонтрагентов КАК СостоянияКонтрагентов
+ |ГДЕ
+ | СостоянияКонтрагентов.Контрагент = &Контрагент
+ | И СостоянияКонтрагентов.ИНН = &ИНН
+ | И СостоянияКонтрагентов.КПП = &КПП";
+
+ Запрос.УстановитьПараметр("ИНН", ИНН);
+ Запрос.УстановитьПараметр("КПП", КПП);
+ Запрос.УстановитьПараметр("Контрагент", КонтрагентСсылка);
+
+ РезультатЗапроса = Запрос.Выполнить().Выбрать();
+
+ // Определяем состояние из регистра.
+ Пока РезультатЗапроса.Следующий() Цикл
+ Состояние = РезультатЗапроса.Состояние;
+ КонецЦикла;
+
+ КонецЕсли;
+
+ Возврат Состояние;
+
+КонецФункции
+
+// Функция - Определяет, завершилось ли фоновое задание по проверке контрагента в карточке контрагента.
+//
+// Параметры:
+// ИдентификаторЗадания - УникальныйИдентификатор - Идентификатор фонового задания по проверке контрагента.
+// Возвращаемое значение:
+// Булево - Истина, если фоновое задание завершилось.
+//
+Функция ПроверкаКонтрагентовЗавершилась(ИдентификаторЗадания) Экспорт
+
+ Если ЗначениеЗаполнено(ИдентификаторЗадания) Тогда
+
+ ФоновоеЗаданиеСуществует = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания) <> Неопределено;
+ Если ФоновоеЗаданиеСуществует Тогда
+ Возврат ДлительныеОперации.ЗаданиеВыполнено(ИдентификаторЗадания);
+ Иначе
+ Возврат Истина;
+ КонецЕсли;
+
+ Иначе
+ Возврат Истина;
+ КонецЕсли;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область НастройкиПроверки
+
+// Процедура - Запоминает, что больше не нужно показывать предложение использовать сервис.
+//
+Процедура ЗапомнитьЧтоБольшеНеНужноПоказыватьПредложениеИспользоватьСервис() Экспорт
+
+ ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ПроверкаКонтрагентов", "ПроверкаКонтрагентов_БольшеНеПоказыватьПредложениеИспользоватьСервис", Истина);
+
+КонецПроцедуры
+
+// Функция - Проверяет, что проверка включена и есть необходимые права.
+// Возвращаемое значение:
+// Булево - Истина, если есть нужные права на проверку и проверка включена.
+//
+Функция ИспользованиеПроверкиВозможно() Экспорт
+
+ Возврат ПроверкаКонтрагентов.ЕстьПравоНаИспользованиеПроверки()
+ И ПроверкаКонтрагентов.ПроверкаКонтрагентовВключена();
+
+КонецФункции
+
+// Процедура - Выполняет действия при включении и отключении проверки.
+//
+// Параметры:
+// ВключитьПроверку - Булево - Истина, если проверку необходимо включить.
+//
+Процедура ПриВключенииВыключенииПроверки(ВключитьПроверку) Экспорт
+
+ ПроверкаКонтрагентов.ВключитьВыключитьПроверкуКонтрагентов(ВключитьПроверку);
+ ПроверкаКонтрагентов.ЗапуститьФоновуюПроверкуКонтрагентовПослеИзмененияНастройкиПриНеобходимости();
+
+КонецПроцедуры
+
+// Функция - Результат проверки параметров доступа к веб-сервису ФНС.
+// Возвращаемое значение:
+// Булево - Доступ к веб-сервису ФНС по проверке контрагентов есть.
+//
+Функция РезультатПроверкиПараметровДоступа() Экспорт
+
+ Если ПроверкаКонтрагентов.ЕстьДоступКВебСервисуФНС() Тогда
+
+ ТекстПредупреждения = НСтр("ru = 'Проверка доступа к веб-сервису успешно пройдена'");
+
+ Иначе
+
+ ПредупреждениеПроОтсутствиеДоступа = Новый ФорматированнаяСтрока(НСтр("ru = 'Доступ к веб-сервису отсутствует'"));
+
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда
+ ПереходКНастройкамПроксиСервера = Новый ФорматированнаяСтрока(
+ НСтр("ru = 'Настроить параметры прокси-сервера'"),,,, "e1cib/command/ОбщаяКоманда.ПереходКНастройкамДоступаКВебСервису");
+ Иначе
+ ПереходКНастройкамПроксиСервера = "";
+ КонецЕсли;
+
+ Возврат Новый ФорматированнаяСтрока(
+ ПредупреждениеПроОтсутствиеДоступа,
+ Символы.ПС,
+ ПереходКНастройкамПроксиСервера);
+
+ КонецЕсли;
+
+ Возврат ТекстПредупреждения;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция РезультатРаботыФоновогоЗаданияПроверкиКонтрагентовВДокументе(Знач РеквизитыПроверкиКонтрагентов) Экспорт
+
+ ЗаданиеВыполнено = ПроверкаКонтрагентовЗавершилась(РеквизитыПроверкиКонтрагентов.ИдентификаторЗадания);
+ ДанныеКонтрагентовИзКэшаСовпадаютСДаннымиФНС = ЗаданиеВыполнено
+ И ПроверкаКонтрагентов.РезультатПроверкиКонтрагентовВДокументеСовпадаетСДаннымиФНС(РеквизитыПроверкиКонтрагентов);
+
+ Результат = Новый Структура();
+ Результат.Вставить("ЗаданиеВыполнено", ЗаданиеВыполнено);
+ Результат.Вставить("ДанныеКонтрагентовИзКэшаСовпадаютСДаннымиФНС", ДанныеКонтрагентовИзКэшаСовпадаютСДаннымиФНС);
+
+ Возврат Результат;
+
+КонецФункции
+
+
+#КонецОбласти
diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентовВызовСервера/ПроверкаКонтрагентовВызовСервера.mdo b/SSL/src/CommonModules/ПроверкаКонтрагентовВызовСервера/ПроверкаКонтрагентовВызовСервера.mdo
new file mode 100644
index 000000000..a5a31c78a
--- /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..ead6162ff
--- /dev/null
+++ b/SSL/src/CommonModules/ПроверкаКонтрагентовВызовСервераПовтИсп/Module.bsl
@@ -0,0 +1,36 @@
+////////////////////////////////////////////////////////////////////////////////
+// Проверка одного или нескольких контрагентов при помощи веб-сервиса ФНС.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#Область ПрограммныйИнтерфейс
+
+// Функция - Определение цветов выделения результатов проверки контрагентов.
+//
+// Возвращаемое значение:
+// Структура - Имена ключей - это названия цветов, которые необходимо определить.
+// Список ключей см ПроверкаКонтрагентовВызовСервераПовтИсп.ЦветаРезультатовПроверки().
+Функция ЦветаРезультатовПроверки() Экспорт
+
+ Цвета = Новый Структура();
+ Цвета.Вставить("ЦветТекстаКонтрагентаПрекратившегоДеятельность",
+ ЦветаСтиля.ЦветТекстаКонтрагентаПрекратившегоДеятельность);// серый
+ Цвета.Вставить("ЦветТекстаНекорректногоКонтрагента",
+ ЦветаСтиля.ЦветТекстаНекорректногоКонтрагента);// красный
+ Цвета.Вставить("ЦветТекстаКонтрагентаДействующего",
+ ЦветаСтиля.ЦветТекстаКонтрагентаДействующего); // зеленый
+ Цвета.Вставить("ЦветФонаДокументаСНекорректнымиКонтрагентамиВСпискеДокументов",
+ ЦветаСтиля.ЦветФонаДокументаСНекорректнымиКонтрагентамиВСпискеДокументов); // розовый
+ Цвета.Вставить("ЦветФонаКорректногоКонтрагентаВДокументе",
+ ЦветаСтиля.ЦветФонаКорректногоКонтрагентаВДокументе); // зеленый
+ Цвета.Вставить("ЦветФонаНекорректногоКонтрагентаВДокументе",
+ ЦветаСтиля.ЦветФонаНекорректногоКонтрагентаВДокументе); // красный
+
+ ПроверкаКонтрагентовПереопределяемый.ОпределитьЦветаРезультатовПроверки(Цвета);
+
+ Возврат Цвета;
+
+КонецФункции
+
+#КонецОбласти
+
diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентовВызовСервераПовтИсп/ПроверкаКонтрагентовВызовСервераПовтИсп.mdo b/SSL/src/CommonModules/ПроверкаКонтрагентовВызовСервераПовтИсп/ПроверкаКонтрагентовВызовСервераПовтИсп.mdo
new file mode 100644
index 000000000..43c832e55
--- /dev/null
+++ b/SSL/src/CommonModules/ПроверкаКонтрагентовВызовСервераПовтИсп/ПроверкаКонтрагентовВызовСервераПовтИсп.mdo
@@ -0,0 +1,11 @@
+
+
+ ПроверкаКонтрагентовВызовСервераПовтИсп
+
+ ru
+ Проверка контрагентов (вызов сервера)
+
+ true
+ true
+ DuringSession
+
diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентовКлиент/Module.bsl b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиент/Module.bsl
new file mode 100644
index 000000000..d725b7a04
--- /dev/null
+++ b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиент/Module.bsl
@@ -0,0 +1,461 @@
+////////////////////////////////////////////////////////////////////////////////
+// Проверка одного или нескольких контрагентов при помощи веб-сервиса ФНС.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#Область ПрограммныйИнтерфейс
+
+#Область Проверка
+
+// Процедура - Отображение формы с предложением включить проверку контрагентов.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма объекта, в котором выполняется проверка контрагентов.
+Процедура ПредложитьВключитьПроверкуКонтрагентов(Форма) Экспорт
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.НужноПоказатьПредложениеВключитьПроверкуКонтрагентов Тогда
+
+ ОткрытьФорму("ОбщаяФорма.ВключениеПроверкиКонтрагентов", , Форма);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Проверка доступа к сервису.
+Процедура ПроверитьДоступКСервису() Экспорт
+
+ ТекстПредупреждения = ПроверкаКонтрагентовВызовСервера.РезультатПроверкиПараметровДоступа();
+ ПоказатьПредупреждение(, ТекстПредупреждения);
+
+КонецПроцедуры
+
+// Процедура - Настройка параметров прокси сервера.
+Процедура НастроитьПараметрыПроксиСервера() Экспорт
+
+ Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда
+ МодульПолучениеФайловИзИнтернетаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиент");
+ МодульПолучениеФайловИзИнтернетаКлиент.ОткрытьФормуПараметровПроксиСервера();
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Функция - Вспомогательный API. Получает состояние контрагента из регистра сведений или из временного хранилища, если
+// передан адрес.
+//
+// Параметры:
+// КонтрагентСсылка - СправочникСсылка.<Контрагенты> - Проверяемый контрагент.
+// ИНН - Строка - ИНН контрагента.
+// КПП - Строка - КПП контрагента.
+// АдресХранилища - Строка - Адрес временного хранилища, в котором может содержаться
+// результат проверки контрагента.
+// Возвращаемое значение:
+// ПеречислениеСсылка.СостоянияСуществованияКонтрагента - Состояние контрагента.
+//
+Функция ТекущееСостояниеКонтрагента(КонтрагентСсылка, ИНН, КПП, АдресХранилища = Неопределено) Экспорт
+
+ Состояние = ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.ПустаяСсылка");
+
+ // 1. Пытаемся получить состояние контрагента из хранилища.
+ Если ЗначениеЗаполнено(АдресХранилища) И ЭтоАдресВременногоХранилища(АдресХранилища) Тогда
+ Состояние = ПолучитьИзВременногоХранилища(АдресХранилища);
+ КонецЕсли;
+
+ // 2. Если в хранилище нет результата, то пытаемся получить состояние из регистра.
+ Если ЗначениеЗаполнено(КонтрагентСсылка) И НЕ ЗначениеЗаполнено(Состояние) Тогда
+ Состояние = ПроверкаКонтрагентовВызовСервера.ТекущееСохраненноеСостояниеКонтрагента(КонтрагентСсылка, ИНН, КПП);
+ КонецЕсли;
+
+ Возврат Состояние;
+
+КонецФункции
+
+// Процедура - Открыть настройки сервиса.
+Процедура ОткрытьНастройкиСервиса() Экспорт
+
+ ОткрытьФорму("ОбщаяФорма.НастройкиПроверкиКонтрагентов");
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ПроверкаКонтрагентовВДокументах
+
+// Процедура - Подключение обработчиков результата проверки контрагентов из формы документа.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+Процедура ПриОткрытииДокумент(Форма) Экспорт
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+ ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(Форма.ПроверкаКонтрагентовПараметрыОбработчикаОжидания);
+ Форма.ПодключитьОбработчикОжидания("Подключаемый_ОбработатьРезультатПроверкиКонтрагентов", ИнтервалОбработкиРезультата(), Истина);
+ Иначе
+ Если Форма.РеквизитыПроверкиКонтрагентов.НужноПоказатьПредложениеВключитьПроверкуКонтрагентов Тогда
+ Форма.ПодключитьОбработчикОжидания("Подключаемый_ПоказатьПредложениеИспользоватьПроверкуКонтрагентов", ИнтервалОбработкиРезультата(), Истина);
+ КонецЕсли;
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Отображение предупреждения о причине выделения контрагента в строке таблице как некорректного.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+// Элемент - ТаблицаФормы - Таблица, в которой выполнили двойное нажатие на значке с информацией о наличии
+// некорректного контрагента.
+// Поле - ПолеФормы - Колонка, в которой выполнили двойное нажатие на значке с информацией о наличии некорректного
+// контрагента.
+Процедура ТаблицаФормыВыбор(Форма, Элемент, Поле) Экспорт
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+
+ ТекущиеДанные = Элемент.ТекущиеДанные;
+ Если ТекущиеДанные <> Неопределено Тогда
+ Если Поле.Имя = ПроверкаКонтрагентовКлиентСервер.ИмяПоляКартинки(Элемент) Тогда
+ Если ПроверкаКонтрагентовКлиентСерверПовтИсп.ЭтоСостояниеНедействующегоКонтрагента(ТекущиеДанные.Состояние, Истина) Тогда
+
+ Описание = Новый Структура;
+ Описание.Вставить("ДокументПустой", Ложь);
+ Описание.Вставить("КонтрагентЗаполнен", Истина);
+ Описание.Вставить("СостояниеКонтрагента", ТекущиеДанные.Состояние);
+ Описание.Вставить("КонтрагентовНесколько", Ложь);
+
+ СостояниеПроверки = ПредопределенноеЗначение("Перечисление.СостоянияПроверкиКонтрагентов.ПроверкаВыполнена");
+
+ ПодсказкаВДокументе = ПроверкаКонтрагентовКлиентСервер.ПодсказкаВДокументе(Описание, СостояниеПроверки);
+ ПоказатьПредупреждение(,ПодсказкаВДокументе.Текст, , НСтр("ru = 'Проверка контрагентов'"));
+ КонецЕсли;
+
+ КонецЕсли;
+ КонецЕсли;
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Функция - Определяет, требует ли событие, вызванное оповещением, запуска проверки контрагентов.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+// ИмяСобытия - Строка - Имя события обработки оповещения.
+// Параметр - Произвольный - Параметр обработки оповещения.
+// Источник - Произвольный - Источник обработки оповещения.
+// Возвращаемое значение:
+// Булево - требует ли событие, вызванное оповещением, запуска проверки контрагентов.
+Функция СобытиеТребуетПроверкиКонтрагента(Форма, ИмяСобытия, Параметр, Источник) Экспорт
+
+ ТребуетсяПроверкаКонтрагентов = Ложь;
+
+ ПроверкаКонтрагентовКлиентПереопределяемый.ОпределитьНеобходимостьПроверкиКонтрагентовВОбработкеОповещения(
+ Форма, ИмяСобытия, Параметр, Источник, ТребуетсяПроверкаКонтрагентов);
+
+ Возврат ТребуетсяПроверкаКонтрагентов;
+
+КонецФункции
+
+// Процедура - Запуск проверки контрагентов в документе после возникновения определенного события.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+// ДополнительныеПараметры - Дата - Дата документа, в случае если произошло изменение даты.
+// - ТаблицаФормы - Если изменения произошли в табличной части.
+// - ПолеФормы - Если изменился контрагент в определенном поле произошли в табличной части.
+Процедура ЗапуститьПроверкуКонтрагентовВДокументе(Форма, ДополнительныеПараметры = Неопределено) Экспорт
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+
+ ПараметрыФоновогоЗадания = ПроверкаКонтрагентовКлиентСервер.ПараметрыФоновогоЗадания(ДополнительныеПараметры);
+ Форма.ПроверитьКонтрагентовФоновоеЗадание(ПараметрыФоновогоЗадания);
+
+ ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(Форма.ПроверкаКонтрагентовПараметрыОбработчикаОжидания);
+
+ Форма.ПодключитьОбработчикОжидания("Подключаемый_ОбработатьРезультатПроверкиКонтрагентов", ИнтервалОбработкиРезультата(), Истина);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Обработка результата работы фонового задания по проверке контрагентов.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+Процедура ОбработатьРезультатПроверкиКонтрагентовВДокументе(Форма) Экспорт
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+
+ // Если в настоящий момент выполняется редактирование табличной части, то результат проверки не прорисовываем,
+ // чтобы не затереть данные, вводимые пользователем.
+ Если НЕ Форма.РеквизитыПроверкиКонтрагентов.ОтложитьПрорисовкуРезультатаПроверкиКонтрагентов Тогда
+
+ Результат = ПроверкаКонтрагентовВызовСервера.РезультатРаботыФоновогоЗаданияПроверкиКонтрагентовВДокументе(Форма.РеквизитыПроверкиКонтрагентов);
+
+ // Если есть незавершившиеся фоновые задания, то продолжаем ждать результат.
+ Если Результат.ЗаданиеВыполнено Тогда
+
+ Форма.ПроверкаКонтрагентовПараметрыОбработчикаОжидания = Неопределено;
+ Если НЕ Результат.ДанныеКонтрагентовИзКэшаСовпадаютСДаннымиФНС Тогда
+
+ // Контекстный серверный вызов
+ Форма.ОтобразитьРезультатПроверкиКонтрагента();
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ ДокументСсылка = ОбъектИСсылкаПоФорме.Ссылка;
+
+ ОповеститьОбИзменении(ДокументСсылка);
+
+ КонецЕсли;
+
+ Иначе
+
+ Если Форма.ПроверкаКонтрагентовПараметрыОбработчикаОжидания <> Неопределено Тогда
+ ДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(Форма.ПроверкаКонтрагентовПараметрыОбработчикаОжидания);
+ Форма.ПодключитьОбработчикОжидания("Подключаемый_ОбработатьРезультатПроверкиКонтрагентов", Форма.ПроверкаКонтрагентовПараметрыОбработчикаОжидания.ТекущийИнтервал, Истина);
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Запускает проверку контрагента из документа, если было определено, что возникло событие,
+// требующее обновления результата проверки контрагентов.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+// ИмяСобытия - Строка - Имя события обработки оповещения.
+// Параметр - Произвольный - Параметр обработки оповещения.
+// Источник - Произвольный - Источник обработки оповещения.
+Процедура ОбработкаОповещения(Форма, ИмяСобытия, Параметр, Источник) Экспорт
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+ Если СобытиеТребуетПроверкиКонтрагента(Форма, ИмяСобытия, Параметр, Источник) Тогда
+
+ ДополнительныеПараметры = Новый Структура();
+ // Добавляем в параметры источник события.
+ ДополнительныеПараметры = ПроверкаКонтрагентовКлиентСервер.ПараметрыФоновогоЗадания(Источник, ДополнительныеПараметры);
+ // Добавляем в параметры признак, что после проверки нужно записать результат в регистр.
+ ДополнительныеПараметры = ПроверкаКонтрагентовКлиентСервер.ПараметрыФоновогоЗадания(Истина, ДополнительныеПараметры);
+
+ ЗапуститьПроверкуКонтрагентовВДокументе(Форма, ДополнительныеПараметры);
+
+ КонецЕсли;
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Взводит флаг, что редактируется табличная часть.
+// Если взведен флаг, то результат проверки контрагента не будет отображен до тех пор,
+// пока не завершится редактирование табличной части.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+//
+Процедура ПриНачалеРедактированияТабличнойЧасти(Форма) Экспорт
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+
+ Форма.РеквизитыПроверкиКонтрагентов.ОтложитьПрорисовкуРезультатаПроверкиКонтрагентов = Истина;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Сбрасывает флаг, что редактируется табличная часть.
+// Если взведен флаг, то результат проверки контрагента не будет отображен до тех пор,
+// пока не завершится редактирование табличной части.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+//
+Процедура ПриОкончанииРедактированияТабличнойЧасти(Форма) Экспорт
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+
+ Форма.РеквизитыПроверкиКонтрагентов.ОтложитьПрорисовкуРезультатаПроверкиКонтрагентов = Ложь;
+
+ Если Форма.ПроверкаКонтрагентовПараметрыОбработчикаОжидания <> Неопределено Тогда
+ ОбработатьРезультатПроверкиКонтрагентовВДокументе(Форма);
+ КонецЕсли;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ПроверкаКонтрагентовВОтчетах
+
+// Процедура - Подключение обработчика ожидания для отображения предложения на использование проверки.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов.
+Процедура ОтчетПриОткрытии(Форма) Экспорт
+
+ Если НЕ Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется
+ И Форма.РеквизитыПроверкиКонтрагентов.НужноПоказатьПредложениеВключитьПроверкуКонтрагентов Тогда
+ Форма.ПодключитьОбработчикОжидания("Подключаемый_ПоказатьПредложениеИспользоватьПроверкуКонтрагентов", ИнтервалОбработкиРезультата(), Истина);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Сброс актуальности, сброс вида панели проверки контрагентов при изменении отборов отчета.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов.
+Процедура СброситьАктуальностьОтчета(Форма) Экспорт
+
+ ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Форма.Элементы.Результат, "НеАктуальность");
+ ПроверкаКонтрагентовКлиентСервер.УстановитьВидПанелиПроверкиКонтрагентовВОтчете(Форма);
+
+КонецПроцедуры
+
+// Процедура - Запуск проверки контрагентов в отчете после первичного формирования отчета.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов.
+Процедура ЗапуститьПроверкуКонтрагентовВОтчете(Форма) Экспорт
+
+ Форма.РеквизитыПроверкиКонтрагентов.ПроверкаВыполнялась = Ложь;
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется И Форма.ПроверкаКонтрагентовНедействующиеКонтрагенты.Количество() > 0 Тогда
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ЕстьДоступКВебСервисуФНС Тогда
+ Форма.ОтключитьОбработчикОжидания("Подключаемый_ОбработатьРезультатПроверкиКонтрагентов");
+ ПроверкаКонтрагентовКлиентСервер.УстановитьВидПанелиПроверкиКонтрагентовВОтчете(Форма, "ПроверкаВПроцессеВыполнения");
+
+ Форма.ПроверитьКонтрагентов();
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ЗаданиеВыполнено Тогда
+ Форма.ОтобразитьРезультатПроверкиКонтрагента();
+ Форма.РеквизитыПроверкиКонтрагентов.ИдентификаторЗадания = Неопределено;
+ Иначе
+ // Результата еще нет, но есть шансы дождаться.
+ ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(Форма.ПроверкаКонтрагентовПараметрыОбработчикаОжидания);
+ Форма.ПодключитьОбработчикОжидания("Подключаемый_ОбработатьРезультатПроверкиКонтрагентов", ИнтервалОбработкиРезультата(), Истина);
+ КонецЕсли;
+ Иначе
+ ПроверкаКонтрагентовКлиентСервер.ВывестиНужнуюПанельПроверкиКонтрагентовВОтчете(Форма);
+ КонецЕсли;
+ Иначе
+ ПроверкаКонтрагентовКлиентСервер.ВывестиНужнуюПанельПроверкиКонтрагентовВОтчете(Форма);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Обработка результата проверки контрагентов в отчете.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+Процедура ОбработатьРезультатПроверкиКонтрагентовВОтчете(Форма) Экспорт
+
+ Попытка
+ Если ПроверкаКонтрагентовВызовСервера.ЗаданиеВыполнено(Форма.РеквизитыПроверкиКонтрагентов.ИдентификаторЗадания) Тогда
+ Форма.ОтобразитьРезультатПроверкиКонтрагента();
+ Форма.РеквизитыПроверкиКонтрагентов.ИдентификаторЗадания = Неопределено;
+ Иначе
+ ДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(Форма.ПроверкаКонтрагентовПараметрыОбработчикаОжидания);
+ Форма.ПодключитьОбработчикОжидания("Подключаемый_ОбработатьРезультатПроверкиКонтрагентов",
+ Форма.ПроверкаКонтрагентовПараметрыОбработчикаОжидания.ТекущийИнтервал, Истина);
+ КонецЕсли;
+ Исключение
+ ВызватьИсключение;
+ КонецПопытки;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ПроверкаКонтрагентовВСправочнике
+
+// Процедура - Подключение обработчиков результата проверки контрагента из карточки контрагента.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Карточка контрагента.
+Процедура ПриОткрытииКонтрагент(Форма) Экспорт
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.НужноПоказатьПредложениеВключитьПроверкуКонтрагентов Тогда
+ Форма.ПодключитьОбработчикОжидания("Подключаемый_ПоказатьПредложениеИспользоватьПроверкуКонтрагентов", ИнтервалОбработкиРезультата(), Истина);
+ КонецЕсли;
+
+ // Если состояние контрагента не известно, то пытаемся его определить.
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+ Если Форма.РеквизитыПроверкиКонтрагентов.ФоновоеЗаданиеЗапущено Тогда
+ Форма.РеквизитыПроверкиКонтрагентов.ИнтервалПроверкиРезультата = 1;
+ Форма.ПодключитьОбработчикОжидания("Подключаемый_ОбработатьРезультатПроверкиКонтрагентов", Форма.РеквизитыПроверкиКонтрагентов.ИнтервалПроверкиРезультата, Истина);
+ Иначе
+ ПроверкаКонтрагентовКлиентСервер.ОтобразитьРезультатПроверкиКонтрагентаВСправочнике(Форма);
+ КонецЕсли;
+ КонецЕсли
+
+КонецПроцедуры
+
+// Процедура - Запуск проверки из карточки контрагента.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Карточка контрагента.
+Процедура ЗапуститьПроверкуКонтрагентаВСправочнике(Форма) Экспорт
+
+ // Если ИНН или КПП некорректные, или проверка не включена, то не запускаем проверку.
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+
+ ПроверкаКонтрагентовКлиентСервер.ПроверитьКонтрагентаИзКарточки(Форма);
+
+ // Прерываем предыдущую проверку.
+ Форма.РеквизитыПроверкиКонтрагентов.ИнтервалПроверкиРезультата = 1;
+ Форма.ПодключитьОбработчикОжидания("Подключаемый_ОбработатьРезультатПроверкиКонтрагентов", Форма.РеквизитыПроверкиКонтрагентов.ИнтервалПроверкиРезультата, Истина);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Процедура - Обработка результата фонового задания по проверке контрагента из карточки контрагента.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Карточка контрагента.
+Процедура ОбработатьРезультатПроверкиКонтрагентовВСправочнике(Форма) Экспорт
+
+ СвойстваСправочника = ПроверкаКонтрагентовКлиентСервер.СвойстваСправочникаКонтрагенты();
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ПроверкаКонтрагентовКлиентСервер.ОбъектИСсылкаПоФорме(Форма);
+ КонтрагентОбъект = ОбъектИСсылкаПоФорме.Объект;
+ КонтрагентСсылка = ОбъектИСсылкаПоФорме.Ссылка;
+
+ ИНН = КонтрагентОбъект[СвойстваСправочника.ИНН];
+ КПП = КонтрагентОбъект[СвойстваСправочника.КПП];
+
+ Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагента =
+ ТекущееСостояниеКонтрагента(КонтрагентСсылка, ИНН, КПП, Форма.РеквизитыПроверкиКонтрагентов.АдресХранилища);
+
+ // Проверяем готовность результата фонового задания.
+ Если НЕ ЗначениеЗаполнено(Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагента) Тогда
+ ПроверкаКонтрагентовКлиентСервер.ОтобразитьРезультатПроверкиКонтрагентаВСправочнике(Форма);
+ // Проверяем результат через 1,3 и 9 сек.
+ Если Форма.РеквизитыПроверкиКонтрагентов.ИнтервалПроверкиРезультата < 9 Тогда
+ Форма.РеквизитыПроверкиКонтрагентов.ИнтервалПроверкиРезультата = Форма.РеквизитыПроверкиКонтрагентов.ИнтервалПроверкиРезультата * 3;
+ Форма.ПодключитьОбработчикОжидания("Подключаемый_ОбработатьРезультатПроверкиКонтрагентов", Форма.РеквизитыПроверкиКонтрагентов.ИнтервалПроверкиРезультата, Истина);
+ Возврат;
+ КонецЕсли;
+ Иначе
+ // Результат получен
+ Форма.РеквизитыПроверкиКонтрагентов.ФоновоеЗаданиеЗапущено = Ложь;
+ ПроверкаКонтрагентовКлиентСервер.ОтобразитьРезультатПроверкиКонтрагентаВСправочнике(Форма);
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ИнтервалОбработкиРезультата()
+
+ Возврат 0.1;
+
+КонецФункции
+
+#КонецОбласти
\ No newline at end of file
diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентовКлиент/ПроверкаКонтрагентовКлиент.mdo b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиент/ПроверкаКонтрагентовКлиент.mdo
new file mode 100644
index 000000000..f3ad54f2c
--- /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..cb14a712a
--- /dev/null
+++ b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентПереопределяемый/Module.bsl
@@ -0,0 +1,25 @@
+////////////////////////////////////////////////////////////////////////////////
+// Проверка одного или нескольких контрагентов при помощи веб-сервиса ФНС.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+
+#Область ПрограммныйИнтерфейс
+
+// Процедура - Определение по имени события обработки оповещения необходимости выполнить запуск проверки контрагентов.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором возникло событие обработки оповещения.
+// ИмяСобытия - Строка - Имя события обработки оповещения.
+// Параметр - Произвольный - Параметр обработки оповещения.
+// Источник - Произвольный - Источник обработки оповещения.
+// ТребуетсяПроверкаКонтрагентов - Булево - Результат определения необходимости выполнять проверку контрагента по
+// наступлению события.
+Процедура ОпределитьНеобходимостьПроверкиКонтрагентовВОбработкеОповещения(
+ Форма, ИмяСобытия, Параметр, Источник, ТребуетсяПроверкаКонтрагентов) Экспорт
+
+
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентПереопределяемый/ПроверкаКонтрагентовКлиентПереопределяемый.mdo b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентПереопределяемый/ПроверкаКонтрагентовКлиентПереопределяемый.mdo
new file mode 100644
index 000000000..136c70cec
--- /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..7621a9c27
--- /dev/null
+++ b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСервер/Module.bsl
@@ -0,0 +1,581 @@
+////////////////////////////////////////////////////////////////////////////////
+// Проверка одного или нескольких контрагентов при помощи веб-сервиса ФНС.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#Область ПрограммныйИнтерфейс
+
+// Процедура - Установить текст подсказки в документе.
+//
+// Параметры:
+// ПараметрыПрорисовки - Структура - Описание см ПроверкаКонтрагентов.ДополнитьОписание.
+// СостояниеПроверки - Перечисления.СостоянияПроверкиКонтрагентов - Указывает, в каком состояние проверка:
+// завершилась, не завершилась, выполняется или отсутствует доступ к веб-сервису.
+//
+Процедура УстановитьТекстПодсказкиВДокументе(ПараметрыПрорисовки, СостояниеПроверки) Экспорт
+
+ // Определение цвета и текста
+ ПодсказкаВДокументе = ПодсказкаВДокументе(ПараметрыПрорисовки, СостояниеПроверки);
+
+ // Цвет рамки
+ Если ПараметрыПрорисовки.ЭлементРодитель <> Неопределено Тогда
+ ЭлементРодитель = ПараметрыПрорисовки.ЭлементРодитель;
+ ЭлементРодитель.ЦветФона = ПодсказкаВДокументе.ЦветФона;
+ КонецЕсли;
+
+ // Текст расширенной подсказки.
+ Элемент = ПараметрыПрорисовки.Элемент;
+ Элемент.РасширеннаяПодсказка.Заголовок = ПодсказкаВДокументе.Текст;
+ Элемент.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка;
+
+КонецПроцедуры
+
+// Процедура - Вывод панели проверки в отчете.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма отчета, для которого выводится результат проверки контрагента.
+// ВидПанелиПроверки - Строка - Текущее состояние проверки, соответствующее виду панели,
+// может принимать одно из следующих значений:
+// "ВсеКонтрагентыКорректные" - Устанавливает вид панели проверки, для случая,
+// когда все контрагенты корректны.
+// "НайденыНекорректныеКонтрагенты" - Устанавливает вид панели проверки, для случая,
+// когда найдены некорректные контрагенты.
+// "ПроверкаВПроцессеВыполнения" - Устанавливает вид панели проверки, для случая,
+// когда проверка контрагента еще выполняется.
+// "НетДоступаКСервису" - Устанавливает вид панели проверки, для случая,
+// когда доступ к сервису проверки отсутствует.
+// Пустая строка - Панель проверки контрагентов не видна.
+Процедура УстановитьВидПанелиПроверкиКонтрагентовВОтчете(Форма, ВидПанелиПроверки = "") Экспорт
+
+ // Если в отчете не добавлена панель результата проверки контрагентов, то данные действия не требуются.
+ Если Форма.Элементы.Найти("ПроверкаКонтрагента") = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+
+ СтандартнаяОбработка = Истина;
+ Форма.Элементы.ПроверкаКонтрагента.Видимость = Ложь;
+ ПроверкаКонтрагентовКлиентСерверПереопределяемый.УстановитьВидПанелиПроверкиКонтрагентовВОтчете(Форма, СтандартнаяОбработка, ВидПанелиПроверки);
+
+ // Если действия по отображению результата проверки переопределили, то стандартную обработку не выполняем.
+ Если НЕ СтандартнаяОбработка Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+
+ Если ЗначениеЗаполнено(ВидПанелиПроверки) Тогда
+
+ Форма.Элементы.ПроверкаКонтрагента.Видимость = Истина;
+ Форма.Элементы.ПроверкаКонтрагента.ТекущаяСтраница = Форма.Элементы[ВидПанелиПроверки];
+
+ Если ВидПанелиПроверки = "НайденыНекорректныеКонтрагенты" Тогда
+
+ Форма.ПроверкаКонтрагентовПереключательРежимаОтображения = ?(Форма.РеквизитыПроверкиКонтрагентов.ВыведеныВсеСтроки, "Все", "Недействующие");
+
+ КонецЕсли;
+
+ Иначе
+
+ Форма.Элементы.ПроверкаКонтрагента.Видимость = Ложь;
+
+ КонецЕсли;
+
+ Иначе
+ Форма.Элементы.ПроверкаКонтрагента.Видимость = Ложь;
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Функция - Определяет, есть ли у формы документа контрагент в шапке.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+// Возвращаемое значение:
+// Булево - Истина, если это документ с контрагентом в шапке.
+//
+Функция ЭтоДокументСКонтрагентомВШапке(Форма) Экспорт
+
+ Результат = РезультатОпределенияВидаДокумента();
+ ПроверкаКонтрагентовКлиентСерверПереопределяемый.ОпределитьВидДокумента(Форма, Результат);
+
+ Возврат Результат.КонтрагентНаходитсяВШапке;
+
+КонецФункции
+
+// Функция - Определяет, является ли форма документа формой счета-фактуры.
+//
+// Параметры:
+// Источник - Произвольный - Источник обработки оповещения.
+// Возвращаемое значение:
+// Булево - Истина, если источник является счетом-фактурой.
+//
+Функция ЭтоСчетФактура(Источник) Экспорт
+
+ ЯвляетсяСчетомФактурой = Ложь;
+
+ ТипИсточника = ТипЗнч(ТипИсточника);
+
+ Если ТипИсточника = Тип("Строка")
+ ИЛИ ТипИсточника = Тип("Дата")
+ ИЛИ ТипИсточника = Тип("Структура")
+ ИЛИ ТипИсточника = Тип("Булево") Тогда
+
+ ЯвляетсяСчетомФактурой = Ложь;
+
+ Иначе
+
+ Результат = РезультатОпределенияВидаДокумента();
+ ПроверкаКонтрагентовКлиентСерверПереопределяемый.ОпределитьВидДокумента(Источник, Результат);
+ ЯвляетсяСчетомФактурой = Результат.ЯвляетсяСчетомФактурой;
+
+ КонецЕсли;
+
+ Возврат ЯвляетсяСчетомФактурой;
+
+КонецФункции
+
+// Функция - Определяет, есть ли в форме документа счет-фактура в подвале.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+// Возвращаемое значение:
+// Булево - Истина, есть ли в форме документа счет-фактура в подвале есть.
+//
+Функция ЭтоДокументСоСчетомФактуройВПодвале(Форма) Экспорт
+
+ Результат = РезультатОпределенияВидаДокумента();
+ ПроверкаКонтрагентовКлиентСерверПереопределяемый.ОпределитьВидДокумента(Форма, Результат);
+
+ Возврат Результат.СчетФактураНаходитсяВПодвале;
+
+КонецФункции
+
+// Функция - Определяет, есть ли в форме документа табличные части с контрагентами.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+// Возвращаемое значение:
+// Булево - Истина, есть ли в форме документа есть табличные части с контрагентами.
+//
+Функция ЭтоДокументСКонтрагентомВТабличнойЧасти(Форма) Экспорт
+
+ Результат = РезультатОпределенияВидаДокумента();
+ ПроверкаКонтрагентовКлиентСерверПереопределяемый.ОпределитьВидДокумента(Форма, Результат);
+
+ Возврат Результат.КонтрагентНаходитсяВТабличнойЧасти;
+
+КонецФункции
+
+// Функция - Определяет, является ли источник контрагентом.
+//
+// Параметры:
+// Источник - Произвольный - Источник обработки оповещения.
+// Возвращаемое значение:
+// -
+//
+Функция ЭтоКонтрагент(Источник) Экспорт
+
+ Возврат ТипЗнч(Источник) = Тип("СправочникСсылка." + СвойстваСправочникаКонтрагенты().Имя);
+
+КонецФункции
+
+// Функция - Определяет имя колонки с признаком, корректный ли это контрагент.
+//
+// Параметры:
+// ТаблицаФормы - ТаблицаФормы - Таблица формы, в которой располагается колонка с контрагентом.
+// Возвращаемое значение:
+// Строка - Имя колонки с признаком, корректный ли это контрагент.
+//
+Функция ИмяПоляКартинки(ТаблицаФормы) Экспорт
+ Возврат ТаблицаФормы.Имя + "ЭтоНекорректныйКонтрагент";
+КонецФункции
+
+// Функция - Подсказка в документе.
+//
+// Параметры:
+// ПараметрыПрорисовки - Структура - Параметры прорисовки результата проверки контрагента в документе.
+// Ключи: "КонтрагентЗаполнен", "СостояниеКонтрагента", "КонтрагентовНесколько".
+// СостояниеПроверки - Перечисления.СостоянияПроверкиКонтрагентов - Указывает, в каком состояние проверка:
+// завершилась, не завершилась, выполняется или отсутствует доступ к веб-сервису.
+// Возвращаемое значение:
+// Структура - Данные, подготовленные для отображения в форме документа.
+// Определяет цвет и текст надписи о результате проверки.
+// Ключи: "Текст", "ЦветФона".
+//
+Функция ПодсказкаВДокументе(ПараметрыПрорисовки, СостояниеПроверки) Экспорт
+
+ КонтрагентЗаполнен = ПараметрыПрорисовки.КонтрагентЗаполнен;
+ СостояниеКонтрагента = ПараметрыПрорисовки.СостояниеКонтрагента;
+ КонтрагентовНесколько = ПараметрыПрорисовки.КонтрагентовНесколько;
+
+ ЦветФона = Новый Цвет();
+ Подстроки = Новый Массив;
+
+ РекламаСервиса = Новый ФорматированнаяСтрока(НСтр("ru = 'В программе появилась возможность использовать веб-сервис ФНС для проверки регистрации контрагентов в ЕГРН'"));
+
+ Если СостояниеПроверки = ПредопределенноеЗначение("Перечисление.СостоянияПроверкиКонтрагентов.ПроверкаНеИспользуется") Тогда
+ // Выводим предложение на подключение.
+ Подстроки.Добавить(РекламаСервиса);
+ ИначеЕсли СостояниеПроверки = ПредопределенноеЗначение("Перечисление.СостоянияПроверкиКонтрагентов.ПроверкаВПроцессе") Тогда
+ // Проверка не завершилась
+ Подстроки.Добавить(Новый ФорматированнаяСтрока(НСтр("ru = 'Выполняется проверка контрагентов согласно данным ФНС'")));
+
+ ИначеЕсли СостояниеПроверки = ПредопределенноеЗначение("Перечисление.СостоянияПроверкиКонтрагентов.НетДоступаКВебСервису") Тогда
+ // Нет доступа к сервису
+
+ Подстроки.Добавить(Новый ФорматированнаяСтрока(НСтр("ru = 'Не удалось произвести проверку контрагентов:
+ |сервис ФНС временно недоступен'")));
+
+ ИначеЕсли СостояниеПроверки = ПредопределенноеЗначение("Перечисление.СостоянияПроверкиКонтрагентов.ПроверкаВыполнена") Тогда
+ // Проверка завершилась
+
+ Цвета = ПроверкаКонтрагентовВызовСервераПовтИсп.ЦветаРезультатовПроверки();
+
+ ЦветНекорректногоКонтрагента = Цвета.ЦветФонаНекорректногоКонтрагентаВДокументе;
+ ЦветКорректногоКонтрагента = Цвета.ЦветФонаКорректногоКонтрагентаВДокументе;
+
+ Если НЕ КонтрагентЗаполнен Тогда
+ // Не заполнен контрагент
+ Подстроки.Добавить(НСтр("ru = 'Проверка контрагента по базе ФНС не выполнена: не заполнен контрагент'"));
+ ИначеЕсли НЕ ЗначениеЗаполнено(СостояниеКонтрагента) Тогда
+ Подстроки.Добавить(РекламаСервиса);
+ ИначеЕсли СостояниеКонтрагента = ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.НеПодлежитПроверке") Тогда
+ // Иностранный контрагент
+ Подстроки.Добавить(НСтр("ru = 'Проверка контрагента по базе ФНС не выполнена: проверке подлежат только российские контрагенты'"));
+ ИначеЕсли СостояниеКонтрагента = ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.ПустойИННКПП") Тогда
+ // Контрагенты с пустым ИНН и КПП не проверяются.
+ Подстроки.Добавить(НСтр("ru = 'Проверка контрагента по базе ФНС не выполнена: не заполнен ИНН/КПП'"));
+ ИначеЕсли ПроверкаКонтрагентовКлиентСерверПовтИсп.ЭтоСостояниеНедействующегоКонтрагента(СостояниеКонтрагента) Тогда
+ // Недействующий контрагент
+ Если КонтрагентовНесколько Тогда
+ // Выводим обобщенно
+ Подстроки.Добавить(НСтр("ru = 'Обнаружены недействующие контрагенты по данным ФНС'"));
+ Иначе
+ // Выводим конкретное состояние.
+ Подстроки.Добавить(Строка(СостояниеКонтрагента));
+ КонецЕсли;
+ ЦветФона = ЦветНекорректногоКонтрагента;
+ ИначеЕсли СостояниеКонтрагента = ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.СодержитОшибкиВДанных") Тогда
+ // Контрагент с ошибками в ИНН/КПП или дате.
+ Подстроки.Добавить(НСтр("ru = 'Проверка контрагента по базе ФНС не выполнена: обнаружены ошибки в заполнении ИНН/КПП/даты документа'"));
+ ЦветФона = ЦветНекорректногоКонтрагента;
+ ИначеЕсли СостояниеКонтрагента = ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.Действует") Тогда
+ // Действующий корректный контрагент.
+ Если КонтрагентовНесколько Тогда
+ // Выводим обобщенно
+ Подстроки.Добавить(НСтр("ru = 'Проверка контрагентов по данным ФНС выполнена успешно'"));
+ Иначе
+ // Выводим конкретное состояние.
+ Подстроки.Добавить(Строка(СостояниеКонтрагента));
+ КонецЕсли;
+ ЦветФона = ЦветКорректногоКонтрагента;
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Подстроки.Добавить(Символы.ПС);
+ Подстроки.Добавить(ПроверкаКонтрагентовКлиентСерверПовтИсп.СсылкаНаИнструкцию());
+
+ Результат = Новый Структура;
+ Результат.Вставить("Текст", Новый ФорматированнаяСтрока(Подстроки));
+ Результат.Вставить("ЦветФона", ЦветФона);
+
+ Возврат Результат;
+
+КонецФункции
+
+// Функция - Получение счета-фактуры, находящегося в подвале документа-основания, чья форма передана в качестве
+// параметра.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа-основания, для которой необходимо получить счет-фактуру.
+// Возвращаемое значение:
+// ДокументСсылка - Счет-фактура, полученная для данного документа-основания.
+//
+Функция СчетФактура(Форма) Экспорт
+
+ СчетФактура = Неопределено;
+ Если ЭтоДокументСоСчетомФактуройВПодвале(Форма) Тогда
+ ПроверкаКонтрагентовКлиентСерверПереопределяемый.ПолучитьСчетФактуру(Форма, СчетФактура);
+ КонецЕсли;
+
+ Возврат СчетФактура;
+
+КонецФункции
+
+// Функция - Свойства справочника контрагенты.
+// Предназначена для определения имени справочника, имени реквизитов ИНН и КПП.
+//
+// Возвращаемое значение:
+// Структура - Структура с ключами Имя, ИНН и КПП справочника контрагенты.
+//
+Функция СвойстваСправочникаКонтрагенты() Экспорт
+
+ СвойстваСправочника = Новый Структура;
+ СвойстваСправочника.Вставить("Имя");
+ СвойстваСправочника.Вставить("ИНН");
+ СвойстваСправочника.Вставить("КПП");
+
+ ПроверкаКонтрагентовКлиентСерверПереопределяемый.ОпределитьСвойстваСправочникаКонтрагенты(СвойстваСправочника);
+
+ Возврат СвойстваСправочника;
+
+КонецФункции
+
+// Процедура - Вывод нужной панели проверки контрагентов в отчете.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов.
+//
+Процедура ВывестиНужнуюПанельПроверкиКонтрагентовВОтчете(Форма) Экспорт
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ЕстьДоступКВебСервисуФНС Тогда
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаВыполнялась Тогда
+
+ НедействующиеКонтрагенты = Форма.ПроверкаКонтрагентовНедействующиеКонтрагенты;
+
+ КонтрагентыСПустымСостоянием = НедействующиеКонтрагенты.НайтиСтроки(Новый Структура("Состояние",
+ ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.ПустаяСсылка")));
+ Если НедействующиеКонтрагенты.Количество() = 0 Тогда
+ УстановитьВидПанелиПроверкиКонтрагентовВОтчете(Форма, "ВсеКонтрагентыКорректные");
+ ИначеЕсли НедействующиеКонтрагенты.Количество() > 0 И КонтрагентыСПустымСостоянием.Количество() = НедействующиеКонтрагенты.Количество() Тогда
+ // Ни один контрагенты не проверен.
+ УстановитьВидПанелиПроверкиКонтрагентовВОтчете(Форма, "НетДоступаКСервису");
+ ИначеЕсли НедействующиеКонтрагенты.Количество() > 0 Тогда
+ // Контрагенты проверены
+ УстановитьВидПанелиПроверкиКонтрагентовВОтчете(Форма, "НайденыНекорректныеКонтрагенты");
+ КонецЕсли;
+
+ Иначе
+ // Проверка не выполнилась, например, потому что в отчете не было ни одной записи.
+ УстановитьВидПанелиПроверкиКонтрагентовВОтчете(Форма);
+ КонецЕсли;
+
+ Иначе
+ УстановитьВидПанелиПроверкиКонтрагентовВОтчете(Форма, "НетДоступаКСервису");
+ КонецЕсли;
+
+ Иначе
+ УстановитьВидПанелиПроверкиКонтрагентовВОтчете(Форма);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Функция - Параметры фонового задания.
+//
+// Параметры:
+// Параметр - Структура - Если изменения произошли в табличной части.
+// В записи с ключем ИмяТаблицы указывается ИмяТаблицы, в записи с ключем Идентификатор указывается Идентификатор
+// строки, в которой произошло изменение контрагента или даты.
+// - Строка - Имя элемента управления формы, в случае если произошло изменение в контрагенте, находящегося в шапке.
+// - Дата - Дата документа, в случае если произошло изменение даты.
+// - ТаблицаФормы - Если изменения произошли в табличной части.
+// - ПолеФормы - Если изменился контрагент в определенном поле произошли в табличной части.
+// - СправочникСсылка.<Контрагенты> - Если произошла запись контрагента и сработало оповещение.
+// - ДокументСсылка.<СчетФактура> - Если произошла запись счета-фактуры и сработало оповещение.
+// - Булево - определяет, нужно ли сохранять результат проверки
+// сразу в фоновом задании или после выхода из него.
+// Результат - -
+// Возвращаемое значение:
+// -
+//
+Функция ПараметрыФоновогоЗадания(Параметр, Знач Результат = Неопределено) Экспорт
+
+ Если Результат = Неопределено Тогда
+ Результат = Новый Структура();
+ КонецЕсли;
+
+ Если ТипЗнч(Параметр) = Тип("Структура") Тогда
+
+ Результат = Параметр;
+
+ ИначеЕсли ТипЗнч(Параметр) = Тип("ТаблицаФормы") Тогда
+
+ ИмяТаблицы = Параметр.Имя;
+ Идентификатор = Параметр.ТекущиеДанные.ПолучитьИдентификатор();
+
+ СвойстваТаблицы = Новый Структура();
+ СвойстваТаблицы.Вставить("ИмяТаблицы", ИмяТаблицы);
+ СвойстваТаблицы.Вставить("Идентификатор", Идентификатор);
+
+ // Сохраняем структуру, так как с клиента на сервер нельзя передавать таблицу.
+ Результат.Вставить("ИзменившаясяТаблица", СвойстваТаблицы);
+
+ ИначеЕсли ТипЗнч(Параметр) = Тип("ПолеФормы") Тогда
+
+ // Сохраняем имя, так как с клиента на сервер нельзя передавать поле.
+ Результат.Вставить("ИзменившеесяПоле", Параметр.Имя);
+
+ ИначеЕсли ЭтоКонтрагент(Параметр) Тогда
+
+ Результат.Вставить("ИзменившийсяКонтрагент", Параметр);
+
+ ИначеЕсли ТипЗнч(Параметр) = Тип("Дата") Тогда
+
+ Результат.Вставить("ИзменившаясяДата", Параметр);
+
+ ИначеЕсли ТипЗнч(Параметр) = Тип("Булево") Тогда
+
+ Результат.Вставить("СохранятьРезультатСразуПослеПроверки", Параметр);
+
+ ИначеЕсли ЭтоСчетФактура(Параметр) Тогда
+
+ Результат.Вставить("ИзменившийсяСчетФактура", Параметр);
+
+ КонецЕсли;
+
+ Возврат Результат;
+
+КонецФункции
+
+// Функция - Получение объекта (ДанныеФормыСтруктура) и ссылки(ДокументСсылка, СправочникСсылка) документа или
+// справочника, в котором выполняется проверка контрагента, по форме.
+// Обязательна к заполнению.
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа или справочника, в котором выполняется проверка контрагента.
+// Возвращаемое значение:
+// Структура - Объект и Ссылка, полученные по форме документа.
+// Ключи: "Объект" (Тип ДанныеФормыСтруктура) и "Ссылка" (Тип ДокументСсылка, СправочникСсылка).
+Функция ОбъектИСсылкаПоФорме(Форма) Экспорт
+
+ Результат = Новый Структура("Объект, Ссылка");
+ ПроверкаКонтрагентовКлиентСерверПереопределяемый.ПолучитьОбъектИСсылкуПоФорме(Форма, Результат);
+
+ Возврат Результат;
+
+КонецФункции
+
+// Процедура - Отображение результата проверки контрагента в справочнике.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Карточка проверяемого контрагента.
+Процедура ОтобразитьРезультатПроверкиКонтрагентаВСправочнике(Форма) Экспорт
+
+ Если Форма.РеквизитыПроверкиКонтрагентов.ПроверкаИспользуется Тогда
+ ПредставлениеРезультатаПроверки = ПредставлениеРезультатаПроверкиКонтрагента(Форма);
+ Иначе
+ ПредставлениеРезультатаПроверки = "";
+ КонецЕсли;
+
+ ПроверкаКонтрагентовКлиентСерверПереопределяемый.ОтобразитьРезультатПроверкиКонтрагентаВСправочнике(Форма, ПредставлениеРезультатаПроверки);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ВспомогательныеПроцедурыИФункции
+
+Процедура ПроверитьКонтрагентаИзКарточки(Форма, ДополнительныеПараметры = Неопределено) Экспорт
+
+ СвойстваСправочникаКонтрагенты = СвойстваСправочникаКонтрагенты();
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ОбъектИСсылкаПоФорме(Форма);
+ КонтрагентОбъект = ОбъектИСсылкаПоФорме.Объект;
+ КонтрагентСсылка = ОбъектИСсылкаПоФорме.Ссылка;
+
+ ИНН = КонтрагентОбъект[СвойстваСправочникаКонтрагенты.ИНН];
+ КПП = КонтрагентОбъект[СвойстваСправочникаКонтрагенты.КПП];
+
+ Форма.РеквизитыПроверкиКонтрагентов.АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, Форма.УникальныйИдентификатор);
+ Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагента = ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.ПустаяСсылка");
+ Форма.РеквизитыПроверкиКонтрагентов.ФоновоеЗаданиеЗапущено = Истина;
+
+ // Запуск фонового задания для проверки контрагента.
+ ПараметрыЗапуска = Новый Структура;
+ ПараметрыЗапуска.Вставить("Контрагент", КонтрагентСсылка);
+ ПараметрыЗапуска.Вставить("ИНН", ИНН);
+ ПараметрыЗапуска.Вставить("КПП", КПП);
+ ПараметрыЗапуска.Вставить("СохранятьРезультатСразуПослеПроверки", ТипЗнч(ДополнительныеПараметры) = Тип("Булево") И ДополнительныеПараметры);
+ ПараметрыЗапуска.Вставить("АдресХранилища", Форма.РеквизитыПроверкиКонтрагентов.АдресХранилища);
+
+ ПроверкаКонтрагентовВызовСервера.ПроверитьКонтрагентаПриИзменении(ПараметрыЗапуска);
+
+КонецПроцедуры
+
+Функция РезультатОпределенияВидаДокумента()
+
+ Параметры = Новый Структура;
+
+ Параметры.Вставить("КонтрагентНаходитсяВШапке", Ложь);
+ Параметры.Вставить("КонтрагентНаходитсяВТабличнойЧасти", Ложь);
+ Параметры.Вставить("СчетФактураНаходитсяВПодвале", Ложь);
+ Параметры.Вставить("ЯвляетсяСчетомФактурой", Ложь);
+
+ Возврат Параметры;
+
+КонецФункции
+
+Функция ПредставлениеРезультатаПроверкиКонтрагента(Форма)
+
+ СостояниеКонтрагента = Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагента;
+
+ Результат = "";
+
+ Если ПроверкаКонтрагентовКлиентСерверПовтИсп.ЭтоСостояниеНедействующегоКонтрагента(СостояниеКонтрагента, Ложь, Ложь)
+ ИЛИ ПроверкаКонтрагентовКлиентСерверПовтИсп.ЭтоСостояниеДействующегоКонтрагента(СостояниеКонтрагента, Ложь, Ложь) Тогда
+
+ ЦветТекста = ЦветНадписиРезультатаПроверкиПоСостояниюКонтрагента(СостояниеКонтрагента);
+ СтрокаСРезультатом = СтрокаСРезультатомПроверкиКонтрагента(Форма);
+
+ // Формируем строку
+ МассивПодстрок = Новый Массив;
+ МассивПодстрок.Добавить(Новый ФорматированнаяСтрока(
+ СтрокаСРезультатом,,
+ ЦветТекста,,
+ ПроверкаКонтрагентовКлиентСерверПовтИсп.ПутьКИнструкции()));
+
+ Результат = Новый ФорматированнаяСтрока(МассивПодстрок);
+
+ КонецЕсли;
+
+ Возврат Результат;
+
+КонецФункции
+
+Функция СтрокаСРезультатомПроверкиКонтрагента(Форма)
+
+ СостояниеКонтрагента = Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагента;
+ СвойстваСправочникаКонтрагенты = СвойстваСправочникаКонтрагенты();
+
+ // Определение объекта и ссылки.
+ ОбъектИСсылкаПоФорме = ОбъектИСсылкаПоФорме(Форма);
+ КонтрагентОбъект = ОбъектИСсылкаПоФорме.Объект;
+
+ ДлинаИНН = СтрДлина(КонтрагентОбъект[СвойстваСправочникаКонтрагенты.ИНН]);
+ ЭтоФизическоеЛицо = ДлинаИНН = 12;
+
+ СостояниеКонтрагента = Форма.РеквизитыПроверкиКонтрагентов.СостояниеКонтрагента;
+
+ Если ЭтоФизическоеЛицо
+ И СостояниеКонтрагента = ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.ПрекратилДеятельность") Тогда
+ СтрокаСРезультатом = НСтр("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..c63e51c23
--- /dev/null
+++ b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСервер/ПроверкаКонтрагентовКлиентСервер.mdo
@@ -0,0 +1,12 @@
+
+
+ ПроверкаКонтрагентовКлиентСервер
+
+ ru
+ Проверка контрагентов (клиент- сервер)
+
+ true
+ true
+ true
+ true
+
diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСерверПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСерверПереопределяемый/Module.bsl
new file mode 100644
index 000000000..5f9a6bccc
--- /dev/null
+++ b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСерверПереопределяемый/Module.bsl
@@ -0,0 +1,112 @@
+////////////////////////////////////////////////////////////////////////////////
+// Проверка контрагентов
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#Область ПрограммныйИнтерфейс
+
+#Область ПроверкаКонтрагентовВДокументах
+
+// Процедура - Определение вида документа.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, для которого необходимо получить описание.
+// Результат - Структура - Описывает вид документа. Ключи:
+// "КонтрагентНаходитсяВШапке" - Булево - Признак того, есть у документа контрагент в шапке
+// "КонтрагентНаходитсяВТабличнойЧасти" - Булево - Признак того, есть у документа контрагенты в табличных частях
+// "СчетФактураНаходитсяВПодвале" - Булево - Признак того, есть у документа счет-фактура в подвале
+// "ЯвляетсяСчетомФактурой" - Булево - Признак того, является ли сам документ счетом-фактурой.
+Процедура ОпределитьВидДокумента(Форма, Результат) Экспорт
+
+
+
+КонецПроцедуры
+
+// Процедура - Получение счета-фактуры, находящегося в подвале документа-основания, чья форма передана в качестве
+// параметра.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа-основания, для которой необходимо получить счет-фактуру.
+// СчетФактура - ДокументСсылка - Счет-фактура, полученная для данного документа-основания.
+Процедура ПолучитьСчетФактуру(Форма, СчетФактура) Экспорт
+
+
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ПроверкаКонтрагентовВОтчетах
+
+// Процедура - Вывод панели проверки в отчете.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма отчета, для которого выводится результат проверки контрагента.
+// СостояниеПроверки - Строка - Текущее состояние проверки, может принимать следующие значения, либо быть пустой
+// строкой: ВсеКонтрагентыКорректные
+// НайденыНекорректныеКонтрагенты
+// ДопИнформацияПоПроверке
+// ПроверкаВПроцессеВыполнения
+// НетДоступаКСервису.
+// СтандартнаяОбработка - Булево - Если Ложь, то игнорируется стандартное действие и выполняется указанное в данной
+// процедуре.
+Процедура УстановитьВидПанелиПроверкиКонтрагентовВОтчете(Форма, СтандартнаяОбработка, СостояниеПроверки = "") Экспорт
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ПроверкаКонтрагентовВСправочнике
+
+// Процедура - Свойства справочника контрагенты. Обязательна для заполнения!
+// Предназначена для определения имени справочника, имени реквизитов ИНН и КПП.
+//
+// Параметры:
+// СвойстваСправочника - Структура - Структура с ключами Имя, ИНН и КПП.
+Процедура ОпределитьСвойстваСправочникаКонтрагенты(СвойстваСправочника) Экспорт
+
+
+
+КонецПроцедуры
+
+// Процедура - Отображение результата проверки контрагента в справочнике.
+// Обязательна к заполнению.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма справочника, в котором выполнялась проверка контрагента.
+// Результат проверки хранится в реквизите РеквизитыПроверкиКонтрагентов(Структура) формы контрагента.
+// Структуру полей РеквизитыПроверкиКонтрагентов см. в процедуре ИнициализироватьРеквизитыФормыКонтрагент ОМ
+// ПроверкаКонтрагентов.
+// ПредставлениеРезультатаПроверки - ФорматированнаяСтрока или пустая Строка - представление результата проверки
+// контрагента.
+Процедура ОтобразитьРезультатПроверкиКонтрагентаВСправочнике(Форма, ПредставлениеРезультатаПроверки) Экспорт
+
+ // Устанавливаем текст заголовка.
+ Форма.РезультатПроверкиКонтрагента = ПредставлениеРезультатаПроверки;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ПрочиеПроцедуры
+
+// Процедура - Получение объекта (ДанныеФормыСтруктура) и ссылки(ДокументСсылка, СправочникСсылка) документа или
+// справочника, в котором выполняется проверка контрагента, по форме.
+// Обязательна к заполнению.
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа или справочника, в котором выполняется проверка контрагента.
+// Результат - Структура - Объект и Ссылка, полученные по форме документа.
+// Ключи: "Объект" (Тип ДанныеФормыСтруктура) и "Ссылка" (Тип ДокументСсылка, СправочникСсылка).
+Процедура ПолучитьОбъектИСсылкуПоФорме(Форма, Результат) Экспорт
+
+ ИсточникОбъект = Форма.Объект;
+ ИсточникСсылка = ИсточникОбъект.Ссылка;
+
+ Результат.Вставить("Объект", ИсточникОбъект);
+ Результат.Вставить("Ссылка", ИсточникСсылка);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
\ No newline at end of file
diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСерверПереопределяемый/ПроверкаКонтрагентовКлиентСерверПереопределяемый.mdo b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСерверПереопределяемый/ПроверкаКонтрагентовКлиентСерверПереопределяемый.mdo
new file mode 100644
index 000000000..3251b4828
--- /dev/null
+++ b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСерверПереопределяемый/ПроверкаКонтрагентовКлиентСерверПереопределяемый.mdo
@@ -0,0 +1,12 @@
+
+
+ ПроверкаКонтрагентовКлиентСерверПереопределяемый
+
+ ru
+ Проверка контрагентов (клиент-сервер, переопределяемый)
+
+ true
+ true
+ true
+ true
+
diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСерверПовтИсп/Module.bsl b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСерверПовтИсп/Module.bsl
new file mode 100644
index 000000000..390b81730
--- /dev/null
+++ b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСерверПовтИсп/Module.bsl
@@ -0,0 +1,112 @@
+////////////////////////////////////////////////////////////////////////////////
+// Проверка одного или нескольких контрагентов при помощи веб-сервиса ФНС.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#Область ПрограммныйИнтерфейс
+
+// Функция - Определение по состоянию, является ли контрагент действующим.
+//
+// Параметры:
+// Состояние - Перечисления.СостоянияСуществованияКонтрагента - Состояние контрагента.
+// ДополнятьСостояниемСОшибкой - Булево - Если Истина, то контрагент с ошибкой считается действующим.
+// ДополнятьПустымСостоянием - Булево - Если Истина, то контрагент с пустым состоянием считается действующим.
+// Возвращаемое значение:
+// Булево - Является ли контрагент действующим.
+//
+Функция ЭтоСостояниеДействующегоКонтрагента(Состояние, ДополнятьСостояниемСОшибкой = Истина, ДополнятьПустымСостоянием = Истина) Экспорт
+
+ СостоянияДействующегоКонтрагента = ПроверкаКонтрагентовКлиентСерверПовтИсп.СостоянияДействующегоКонтрагента(
+ ДополнятьСостояниемСОшибкой, ДополнятьПустымСостоянием);
+ Возврат СостоянияДействующегоКонтрагента.Найти(Состояние) <> Неопределено;
+
+КонецФункции
+
+// Функция - Перечень состояний действующего контрагента.
+//
+// Параметры:
+// ДополнятьСостояниемСОшибкой - Булево - Если Истина, то контрагент с ошибкой считается действующим.
+// ДополнятьПустымСостоянием - Булево - Если Истина, то контрагент с пустым состоянием считается действующим.
+// Возвращаемое значение:
+// Массив - Состояния контрагента, при которых он является действующим.
+//
+Функция СостоянияДействующегоКонтрагента(ДополнятьСостояниемСОшибкой = Истина, ДополнятьПустымСостоянием = Истина) Экспорт
+
+ МассивСостояний = Новый Массив;
+ МассивСостояний.Добавить(ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.Действует"));
+ МассивСостояний.Добавить(ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.НеПодлежитПроверке"));
+ ДобавитьДополнительныеСостояния(МассивСостояний, ДополнятьСостояниемСОшибкой, ДополнятьПустымСостоянием);
+
+ Возврат МассивСостояний;
+
+КонецФункции
+
+// Функция - Определение по состоянию, является ли контрагент недействующим.
+//
+// Параметры:
+// Состояние - Перечисления.СостоянияСуществованияКонтрагента - Состояние контрагента.
+// ДополнятьСостояниемСОшибкой - Булево - Если Истина, то контрагент с ошибкой считается недействующим.
+// ДополнятьПустымСостоянием - Булево - Если Истина, то контрагент с пустым состоянием считается недействующим.
+// Возвращаемое значение:
+// Булево - Является ли контрагент недействующим.
+//
+Функция ЭтоСостояниеНедействующегоКонтрагента(Состояние, ДополнятьСостояниемСОшибкой = Ложь, ДополнятьПустымСостоянием = Ложь) Экспорт
+
+ СостоянияНедействующегоКонтрагента = ПроверкаКонтрагентовКлиентСерверПовтИсп.СостоянияНедействующегоКонтрагента(
+ ДополнятьСостояниемСОшибкой, ДополнятьПустымСостоянием);
+ Возврат СостоянияНедействующегоКонтрагента.Найти(Состояние) <> Неопределено;
+
+КонецФункции
+
+// Функция - Перечень состояний недействующего контрагента.
+//
+// Параметры:
+// ДополнятьСостояниемСОшибкой - Булево - Если Истина, то контрагент с ошибкой считается действующим.
+// ДополнятьПустымСостоянием - Булево - Если Истина, то контрагент с пустым состоянием считается действующим.
+// Возвращаемое значение:
+// Массив - Состояния контрагента, при которых он является действующим.
+//
+Функция СостоянияНедействующегоКонтрагента(ДополнятьСостояниемСОшибкой = Ложь, ДополнятьПустымСостоянием = Ложь) Экспорт
+
+ МассивСостояний = Новый Массив;
+ МассивСостояний.Добавить(ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.КППНеСоответствуетИНН"));
+ МассивСостояний.Добавить(ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.ОтсутствуетВРеестре"));
+ МассивСостояний.Добавить(ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.ПрекратилДеятельность"));
+ ДобавитьДополнительныеСостояния(МассивСостояний, ДополнятьСостояниемСОшибкой, ДополнятьПустымСостоянием);
+
+ Возврат МассивСостояний;
+
+КонецФункции
+
+// Функция - Ссылка на инструкцию по проверке контрагентов.
+// Возвращаемое значение:
+// ФорматированнаяСтрока - Ссылка на инструкцию.
+//
+Функция СсылкаНаИнструкцию() Экспорт
+ Возврат Новый ФорматированнаяСтрока(НСтр("ru = 'Подробнее о проверке'"),,,, ПутьКИнструкции());
+КонецФункции
+
+// Функция - Путь к инструкции по проверке контрагентов.
+// Возвращаемое значение:
+// Строка - Путь к инструкции по проверке контрагентов.
+//
+Функция ПутьКИнструкции() Экспорт
+ Возврат "e1cib/app/Обработка.ИнструкцияПоИспользованиюПроверкиКонтрагента";
+КонецФункции
+
+#КонецОбласти
+
+#Область ВспомогательныеПроцедурыИФункции
+
+Процедура ДобавитьДополнительныеСостояния(МассивСостояний, ДополнятьСостояниемСОшибкой, ДополнятьПустымСостоянием)
+
+ Если ДополнятьСостояниемСОшибкой Тогда
+ МассивСостояний.Добавить(ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.СодержитОшибкиВДанных"));
+ КонецЕсли;
+ Если ДополнятьПустымСостоянием Тогда
+ МассивСостояний.Добавить(ПредопределенноеЗначение("Перечисление.СостоянияСуществованияКонтрагента.ПустаяСсылка"));
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
\ No newline at end of file
diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСерверПовтИсп/ПроверкаКонтрагентовКлиентСерверПовтИсп.mdo b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСерверПовтИсп/ПроверкаКонтрагентовКлиентСерверПовтИсп.mdo
new file mode 100644
index 000000000..303723a06
--- /dev/null
+++ b/SSL/src/CommonModules/ПроверкаКонтрагентовКлиентСерверПовтИсп/ПроверкаКонтрагентовКлиентСерверПовтИсп.mdo
@@ -0,0 +1,13 @@
+
+
+ ПроверкаКонтрагентовКлиентСерверПовтИсп
+
+ ru
+ Проверка контрагентов (клиент- сервер)
+
+ true
+ true
+ true
+ true
+ DuringSession
+
diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентовПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПроверкаКонтрагентовПереопределяемый/Module.bsl
new file mode 100644
index 000000000..897e8580d
--- /dev/null
+++ b/SSL/src/CommonModules/ПроверкаКонтрагентовПереопределяемый/Module.bsl
@@ -0,0 +1,266 @@
+////////////////////////////////////////////////////////////////////////////////
+// Проверка контрагентов
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#Область ПрограммныйИнтерфейс
+
+#Область ПроверкаКонтрагентовВДокументах
+
+// Процедура - Формирование описания расположения счета-фактуры в документе.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа-основания, для которого необходимо получить описание счета-фактуры.
+// Описание - ТаблицаЗначений - Таблица, в которую помещается описание счета-фактуры.
+// Структура колонок указана в функции ШаблонТаблицыОписания модуля ПроверкаКонтрагентов.
+Процедура СформироватьОписаниеДокументовСоСчетомФактуройВПодвале(Форма, Описание) Экспорт
+
+
+
+КонецПроцедуры
+
+// Процедура - Формирование описания расположения контрагента, находящегося в шапке документа.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, для которой необходимо получить описание расположения контрагента.
+// Описание - ТаблицаЗначений - Таблица, в которую помещается описание контрагентов.
+// Структура колонок указана в функции ШаблонТаблицыОписания модуля ПроверкаКонтрагентов.
+Процедура СформироватьОписаниеДокументовСКонтрагентомВШапке(Форма, Описание) Экспорт
+
+
+
+КонецПроцедуры
+
+// Процедура - Формирование описания расположения контрагентов, находящихся в табличной части документа.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, для которой необходимо получить описание.
+// Описание - ТаблицаЗначений - Таблица с описанием расположения контрагентов в табличной части документа.
+// Структура колонок указана в функции ШаблонТаблицыОписанияТабличныхЧастей модуля ПроверкаКонтрагентов.
+Процедура СформироватьОписаниеДокументовСТабличнымиЧастями(Форма, Описание) Экспорт
+
+
+
+КонецПроцедуры
+
+// Процедура - Формирование описания расположения контрагентов в счете-фактуре.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма счета-фактуры, для которой необходимо получить описание.
+// Описание - ТаблицаЗначений - Таблица, в которую помещается описание контрагентов.
+// Структура колонок указана в функции ШаблонТаблицыОписания модуля ПроверкаКонтрагентов.
+Процедура СформироватьОписаниеСчетовФактур(Форма, Описание) Экспорт
+
+
+
+КонецПроцедуры
+
+// Процедура - Возвращает массив имен реквизитов счета-фактуры, содержащих контрагентов.
+//
+// Параметры:
+// Тип - Тип - Тип счета-фактуры, для которой необходимо получить описание.
+// ИменаРеквизитов - Массив - массив имен(строк) реквизитов счета-фактуры, содержащих контрагентов.
+Процедура ПолучитьИменаРеквизитовКонтрагентовВСчетеФактуре(Тип, ИменаРеквизитов) Экспорт
+
+
+
+КонецПроцедуры
+
+// Процедура - Получение даты документа, в котором используется проверка контрагентов.
+// Проверка контрагентов будет выполняться по состоянию на эту дату.
+//
+// Параметры:
+// ДокументОбъект - ДокументОбъект - Документ, в котором используется проверка контрагентов.
+// Дата - Дата - Результат получения даты документа.
+Процедура ОпределитьДатуВДокументе(ДокументОбъект, Дата) Экспорт
+
+
+
+КонецПроцедуры
+
+// Процедура - Определение даты в счете-фактуре.
+//
+// Параметры:
+// СчетФактураОбъект - ДанныеФормыСтруктура или ДокументОбъект - Счет-фактура, чью дату необходимо получить.
+// Дата - Дата - Результат, дата счета-фактуры.
+Процедура ОпределитьДатуВСчетеФактуре(СчетФактураОбъект, Дата) Экспорт
+
+
+
+КонецПроцедуры
+
+// Процедура - Отображения результата проверки контрагента в документе.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, для которого выводится результат проверки контрагента.
+// Результат проверки хранится в реквизите РеквизитыПроверкиКонтрагентов(Структура) формы документа.
+// Структуру полей РеквизитыПроверкиКонтрагентов см. процедуре ИнициализироватьРеквизитыФормыДокумент ОМ
+// ПроверкаКонтрагентов.
+// СтандартнаяОбработка - Булево - Если Ложь, то игнорируется стандартное действие и выполняется указанное в данной
+// процедуре.
+Процедура ОтобразитьРезультатПроверкиКонтрагентаВДокументе(Форма, СтандартнаяОбработка) Экспорт
+
+КонецПроцедуры
+
+// Процедура - Прорисовать состояния контрагентов в документе.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+// СостояниеПроверки - Перечисления.СостоянияПроверкиКонтрагентов - Указывает, в каком состояние проверка:
+// завершилась, не завершилась, выполняется или отсутствует доступ к веб-сервису.
+// ДополнительныеПараметры - Неопределено или Структура - Параметры, показывающие в каком элементе формы произошло
+// изменение и это изменение вызвало запуск проверки контрагента. Описание структуры см в
+// ПроверкаКонтрагентовКлиентСервер.ПараметрыФоновогоЗадания.
+// СтандартнаяОбработка - Булево - Если Ложь, то игнорируется стандартное действие и выполняется указанное в данной
+// процедуре.
+// Пример см в ПроверкаКонтрагентов.ПрорисоватьСостоянияКонтрагентовВДокументе.
+Процедура ПрорисоватьСостоянияКонтрагентовВДокументе(Форма, СостояниеПроверки, ДополнительныеПараметры = Неопределено, СтандартнаяОбработка = Истина) Экспорт
+
+КонецПроцедуры
+
+// Процедура - Установка условного оформления в форме выбора или списка документов.
+//
+// Параметры:
+// Список - ДинамическийСписок - Динамический список формы выбора или списка документов.
+// СтандартнаяОбработка - Булево - Если Ложь, то игнорируется стандартное действие и выполняется указанное в данной
+// процедуре.
+Процедура УстановитьУсловноеОформлениеСпискаДокументов(Список, СтандартнаяОбработка = Истина) Экспорт
+
+КонецПроцедуры
+
+// Процедура - Установка условного оформления в табличной части документа.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+// СтандартнаяОбработка - Булево - Если Ложь, то игнорируется стандартное действие и выполняется указанное в данной
+// процедуре.
+Процедура УстановитьУсловноеОформлениеТабличнойЧастиДокумента(Форма, СтандартнаяОбработка = Истина) Экспорт
+
+КонецПроцедуры
+
+// Процедура - Добавление колонки с результатом проверки контрагента в таблицу формы документа.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма документа, в котором выполняется проверка контрагентов.
+// СтандартнаяОбработка - Булево - Если Ложь, то игнорируется стандартное действие и выполняется указанное в данной
+// процедуре.
+Процедура ДобавитьКолонкиТаблицыФормыСРезультатамиПроверкиВТабличныеЧасти(Форма, СтандартнаяОбработка = Истина) Экспорт
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ПроверкаКонтрагентовВОтчетах
+
+// Процедура - Выделение контрагента с ошибкой в строке отчета.
+//
+// Параметры:
+// ТабличныйДокумент - ТабличныйДокумент - Табличный документ отчета, в котором выделяется строка с некорректным
+// контрагентом.
+// НомерСтроки - Число - Номер строки табличного документа, в которой находится некорректный контрагент.
+Процедура ВыделитьКонтрагентаСОшибкойВСтрокеОтчета(ТабличныйДокумент, НомерСтроки) Экспорт
+
+
+
+КонецПроцедуры
+
+// Процедура - Предназначена для формирования отчета, в котором используется проверка контрагентов, из общего модуля.
+//
+// Параметры:
+// ПараметрыФормированияОтчета - Структура - Параметры, с которыми необходимо сформировать отчет.
+// Отчет - ТабличныйДокумент - результат формирования отчета.
+Процедура СформироватьОтчет(ПараметрыФормированияОтчета, Отчет) Экспорт
+
+
+
+КонецПроцедуры
+
+// Процедура - Вывод результата проверки контрагента в поле табличного документа.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма отчета, в котором выполняется проверка контрагентов.
+// ПолеТабличногоДокумента - ПолеФормы с видом ПолеТабличногоДокумента - поле, в которое необходимо выводить отчет.
+// РезультатФормированияОтчета - ТабличныйДокумент - Документ, предназначенный для вывода в поле формы.
+// СтандартнаяОбработка - Булево - Определяет, выполнять ли действие, определенное в данной процедуре или выполнить
+// стандартную обработку.
+Процедура ВывестиОтчет(Форма, ПолеТабличногоДокумента, РезультатФормированияОтчета, СтандартнаяОбработка) Экспорт
+
+КонецПроцедуры
+
+// Процедура - Определяет, нужно ли выводить данную строку в отчете по некорректным контрагентам.
+// Пример см. в ПроверкаКонтрагентов.ВыводитьСтрокуОтчета.
+//
+// Параметры:
+// СтруктураПараметров - Структура - Параметры формирования отчета.
+// Для проверки контрагентов в отчете важно наличие ключа "ДанныеДляПроверкиКонтрагентов".
+// Данный ключ формируется в процедуре ДобавитьПараметрыДляПроверкиКонтрагентов.
+// Контрагент - СправочникСсылка - Проверяемый контрагент в строке отчета.
+// ИНН - Строка - ИНН контрагента.
+// КПП - Строка - ИНН контрагента.
+// Дата - Дата - Дата, на которую необходимо выполнять проверку контрагента.
+// СтандартнаяОбработка - Булево - Определяет, выполнять ли действие, определенное в данной процедуре или выполнить
+// стандартную обработку.
+// Результат - Булево - Определяет, нужно ли выводить строку.
+Процедура ОпределитьНужноЛиВыводитьСтрокуОтчета(СтруктураПараметров, Контрагент, ИНН, КПП, Дата, Результат, СтандартнаяОбработка) Экспорт
+
+КонецПроцедуры
+
+// Процедура - Отображения результата проверки контрагента в отчете.
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма отчета, для которого выводится результат проверки контрагента.
+// Результат проверки хранится в реквизите РеквизитыПроверкиКонтрагентов(Структура),
+// ПроверкаКонтрагентовНедействующиеКонтрагенты формы отчета.
+// Структуру полей РеквизитыПроверкиКонтрагентов см. процедуре ИнициализироватьРеквизитыФормыОтчета ОМ
+// ПроверкаКонтрагентов.
+// СтандартнаяОбработка - Булево - Если Ложь, то игнорируется стандартное действие и выполняется указанное в данной
+// процедуре.
+Процедура ОтобразитьРезультатПроверкиКонтрагентаВОтчете(Форма, СтандартнаяОбработка) Экспорт
+
+КонецПроцедуры
+
+// Процедура - Установка условного оформления в форме выбора или списка справочника контрагентов.
+//
+// Параметры:
+// Список - ДинамическийСписок - Динамический список формы выбора или списка справочника контрагентов.
+// СтандартнаяОбработка - Булево - Если Ложь, то игнорируется стандартное действие и выполняется указанное в данной
+// процедуре.
+Процедура УстановитьУсловноеОформлениеСпискаКонтрагентов(Список, СтандартнаяОбработка = Истина) Экспорт
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ПроверкаКонтрагентовВСправочнике
+
+// Процедура - Определяется, является ли контрагент иностранным.
+//
+// Параметры:
+// КонтрагентСсылка - СправочникСсылка.<Справочник контрагентов>, СправочникОбъект.<Справочник контрагентов> -
+// Контрагент, для которого определяется, является ли он иностранным.
+// Для иностранного контрагента проверка не выполняется.
+//
+// ЯвляетсяИностранным - Булево - Результат проверки.
+Процедура ОпределитьЯвляетсяЛиКонтрагентИностранным(КонтрагентСсылка, ЯвляетсяИностранным) Экспорт
+
+
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ПрочиеПроцедуры
+
+// Процедура - Определение цветов выделения результатов проверки контрагентов.
+// Для примера см. функцию ЦветаРезультатовПроверки ОМ ПроверкаКонтрагентовКлиентСервер.
+//
+// Параметры:
+// Цвета - Структура - Имена ключей - это названия цветов, которые необходимо определить.
+// Список ключей см ПроверкаКонтрагентовВызовСервераПовтИсп.ЦветаРезультатовПроверки().
+Процедура ОпределитьЦветаРезультатовПроверки(Цвета) Экспорт
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
\ No newline at end of file
diff --git a/SSL/src/CommonModules/ПроверкаКонтрагентовПереопределяемый/ПроверкаКонтрагентовПереопределяемый.mdo b/SSL/src/CommonModules/ПроверкаКонтрагентовПереопределяемый/ПроверкаКонтрагентовПереопределяемый.mdo
new file mode 100644
index 000000000..103eb3c8a
--- /dev/null
+++ b/SSL/src/CommonModules/ПроверкаКонтрагентовПереопределяемый/ПроверкаКонтрагентовПереопределяемый.mdo
@@ -0,0 +1,11 @@
+
+
+ ПроверкаКонтрагентовПереопределяемый
+
+ ru
+ Проверка контрагентов (сервер, переопределяемый)
+
+ true
+ true
+ true
+
diff --git a/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl
index af7715bc2..f6da09394 100644
--- a/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl
@@ -192,13 +192,15 @@
Попытка
УдалитьФайлы(КаталогРаспаковки);
Исключение
- // Обработка исключения не требуется.
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Работа в безопасном режиме.Не удалось удалить временный файл'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Попытка
УдалитьФайлы(ВременныйФайл);
Исключение
- // Обработка исключения не требуется.
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Работа в безопасном режиме.Не удалось удалить временный файл'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат Новый ФиксированноеСоответствие(Результат);
diff --git a/SSL/src/CommonModules/РаботаВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/РаботаВМоделиСервиса/Module.bsl
index 5054df4c2..6d06a423d 100644
--- a/SSL/src/CommonModules/РаботаВМоделиСервиса/Module.bsl
+++ b/SSL/src/CommonModules/РаботаВМоделиСервиса/Module.bsl
@@ -323,6 +323,8 @@
Попытка
УдалитьФайлы(ИмяФайлаВыгрузки);
Исключение
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Копирование области данных'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
ВызватьИсключение;
@@ -338,6 +340,8 @@
Попытка
УдалитьФайлы(ИмяФайлаВыгрузки);
Исключение
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Копирование области данных'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
ВызватьИсключение;
КонецПопытки;
@@ -345,6 +349,8 @@
Попытка
УдалитьФайлы(ИмяФайлаВыгрузки);
Исключение
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Копирование области данных'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
@@ -392,7 +398,7 @@
// Восстановление предопределенных элементов.
МодельДанных = РаботаВМоделиСервисаПовтИсп.ПолучитьМодельДанныхОбласти();
-
+
Для каждого ЭлементМодели Из МодельДанных Цикл
ПолноеИмяОбъектаМетаданных = ЭлементМодели.Ключ;
@@ -413,8 +419,8 @@
КонецЕсли;
- КонецЦикла;
-
+ КонецЦикла;
+
СменитьСтатусОбластиИУведомитьМенеджер(МенеджерЗаписи, "ОбластьУдалена", "");
Исключение
@@ -427,7 +433,7 @@
КонецПроцедуры
// Удаляет все разделенные данные из текущей области данных (в т.ч. при выключенном
-// разделении по областям данных).
+// разделении по областям данных), кроме переопределенных.
//
// Параметры:
// УдалитьПользователей - Булево, флаг необходимости удаления пользователей
@@ -440,7 +446,7 @@
ИсключенияОчистки = Новый Массив();
ИсключенияОчистки.Добавить(Метаданные.РегистрыСведений.ОбластиДанных.ПолноеИмя());
- Для Каждого ЭлементМодели Из МодельДанных Цикл
+ Для каждого ЭлементМодели Из МодельДанных Цикл
ПолноеИмяОбъектаМетаданных = ЭлементМодели.Ключ;
ОписаниеОбъектаМетаданных = ЭлементМодели.Значение;
@@ -454,6 +460,7 @@
ОбъектМетаданныхОбласти = Метаданные.Константы.Найти(ОписаниеОбъектаМетаданных.Имя);
МенеджерЗначения = Константы[ОписаниеОбъектаМетаданных.Имя].СоздатьМенеджерЗначения();
МенеджерЗначения.ОбменДанными.Загрузка = Истина;
+ МенеджерЗначения.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов");
МенеджерЗначения.Значение = ОбъектМетаданныхОбласти.Тип.ПривестиЗначение();
МенеджерЗначения.Записать();
@@ -461,39 +468,49 @@
ЭтоПланОбмена = ЭтоПолноеИмяПланаОбмена(ПолноеИмяОбъектаМетаданных);
- Запрос = Новый Запрос;
- Запрос.Текст =
+ Запрос = Новый Запрос(
"ВЫБРАТЬ
- | _XMLВыгрузка_Таблица.Ссылка КАК Ссылка
+ | Т.Ссылка КАК Ссылка
|ИЗ
- | " + ПолноеИмяОбъектаМетаданных + " КАК _XMLВыгрузка_Таблица";
+ | " + ПолноеИмяОбъектаМетаданных + " КАК Т");
Если ЭтоПланОбмена Тогда
Запрос.Текст = Запрос.Текст + "
|ГДЕ
- | _XMLВыгрузка_Таблица.Ссылка <> &ЭтотУзел";
+ | Т.Ссылка <> &ЭтотУзел";
+
Запрос.УстановитьПараметр("ЭтотУзел", ПланыОбмена[ОписаниеОбъектаМетаданных.Имя].ЭтотУзел());
КонецЕсли;
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
+
Пока Выборка.Следующий() Цикл
- Удаление = Новый УдалениеОбъекта(Выборка.Ссылка);
- Удаление.ОбменДанными.Загрузка = Истина;
- Удаление.Записать();
+
+ УдаляемыйОбъект = Выборка.Ссылка.ПолучитьОбъект();
+ УдаляемыйОбъект.ОбменДанными.Загрузка = Истина;
+ УдаляемыйОбъект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов");
+ УдаляемыйОбъект.Удалить();
+
КонецЦикла;
+
ИначеЕсли ЭтоПолноеИмяРегистра(ПолноеИмяОбъектаМетаданных)
ИЛИ ЭтоПолноеИмяПерерасчета(ПолноеИмяОбъектаМетаданных) Тогда
ЭтоРегистрСведений = ЭтоПолноеИмяРегистраСведений(ПолноеИмяОбъектаМетаданных);
+
Если ЭтоРегистрСведений Тогда
+
ОбъектМетаданныхОбласти = Метаданные.РегистрыСведений.Найти(ОписаниеОбъектаМетаданных.Имя);
ЭтоНезависимыйРегистрСведений = (ОбъектМетаданныхОбласти.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый);
+
Иначе
+
ЭтоНезависимыйРегистрСведений = Ложь;
+
КонецЕсли;
Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПолноеИмяОбъектаМетаданных);
@@ -502,6 +519,7 @@
НаборЗаписей = Менеджер.СоздатьНаборЗаписей();
НаборЗаписей.ОбменДанными.Загрузка = Истина;
+ НаборЗаписей.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов");
НаборЗаписей.Записать();
Иначе
@@ -509,24 +527,29 @@
ПараметрыВыборки = ПараметрыВыборки(ПолноеИмяОбъектаМетаданных);
ИмяПоляРегистратор = ПараметрыВыборки.ИмяПоляРегистратор;
- Запрос = Новый Запрос;
- Запрос.Текст =
+ Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗЛИЧНЫЕ
- | _XMLВыгрузка_Таблица.Регистратор КАК Регистратор
+ | Т.Регистратор КАК Регистратор
|ИЗ
- | " + ПараметрыВыборки.Таблица + " КАК _XMLВыгрузка_Таблица";
+ | " + ПараметрыВыборки.Таблица + " КАК Т");
Если ИмяПоляРегистратор <> "Регистратор" Тогда
+
Запрос.Текст = СтрЗаменить(Запрос.Текст, "Регистратор", ИмяПоляРегистратор);
+
КонецЕсли;
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
+
Пока Выборка.Следующий() Цикл
+
НаборЗаписей = Менеджер.СоздатьНаборЗаписей();
НаборЗаписей.Отбор[ИмяПоляРегистратор].Установить(Выборка[ИмяПоляРегистратор]);
НаборЗаписей.ОбменДанными.Загрузка = Истина;
+ НаборЗаписей.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов");
НаборЗаписей.Записать();
+
КонецЦикла;
КонецЕсли;
@@ -540,7 +563,7 @@
ПервыйАдминистратор = Неопределено;
- Для Каждого ПользовательИБ Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
+ Для каждого ПользовательИБ Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
Если ПервыйАдминистратор = Неопределено И Пользователи.ЭтоПолноправныйПользователь(ПользовательИБ, Истина, Ложь) Тогда
@@ -557,7 +580,9 @@
КонецЦикла;
Если ПервыйАдминистратор <> Неопределено Тогда
+
ПервыйАдминистратор.Удалить();
+
КонецЕсли;
КонецЕсли;
@@ -570,13 +595,17 @@
Хранилища.Добавить(ХранилищеПользовательскихНастроекОтчетов);
Хранилища.Добавить(ХранилищеСистемныхНастроек);
- Для Каждого Хранилище Из Хранилища Цикл
+ Для каждого Хранилище Из Хранилища Цикл
+
Если ТипЗнч(Хранилище) <> Тип("СтандартноеХранилищеНастроекМенеджер") Тогда
+
// Настройки будут удалены при очистке данных.
Продолжить;
+
КонецЕсли;
Хранилище.Удалить(Неопределено, Неопределено, Неопределено);
+
КонецЦикла;
КонецПроцедуры
@@ -1101,6 +1130,10 @@
Возврат Неопределено;
КонецЕсли;
+ // Менеджер сервиса устанавливает исходному файлу атрибут "Только чтение".
+ // Унаследованный атрибут снимается, чтобы файл можно было удалить.
+ СвойстваФайла.УстановитьТолькоЧтение(Ложь);
+
Возврат СвойстваФайла.ПолноеИмя;
КонецФункции
@@ -2447,6 +2480,8 @@
Попытка
УдалитьФайлы(СвойстваФайла.ПолноеИмя);
Исключение
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Получение файла из хранилища'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
@@ -2540,6 +2575,8 @@
Попытка
УдалитьФайлы(ФайлРезультата.ПолноеИмя);
Исключение
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Получение файла из хранилища'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
@@ -2547,6 +2584,8 @@
УдалитьФайлы(ИмяАрхива);
УдалитьФайлы(КаталогСборки);
Исключение
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Получение файла из хранилища'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
ЗаписатьВЖурналСобытиеФайловогоХранилища(
@@ -2667,6 +2706,8 @@
Попытка
УдалитьФайлы(ИмяНеразделенногоФайла);
Исключение
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Добавление файла.Обмен не через ФС'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
// Передать файл через сервис по частям.
@@ -2678,6 +2719,8 @@
Попытка
УдалитьФайлы(ИмяФайлаЧасти);
Исключение
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Добавление файла.Обмен не через ФС'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
ОписаниеПрокси.Прокси.PutFilePart(ИдентификаторПередачи, НомерЧасти, ДанныеФайла, КоличествоЧастей);
КонецЦикла;
@@ -2688,6 +2731,8 @@
Попытка
УдалитьФайлы(ИмяФайлаЧасти);
Исключение
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Добавление файла.Обмен не через ФС'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
ОписаниеПрокси.Прокси.PutFilePart(ИдентификаторПередачи, НомерЧасти, ДанныеФайла);
КонецЦикла;
@@ -2696,6 +2741,8 @@
Попытка
УдалитьФайлы(КаталогСборки);
Исключение
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Добавление файла.Обмен не через ФС'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Если ОписаниеПрокси.ЕстьПоддержка2йВерсии Тогда
@@ -3435,6 +3482,8 @@
Попытка
УдалитьФайлы(ИмяФайлаВыгрузки);
Исключение
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Копирование области данных'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
ВызватьИсключение;
@@ -3443,6 +3492,8 @@
Попытка
УдалитьФайлы(ИмяФайлаВыгрузки);
Исключение
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Копирование области данных'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат "Успех";
diff --git a/SSL/src/CommonModules/РаботаСБанками/Module.bsl b/SSL/src/CommonModules/РаботаСБанками/Module.bsl
index fb3ae004d..f88069b48 100644
--- a/SSL/src/CommonModules/РаботаСБанками/Module.bsl
+++ b/SSL/src/CommonModules/РаботаСБанками/Module.bsl
@@ -83,6 +83,21 @@
КонецПроцедуры
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.Справочники.КлассификаторБанковРФ.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
#КонецОбласти
diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl
index a950f2ee5..fdf7cfa1d 100644
--- a/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl
+++ b/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl
@@ -171,11 +171,11 @@
НачалоПериода = ?(Выборка.ДатаКурса = '198001010000', НачалоГода(ТекущаяДата), Выборка.ДатаКурса + 60*60*24);
СписокВалют = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Выборка);
- РаботаСКурсамиВалютКлиентСервер.ЗагрузитьКурсыВалютПоПараметрам(
+ ЗагрузитьКурсыВалютПоПараметрам(
СписокВалют, НачалоПериода, КонецПериода, ПриЗагрузкеВозниклиОшибки);
КонецЦикла;
Иначе
- Результат = РаботаСКурсамиВалютКлиентСервер.ЗагрузитьКурсыВалютПоПараметрам(ПараметрыЗагрузки.СписокВалют,
+ Результат = ЗагрузитьКурсыВалютПоПараметрам(ПараметрыЗагрузки.СписокВалют,
ПараметрыЗагрузки.НачалоПериода, ПараметрыЗагрузки.КонецПериода, ПриЗагрузкеВозниклиОшибки);
КонецЕсли;
@@ -269,7 +269,7 @@
// Процедура вызывается только при наличии подсистемы "Текущие дела", поэтому здесь
// не делается проверка существования подсистемы.
- Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Обработки.ЗагрузкаКурсовВалют.ПолноеИмя());
+ Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Справочники.Валюты.ПолноеИмя());
Если Разделы = Неопределено Тогда
Возврат; // Интерфейс по работе с валютами не вынесен в командный интерфейс пользователя.
@@ -310,6 +310,22 @@
КонецПроцедуры
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.Справочники.Валюты.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@@ -629,6 +645,66 @@
КонецФункции
+// Процедура для загрузки курсов валют по определенному периоду.
+//
+// Параметры:
+// Валюты - Любая коллекция - со следующими полями:
+// КодВалюты - числовой код валюты.
+// Валюта - ссылка на валюту.
+// НачалоПериодаЗагрузки - Дата - начало периода загрузки курсов.
+// ОкончаниеПериодаЗагрузки - Дата - окончание периода загрузки курсов.
+//
+// Возвращаемое значение:
+// Массив состояния загрузки - каждый элемент - структура с полями.
+// Валюта - загружаемая валюта.
+// СтатусОперации - завершилась ли загрузка успешно.
+// Сообщение - пояснение о загрузке (текст сообщения об ошибке или поясняющее сообщение).
+//
+Функция ЗагрузитьКурсыВалютПоПараметрам(Знач Валюты, Знач НачалоПериодаЗагрузки, Знач ОкончаниеПериодаЗагрузки,
+ ПриЗагрузкеВозниклиОшибки = Ложь) Экспорт
+
+ СостояниеЗагрузки = Новый Массив;
+
+ ПриЗагрузкеВозниклиОшибки = Ложь;
+
+ СерверИсточник = "cbrates.rbc.ru";
+
+ Если НачалоПериодаЗагрузки = ОкончаниеПериодаЗагрузки Тогда
+ Адрес = "tsv/";
+ ТМП = Формат(ОкончаниеПериодаЗагрузки, "ДФ=/yyyy/MM/dd"); // Не локализуется - путь к файлу на сервере.
+ Иначе
+ Адрес = "tsv/cb/";
+ ТМП = "";
+ КонецЕсли;
+
+ Для Каждого Валюта Из Валюты Цикл
+ ФайлНаВебСервере = "http://" + СерверИсточник + "/" + Адрес + Прав(Валюта.КодВалюты, 3) + ТМП + ".tsv";
+ Результат = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(ФайлНаВебСервере);
+
+ Если Результат.Статус Тогда
+ ПоясняющееСообщение = ЗагрузитьКурсВалютыИзФайла(Валюта.Валюта, Результат.Путь, НачалоПериодаЗагрузки, ОкончаниеПериодаЗагрузки) + Символы.ПС;
+ УдалитьФайлы(Результат.Путь);
+ СтатусОперации = ПустаяСтрока(ПоясняющееСообщение);
+ Иначе
+ ПоясняющееСообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Невозможно получить файл данных с курсами валюты (%1 - %2):
+ |%3
+ |Возможно, нет доступа к веб сайту с курсами валют, либо указана несуществующая валюта.'"),
+ Валюта.КодВалюты,
+ Валюта.Валюта,
+ Результат.СообщениеОбОшибке);
+ СтатусОперации = Ложь;
+ ПриЗагрузкеВозниклиОшибки = Истина;
+ КонецЕсли;
+
+ СостояниеЗагрузки.Добавить(Новый Структура("Валюта,СтатусОперации,Сообщение", Валюта.Валюта, СтатусОперации, ПоясняющееСообщение));
+
+ КонецЦикла;
+
+ Возврат СостояниеЗагрузки;
+
+КонецФункции
+
////////////////////////////////////////////////////////////////////////////////
// Обновление информационной базы.
diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/Module.bsl
index 7b99dee06..56a62b295 100644
--- a/SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/Module.bsl
+++ b/SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/Module.bsl
@@ -80,78 +80,3 @@
КонецФункции
#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-// Процедура для загрузки курсов валют по определенному периоду.
-//
-// Параметры:
-// Валюты - Любая коллекция - со следующими полями:
-// КодВалюты - числовой код валюты.
-// Валюта - ссылка на валюту.
-// НачалоПериодаЗагрузки - Дата - начало периода загрузки курсов.
-// ОкончаниеПериодаЗагрузки - Дата - окончание периода загрузки курсов.
-//
-// Возвращаемое значение:
-// Массив состояния загрузки - каждый элемент - структура с полями.
-// Валюта - загружаемая валюта.
-// СтатусОперации - завершилась ли загрузка успешно.
-// Сообщение - пояснение о загрузке (текст сообщения об ошибке или поясняющее сообщение).
-//
-Функция ЗагрузитьКурсыВалютПоПараметрам(Знач Валюты, Знач НачалоПериодаЗагрузки, Знач ОкончаниеПериодаЗагрузки,
- ПриЗагрузкеВозниклиОшибки = Ложь) Экспорт
-
- СостояниеЗагрузки = Новый Массив;
-
- ПриЗагрузкеВозниклиОшибки = Ложь;
-
- СерверИсточник = "cbrates.rbc.ru";
-
- Если НачалоПериодаЗагрузки = ОкончаниеПериодаЗагрузки Тогда
- Адрес = "tsv/";
- ТМП = Формат(ОкончаниеПериодаЗагрузки, "ДФ=/yyyy/MM/dd"); // Не локализуется - путь к файлу на сервере.
- Иначе
- Адрес = "tsv/cb/";
- ТМП = "";
- КонецЕсли;
-
- Для Каждого Валюта Из Валюты Цикл
- ФайлНаВебСервере = "http://" + СерверИсточник + "/" + Адрес + Прав(Валюта.КодВалюты, 3) + ТМП + ".tsv";
-
- #Если Клиент Тогда
- Результат = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте(ФайлНаВебСервере);
- #Иначе
- Результат = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(ФайлНаВебСервере);
- #КонецЕсли
-
- Если Результат.Статус Тогда
- #Если Клиент Тогда
- ДвоичныеДанные = Новый ДвоичныеДанные(Результат.Путь);
- АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
- ПоясняющееСообщение = РаботаСКурсамиВалютВызовСервера.ЗагрузитьКурсВалютыИзФайла(Валюта.Валюта, АдресВоВременномХранилище, НачалоПериодаЗагрузки, ОкончаниеПериодаЗагрузки) + Символы.ПС;
- #Иначе
- ПоясняющееСообщение = РаботаСКурсамиВалют.ЗагрузитьКурсВалютыИзФайла(Валюта.Валюта, Результат.Путь, НачалоПериодаЗагрузки, ОкончаниеПериодаЗагрузки) + Символы.ПС;
- #КонецЕсли
- УдалитьФайлы(Результат.Путь);
- СтатусОперации = ПустаяСтрока(ПоясняющееСообщение);
- Иначе
- ПоясняющееСообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Невозможно получить файл данных с курсами валюты (%1 - %2):
- |%3
- |Возможно, нет доступа к веб сайту с курсами валют, либо указана несуществующая валюта.'"),
- Валюта.КодВалюты,
- Валюта.Валюта,
- Результат.СообщениеОбОшибке);
- СтатусОперации = Ложь;
- ПриЗагрузкеВозниклиОшибки = Истина;
- КонецЕсли;
-
- СостояниеЗагрузки.Добавить(Новый Структура("Валюта,СтатусОперации,Сообщение", Валюта.Валюта, СтатусОперации, ПоясняющееСообщение));
-
- КонецЦикла;
-
- Возврат СостояниеЗагрузки;
-
-КонецФункции
-
-#КонецОбласти
diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиВызовСервера/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиВызовСервера/Module.bsl
index b5245cbf2..f6933f346 100644
--- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиВызовСервера/Module.bsl
+++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиВызовСервера/Module.bsl
@@ -35,4 +35,8 @@
Возврат ПравоДоступа("Добавление", Метаданные.Справочники.УчетныеЗаписиЭлектроннойПочты);
КонецФункции
+Функция УчетнаяЗаписьНастроена(УчетнаяЗапись) Экспорт
+ Возврат Справочники.УчетныеЗаписиЭлектроннойПочты.УчетнаяЗаписьНастроена(УчетнаяЗапись);
+КонецФункции
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl
index 81140c335..dee5ccae7 100644
--- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl
+++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl
@@ -67,7 +67,8 @@
Иначе
ТекстСообщения = НСтр("ru = 'Для отправки письма требуется настройка учетной записи электронной почты.
|Обратитесь к администратору.'");
- ПоказатьПредупреждение(, ТекстСообщения);
+ ОписаниеОповещения = Новый ОписаниеОповещения("ПроверитьНаличиеУчетнойЗаписиДляОтправкиПочтыЗавершение", ЭтотОбъект, ОбработчикРезультата);
+ ПоказатьПредупреждение(ОписаниеОповещения, ТекстСообщения);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
@@ -182,20 +183,9 @@
// которую нужно проверить.
//
Процедура ПроверитьУчетнуюЗапись(Знач УчетнаяЗапись) Экспорт
-
ОчиститьСообщения();
-
Состояние(НСтр("ru = 'Проверка учетной записи'"),,НСтр("ru = 'Выполняется проверка учетной записи. Подождите...'"));
-
- Если РаботаСПочтовымиСообщениямиВызовСервера.ПарольЗадан(УчетнаяЗапись) Тогда
- ПроверитьВозможностьОтправкиИПолученияЭлектроннойПочты(Неопределено, УчетнаяЗапись, Неопределено);
- Иначе
- ПараметрыФормы = Новый Структура;
- ПараметрыФормы.Вставить("УчетнаяЗапись", УчетнаяЗапись);
- ПараметрыФормы.Вставить("ПроверитьВозможностьОтправкиИПолучения", Истина);
- ОткрытьФорму("ОбщаяФорма.ПодтверждениеПароляУчетнойЗаписи", ПараметрыФормы);
- КонецЕсли;
-
+ ПроверитьВозможностьОтправкиИПолученияЭлектроннойПочты(Неопределено, УчетнаяЗапись, Неопределено);
КонецПроцедуры
// Проверка учетной записи электронной почты.
@@ -222,4 +212,8 @@
КонецПроцедуры
+Процедура ПроверитьНаличиеУчетнойЗаписиДляОтправкиПочтыЗавершение(ОбработчикРезультата) Экспорт
+ ВыполнитьОбработкуОповещения(ОбработчикРезультата, Ложь);
+КонецПроцедуры
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl
index ae1a6c7f2..73e5afb8c 100644
--- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl
@@ -32,6 +32,22 @@
КонецПроцедуры
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.Справочники.УчетныеЗаписиЭлектроннойПочты.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
// Заполняет перечень запросов внешних разрешений, которые обязательно должны быть предоставлены
// при создании информационной базы или обновлении программы.
//
@@ -310,7 +326,7 @@
Если ТипЗнч(Соединение) <> Тип("ИнтернетПочта") Тогда
ПараметрыПисьма.Свойство("Пароль", Пароль);
- Профиль = ИнтернетПочтовыйПрофиль(УчетнаяЗапись);
+ Профиль = ИнтернетПочтовыйПрофиль(УчетнаяЗапись, , Пароль);
Соединение = Новый ИнтернетПочта;
Соединение.Подключиться(Профиль);
КонецЕсли;
@@ -378,6 +394,8 @@
// Заголовки или идентификаторы писем, полные сообщения по которым требуется получить.
Перем ЗаголовкиИдентификаторы;
+ Перем Пароль;
+
Если ПараметрыЗагрузки.Свойство("РежимТестирования") Тогда
РежимТестирования = ПараметрыЗагрузки.РежимТестирования;
Иначе
@@ -390,7 +408,8 @@
ПолучениеЗаголовков = Ложь;
КонецЕсли;
- Профиль = ИнтернетПочтовыйПрофиль(УчетнаяЗапись, Истина);
+ ПараметрыЗагрузки.Свойство("Пароль", Пароль);
+ Профиль = ИнтернетПочтовыйПрофиль(УчетнаяЗапись, Истина, Пароль);
Если ПараметрыЗагрузки.Свойство("ЗаголовкиИдентификаторы") Тогда
ЗаголовкиИдентификаторы = ПараметрыЗагрузки.ЗаголовкиИдентификаторы;
@@ -414,16 +433,16 @@
НаборПисем = Соединение.ПолучитьЗаголовки();
Иначе
- НастройкиТранспорта = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(УчетнаяЗапись, "ОставлятьКопииСообщенийНаСервере,ПериодХраненияСообщенийНаСервере");
+ НастройкиТранспорта = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(УчетнаяЗапись, "ПротоколВходящейПочты,ОставлятьКопииСообщенийНаСервере,ПериодХраненияСообщенийНаСервере");
+ Если НастройкиТранспорта.ПротоколВходящейПочты = "IMAP" Тогда
+ НастройкиТранспорта.ОставлятьКопииСообщенийНаСервере = Истина;
+ НастройкиТранспорта.ПериодХраненияСообщенийНаСервере = 0;
+ КонецЕсли;
+
Если НастройкиТранспорта.ОставлятьКопииСообщенийНаСервере Тогда
-
- Если ЗаголовкиИдентификаторы.Количество() =0
- И НастройкиТранспорта.ПериодХраненияСообщенийНаСервере > 0 Тогда
-
+ Если ЗаголовкиИдентификаторы.Количество() = 0 И НастройкиТранспорта.ПериодХраненияСообщенийНаСервере > 0 Тогда
Заголовки = Соединение.ПолучитьЗаголовки();
-
НаборСообщенийДляУдаления = Новый Массив;
-
Для Каждого ЭлементЗаголовок Из Заголовки Цикл
ТекущаяДата = ТекущаяДатаСеанса();
РазницаДат = (ТекущаяДата - ЭлементЗаголовок.ДатаОтправления) / (3600*24);
@@ -431,15 +450,10 @@
НаборСообщенийДляУдаления.Добавить(ЭлементЗаголовок);
КонецЕсли;
КонецЦикла;
-
КонецЕсли;
-
АвтоматическиУдалятьСообщенияПриВыбореССервера = Ложь;
-
Иначе
-
АвтоматическиУдалятьСообщенияПриВыбореССервера = Истина;
-
КонецЕсли;
НаборПисем = Соединение.Выбрать(АвтоматическиУдалятьСообщенияПриВыбореССервера, ЗаголовкиИдентификаторы);
@@ -500,7 +514,7 @@
// ИнтернетПочтовыйПрофиль - профиль учетной записи;
// Неопределено - не удалось получить учетную запись по ссылке.
//
-Функция ИнтернетПочтовыйПрофиль(УчетнаяЗапись, ДляПолучения = Ложь) Экспорт
+Функция ИнтернетПочтовыйПрофиль(УчетнаяЗапись, ДляПолучения = Ложь, Знач Пароль = Неопределено) Экспорт
ТекстЗапроса =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
@@ -538,10 +552,9 @@
Если Выборка.Следующий() Тогда
СписокСвойствIMAP = "АдресСервераIMAP,ПортIMAP,ИспользоватьSSLIMAP,ПользовательIMAP,ПарольIMAP,ТолькоЗащищеннаяАутентификацияIMAP";
СписокСвойствPOP3 = "АдресСервераPOP3,ПортPOP3,ИспользоватьSSLPOP3,Пользователь,Пароль,ТолькоЗащищеннаяАутентификацияPOP3";
- СписокСвойствSMTP = "АдресСервераSMTP,ПортSMTP,ИспользоватьSSLSMTP,POP3ПередSMTP,ПользовательSMTP,ПарольSMTP,ТолькоЗащищеннаяАутентификацияSMTP";
+ СписокСвойствSMTP = "АдресСервераSMTP,ПортSMTP,ИспользоватьSSLSMTP,ПользовательSMTP,ПарольSMTP,ТолькоЗащищеннаяАутентификацияSMTP";
- ТребуемыеСвойства = Неопределено;
- ИсключаемыеСвойства = Неопределено;
+ ТребуемыеСвойства = "";
Если ДляПолучения Тогда
Если Выборка.Протокол = "IMAP" Тогда
@@ -551,16 +564,26 @@
КонецЕсли;
Иначе
ТребуемыеСвойства = СписокСвойствSMTP;
+ Если Выборка.Протокол <> "IMAP" И Выборка.POP3ПередSMTP Тогда
+ ТребуемыеСвойства = ТребуемыеСвойства + ",POP3ПередSMTP," + СписокСвойствPOP3;
+ КонецЕсли;
КонецЕсли;
ТребуемыеСвойства = ТребуемыеСвойства + ",Таймаут";
- Если Выборка.POP3ПередSMTP Тогда
- ТребуемыеСвойства = Неопределено;
- ИсключаемыеСвойства = СписокСвойствIMAP;
- КонецЕсли;
-
Результат = Новый ИнтернетПочтовыйПрофиль;
- ЗаполнитьЗначенияСвойств(Результат, Выборка, ТребуемыеСвойства, ИсключаемыеСвойства);
+ ЗаполнитьЗначенияСвойств(Результат, Выборка, ТребуемыеСвойства);
+
+ Если Пароль <> Неопределено Тогда
+ Если ПустаяСтрока(Результат.Пароль) Тогда
+ Результат.Пароль = Пароль;
+ КонецЕсли;
+ Если ПустаяСтрока(Результат.ПарольIMAP) Тогда
+ Результат.ПарольIMAP = Пароль;
+ КонецЕсли;
+ Если ПустаяСтрока(Результат.ПарольSMTP) Тогда
+ Результат.ПарольSMTP = Пароль;
+ КонецЕсли;
+ КонецЕсли;
КонецЕсли;
Возврат Результат;
@@ -870,13 +893,7 @@
ПараметрыПисьма.Вставить("Пароль", Пароль);
КонецЕсли;
- Попытка
- РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма);
- Исключение
- ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,
- УчетнаяЗапись, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
- ВызватьИсключение;
- КонецПопытки;
+ РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма);
КонецПроцедуры
diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl
index fe6cc9490..a95be6998 100644
--- a/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl
@@ -495,6 +495,24 @@
КонецПроцедуры
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.Справочники.ПапкиФайлов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.Файлы.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ВерсииФайлов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl
index 4272bffba..034caf7a5 100644
--- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl
+++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl
@@ -707,7 +707,7 @@
// Возвращаемое значение:
// Булево - Истина, если создание версии выполнено (и файл бинарно изменен).
//
-Функция ОпубликоватьИОсвободитьФайл(ДанныеФайла, СведенияОФайле,
+Функция СохранитьИзмененияИОсвободитьФайл(ДанныеФайла, СведенияОФайле,
НеМенятьЗаписьВРабочемКаталоге, ПолныйПутьКФайлу, РабочийКаталогПользователя,
УникальныйИдентификаторФормы = Неопределено) Экспорт
@@ -770,17 +770,17 @@
// * Успешно - Булево - Истина, если создание версии выполнено (и файл бинарно изменен).
// * ДанныеФайла - Структура - структура с данными файла.
//
-Функция ОпубликоватьИОсвободитьФайлПоСсылке(ФайлСсылка, СведенияОФайле,
+Функция СохранитьИзмененияИОсвободитьФайлПоСсылке(ФайлСсылка, СведенияОФайле,
ПолныйПутьКФайлу, РабочийКаталогПользователя, УникальныйИдентификаторФормы = Неопределено) Экспорт
ДанныеФайла = ДанныеФайла(ФайлСсылка);
- ВерсияСоздана = ОпубликоватьИОсвободитьФайл(ДанныеФайла, СведенияОФайле, Ложь, ПолныйПутьКФайлу, РабочийКаталогПользователя,
+ ВерсияСоздана = СохранитьИзмененияИОсвободитьФайл(ДанныеФайла, СведенияОФайле, Ложь, ПолныйПутьКФайлу, РабочийКаталогПользователя,
УникальныйИдентификаторФормы);
Возврат Новый Структура("Успешно,ДанныеФайла", ВерсияСоздана, ДанныеФайла);
КонецФункции
-// Предназначена для опубликования файла без его освобождения.
+// Предназначена для записи изменений файла без его освобождения.
//
// Параметры:
// ДанныеФайла - Структура - структура с данными файла.
@@ -797,7 +797,7 @@
// Возвращаемое значение:
// Булево - Истина, если создание версии выполнено (и файл бинарно изменен).
//
-Функция ОпубликоватьФайл(ФайлСсылка, СведенияОФайле,
+Функция СохранитьИзмененияФайла(ФайлСсылка, СведенияОФайле,
НеМенятьЗаписьВРабочемКаталоге, ОтносительныйПутьКФайлу, ПолныйПутьКФайлу, ВРабочемКаталогеВладельца,
УникальныйИдентификаторФормы = Неопределено) Экспорт
@@ -1427,7 +1427,7 @@
КонецПроцедуры
-// Для опубликования файла без его освобождения.
+// Для записи изменений файла без его освобождения.
//
// Параметры:
// ФайлСсылка - Структура - структура с данными файла.
@@ -1445,7 +1445,7 @@
// * Успешно - Булево - Истина, если создание версии выполнено (и файл бинарно изменен).
// * ДанныеФайла - Структура - структура с данными файла.
//
-Функция ПолучитьДанныеФайлаИОпубликоватьФайл(ФайлСсылка, СведенияОФайле,
+Функция ПолучитьДанныеФайлаИСохранитьИзмененияФайла(ФайлСсылка, СведенияОФайле,
ОтносительныйПутьКФайлу, ПолныйПутьКФайлу, ВРабочемКаталогеВладельца,
УникальныйИдентификаторФормы = Неопределено) Экспорт
@@ -1454,7 +1454,7 @@
ВызватьИсключение НСтр("ru = 'Файл не занят текущим пользователем'");
КонецЕсли;
- ВерсияСоздана = ОпубликоватьФайл(ФайлСсылка, СведенияОФайле,
+ ВерсияСоздана = СохранитьИзмененияФайла(ФайлСсылка, СведенияОФайле,
Ложь, ОтносительныйПутьКФайлу, ПолныйПутьКФайлу, ВРабочемКаталогеВладельца,
УникальныйИдентификаторФормы);
Возврат Новый Структура("Успешно,ДанныеФайла", ВерсияСоздана, ДанныеФайла);
diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl
index 1c8808008..37fa9fc14 100644
--- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl
+++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl
@@ -133,7 +133,7 @@
Процедура ОсвободитьФайлБезВопроса(ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт
РаботаСФайламиСлужебныйВызовСервера.ОсвободитьФайл(ДанныеФайла, УникальныйИдентификатор);
- РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами();
+ РасширениеПодключено = ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено();
Если РасширениеПодключено Тогда
ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, Истина, ДанныеФайла.РабочийКаталогВладельца <> "");
КонецЕсли;
@@ -177,12 +177,12 @@
// Завершить редактирования Файла и поместить его на сервер.
//
// Параметры:
-// Параметры - Структура - см. ПараметрыПубликацииФайла.
+// Параметры - Структура - см. ПараметрыОбновленияФайла.
//
Процедура ЗакончитьРедактирование(Параметры)
Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеПослеУстановкиРасширения", ЭтотОбъект, Параметры);
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
+ ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
КонецПроцедуры
@@ -190,7 +190,7 @@
Процедура ЗакончитьРедактированиеПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт
ПараметрыВыполнения.Вставить("ДанныеФайла", Неопределено);
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
ЗакончитьРедактированиеСРасширением(ПараметрыВыполнения);
Иначе
ЗакончитьРедактированиеБезРасширения(ПараметрыВыполнения);
@@ -362,125 +362,69 @@
СтараяВерсия = ПараметрыВыполнения.ДанныеФайла.ТекущаяВерсия;
+ Если Не ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда
+ ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован(, ПараметрыВыполнения);
+ Возврат;
+ КонецЕсли;
+
// Файл с признаком шифрован снова шифруется для тех же сертификатов.
- Если ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда
-
- Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
- Возврат;
- КонецЕсли;
- МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент");
-
- ПараметрыВыполнения.Вставить("МенеджерКриптографии",
- МодульЭлектроннаяПодписьКлиент.МенеджерКриптографии("Шифрование"));
-
- ПараметрыВыполнения.Вставить("МассивСертификатов", Новый Массив);
-
- Для Каждого СтруктураСертификата Из ПараметрыВыполнения.ДанныеФайла.МассивСертификатовШифрования Цикл
- Сертификат = Неопределено;
- Если СтруктураСертификата.Сертификат <> Неопределено Тогда
- Сертификат = Новый СертификатКриптографии(СтруктураСертификата.Сертификат);
- Иначе
- Сертификат = МодульЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(
- СтруктураСертификата.Отпечаток, Ложь);
- КонецЕсли;
- ПараметрыВыполнения.МассивСертификатов.Добавить(Сертификат);
- КонецЦикла;
-
- Если ПараметрыВыполнения.МассивСертификатов.Количество() = 0 Тогда
- ПоказатьПредупреждение(,
- НСтр("ru = 'У зашифрованного файла не указаны сертификаты.
- |Расшифруйте файл и зашифруйте заново.'"));
- ЗакончитьРедактированиеСРасширениемПослеВыбораСертификатовДляШифрования(, ПараметрыВыполнения);
- Возврат;
- КонецЕсли;
-
- ЗакончитьРедактированиеСРасширениемПослеПроверкиКоличестваСертификатов(ПараметрыВыполнения);
- Возврат;
- КонецЕсли;
- ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения);
+ ПараметрыВыполнения.Вставить("ОповещениеПослеШифрования", Новый ОписаниеОповещения(
+ "ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован", ЭтотОбъект, ПараметрыВыполнения));
+
+ ЗашифроватьФайлПередПомещениемВХранилищеФайлов(ПараметрыВыполнения);
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура ЗакончитьРедактированиеСРасширениемПослеВыбораСертификатовДляШифрования(ОписаниеСертификатов, ПараметрыВыполнения) Экспорт
-
- Если ТипЗнч(ОписаниеСертификатов) <> Тип("Структура") Тогда
- ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
- Возврат;
- КонецЕсли;
-
- ПараметрыВыполнения.МенеджерКриптографии = ОписаниеСертификатов.МенеджерКриптографии;
- ПараметрыВыполнения.МассивСертификатов = ОписаниеСертификатов.МассивСертификатов;
-
- ЗаписатьСертификатыВТабличнуюЧасть(
- ПараметрыВыполнения.ДанныеФайла.Ссылка,
- ПараметрыВыполнения.МассивСертификатов,
- ПараметрыВыполнения.ИдентификаторФормы);
-
- ЗакончитьРедактированиеСРасширениемПослеПроверкиКоличестваСертификатов(ПараметрыВыполнения);
-
-КонецПроцедуры
-
-// Продолжение процедуры (см. выше).
-Процедура ЗакончитьРедактированиеСРасширениемПослеПроверкиКоличестваСертификатов(ПараметрыВыполнения)
-
- ПолноеИмяФайлаШифрованное = ПараметрыВыполнения.ПолныйПутьКФайлу + ".crp";
-
- ПараметрыВыполнения.МенеджерКриптографии.Зашифровать(
- ПараметрыВыполнения.ПолныйПутьКФайлу, ПолноеИмяФайлаШифрованное, ПараметрыВыполнения.МассивСертификатов);
-
- УдалитьФайлБезПодтверждения(ПараметрыВыполнения.ПолныйПутьКФайлу);
- ПереместитьФайл(ПолноеИмяФайлаШифрованное, ПараметрыВыполнения.ПолныйПутьКФайлу);
-
- ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения);
-
-КонецПроцедуры
-
-// Продолжение процедуры (см. выше).
-Процедура ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения)
+Процедура ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован(Неопределен, ПараметрыВыполнения) Экспорт
СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией", ПараметрыВыполнения.ФайлНовойВерсии);
СведенияОФайле.Комментарий = ПараметрыВыполнения.КомментарийКВерсии;
СведенияОФайле.ХранитьВерсии = ПараметрыВыполнения.СоздатьНовуюВерсию;
- РазмерВМб = СведенияОФайле.Размер / (1024 * 1024);
- ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Выполняется передача файла ""%1"" (%2 Мб)...
- |Пожалуйста, подождите.'"),
- ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб));
- Состояние(ТекстПояснения);
-
- ПомещаемыеФайлы = Новый Массив;
- Описание = Новый ОписаниеПередаваемогоФайла(ПараметрыВыполнения.ПолныйПутьКФайлу, "");
- ПомещаемыеФайлы.Добавить(Описание);
-
- ПомещенныеФайлы = Новый Массив;
- Попытка
- ФайлыПомещены = ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы,, Ложь, ПараметрыВыполнения.ИдентификаторФормы);
- Исключение
- ИнформацияОбОшибке = ИнформацияОбОшибке();
+ Если ПараметрыВыполнения.Свойство("АдресПослеШифрования") Тогда
+ СведенияОФайле.АдресВременногоХранилищаФайла = ПараметрыВыполнения.АдресПослеШифрования;
+ Иначе
+ РазмерВМб = СведенияОФайле.Размер / (1024 * 1024);
+ ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Выполняется передача файла ""%1"" (%2 Мб)...
+ |Пожалуйста, подождите.'"),
+ СведенияОФайле.ИмяБезРасширения,
+ ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб));
+ Состояние(ТекстПояснения);
- ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Не удалось поместить файл в хранилище файлов по причине:
- |""%1"".
- |
- |Повторить операцию?'"),
- КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+ ПомещаемыеФайлы = Новый Массив;
+ Описание = Новый ОписаниеПередаваемогоФайла(ПараметрыВыполнения.ПолныйПутьКФайлу, "");
+ ПомещаемыеФайлы.Добавить(Описание);
- Оповещение = Новый ОписаниеОповещения("ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрованПовтор", ЭтотОбъект, ПараметрыВыполнения);
- ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ПовторитьОтмена);
- Возврат;
- КонецПопытки;
+ ПомещенныеФайлы = Новый Массив;
+ Попытка
+ ФайлыПомещены = ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы,, Ложь, ПараметрыВыполнения.ИдентификаторФормы);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+
+ ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Не удалось поместить файл в хранилище файлов по причине:
+ |""%1"".
+ |
+ |Повторить операцию?'"),
+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+
+ Оповещение = Новый ОписаниеОповещения("ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрованПовтор", ЭтотОбъект, ПараметрыВыполнения);
+ ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ПовторитьОтмена);
+ Возврат;
+ КонецПопытки;
- Состояние();
- Если Не ФайлыПомещены Тогда
- ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
- Возврат;
- КонецЕсли;
-
- Если ПомещенныеФайлы.Количество() = 1 Тогда
- СведенияОФайле.АдресВременногоХранилищаФайла = ПомещенныеФайлы[0].Хранение;
+ Состояние();
+ Если Не ФайлыПомещены Тогда
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
+ Возврат;
+ КонецЕсли;
+
+ Если ПомещенныеФайлы.Количество() = 1 Тогда
+ СведенияОФайле.АдресВременногоХранилищаФайла = ПомещенныеФайлы[0].Хранение;
+ КонецЕсли;
КонецЕсли;
ОбщиеНастройкиРаботыСФайлами = ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами();
@@ -502,7 +446,7 @@
КонецЕсли;
Попытка
- ВерсияОбновлена = РаботаСФайламиСлужебныйВызовСервера.ОпубликоватьИОсвободитьФайл(ПараметрыВыполнения.ДанныеФайла, СведенияОФайле,
+ ВерсияОбновлена = РаботаСФайламиСлужебныйВызовСервера.СохранитьИзмененияИОсвободитьФайл(ПараметрыВыполнения.ДанныеФайла, СведенияОФайле,
НеМенятьЗаписьВРабочемКаталоге, ПараметрыВыполнения.ПолныйПутьКФайлу, ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(),
ПараметрыВыполнения.ИдентификаторФормы);
Исключение
@@ -544,11 +488,10 @@
//
Процедура ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрованПовтор(Результат, Параметр) Экспорт
Если Результат = КодВозвратаДиалога.Повторить Тогда
- ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован(Параметр);
+ ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован(, Параметр);
КонецЕсли;
КонецПроцедуры
-
// Продолжение процедуры (см. выше).
Процедура ЗакончитьРедактированиеСРасширениемПослеУдаленияФайлаИзРабочегоКаталога(Результат, ПараметрыВыполнения) Экспорт
@@ -582,11 +525,6 @@
// Продолжение процедуры (см. выше).
Процедура ЗакончитьРедактированиеСРасширениемПослеПоказаОповещения(Результат, ПараметрыВыполнения) Экспорт
- // Удаление зашифрованного файла из кэша.
- Если ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда
- УдалитьФайлБезПодтверждения(ПараметрыВыполнения.ПолныйПутьКФайлу);
- КонецЕсли;
-
ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина);
КонецПроцедуры
@@ -616,7 +554,7 @@
Возврат;
КонецЕсли;
- ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения);
+ ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован(, ПараметрыВыполнения);
КонецПроцедуры
@@ -733,32 +671,91 @@
Процедура ЗакончитьРедактированиеБезРасширенияПослеНапоминания(Результат, ПараметрыВыполнения) Экспорт
Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеБезРасширенияПослеЗагрузкиФайла", ЭтотОбъект, ПараметрыВыполнения);
- СтандартныеПодсистемыКлиент.ПоказатьПомещениеФайла(Обработчик, ПараметрыВыполнения.ИдентификаторФормы, ПараметрыВыполнения.ПолныйПутьКФайлу, Неопределено);
+ НачатьПомещениеФайла(Обработчик, , ПараметрыВыполнения.ПолныйПутьКФайлу, , ПараметрыВыполнения.ИдентификаторФормы);
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура ЗакончитьРедактированиеБезРасширенияПослеЗагрузкиФайла(ПомещенныеФайлы, ПараметрыВыполнения) Экспорт
+Процедура ЗакончитьРедактированиеБезРасширенияПослеЗагрузкиФайла(Помещен, Адрес, ВыбранноеИмяФайла, ПараметрыВыполнения) Экспорт
- Если ПомещенныеФайлы = Неопределено Или ПомещенныеФайлы.Количество() = 0 Тогда
+ Если Не Помещен Тогда
ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
Возврат;
КонецЕсли;
+ ПараметрыВыполнения.Вставить("АдресЗагруженногоФайла", Адрес);
+ ПараметрыВыполнения.Вставить("ВыбранноеИмяФайла", ВыбранноеИмяФайла);
+
+ Если ПараметрыВыполнения.ДанныеФайла = Неопределено Тогда
+ ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(ПараметрыВыполнения.ОбъектСсылка);
+ Иначе
+ ДанныеФайла = ПараметрыВыполнения.ДанныеФайла;
+ КонецЕсли;
+ Если Не ДанныеФайла.Зашифрован Тогда
+ ЗакончитьРедактированиеБезРасширенияПослеШифрованияФайла(Null, ПараметрыВыполнения);
+ Возврат;
+ КонецЕсли;
+ Если СертификатыНеУказаны(ДанныеФайла.МассивСертификатовШифрования) Тогда
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
+ Возврат;
+ КонецЕсли;
+
+ Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
+ Возврат;
+ КонецЕсли;
+
+ // Не нужно ПредложитьУстановкуРасширенияРаботыСФайлами(), т.к. все делается в памяти через ДвоичныеДанные.
+
+ ОписаниеДанных = Новый Структура;
+ ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Шифрование файла'"));
+ ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'"));
+ ОписаниеДанных.Вставить("Данные", Адрес);
+ ОписаниеДанных.Вставить("Представление", ПараметрыВыполнения.ОбъектСсылка);
+ ОписаниеДанных.Вставить("НаборСертификатов", ПараметрыВыполнения.ОбъектСсылка);
+ ОписаниеДанных.Вставить("БезПодтверждения", Истина);
+ ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь);
+
+ ОбработчикПродолжения = Новый ОписаниеОповещения("ЗакончитьРедактированиеБезРасширенияПослеШифрованияФайла",
+ ЭтотОбъект, ПараметрыВыполнения);
+
+ МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент");
+ МодульЭлектроннаяПодписьКлиент.Зашифровать(ОписаниеДанных, , ОбработчикПродолжения);
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+Процедура ЗакончитьРедактированиеБезРасширенияПослеШифрованияФайла(ОписаниеДанных, ПараметрыВыполнения) Экспорт
+
+ Если ОписаниеДанных = Null Тогда
+ Адрес = ПараметрыВыполнения.АдресЗагруженногоФайла;
+
+ ИначеЕсли Не ОписаниеДанных.Успех Тогда
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
+ Возврат;
+ Иначе
+ Если ТипЗнч(ОписаниеДанных.ЗашифрованныеДанные) = Тип("ДвоичныеДанные") Тогда
+ Адрес = ПоместитьВоВременноеХранилище(ОписаниеДанных.ЗашифрованныеДанные,
+ ПараметрыВыполнения.ИдентификаторФормы);
+ Иначе
+ Адрес = ОписаниеДанных.ЗашифрованныеДанные;
+ КонецЕсли;
+ КонецЕсли;
+
СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией");
- ОписаниеПереданногоФайла = ПомещенныеФайлы[0];
- СведенияОФайле.АдресВременногоХранилища = ОписаниеПереданногоФайла.Хранение;
+ СведенияОФайле.АдресВременногоХранилищаФайла = Адрес;
СведенияОФайле.Комментарий = ПараметрыВыполнения.КомментарийКВерсии;
- СтрокиПути = ОбщегоНазначенияКлиентСервер.РазложитьСтрокуПоТочкамИСлэшам(ОписаниеПереданногоФайла.Имя);
- Если СтрокиПути.Количество() >= 2 Тогда
- СведенияОФайле.РасширениеБезТочки = СтрокиПути[СтрокиПути.Количество() - 1];
- СведенияОФайле.ИмяБезРасширения = СтрокиПути[СтрокиПути.Количество() - 2];
+
+ СтруктураПути = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ПараметрыВыполнения.ВыбранноеИмяФайла);
+ Если Не ПустаяСтрока(СтруктураПути.Расширение) Тогда
+ СведенияОФайле.РасширениеБезТочки = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураПути.Расширение);
+ СведенияОФайле.ИмяБезРасширения = СтруктураПути.ИмяБезРасширения;
КонецЕсли;
СведенияОФайле.ХранитьВерсии = ПараметрыВыполнения.СоздатьНовуюВерсию;
Попытка
- Результат = РаботаСФайламиСлужебныйВызовСервера.ОпубликоватьИОсвободитьФайлПоСсылке(ПараметрыВыполнения.ОбъектСсылка,
+ Результат = РаботаСФайламиСлужебныйВызовСервера.СохранитьИзмененияИОсвободитьФайлПоСсылке(ПараметрыВыполнения.ОбъектСсылка,
СведенияОФайле, ПараметрыВыполнения.ПолныйПутьКФайлу, ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(),
ПараметрыВыполнения.ИдентификаторФормы);
ПараметрыВыполнения.ДанныеФайла = Результат.ДанныеФайла;
@@ -784,7 +781,7 @@
ШаблонПояснения, Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка)),
БиблиотекаКартинок.Информация32);
- Если Не ПараметрыВыполнения.ВерсияОбновлена Тогда
+ Если Не Результат.Успешно Тогда
Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеБезРасширенияПослеПоказаОповещения", ЭтотОбъект, ПараметрыВыполнения);
ПоказатьИнформациюФайлНеБылИзменен(Обработчик);
Возврат;
@@ -843,7 +840,7 @@
//
Процедура ОбновитьИзФайлаНаДиске(ОбработчикРезультата, ДанныеФайла, ИдентификаторФормы) Экспорт
- Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если Не ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
ВернутьРезультат(ОбработчикРезультата, Ложь);
Возврат;
КонецЕсли;
@@ -962,15 +959,19 @@
// Тут расшифровать и поставить ту же дату изменения, что и ДиалогПолноеИмяФайлаПрежнее.
- НачатьПомещениеФайла(Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеПередРасшифровкой", ЭтотОбъект, ПараметрыВыполнения),
- , ПараметрыВыполнения.ДиалогПолноеИмяФайлаПрежнее, Ложь, ПараметрыВыполнения.ИдентификаторФормы);
+ ПомещаемыеФайлы = Новый Массив;
+ ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПараметрыВыполнения.ДиалогПолноеИмяФайлаПрежнее);
+ ПомещаемыеФайлы.Добавить(ОписаниеФайла);
+
+ НачатьПомещениеФайлов(Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеПередРасшифровкой", ЭтотОбъект, ПараметрыВыполнения),
+ ПомещаемыеФайлы, , Ложь, ПараметрыВыполнения.ИдентификаторФормы);
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура ОбновитьИзФайлаНаДискеПередРасшифровкой(Результат, АдресФайла, ВыбранноеИмяФайла, ПараметрыВыполнения) Экспорт
+Процедура ОбновитьИзФайлаНаДискеПередРасшифровкой(ПомещаемыеФайлы, ПараметрыВыполнения) Экспорт
- Если Результат <> Истина Тогда
+ Если Не ЗначениеЗаполнено(ПомещаемыеФайлы) Тогда
ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
Возврат;
КонецЕсли;
@@ -980,10 +981,9 @@
КонецЕсли;
ОписаниеДанных = Новый Структура;
- ОписаниеДанных.Вставить("ИдентификаторФормы", ПараметрыВыполнения.ИдентификаторФормы);
ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Расшифровка файла'"));
ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'"));
- ОписаниеДанных.Вставить("Данные", АдресФайла);
+ ОписаниеДанных.Вставить("Данные", ПомещаемыеФайлы[0].Хранение);
ОписаниеДанных.Вставить("Представление", ПараметрыВыполнения.ДанныеФайла.Ссылка);
ОписаниеДанных.Вставить("СертификатыШифрования", Новый Массив);
ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь);
@@ -1013,7 +1013,11 @@
ПараметрыВыполнения.Вставить("АдресФайла", АдресФайла);
- Если Не ПолучитьФайл(АдресФайла, ПараметрыВыполнения.ДиалогПолноеИмяФайла, Ложь) Тогда
+ ПередаваемыеФайлы = Новый Массив;
+ ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПараметрыВыполнения.ДиалогПолноеИмяФайла, АдресФайла);
+ ПередаваемыеФайлы.Добавить(ОписаниеФайла);
+
+ Если Не ПолучитьФайлы(ПередаваемыеФайлы, , , Ложь) Тогда
ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
Возврат;
КонецЕсли;
@@ -1179,13 +1183,13 @@
Обработчик = Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеПослеЗавершенияРедактирования", ЭтотОбъект, ПараметрыВыполнения);
Если ПараметрыВыполнения.РедактируетТекущийПользователь Тогда // Файл уже был занят.
- ПараметрыОбработчика = ПараметрыПубликацииФайла(Обработчик, ПараметрыВыполнения.ДанныеФайла.Ссылка, ПараметрыВыполнения.ИдентификаторФормы);
+ ПараметрыОбработчика = ПараметрыОбновленияФайла(Обработчик, ПараметрыВыполнения.ДанныеФайла.Ссылка, ПараметрыВыполнения.ИдентификаторФормы);
ПараметрыОбработчика.ПереданныйПолныйПутьКФайлу = ПереданныйПолныйПутьКФайлу;
ПараметрыОбработчика.СоздатьНовуюВерсию = ПараметрыВыполнения.СоздатьНовуюВерсию;
ПараметрыОбработчика.КомментарийКВерсии = ПараметрыВыполнения.КомментарийКВерсии;
- ОпубликоватьФайл(ПараметрыОбработчика);
+ СохранитьИзмененияФайла(ПараметрыОбработчика);
Иначе
- ПараметрыОбработчика = ПараметрыПубликацииФайла(Обработчик, ПараметрыВыполнения.ДанныеФайла.Ссылка, ПараметрыВыполнения.ИдентификаторФормы);
+ ПараметрыОбработчика = ПараметрыОбновленияФайла(Обработчик, ПараметрыВыполнения.ДанныеФайла.Ссылка, ПараметрыВыполнения.ИдентификаторФормы);
ПараметрыОбработчика.ХранитьВерсии = ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии;
ПараметрыОбработчика.РедактируетТекущийПользователь = ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь;
ПараметрыОбработчика.Редактирует = ПараметрыВыполнения.ДанныеФайла.Редактирует;
@@ -1230,7 +1234,7 @@
Обработчик = Новый ОписаниеОповещения("ЗанятьФайлПоСсылкеПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика);
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
+ ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
КонецПроцедуры
@@ -1247,7 +1251,7 @@
Возврат;
КонецЕсли;
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
НаЧтение = Ложь;
ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> "";
ПеререгистрироватьФайлВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца);
@@ -1282,7 +1286,7 @@
Обработчик = Новый ОписаниеОповещения("ЗанятьФайлыПоСсылкамПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика);
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
+ ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
КонецПроцедуры
@@ -1314,7 +1318,7 @@
Продолжить;
КонецЕсли;
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
НаЧтение = Ложь;
ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> "";
ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца);
@@ -1363,7 +1367,7 @@
Обработчик = Новый ОписаниеОповещения("РедактироватьФайлПоСсылкеПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика);
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
+ ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
КонецПроцедуры
@@ -1371,7 +1375,7 @@
Процедура РедактироватьФайлПоСсылкеПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт
ПараметрыВыполнения.Вставить("ДанныеФайла", Неопределено);
- ПараметрыВыполнения.Вставить("РасширениеПодключено", ПодключитьРасширениеРаботыСФайлами());
+ ПараметрыВыполнения.Вставить("РасширениеПодключено", ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено());
ТекстОшибки = "";
ДанныеПолучены = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытияИЗанятьФайл(ПараметрыВыполнения.ОбъектСсылка,
@@ -1419,8 +1423,10 @@
"",
ПараметрыВыполнения.УникальныйИдентификатор);
Иначе
- Обработчик = Новый ОписаниеОповещения("РедактироватьФайлПоСсылкеБезРасширенияПослеНапоминания", ЭтотОбъект, ПараметрыВыполнения);
- ФайловыеФункцииСлужебныйКлиент.ВывестиНапоминаниеПриРедактировании(Обработчик);
+ ЗаполнитьВременныйИдентификаторФормы(ПараметрыВыполнения.УникальныйИдентификатор, ПараметрыВыполнения);
+
+ Обработчик = Новый ОписаниеОповещения("РедактироватьФайлПоСсылкеЗавершение", ЭтотОбъект, ПараметрыВыполнения);
+ ОткрытьФайлБезРасширения(Обработчик, ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.УникальныйИдентификатор);
КонецЕсли;
КонецПроцедуры
@@ -1432,25 +1438,16 @@
ОткрытьФайлПриложением(ПараметрыВыполнения.ДанныеФайла, Результат.ПолноеИмяФайла, ПараметрыВыполнения.ОбработчикРезультата);
КонецЕсли;
- ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина);
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Результат.ФайлПолучен = Истина);
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура РедактироватьФайлПоСсылкеБезРасширенияПослеНапоминания(Результат, ПараметрыВыполнения) Экспорт
+Процедура РедактироватьФайлПоСсылкеЗавершение(Результат, ПараметрыВыполнения) Экспорт
- ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(
- ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии,
- ПараметрыВыполнения.ДанныеФайла.Расширение);
+ ОчиститьВременныйИдентификаторФормы(ПараметрыВыполнения);
- ПолучитьФайл(ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии, ИмяФайла, Истина);
-
- // Для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения.
- Если ЭтоАдресВременногоХранилища(ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии) Тогда
- УдалитьИзВременногоХранилища(ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии);
- КонецЕсли;
-
- ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина);
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Результат = Истина);
КонецПроцедуры
@@ -1473,7 +1470,7 @@
Обработчик = Новый ОписаниеОповещения("РедактироватьФайлПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика);
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
+ ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
КонецПроцедуры
@@ -1518,17 +1515,18 @@
Возврат;
КонецЕсли;
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
Обработчик = Новый ОписаниеОповещения("РедактироватьФайлСРасширениемПослеПолученияФайлаВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения);
ПолучитьФайлВерсииВРабочийКаталог(
Обработчик,
ПараметрыВыполнения.ДанныеФайла,
"",
- ПараметрыВыполнения.УникальныйИдентификатор
- );
+ ПараметрыВыполнения.УникальныйИдентификатор);
Иначе
- Обработчик = Новый ОписаниеОповещения("РедактироватьФайлБезРасширенияПослеНапоминания", ЭтотОбъект, ПараметрыВыполнения);
- ФайловыеФункцииСлужебныйКлиент.ВывестиНапоминаниеПриРедактировании(Обработчик);
+ ЗаполнитьВременныйИдентификаторФормы(ПараметрыВыполнения.УникальныйИдентификатор, ПараметрыВыполнения);
+
+ Обработчик = Новый ОписаниеОповещения("РедактироватьФайлБезРасширенияЗавершение", ЭтотОбъект, ПараметрыВыполнения);
+ ОткрытьФайлБезРасширения(Обработчик, ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.УникальныйИдентификатор);
КонецЕсли;
КонецПроцедуры
@@ -1536,29 +1534,20 @@
// Продолжение процедуры (см. выше).
Процедура РедактироватьФайлСРасширениемПослеПолученияФайлаВРабочийКаталог(Результат, ПараметрыВыполнения) Экспорт
- Если Результат.ФайлПолучен Тогда
+ Если Результат.ФайлПолучен = Истина Тогда
ОткрытьФайлПриложением(ПараметрыВыполнения.ДанныеФайла, Результат.ПолноеИмяФайла);
КонецЕсли;
- ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина);
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Результат.ФайлПолучен = Истина);
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура РедактироватьФайлБезРасширенияПослеНапоминания(Результат, ПараметрыВыполнения) Экспорт
+Процедура РедактироватьФайлБезРасширенияЗавершение(Результат, ПараметрыВыполнения) Экспорт
- ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(
- ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии,
- ПараметрыВыполнения.ДанныеФайла.Расширение);
+ ОчиститьВременныйИдентификаторФормы(ПараметрыВыполнения);
- ПолучитьФайл(ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии, ИмяФайла, Истина);
-
- // При хранении файлов на диске (на сервере) удалить файл из временного хранилища после получения.
- Если ЭтоАдресВременногоХранилища(ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии) Тогда
- УдалитьИзВременногоХранилища(ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии);
- КонецЕсли;
-
- ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина);
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Результат = Истина);
КонецПроцедуры
@@ -1581,14 +1570,14 @@
Обработчик = Новый ОписаниеОповещения("ОткрытьВерсиюФайлаПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика);
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
+ ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
КонецПроцедуры
// Продолжение процедуры (см. выше).
Процедура ОткрытьВерсиюФайлаПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
Обработчик = Новый ОписаниеОповещения("ОткрытьВерсиюФайлаПослеПолученияФайлаВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения);
ПолучитьФайлВерсииВРабочийКаталог(
Обработчик,
@@ -1604,10 +1593,6 @@
ПолучитьФайл(Адрес, ИмяФайла, Истина);
- // При хранении файлов на диске (на сервере) удалить файл из временного хранилища после получения.
- Если ЭтоАдресВременногоХранилища(Адрес) Тогда
- УдалитьИзВременногоХранилища(Адрес);
- КонецЕсли;
ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено);
КонецЕсли;
@@ -1641,7 +1626,7 @@
Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлыПоСсылкамПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика);
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
+ ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
КонецПроцедуры
@@ -1669,7 +1654,7 @@
КонецЦикла;
- РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами();
+ РасширениеПодключено = ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено();
Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлыПоСсылкамПослеОтветаНаВопросОтменитьРедактирование", ЭтотОбъект, ПараметрыВыполнения);
@@ -1756,7 +1741,7 @@
Процедура ОсвободитьФайл(ПараметрыОсвобожденияФайла)
Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОсвобожденияФайла);
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
+ ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
КонецПроцедуры
@@ -1825,7 +1810,7 @@
РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИОсвободитьФайл(ПараметрыВыполнения.ОбъектСсылка,
ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.УникальныйИдентификатор);
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
НаЧтение = Истина;
ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> "";
ПеререгистрироватьФайлВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца);
@@ -1846,121 +1831,9 @@
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
-// Публикация файлов.
+// Запись изменений файла.
-// Публикует файлы.
-//
-// Параметры:
-// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода.
-// МассивФайлов - Массив - массив файлов.
-// ИдентификаторФормы - УникальныйИдентификатор управляемой формы.
-//
-Процедура ОпубликоватьФайлыПоСсылкам(ОбработчикРезультата, Знач МассивФайлов, ИдентификаторФормы) Экспорт
-
- ПараметрыОбработчика = Новый Структура;
- ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата);
- ПараметрыОбработчика.Вставить("МассивФайлов", МассивФайлов);
- ПараметрыОбработчика.Вставить("ИдентификаторФормы", ИдентификаторФормы);
-
- Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлыПоСсылкамПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика);
-
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
-
-КонецПроцедуры
-
-// Продолжение процедуры (см. выше).
-Процедура ОпубликоватьФайлыПоСсылкамПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт
-
- // Получение массива данных файлов.
- ПараметрыВыполнения.Вставить("ДанныеФайлов", Новый Массив);
- РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеДляМассиваФайлов(ПараметрыВыполнения.МассивФайлов, ПараметрыВыполнения.ДанныеФайлов);
- ВГраницаМассива = ПараметрыВыполнения.ДанныеФайлов.ВГраница();
-
- // Проверка возможности освобождения файлов.
- Для Инд = 0 По ВГраницаМассива Цикл
- ДанныеФайла = ПараметрыВыполнения.ДанныеФайлов[ВГраницаМассива - Инд];
-
- ТекстОшибки = "";
- МожноОсвободитьФайл = ВозможностьОсвободитьФайл(
- ДанныеФайла.Ссылка,
- ДанныеФайла.РедактируетТекущийПользователь,
- ДанныеФайла.Редактирует,
- ТекстОшибки);
- Если Не ТекстОшибки Тогда
- ПараметрыВыполнения.ДанныеФайлов.Удалить(ВГраницаМассива - Инд);
- КонецЕсли;
-
- КонецЦикла;
-
- РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами();
-
- ФормаВозврата = РаботаСФайламиСлужебныйКлиентПовтИсп.ФормаВозвратаФайла();
-
- СоздатьНовуюВерсию = Истина;
- СоздатьНовуюВерсиюДоступность = Истина;
-
- СтруктураПараметров = Новый Структура;
- СтруктураПараметров.Вставить("ФайлСсылка", Неопределено);
- СтруктураПараметров.Вставить("КомментарийКВерсии", "");
- СтруктураПараметров.Вставить("СоздатьНовуюВерсию", СоздатьНовуюВерсию);
- СтруктураПараметров.Вставить("СоздатьНовуюВерсиюДоступность", СоздатьНовуюВерсиюДоступность);
-
- ФормаВозврата.УстановитьПараметрыИспользования(СтруктураПараметров);
-
- Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлыПоСсылкамПослеПомещенияФайлаНаСервер", ЭтотОбъект, ПараметрыВыполнения);
- УстановитьОповещениеФормы(ФормаВозврата, Обработчик);
-
- ФормаВозврата.Открыть();
-
-КонецПроцедуры
-
-// Продолжение процедуры (см. выше).
-Процедура ОпубликоватьФайлыПоСсылкамПослеПомещенияФайлаНаСервер(Результат, ПараметрыВыполнения) Экспорт
-
- Если ТипЗнч(Результат) <> Тип("Структура") Тогда
- ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено);
- Возврат;
- КонецЕсли;
-
- КодВозврата = Результат.КодВозврата;
- Если КодВозврата <> КодВозвратаДиалога.ОК Тогда
- ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено);
- Возврат;
- КонецЕсли;
-
- СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию;
- КомментарийКВерсии = Результат.КомментарийКВерсии;
-
- Для Каждого Данные Из ПараметрыВыполнения.ДанныеФайлов Цикл
-
- ПараметрыОбработчика = ПараметрыПубликацииФайла(Неопределено, Данные.Ссылка, ПараметрыВыполнения.ИдентификаторФормы);
- ПараметрыОбработчика.ХранитьВерсии = Данные.ХранитьВерсии;
- ПараметрыОбработчика.РедактируетТекущийПользователь = Данные.РедактируетТекущийПользователь;
- ПараметрыОбработчика.Редактирует = Данные.Редактирует;
- ПараметрыОбработчика.АвторТекущейВерсии = Данные.АвторТекущейВерсии;
- ПараметрыОбработчика.СоздатьНовуюВерсию = СоздатьНовуюВерсию;
- ПараметрыОбработчика.КомментарийКВерсии = КомментарийКВерсии;
- ПараметрыОбработчика.ПоказыватьОповещение = Ложь;
- ОпубликоватьФайл(ПараметрыОбработчика);
-
- КонецЦикла;
-
- ПоказатьОповещениеПользователя(
- НСтр("ru = 'Сохранить изменения файлов'"),,
- СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Сохранены изменения файлов (%1 из %2).'"),
- ПараметрыВыполнения.ДанныеФайлов.Количество(),
- ПараметрыВыполнения.МассивФайлов.Количество()),
- БиблиотекаКартинок.Информация32);
-
- ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено);
-
-КонецПроцедуры
-
-////////////////////////////////////////////////////////////////////////////////
-// Публикация файла.
-
-Функция ПараметрыПубликацииФайла(ОбработчикРезультата, ОбъектСсылка, ИдентификаторФормы) Экспорт
+Функция ПараметрыОбновленияФайла(ОбработчикРезультата, ОбъектСсылка, ИдентификаторФормы) Экспорт
ПараметрыОбработчика = Новый Структура;
ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата);
@@ -1981,35 +1854,35 @@
КонецФункции
-// Начало публикации файла.
+// Начало записи изменений файла.
//
// Параметры:
-// ПараметрыПубликацииФайла - Структура - см. ПараметрыПубликацииФайла.
+// ПараметрыОбновленияФайла - Структура - см. ПараметрыОбновленияФайла.
//
-Процедура ОпубликоватьФайл(ПараметрыПубликацииФайла)
+Процедура СохранитьИзмененияФайла(ПараметрыОбновленияФайла)
- Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлПослеУстановкиРасширения", ЭтотОбъект, ПараметрыПубликацииФайла);
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
+ Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбновленияФайла);
+ ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура ОпубликоватьФайлПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт
+Процедура СохранитьИзмененияФайлаПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт
ПараметрыВыполнения.Вставить("ДанныеФайла", Неопределено);
ПараметрыВыполнения.Вставить("АдресВременногоХранилища", Неопределено);
ПараметрыВыполнения.Вставить("ПолныйПутьКФайлу", Неопределено);
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
- ОпубликоватьФайлСРасширением(ПараметрыВыполнения);
+ Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
+ СохранитьИзмененияФайлаСРасширением(ПараметрыВыполнения);
Иначе
- ОпубликоватьФайлБезРасширения(ПараметрыВыполнения);
+ СохранитьИзмененияФайлаБезРасширения(ПараметрыВыполнения);
КонецЕсли;
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура ОпубликоватьФайлСРасширением(ПараметрыВыполнения)
+Процедура СохранитьИзмененияФайлаСРасширением(ПараметрыВыполнения)
// Код для тонкого клиента, толстого клиента и веб-клиента с подключенным расширением.
ПараметрыВыполнения.ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог(ПараметрыВыполнения.ОбъектСсылка);
@@ -2054,7 +1927,7 @@
Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка));
КонецЕсли;
- Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлСРасширениемПослеОтветаНаВопросОсвободитьФайл", ЭтотОбъект, ПараметрыВыполнения);
+ Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаСРасширениемПослеОтветаНаВопросОсвободитьФайл", ЭтотОбъект, ПараметрыВыполнения);
ПоказатьВопрос(Обработчик, СтрокаПредупреждения, РежимДиалогаВопрос.ДаНет);
Возврат;
КонецЕсли;
@@ -2090,7 +1963,7 @@
ФормаВозврата.УстановитьПараметрыИспользования(СтруктураПараметров);
- Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлСРасширениемПослеПомещенияФайлаНаСервер", ЭтотОбъект, ПараметрыВыполнения);
+ Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаСРасширениемПослеПомещенияФайлаНаСервер", ЭтотОбъект, ПараметрыВыполнения);
УстановитьОповещениеФормы(ФормаВозврата, Обработчик);
ФормаВозврата.Открыть();
@@ -2109,14 +1982,14 @@
ПараметрыВыполнения.СоздатьНовуюВерсию = Ложь;
КонецЕсли;
- ОпубликоватьФайлСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения);
+ СохранитьИзмененияФайлаСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения);
КонецЕсли;
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура ОпубликоватьФайлСРасширениемПослеОтветаНаВопросОсвободитьФайл(Ответ, ПараметрыВыполнения) Экспорт
+Процедура СохранитьИзмененияФайлаСРасширениемПослеОтветаНаВопросОсвободитьФайл(Ответ, ПараметрыВыполнения) Экспорт
Если Ответ = КодВозвратаДиалога.Да Тогда
ОсвободитьФайлБезВопроса(ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.ИдентификаторФормы);
@@ -2127,7 +2000,7 @@
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура ОпубликоватьФайлСРасширениемПослеПомещенияФайлаНаСервер(Результат, ПараметрыВыполнения) Экспорт
+Процедура СохранитьИзмененияФайлаСРасширениемПослеПомещенияФайлаНаСервер(Результат, ПараметрыВыполнения) Экспорт
Если ТипЗнч(Результат) <> Тип("Структура") Тогда
ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
@@ -2143,125 +2016,63 @@
ПараметрыВыполнения.СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию;
ПараметрыВыполнения.КомментарийКВерсии = Результат.КомментарийКВерсии;
- ОпубликоватьФайлСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения);
+ СохранитьИзмененияФайлаСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения);
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура ОпубликоватьФайлСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения)
+Процедура СохранитьИзмененияФайлаСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения)
- ПараметрыВыполнения.Вставить("ПолноеИмяФайлаВременное", "");
-
- // Если файл с признаком шифрован, тогда при публикации
- // файл снова шифруется для тех же сертификатов.
- Если ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда
-
- Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
- Возврат;
- КонецЕсли;
-
- МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент");
-
- ПараметрыВыполнения.Вставить("МассивСертификатов", Новый Массив);
- ПараметрыВыполнения.Вставить("МенеджерКриптографии",
- МодульЭлектроннаяПодписьКлиент.МенеджерКриптографии("Шифрование"));
-
- Для Каждого СтруктураСертификата Из ПараметрыВыполнения.ДанныеФайла.МассивСертификатовШифрования Цикл
- Сертификат = Неопределено;
- Если СтруктураСертификата.Сертификат <> Неопределено Тогда
- Сертификат = Новый СертификатКриптографии(СтруктураСертификата.Сертификат);
- Иначе
- Сертификат = МодульЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(
- СтруктураСертификата.Отпечаток, Ложь);
- КонецЕсли;
- ПараметрыВыполнения.МассивСертификатов.Добавить(Сертификат);
- КонецЦикла;
-
- Если ПараметрыВыполнения.МассивСертификатов.Количество() = 0 Тогда
- ПоказатьПредупреждение(,
- НСтр("ru = 'У зашифрованного файла не указаны сертификаты.
- |Расшифруйте файл и зашифруйте заново.'"));
- ОпубликоватьФайлСРасширениемПослеВыбораСертификатовДляШифрования(, ПараметрыВыполнения);
- Возврат;
- КонецЕсли;
-
- ОпубликоватьФайлСРасширениемПослеПроверкиКоличестваСертификатов(ПараметрыВыполнения);
+ Если Не ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда
+ СохранитьИзмененияФайлаСРасширениемПослеПроверкиЗашифрован(, ПараметрыВыполнения);
Возврат;
КонецЕсли;
- ОпубликоватьФайлСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения);
+ // Файл с признаком шифрован снова шифруется для тех же сертификатов.
+
+ ПараметрыВыполнения.Вставить("ОповещениеПослеШифрования", Новый ОписаниеОповещения(
+ "СохранитьИзмененияФайлаСРасширениемПослеПроверкиЗашифрован", ЭтотОбъект, ПараметрыВыполнения));
+
+ ЗашифроватьФайлПередПомещениемВХранилищеФайлов(ПараметрыВыполнения);
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура ОпубликоватьФайлСРасширениемПослеВыбораСертификатовДляШифрования(ОписаниеСертификатов, ПараметрыВыполнения) Экспорт
-
- Если ТипЗнч(ОписаниеСертификатов) <> Тип("Структура") Тогда
- ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
- Возврат;
- КонецЕсли;
-
- ПараметрыВыполнения.МассивСертификатов = ОписаниеСертификатов.МассивСертификатов;
- ПараметрыВыполнения.МенеджерКриптографии = ОписаниеСертификатов.МенеджерКриптографии;
-
- ЗаписатьСертификатыВТабличнуюЧасть(
- ПараметрыВыполнения.ДанныеФайла.Ссылка,
- ПараметрыВыполнения.МассивСертификатов,
- ПараметрыВыполнения.ИдентификаторФормы);
-
- ОпубликоватьФайлСРасширениемПослеПроверкиКоличестваСертификатов(ПараметрыВыполнения);
-
-КонецПроцедуры
-
-// Продолжение процедуры (см. выше).
-Процедура ОпубликоватьФайлСРасширениемПослеПроверкиКоличестваСертификатов(ПараметрыВыполнения)
-
- ПолноеИмяФайлаШифрованное = ПараметрыВыполнения.ПолныйПутьКФайлу + ".crp";
-
- ПараметрыВыполнения.МенеджерКриптографии.Зашифровать(
- ПараметрыВыполнения.ПолныйПутьКФайлу,
- ПолноеИмяФайлаШифрованное,
- ПараметрыВыполнения.МассивСертификатов);
-
- ПараметрыВыполнения.ПолноеИмяФайлаВременное = ПараметрыВыполнения.ПолныйПутьКФайлу + ".bak";
- ПереместитьФайл(ПараметрыВыполнения.ПолныйПутьКФайлу, ПараметрыВыполнения.ПолноеИмяФайлаВременное);
- ПереместитьФайл(ПолноеИмяФайлаШифрованное, ПараметрыВыполнения.ПолныйПутьКФайлу);
-
- ОпубликоватьФайлСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения);
-
-КонецПроцедуры
-
-// Продолжение процедуры (см. выше).
-Процедура ОпубликоватьФайлСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения)
+Процедура СохранитьИзмененияФайлаСРасширениемПослеПроверкиЗашифрован(Неопределен, ПараметрыВыполнения) Экспорт
СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией", ПараметрыВыполнения.ФайлНовойВерсии);
- ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Выполняется передача файла ""%1"" (%2 Мб)...
- |Пожалуйста, подождите.'"),
- СведенияОФайле.ИмяБезРасширения,
- ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(СведенияОФайле.Размер / (1024 * 1024)));
- Состояние(ТекстПояснения);
-
- ПомещаемыеФайлы = Новый Массив;
- Описание = Новый ОписаниеПередаваемогоФайла(ПараметрыВыполнения.ПолныйПутьКФайлу, "");
- ПомещаемыеФайлы.Добавить(Описание);
-
- ПомещенныеФайлы = Новый Массив;
- ФайлыПомещены = ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ПараметрыВыполнения.ИдентификаторФормы);
-
- Состояние();
- Если Не ФайлыПомещены Тогда
- ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина);
- Возврат;
- КонецЕсли;
-
- Если ПомещенныеФайлы.Количество() = 1 Тогда
- ПараметрыВыполнения.АдресВременногоХранилища = ПомещенныеФайлы[0].Хранение;
- КонецЕсли;
- СведенияОФайле.АдресВременногоХранилищаФайла = ПараметрыВыполнения.АдресВременногоХранилища;
СведенияОФайле.Комментарий = ПараметрыВыполнения.КомментарийКВерсии;
СведенияОФайле.ХранитьВерсии = ПараметрыВыполнения.СоздатьНовуюВерсию;
+ Если ПараметрыВыполнения.Свойство("АдресПослеШифрования") Тогда
+ СведенияОФайле.АдресВременногоХранилищаФайла = ПараметрыВыполнения.АдресПослеШифрования;
+ Иначе
+ РазмерВМб = СведенияОФайле.Размер / (1024 * 1024);
+ ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Выполняется передача файла ""%1"" (%2 Мб)...
+ |Пожалуйста, подождите.'"),
+ СведенияОФайле.ИмяБезРасширения,
+ ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб));
+ Состояние(ТекстПояснения);
+
+ ПомещаемыеФайлы = Новый Массив;
+ Описание = Новый ОписаниеПередаваемогоФайла(ПараметрыВыполнения.ПолныйПутьКФайлу, "");
+ ПомещаемыеФайлы.Добавить(Описание);
+
+ ПомещенныеФайлы = Новый Массив;
+ ФайлыПомещены = ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ПараметрыВыполнения.ИдентификаторФормы);
+
+ Состояние();
+ Если Не ФайлыПомещены Тогда
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина);
+ Возврат;
+ КонецЕсли;
+
+ Если ПомещенныеФайлы.Количество() = 1 Тогда
+ СведенияОФайле.АдресВременногоХранилищаФайла = ПомещенныеФайлы[0].Хранение;
+ КонецЕсли;
+ КонецЕсли;
+
ОбщиеНастройкиРаботыСФайлами = ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами();
ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя();
@@ -2288,7 +2099,7 @@
НеМенятьЗаписьВРабочемКаталоге = Истина;
КонецЕсли;
- ВерсияОбновлена = РаботаСФайламиСлужебныйВызовСервера.ОпубликоватьФайл(ПараметрыВыполнения.ДанныеФайла.Ссылка, СведенияОФайле,
+ ВерсияОбновлена = РаботаСФайламиСлужебныйВызовСервера.СохранитьИзмененияФайла(ПараметрыВыполнения.ДанныеФайла.Ссылка, СведенияОФайле,
НеМенятьЗаписьВРабочемКаталоге, ОтносительныйПутьКФайлу, ПараметрыВыполнения.ПолныйПутьКФайлу,
ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> "", ПараметрыВыполнения.ИдентификаторФормы);
Если ПараметрыВыполнения.ПоказыватьОповещение Тогда
@@ -2303,30 +2114,25 @@
НСтр("ru = 'Новая версия не сохранена'"),,
НСтр("ru = 'Файл не изменился'"),
БиблиотекаКартинок.Информация32);
- Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлСРасширениемПослеПоказаОповещения", ЭтотОбъект, ПараметрыВыполнения);
+ Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаСРасширениемПослеПоказаОповещения", ЭтотОбъект, ПараметрыВыполнения);
ПоказатьИнформациюФайлНеБылИзменен(Обработчик);
Возврат;
КонецЕсли;
КонецЕсли;
- ОпубликоватьФайлСРасширениемПослеПоказаОповещения(-1, ПараметрыВыполнения);
+ СохранитьИзмененияФайлаСРасширениемПослеПоказаОповещения(-1, ПараметрыВыполнения);
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура ОпубликоватьФайлСРасширениемПослеПоказаОповещения(Результат, ПараметрыВыполнения) Экспорт
-
- // Удаление зашифрованного файла из кэша.
- Если ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда
- ПереместитьФайл(ПараметрыВыполнения.ПолноеИмяФайлаВременное, ПараметрыВыполнения.ПолныйПутьКФайлу);
- КонецЕсли;
+Процедура СохранитьИзмененияФайлаСРасширениемПослеПоказаОповещения(Результат, ПараметрыВыполнения) Экспорт
ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина);
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура ОпубликоватьФайлБезРасширения(ПараметрыВыполнения)
+Процедура СохранитьИзмененияФайлаБезРасширения(ПараметрыВыполнения)
Если ПараметрыВыполнения.ХранитьВерсии = Неопределено Тогда
ПараметрыВыполнения.ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(ПараметрыВыполнения.ОбъектСсылка);
@@ -2380,7 +2186,7 @@
ФормаВозврата.УстановитьПараметрыИспользования(СтруктураПараметров);
- Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлБезРасширенияПослеПомещенияФайлаНаСервер", ЭтотОбъект, ПараметрыВыполнения);
+ Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаБезРасширенияПослеПомещенияФайлаНаСервер", ЭтотОбъект, ПараметрыВыполнения);
УстановитьОповещениеФормы(ФормаВозврата, Обработчик);
ФормаВозврата.Открыть();
@@ -2399,14 +2205,14 @@
ПараметрыВыполнения.СоздатьНовуюВерсию = Ложь;
КонецЕсли;
- ОпубликоватьФайлБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения);
+ СохранитьИзмененияФайлаБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения);
КонецЕсли;
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура ОпубликоватьФайлБезРасширенияПослеПомещенияФайлаНаСервер(Результат, ПараметрыВыполнения) Экспорт
+Процедура СохранитьИзмененияФайлаБезРасширенияПослеПомещенияФайлаНаСервер(Результат, ПараметрыВыполнения) Экспорт
Если ТипЗнч(Результат) <> Тип("Структура") Тогда
ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
@@ -2421,48 +2227,105 @@
ПараметрыВыполнения.СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию;
ПараметрыВыполнения.КомментарийКВерсии = Результат.КомментарийКВерсии;
- ОпубликоватьФайлБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения);
+ СохранитьИзмененияФайлаБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения);
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура ОпубликоватьФайлБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения) Экспорт
+Процедура СохранитьИзмененияФайлаБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения) Экспорт
- Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлБезРасширенияПослеНапоминания", ЭтотОбъект, ПараметрыВыполнения);
+ Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаБезРасширенияПослеНапоминания", ЭтотОбъект, ПараметрыВыполнения);
ПоказатьНапоминаниеПередПоместитьФайл(Обработчик);
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура ОпубликоватьФайлБезРасширенияПослеНапоминания(Результат, ПараметрыВыполнения) Экспорт
+Процедура СохранитьИзмененияФайлаБезРасширенияПослеНапоминания(Результат, ПараметрыВыполнения) Экспорт
- Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлБезРасширенияПослеЗагрузкиФайла", ЭтотОбъект, ПараметрыВыполнения);
- СтандартныеПодсистемыКлиент.ПоказатьПомещениеФайла(Обработчик, ПараметрыВыполнения.ИдентификаторФормы, ПараметрыВыполнения.ПолныйПутьКФайлу, Неопределено);
+ Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаБезРасширенияПослеЗагрузкиФайла", ЭтотОбъект, ПараметрыВыполнения);
+ НачатьПомещениеФайла(Обработчик, , ПараметрыВыполнения.ПолныйПутьКФайлу, , ПараметрыВыполнения.ИдентификаторФормы);
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура ОпубликоватьФайлБезРасширенияПослеЗагрузкиФайла(ПомещенныеФайлы, ПараметрыВыполнения) Экспорт
+Процедура СохранитьИзмененияФайлаБезРасширенияПослеЗагрузкиФайла(Помещен, Адрес, ВыбранноеИмяФайла, ПараметрыВыполнения) Экспорт
- Если ПомещенныеФайлы = Неопределено Или ПомещенныеФайлы.Количество() = 0 Тогда
- ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина);
+ Если Не Помещен Тогда
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
Возврат;
КонецЕсли;
- СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией");
- ОписаниеПереданногоФайла = ПомещенныеФайлы[0];
- ВыбранныйПутьКФайлу = ОписаниеПереданногоФайла.Имя;
- ПараметрыВыполнения.АдресВременногоХранилища = ОписаниеПереданногоФайла.Хранение;
- СведенияОФайле.АдресВременногоХранилищаФайла = ОписаниеПереданногоФайла.Хранение;
- СведенияОФайле.ХранитьВерсии = ОписаниеПереданногоФайла.СоздатьНовуюВерсию;
+ ПараметрыВыполнения.Вставить("АдресЗагруженногоФайла", Адрес);
+ ПараметрыВыполнения.Вставить("ВыбранноеИмяФайла", ВыбранноеИмяФайла);
- СтрокиПути = ОбщегоНазначенияКлиентСервер.РазложитьСтрокуПоТочкамИСлэшам(ВыбранныйПутьКФайлу);
- Если СтрокиПути.Количество() >= 2 Тогда
- СведенияОФайле.РасширениеБезТочки = СтрокиПути[СтрокиПути.Количество() - 1];
- СведенияОФайле.ИмяБезРасширения = СтрокиПути[СтрокиПути.Количество() - 2];
+ Если ПараметрыВыполнения.ДанныеФайла = Неопределено Тогда
+ ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(ПараметрыВыполнения.ОбъектСсылка);
+ Иначе
+ ДанныеФайла = ПараметрыВыполнения.ДанныеФайла;
+ КонецЕсли;
+ Если Не ДанныеФайла.Зашифрован Тогда
+ СохранитьИзмененияФайлаБезРасширенияПослеШифрованияФайла(Null, ПараметрыВыполнения);
+ Возврат;
+ КонецЕсли;
+ Если СертификатыНеУказаны(ДанныеФайла.МассивСертификатовШифрования) Тогда
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
+ Возврат;
КонецЕсли;
- Результат = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИОпубликоватьФайл(ПараметрыВыполнения.ОбъектСсылка, СведенияОФайле,
+ Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
+ Возврат;
+ КонецЕсли;
+
+ // Не нужно ПредложитьУстановкуРасширенияРаботыСФайлами(), т.к. все делается в памяти через ДвоичныеДанные.
+
+ ОписаниеДанных = Новый Структура;
+ ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Шифрование файла'"));
+ ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'"));
+ ОписаниеДанных.Вставить("Данные", Адрес);
+ ОписаниеДанных.Вставить("Представление", ПараметрыВыполнения.ОбъектСсылка);
+ ОписаниеДанных.Вставить("НаборСертификатов", ПараметрыВыполнения.ОбъектСсылка);
+ ОписаниеДанных.Вставить("БезПодтверждения", Истина);
+ ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь);
+
+ ОбработчикПродолжения = Новый ОписаниеОповещения("СохранитьИзмененияФайлаБезРасширенияПослеШифрованияФайла",
+ ЭтотОбъект, ПараметрыВыполнения);
+
+ МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент");
+ МодульЭлектроннаяПодписьКлиент.Зашифровать(ОписаниеДанных, , ОбработчикПродолжения);
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+Процедура СохранитьИзмененияФайлаБезРасширенияПослеШифрованияФайла(ОписаниеДанных, ПараметрыВыполнения) Экспорт
+
+ Если ОписаниеДанных = Null Тогда
+ Адрес = ПараметрыВыполнения.АдресЗагруженногоФайла;
+
+ ИначеЕсли Не ОписаниеДанных.Успех Тогда
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
+ Возврат;
+ Иначе
+ Если ТипЗнч(ОписаниеДанных.ЗашифрованныеДанные) = Тип("ДвоичныеДанные") Тогда
+ Адрес = ПоместитьВоВременноеХранилище(ОписаниеДанных.ЗашифрованныеДанные,
+ ПараметрыВыполнения.ИдентификаторФормы);
+ Иначе
+ Адрес = ОписаниеДанных.ЗашифрованныеДанные;
+ КонецЕсли;
+ КонецЕсли;
+
+ СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией");
+ ПараметрыВыполнения.АдресВременногоХранилища = Адрес;
+ СведенияОФайле.АдресВременногоХранилищаФайла = Адрес;
+ СведенияОФайле.ХранитьВерсии = ПараметрыВыполнения.СоздатьНовуюВерсию;
+
+ СтруктураПути = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ПараметрыВыполнения.ВыбранноеИмяФайла);
+ Если Не ПустаяСтрока(СтруктураПути.Расширение) Тогда
+ СведенияОФайле.РасширениеБезТочки = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураПути.Расширение);
+ СведенияОФайле.ИмяБезРасширения = СтруктураПути.ИмяБезРасширения;
+ КонецЕсли;
+
+ Результат = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИСохранитьИзмененияФайла(ПараметрыВыполнения.ОбъектСсылка, СведенияОФайле,
"", ПараметрыВыполнения.ПолныйПутьКФайлу, Ложь, ПараметрыВыполнения.ИдентификаторФормы);
ПараметрыВыполнения.ДанныеФайла = Результат.ДанныеФайла;
Если ПараметрыВыполнения.ПоказыватьОповещение Тогда
@@ -2477,6 +2340,79 @@
КонецПроцедуры
+
+// Для процедур СохранитьИзмененияФайла, ЗакончитьРедактирование.
+Процедура ЗашифроватьФайлПередПомещениемВХранилищеФайлов(ПараметрыВыполнения)
+
+ Если СертификатыНеУказаны(ПараметрыВыполнения.ДанныеФайла.МассивСертификатовШифрования) Тогда
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
+ Возврат;
+ КонецЕсли;
+
+ Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
+ Возврат;
+ КонецЕсли;
+
+ // Не нужно ПредложитьУстановкуРасширенияРаботыСФайлами(), т.к. все делается в памяти через ДвоичныеДанные.
+
+ ОписаниеДанных = Новый Структура;
+ ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Шифрование файла'"));
+ ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'"));
+ ОписаниеДанных.Вставить("Данные", ПараметрыВыполнения.ПолныйПутьКФайлу);
+ ОписаниеДанных.Вставить("Представление", ПараметрыВыполнения.ОбъектСсылка);
+ ОписаниеДанных.Вставить("НаборСертификатов", ПараметрыВыполнения.ОбъектСсылка);
+ ОписаниеДанных.Вставить("БезПодтверждения", Истина);
+ ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь);
+
+ ОбработчикПродолжения = Новый ОписаниеОповещения("ЗашифроватьФайлПередПомещениемВХранилищеФайловПослеШифрованияФайла",
+ ЭтотОбъект, ПараметрыВыполнения);
+
+ МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент");
+ МодульЭлектроннаяПодписьКлиент.Зашифровать(ОписаниеДанных, , ОбработчикПродолжения);
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+Процедура ЗашифроватьФайлПередПомещениемВХранилищеФайловПослеШифрованияФайла(ОписаниеДанных, ПараметрыВыполнения) Экспорт
+
+ Если ОписаниеДанных = Null Тогда
+ Адрес = ПараметрыВыполнения.АдресЗагруженногоФайла;
+
+ ИначеЕсли Не ОписаниеДанных.Успех Тогда
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь);
+ Возврат;
+ Иначе
+ Если ТипЗнч(ОписаниеДанных.ЗашифрованныеДанные) = Тип("ДвоичныеДанные") Тогда
+ Адрес = ПоместитьВоВременноеХранилище(ОписаниеДанных.ЗашифрованныеДанные,
+ ПараметрыВыполнения.ИдентификаторФормы);
+ Иначе
+ Адрес = ОписаниеДанных.ЗашифрованныеДанные;
+ КонецЕсли;
+ КонецЕсли;
+
+ ПараметрыВыполнения.Вставить("АдресПослеШифрования", Адрес);
+
+ ВыполнитьОбработкуОповещения(ПараметрыВыполнения.ОповещениеПослеШифрования);
+
+КонецПроцедуры
+
+
+// Для процедур СохранитьИзмененияФайла, ЗакончитьРедактирование.
+Функция СертификатыНеУказаны(МассивСертификатов)
+
+ Если МассивСертификатов.Количество() = 0 Тогда
+ ПоказатьПредупреждение(,
+ НСтр("ru = 'У зашифрованного файла не указаны сертификаты.
+ |Расшифруйте файл и зашифруйте заново.'"));
+
+ Возврат Истина;
+ КонецЕсли;
+
+ Возврат Ложь;
+
+КонецФункции
+
////////////////////////////////////////////////////////////////////////////////
// Пометка файла как занятого для редактирования.
@@ -2498,7 +2434,7 @@
Обработчик = Новый ОписаниеОповещения("ЗанятьФайлПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика);
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
+ ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
КонецПроцедуры
@@ -2521,7 +2457,7 @@
Возврат;
КонецЕсли;
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
НаЧтение = Ложь;
ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> "";
ПеререгистрироватьФайлВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца);
@@ -2615,7 +2551,7 @@
РаботаСФайламиСлужебныйВызовСервера.ОсвободитьФайл(ДанныеФайла);
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
НаЧтение = Истина;
ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> "";
ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца);
@@ -2929,7 +2865,7 @@
КонецЕсли;
#Если ВебКлиент Тогда
- Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если НЕ ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(ОбработчикРезультата);
Возврат;
КонецЕсли;
@@ -3380,7 +3316,7 @@
ПолноеИмяФайла,
ВремяИзмененияУниверсальное,
НаЧтение,
- ИдентификаторФормы = Неопределено,
+ ИдентификаторФормы,
ДополнительныеПараметры = Неопределено)
// Переменные параметризации:
@@ -3583,11 +3519,12 @@
Возврат;
КонецЕсли;
+ ЗаполнитьВременныйИдентификаторФормы(ПараметрыВыполнения.ИдентификаторФормы, ПараметрыВыполнения);
+
СтруктураВозврата = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИДвоичныеДанные(
ПараметрыВыполнения.ДанныеФайла.Версия,, ПараметрыВыполнения.ИдентификаторФормы);
ОписаниеДанных = Новый Структура;
- ОписаниеДанных.Вставить("ИдентификаторФормы", ПараметрыВыполнения.ИдентификаторФормы);
ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Расшифровка файла'"));
ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'"));
ОписаниеДанных.Вставить("Данные", СтруктураВозврата.ДвоичныеДанные);
@@ -3665,6 +3602,7 @@
Если Не ЗапроситьРазрешениеПользователя(МассивОпераций) Тогда
// Пользователь не дал разрешения.
+ ОчиститьВременныйИдентификаторФормы(ПараметрыВыполнения);
ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения);
Возврат;
КонецЕсли;
@@ -3673,6 +3611,7 @@
#КонецЕсли
Если Не ПолучитьФайлы(ПередаваемыеФайлы,, ПараметрыВыполнения.ПараметрПутьКФайлу, Ложь) Тогда
+ ОчиститьВременныйИдентификаторФормы(ПараметрыВыполнения);
ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения);
Возврат;
КонецЕсли;
@@ -3684,6 +3623,11 @@
КонецЕсли;
Состояние();
+
+ // Установим время изменения файла таким, как оно стоит в текущей версии.
+ ФайлНаДиске = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайла);
+ ФайлНаДиске.УстановитьУниверсальноеВремяИзменения(ПараметрыВыполнения.ВремяИзмененияУниверсальное);
+
ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловЗавершение(ПараметрыВыполнения);
КонецПроцедуры
@@ -3691,9 +3635,7 @@
// Продолжение процедуры (см. выше).
Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловЗавершение(ПараметрыВыполнения)
- // Установим время изменения файла таким, как оно стоит в текущей версии.
ФайлНаДиске = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайла);
- ФайлНаДиске.УстановитьУниверсальноеВремяИзменения(ПараметрыВыполнения.ВремяИзмененияУниверсальное);
// Т.к. размер на диске может отличаться от размера в базе (при добавлении из веб клиента).
РазмерФайла = ФайлНаДиске.Размер();
@@ -3722,6 +3664,8 @@
КонецЕсли;
КонецЕсли;
+ ОчиститьВременныйИдентификаторФормы(ПараметрыВыполнения);
+
ПараметрыВыполнения.ФайлПолучен = Истина;
ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения);
@@ -4752,7 +4696,7 @@
ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла);
ПараметрыВыполнения.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
СохранитьКакСРасширением(ПараметрыВыполнения);
Иначе
СохранитьКакБезРасширения(ПараметрыВыполнения);
@@ -4879,7 +4823,6 @@
ПараметрыВыполнения.УникальныйИдентификатор);
ОписаниеДанных = Новый Структура;
- ОписаниеДанных.Вставить("ИдентификаторФормы", ПараметрыВыполнения.УникальныйИдентификатор);
ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Расшифровка файла'"));
ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'"));
ОписаниеДанных.Вставить("Данные", СтруктураВозврата.ДвоичныеДанные);
@@ -4943,7 +4886,7 @@
ВыборФайла.Каталог = ПараметрыВыполнения.ПутьВыбора;
Если Не ВыборФайла.Выбрать() Тогда
- ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, "");
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Новый Структура);
Возврат;
КонецЕсли;
@@ -5008,37 +4951,75 @@
ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("НастройкиПрограммы", "ПапкаДляСохранитьКак", ПараметрыВыполнения.ПутьВыбора);
КонецЕсли;
- ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПолноеИмяФайла);
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Новый Структура("ПолноеИмяФайла", ПолноеИмяФайла));
КонецПроцедуры
// Продолжение процедуры (см. выше).
Процедура СохранитьКакБезРасширения(ПараметрыВыполнения) Экспорт
- АдресФайла = ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии;
+ ПараметрыВыполнения.Вставить("СохранятьСРасшифровкой", Ложь);
+ ПараметрыВыполнения.Вставить("РасширениеДляЗашифрованныхФайлов", "");
- ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(
- ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии,
- ПараметрыВыполнения.ДанныеФайла.Расширение);
-
- РазмерВМб = ПараметрыВыполнения.ДанныеФайла.Размер / (1024 * 1024);
-
- ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Выполняется сохранение файла ""%1"" (%2 Мб)...
- |Пожалуйста, подождите.'"),
- ИмяФайла,
- ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб));
- Состояние(ТекстСостояния);
-
- // Сохраним Файл из БД на диск.
- ПолучитьФайл(АдресФайла, ИмяФайла, Истина);
-
- // Для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения.
- Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда
- УдалитьИзВременногоХранилища(АдресФайла);
+ Если ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда
+ Обработчик = Новый ОписаниеОповещения("СохранитьКакБезРасширенияПослеВыбораРежимаСохранения",
+ ЭтотОбъект, ПараметрыВыполнения);
+
+ ОткрытьФорму("Справочник.Файлы.Форма.ВыборСохраненияШифрованногоФайла", , , , , ,
+ Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
+ Иначе
+ СохранитьКакБезРасширенияПослеВыбораРежимаСохранения(-1, ПараметрыВыполнения);
КонецЕсли;
- ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ИмяФайла);
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+Процедура СохранитьКакБезРасширенияПослеВыбораРежимаСохранения(Результат, ПараметрыВыполнения) Экспорт
+
+ Если ТипЗнч(Результат) = Тип("Структура") Тогда
+ ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов = Результат.РасширениеДляЗашифрованныхФайлов;
+
+ Если Результат.СохранятьСРасшифровкой = 1 Тогда
+ ПараметрыВыполнения.СохранятьСРасшифровкой = Истина;
+ Иначе
+ ПараметрыВыполнения.СохранятьСРасшифровкой = Ложь;
+ КонецЕсли;
+
+ ИначеЕсли Результат <> -1 Тогда
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, "");
+ Возврат;
+ КонецЕсли;
+
+ ЗаполнитьВременныйИдентификаторФормы(ПараметрыВыполнения.УникальныйИдентификатор, ПараметрыВыполнения);
+
+ Обработчик = Новый ОписаниеОповещения("СохранитьКакБезРасширенияЗавершение", ЭтотОбъект, ПараметрыВыполнения);
+ ОткрытьФайлБезРасширения(Обработчик, ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.УникальныйИдентификатор,
+ Ложь, ПараметрыВыполнения.СохранятьСРасшифровкой, ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов);
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+Процедура СохранитьКакБезРасширенияЗавершение(Результат, ПараметрыВыполнения) Экспорт
+
+ ОчиститьВременныйИдентификаторФормы(ПараметрыВыполнения);
+
+ Если Результат <> Истина Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если Не ПараметрыВыполнения.СохранятьСРасшифровкой
+ И ПараметрыВыполнения.ДанныеФайла.Зашифрован
+ И ЗначениеЗаполнено(ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов) Тогда
+
+ Расширение = ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов;
+ Иначе
+ Расширение = ПараметрыВыполнения.ДанныеФайла.Расширение;
+ КонецЕсли;
+
+ ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(
+ ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, Расширение);
+
+ ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Новый Структура("ПолноеИмяФайла", ИмяФайла));
КонецПроцедуры
@@ -5054,7 +5035,7 @@
ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами();
Если ПерсональныеНастройки.ПоказыватьПодсказкиПриРедактированииФайлов = Истина Тогда
- Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если Не ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
// Кэшируем форму на клиенте
Форма = РаботаСФайламиСлужебныйКлиентПовтИсп.ФормаНапоминанияПередПоместитьФайл();
УстановитьОповещениеФормы(Форма, ОбработчикРезультата);
@@ -5190,7 +5171,7 @@
// Сохраняет отредактированный файл в ИБ и снимает с него блокировку.
//
// Параметры:
-// Параметры - Структура - см. ПараметрыПубликацииФайла.
+// Параметры - Структура - см. ПараметрыОбновленияФайла.
//
Процедура ЗакончитьРедактированиеСОповещением(Параметры) Экспорт
@@ -5204,7 +5185,7 @@
ПараметрыВыполнения.Вставить("ПараметрКоманды", Параметры.ОбъектСсылка);
Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеСОповещениемЗавершение", ЭтотОбъект, ПараметрыВыполнения);
- ПараметрыОбработчика = ПараметрыПубликацииФайла(Обработчик, Параметры.ОбъектСсылка, Параметры.ИдентификаторФормы);
+ ПараметрыОбработчика = ПараметрыОбновленияФайла(Обработчик, Параметры.ОбъектСсылка, Параметры.ИдентификаторФормы);
ПараметрыОбработчика.ХранитьВерсии = Параметры.ХранитьВерсии;
ПараметрыОбработчика.РедактируетТекущийПользователь = Параметры.РедактируетТекущийПользователь;
ПараметрыОбработчика.Редактирует = Параметры.Редактирует;
@@ -5398,14 +5379,14 @@
КонецЕсли;
Обработчик = Новый ОписаниеОповещения("ОткрытьФайлСОповещениемПослеУстановкиРасширения", ЭтотОбъект, ПараметрыВыполнения);
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
+ ФайловыеФункцииСлужебныйКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик);
КонецПроцедуры
// Продолжение процедуры (см. выше).
Процедура ОткрытьФайлСОповещениемПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
Обработчик = Новый ОписаниеОповещения("ОткрытьФайлСОповещениемСРасширениемПослеПолученияВерсииВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения);
ПолучитьФайлВерсииВРабочийКаталог(
Обработчик,
@@ -5414,12 +5395,10 @@
ПараметрыВыполнения.УникальныйИдентификатор,
Новый Структура("ОткрытьФайл", Истина));
Иначе
- Если ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь Тогда
- Обработчик = Новый ОписаниеОповещения("ОткрытьФайлСОповещениемБезРасширенияПослеНапоминания", ЭтотОбъект, ПараметрыВыполнения);
- ФайловыеФункцииСлужебныйКлиент.ВывестиНапоминаниеПриРедактировании(Обработчик);
- Иначе
- ОткрытьФайлСОповещениемБезРасширенияПослеНапоминания(-1, ПараметрыВыполнения);
- КонецЕсли;
+ ЗаполнитьВременныйИдентификаторФормы(ПараметрыВыполнения.УникальныйИдентификатор, ПараметрыВыполнения);
+
+ Обработчик = Новый ОписаниеОповещения("ОткрытьФайлСОповещениемЗавершение", ЭтотОбъект, ПараметрыВыполнения);
+ ОткрытьФайлБезРасширения(Обработчик, ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.УникальныйИдентификатор);
КонецЕсли;
КонецПроцедуры
@@ -5431,29 +5410,18 @@
ОткрытьФайлПриложением(ПараметрыВыполнения.ДанныеФайла, Результат.ПолноеИмяФайла);
КонецЕсли;
- ОткрытьФайлСОповещениемЗавершение(ПараметрыВыполнения);
+ ОткрытьФайлСОповещениемЗавершение(Результат.ФайлПолучен = Истина, ПараметрыВыполнения);
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура ОткрытьФайлСОповещениемБезРасширенияПослеНапоминания(Результат, ПараметрыВыполнения) Экспорт
+Процедура ОткрытьФайлСОповещениемЗавершение(Результат, ПараметрыВыполнения) Экспорт
- ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(
- ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии,
- ПараметрыВыполнения.ДанныеФайла.Расширение);
+ ОчиститьВременныйИдентификаторФормы(ПараметрыВыполнения);
- ПолучитьФайл(ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии, ИмяФайла, Истина);
-
- // При хранении файлов на диске (на сервере) файл удаляется из временного хранилища не сразу:
- // - удаляется, либо при следующем вызове ПолучитьДанныеФайлаДляОткрытия, либо не удаляется;
- // - удаляется при закрытии формы автоматически.
-
- ОткрытьФайлСОповещениемЗавершение(ПараметрыВыполнения);
-
-КонецПроцедуры
-
-// Продолжение процедуры (см. выше).
-Процедура ОткрытьФайлСОповещениемЗавершение(ПараметрыВыполнения) Экспорт
+ Если Результат <> Истина Тогда
+ Возврат;
+ КонецЕсли;
ПараметрыОповещения = Новый Структура;
ПараметрыОповещения.Вставить("Событие", "ФайлОткрыт");
@@ -5461,11 +5429,138 @@
КонецПроцедуры
+
+Процедура ОткрытьФайлБезРасширения(Оповещение, ДанныеФайла, ИдентификаторФормы,
+ СПредупреждением = Истина, СохранятьСРасшифровкой = Истина, РасширениеДляЗашифрованныхФайлов = "")
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("ДанныеФайла", ДанныеФайла);
+ Контекст.Вставить("ИдентификаторФормы", ИдентификаторФормы);
+ Контекст.Вставить("СПредупреждением", СПредупреждением);
+ Контекст.Вставить("СохранятьСРасшифровкой", СохранятьСРасшифровкой);
+ Контекст.Вставить("РасширениеДляЗашифрованныхФайлов", РасширениеДляЗашифрованныхФайлов);
+
+ Если Контекст.СохранятьСРасшифровкой
+ И ДанныеФайла.Зашифрован Тогда
+
+ Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь);
+ Возврат;
+ КонецЕсли;
+
+ СтруктураВозврата = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИДвоичныеДанные(
+ ДанныеФайла.Версия,, ИдентификаторФормы);
+
+ ОписаниеДанных = Новый Структура;
+ ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Расшифровка файла'"));
+ ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'"));
+ ОписаниеДанных.Вставить("Данные", СтруктураВозврата.ДвоичныеДанные);
+ ОписаниеДанных.Вставить("Представление", ДанныеФайла.Ссылка);
+ ОписаниеДанных.Вставить("СертификатыШифрования", ДанныеФайла.Ссылка);
+ ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь);
+
+ ОбработчикПродолжения = Новый ОписаниеОповещения(
+ "ОткрытьФайлБезРасширенияПослеРасшифровки", ЭтотОбъект, Контекст);
+
+ МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент");
+ МодульЭлектроннаяПодписьКлиент.Расшифровать(ОписаниеДанных, , ОбработчикПродолжения);
+
+ Возврат;
+ КонецЕсли;
+
+ Контекст.Вставить("АдресФайла", ДанныеФайла.НавигационнаяСсылкаТекущейВерсии);
+
+ ОткрытьФайлБезРасширенияНапоминание(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+Процедура ОткрытьФайлБезРасширенияПослеРасшифровки(ОписаниеДанных, Контекст) Экспорт
+
+ Если Не ОписаниеДанных.Успех Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь);
+ Возврат;
+ КонецЕсли;
+
+ Если ТипЗнч(ОписаниеДанных.РасшифрованныеДанные) = Тип("ДвоичныеДанные") Тогда
+ АдресФайла = ПоместитьВоВременноеХранилище(ОписаниеДанных.РасшифрованныеДанные,
+ Контекст.ИдентификаторФормы);
+ Иначе
+ АдресФайла = ОписаниеДанных.РасшифрованныеДанные;
+ КонецЕсли;
+
+ Контекст.Вставить("АдресФайла", АдресФайла);
+
+ ОткрытьФайлБезРасширенияНапоминание(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+Процедура ОткрытьФайлБезРасширенияНапоминание(Контекст)
+
+ Если Контекст.СПредупреждением
+ И Контекст.ДанныеФайла.РедактируетТекущийПользователь Тогда
+
+ ФайловыеФункцииСлужебныйКлиент.ВывестиНапоминаниеПриРедактировании(Новый ОписаниеОповещения(
+ "ОткрытьФайлБезРасширенияПередачаФайла", ЭтотОбъект, Контекст));
+ Иначе
+ ОткрытьФайлБезРасширенияПередачаФайла(, Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+Процедура ОткрытьФайлБезРасширенияПередачаФайла(Результат, Контекст) Экспорт
+
+ Если Не Контекст.СохранятьСРасшифровкой
+ И Контекст.ДанныеФайла.Зашифрован
+ И ЗначениеЗаполнено(Контекст.РасширениеДляЗашифрованныхФайлов) Тогда
+
+ Расширение = Контекст.РасширениеДляЗашифрованныхФайлов;
+ Иначе
+ Расширение = Контекст.ДанныеФайла.Расширение;
+ КонецЕсли;
+
+ ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(
+ Контекст.ДанныеФайла.ПолноеНаименованиеВерсии, Расширение);
+
+ ПолучитьФайл(Контекст.АдресФайла, ИмяФайла, Истина);
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина);
+
+КонецПроцедуры
+
+// Заполняет временный идентификатор формы для случаев, когда не требуется
+// возвращать данные во временном хранилище в вызывающий код, например,
+// как в процедурах Открыть, ОткрытьКаталогФайла в общем модуле РаботаСФайламиКлиент.
+//
+Процедура ЗаполнитьВременныйИдентификаторФормы(ИдентификаторФормы, ПараметрыВыполнения)
+
+ Если ЗначениеЗаполнено(ИдентификаторФормы) Тогда
+ Возврат;
+ КонецЕсли;
+
+ ПараметрыВыполнения.Вставить("ВременнаяФорма", ПолучитьФорму("Справочник.Файлы.Форма.ФормаВопроса"));
+ ИдентификаторФормы = ПараметрыВыполнения.ВременнаяФорма.УникальныйИдентификатор;
+ СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ПараметрыВыполнения.ВременнаяФорма, Истина);
+
+КонецПроцедуры
+
+// Отменяет хранение временного идентификатора, заполненного ранее.
+Процедура ОчиститьВременныйИдентификаторФормы(ПараметрыВыполнения)
+
+ Если ПараметрыВыполнения.Свойство("ВременнаяФорма") Тогда
+ СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ПараметрыВыполнения.ВременнаяФорма, Ложь);
+ КонецЕсли;
+
+КонецПроцедуры
+
////////////////////////////////////////////////////////////////////////////////
// Загружает файл в программу и рассылает оповещение.
// Сохраняет файл в информационной базе, но не освобождает его.
-Процедура ОпубликоватьФайлСОповещением(ОбработчикРезультата, ПараметрКоманды, ИдентификаторФормы) Экспорт
+Процедура СохранитьИзмененияФайлаСОповещением(ОбработчикРезультата, ПараметрКоманды, ИдентификаторФормы) Экспорт
Если ПараметрКоманды = Неопределено Тогда
ВернутьРезультат(ОбработчикРезультата, Неопределено);
@@ -5475,31 +5570,15 @@
ПараметрыВыполнения = Новый Структура;
ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата);
ПараметрыВыполнения.Вставить("ПараметрКоманды", ПараметрКоманды);
- Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда
- Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлСОповещениемМассивФайловЗавершение", ЭтотОбъект, ПараметрыВыполнения);
- ОпубликоватьФайлыПоСсылкам(Обработчик, ПараметрКоманды, ИдентификаторФормы);
- Иначе
- Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлСОповещениемОдинФайлЗавершение", ЭтотОбъект, ПараметрыВыполнения);
- ПараметрыОбработчика = ПараметрыПубликацииФайла(Обработчик, ПараметрКоманды, ИдентификаторФормы);
- ОпубликоватьФайл(ПараметрыОбработчика);
- КонецЕсли;
+
+ Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаСОповещениемЗавершение", ЭтотОбъект, ПараметрыВыполнения);
+ ПараметрыОбработчика = ПараметрыОбновленияФайла(Обработчик, ПараметрКоманды, ИдентификаторФормы);
+ СохранитьИзмененияФайла(ПараметрыОбработчика);
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура ОпубликоватьФайлСОповещениемМассивФайловЗавершение(Результат, ПараметрыВыполнения) Экспорт
-
- Для Каждого ФайлСсылка Из ПараметрыВыполнения.ПараметрКоманды Цикл
- Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ФайлСсылка);
- Оповестить("Запись_Файл", Новый Структура("Событие", "ВерсияСохранена"), ФайлСсылка);
- КонецЦикла;
-
- ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено);
-
-КонецПроцедуры
-
-// Продолжение процедуры (см. выше).
-Процедура ОпубликоватьФайлСОповещениемОдинФайлЗавершение(Результат, ПараметрыВыполнения) Экспорт
+Процедура СохранитьИзмененияФайлаСОповещениемЗавершение(Результат, ПараметрыВыполнения) Экспорт
Если Результат = Истина Тогда
Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ПараметрыВыполнения.ПараметрКоманды);
@@ -5516,7 +5595,7 @@
// Выбирает на диске файл и создает из него новую версию.
Процедура ОбновитьИзФайлаНаДискеСОповещением(ОбработчикРезультата, ДанныеФайла, ИдентификаторФормы) Экспорт
- Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если Не ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(ОбработчикРезультата);
Возврат;
КонецЕсли;
@@ -5624,7 +5703,6 @@
КонецЦикла;
ОписаниеДанных = Новый Структура;
- ОписаниеДанных.Вставить("ИдентификаторФормы", ПараметрыВыполнения.УникальныйИдентификатор);
ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Шифрование файла'"));
ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'"));
ОписаниеДанных.Вставить("НаборДанных", НаборДанных);
@@ -5640,11 +5718,11 @@
КонецПроцедуры
// Продолжение процедуры Зашифровать. Вызывается из подсистемы ЭлектроннаяПодпись.
-Процедура ПриПолученииЗашифрованныхДанных(ОписаниеДанных, ТекущиеПараметрыВыполнения) Экспорт
+Процедура ПриПолученииЗашифрованныхДанных(Параметры, ТекущиеПараметрыВыполнения) Экспорт
ПараметрыВыполнения = ТекущиеПараметрыВыполнения.ПараметрыВыполнения;
- ЗашифрованныеДанные = ОписаниеДанных.ТекущийЭлементНабораДанных.ЗашифрованныеДанные;
+ ЗашифрованныеДанные = Параметры.ОписаниеДанных.ТекущийЭлементНабораДанных.ЗашифрованныеДанные;
Если ТипЗнч(ЗашифрованныеДанные) = Тип("ДвоичныеДанные") Тогда
АдресВременногоХранилища = ПоместитьВоВременноеХранилище(ЗашифрованныеДанные,
ПараметрыВыполнения.УникальныйИдентификатор);
@@ -5660,6 +5738,8 @@
ПараметрыВыполнения.МассивДанныхДляЗанесенияВБазу.Добавить(ДанныеДляЗаписиНаСервере);
+ ВыполнитьОбработкуОповещения(Параметры.Оповещение, Новый Структура);
+
КонецПроцедуры
// Завершение процедуры Зашифровать. Вызывается из подсистемы ЭлектроннаяПодпись.
@@ -5751,7 +5831,6 @@
КонецЦикла;
ОписаниеДанных = Новый Структура;
- ОписаниеДанных.Вставить("ИдентификаторФормы", ПараметрыВыполнения.УникальныйИдентификатор);
ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Расшифровка файла'"));
ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'"));
ОписаниеДанных.Вставить("НаборДанных", НаборДанных);
@@ -5768,11 +5847,11 @@
КонецПроцедуры
// Продолжение процедуры Расшифровать. Вызывается из подсистемы ЭлектроннаяПодпись.
-Процедура ПриПолученииРасшифрованныхДанных(ОписаниеДанных, ТекущиеПараметрыВыполнения) Экспорт
+Процедура ПриПолученииРасшифрованныхДанных(Параметры, ТекущиеПараметрыВыполнения) Экспорт
ПараметрыВыполнения = ТекущиеПараметрыВыполнения.ПараметрыВыполнения;
- РасшифрованныеДанные = ОписаниеДанных.ТекущийЭлементНабораДанных.РасшифрованныеДанные;
+ РасшифрованныеДанные = Параметры.ОписаниеДанных.ТекущийЭлементНабораДанных.РасшифрованныеДанные;
Если ТипЗнч(РасшифрованныеДанные) = Тип("ДвоичныеДанные") Тогда
АдресВременногоХранилища = ПоместитьВоВременноеХранилище(РасшифрованныеДанные,
ПараметрыВыполнения.УникальныйИдентификатор);
@@ -5809,6 +5888,8 @@
ПараметрыВыполнения.МассивДанныхДляЗанесенияВБазу.Добавить(ДанныеДляЗаписиНаСервере);
+ ВыполнитьОбработкуОповещения(Параметры.Оповещение, Новый Структура);
+
КонецПроцедуры
// Завершение процедуры Расшифровать. Вызывается из подсистемы ЭлектроннаяПодпись.
@@ -5873,7 +5954,7 @@
Если РежимСоздания = 1 Тогда // Скопировать другой файла.
ДобавитьНаОсновеШаблона(ПараметрыВыполнения);
ИначеЕсли РежимСоздания = 2 Тогда // Загрузить из файловой системы.
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено() Тогда
ДобавитьИзФайловойСистемыСРасширением(ПараметрыВыполнения);
Иначе
ДобавитьИзФайловойСистемыБезРасширения(ПараметрыВыполнения);
@@ -6079,26 +6160,20 @@
// Загрузить из файловой системы без расширения работы с файлами (веб-клиент).
Обработчик = Новый ОписаниеОповещения("ДобавитьИзФайловойСистемыБезРасширенияПослеЗагрузкиФайла", ЭтотОбъект, ПараметрыВыполнения);
- СтандартныеПодсистемыКлиент.ПоказатьПомещениеФайла(
- Обработчик,
- ПараметрыВыполнения.ФормаВладелец.УникальныйИдентификатор,
- "",
- Неопределено);
+ НачатьПомещениеФайла(Обработчик, , , , ПараметрыВыполнения.ФормаВладелец.УникальныйИдентификатор);
КонецПроцедуры
// Продолжение процедуры (см. выше).
-Процедура ДобавитьИзФайловойСистемыБезРасширенияПослеЗагрузкиФайла(ПомещенныеФайлы, ПараметрыВыполнения) Экспорт
+Процедура ДобавитьИзФайловойСистемыБезРасширенияПослеЗагрузкиФайла(Помещен, Адрес, ВыбранноеИмяФайла, ПараметрыВыполнения) Экспорт
- Если ПомещенныеФайлы = Неопределено Или ПомещенныеФайлы.Количество() = 0 Тогда
+ Если Не Помещен Тогда
ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено);
Возврат;
КонецЕсли;
- ОписаниеПереданногоФайла = ПомещенныеФайлы[0];
- ИмяФайла = ОписаниеПереданногоФайла.Имя;
- СтрокиПути = ОбщегоНазначенияКлиентСервер.РазложитьСтрокуПоТочкамИСлэшам(ИмяФайла);
- Если СтрокиПути.Количество() < 2 Тогда
+ СтруктураПути = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ВыбранноеИмяФайла);
+ Если ПустаяСтрока(СтруктураПути.Расширение) Тогда
ТекстВопроса = НСтр("ru = 'Необходимо указать файл с расширением.'");
Кнопки = Новый СписокЗначений;
Кнопки.Добавить(КодВозвратаДиалога.Повторить, НСтр("ru = 'Выбрать другой файл'"));
@@ -6112,9 +6187,9 @@
ТекстОшибки = "";
Попытка
СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией");
- СведенияОФайле.АдресВременногоХранилищаФайла = ОписаниеПереданногоФайла.Хранение;
- СведенияОФайле.ИмяБезРасширения = СтрокиПути[СтрокиПути.Количество() - 2];
- СведенияОФайле.РасширениеБезТочки = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтрокиПути[СтрокиПути.Количество() - 1]);
+ СведенияОФайле.АдресВременногоХранилищаФайла = Адрес;
+ СведенияОФайле.ИмяБезРасширения = СтруктураПути.ИмяБезРасширения;
+ СведенияОФайле.РасширениеБезТочки = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураПути.Расширение);
ФайлСсылка = РаботаСФайламиСлужебныйВызовСервера.СоздатьФайлСВерсией(ПараметрыВыполнения.ВладелецФайла, СведенияОФайле);
Исключение
ТекстОшибки = ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла(ИнформацияОбОшибке());
@@ -6202,10 +6277,13 @@
УдалитьФайлБезПодтверждения(ПолноеИмяФайла);
КонецЦикла;
- ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Файл ""%1"" зашифрован'"),
- ФайлСсылка);
- Состояние(ТекстСостояния);
+ Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
+ Возврат;
+ КонецЕсли;
+ МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент");
+ МодульЭлектроннаяПодписьКлиент.ИнформироватьОШифрованииОбъекта(
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Файл: %1'"), ФайлСсылка));
КонецПроцедуры
@@ -6219,10 +6297,13 @@
Оповестить("Запись_Файл", Новый Структура("Событие", "ПрисоединенныйФайлЗашифрован"), ВладелецФайла);
Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ФайлСсылка);
- ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Файл ""%1"" расшифрован'"),
- ФайлСсылка);
- Состояние(ТекстСообщения);
+ Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
+ Возврат;
+ КонецЕсли;
+ МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент");
+ МодульЭлектроннаяПодписьКлиент.ИнформироватьОРасшифровкеОбъекта(
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Файл: %1'"), ФайлСсылка));
КонецПроцедуры
@@ -6277,7 +6358,6 @@
ОписаниеДанных = Новый Структура;
ОписаниеДанных.Вставить("ПоказатьКомментарий", Истина);
- ОписаниеДанных.Вставить("ИдентификаторФормы", ИдентификаторФормы);
ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Подписание файла'"));
ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'"));
ОписаниеДанных.Вставить("НаборДанных", НаборДанных);
@@ -6290,13 +6370,15 @@
КонецПроцедуры
-// Продолжение процедуры ПодписатьФайл, СохранитьФайлВместеСПодписями.
+// Продолжение процедуры ПодписатьФайл.
// Вызывается из подсистемы ЭлектроннаяПодпись при запросе данных для подписания.
//
-Процедура ПриЗапросеДвоичныхДанныхФайла(ДвоичныеДанные, ПараметрыВыполнения) Экспорт
+Процедура ПриЗапросеДвоичныхДанныхФайла(Параметры, Контекст) Экспорт
- ДвоичныеДанные = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИДвоичныеДанные(
- ПараметрыВыполнения.ДанныеФайла.Ссылка).ДвоичныеДанные;
+ Данные = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИДвоичныеДанные(
+ Контекст.ДанныеФайла.Ссылка).ДвоичныеДанные;
+
+ ВыполнитьОбработкуОповещения(Параметры.Оповещение, Новый Структура("Данные", Данные));
КонецПроцедуры
@@ -6304,12 +6386,14 @@
// Вызывается из подсистемы ЭлектроннаяПодпись после подписания данных для нестандартного
// способа добавления подписи в объект.
//
-Процедура ПриПолученииПодписи(ОписаниеДанных, ПараметрыВыполнения) Экспорт
+Процедура ПриПолученииПодписи(Параметры, Контекст) Экспорт
РаботаСФайламиСлужебныйВызовСервера.ДобавитьПодписьКФайлу(
- ПараметрыВыполнения.ДанныеФайла.Ссылка,
- ОписаниеДанных.ТекущийЭлементНабораДанных.СвойстваПодписи,
- ПараметрыВыполнения.ИдентификаторФормы);
+ Контекст.ДанныеФайла.Ссылка,
+ Параметры.ОписаниеДанных.ТекущийЭлементНабораДанных.СвойстваПодписи,
+ Контекст.ИдентификаторФормы);
+
+ ВыполнитьОбработкуОповещения(Параметры.Оповещение, Новый Структура);
КонецПроцедуры
@@ -6373,12 +6457,14 @@
// Вызывается из подсистемы ЭлектроннаяПодпись после подготовки подписей из файлов для нестандартного
// способа добавления подписи в объект.
//
-Процедура ПриПолученииПодписей(ОписаниеДанных, ПараметрыВыполнения) Экспорт
+Процедура ПриПолученииПодписей(Параметры, Контекст) Экспорт
РаботаСФайламиСлужебныйВызовСервера.ДобавитьПодписьКФайлу(
- ПараметрыВыполнения.ДанныеФайла.Ссылка,
- ОписаниеДанных.Подписи,
- ПараметрыВыполнения.ИдентификаторФормы);
+ Контекст.ДанныеФайла.Ссылка,
+ Параметры.ОписаниеДанных.Подписи,
+ Контекст.ИдентификаторФормы);
+
+ ВыполнитьОбработкуОповещения(Параметры.Оповещение, Новый Структура);
КонецПроцедуры
@@ -6435,12 +6521,9 @@
// Продолжение процедуры СохранитьФайлВместеСПодписями.
// Вызывается из подсистемы ЭлектроннаяПодпись после выбора подписей для сохранения.
//
-Процедура ПриСохраненииДанныхФайла(ОбработкаСохраненияПодписей, ПараметрыВыполнения) Экспорт
+Процедура ПриСохраненииДанныхФайла(Параметры, Контекст) Экспорт
- ПараметрыВыполнения.Вставить("ОбработкаСохраненияПодписей", ОбработкаСохраненияПодписей);
-
- СохранитьКак(ОбработкаСохраненияПодписей, ПараметрыВыполнения.ДанныеФайла,
- ПараметрыВыполнения.ИдентификаторФормы);
+ СохранитьКак(Параметры.Оповещение, Контекст.ДанныеФайла, Контекст.ИдентификаторФормы);
КонецПроцедуры
@@ -6837,7 +6920,7 @@
// ИмяОткрываемогоФайла - Строка - полное имя файла.
Процедура ОткрытьФайлПриложением(ДанныеФайла, ИмяОткрываемогоФайла, ОбработчикРезультата = Неопределено) Экспорт
- РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами();
+ РасширениеПодключено = ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено();
Если РасширениеПодключено Тогда
ПерсональныеНастройкиРаботыСФайлами =
@@ -7523,39 +7606,13 @@
КонецФункции
-// Записывает сертификаты шифрования в табличную часть Файла.
-Процедура ЗаписатьСертификатыВТабличнуюЧасть(ФайлСсылка, МассивСертификатов, УникальныйИдентификатор)
-
- Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
- Возврат;
- КонецЕсли;
-
- МодульЭлектроннаяПодписьКлиентСервер =
- ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиентСервер");
-
- МассивОтпечатков = Новый Массив;
- Для Каждого Сертификат Из МассивСертификатов Цикл
- Отпечаток = Base64Строка(Сертификат.Отпечаток);
- Представление = МодульЭлектроннаяПодписьКлиентСервер.ПредставлениеСубъекта(Сертификат);
- ДвоичныеДанныеСертификата = Сертификат.Выгрузить();
-
- ОтпечатокСтруктура = Новый Структура("Отпечаток, Представление, Сертификат", Отпечаток, Представление, ДвоичныеДанныеСертификата);
- МассивОтпечатков.Добавить(ОтпечатокСтруктура);
- КонецЦикла;
-
- РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОСертификатахШифрования(ФайлСсылка, МассивОтпечатков, УникальныйИдентификатор);
-
- Оповестить("Запись_Файл", Новый Структура("Событие", "ОбновленаИнформацияОСертификатахШифрования"), ФайлСсылка);
-
-КонецПроцедуры
-
// Функция предназначена для открытия файла соответствующим приложением.
//
// Параметры:
// ИмяОткрываемогоФайла - Строка - полное имя файла.
Процедура ВыполнитьЗапускПриложения(ИмяОткрываемогоФайла) Экспорт
- РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами();
+ РасширениеПодключено = ФайловыеФункцииСлужебныйКлиент.РасширениеРаботыСФайламиПодключено();
Если РасширениеПодключено Тогда
// Открыть Файл
СистемнаяИнфо = Новый СистемнаяИнформация;
diff --git a/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl
index e24dc5a5a..0d2266016 100644
--- a/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl
+++ b/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl
@@ -415,7 +415,7 @@
Если ДеревоОтчетов.Строки.Найти(3, "Уровень", Истина) = Неопределено Тогда
ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Предупреждение,
НСтр("ru = 'Не сохранено ни одного отчета'"), ,);
- УдалитьВременныеФайлы(ПараметрыЖурнала, ПараметрыДоставки);
+ СтандартныеПодсистемыСервер.ОчиститьКаталогВременныхФайлов(ПараметрыДоставки.КаталогВременныхФайлов);
Возврат Ложь;
КонецЕсли;
@@ -485,7 +485,7 @@
ЗаписьЖурнала(ПараметрыЖурнала, , НСтр("ru = 'Рассылка не выполнена'"));
КонецЕсли;
- УдалитьВременныеФайлы(ПараметрыЖурнала, ПараметрыДоставки);
+ СтандартныеПодсистемыСервер.ОчиститьКаталогВременныхФайлов(ПараметрыДоставки.КаталогВременныхФайлов);
// Результат.
Если ПараметрыЖурнала.Свойство("БылиОшибки") Тогда
@@ -1073,9 +1073,7 @@
Если ТекущийАдрес = Неопределено Тогда
СписокПолучателей.Вставить(СтрИтог.Получатель, СтрИтог.EMail);
Иначе
- Если Найти(ВРег(ТекущийАдрес), ВРег(СтрИтог.EMail)) = 0 Тогда
- СписокПолучателей.Вставить(СтрИтог.Получатель, ТекущийАдрес +"; "+ СтрИтог.EMail);
- КонецЕсли;
+ СписокПолучателей.Вставить(СтрИтог.Получатель, ТекущийАдрес +"; "+ СтрИтог.EMail);
КонецЕсли;
КонецЦикла;
@@ -1470,7 +1468,12 @@
// Определить не пустой результат.
Если Результат.Пустой Тогда
Для Каждого ЗначениеПараметраМакетаКД Из ЭлементРезультатаКД.ЗначенияПараметров Цикл
- Если ЗначениеЗаполнено(ЗначениеПараметраМакетаКД.Значение) Тогда
+ Попытка
+ ЗначениеЗаполнено = ЗначениеЗаполнено(ЗначениеПараметраМакетаКД.Значение);
+ Исключение
+ ЗначениеЗаполнено = Ложь; // Линия, Рамка, Цвет и другие объекты КД, которые могут фигурировать при выводе.
+ КонецПопытки;
+ Если ЗначениеЗаполнено Тогда
ПроцессорВыводаРезультатаКД.ЗакончитьВывод();
Результат.Пустой = Ложь;
Возврат Результат;
@@ -1800,6 +1803,26 @@
Возврат Разрешения;
КонецФункции
+////////////////////////////////////////////////////////////////////////////////
+// Обработчики условных вызовов из других подсистемы.
+
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.Справочники.РассылкиОтчетов.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
+
////////////////////////////////////////////////////////////////////////////////
// Локальные служебные процедуры и функции.
@@ -2228,11 +2251,8 @@
ПараметрыДоставки.Вставить("ПредставлениеОтчетовПолучателя", "");
КонецЕсли; // ПараметрыДоставки.ИспользоватьЭлектроннуюПочту
- // Каталог временных файлов
- ПараметрыДоставки.Вставить("КаталогВременныхФайлов",
- ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(
- ПолучитьИмяВременногоФайла(".RP"))); // RP = report publishing, RD = report distribution.
- СоздатьКаталог(ПараметрыДоставки.КаталогВременныхФайлов);
+ // Каталог временных файлов. RP = report publishing, RD = report distribution.
+ ПараметрыДоставки.Вставить("КаталогВременныхФайлов", СтандартныеПодсистемыСервер.СоздатьКаталогВременныхФайлов("RP"));
// Соответствие каталогов временных файлов получателей.
ПараметрыДоставки.Вставить("НастройкиПолучателей", Новый Соответствие);
@@ -2543,24 +2563,6 @@
Возврат Результат;
КонецФункции
-// Очистка временных файлов, которые использовались в рассылке.
-//
-// Параметры:
-// ПараметрыЖурнала - Структура - Параметры записи в журнал регистрации. См. ЗаписьЖурнала(), параметр
-// ПараметрыЖурнала.
-// ПараметрыДоставки - Структура - Параметры доставки.
-// * КаталогВременныхФайлов - Строка - Каталог, который использовался рассылкой для хранения временных файлов.
-//
-Процедура УдалитьВременныеФайлы(ПараметрыЖурнала, ПараметрыДоставки)
- Попытка
- УдалитьФайлы(ПараметрыДоставки.КаталогВременныхФайлов, "*");
- Исключение
- ЗаписьЖурнала(ПараметрыЖурнала, ,
- НСтр("ru = 'Ошибка очистки каталога временных файлов %1:'"), ИнформацияОбОшибке(),
- "'"+ ПараметрыДоставки.КаталогВременныхФайлов +"'");
- КонецПопытки;
-КонецПроцедуры
-
// Преобразует недопустимые символы файлов в похожие допустимые.
// Работает только с именем файла, путь не поддерживается.
//
diff --git a/SSL/src/CommonModules/РегламентированныеДанныеКлиентСервер/Module.bsl b/SSL/src/CommonModules/РегламентированныеДанныеКлиентСервер/Module.bsl
index 8e0798081..ffd417192 100644
--- a/SSL/src/CommonModules/РегламентированныеДанныеКлиентСервер/Module.bsl
+++ b/SSL/src/CommonModules/РегламентированныеДанныеКлиентСервер/Module.bsl
@@ -1,5 +1,5 @@
////////////////////////////////////////////////////////////////////////////////
-// Подсистема "Базовая функциональность".
+// Подсистема "Работа с контрагентами".
// Процедуры и функции проверки корректности заполнения регламентированных данных.
//
////////////////////////////////////////////////////////////////////////////////
diff --git a/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl
index b7d4a2f96..ae05d02a8 100644
--- a/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl
+++ b/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl
@@ -421,7 +421,7 @@
СтруктураПараметров = Новый Структура();
СтруктураПараметров.Вставить("ДатаВремяОбновленияУстановлена", Ложь);
- СтруктураПараметров.Вставить("ИмяФайлаПрограммы", СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИмяИсполняемогоФайлаКлиента);
+ СтруктураПараметров.Вставить("ИмяФайлаПрограммы", СтандартныеПодсистемыКлиент.ИмяИсполняемогоФайлаПриложения());
СтруктураПараметров.Вставить("СобытиеЖурналаРегистрации", НСтр("ru = 'Резервное копирование ИБ'"));
// Определение каталога временных файлов.
diff --git a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанных/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанных/Module.bsl
index 2d7a78f08..5a30ca553 100644
--- a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанных/Module.bsl
+++ b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанных/Module.bsl
@@ -448,6 +448,8 @@
УдалитьФайлы(ИмяАрхива);
Исключение
// При невозможности удаления файла выполнение не должно прерываться.
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Создание резервной копии области данных.Не удалось удалить временный файл'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
ИдКопии = Новый УникальныйИдентификатор;
@@ -491,7 +493,7 @@
ПараметрыЗадания.Вставить("Параметры", ПараметрыМетода);
ОчередьЗаданий.ИзменитьЗадание(Задание, ПараметрыЗадания);
КонецЕсли;
-
+
ПараметрыСобытия = Новый Структура;
Для каждого КлючИЗначение Из ФлагиПериодичности Цикл
ПараметрыСобытия.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);
@@ -512,7 +514,7 @@
//
// Параметры:
// ПараметрыЗадания - Структура - описание см. описание события.
-// СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииОбработчиковОшибок
+// СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииОбработчиковОшибок.
//
Процедура ОшибкаСозданияКопии(Знач ПараметрыЗадания, Знач ИнформацияОбОшибке) Экспорт
@@ -640,6 +642,8 @@
УдалитьФайлы(ИмяАрхива);
Исключение
// При невозможности удаления файла выполнение не должно прерываться.
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Создание резервной копии области данных.Не удалось удалить временный файл'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
НачатьТранзакцию();
@@ -672,6 +676,8 @@
КонецЕсли;
Исключение
// При невозможности удаления файла выполнение не должно прерываться.
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Создание резервной копии области данных.Не удалось удалить временный файл'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Если ПараметрыВыгрузки.ПоТребованию Тогда
ВызватьИсключение;
diff --git a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхКлиент/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхКлиент/Module.bsl
index dc4e42ec8..1d40ff05b 100644
--- a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхКлиент/Module.bsl
+++ b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхКлиент/Module.bsl
@@ -11,14 +11,16 @@
Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РезервноеКопированиеОбластейДанных Тогда
- ОткрытьФорму("ОбщаяФорма.СозданиеРезервнойКопии");
+ ИмяФормы = "ОбщаяФорма.СозданиеРезервнойКопии";
Иначе
- ОткрытьФорму("ОбщаяФорма.ВыгрузкаДанных");
+ ИмяФормы = "ОбщаяФорма.ВыгрузкаДанных";
КонецЕсли;
+ ОткрытьФорму(ИмяФормы);
+
КонецПроцедуры
#КонецОбласти
diff --git a/SSL/src/CommonModules/СоединенияИБ/Module.bsl b/SSL/src/CommonModules/СоединенияИБ/Module.bsl
index 754344974..6cf161291 100644
--- a/SSL/src/CommonModules/СоединенияИБ/Module.bsl
+++ b/SSL/src/CommonModules/СоединенияИБ/Module.bsl
@@ -720,6 +720,8 @@
КонецЕсли;
КонецЦикла;
+ Возврат Сообщение;
+
КонецФункции
// Получить число активных сеансов ИБ.
@@ -732,19 +734,26 @@
// Возвращаемое значение:
// Число - количество активных сеансов ИБ.
//
-Функция КоличествоСеансовИнформационнойБазы(УчитыватьКонсоль = Истина) Экспорт
+Функция КоличествоСеансовИнформационнойБазы(УчитыватьКонсоль = Истина, УчитыватьФоновыеЗадания = Истина) Экспорт
СеансыИБ = ПолучитьСеансыИнформационнойБазы();
- Если УчитыватьКонсоль Тогда
+ Если УчитыватьКонсоль И УчитыватьФоновыеЗадания Тогда
Возврат СеансыИБ.Количество();
КонецЕсли;
Результат = 0;
- Для каждого СеансИБ Из СеансыИБ Цикл
- Если СеансИБ.ИмяПриложения <> "SrvrConsole" Тогда
- Результат = Результат + 1;
+
+ Для Каждого СеансИБ Из СеансыИБ Цикл
+
+ Если Не УчитыватьКонсоль И СеансИБ.ИмяПриложения = "SrvrConsole"
+ Или Не УчитыватьФоновыеЗадания И СеансИБ.ИмяПриложения = "BackgroundJob" Тогда
+ Продолжить;
КонецЕсли;
+
+ Результат = Результат + 1;
+
КонецЦикла;
+
Возврат Результат;
КонецФункции
diff --git a/SSL/src/CommonModules/СоединенияИБВызовСервера/Module.bsl b/SSL/src/CommonModules/СоединенияИБВызовСервера/Module.bsl
index b45aa646b..9caaba666 100644
--- a/SSL/src/CommonModules/СоединенияИБВызовСервера/Module.bsl
+++ b/SSL/src/CommonModules/СоединенияИБВызовСервера/Module.bsl
@@ -102,12 +102,4 @@
КонецФункции
-// См. описание процедуры в модуле СоединенияИБ.
-//
-Функция КоличествоСеансовИнформационнойБазы(УчитыватьКонсоль = Истина) Экспорт
-
- Возврат СоединенияИБ.КоличествоСеансовИнформационнойБазы(УчитыватьКонсоль);
-
-КонецФункции
-
#КонецОбласти
\ No newline at end of file
diff --git a/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl b/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl
index c65ff458b..36beb38ed 100644
--- a/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl
+++ b/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl
@@ -192,10 +192,14 @@
// Параметры:
// Оповещение - ОписаниеОповещения - описывает, куда надо передать управление после закрытия формы.
//
-Процедура ПриОткрытииФормыОшибкиУстановкиМонопольногоРежима(Оповещение) Экспорт
+Процедура ПриОткрытииФормыОшибкиУстановкиМонопольногоРежима(Оповещение, ПараметрыФормы = Неопределено) Экспорт
- ОткрытьФорму("Обработка.БлокировкаРаботыПользователей.Форма.ОшибкаУстановкиМонопольногоРежима",
- , , , , , Оповещение);
+ Если ПараметрыФормы = Неопределено Тогда
+ ПараметрыФормы = Новый Структура;
+ КонецЕсли;
+
+ ОткрытьФорму("Обработка.БлокировкаРаботыПользователей.Форма.ОшибкаУстановкиМонопольногоРежима", ПараметрыФормы,
+ , , , , Оповещение);
КонецПроцедуры
diff --git a/SSL/src/CommonModules/СообщенияПоставляемыхДанныхОбработчикСообщения/Module.bsl b/SSL/src/CommonModules/СообщенияПоставляемыхДанныхОбработчикСообщения/Module.bsl
index 2b9b7ac72..a27a9e567 100644
--- a/SSL/src/CommonModules/СообщенияПоставляемыхДанныхОбработчикСообщения/Module.bsl
+++ b/SSL/src/CommonModules/СообщенияПоставляемыхДанныхОбработчикСообщения/Module.bsl
@@ -113,6 +113,11 @@
КонецПроцедуры
+// Произвести загрузку данных, соответствующих дескриптору.
+//
+// Параметры:
+// Дескриптор - ОбъектXDTO Descriptor.
+//
// Произвести загрузку данных, соответствующих дескриптору.
//
// Параметры:
@@ -205,16 +210,18 @@
Попытка
УдалитьФайлы(ИмяФайлаВыгрузки);
Исключение
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Поставляемые данные.Загрузка данных'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Если ТранзакцияАктивна() Тогда
-
+
Пока ТранзакцияАктивна() Цикл
-
+
ОтменитьТранзакцию();
-
+
КонецЦикла;
-
+
ЗаписьЖурналаРегистрации(НСтр("ru = 'Поставляемые данные.Ошибка обработки'",
ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка,
@@ -222,7 +229,7 @@
,
НСтр("ru = 'По завершении выполнения обработчика не была закрыта транзакция'")
+ Символы.ПС + ПоставляемыеДанные.ПолучитьОписаниеДанных(Дескриптор));
-
+
КонецЕсли;
Если БылиОшибки Тогда
diff --git a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияРеализация/Module.bsl b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияРеализация/Module.bsl
index 26bf5e1c3..5f267173c 100644
--- a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияРеализация/Module.bsl
+++ b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияРеализация/Module.bsl
@@ -257,50 +257,35 @@
УстановитьПривилегированныйРежим(Истина);
НачатьТранзакцию();
+
Попытка
+
ПользовательОбластиДанных = ПолучитьПользователяОбластиПоИдентификаторуПользователяСервиса(ИдентификаторПользователяСервиса);
- ИдентификаторПользователяИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПользовательОбластиДанных, "ИдентификаторПользователяИБ");
+ ЯзыкПользователяИБ = ПолучитьЯзыкПоКоду(КодЯзыка);
- Если ДоступРазрешен Тогда
- Если НЕ ЗначениеЗаполнено(ИдентификаторПользователяИБ)
- ИЛИ ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ИдентификаторПользователяИБ) = Неопределено Тогда
-
- ЯзыкПользователяИБ = ПолучитьЯзыкПоКоду(КодЯзыка);
-
- ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();
- ОписаниеПользователяИБ.Вставить("Действие", "Записать");
- ОписаниеПользователяИБ.Имя = Имя;
- ОписаниеПользователяИБ.Язык = ЯзыкПользователяИБ;
- ОписаниеПользователяИБ.СохраняемоеЗначениеПароля = ХэшПароля;
- ОписаниеПользователяИБ.АутентификацияСтандартная = Истина;
- ОписаниеПользователяИБ.АутентификацияOpenID = Истина;
- ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Ложь;
-
- ПользовательОбъект = ПользовательОбластиДанных.ПолучитьОбъект();
- ПользовательОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ);
- ПользовательОбъект.ДополнительныеСвойства.Вставить("ОбработкаСообщенияКаналаУдаленногоАдминистрирования");
- ПользовательОбъект.Записать();
-
- КонецЕсли;
-
- Иначе
-
- Если ЗначениеЗаполнено(ИдентификаторПользователяИБ) Тогда
- ОписаниеПользователяИБ = Новый Структура;
- ОписаниеПользователяИБ.Вставить("Действие", "Удалить");
-
- ПользовательОбъект = ПользовательОбластиДанных.ПолучитьОбъект();
- ПользовательОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ);
- ПользовательОбъект.ДополнительныеСвойства.Вставить("ОбработкаСообщенияКаналаУдаленногоАдминистрирования");
- ПользовательОбъект.Записать();
- КонецЕсли;
- КонецЕсли;
+ ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();
+ ОписаниеПользователяИБ.Вставить("Действие", "Записать");
+ ОписаниеПользователяИБ.Вставить("ВходВПрограммуРазрешен", ДоступРазрешен);
+ ОписаниеПользователяИБ.Имя = Имя;
+ ОписаниеПользователяИБ.Язык = ЯзыкПользователяИБ;
+ ОписаниеПользователяИБ.СохраняемоеЗначениеПароля = ХэшПароля;
+ ОписаниеПользователяИБ.АутентификацияСтандартная = Истина;
+ ОписаниеПользователяИБ.АутентификацияOpenID = Истина;
+ ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Ложь;
+
+ ПользовательОбъект = ПользовательОбластиДанных.ПолучитьОбъект();
+ ПользовательОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ);
+ ПользовательОбъект.ДополнительныеСвойства.Вставить("ОбработкаСообщенияКаналаУдаленногоАдминистрирования");
+ ПользовательОбъект.Записать();
ЗафиксироватьТранзакцию();
+
Исключение
+
ОтменитьТранзакцию();
ВызватьИсключение;
+
КонецПопытки;
КонецПроцедуры
@@ -338,8 +323,7 @@
Если СтрокаПараметра = Неопределено Тогда
ШаблонСообщения = НСтр("ru = 'Не известное имя параметра %1'");
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, КлючИЗначение.Ключ);
- ЗаписьЖурналаРегистрации(НСтр("ru ='УдаленноеАдминистрирование.УстановитьПараметрыИБ'",
- ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУдаленноеАдминистрирование(),
УровеньЖурналаРегистрации.Предупреждение, , , ТекстСообщения);
Продолжить;
ИначеЕсли СтрокаПараметра.ЗапретЗаписи Тогда
@@ -370,8 +354,7 @@
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
- ЗаписьЖурналаРегистрации(НСтр("ru = 'Установка параметров ИБ'",
- ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУдаленноеАдминистрирование(),
УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
@@ -389,43 +372,30 @@
Знач ПредставлениеОбластиДанных,
Знач ЧасовойПоясОбластиДанных = Неопределено) Экспорт
- ВнешнийМонопольныйРежим = МонопольныйРежим();
-
- Если Не ВнешнийМонопольныйРежим Тогда
- РаботаВМоделиСервиса.ЗаблокироватьТекущуюОбластьДанных();
- КонецЕсли;
-
УстановитьПривилегированныйРежим(Истина);
НачатьТранзакцию();
+
Попытка
- ОбновитьПараметрыТекущейОбластиДанных(ПредставлениеОбластиДанных, ЧасовойПоясОбластиДанных);
-
Если Не ПустаяСтрока(ПредставлениеОбластиДанных) Тогда
+
ОбновитьСвойстваПредопределенныхУзлов(ПредставлениеОбластиДанных);
+
КонецЕсли;
ЗафиксироватьТранзакцию();
- Если Не ВнешнийМонопольныйРежим Тогда
- РаботаВМоделиСервиса.РазблокироватьТекущуюОбластьДанных();
- КонецЕсли;
-
Исключение
ОтменитьТранзакцию();
-
- Если Не ВнешнийМонопольныйРежим Тогда
- РаботаВМоделиСервиса.РазблокироватьТекущуюОбластьДанных();
- КонецЕсли;
-
ВызватьИсключение;
КонецПопытки;
+ ОбновитьПараметрыТекущейОбластиДанных(ПредставлениеОбластиДанных, ЧасовойПоясОбластиДанных);
+
КонецПроцедуры
-
// Обработка входящих сообщений с типом http://www.1c.ru/SaaS/RemoteAdministration/App/a.b.c.d}SetFullControl.
//
// Параметры:
@@ -554,12 +524,6 @@
//
Процедура ПрикрепитьОбластьДанных(Параметры) Экспорт
- ВнешнийМонопольныйРежим = МонопольныйРежим();
-
- Если Не ВнешнийМонопольныйРежим Тогда
- РаботаВМоделиСервиса.ЗаблокироватьТекущуюОбластьДанных();
- КонецЕсли;
-
УстановитьПривилегированныйРежим(Истина);
НачатьТранзакцию();
@@ -584,8 +548,6 @@
МенеджерЗаписи = КопияМенеджера;
МенеджерЗаписи.Записать();
- ОбновитьПараметрыТекущейОбластиДанных(Параметры.Presentation, Параметры.TimeZone);
-
// Создание администраторов в области.
Для каждого ОписаниеПользователя Из Параметры.UsersList.Item Цикл
ЯзыкПользователя = ПолучитьЯзыкПоКоду(ОписаниеПользователя.Language);
@@ -681,22 +643,15 @@
ЗафиксироватьТранзакцию();
- Если Не ВнешнийМонопольныйРежим Тогда
- РаботаВМоделиСервиса.РазблокироватьТекущуюОбластьДанных();
- КонецЕсли;
-
Исключение
ОтменитьТранзакцию();
-
- Если Не ВнешнийМонопольныйРежим Тогда
- РаботаВМоделиСервиса.РазблокироватьТекущуюОбластьДанных();
- КонецЕсли;
-
ВызватьИсключение;
КонецПопытки;
+ ОбновитьПараметрыТекущейОбластиДанных(Параметры.Presentation, Параметры.TimeZone);
+
СообщенияВМоделиСервиса.ДоставитьБыстрыеСообщения();
КонецПроцедуры
@@ -843,15 +798,58 @@
Процедура ОбновитьПараметрыТекущейОбластиДанных(Знач Представление, Знач ЧасовойПояс)
Константы.ПредставлениеОбластиДанных.Установить(Представление);
-
- Если ЗначениеЗаполнено(ЧасовойПояс) Тогда
- УстановитьЧасовойПоясИнформационнойБазы(ЧасовойПояс);
- Иначе
- УстановитьЧасовойПоясИнформационнойБазы();
- КонецЕсли;
-
Константы.ЧасовойПоясОбластиДанных.Установить(ЧасовойПояс);
+ Если ПолучитьЧасовойПоясИнформационнойБазы() <> ЧасовойПояс Тогда
+
+ ВнешнийМонопольныйРежим = МонопольныйРежим();
+
+ Если ВнешнийМонопольныйРежим Тогда
+
+ ОбластьЗаблокирована = Истина;
+
+ Иначе
+
+ Попытка
+
+ РаботаВМоделиСервиса.ЗаблокироватьТекущуюОбластьДанных();
+ ОбластьЗаблокирована = Истина;
+
+ Исключение
+
+ ОбластьЗаблокирована = Ложь;
+
+ ШаблонСообщения = НСтр("ru = 'Не удалось заблокировать область данных для установки часового пояса ""%1""'");
+ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ЧасовойПояс);
+ ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииУдаленноеАдминистрирование(),
+ УровеньЖурналаРегистрации.Ошибка, , , ТекстСообщения);
+
+ КонецПопытки;
+
+ КонецЕсли;
+
+ Если ОбластьЗаблокирована Тогда
+
+ Если ЗначениеЗаполнено(ЧасовойПояс) Тогда
+
+ УстановитьЧасовойПоясИнформационнойБазы(ЧасовойПояс);
+
+ Иначе
+
+ УстановитьЧасовойПоясИнформационнойБазы();
+
+ КонецЕсли;
+
+ Если НЕ ВнешнийМонопольныйРежим Тогда
+
+ РаботаВМоделиСервиса.РазблокироватьТекущуюОбластьДанных();
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
КонецПроцедуры
Процедура ОбновитьСвойстваПредопределенныхУзлов(Знач Наименование)
@@ -905,4 +903,10 @@
КонецФункции
+Функция СобытиеЖурналаРегистрацииУдаленноеАдминистрирование()
+
+ Возврат НСтр("ru = 'Удаленное администрирование в модели сервиса.Установить параметры'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка());
+
+КонецФункции
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl
index 651783669..c4f83f7f7 100644
--- a/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl
+++ b/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl
@@ -44,6 +44,8 @@
ПараметрыКлиента.Вставить("ЭтоВебКлиент", Параметры.ЭтоВебКлиент);
ПараметрыКлиента.Вставить("ЭтоВебКлиентПодMacOS", Параметры.ЭтоВебКлиентПодMacOS);
ПараметрыКлиента.Вставить("ЭтоLinuxКлиент", Параметры.ЭтоLinuxКлиент);
+ ПараметрыКлиента.Вставить("ОперативнаяПамять", Параметры.ОперативнаяПамять);
+
ПараметрыСеанса.ПараметрыКлиентаНаСервере = Новый ФиксированноеСоответствие(ПараметрыКлиента);
Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl
index 5744aa056..4f05ee082 100644
--- a/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl
+++ b/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl
@@ -27,4 +27,9 @@
МодульИнформацияПриЗапускеКлиент.Показать();
КонецПроцедуры
+// Показывает сообщение пользователю о недостаточном объеме оперативной памяти.
+Процедура ПоказатьРекомендациюПоОбъемуОперативнойПамяти() Экспорт
+ СтандартныеПодсистемыКлиент.ОповеститьОНехваткеПамяти();
+КонецПроцедуры
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl
index 727f345ce..dc6adfd4d 100644
--- a/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl
+++ b/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl
@@ -195,7 +195,9 @@
//
Процедура ПередНачаломРаботыСистемы(Знач ОповещениеЗавершения = Неопределено) Экспорт
- ПараметрыПриложения = Новый Соответствие;
+ Если ПараметрыПриложения = Неопределено Тогда
+ ПараметрыПриложения = Новый Соответствие;
+ КонецЕсли;
Если ОповещениеЗавершения <> Неопределено Тогда
ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("СтандартныеПодсистемыКлиент.ПередНачаломРаботыСистемы",
@@ -582,7 +584,7 @@
Возврат ПараметрыПредупреждения;
КонецФункции
-
+
// После предупреждения вызывает процедуру с параметрами Результат, ДополнительныеПараметры.
//
// Параметры:
@@ -643,7 +645,7 @@
// возвращая идентичный результат вне зависимости от того, подключено расширение работы с файлами, или нет.
//
// Параметры:
-// ОбработчикРезультата - ОписаниеОповещения - Описание процедуры, принимающей результат выбора.
+// ОбработчикЗавершения - ОписаниеОповещения - Описание процедуры, принимающей результат выбора.
// ИдентификаторФормы - УникальныйИдентификатор - Уникальный идентификатор формы, из которой выполняется
// размещение файла.
// НачальноеИмяФайла - Строка - Полный путь и имя файла, которые будут предложены пользователю в начале выбора.
@@ -663,60 +665,15 @@
// Не поддерживается множественный выбор в веб-клиенте, если не установлено расширение работы с файлами.
// Не поддерживается передача адреса временного хранилища.
//
-Процедура ПоказатьПомещениеФайла(ОбработчикРезультата, ИдентификаторФормы, НачальноеИмяФайла, ПараметрыДиалога) Экспорт
+Процедура ПоказатьПомещениеФайла(ОбработчикЗавершения, ИдентификаторФормы, НачальноеИмяФайла, ПараметрыДиалога) Экспорт
+ Параметры = Новый Структура;
+ Параметры.Вставить("ОбработчикЗавершения", ОбработчикЗавершения);
+ Параметры.Вставить("ИдентификаторФормы", ИдентификаторФормы);
+ Параметры.Вставить("НачальноеИмяФайла", НачальноеИмяФайла);
+ Параметры.Вставить("ПараметрыДиалога", ПараметрыДиалога);
- ДополнительныеПараметры = Новый Структура;
- ДополнительныеПараметры.Вставить("ОбработчикРезультата", ОбработчикРезультата);
-
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
-
- Если ПараметрыДиалога = Неопределено Тогда
- ПараметрыДиалога = Новый Структура;
- КонецЕсли;
- Если ПараметрыДиалога.Свойство("Режим") Тогда
- Режим = ПараметрыДиалога.Режим;
- Если Режим = РежимДиалогаВыбораФайла.ВыборКаталога Тогда
- ВызватьИсключение НСтр("ru = 'Выбор каталога не поддерживается'");
- КонецЕсли;
- Иначе
- Режим = РежимДиалогаВыбораФайла.Открытие;
- КонецЕсли;
-
- Диалог = Новый ДиалогВыбораФайла(Режим);
- Диалог.ПолноеИмяФайла = НачальноеИмяФайла;
- ЗаполнитьЗначенияСвойств(Диалог, ПараметрыДиалога);
-
- ПомещенныеФайлы = Новый Массив;
- ВыборВыполнен = ПоместитьФайлы(, ПомещенныеФайлы, Диалог, Истина, ИдентификаторФормы);
- ОбработатьРезультатПомещенияФайла(ВыборВыполнен, ПомещенныеФайлы, Неопределено, ДополнительныеПараметры);
-
- Иначе
-
- Обработчик = Новый ОписаниеОповещения("ОбработатьРезультатПомещенияФайла", ЭтотОбъект, ДополнительныеПараметры);
- НачатьПомещениеФайла(Обработчик, , НачальноеИмяФайла, Истина, ИдентификаторФормы);
-
- КонецЕсли;
-
-КонецПроцедуры
-
-// Обработчик результата работы процедуры ПоказатьПомещениеФайла.
-//
-Процедура ОбработатьРезультатПомещенияФайла(ВыборВыполнен, АдресИлиРезультатВыбора, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
- Если ВыборВыполнен = Истина Тогда
- Если ТипЗнч(АдресИлиРезультатВыбора) = Тип("Массив") Тогда
- ПомещенныеФайлы = АдресИлиРезультатВыбора;
- Иначе
- ОписаниеФайла = Новый Структура;
- ОписаниеФайла.Вставить("Хранение", АдресИлиРезультатВыбора);
- ОписаниеФайла.Вставить("Имя", ВыбранноеИмяФайла);
- ПомещенныеФайлы = Новый Массив;
- ПомещенныеФайлы.Добавить(ОписаниеФайла);
- КонецЕсли;
- Иначе
- ПомещенныеФайлы = Неопределено;
- КонецЕсли;
-
- ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ПомещенныеФайлы);
+ ОписаниеОповещения = Новый ОписаниеОповещения("ПоказатьПомещениеФайлаПриПодключенииРасширенияРаботыСФайлами", ЭтотОбъект, Параметры);
+ ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения);
КонецПроцедуры
// Открыть диалог для ввода логина и пароля пользователя Интернет-поддержки.
@@ -732,17 +689,64 @@
КонецПроцедуры
+// Возвращает имя исполняемого файла в зависимости от вида клиента и версии платформы.
+//
+Функция ИмяИсполняемогоФайлаПриложения(ПолучитьФайлаКонфигуратора = Ложь) Экспорт
+
+ ШаблонИмениФайла = "1cv8[ТонкийКлиент][УчебнаяПлатформа].exe";
+
+ ЭтоУчебнаяПлатформа = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоУчебнаяПлатформа;
+
+ #Если ТонкийКлиент Тогда
+ ЭтоТонкийКлиент = Не ПолучитьФайлаКонфигуратора;
+ #Иначе
+ ЭтоТонкийКлиент = Ложь;
+ #КонецЕсли
+
+ ИмяФайла = СтрЗаменить(ШаблонИмениФайла, "[ТонкийКлиент]", ?(ЭтоТонкийКлиент, "c", ""));
+ ИмяФайла = СтрЗаменить(ИмяФайла, "[УчебнаяПлатформа]", ?(ЭтоУчебнаяПлатформа, "t", ""));
+
+ Возврат ИмяФайла;
+
+КонецФункции
+
+// Устанавливает / отменяет хранение ссылки на управляемую форму в глобальной переменной.
+// Требуется для случаев, когда ссылка на форму передается через ДополнительныеПараметры
+// в объекте ОписаниеОповещения, который не блокирует освобождение закрытой формы.
+//
+Процедура УстановитьХранениеФормы(Форма, Хранение) Экспорт
+
+#Если ВебКлиент Тогда
+ Хранилище = ПараметрыПриложения["СтандартныеПодсистемы.ВременноеХранилищеСсылокНаУправляемыеФормы"];
+ Если Хранилище = Неопределено Тогда
+ Хранилище = Новый Соответствие;
+ ПараметрыПриложения.Вставить("СтандартныеПодсистемы.ВременноеХранилищеСсылокНаУправляемыеФормы", Хранилище);
+ КонецЕсли;
+
+ Если Хранение Тогда
+ Хранилище.Вставить(Форма, Новый Структура("Форма", Форма));
+ ИначеЕсли Хранилище.Получить(Форма) <> Неопределено Тогда
+ Хранилище.Удалить(Форма);
+ КонецЕсли;
+#КонецЕсли
+
+КонецПроцедуры
+
////////////////////////////////////////////////////////////////////////////////
// Обработка результата выполнения.
// Выводит результат выполнения какой-либо операции.
//
// Предназначена только для отображения результата работы сервера на клиенте,
-// не предназначена для отображения промежуточных стадий - диалогов и т.п..
+// не предназначена для отображения промежуточных стадий - диалогов и т.п.
//
// См. также:
// СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения()
-// СтандартныеПодсистемыКлиентСервер.ПодготовитьОповещениеДинамическихСписков()
+// СтандартныеПодсистемыКлиентСервер.ОповеститьДинамическиеСписки()
+// СтандартныеПодсистемыКлиентСервер.ВывестиПредупреждение()
+// СтандартныеПодсистемыКлиентСервер.ВывестиСообщение()
+// СтандартныеПодсистемыКлиентСервер.ВывестиОповещение()
+// СтандартныеПодсистемыКлиентСервер.РазвернутьУзлыДерева()
//
// Параметры:
// Форма - УправляемаяФорма - Форма, для которой требуется вывод.
@@ -878,7 +882,7 @@
ОбработчикЗавершенияБудетВыполнен = Ложь;
Если ТипЗнч(Ответ) = Тип("Число") Тогда
Если Ответ = 1 Тогда
- ПолныйТекст = Результат.ВыводПредупреждения.Текст + Символы.ПС + Символы.ПС + Результат.ВыводПредупреждения.ТекстОшибок;
+ ПолныйТекст = Строка(Результат.ВыводПредупреждения.Текст) + Символы.ПС + Символы.ПС + Результат.ВыводПредупреждения.ТекстОшибок;
Заголовок = Результат.ВыводПредупреждения.Заголовок;
Если ПустаяСтрока(Заголовок) Тогда
Заголовок = НСтр("ru = 'Подробнее'");
@@ -1789,7 +1793,9 @@
Параметры = ПараметрыПриЗапускеИЗавершенииПрограммы.ПараметрыОбработкиЗавершения;
ПараметрыПриЗапускеИЗавершенииПрограммы.Удалить("ПараметрыОбработкиЗавершения");
- ВыполнитьОбработкуОповещения(Параметры.ИнтерактивнаяОбработка, Параметры);
+ ИнтерактивнаяОбработка = Параметры.ИнтерактивнаяОбработка;
+ Параметры.ИнтерактивнаяОбработка = Неопределено;
+ ВыполнитьОбработкуОповещения(ИнтерактивнаяОбработка, Параметры);
КонецПроцедуры
@@ -1825,6 +1831,14 @@
КонецПроцедуры
+Процедура ПослеНачалаРаботыСистемы() Экспорт
+
+ Если ТребуетсяПоказРекомендацииПоОбъемуОперативнойПамяти() Тогда
+ ПодключитьОбработчикОжидания("ПоказатьРекомендациюПоОбъемуОперативнойПамяти", 10, Истина);
+ КонецЕсли;
+
+КонецПроцедуры
+
////////////////////////////////////////////////////////////////////////////////
// Вспомогательные процедуры и функции.
@@ -2288,5 +2302,84 @@
КонецПроцедуры
+Процедура ПоказатьПомещениеФайлаПриПодключенииРасширенияРаботыСФайлами(РасширениеПодключено, ДополнительныеПараметры) Экспорт
+
+ ОбработчикЗавершения = ДополнительныеПараметры.ОбработчикЗавершения;
+ ИдентификаторФормы = ДополнительныеПараметры.ИдентификаторФормы;
+ НачальноеИмяФайла = ДополнительныеПараметры.НачальноеИмяФайла;
+ ПараметрыДиалога = ДополнительныеПараметры.ПараметрыДиалога;
+
+ Если Не РасширениеПодключено Тогда
+ Обработчик = Новый ОписаниеОповещения("ОбработатьРезультатПомещенияФайла", ЭтотОбъект, ОбработчикЗавершения);
+ НачатьПомещениеФайла(Обработчик, , НачальноеИмяФайла, Истина, ИдентификаторФормы);
+ Возврат;
+ КонецЕсли;
+
+ Если ПараметрыДиалога = Неопределено Тогда
+ ПараметрыДиалога = Новый Структура;
+ КонецЕсли;
+ Если ПараметрыДиалога.Свойство("Режим") Тогда
+ Режим = ПараметрыДиалога.Режим;
+ Если Режим = РежимДиалогаВыбораФайла.ВыборКаталога Тогда
+ ВызватьИсключение НСтр("ru = 'Выбор каталога не поддерживается'");
+ КонецЕсли;
+ Иначе
+ Режим = РежимДиалогаВыбораФайла.Открытие;
+ КонецЕсли;
+
+ Диалог = Новый ДиалогВыбораФайла(Режим);
+ Диалог.ПолноеИмяФайла = НачальноеИмяФайла;
+ ЗаполнитьЗначенияСвойств(Диалог, ПараметрыДиалога);
+
+ ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьРезультатПомещенияФайлов", ЭтотОбъект, ОбработчикЗавершения);
+
+ Если ИдентификаторФормы <> Неопределено Тогда
+ НачатьПомещениеФайлов(ОписаниеОповещения, , Диалог, Истина, ИдентификаторФормы);
+ Иначе
+ НачатьПомещениеФайлов(ОписаниеОповещения, , Диалог, Истина);
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ОбработатьРезультатПомещенияФайлов(ПомещенныеФайлы, ОбработчикЗавершения) Экспорт
+ ВыборВыполнен = ПомещенныеФайлы <> Неопределено;
+ ОбработатьРезультатПомещенияФайла(ВыборВыполнен, ПомещенныеФайлы, Неопределено, ОбработчикЗавершения);
+КонецПроцедуры
+
+Процедура ОбработатьРезультатПомещенияФайла(ВыборВыполнен, АдресИлиРезультатВыбора, ВыбранноеИмяФайла, ОбработчикЗавершения) Экспорт
+ Если ВыборВыполнен = Истина Тогда
+ Если ТипЗнч(АдресИлиРезультатВыбора) = Тип("Массив") Тогда
+ ПомещенныеФайлы = АдресИлиРезультатВыбора;
+ Иначе
+ ОписаниеФайла = Новый Структура;
+ ОписаниеФайла.Вставить("Хранение", АдресИлиРезультатВыбора);
+ ОписаниеФайла.Вставить("Имя", ВыбранноеИмяФайла);
+ ПомещенныеФайлы = Новый Массив;
+ ПомещенныеФайлы.Добавить(ОписаниеФайла);
+ КонецЕсли;
+ Иначе
+ ПомещенныеФайлы = Неопределено;
+ КонецЕсли;
+
+ ВыполнитьОбработкуОповещения(ОбработчикЗавершения, ПомещенныеФайлы);
+КонецПроцедуры
+
+Функция ТребуетсяПоказРекомендацииПоОбъемуОперативнойПамяти()
+ ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске();
+ Возврат ПараметрыКлиента.ТребуетсяПоказРекомендацииПоОбъемуОперативнойПамяти;
+КонецФункции
+
+Процедура ОповеститьОНехваткеПамяти() Экспорт
+ РекомендуемыйОбъем = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске().РекомендуемыйОбъемОперативнойПамяти;
+
+ Заголовок = НСтр("ru = 'Скорость работы снижена'");
+ Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Рекомендуется увеличить
+ | объем памяти до %1 Гб.'"), РекомендуемыйОбъем);
+
+ ПоказатьОповещениеПользователя(Заголовок,
+ "e1cib/app/Обработка.РекомендацияПоПовышениюСкоростиРаботы",
+ Текст, БиблиотекаКартинок.Предупреждение32);
+КонецПроцедуры
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl
index c92fb6dc4..254ced7c4 100644
--- a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl
+++ b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl
@@ -56,6 +56,10 @@
Параметры.Вставить("ЭтоLinuxКлиент", ЭтоLinuxКлиент);
Параметры.Вставить("СкрытьРабочийСтолПриНачалеРаботыСистемы", Ложь);
+ СистемнаяИнформация = Новый СистемнаяИнформация;
+ ОперативнаяПамять = Окр(СистемнаяИнформация.ОперативнаяПамять / 1024, 1);
+ Параметры.Вставить("ОперативнаяПамять", ОперативнаяПамять);
+
ПараметрыКлиента = СтандартныеПодсистемыВызовСервера.ПараметрыРаботыКлиентаПриЗапуске(Параметры);
// Обновление состояния скрытия рабочего стола на клиенте по состоянию на сервере.
@@ -74,12 +78,6 @@
//
Функция ПараметрыРаботыКлиента() Экспорт
- #Если ТонкийКлиент Тогда
- ИмяИсполняемогоФайлаКлиента = "1cv8c.exe";
- #Иначе
- ИмяИсполняемогоФайлаКлиента = "1cv8.exe";
- #КонецЕсли
-
ТекущаяДата = ТекущаяДата(); // Текущая дата клиентского компьютера.
ПараметрыРаботыКлиента = Новый Структура;
@@ -88,7 +86,6 @@
ПараметрыРаботыКлиента.Вставить(Параметр.Ключ, Параметр.Значение);
КонецЦикла;
ПараметрыРаботыКлиента.ПоправкаКВремениСеанса = ПараметрыРаботыКлиента.ПоправкаКВремениСеанса - ТекущаяДата;
- ПараметрыРаботыКлиента.Вставить("ИмяИсполняемогоФайлаКлиента", ИмяИсполняемогоФайлаКлиента);
Возврат Новый ФиксированнаяСтруктура(ПараметрыРаботыКлиента);
diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентСервер/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентСервер/Module.bsl
index 715465a2c..939b1278e 100644
--- a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентСервер/Module.bsl
+++ b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентСервер/Module.bsl
@@ -27,17 +27,21 @@
Возврат Результат;
КонецФункции
-// Добавляет оповещения для обновления динамических списков по массиву ссылок объектов.
+// Добавляет в структуру информацию о типах, которые необходимо обновить в динамических списках.
+// Действие выполняется на клиенте после вызова СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(Результат).
//
// Параметры:
-// ИзмененныеОбъекты - Массив - Ссылки измененных объектов.
// Результат - Структура - См. СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения().
+// ИзмененныеОбъекты - Массив - Ссылки измененных объектов.
//
-Процедура ПодготовитьОповещениеДинамическихСписков(ИзмененныеОбъекты, Результат) Экспорт
+Процедура ОповеститьДинамическиеСписки(Результат, ИзмененныеОбъекты) Экспорт
Если ТипЗнч(ИзмененныеОбъекты) <> Тип("Массив") Или ИзмененныеОбъекты.Количество() = 0 Тогда
Возврат;
КонецЕсли;
+ Если Не Результат.Свойство("ОповещениеДинамическихСписков") Тогда
+ Результат.Вставить("ОповещениеДинамическихСписков", Новый Структура("Использование, СсылкаИлиТип", Ложь));
+ КонецЕсли;
Оповещение = Результат.ОповещениеДинамическихСписков;
Оповещение.Использование = Истина;
@@ -66,7 +70,8 @@
КонецЕсли;
КонецПроцедуры
-// Добавляет в оповещение для динамических списков типы из массива измененных объектов.
+// Добавляет в структуру информацию о событии, о котором надо оповестить все открытые формы.
+// Действие выполняется на клиенте после вызова СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(Результат).
//
// Параметры:
// Результат - Структура - См. СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения().
@@ -86,7 +91,8 @@
Результат.ОповещениеФорм.Добавить(ОповещениеФорм);
КонецПроцедуры
-// Добавляет в оповещение для динамических списков типы из массива измененных объектов.
+// Добавляет в структуру информацию об узлах дерева, которые необходимо "развернуть".
+// Действие выполняется на клиенте после вызова СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(Результат).
//
// Параметры:
// Результат - Структура - См. СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения().
@@ -115,7 +121,8 @@
Результат.РазворачиваемыеУзлы.Добавить(РазворачиваемыйУзел);
КонецПроцедуры
-// Добавляет в структуру информацию, необходимую для вывода предупреждения.
+// Добавляет в структуру информацию, необходимую для вывода предупреждения или текста ошибки.
+// Действие выполняется на клиенте после вызова СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(Результат).
//
// Параметры:
// Результат - Структура - См. СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения().
@@ -124,7 +131,7 @@
// Заголовок - Строка - Необязательный. Заголовок окна.
// ПутьКРеквизитуФормы - Строка - Необязательный. Путь к реквизиту формы, значение которого вызывало ошибку.
//
-Процедура РезультатВыполненияДобавитьПредупреждение(Результат, Текст, ТекстОшибок = "", Заголовок = "", ПутьКРеквизитуФормы = "") Экспорт
+Процедура ВывестиПредупреждение(Результат, Текст, ТекстОшибок = "", Заголовок = "", ПутьКРеквизитуФормы = "") Экспорт
ВыводПредупреждения = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Результат, "ВыводПредупреждения");
Если ВыводПредупреждения = Неопределено Тогда
ВыводПредупреждения = Новый Структура("Использование, Заголовок, Текст, ПутьКРеквизитуФормы, ТекстОшибок", Ложь);
@@ -137,7 +144,27 @@
ВыводПредупреждения.ПутьКРеквизитуФормы = ПутьКРеквизитуФормы;
КонецПроцедуры
+// Добавляет в структуру информацию, необходимую для вывода сообщения о неверно заполненных полях формы.
+// Действие выполняется на клиенте после вызова СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(Результат).
+//
+// Параметры:
+// Результат - Структура - См. СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения().
+// Текст - Строка - Текст сообщения.
+// ПутьКРеквизитуФормы - Строка - Необязательный. Путь к реквизиту формы, значение которого вызывало ошибку.
+//
+Процедура ВывестиСообщение(Результат, Текст, ПутьКРеквизитуФормы = "") Экспорт
+ ВыводСообщения = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Результат, "ВыводСообщения");
+ Если ВыводСообщения = Неопределено Тогда
+ ВыводСообщения = Новый Структура("Использование, Текст, ПутьКРеквизитуФормы", Ложь);
+ Результат.Вставить("ВыводСообщения", ВыводСообщения);
+ КонецЕсли;
+ ВыводСообщения.Использование = Истина;
+ ВыводСообщения.Текст = Текст;
+ ВыводСообщения.ПутьКРеквизитуФормы = ПутьКРеквизитуФормы;
+КонецПроцедуры
+
// Добавляет в структуру информацию, необходимую для вывода всплывающего оповещения.
+// Действие выполняется на клиенте после вызова СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(Результат).
//
// Параметры:
// Результат - Структура - См. СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения().
diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl
index a4e9b4103..54b5d1824 100644
--- a/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl
+++ b/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl
@@ -88,6 +88,25 @@
КонецФункции
+// Проверят, что выполнение происходит на учебной платформе,
+// на которой, например, недоступно получение свойства ПользовательОС.
+//
+Функция ЭтоУчебнаяПлатформа() Экспорт
+
+ УстановитьПривилегированныйРежим(Истина);
+
+ ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
+
+ Попытка
+ ПользовательОС = ТекущийПользователь.ПользовательОС;
+ Исключение
+ ТекущийПользователь = Неопределено;
+ КонецПопытки;
+
+ Возврат ТекущийПользователь = Неопределено;
+
+КонецФункции
+
// Обновляет кэши свойств метаданных, позволяющие ускорить
// открытие сеанса, а также обновление ИБ, особенно в модели сервиса.
// Их обновление происходит до обновления ИБ.
@@ -159,22 +178,26 @@
// Работа с событиями служебного программного интерфейса.
// Использование только в пределах библиотеки и отдельно от других библиотек.
-// Доопределяет события, к которым можно будет добавить обработчики
-// через процедуру ПриДобавленииОбработчиковСлужебныхСобытий.
+// Определяет список служебных событий.
+// Каждая подсистема может предоставлять произвольный набор своих событий для того,
+// чтобы на них мог подписаться внешний код (с помощью процедуры ПриДобавленииОбработчиковСлужебныхСобытий).
+// В зависимости от контекста работы, события могут вызываться с клиента или из серверного кода.
+// Полный список этих событий задается в параметрах КлиентскиеСобытия и СерверныеСобытия.
+// Имена событий должны быть заданы по образцу: "имя_подсистемы\имя_события",
+// например: "СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииФормыАктивныхПользователей".
//
// Параметры:
-// КлиентскиеСобытия - Массив - список значений типа Строка - полное имя события.
-// СерверныеСобытия - Массив - список значений типа Строка - полное имя события.
+// КлиентскиеСобытия - Массив - массив полных имен клиентских событий (Строка).
+// СерверныеСобытия - Массив - массив полных имен серверных событий (Строка).
//
-// Для упрощения поддержки, рекомендуется делать вызов такой же
-// процедуры в общем модуле библиотеки.
+// Пример использования:
//
-// Пример использования в общем модуле библиотеки:
-//
-// // Переопределяет стандартное предупреждение открытием произвольной формы активных пользователей.
+// // Определяет событие, которое возникает при открытии формы активных пользователей,
+// // которая принадлежит подсистеме СтандартныеПодсистемы.БазоваяФункциональность.
+// // В обработчиках этого события можно переопределить стандартное поведение.
// //
// // Параметры:
-// // ИмяФормы - Строка (возвращаемое значение).
+// // ИмяФормы - Строка - возвращаемое значение.
// //
// // Синтаксис:
// // Процедура ПриОткрытииФормыАктивныхПользователей(ИмяФормы) Экспорт
@@ -280,26 +303,26 @@
КонецПроцедуры
-// Доопределяет обработчики служебных событий, объявленных
-// через процедуру ПриДобавленииСлужебныхСобытий.
+// Определяет список обработчиков служебных событий (объявленных в ПриДобавленииСлужебныхСобытий - см. выше).
//
// Параметры:
// КлиентскиеОбработчики - Соответствие - список обработчиков:
-// * Ключ - Строка - полное имя события,
-// * Значение - Массив - массив имен клиентских общих модулей обработчиков.
+// * Ключ - Строка - полное имя события,
+// * Значение - Массив - массив имен клиентских общих модулей с процедурой-обработчиком события.
//
// СерверныеОбработчики - Соответствие - список обработчиков:
-// * Ключ - Строка - полное имя события,
-// * Значение - Массив - массив имен серверных общих модулей обработчиков.
+// * Ключ - Строка - полное имя события,
+// * Значение - Массив - массив имен серверных общих модулей с процедурой-обработчиком события.
//
-// Для упрощения поддержки, рекомендуется делать вызов такой же
-// процедуры в общем модуле библиотеки.
+// Имя процедуры-обработчика события совпадает с именем события.
//
-// Пример использования в общем модуле библиотеки:
+// Пример подписки на событие ПриОпределенииФормыАктивныхПользователей подсистемы БазоваяФункциональность:
//
// СерверныеОбработчики[
// "СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииФормыАктивныхПользователей"
-// ].Добавить(СоединенияИБ);
+// ].Добавить("СоединенияИБ");
+// При этом в общем модуле СоединенияИБ должна быть определена процедура-обработчик
+// ПриОпределенииФормыАктивныхПользователей с параметрами, которые соответствуют параметрам события.
//
Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт
@@ -589,6 +612,11 @@
МодульЭлектроннаяПодписьСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики);
КонецЕсли;
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСКонтрагентами") Тогда
+ МодульПроверкаКонтрагентов = ОбщегоНазначения.ОбщийМодуль("ПроверкаКонтрагентов");
+ МодульПроверкаКонтрагентов.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики);
+ КонецЕсли;
+
КонецПроцедуры
// Определить список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла".
@@ -610,6 +638,22 @@
КонецПроцедуры
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.Справочники.ИдентификаторыОбъектовМетаданных.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
// Получает идентификатор информационной базы.
// Если идентификатор не заполнен, то устанавливает его значение.
// Константа ИдентификаторИнформационнойБазы не должна входить в составы планов обмена и иметь
@@ -648,7 +692,7 @@
Результат = Новый Структура("Логин,Пароль");
Результат.Логин = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("АутентификацияНаПользовательскомСайте", "КодПользователя", "");
Результат.Пароль = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("АутентификацияНаПользовательскомСайте", "Пароль", "");
- Возврат ?(Результат.Логин <> "", Результат, Неопределено);
+ Возврат ?(Результат.Логин <> "" И Результат.Пароль <> "", Результат, Неопределено);
КонецЕсли;
КонецФункции
@@ -700,6 +744,37 @@
КонецФункции
+// Запуск фонового задания с контекстом клиента. Например, передаются ПараметрыКлиентаНаСервере.
+// Запуск выполняется с помощью процедуры ВыполнитьМетодКонфигурации общего модуля РаботаВБезопасномРежиме.
+//
+// Параметры:
+// ИмяМетода - Строка - как в функции Выполнить менеджера фоновых заданий.
+// Параметры - Массив - как в функции Выполнить менеджера фоновых заданий.
+// Ключ - Строка - как в функции Выполнить менеджера фоновых заданий.
+// Наименование - Строка - как в функции Выполнить менеджера фоновых заданий.
+//
+// Возвращаемое значение:
+// ФоновоеЗадание.
+//
+Функция ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяМетода, Параметры = Неопределено, Ключ = "", Наименование = "") Экспорт
+
+ Если ТекущийРежимЗапуска() = Неопределено Тогда
+ ВызватьИсключение НСтр("ru = 'Запуск фонового задания с контекстом клиента возможен только при наличии клиента.'");
+ КонецЕсли;
+
+ ВсеПараметры = Новый Структура;
+ ВсеПараметры.Вставить("ИмяМетода", ИмяМетода);
+ ВсеПараметры.Вставить("Параметры", Параметры);
+ ВсеПараметры.Вставить("ПараметрыКлиентаНаСервере", ПараметрыКлиентаНаСервере());
+
+ ПараметрыПроцедурыФоновогоЗадания = Новый Массив;
+ ПараметрыПроцедурыФоновогоЗадания.Добавить(ВсеПараметры);
+
+ Возврат ФоновыеЗадания.Выполнить("СтандартныеПодсистемыСервер.ПередЗапускомФоновогоЗаданияСКонтекстомКлиента",
+ ПараметрыПроцедурыФоновогоЗадания, Ключ, Наименование);
+
+КонецФункции
+
////////////////////////////////////////////////////////////////////////////////
// Дополнительная базовая функциональность обновления информационной базы.
@@ -1530,7 +1605,7 @@
//
Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Знач Отправитель = Неопределено) Экспорт
- ИгнорироватьПолучениеОбъектовНачальногоОбраза(ЭлементДанных, ПолучениеЭлемента);
+ ПроверитьПолучениеОбъектовНачальногоОбраза(ЭлементДанных, ПолучениеЭлемента, Отправитель);
Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда
Возврат;
@@ -1563,7 +1638,7 @@
//
Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Знач Отправитель = Неопределено) Экспорт
- ИгнорироватьПолучениеОбъектовНачальногоОбраза(ЭлементДанных, ПолучениеЭлемента);
+ ПроверитьПолучениеОбъектовНачальногоОбраза(ЭлементДанных, ПолучениеЭлемента, Отправитель);
Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда
Возврат;
@@ -1850,6 +1925,48 @@
КонецПроцедуры
+////////////////////////////////////////////////////////////////////////////////
+// Процедуры и функции работы с файловой системой.
+
+// Добавляет новый каталог временных файлов.
+// Используется в связке с ОчиститьКаталогВременныхФайлов.
+//
+// Параметры:
+// Расширение - Строка - Расширение каталога.
+// В качестве расширения полезно указывать аббревиатуру подсистемы, чтобы было понятно "кто за собой не убрал".
+// Рекомендуется указывать на английском языке, чтобы исключить ошибки ОС.
+//
+// Возвращаемое значение:
+// Строка - Полный путь к каталогу с последним слешем.
+//
+Функция СоздатьКаталогВременныхФайлов(Расширение) Экспорт
+ ПутьККаталогу = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла(Расширение));
+ СоздатьКаталог(ПутьККаталогу);
+ Возврат ПутьККаталогу;
+КонецФункции
+
+// Добавляет новый каталог временных файлов.
+// Используется в связке с СоздатьКаталогВременныхФайлов.
+//
+// Параметры:
+// ПутьККаталогу - Строка - Полный путь к каталогу.
+//
+Процедура ОчиститьКаталогВременныхФайлов(ПутьККаталогу) Экспорт
+ Попытка
+ УдалитьФайлы(ПутьККаталогу);
+ Исключение
+ ЗаписьЖурналаРегистрации(
+ НСтр("ru = 'Стандартные подсистемы'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
+ УровеньЖурналаРегистрации.Ошибка,
+ ,
+ ,
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Ошибка очистки каталога временных файлов ""%1"":%2'"),
+ ПутьККаталогу,
+ Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
+ КонецПопытки;
+КонецПроцедуры
+
////////////////////////////////////////////////////////////////////////////////
// Прочие процедуры и функции.
@@ -1912,6 +2029,10 @@
Параметры.Вставить("МинимальноНеобходимаяВерсияПлатформы", ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы);
Параметры.Вставить("РаботаВПрограммеЗапрещена", ОбщиеПараметры.РаботаВПрограммеЗапрещена);
+ Параметры.Вставить("РекомендуемыйОбъемОперативнойПамяти", ОбщиеПараметры.РекомендуемыйОбъемОперативнойПамяти);
+ Параметры.Вставить("ТребуетсяПоказРекомендацииПоОбъемуОперативнойПамяти", ТребуетсяПоказРекомендацииПоОбъемуОперативнойПамяти()
+ И Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела"));
+
Если Параметры.ПолученныеПараметрыКлиента <> Неопределено
И Параметры.ПолученныеПараметрыКлиента.Количество() = 0 Тогда
@@ -1985,14 +2106,17 @@
Если МодульОбменДаннымиВызовСервера.ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском() Тогда
Параметры.Вставить("ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском");
Попытка
- Параметры.Вставить("ОбработчикиКлиентскихСобытий", СтандартныеПодсистемыПовтИсп.ПараметрыПрограммныхСобытий(
- ).ОбработчикиСобытий.НаКлиенте);
+ ПараметрыПрограммныхСобытий = СтандартныеПодсистемыПовтИсп.ПараметрыПрограммныхСобытий();
Исключение
+ ПараметрыПрограммныхСобытий = Неопределено;
// При первом вызове будет исключение.
// При втором вызове параметры служебных событий обновляются в форме.
// ПовторнаяСинхронизацияДанныхПередЗапуском для поддержки настройки параметров
// подключения синхронизации данных (в том числе для работы профилей безопасности).
КонецПопытки;
+ Если ПараметрыПрограммныхСобытий <> Неопределено Тогда
+ Параметры.Вставить("ОбработчикиКлиентскихСобытий", ПараметрыПрограммныхСобытий.ОбработчикиСобытий.НаКлиенте);
+ КонецЕсли;
Возврат Ложь;
КонецЕсли;
КонецЕсли;
@@ -2587,6 +2711,19 @@
КонецФункции
+// Продолжение процедуры ЗапуститьФоновоеЗаданиеСКонтекстомКлиента.
+Процедура ПередЗапускомФоновогоЗаданияСКонтекстомКлиента(ВсеПараметры) Экспорт
+
+ УстановитьПривилегированныйРежим(Истина);
+ Если ПравоДоступа("Установка", Метаданные.ПараметрыСеанса.ПараметрыКлиентаНаСервере) Тогда
+ ПараметрыСеанса.ПараметрыКлиентаНаСервере = ВсеПараметры.ПараметрыКлиентаНаСервере;
+ КонецЕсли;
+ УстановитьПривилегированныйРежим(Ложь);
+
+ РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации(ВсеПараметры.ИмяМетода, ВсеПараметры.Параметры);
+
+КонецПроцедуры
+
////////////////////////////////////////////////////////////////////////////////
// Для обновления справочника ИдентификаторыОбъектовМетаданных.
@@ -2977,8 +3114,10 @@
// Проверка настройки совместимости конфигурации с версией платформы.
СистемнаяИнформация = Новый СистемнаяИнформация;
- Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.3.5.1068") < 0 Тогда
- ВызватьИсключение НСтр("ru = 'Для запуска необходима версия платформы 1С:Предприятие 8.3.5.1068 или выше.'");
+ МинимальнаяВерсияПлатформы = "8.3.5.1336";
+ Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, МинимальнаяВерсияПлатформы) < 0 Тогда
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Для запуска необходима версия платформы 1С:Предприятие %1 или выше.'"), МинимальнаяВерсияПлатформы);
КонецЕсли;
Режимы = Метаданные.СвойстваОбъектов.РежимСовместимости;
@@ -3168,15 +3307,28 @@
КонецПроцедуры
-Функция ИгнорироватьПолучениеОбъектовНачальногоОбраза(ЭлементДанных, ПолучениеЭлемента)
+Функция ПроверитьПолучениеОбъектовНачальногоОбраза(Знач ЭлементДанных, ПолучениеЭлемента, Отправитель)
- Если Не СозданиеНачальногоОбраза(ЭлементДанных)
- И ЭтоОбъектНачальногоОбразаУзлаРИБ(ОбъектМетаданных(ЭлементДанных)) Тогда
-
- ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать;
-
+ Если Отправитель = Неопределено Тогда
+ Возврат Неопределено;
КонецЕсли;
+ Если ОбщегоНазначенияКлиентСервер.РежимОтладки() Тогда
+
+ Если Отправитель.Метаданные().РаспределеннаяИнформационнаяБаза
+ И Не СозданиеНачальногоОбраза(ЭлементДанных)
+ И ЭтоОбъектНачальногоОбразаУзлаРИБ(ОбъектМетаданных(ЭлементДанных)) Тогда
+
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Объект ""%1"" (%2) входит в состав начального образа (см. служебное событие ПриПолученииОбъектовНачальногоОбразаПланаОбмена)
+ |для плана обмена ""%3"", но не исключен из подписок на события регистрации изменений для этого плана обмена.'"),
+ Строка(ЭлементДанных),
+ Строка(ОбъектМетаданных(ЭлементДанных)),
+ Строка(Отправитель));
+ КонецЕсли;
+
+ КонецЕсли;
+
КонецФункции
Функция ОбъектМетаданных(Знач ЭлементДанных)
@@ -3905,10 +4057,12 @@
// КЛИЕНТСКИЕ ОБРАБОТЧИКИ.
- КлиентскиеОбработчики[
- "СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить(
+ КлиентскиеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить(
"КонтрольДинамическогоОбновленияКонфигурацииКлиент");
+ КлиентскиеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить(
+ "СтандартныеПодсистемыКлиент");
+
// СЕРВЕРНЫЕ ОБРАБОТЧИКИ.
СерверныеОбработчики[
@@ -3939,6 +4093,11 @@
"СтандартныеПодсистемыСервер");
КонецЕсли;
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ТекущиеДела") Тогда
+ СерверныеОбработчики["СтандартныеПодсистемы.ТекущиеДела\ПриЗаполненииСпискаТекущихДел"].Добавить(
+ "СтандартныеПодсистемыСервер");
+ КонецЕсли;
+
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
@@ -4206,4 +4365,51 @@
КонецФункции
+
+// Заполняет список текущих дел пользователя.
+//
+// Параметры:
+// ТекущиеДела - ТаблицаЗначений - таблица значений с колонками:
+// * Идентификатор - Строка - внутренний идентификатор дела, используемый механизмом "Текущие дела".
+// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя.
+// * Важное - Булево - если Истина, дело будет выделено красным цветом.
+// * Представление - Строка - представление дела, выводимое пользователю.
+// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела.
+// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку
+// дела на панели "Текущие дела".
+// * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя.
+// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего
+// или объект метаданных подсистема.
+// * Подсказка - Строка - текст подсказки.
+//
+Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт
+
+ МодульТекущиеДелаСлужебный = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСлужебный");
+ Если МодульТекущиеДелаСлужебный.ДелоОтключено("РекомендацияПоПовышениюСкоростиРаботы") Тогда
+ Возврат;
+ КонецЕсли;
+
+ Идентификатор = "РекомендацияПоПовышениюСкоростиРаботы";
+ Дело = ТекущиеДела.Добавить();
+ Дело.Идентификатор = Идентификатор;
+ Дело.ЕстьДела = ТребуетсяПоказРекомендацииПоОбъемуОперативнойПамяти();
+ Дело.Важное = Истина;
+ Дело.Представление = НСтр("ru = 'Скорость работы снижена'");
+ Дело.Форма = "Обработка.РекомендацияПоПовышениюСкоростиРаботы.Форма.Форма";
+ Дело.Владелец = НСтр("ru = 'Скорость работы программы'");
+
+КонецПроцедуры
+
+Функция ТребуетсяПоказРекомендацииПоОбъемуОперативнойПамяти()
+ РекомендуемыйОбъем = ОбщегоНазначения.ОбщиеПараметрыБазовойФункциональности().РекомендуемыйОбъемОперативнойПамяти;
+ ОперативнаяПамять = ПараметрыКлиентаНаСервере().Получить("ОперативнаяПамять");
+ Рекомендация = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ОбщиеНастройкиПользователя", "РекомендацияПоОбъемуОперативнойПамяти");
+
+ Возврат Не ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент()
+ И ОбщегоНазначения.ИнформационнаяБазаФайловая()
+ И (Рекомендация = Неопределено Или Рекомендация.Показывать
+ Или (ТекущаяДатаСеанса() - Рекомендация.ДатаПредыдущегоПоказа) > 60*60*24*60)
+ И ОперативнаяПамять < РекомендуемыйОбъем;
+КонецФункции
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl b/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl
index 7ae46443a..8b5354ca4 100644
--- a/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl
+++ b/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl
@@ -26,7 +26,7 @@
// Получает представление документа для печати.
//
-// Параметры
+// Параметры:
// Выборка - КоллекцияДанных - структура или выборка из результатов запроса
// в которой содержатся дополнительные реквизиты, на основании
// которых можно сформировать переопределенное представление до-
diff --git a/SSL/src/CommonModules/ТекущиеДелаПереопределяемый/Module.bsl b/SSL/src/CommonModules/ТекущиеДелаПереопределяемый/Module.bsl
index db5159e68..1a27cdd4a 100644
--- a/SSL/src/CommonModules/ТекущиеДелаПереопределяемый/Module.bsl
+++ b/SSL/src/CommonModules/ТекущиеДелаПереопределяемый/Module.bsl
@@ -39,10 +39,10 @@
КонецПроцедуры
// Устанавливает общие параметры запросов для расчета текущих дел.
-// см. ТекущиеДелаСлужебный.УстановитьОбщиеПараметрыЗапросов()
+// См. ТекущиеДелаСлужебный.УстановитьОбщиеПараметрыЗапросов().
//
// Параметры:
-// Запрос - выполняемый запрос
+// Запрос - выполняемый запрос.
// ОбщиеПараметрыЗапросов - Структура - общие значения для расчета текущих дел.
//
Процедура УстановитьОбщиеПараметрыЗапросов(Запрос, ОбщиеПараметрыЗапросов) Экспорт
diff --git a/SSL/src/CommonModules/УправлениеДоступом/Module.bsl b/SSL/src/CommonModules/УправлениеДоступом/Module.bsl
index c029824f8..cc82d1ad7 100644
--- a/SSL/src/CommonModules/УправлениеДоступом/Module.bsl
+++ b/SSL/src/CommonModules/УправлениеДоступом/Module.bsl
@@ -497,12 +497,34 @@
ТипЗначения = Неопределено,
СозданиеНового = Неопределено) Экспорт
+ ЗаголовокОшибки =
+ НСтр("ru = 'Ошибка в процедуре ПриСозданииФормыЗначенияДоступа
+ |общего модуля УправлениеДоступом.'");
+
Если ТипЗнч(СозданиеНового) <> Тип("Булево") Тогда
- СозданиеНового = НЕ ЗначениеЗаполнено(Форма.Объект.Ссылка);
+ Попытка
+ СозданиеНового = НЕ ЗначениеЗаполнено(Форма.Объект.Ссылка);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ ЗаголовокОшибки + Символы.ПС + Символы.ПС +
+ НСтр("ru = 'Параметр СозданиеНового не указан, а автоматическое заполнение
+ |из реквизита формы ""Объект.Ссылка"" недоступно по причине:
+ |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+ КонецПопытки;
КонецЕсли;
Если ТипЗнч(ТипЗначения) <> Тип("Тип") Тогда
- ТипЗначенияДоступа = ТипЗнч(Форма.Объект.Ссылка);
+ Попытка
+ ТипЗначенияДоступа = ТипЗнч(Форма.Объект.Ссылка);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ ЗаголовокОшибки + Символы.ПС + Символы.ПС +
+ НСтр("ru = 'Параметр ТипЗначения не указан, а автоматическое заполнение
+ |из реквизита формы ""Объект.Ссылка"" недоступно по причине:
+ |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+ КонецПопытки;
Иначе
ТипЗначенияДоступа = ТипЗначения;
КонецЕсли;
@@ -516,16 +538,42 @@
ЭлементыФормы.Добавить(Элементы);
КонецЕсли;
- ЗаголовокОшибки =
- НСтр("ru = 'Ошибка в процедуре ПриСозданииФормыЗначенияДоступа
- |общего модуля УправлениеДоступом.'");
-
СвойстваГрупп = СвойстваГруппЗначенияДоступа(ТипЗначенияДоступа, ЗаголовокОшибки);
Если Реквизит = Неопределено Тогда
- ГруппаЗначенийДоступа = Форма.Объект.ГруппаДоступа;
+ Попытка
+ ГруппаЗначенийДоступа = Форма.Объект.ГруппаДоступа;
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ ЗаголовокОшибки + Символы.ПС + Символы.ПС +
+ НСтр("ru = 'Параметр Реквизит не указан, а автоматическое заполнение
+ |из реквизита формы ""Объект.ГруппаДоступа"" недоступно по причине:
+ |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+ КонецПопытки;
Иначе
- ГруппаЗначенийДоступа = Форма[Реквизит];
+ ПозицияТочки = Найти(Реквизит, ".");
+ Если ПозицияТочки = 0 Тогда
+ Попытка
+ ГруппаЗначенийДоступа = Форма[Реквизит];
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ ЗаголовокОшибки + Символы.ПС + Символы.ПС +
+ НСтр("ru = 'Не удалось получить значение реквизита формы ""%1"", указанного параметре Реквизит по причине:
+ |%2'"), Реквизит, КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+ КонецПопытки;
+ Иначе
+ Попытка
+ ГруппаЗначенийДоступа = Форма[Лев(Реквизит, ПозицияТочки - 1)][Сред(Реквизит, ПозицияТочки + 1)];
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ ЗаголовокОшибки + Символы.ПС + Символы.ПС +
+ НСтр("ru = 'Не удалось получить значение реквизита формы ""%1"", указанного параметре Реквизит по причине:
+ |%2'"), Реквизит, КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+ КонецПопытки;
+ КонецЕсли;
КонецЕсли;
Если ТипЗнч(ГруппаЗначенийДоступа) <> СвойстваГрупп.Тип Тогда
@@ -555,6 +603,11 @@
Возврат;
КонецЕсли;
+ Если Не ПравоДоступа("Изменение", Метаданные.НайтиПоТипу(ТипЗначенияДоступа)) Тогда
+ Форма.ТолькоПросмотр = Истина;
+ Возврат;
+ КонецЕсли;
+
ГруппыЗначенийДляИзменения =
ГруппыЗначенийДоступаРазрешающиеИзменениеЗначенийДоступа(ТипЗначенияДоступа);
@@ -581,13 +634,18 @@
Если Реквизит = Неопределено Тогда
Форма.Объект.ГруппаДоступа = ГруппыЗначенийДляИзменения[0];
Иначе
- Форма[Реквизит] = ГруппыЗначенийДляИзменения[0];
+ ПозицияТочки = Найти(Реквизит, ".");
+ Если ПозицияТочки = 0 Тогда
+ Форма[Реквизит] = ГруппыЗначенийДляИзменения[0];
+ Иначе
+ Форма[Лев(Реквизит, ПозицияТочки - 1)][Сред(Реквизит, ПозицияТочки + 1)] = ГруппыЗначенийДляИзменения[0];
+ КонецЕсли;
КонецЕсли;
КонецЕсли;
НовыйПараметрВыбора = Новый ПараметрВыбора(
"Отбор.Ссылка", Новый ФиксированныйМассив(ГруппыЗначенийДляИзменения));
-
+
ПараметрыВыбора = Новый Массив;
ПараметрыВыбора.Добавить(НовыйПараметрВыбора);
@@ -618,6 +676,10 @@
СвойстваГрупп = СвойстваГруппЗначенияДоступа(ТипЗначенийДоступа, ЗаголовокОшибки);
+ Если Не ПравоДоступа("Чтение", Метаданные.НайтиПоТипу(СвойстваГрупп.Тип)) Тогда
+ Возврат Новый Массив;
+ КонецЕсли;
+
Если НЕ ОграничиватьДоступНаУровнеЗаписей()
ИЛИ НЕ УправлениеДоступомСлужебный.ВидДоступаИспользуется(СвойстваГрупп.ВидДоступа)
ИЛИ Пользователи.ЭтоПолноправныйПользователь( , , Ложь) Тогда
diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl
index 682f1b07c..376359c23 100644
--- a/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl
@@ -221,6 +221,9 @@
СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить(
"УправлениеДоступомСлужебный");
+ СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПослеОбновленияИнформационнойБазы"].Добавить(
+ "УправлениеДоступомСлужебный");
+
СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииОбработчиковУстановкиПараметровСеанса"].Добавить(
"УправлениеДоступомСлужебный");
@@ -284,6 +287,23 @@
КонецПроцедуры
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.Справочники.ГруппыДоступа.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ПрофилиГруппДоступа.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
////////////////////////////////////////////////////////////////////////////////
// Основные процедуры и функции.
@@ -597,6 +617,14 @@
Строка(Администратор));
КонецЕсли;
+ ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(
+ ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор);
+
+ Если ПользовательИБ = Неопределено
+ Или Не ПользовательИБ.Роли.Содержит(Метаданные.Роли.ПолныеПрава) Тогда
+ Возврат;
+ КонецЕсли;
+
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Пользователь", Администратор);
Запрос.Текст =
@@ -616,6 +644,32 @@
КонецПроцедуры
+// Дополняет массив проверяемых ролей профильными ролями.
+Процедура ПередПроверкойДоступностиРолей(МассивИменРолей) Экспорт
+
+ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
+ Возврат;
+ КонецЕсли;
+
+ ДополнительныеРоли = Новый Соответствие;
+ ВхожденияРолейВПрофильныеРоли = УправлениеДоступомСлужебныйПовтИсп.ВхожденияРолейВПрофильныеРоли();
+
+ Для каждого ИмяРоли Из МассивИменРолей Цикл
+ ВхожденияРолиВПрофильныеРоли = ВхожденияРолейВПрофильныеРоли.Получить(ИмяРоли);
+ Если ВхожденияРолиВПрофильныеРоли = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+ Для каждого ПрофильнаяРоль Из ВхожденияРолиВПрофильныеРоли Цикл
+ ДополнительныеРоли.Вставить(ПрофильнаяРоль, Истина);
+ КонецЦикла;
+ КонецЦикла;
+
+ Для каждого КлючИЗначение Из ДополнительныеРоли Цикл
+ МассивИменРолей.Добавить(КлючИЗначение.Ключ);
+ КонецЦикла;
+
+КонецПроцедуры
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@@ -906,6 +960,7 @@
Обработчик = Обработчики.Добавить();
Обработчик.Версия = "2.1.2.16";
Обработчик.Процедура = "УправлениеДоступом.ОбновитьРолиПользователей";
+ Обработчик.РежимВыполнения = "Оперативно";
Обработчик = Обработчики.Добавить();
Обработчик.Версия = "2.1.3.5";
@@ -973,6 +1028,36 @@
Обработчик.Процедура = "РегистрыСведений.ЗначенияГруппДоступа.ОбновитьДанныеРегистра";
Обработчик.РежимВыполнения = "Оперативно";
+ Обработчик = Обработчики.Добавить();
+ Обработчик.Версия = "2.2.5.4";
+ Обработчик.Процедура = "РегистрыСведений.УдалитьГруппыЗначенийДоступа.ОчиститьРегистр";
+ Обработчик.РежимВыполнения = "Оперативно";
+
+ Обработчик = Обработчики.Добавить();
+ Обработчик.Версия = "2.2.5.7";
+ Обработчик.Процедура = "УправлениеДоступом.ОбновитьРолиПользователей";
+ Обработчик.РежимВыполнения = "Оперативно";
+
+КонецПроцедуры
+
+// См. комментарий одноименной процедуры общего модуля ОбновлениеИнформационнойБазыПереопределяемый.
+Процедура ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсияИБ, Знач ТекущаяВерсияИБ,
+ Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим) Экспорт
+
+ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
+ Возврат;
+ КонецЕсли;
+
+ УстановитьПривилегированныйРежим(Истина);
+ Запустить = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("ЗапуститьОбновлениеИнформационнойБазы");
+ УстановитьПривилегированныйРежим(Ложь);
+
+ Если Запустить = Истина Тогда
+ // При ручном запуске обновления требуется полное обновление ролей
+ // так как в режиме отладки профильные роли отключены, а в обычном режиме включены.
+ УправлениеДоступом.ОбновитьРолиПользователей();
+ КонецЕсли;
+
КонецПроцедуры
// Возвращает соответствие имен параметров сеанса и обработчиков для их инициализации.
@@ -1856,11 +1941,7 @@
Возврат Используется;
КонецЕсли;
- ТипЗначенийОМД = Метаданные.НайтиПоТипу(СвойстваВидаДоступа.ТипЗначений);
-
- Если ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(ТипЗначенийОМД) Тогда
- Используется = Истина;
- КонецЕсли;
+ Используется = Истина;
ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия(
"СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииИспользованияВидаДоступа");
@@ -3525,6 +3606,15 @@
УстановитьПривилегированныйРежим(Истина);
+ ПоследниеИзменения = СтандартныеПодсистемыСервер.ИзмененияПараметраРаботыПрограммы(
+ ПользователиСлужебныйПовтИсп.Параметры(), "НедоступныеРолиПоТипамПользователей");
+
+ Если ПоследниеИзменения = Неопределено
+ ИЛИ ПоследниеИзменения.Количество() > 0 Тогда
+
+ Возврат Истина;
+ КонецЕсли;
+
ПроверяемыеПараметры = Новый Массив;
ПроверяемыеПараметры.Добавить("ОбъектыМетаданныхПравРолей");
ПроверяемыеПараметры.Добавить("ВозможныеПраваДляНастройкиПравОбъектов");
@@ -4053,7 +4143,7 @@
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПроверяемыеПользователи.Пользователь КАК Пользователь,
| ГруппыДоступаПользователи.Ссылка.Профиль КАК Профиль
- |ПОМЕСТИТЬ ПрофилиПользователей
+ |ПОМЕСТИТЬ ВсеПрофилиПользователей
|ИЗ
| ПроверяемыеПользователи КАК ПроверяемыеПользователи
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
@@ -4067,13 +4157,62 @@
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
+ | ПрофильныеРоли.Профиль КАК Профиль,
+ | ПрофильныеРоли.Роль КАК Роль
+ |ПОМЕСТИТЬ ПрофильныеРоли
+ |ИЗ
+ | &ПрофильныеРоли КАК ПрофильныеРоли
+ |;
+ |
+ |////////////////////////////////////////////////////////////////////////////////
+ |ВЫБРАТЬ РАЗЛИЧНЫЕ
+ | ВсеПрофилиПользователей.Пользователь,
+ | ВсеПрофилиПользователей.Профиль,
+ | ПрофильныеРоли.Роль КАК ПрофильнаяРоль
+ |ПОМЕСТИТЬ ПрофилиПользователей
+ |ИЗ
+ | ВсеПрофилиПользователей КАК ВсеПрофилиПользователей
+ | ЛЕВОЕ СОЕДИНЕНИЕ ПрофильныеРоли КАК ПрофильныеРоли
+ | ПО (ПрофильныеРоли.Профиль = ВсеПрофилиПользователей.Профиль)
+ | И (НЕ ВсеПрофилиПользователей.Профиль.ПоставляемыйПрофильИзменен)
+ |ГДЕ
+ | НЕ ВсеПрофилиПользователей.Профиль.ПометкаУдаления
+ |;
+ |
+ |////////////////////////////////////////////////////////////////////////////////
+ |ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПрофилиПользователей.Пользователь,
| Роли.Роль.Имя КАК Роль
|ИЗ
| ПрофилиПользователей КАК ПрофилиПользователей
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК Роли
| ПО (Роли.Ссылка = ПрофилиПользователей.Профиль)
- | И (НЕ Роли.Ссылка.ПометкаУдаления)";
+ | И (ПрофилиПользователей.ПрофильнаяРоль ЕСТЬ NULL )
+ |
+ |ОБЪЕДИНИТЬ ВСЕ
+ |
+ |ВЫБРАТЬ
+ | ПрофилиПользователей.Пользователь,
+ | ПрофилиПользователей.ПрофильнаяРоль
+ |ИЗ
+ | ПрофилиПользователей КАК ПрофилиПользователей
+ |ГДЕ
+ | НЕ ПрофилиПользователей.ПрофильнаяРоль ЕСТЬ NULL ";
+
+ ПрофильныеРоли = Новый ТаблицаЗначений;
+ ПрофильныеРоли.Колонки.Добавить("Профиль", Новый ОписаниеТипов("СправочникСсылка.ПрофилиГруппДоступа"));
+ ПрофильныеРоли.Колонки.Добавить("Роль", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(255)));
+
+ Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено()
+ И ИспользоватьПрофильныеРоли() Тогда
+
+ ОписаниеПрофильныхРолей = УправлениеДоступомСлужебныйПовтИсп.ОписаниеПрофильныхРолей();
+ Для Каждого ОписаниеПрофильнойРоли Из ОписаниеПрофильныхРолей Цикл
+ ЗаполнитьЗначенияСвойств(ПрофильныеРоли.Добавить(), ОписаниеПрофильнойРоли);
+ КонецЦикла;
+ КонецЕсли;
+
+ Запрос.УстановитьПараметр("ПрофильныеРоли", ПрофильныеРоли);
Если ПолучитьФункциональнуюОпцию("ИспользоватьВнешнихПользователей") Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИсключитьВнешнихПользователей", "Истина");
@@ -4088,11 +4227,11 @@
Итог.Вставить("Администраторы", Новый Соответствие);
- Для каждого Строка Из РезультатыЗапросов[ПоследнийРезультат-3].Выгрузить() Цикл
+ Для каждого Строка Из РезультатыЗапросов[ПоследнийРезультат-5].Выгрузить() Цикл
Итог.Администраторы.Вставить(Строка.Ссылка, Истина);
КонецЦикла;
- Итог.Вставить("ИдентификаторыПользователейИБ", РезультатыЗапросов[ПоследнийРезультат-2].Выгрузить());
+ Итог.Вставить("ИдентификаторыПользователейИБ", РезультатыЗапросов[ПоследнийРезультат-4].Выгрузить());
Итог.ИдентификаторыПользователейИБ.Индексы.Добавить("Пользователь");
Итог.Вставить("РолиПользователей", РезультатыЗапросов[ПоследнийРезультат].Выгрузить());
@@ -4102,6 +4241,11 @@
КонецФункции
+Функция ИспользоватьПрофильныеРоли()
+
+ Возврат Не ОбщегоНазначенияКлиентСервер.РежимОтладки();
+КонецФункции
+
Функция ПрофилиПользователяСРолью(ТекущийПользователь, Роль)
Запрос = Новый Запрос;
diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl
index 1b39a2bb4..e8aac7c5b 100644
--- a/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl
+++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl
@@ -1,4 +1,4 @@
-////////////////////////////////////////////////////////////////////////////////
+
// Подсистема "Управление доступом".
//
////////////////////////////////////////////////////////////////////////////////
@@ -510,4 +510,98 @@
КонецФункции
+// Только для внутреннего использования.
+Функция ОписаниеПрофильныхРолей() Экспорт
+
+ ОписанияПрофилей = УправлениеДоступомСлужебныйПовтИсп.Параметры(
+ ).ПоставляемыеПрофилиГруппДоступа.ОписанияПрофилейМассив;
+
+ ПрофильныеРоли = Новый Соответствие;
+ Идентификаторы = Новый Массив;
+ ВсеРоли = ПользователиСлужебный.ВсеРоли().Соответствие;
+
+ Для каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл
+
+ Если Не ЗначениеЗаполнено(ОписаниеПрофиля.Имя)
+ Или ОписаниеПрофиля.Имя = "Администратор" Тогда
+
+ Продолжить;
+ КонецЕсли;
+
+ ИмяПрофильнойРоли = "Профиль" + ОписаниеПрофиля.Имя;
+ Если ВсеРоли.Получить(ИмяПрофильнойРоли) = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Идентификатор = Новый УникальныйИдентификатор(ОписаниеПрофиля.Идентификатор);
+ Идентификаторы.Добавить(Идентификатор);
+ ПрофильныеРоли.Вставить(Идентификатор, ИмяПрофильнойРоли);
+ КонецЦикла;
+
+ Запрос = Новый Запрос;
+ Запрос.УстановитьПараметр("Идентификаторы", Идентификаторы);
+ Запрос.Текст =
+ "ВЫБРАТЬ
+ | Профили.Ссылка КАК Ссылка,
+ | Профили.ИдентификаторПоставляемыхДанных КАК Идентификатор
+ |ИЗ
+ | Справочник.ПрофилиГруппДоступа КАК Профили
+ |ГДЕ
+ | Профили.ИдентификаторПоставляемыхДанных В(&Идентификаторы)";
+
+ Выборка = Запрос.Выполнить().Выбрать();
+ ОписаниеПрофильныхРолей = Новый Массив;
+
+ Пока Выборка.Следующий() Цикл
+ ПрофильнаяРоль = ПрофильныеРоли[Выборка.Идентификатор];
+ ОписаниеПрофильнойРоли = Новый Структура;
+ ОписаниеПрофильнойРоли.Вставить("Профиль", Выборка.Ссылка);
+ ОписаниеПрофильнойРоли.Вставить("Роль", ПрофильнаяРоль);
+ ОписаниеПрофильныхРолей.Добавить(Новый ФиксированнаяСтруктура(ОписаниеПрофильнойРоли));
+ КонецЦикла;
+
+ Возврат Новый ФиксированныйМассив(ОписаниеПрофильныхРолей);
+
+КонецФункции
+
+// Только для внутреннего использования.
+Функция ВхожденияРолейВПрофильныеРоли() Экспорт
+
+ ОписанияПрофилей = УправлениеДоступомСлужебныйПовтИсп.Параметры(
+ ).ПоставляемыеПрофилиГруппДоступа.ОписанияПрофилейМассив;
+
+ ВхожденияРолейВПрофильныеРоли = Новый Соответствие;
+ ВсеРоли = ПользователиСлужебный.ВсеРоли().Соответствие;
+
+ Для каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл
+
+ Если Не ЗначениеЗаполнено(ОписаниеПрофиля.Имя)
+ Или ОписаниеПрофиля.Имя = "Администратор" Тогда
+
+ Продолжить;
+ КонецЕсли;
+
+ ИмяПрофильнойРоли = "Профиль" + ОписаниеПрофиля.Имя;
+ Если ВсеРоли.Получить(ИмяПрофильнойРоли) = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Для каждого Роль Из ОписаниеПрофиля.Роли Цикл
+ ПрофильныеРоли = ВхожденияРолейВПрофильныеРоли.Получить(Роль);
+ Если ПрофильныеРоли = Неопределено Тогда
+ ПрофильныеРоли = Новый Массив;
+ ВхожденияРолейВПрофильныеРоли.Вставить(Роль, ПрофильныеРоли);
+ КонецЕсли;
+ ПрофильныеРоли.Добавить(ИмяПрофильнойРоли);
+ КонецЦикла;
+ КонецЦикла;
+
+ Для Каждого КлючИЗначение Из ВхожденияРолейВПрофильныеРоли Цикл
+ ВхожденияРолейВПрофильныеРоли[КлючИЗначение.Ключ] = Новый ФиксированныйМассив(КлючИЗначение.Значение);
+ КонецЦикла;
+
+ Возврат Новый ФиксированноеСоответствие(ВхожденияРолейВПрофильныеРоли);
+
+КонецФункции
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСлужебный/Module.bsl
index 15d2b7259..9752ece0d 100644
--- a/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСлужебный/Module.bsl
@@ -113,6 +113,10 @@
// ТекущиеДела - ТаблицаЗначений - см. возвращаемое значение ТекущиеДелаСлужебный.СписокТекущихДелПользователя().
//
Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт
+ Если Не РежимРаботыЛокальныйФайловый() Тогда
+ Возврат;
+ КонецЕсли;
+
ОбработкаМетаданные = Метаданные.Обработки.СдвигГраницыИтогов;
Если Не ПравоДоступа("Использование", ОбработкаМетаданные) Тогда
Возврат;
diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl
index fcdca25f3..b75f06413 100644
--- a/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl
+++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl
@@ -19,35 +19,15 @@
// ПоложениеЗаголовкаЭлементаФормы.Лево или
// ПоложениеЗаголовкаЭлементаФормы.Верх (по умолчанию).
//
-Процедура ПриСозданииНаСервере(Форма, Объект, ИмяЭлементаДляРазмещения = "", ПоложениеЗаголовкаКИ = "") Экспорт
+Процедура ПриСозданииНаСервере(Форма, Объект, ИмяЭлементаДляРазмещения = "", ПоложениеЗаголовкаКИ = "",
+ Знач ИсключаемыеВиды = Неопределено, ОтложеннаяИнициализация = Ложь) Экспорт
- Строка500 = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(500));
+ Если ИсключаемыеВиды = Неопределено Тогда
+ ИсключаемыеВиды = Новый Массив;
+ КонецЕсли;
- ОписаниеТипаБулево = Новый ОписаниеТипов("Булево");
МассивДобавляемыхРеквизитов = Новый Массив;
-
- // Создадим таблицу значений
- ИмяОписания = "КонтактнаяИнформацияОписаниеДополнительныхРеквизитов";
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ИмяОписания, Новый ОписаниеТипов("ТаблицаЗначений")));
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ИмяРеквизита", Строка500, ИмяОписания));
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Вид", Новый ОписаниеТипов("СправочникСсылка.ВидыКонтактнойИнформации"), ИмяОписания));
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Тип", Новый ОписаниеТипов("ПеречислениеСсылка.ТипыКонтактнойИнформации"), ИмяОписания));
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ЗначенияПолей", Новый ОписаниеТипов("СписокЗначений, Строка"), ИмяОписания));
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Представление", Строка500, ИмяОписания));
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Комментарий", Новый ОписаниеТипов("Строка"), ИмяОписания));
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ЭтоРеквизитТабличнойЧасти", ОписаниеТипаБулево, ИмяОписания));
-
- ИмяТаблицыДобавленных = "ДобавленныеЭлементыКонтактнойИнформации";
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ИмяТаблицыДобавленных, Новый ОписаниеТипов("ТаблицаЗначений")));
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ИмяЭлемента", Строка500, ИмяТаблицыДобавленных));
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Приоритет", Новый ОписаниеТипов("Число"), ИмяТаблицыДобавленных));
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ЭтоКоманда", ОписаниеТипаБулево, ИмяТаблицыДобавленных));
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ЭтоРеквизитТабличнойЧасти", ОписаниеТипаБулево, ИмяТаблицыДобавленных));
-
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("СписокДобавляемыхЭлементовКонтактнойИнформации", Новый ОписаниеТипов("СписокЗначений")));
-
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("КонтактнаяИнформацияПоложениеЗаголовка", Строка500));
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("КонтактнаяИнформацияГруппаДляРазмещения", Строка500));
+ ПроверитьНаличиеРеквизитовКонтактнойИнформации(Форма, МассивДобавляемыхРеквизитов);
// Получим список видов КИ
@@ -67,88 +47,84 @@
Запрос = Новый Запрос;
Если ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
Запрос.Текст ="
- |ВЫБРАТЬ
- | ВидыКонтактнойИнформации.Ссылка КАК Вид,
- | ВидыКонтактнойИнформации.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных,
- | ВидыКонтактнойИнформации.Тип КАК Тип,
- | ВидыКонтактнойИнформации.ОбязательноеЗаполнение КАК ОбязательноеЗаполнение,
- | ВидыКонтактнойИнформации.Подсказка КАК Подсказка,
- | ВидыКонтактнойИнформации.Наименование КАК Наименование,
- | ВидыКонтактнойИнформации.Наименование КАК Заголовок,
- | ВидыКонтактнойИнформации.РедактированиеТолькоВДиалоге КАК РедактированиеТолькоВДиалоге,
- | ВидыКонтактнойИнформации.ЭтоГруппа КАК ЭтоРеквизитТабличнойЧасти,
- | ВидыКонтактнойИнформации.РеквизитДопУпорядочивания КАК РеквизитДопУпорядочивания,
- | ЕСТЬNULL(КонтактнаяИнформация.Представление, """") КАК Представление,
- | ЕСТЬNULL(КонтактнаяИнформация.ЗначенияПолей, """") КАК ЗначенияПолей,
- | ЕСТЬNULL(КонтактнаяИнформация.НомерСтроки, 0) КАК НомерСтроки,
- | " + ДанныеИдентификатораСтрокиТабличнойЧасти + " КАК ИдентификаторСтроки,
- | ВЫРАЗИТЬ("""""""" КАК СТРОКА(200)) КАК ИмяРеквизита,
- | ВЫРАЗИТЬ("""" КАК СТРОКА) КАК Комментарий
- |ИЗ
- | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
- |ЛЕВОЕ СОЕДИНЕНИЕ
- | " + ПолноеИмяОбъектаМетаданных + ".КонтактнаяИнформация КАК КонтактнаяИнформация
- |ПО
- | КонтактнаяИнформация.Ссылка = &Владелец
- | И ВидыКонтактнойИнформации.Ссылка = КонтактнаяИнформация.Вид
- |ГДЕ
- | НЕ ВидыКонтактнойИнформации.ПометкаУдаления
- | И (
- | ВидыКонтактнойИнформации.Родитель = &ГруппаВидовКИ
- | ИЛИ ВидыКонтактнойИнформации.Родитель.Родитель = &ГруппаВидовКИ
- | )
- |УПОРЯДОЧИТЬ ПО
- | ВидыКонтактнойИнформации.Ссылка ИЕРАРХИЯ
- |";
- Иначе
+ |ВЫБРАТЬ
+ | ВидыКонтактнойИнформации.Ссылка КАК Вид,
+ | ВидыКонтактнойИнформации.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных,
+ | ВидыКонтактнойИнформации.Тип КАК Тип,
+ | ВидыКонтактнойИнформации.ОбязательноеЗаполнение КАК ОбязательноеЗаполнение,
+ | ВидыКонтактнойИнформации.Подсказка КАК Подсказка,
+ | ВидыКонтактнойИнформации.Наименование КАК Наименование,
+ | ВидыКонтактнойИнформации.РедактированиеТолькоВДиалоге КАК РедактированиеТолькоВДиалоге,
+ | ВидыКонтактнойИнформации.ЭтоГруппа КАК ЭтоРеквизитТабличнойЧасти,
+ | ВидыКонтактнойИнформации.РеквизитДопУпорядочивания КАК РеквизитДопУпорядочивания,
+ | ЕСТЬNULL(КонтактнаяИнформация.Представление, """") КАК Представление,
+ | ЕСТЬNULL(КонтактнаяИнформация.ЗначенияПолей, """") КАК ЗначенияПолей,
+ | ЕСТЬNULL(КонтактнаяИнформация.НомерСтроки, 0) КАК НомерСтроки,
+ | " + ДанныеИдентификатораСтрокиТабличнойЧасти + " КАК ИдентификаторСтроки,
+ | ВЫРАЗИТЬ("""""""" КАК СТРОКА(200)) КАК ИмяРеквизита,
+ | ВЫРАЗИТЬ("""" КАК СТРОКА) КАК Комментарий
+ |ИЗ
+ | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
+ |ЛЕВОЕ СОЕДИНЕНИЕ
+ | " + ПолноеИмяОбъектаМетаданных + ".КонтактнаяИнформация КАК КонтактнаяИнформация
+ |ПО
+ | КонтактнаяИнформация.Ссылка = &Владелец
+ | И ВидыКонтактнойИнформации.Ссылка = КонтактнаяИнформация.Вид
+ |ГДЕ
+ | НЕ ВидыКонтактнойИнформации.ПометкаУдаления
+ | И (
+ | ВидыКонтактнойИнформации.Родитель = &ГруппаВидовКИ
+ | ИЛИ ВидыКонтактнойИнформации.Родитель.Родитель = &ГруппаВидовКИ)
+ |УПОРЯДОЧИТЬ ПО
+ | ВидыКонтактнойИнформации.Ссылка ИЕРАРХИЯ
+ |";
+ Иначе
Запрос.Текст ="
- |ВЫБРАТЬ
- | КонтактнаяИнформация.Представление КАК Представление,
- | КонтактнаяИнформация.ЗначенияПолей КАК ЗначенияПолей,
- | КонтактнаяИнформация.НомерСтроки КАК НомерСтроки,
- | КонтактнаяИнформация.Вид КАК Вид,
- | " + ДанныеИдентификатораСтрокиТабличнойЧасти + " КАК ИдентификаторСтрокиТабличнойЧасти
- |ПОМЕСТИТЬ
- | КонтактнаяИнформация
- |ИЗ
- | &ТаблицаКонтактнойИнформации КАК КонтактнаяИнформация
- |ИНДЕКСИРОВАТЬ ПО
- | Вид
- |;////////////////////////////////////////////////////////////////////////////////
- |
- |ВЫБРАТЬ
- | ВидыКонтактнойИнформации.Ссылка КАК Вид,
- | ВидыКонтактнойИнформации.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных,
- | ВидыКонтактнойИнформации.Тип КАК Тип,
- | ВидыКонтактнойИнформации.ОбязательноеЗаполнение КАК ОбязательноеЗаполнение,
- | ВидыКонтактнойИнформации.Подсказка КАК Подсказка,
- | ВидыКонтактнойИнформации.Наименование КАК Наименование,
- | ВидыКонтактнойИнформации.Наименование КАК Заголовок,
- | ВидыКонтактнойИнформации.РедактированиеТолькоВДиалоге КАК РедактированиеТолькоВДиалоге,
- | ВидыКонтактнойИнформации.ЭтоГруппа КАК ЭтоРеквизитТабличнойЧасти,
- | ВидыКонтактнойИнформации.РеквизитДопУпорядочивания КАК РеквизитДопУпорядочивания,
- | ЕСТЬNULL(КонтактнаяИнформация.Представление, """") КАК Представление,
- | ЕСТЬNULL(КонтактнаяИнформация.ЗначенияПолей, """") КАК ЗначенияПолей,
- | ЕСТЬNULL(КонтактнаяИнформация.НомерСтроки, 0) КАК НомерСтроки,
- | " + ДанныеИдентификатораСтрокиТабличнойЧасти + " КАК ИдентификаторСтроки,
- | ВЫРАЗИТЬ("""""""" КАК СТРОКА(200)) КАК ИмяРеквизита,
- | ВЫРАЗИТЬ("""" КАК СТРОКА) КАК Комментарий
- |ИЗ
- | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
- |ЛЕВОЕ СОЕДИНЕНИЕ
- | КонтактнаяИнформация КАК КонтактнаяИнформация
- |ПО
- | ВидыКонтактнойИнформации.Ссылка = КонтактнаяИнформация.Вид
- |ГДЕ
- | НЕ ВидыКонтактнойИнформации.ПометкаУдаления
- | И (
- | ВидыКонтактнойИнформации.Родитель = &ГруппаВидовКИ
- | ИЛИ ВидыКонтактнойИнформации.Родитель.Родитель = &ГруппаВидовКИ
- | )
- |УПОРЯДОЧИТЬ ПО
- | ВидыКонтактнойИнформации.Ссылка ИЕРАРХИЯ
- |";
-
+ |ВЫБРАТЬ
+ | КонтактнаяИнформация.Представление КАК Представление,
+ | КонтактнаяИнформация.ЗначенияПолей КАК ЗначенияПолей,
+ | КонтактнаяИнформация.НомерСтроки КАК НомерСтроки,
+ | КонтактнаяИнформация.Вид КАК Вид,
+ | " + ДанныеИдентификатораСтрокиТабличнойЧасти + " КАК ИдентификаторСтрокиТабличнойЧасти
+ |ПОМЕСТИТЬ
+ | КонтактнаяИнформация
+ |ИЗ
+ | &ТаблицаКонтактнойИнформации КАК КонтактнаяИнформация
+ |ИНДЕКСИРОВАТЬ ПО
+ | Вид
+ |;////////////////////////////////////////////////////////////////////////////////
+ |
+ |ВЫБРАТЬ
+ | ВидыКонтактнойИнформации.Ссылка КАК Вид,
+ | ВидыКонтактнойИнформации.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных,
+ | ВидыКонтактнойИнформации.Тип КАК Тип,
+ | ВидыКонтактнойИнформации.ОбязательноеЗаполнение КАК ОбязательноеЗаполнение,
+ | ВидыКонтактнойИнформации.Подсказка КАК Подсказка,
+ | ВидыКонтактнойИнформации.Наименование КАК Наименование,
+ | ВидыКонтактнойИнформации.РедактированиеТолькоВДиалоге КАК РедактированиеТолькоВДиалоге,
+ | ВидыКонтактнойИнформации.ЭтоГруппа КАК ЭтоРеквизитТабличнойЧасти,
+ | ВидыКонтактнойИнформации.РеквизитДопУпорядочивания КАК РеквизитДопУпорядочивания,
+ | ЕСТЬNULL(КонтактнаяИнформация.Представление, """") КАК Представление,
+ | ЕСТЬNULL(КонтактнаяИнформация.ЗначенияПолей, """") КАК ЗначенияПолей,
+ | ЕСТЬNULL(КонтактнаяИнформация.НомерСтроки, 0) КАК НомерСтроки,
+ | " + ДанныеИдентификатораСтрокиТабличнойЧасти + " КАК ИдентификаторСтроки,
+ | ВЫРАЗИТЬ("""""""" КАК СТРОКА(200)) КАК ИмяРеквизита,
+ | ВЫРАЗИТЬ("""" КАК СТРОКА) КАК Комментарий
+ |ИЗ
+ | Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
+ |ЛЕВОЕ СОЕДИНЕНИЕ
+ | КонтактнаяИнформация КАК КонтактнаяИнформация
+ |ПО
+ | ВидыКонтактнойИнформации.Ссылка = КонтактнаяИнформация.Вид
+ |ГДЕ
+ | НЕ ВидыКонтактнойИнформации.ПометкаУдаления
+ | И (
+ | ВидыКонтактнойИнформации.Родитель = &ГруппаВидовКИ
+ | ИЛИ ВидыКонтактнойИнформации.Родитель.Родитель = &ГруппаВидовКИ)
+ |УПОРЯДОЧИТЬ ПО
+ | ВидыКонтактнойИнформации.Ссылка ИЕРАРХИЯ
+ |";
+
Запрос.УстановитьПараметр("ТаблицаКонтактнойИнформации", Объект.КонтактнаяИнформация.Выгрузить());
КонецЕсли;
@@ -160,6 +136,9 @@
УстановитьПривилегированныйРежим(Ложь);
КонтактнаяИнформация.Сортировать("РеквизитДопУпорядочивания, НомерСтроки");
+ Строка500 = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(500));
+
+ СозданныеРеквизиты = ОбщегоНазначенияКлиентСервер.СкопироватьМассив(ИсключаемыеВиды);
Для Каждого ОбъектКонтактнойИнформации Из КонтактнаяИнформация Цикл
@@ -187,7 +166,7 @@
ПутьРеквизитов = "Объект." + ИмяТабличнойЧасти;
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ИмяРеквизита, Строка500, ПутьРеквизитов, СтрокаКИ.Заголовок, Истина));
+ МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ИмяРеквизита, Строка500, ПутьРеквизитов, СтрокаКИ.Наименование, Истина));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ИмяРеквизита + "ЗначенияПолей", Новый ОписаниеТипов("СписокЗначений, Строка"), ПутьРеквизитов,, Истина));
ПредыдущийВид = ТекущийВид;
@@ -198,30 +177,47 @@
КонецЦикла;
Иначе
- ОбъектКонтактнойИнформации.ИмяРеквизита = "КонтактнаяИнформацияПоле" + КонтактнаяИнформация.Индекс(ОбъектКонтактнойИнформации);
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ОбъектКонтактнойИнформации.ИмяРеквизита, Строка500, , ОбъектКонтактнойИнформации.Заголовок, Истина));
+ Индекс = СозданныеРеквизиты.Найти(ОбъектКонтактнойИнформации.Вид);
+
+ Если Индекс = Неопределено Тогда
+ ОбъектКонтактнойИнформации.ИмяРеквизита = "КонтактнаяИнформацияПоле" + КонтактнаяИнформация.Индекс(ОбъектКонтактнойИнформации);
+ Если Не ОтложеннаяИнициализация Тогда
+ МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ОбъектКонтактнойИнформации.ИмяРеквизита, Строка500, , ОбъектКонтактнойИнформации.Наименование, Истина));
+ КонецЕсли;
+ Иначе
+ ОбъектКонтактнойИнформации.ИмяРеквизита = "КонтактнаяИнформацияПоле" + ОбъектКонтактнойИнформации.ИмяПредопределенныхДанных;
+ СозданныеРеквизиты.Удалить(Индекс);
+ КонецЕсли;
// При обнаружении ошибок распознавания не прерываем генерацию.
Попытка
ОбъектКонтактнойИнформации.Комментарий = КомментарийКонтактнойИнформации(ОбъектКонтактнойИнформации.ЗначенияПолей);
Исключение
ЗаписьЖурналаРегистрации(УправлениеКонтактнойИнформациейСлужебный.СобытиеЖурналаРегистрации(),
- УровеньЖурналаРегистрации.Ошибка, , ОбъектКонтактнойИнформации.ЗначенияПолей,
- ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+ УровеньЖурналаРегистрации.Ошибка, , ОбъектКонтактнойИнформации.ЗначенияПолей,
+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
- НСтр("ru = 'Некорректный формат контактной информации.'"), ,
- ОбъектКонтактнойИнформации.ИмяРеквизита);
+ НСтр("ru = 'Некорректный формат контактной информации.'"), ,
+ ОбъектКонтактнойИнформации.ИмяРеквизита);
КонецПопытки;
КонецЕсли;
КонецЦикла;
// Добавим новые реквизиты
- Форма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
+ Если МассивДобавляемыхРеквизитов.Количество() > 0 Тогда
+ Форма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
+ КонецЕсли;
- Форма.КонтактнаяИнформацияПоложениеЗаголовка = ПоложениеЗаголовкаКИ;
- Форма.КонтактнаяИнформацияГруппаДляРазмещения = ИмяЭлементаДляРазмещения;
+ Форма.ПараметрыКонтактнойИнформации = Новый Структура;
+ Форма.ПараметрыКонтактнойИнформации.Вставить("ПоложениеЗаголовка", Строка(ПоложениеЗаголовкаКИ));
+ Форма.ПараметрыКонтактнойИнформации.Вставить("ГруппаДляРазмещения", ИмяЭлементаДляРазмещения);
+ Форма.ПараметрыКонтактнойИнформации.Вставить("СписокДобавляемыхЭлементов", Новый СписокЗначений);
+ Форма.ПараметрыКонтактнойИнформации.Вставить("ДобавленныеЭлементы", Новый СписокЗначений);
+ Форма.ПараметрыКонтактнойИнформации.Вставить("ИсключаемыеВиды", ИсключаемыеВиды);
+ Форма.ПараметрыКонтактнойИнформации.Вставить("ОтложеннаяИнициализация", ОтложеннаяИнициализация);
+ Форма.ПараметрыКонтактнойИнформации.Вставить("ВыполненаОтложеннаяИнициализация", Ложь);
ПредыдущийВид = Неопределено;
@@ -242,6 +238,7 @@
Форма, ГруппаКомпоновки, ГруппировкаПодчиненныхЭлементовФормы.Вертикальная, 4);
ЗаголовокСлева = ЗаголовокСлева(Форма, ПоложениеЗаголовкаКИ);
+ СозданныеЭлементы = ОбщегоНазначенияКлиентСервер.СкопироватьМассив(ИсключаемыеВиды);
Для Каждого СтрокаКИ Из КонтактнаяИнформация Цикл
@@ -280,7 +277,7 @@
Элемент.АвтоОтметкаНезаполненного = Истина;
КонецЕсли;
- ДобавитьОписаниеЭлемента(Форма, СтрокаТабличнойЧастиКИ.ИмяРеквизита, 2, , Истина);
+ ДобавитьОписаниеЭлемента(Форма, СтрокаТабличнойЧастиКИ.ИмяРеквизита, 2);
ДобавитьРеквизитВОписание(Форма, СтрокаТабличнойЧастиКИ, Ложь, Истина);
ПредыдущийВидТЧ = ВидТЧ;
@@ -307,44 +304,41 @@
ЕстьКомментарий = ЗначениеЗаполнено(СтрокаКИ.Комментарий);
ИмяРеквизита = СтрокаКИ.ИмяРеквизита;
+ ИндексЭлемента = СозданныеЭлементы.Найти(СтрокаКИ.Вид);
+ СтатическийЭлемент = ИндексЭлемента <> Неопределено;
ЭтоНовыйВидКИ = (СтрокаКИ.Вид <> ПредыдущийВид);
- // Добавляем заголовок
- Если ЗаголовокСлева Тогда
+ Если ОтложеннаяИнициализация Тогда
- Заголовок(Форма, СтрокаКИ.Тип, ИмяРеквизита, ГруппаЗаголовков, СтрокаКИ.Наименование, ЭтоНовыйВидКИ, ЕстьКомментарий);
+ ДобавитьРеквизитВОписание(Форма, СтрокаКИ, ЭтоНовыйВидКИ,, СтатическийЭлемент);
+ Если СтатическийЭлемент Тогда
+ СозданныеЭлементы.Удалить(ИндексЭлемента);
+ КонецЕсли;
+ Продолжить;
КонецЕсли;
- ПолеВвода(Форма, СтрокаКИ.РедактированиеТолькоВДиалоге, СтрокаКИ.Тип, ИмяРеквизита, СтрокаКИ.Подсказка, ЭтоНовыйВидКИ, СтрокаКИ.ОбязательноеЗаполнение);
-
- // Выводим комментарий
- Если ЕстьКомментарий Тогда
+ Если СтатическийЭлемент Тогда
- ИмяКомментария = "Комментарий" + ИмяРеквизита;
- Комментарий(Форма, СтрокаКИ.Комментарий, ИмяКомментария, ГруппаПолейВвода);
+ СозданныеЭлементы.Удалить(ИндексЭлемента);
+
+ Иначе
+
+ СледующаяСтрока = ?(СозданныеЭлементы.Количество() = 0,
+ Неопределено,
+ КонтактнаяИнформация.Получить(КонтактнаяИнформация.Индекс(СтрокаКИ) + 1));
+ ДобавитьСтрокуКонтактнойИнформации(Форма, СтрокаКИ, ЭтоНовыйВидКИ, КоличествоАдресов, СледующаяСтрока);
КонецЕсли;
- // Заглушка , если заголовок у поля сверху.
- Если Не ЗаголовокСлева И ЭтоНовыйВидКИ Тогда
-
- ИмяДекорации = "ДекорацияВерх" + ИмяРеквизита;
- Декорация = Форма.Элементы.Добавить(ИмяДекорации, Тип("ДекорацияФормы"), ГруппаДействий);
- ДобавитьОписаниеЭлемента(Форма, ИмяДекорации, 2);
-
- КонецЕсли;
-
- Действие(Форма, СтрокаКИ.Тип, ИмяРеквизита, ГруппаДействий, КоличествоАдресов, ЕстьКомментарий);
-
ДобавитьРеквизитВОписание(Форма, СтрокаКИ, ЭтоНовыйВидКИ);
ПредыдущийВид = СтрокаКИ.Вид;
КонецЦикла;
- Если Форма.СписокДобавляемыхЭлементовКонтактнойИнформации.Количество() > 0 Тогда
+ Если Не ОтложеннаяИнициализация И Форма.ПараметрыКонтактнойИнформации.СписокДобавляемыхЭлементов.Количество() > 0 Тогда
ГруппаКоманды = Группа("ГруппаКонтактнаяИнформацияДобавитьПолеВвода",
Форма, Родитель, ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная, 5);
@@ -379,48 +373,65 @@
СписокРеквизитовФормы = Форма.ПолучитьРеквизиты();
- ПовторныйЗапуск = Ложь;
+ ПервыйЗапуск = Истина;
Для Каждого Реквизит Из СписокРеквизитовФормы Цикл
- Если Реквизит.Имя = "КонтактнаяИнформацияОписаниеДополнительныхРеквизитов" Тогда
- ПовторныйЗапуск = Истина;
+ Если Реквизит.Имя = "ПараметрыКонтактнойИнформации" И ТипЗнч(Форма.ПараметрыКонтактнойИнформации) = Тип("Структура") Тогда
+ ПервыйЗапуск = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
- Если ПовторныйЗапуск Тогда
-
- ПоложениеЗаголовкаКИ = Форма.КонтактнаяИнформацияПоложениеЗаголовка;
- ПоложениеЗаголовкаКИ = ?(ЗначениеЗаполнено(ПоложениеЗаголовкаКИ), ПоложениеЗаголовкаЭлементаФормы[ПоложениеЗаголовкаКИ], ПоложениеЗаголовкаЭлементаФормы.Верх);
-
- ИмяЭлементаДляРазмещения = Форма.КонтактнаяИнформацияГруппаДляРазмещения;
-
- УдалитьКомандыИЭлементыФормы(Форма);
-
- МассивУдаляемыхРеквизитов = Новый Массив;
-
- ИмяОбъекта = Объект.Ссылка.Метаданные().Имя;
-
- Для Каждого РеквизитФормы Из Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов Цикл
- Если Не РеквизитФормы.ЭтоРеквизитТабличнойЧасти Тогда
- МассивУдаляемыхРеквизитов.Добавить(РеквизитФормы.ИмяРеквизита);
- Иначе
- МассивУдаляемыхРеквизитов.Добавить("Объект." + ИмяТабличнойЧастиПоВидуКИ(РеквизитФормы.Вид, ИмяОбъекта) + "." + РеквизитФормы.ИмяРеквизита);
- МассивУдаляемыхРеквизитов.Добавить("Объект." + ИмяТабличнойЧастиПоВидуКИ(РеквизитФормы.Вид, ИмяОбъекта) + "." + РеквизитФормы.ИмяРеквизита + "ЗначенияПолей");
- КонецЕсли;
- КонецЦикла;
-
- МассивУдаляемыхРеквизитов.Добавить("ДобавленныеЭлементыКонтактнойИнформации");
- МассивУдаляемыхРеквизитов.Добавить("СписокДобавляемыхЭлементовКонтактнойИнформации");
- МассивУдаляемыхРеквизитов.Добавить("КонтактнаяИнформацияПоложениеЗаголовка");
- МассивУдаляемыхРеквизитов.Добавить("КонтактнаяИнформацияГруппаДляРазмещения");
- МассивУдаляемыхРеквизитов.Добавить("КонтактнаяИнформацияОписаниеДополнительныхРеквизитов");
-
- Форма.ИзменитьРеквизиты(, МассивУдаляемыхРеквизитов);
-
- ПриСозданииНаСервере(Форма, Объект, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ);
-
+ Если ПервыйЗапуск Тогда
+ Возврат;
КонецЕсли;
+ Параметры = Форма.ПараметрыКонтактнойИнформации;
+
+ ПоложениеЗаголовкаКИ = Параметры.ПоложениеЗаголовка;
+ ПоложениеЗаголовкаКИ = ?(ЗначениеЗаполнено(ПоложениеЗаголовкаКИ), ПоложениеЗаголовкаЭлементаФормы[ПоложениеЗаголовкаКИ], ПоложениеЗаголовкаЭлементаФормы.Верх);
+
+ ИмяЭлементаДляРазмещения = Параметры.ГруппаДляРазмещения;
+
+ ВыполненаОтложеннаяИнициализация = Параметры.ВыполненаОтложеннаяИнициализация;
+
+ УдалитьКомандыИЭлементыФормы(Форма);
+
+ МассивУдаляемыхРеквизитов = Новый Массив;
+
+ ИмяОбъекта = Объект.Ссылка.Метаданные().Имя;
+
+ СтатическиеРеквизиты = ОбщегоНазначенияКлиентСервер.СкопироватьМассив(Параметры.ИсключаемыеВиды);
+
+ ОтложеннаяИнициализация = Параметры.ОтложеннаяИнициализация И Не ВыполненаОтложеннаяИнициализация;
+
+ Для Каждого РеквизитФормы Из Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов Цикл
+
+ Если РеквизитФормы.ЭтоРеквизитТабличнойЧасти Тогда
+
+ МассивУдаляемыхРеквизитов.Добавить("Объект." + ИмяТабличнойЧастиПоВидуКИ(РеквизитФормы.Вид, ИмяОбъекта) + "." + РеквизитФормы.ИмяРеквизита);
+ МассивУдаляемыхРеквизитов.Добавить("Объект." + ИмяТабличнойЧастиПоВидуКИ(РеквизитФормы.Вид, ИмяОбъекта) + "." + РеквизитФормы.ИмяРеквизита + "ЗначенияПолей");
+
+ Иначе
+
+ Индекс = СтатическиеРеквизиты.Найти(РеквизитФормы.Вид);
+
+ Если Индекс = Неопределено Тогда // Реквизит создается динамически
+ Если Не ОтложеннаяИнициализация Тогда
+ МассивУдаляемыхРеквизитов.Добавить(РеквизитФормы.ИмяРеквизита);
+ КонецЕсли;
+ Иначе
+ СтатическиеРеквизиты.Удалить(Индекс);
+ КонецЕсли;
+
+ КонецЕсли;
+ КонецЦикла;
+
+ Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Очистить();
+ Форма.ИзменитьРеквизиты(, МассивУдаляемыхРеквизитов);
+
+ ПриСозданииНаСервере(Форма, Объект, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ, Параметры.ИсключаемыеВиды, ОтложеннаяИнициализация);
+ Параметры.ВыполненаОтложеннаяИнициализация = ВыполненаОтложеннаяИнициализация;
+
КонецПроцедуры
// Обработчик для события формы ПослеЗаписиНаСервере.
@@ -523,6 +534,11 @@
Иначе
+ ЭлементФормы = Форма.Элементы.Найти(ИмяРеквизита);
+ Если ЭлементФормы = Неопределено Тогда
+ Продолжить; // Элемент не был создан. Не была вызвана отложенная инициализация.
+ КонецЕсли;
+
Представление = Форма[ИмяРеквизита];
Если ВидИнформации <> ПредыдущийВид И ОбязательноеЗаполнение И ПустаяСтрока(Представление)
@@ -649,6 +665,45 @@
КонецПроцедуры
+// Выполняет отложенную инициализацию реквизитов и элементов контактной информации
+//
+// Параметры:
+// Форма - УправляемаяФорма - Форма объекта-владельца, предназначенная для вывода контактной.
+// Информации.
+// Объект - Произвольный - Объект-владелец контактной информации.
+//
+Процедура ВыполнитьОтложеннуюИнициализацию(Форма, Объект) Экспорт
+
+ КонтактнаяИнформацияОписаниеДополнительныхРеквизитов = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Выгрузить(, "Вид, Представление, ЗначенияПолей, Комментарий");
+ Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Очистить();
+ ИмяЭлементаДляРазмещения = Форма.ПараметрыКонтактнойИнформации.ГруппаДляРазмещения;
+ ПоложениеЗаголовкаКИ = Форма.ПараметрыКонтактнойИнформации.ПоложениеЗаголовка;
+ ПоложениеЗаголовкаКИ = ?(ЗначениеЗаполнено(ПоложениеЗаголовкаКИ), ПоложениеЗаголовкаЭлементаФормы[ПоложениеЗаголовкаКИ], ПоложениеЗаголовкаЭлементаФормы.Верх);
+ ПриСозданииНаСервере(Форма, Объект, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ, Форма.ПараметрыКонтактнойИнформации.ИсключаемыеВиды);
+
+ Для Каждого ВидКонтактнойИнформации Из Форма.ПараметрыКонтактнойИнформации.ИсключаемыеВиды Цикл
+
+ Отбор = Новый Структура("Вид", ВидКонтактнойИнформации);
+ МассивСтрок = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор);
+
+ Если МассивСтрок.Количество() > 0 Тогда
+ СохраненноеЗначение = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор)[0];
+ ТекущееЗначение = МассивСтрок[0];
+ ЗаполнитьЗначенияСвойств(ТекущееЗначение, СохраненноеЗначение);
+ Форма[ТекущееЗначение.ИмяРеквизита] = СохраненноеЗначение.Представление;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Если Форма.Элементы.Найти("ПустаяДекорацияКонтактнаяИнформация") <> Неопределено
+ И Форма.Элементы.ГруппаПолейВводаКонтактнойИнформации.ПодчиненныеЭлементы.Количество() > 0 Тогда
+ Форма.Элементы.ПустаяДекорацияКонтактнаяИнформация.Видимость = Ложь;
+ КонецЕсли;
+
+ Форма.ПараметрыКонтактнойИнформации.ВыполненаОтложеннаяИнициализация = Истина;
+
+КонецПроцедуры
+
////////////////////////////////////////////////////////////////////////////////
// Чтение контактной информации другими подсистемами.
@@ -1373,90 +1428,75 @@
////////////////////////////////////////////////////////////////////////////////
// Обновление информационной базы.
-// Обновляет один вид контактной информации.
+// Получить значения определенного типа контактной информации у объекта.
//
+// Параметры
+// Ссылка - ЛюбаяСсылка - ссылка на объект-владелец контактной информации (организация, контрагент, партнер и т.д.)
+// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации
+//
+// Возвращаемое значение:
+// ТаблицаЗначений - колонки
+// * Значение - строка - строковое представление значения
+// * Вид - строка - представление вида контактной информации
+//
+Функция ЗначенияКонтактнойИнформацииОбъекта(Ссылка, ТипКонтактнойИнформации) Экспорт
+
+ МассивОбъектов = Новый Массив;
+ МассивОбъектов.Добавить(Ссылка);
+
+ КонтактнаяИнформацияОбъекта = КонтактнаяИнформацияОбъектов(МассивОбъектов, ТипКонтактнойИнформации);
+
+ Запрос = Новый Запрос;
+
+ Запрос.УстановитьПараметр("КонтактнаяИнформацияОбъекта", КонтактнаяИнформацияОбъекта);
+
+ Запрос.Текст =
+ "ВЫБРАТЬ
+ | КонтактнаяИнформацияОбъекта.Представление,
+ | КонтактнаяИнформацияОбъекта.Вид
+ |ПОМЕСТИТЬ ВТКонтактнаяИнформацияОбъекта
+ |ИЗ
+ | &КонтактнаяИнформацияОбъекта КАК КонтактнаяИнформацияОбъекта
+ |;
+ |
+ |////////////////////////////////////////////////////////////////////////////////
+ |ВЫБРАТЬ
+ | КонтактнаяИнформацияОбъекта.Представление КАК Значение,
+ | ПРЕДСТАВЛЕНИЕ(КонтактнаяИнформацияОбъекта.Вид) КАК Вид
+ |ИЗ
+ | ВТКонтактнаяИнформацияОбъекта КАК КонтактнаяИнформацияОбъекта";
+
+ Возврат Запрос.Выполнить().Выгрузить();
+
+КонецФункции
+
+
+// Устанавливает свойства вида контактной информации.
+//
// Параметры:
-// Вид - СправочникСсылка.ВидыКонтактнойИнформации, Строка - Ссылка на вид контактной информации или
-// идентификатор предопределенного элемента.
-// Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации, Строка - Тип контактной информации или его идентификатор.
-// Подсказка - Строка - Подсказка к виду контактной информации.
-// МожноИзменятьСпособРедактирования - Булево - Истина, если есть возможность изменять настройки
-// вида, Ложь - иначе.
-// РедактированиеТолькоВДиалоге - Булево - Истина, если редактировать только в диалоге, Ложь -
-// иначе.
-// ОбязательноеЗаполнение - Булево - Истина, если требуется обязательное
-// заполнение поля, Ложь - иначе.
-// Порядок - Число, Неопределено - Порядок вида контактной информации, положение в
-// списке относительно других элементов:
-// Неопределено - не переназначать;
-// 0 - назначить автоматически;
-// Число > 0 - назначить указанный порядок.
-// РазрешитьВводНесколькихЗначений - Булево - Признак возможности использования дополнительных
-// полей ввода для данного вида.
-// НастройкиПроверки - Структура, Неопределено - Настройки проверки для вида контактной информации.
-// Для типа Адрес - структура, содержащая поля:
-// * АдресТолькоРоссийский - Булево - Истина, если используются только российские адреса, Ложь -
-// иначе.
-// * ПроверятьКорректность - Булево - Истина, если используется проверка адреса по разрезам КЛАДР
-// (Только если АдресТолькоРоссийский = Истина), Ложь - иначе.
-// * ПроверятьПоФИАС - Булево - Истина, если используется проверка адреса по разрезам ФИАС
-// (Только если АдресТолькоРоссийский = Истина), Ложь - иначе.
-// * ЗапрещатьВводНекорректного - Булево - Истина, если требуется запрещать пользователю записывать
-// некорректный адрес (Только если ПроверятьКорректность =
-// Истина), Ложь - иначе.
-// * СкрыватьНеактуальныеАдреса - Булево - Истина, если не требуется показывать неактуальные адреса при
-// вводе(Только если АдресТолькоРоссийский = Истина), Ложь - иначе.
-// * ВключатьСтрануВПредставление - Булево - Истина, если требуется включать наименование страны в
-// представление адреса, Ложь - иначе.
-// Для типа АдресЭлектроннойПочты - структура, содержащая поля:
-// * ПроверятьКорректность - Булево - Истина, если требуется проверка адреса электронной почты на
-// корректность, Ложь - иначе.
-// * ЗапрещатьВводНекорректного - Булево - Истина, если требуется запрещать пользователю записывать
-// некорректный адрес (Только если ПроверятьКорректность = Истина),
-// Ложь - иначе.
-// Для остальных типов или для задания настроек по умолчанию используется Неопределено.
-//
-// Примечание:
-// Установка параметра ПроверятьКорректность в значение Истина требует так же установить параметр
-// ЗапрещатьВводНекорректного в значение Истина.
-//
-// При использовании параметра Порядок следует внимательно следить за уникальностью назначаемого значения. Если
-// после выполнения обновления значения порядка окажутся неуникальными в пределах группы, то настройка порядка
-// пользователем будет невозможна.
-// В общем случае рекомендуется не использовать этот параметр (порядок не изменится), либо заполнять его значением
-// 0 (порядок будет назначен автоматически в подсистеме
-// "Настройка порядка элементов" при выполнении процедуры).
-// Для размещения видов КИ в определенной последовательности относительно друг друга без явного размещения в начале
-// списка достаточно вызывать данную процедуру
-// в нужной последовательности для каждого вида КИ с указанием порядка 0.
-// Если добавляется предопределенный вид КИ к уже существующим в ИБ, не рекомендуется назначать порядок в явном виде.
-//
-Процедура ОбновитьВидКонтактнойИнформации(Вид, Тип, Подсказка, МожноИзменятьСпособРедактирования, РедактированиеТолькоВДиалоге,
- ОбязательноеЗаполнение, Порядок = Неопределено, РазрешитьВводНесколькихЗначений = Ложь, НастройкиПроверки = Неопределено) Экспорт
+// Параметры - Структура - См. описание в функции ПараметрыВидаКонтактнойИнформации
+//
+Процедура УстановитьСвойстваВидаКонтактнойИнформации(Параметры) Экспорт
- Если ТипЗнч(Вид) = Тип("Строка") Тогда
- Объект = Справочники.ВидыКонтактнойИнформации[Вид].ПолучитьОбъект();
+ Если ТипЗнч(Параметры.Вид) = Тип("Строка") Тогда
+ Объект = Справочники.ВидыКонтактнойИнформации[Параметры.Вид].ПолучитьОбъект();
Иначе
- Объект = Вид.ПолучитьОбъект();
+ Объект = Параметры.Вид.ПолучитьОбъект();
КонецЕсли;
- Если ТипЗнч(Тип) = Тип("Строка") Тогда
- УстанавливаемыйТип = Перечисления.ТипыКонтактнойИнформации[Тип];
- Иначе
- УстанавливаемыйТип = Тип;
- КонецЕсли;
-
- Объект.Тип = УстанавливаемыйТип;
- Объект.Подсказка = Подсказка;
- Объект.МожноИзменятьСпособРедактирования = МожноИзменятьСпособРедактирования;
- Объект.РедактированиеТолькоВДиалоге = РедактированиеТолькоВДиалоге;
- Объект.ОбязательноеЗаполнение = ОбязательноеЗаполнение;
- Объект.РазрешитьВводНесколькихЗначений = РазрешитьВводНесколькихЗначений;
+ Объект.Тип = Параметры.Тип;
+ Объект.Подсказка = Параметры.Подсказка;
+ Объект.МожноИзменятьСпособРедактирования = Параметры.МожноИзменятьСпособРедактирования;
+ Объект.РедактированиеТолькоВДиалоге = Параметры.РедактированиеТолькоВДиалоге;
+ Объект.ОбязательноеЗаполнение = Параметры.ОбязательноеЗаполнение;
+ Объект.РазрешитьВводНесколькихЗначений = Параметры.РазрешитьВводНесколькихЗначений;
+ Объект.ЗапретитьРедактированиеПользователем = Параметры.ЗапретитьРедактированиеПользователем;
+ НастройкиПроверки = Параметры.НастройкиПроверки;
ПроверятьНастройки = ТипЗнч(НастройкиПроверки) = Тип("Структура");
ОшибкаПараметров = НСтр("ru = 'Некорректно заполнены настройки проверки адреса'");
- Если ПроверятьНастройки И УстанавливаемыйТип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
+ Если ПроверятьНастройки И Параметры.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
Если НастройкиПроверки.АдресТолькоРоссийский Тогда
Если Не НастройкиПроверки.ПроверятьКорректность Тогда
Если НастройкиПроверки.ЗапрещатьВводНекорректного Тогда
@@ -1478,7 +1518,7 @@
ЗаполнитьЗначенияСвойств(Объект, НастройкиПроверки);
- ИначеЕсли ПроверятьНастройки И УстанавливаемыйТип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
+ ИначеЕсли ПроверятьНастройки И Параметры.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
Если Не НастройкиПроверки.ПроверятьКорректность Тогда
Если НастройкиПроверки.ЗапрещатьВводНекорректного Тогда
ВызватьИсключение ОшибкаПараметров;
@@ -1496,13 +1536,122 @@
КонецЕсли;
- Если Порядок <> Неопределено Тогда
- Объект.РеквизитДопУпорядочивания = Порядок;
+ Если Параметры.Порядок <> Неопределено Тогда
+ Объект.РеквизитДопУпорядочивания = Параметры.Порядок;
КонецЕсли;
ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект);
+
КонецПроцедуры
+// Возвращает структуру параметров вида контактной информации для определенного типа
+//
+// Параметры:
+// Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации, Строка - тип контактной информации для
+// заполнения свойства НастройкиПроверки
+//
+// Возвращаемое значение:
+// Структура - содержит структуру с полями:
+// * Вид - СправочникСсылка.ВидыКонтактнойИнформации, Строка - Ссылка на вид контактной информации или
+// идентификатор предопределенного элемента.
+// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - Тип контактной информации или его
+// идентификатор.
+// * Подсказка - Строка - Подсказка к виду контактной информации.
+// * Порядок - Число, Неопределено - Порядок вида контактной информации, положение в
+// списке относительно других элементов:
+// Неопределено - не переназначать;
+// 0 - назначить автоматически;
+// Число > 0 - назначить указанный порядок.
+// * МожноИзменятьСпособРедактирования - Булево - Истина, если есть возможность изменять способ
+// редактирования только в диалоге, Ложь - иначе.
+// * РедактированиеТолькоВДиалоге - Булево - Истина, если редактировать только в диалоге,
+// Ложь - иначе.
+// * ОбязательноеЗаполнение - Булево - Истина, если требуется обязательное
+// заполнение поля, Ложь - иначе.
+// * РазрешитьВводНесколькихЗначений - Булево - Признак возможности использования дополнительных
+// полей ввода для данного вида.
+// * ЗапретитьРедактированиеПользователем - Булево - Признак недоступности редактирования
+// пользователем свойства вида контактной
+// информации.
+// * НастройкиПроверки - Структура, Неопределено - Настройки проверки вида контактной информации.
+// Для типа Адрес - Структура, содержащая поля:
+// * АдресТолькоРоссийский - Булево - Истина, если используются только российские адреса, Ложь -
+// иначе.
+// * ПроверятьКорректность - Булево - Истина, если используется проверка адреса по разрезам КЛАДР
+// (Только если АдресТолькоРоссийский = Истина), Ложь - иначе.
+// * ПроверятьПоФИАС - Булево - Истина, если используется проверка адреса по разрезам ФИАС
+// (Только если АдресТолькоРоссийский = Истина), Ложь - иначе.
+// * ЗапрещатьВводНекорректного - Булево - Истина, если требуется запрещать пользователю записывать
+// некорректный адрес (Только если ПроверятьКорректность =
+// Истина), Ложь - иначе.
+// * СкрыватьНеактуальныеАдреса - Булево - Истина, если не требуется показывать неактуальные адреса при
+// вводе(Только если АдресТолькоРоссийский = Истина),
+// Ложь - иначе.
+// * ВключатьСтрануВПредставление - Булево - Истина, если требуется включать наименование страны в
+// представление адреса, Ложь - иначе.
+// Для типа АдресЭлектроннойПочты - Структура, содержащая поля:
+// * ПроверятьКорректность - Булево - Истина, если требуется проверка адреса электронной почты на
+// корректность, Ложь - иначе.
+// * ЗапрещатьВводНекорректного - Булево - Истина, если требуется запрещать пользователю записывать
+// некорректный адрес (Только если
+// ПроверятьКорректность = Истина), Ложь - иначе.
+// Для остальных типов или для задания настроек по умолчанию используется Неопределено.
+//
+// Примечание:
+// Установка параметра ПроверятьКорректность в значение Истина требует так же установить параметр
+// ЗапрещатьВводНекорректного в значение Истина.
+//
+// При использовании параметра Порядок следует внимательно следить за уникальностью назначаемого значения. Если
+// после выполнения обновления значения порядка окажутся неуникальными в пределах группы, то настройка порядка
+// пользователем будет невозможна.
+// В общем случае рекомендуется не использовать этот параметр (порядок не изменится), либо заполнять его значением
+// 0 (порядок будет назначен автоматически в подсистеме "Настройка порядка элементов" при выполнении процедуры).
+// Для размещения видов КИ в определенной последовательности относительно друг друга без явного размещения в начале
+// списка достаточно вызывать данную процедуру в нужной последовательности для каждого вида КИ с указанием
+// порядка 0. Если добавляется предопределенный вид КИ к уже существующим в ИБ, не рекомендуется назначать порядок
+// в явном виде.
+//
+Функция ПараметрыВидаКонтактнойИнформации(Тип = Неопределено) Экспорт
+
+ Если ТипЗнч(Тип) = Тип("Строка") Тогда
+ УстанавливаемыйТип = Перечисления.ТипыКонтактнойИнформации[Тип];
+ Иначе
+ УстанавливаемыйТип = Тип;
+ КонецЕсли;
+
+ ПараметрыВида = Новый Структура;
+ ПараметрыВида.Вставить("Вид");
+ ПараметрыВида.Вставить("Тип", УстанавливаемыйТип);
+ ПараметрыВида.Вставить("Подсказка");
+ ПараметрыВида.Вставить("Порядок");
+ ПараметрыВида.Вставить("МожноИзменятьСпособРедактирования", Ложь);
+ ПараметрыВида.Вставить("РедактированиеТолькоВДиалоге", Ложь);
+ ПараметрыВида.Вставить("ОбязательноеЗаполнение", Ложь);
+ ПараметрыВида.Вставить("РазрешитьВводНесколькихЗначений", Ложь);
+ ПараметрыВида.Вставить("ЗапретитьРедактированиеПользователем", Ложь);
+
+ Если УстанавливаемыйТип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
+ НастройкиПроверки = Новый Структура;
+ НастройкиПроверки.Вставить("АдресТолькоРоссийский", Ложь);
+ НастройкиПроверки.Вставить("ПроверятьКорректность", Ложь);
+ НастройкиПроверки.Вставить("ПроверятьПоФИАС", Ложь);
+ НастройкиПроверки.Вставить("ЗапрещатьВводНекорректного", Ложь);
+ НастройкиПроверки.Вставить("СкрыватьНеактуальныеАдреса", Ложь);
+ НастройкиПроверки.Вставить("ВключатьСтрануВПредставление", Ложь);
+ ИначеЕсли УстанавливаемыйТип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда
+ НастройкиПроверки = Новый Структура;
+ НастройкиПроверки.Вставить("ПроверятьКорректность", Ложь);
+ НастройкиПроверки.Вставить("ЗапрещатьВводНекорректного", Ложь);
+ Иначе
+ НастройкиПроверки = Неопределено;
+ КонецЕсли;
+
+ ПараметрыВида.Вставить("НастройкиПроверки", НастройкиПроверки);
+
+ Возврат ПараметрыВида;
+
+КонецФункции
+
// Записывает контактную информацию из XML в поля табличной части Контактная информация объекта.
//
// Параметры:
@@ -1549,29 +1698,45 @@
КонецПроцедуры
+// Устарела. Следует использовать УстановитьСвойстваВидаКонтактнойИнформации.
+//
+Процедура ОбновитьВидКонтактнойИнформации(Вид, Тип, Подсказка, МожноИзменятьСпособРедактирования, РедактированиеТолькоВДиалоге,
+ ОбязательноеЗаполнение, Порядок = Неопределено, РазрешитьВводНесколькихЗначений = Ложь, НастройкиПроверки = Неопределено) Экспорт
+
+ ПараметрыВида = ПараметрыВидаКонтактнойИнформации();
+ ПараметрыВида.Вид = Вид;
+ ПараметрыВида.Тип = Тип;
+ ПараметрыВида.Подсказка = Подсказка;
+ ПараметрыВида.МожноИзменятьСпособРедактирования = МожноИзменятьСпособРедактирования;
+ ПараметрыВида.РедактированиеТолькоВДиалоге = РедактированиеТолькоВДиалоге;
+ ПараметрыВида.ОбязательноеЗаполнение = ОбязательноеЗаполнение;
+ ПараметрыВида.Порядок = Порядок;
+ ПараметрыВида.РазрешитьВводНесколькихЗначений = РазрешитьВводНесколькихЗначений;
+ ПараметрыВида.НастройкиПроверки = НастройкиПроверки;
+ ПараметрыВида.ЗапретитьРедактированиеПользователем = Ложь;
+
+ УстановитьСвойстваВидаКонтактнойИнформации(ПараметрыВида);
+
+КонецПроцедуры
#КонецОбласти
+
#Область СлужебныеПроцедурыИФункции
////////////////////////////////////////////////////////////////////////////////
// Инициализация элементов на форме объект-владельца контактной информации.
-Процедура ДобавитьОписаниеЭлемента(Форма, ИмяЭлемента, Приоритет, ЭтоКоманда = Ложь, ЭтоРеквизитТабличнойЧасти = Ложь)
+Процедура ДобавитьОписаниеЭлемента(Форма, ИмяЭлемента, Приоритет, ЭтоКоманда = Ложь)
- НоваяСтрока = Форма.ДобавленныеЭлементыКонтактнойИнформации.Добавить();
- НоваяСтрока.ИмяЭлемента = ИмяЭлемента;
- НоваяСтрока.Приоритет = Приоритет;
- НоваяСтрока.ЭтоКоманда = ЭтоКоманда;
- НоваяСтрока.ЭтоРеквизитТабличнойЧасти = ЭтоРеквизитТабличнойЧасти;
+ Форма.ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.Добавить(ИмяЭлемента, Приоритет, ЭтоКоманда);
КонецПроцедуры
Процедура УдалитьОписаниеЭлемента(Форма, ИмяЭлемента)
- ДобавленныеЭлементы = Форма.ДобавленныеЭлементыКонтактнойИнформации;
- Отбор = Новый Структура("ИмяЭлемента", ИмяЭлемента);
- НайденнаяСтрока = ДобавленныеЭлементы.НайтиСтроки(Отбор)[0];
+ ДобавленныеЭлементы = Форма.ПараметрыКонтактнойИнформации.ДобавленныеЭлементы;
+ НайденнаяСтрока = ДобавленныеЭлементы.НайтиПоЗначению(ИмяЭлемента);
ДобавленныеЭлементы.Удалить(НайденнаяСтрока);
КонецПроцедуры
@@ -1580,7 +1745,7 @@
Если Не ЗначениеЗаполнено(ПоложениеЗаголовкаКИ) Тогда
- СохраненноеПоложениеЗаголовка = Форма.КонтактнаяИнформацияПоложениеЗаголовка;
+ СохраненноеПоложениеЗаголовка = Форма.ПараметрыКонтактнойИнформации.ПоложениеЗаголовка;
Если ЗначениеЗаполнено(СохраненноеПоложениеЗаголовка) Тогда
ПоложениеЗаголовкаКИ = ПоложениеЗаголовкаЭлементаФормы[СохраненноеПоложениеЗаголовка];
Иначе
@@ -1595,11 +1760,20 @@
Процедура ИзменитьКомментарий(Форма, ИмяРеквизита, ЭтоДобавлениеКомментария)
+ Если Форма.ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.НайтиПоЗначению(ИмяРеквизита) = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+
ОписаниеКонтактнойИнформации = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов;
+ Если Форма.ПараметрыКонтактнойИнформации.ДобавленныеЭлементы.НайтиПоЗначению(ИмяРеквизита) = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+
Отбор = Новый Структура("ИмяРеквизита", ИмяРеквизита);
НайденнаяСтрока = ОписаниеКонтактнойИнформации.НайтиСтроки(Отбор)[0];
+
// Заголовок и поле ввода
ЗаголовокЭлемента = Форма.Элементы.Найти("Заголовок" + ИмяРеквизита);
ИмяКомментария = "Комментарий" + ИмяРеквизита;
@@ -1692,49 +1866,68 @@
КонецПроцедуры
-Процедура ДобавитьСтрокуКонтактнойИнформации(Форма, Результат)
+Процедура ДобавитьСтрокуКонтактнойИнформации(Форма, Результат, ЭтоНовыйВидКИ = Ложь, КоличествоАдресов = Неопределено, СледующаяСтрока = Неопределено)
- ДобавляемыйВид = Результат.ДобавляемыйВид;
- Если ТипЗнч(ДобавляемыйВид)= Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда
- ИнформацияОВидеКИ = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДобавляемыйВид, "Тип, Наименование, РедактированиеТолькоВДиалоге, Подсказка");
+ ДобавлениеНовогоЗначения = ТипЗнч(Результат) = Тип("Структура");
+
+ Если ДобавлениеНовогоЗначения Тогда
+ ДобавляемыйВид = Результат.ДобавляемыйВид;
+ Если ТипЗнч(ДобавляемыйВид)= Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда
+ ИнформацияОВидеКИ = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДобавляемыйВид, "Тип, Наименование, РедактированиеТолькоВДиалоге, Подсказка");
+ Иначе
+ ИнформацияОВидеКИ = ДобавляемыйВид;
+ ДобавляемыйВид = ДобавляемыйВид.Ссылка;
+ КонецЕсли;
Иначе
- ИнформацияОВидеКИ = ДобавляемыйВид;
- ДобавляемыйВид = ДобавляемыйВид.Ссылка;
+ ИнформацияОВидеКИ = Результат;
+ ДобавляемыйВид = Результат.Вид;
КонецЕсли;
ТаблицаКонтактнойИнформации = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов;
+ ОтборПоВиду = Новый Структура("Вид", ДобавляемыйВид);
- Отбор = Новый Структура("Вид", ДобавляемыйВид);
- НайденныеСтроки = ТаблицаКонтактнойИнформации.НайтиСтроки(Отбор);
- КоличествоЭлементов = НайденныеСтроки.Количество();
-
- ПоследняяСтрока = НайденныеСтроки.Получить(КоличествоЭлементов-1);
- ИндексДобавляемойСтроки = ТаблицаКонтактнойИнформации.Индекс(ПоследняяСтрока) + 1;
- ЭтоПоследняяСтрока = Ложь;
- Если ИндексДобавляемойСтроки = ТаблицаКонтактнойИнформации.Количество() Тогда
- ЭтоПоследняяСтрока = Истина;
+ Если ДобавлениеНовогоЗначения Тогда
+
+ НайденныеСтроки = ТаблицаКонтактнойИнформации.НайтиСтроки(ОтборПоВиду);
+
+ ПоследняяСтрока = НайденныеСтроки.Получить(НайденныеСтроки.Количество() - 1);
+ ИндексДобавляемойСтроки = ТаблицаКонтактнойИнформации.Индекс(ПоследняяСтрока) + 1;
+ ЭтоПоследняяСтрока = Ложь;
+ Если ИндексДобавляемойСтроки = ТаблицаКонтактнойИнформации.Количество() Тогда
+ ЭтоПоследняяСтрока = Истина;
+ Иначе
+ ИмяСледующегоРеквизита = ТаблицаКонтактнойИнформации[ИндексДобавляемойСтроки].ИмяРеквизита;
+ КонецЕсли;
+
+ НоваяСтрока = ТаблицаКонтактнойИнформации.Вставить(ИндексДобавляемойСтроки);
+ ИмяРеквизита = "КонтактнаяИнформацияПоле" + НоваяСтрока.ПолучитьИдентификатор();
+ НоваяСтрока.ИмяРеквизита = ИмяРеквизита;
+ НоваяСтрока.Вид = ДобавляемыйВид;
+ НоваяСтрока.Тип = ИнформацияОВидеКИ.Тип;
+ НоваяСтрока.ЭтоРеквизитТабличнойЧасти = Ложь;
+
+ МассивДобавляемыхРеквизитов = Новый Массив;
+ МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ИмяРеквизита, Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(500)), , ИнформацияОВидеКИ.Наименование, Истина));
+ Форма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
+
+ ЕстьКомментарий = Ложь;
+ ОбязательноеЗаполнение = Ложь;
Иначе
- ИмяСледующегоРеквизита = ТаблицаКонтактнойИнформации[ИндексДобавляемойСтроки].ИмяРеквизита;
+ ЭтоПоследняяСтрока = СледующаяСтрока = Неопределено;
+ Если Не ЭтоПоследняяСтрока Тогда
+ ИмяСледующегоРеквизита = СледующаяСтрока.ИмяРеквизита;
+ КонецЕсли;
+ ИмяРеквизита = ИнформацияОВидеКИ.ИмяРеквизита;
+ ЕстьКомментарий = ЗначениеЗаполнено(ИнформацияОВидеКИ.Комментарий);
+ ОбязательноеЗаполнение = ИнформацияОВидеКИ.ОбязательноеЗаполнение;
КонецЕсли;
- НоваяСтрока = ТаблицаКонтактнойИнформации.Вставить(ИндексДобавляемойСтроки);
- ИмяРеквизита = "КонтактнаяИнформацияПоле" + НоваяСтрока.ПолучитьИдентификатор();
- НоваяСтрока.ИмяРеквизита = ИмяРеквизита;
- НоваяСтрока.Вид = ДобавляемыйВид;
- НоваяСтрока.Тип = ИнформацияОВидеКИ.Тип;
- НоваяСтрока.ЭтоРеквизитТабличнойЧасти = Ложь;
-
- МассивДобавляемыхРеквизитов = Новый Массив;
- МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ИмяРеквизита, Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(500)), , ИнформацияОВидеКИ.Наименование, Истина));
-
- Форма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
-
ЗаголовокСлева = ЗаголовокСлева(Форма);
// Отрисовка на форме
Если ЗаголовокСлева Тогда
ГруппаЗаголовков = Форма.Элементы.ГруппаЗаголовковКонтактнойИнформации;
- Заголовок = Заголовок(Форма, ИнформацияОВидеКИ.Тип, ИмяРеквизита, ГруппаЗаголовков, ИнформацияОВидеКИ.Наименование);
+ Заголовок = Заголовок(Форма, ИнформацияОВидеКИ.Тип, ИмяРеквизита, ГруппаЗаголовков, ИнформацияОВидеКИ.Наименование, ЭтоНовыйВидКИ, ЕстьКомментарий);
Если Не ЭтоПоследняяСтрока Тогда
СледующийЗаголовок = Форма.Элементы["Заголовок" + ИмяСледующегоРеквизита];
@@ -1743,26 +1936,36 @@
КонецЕсли;
ГруппаПолейВвода = Форма.Элементы.ГруппаПолейВводаКонтактнойИнформации;
- ПолеВвода = ПолеВвода(Форма, ИнформацияОВидеКИ.РедактированиеТолькоВДиалоге, ИнформацияОВидеКИ.Тип, ИмяРеквизита, ИнформацияОВидеКИ.Подсказка);
+ ПолеВвода = ПолеВвода(Форма, ИнформацияОВидеКИ.РедактированиеТолькоВДиалоге, ИнформацияОВидеКИ.Тип, ИмяРеквизита, ИнформацияОВидеКИ.Подсказка, ЭтоНовыйВидКИ, ОбязательноеЗаполнение);
Если Не ЭтоПоследняяСтрока Тогда
- ИмяСледующегоЭлемента = ПоследняяСтрока.ИмяРеквизита;
-
- Если ЗначениеЗаполнено(ПоследняяСтрока.Комментарий) Тогда
- ИмяСледующегоЭлемента = "Комментарий" + ИмяСледующегоЭлемента;
+ Если СледующаяСтрока = Неопределено Тогда
+
+ ИмяСледующегоЭлемента = ПоследняяСтрока.ИмяРеквизита;
+
+ Если ЗначениеЗаполнено(ПоследняяСтрока.Комментарий) Тогда
+ ИмяСледующегоЭлемента = "Комментарий" + ИмяСледующегоЭлемента;
+ КонецЕсли;
+
+ ИндексСледующегоЭлемента = ГруппаПолейВвода.ПодчиненныеЭлементы.Индекс(Форма.Элементы[ИмяСледующегоЭлемента]) + 1;
+ СледующийЭлемент = ГруппаПолейВвода.ПодчиненныеЭлементы.Получить(ИндексСледующегоЭлемента);
+
+ Иначе
+
+ СледующийЭлемент = Форма.Элементы[СледующаяСтрока.ИмяРеквизита];
+
КонецЕсли;
- ИндексСледующегоЭлемента = ГруппаПолейВвода.ПодчиненныеЭлементы.Индекс(Форма.Элементы[ИмяСледующегоЭлемента]) + 1;
- СледующийЭлемент = ГруппаПолейВвода.ПодчиненныеЭлементы.Получить(ИндексСледующегоЭлемента);
-
Форма.Элементы.Переместить(ПолеВвода, ГруппаПолейВвода, СледующийЭлемент);
КонецЕсли;
ГруппаДействий = Форма.Элементы.ГруппаДействийКонтактнойИнформации;
- Отбор = Новый Структура("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес);
- КоличествоАдресов = ТаблицаКонтактнойИнформации.НайтиСтроки(Отбор).Количество();
+ Если КоличествоАдресов = Неопределено Тогда
+ ОтборПоТипу = Новый Структура("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес);
+ КоличествоАдресов = ТаблицаКонтактнойИнформации.НайтиСтроки(ОтборПоТипу).Количество();
+ КонецЕсли;
ИмяДействия = "Команда" + ИмяСледующегоРеквизита;
ИмяЗаглушки = "ДекорацияВерх" + ИмяСледующегоРеквизита;
@@ -1775,18 +1978,56 @@
ИмяСледующегоДействия = "ЗаглушкаДействия" + ИмяСледующегоРеквизита;
КонецЕсли;
- Действие = Действие(Форма, ИнформацияОВидеКИ.Тип, ИмяРеквизита, ГруппаДействий, КоличествоАдресов);
- Если Не ЭтоПоследняяСтрока Тогда
- СледующееДействие = Форма.Элементы[ИмяСледующегоДействия];
- Форма.Элементы.Переместить(Действие, ГруппаДействий, СледующееДействие);
+ // Выводим комментарий
+ Если ЕстьКомментарий Тогда
+
+ ИмяКомментария = "Комментарий" + ИмяРеквизита;
+ Комментарий = Комментарий(Форма, ИнформацияОВидеКИ.Комментарий, ИмяКомментария, ГруппаПолейВвода);
+
+ Если Не ЭтоПоследняяСтрока Тогда
+
+ ИмяСледующегоЭлемента = ПоследняяСтрока.ИмяРеквизита;
+
+ Если ЗначениеЗаполнено(ПоследняяСтрока.Комментарий) Тогда
+ ИмяСледующегоЭлемента = "Комментарий" + ИмяСледующегоЭлемента;
+ КонецЕсли;
+
+ ИндексСледующегоЭлемента = ГруппаПолейВвода.ПодчиненныеЭлементы.Индекс(Форма.Элементы[ИмяСледующегоЭлемента]) + 1;
+ СледующийЭлемент = ГруппаПолейВвода.ПодчиненныеЭлементы.Получить(ИндексСледующегоЭлемента);
+
+ Форма.Элементы.Переместить(Комментарий, ГруппаПолейВвода, СледующийЭлемент);
+
+ КонецЕсли;
+
КонецЕсли;
- Форма.ТекущийЭлемент = Форма.Элементы[ИмяРеквизита];
-
- Если ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес
- И ИнформацияОВидеКИ.РедактированиеТолькоВДиалоге Тогда
+ // Заглушка , если заголовок у поля сверху.
+ Если Не ЗаголовокСлева И ЭтоНовыйВидКИ Тогда
- Результат.Вставить("ЭлементФормыАдреса", ИмяРеквизита);
+ ИмяДекорации = "ДекорацияВерх" + ИмяРеквизита;
+ Декорация = Форма.Элементы.Добавить(ИмяДекорации, Тип("ДекорацияФормы"), ГруппаДействий);
+ ДобавитьОписаниеЭлемента(Форма, ИмяДекорации, 2);
+
+ КонецЕсли;
+
+ Действие = Действие(Форма, ИнформацияОВидеКИ.Тип, ИмяРеквизита, ГруппаДействий, КоличествоАдресов, ЕстьКомментарий);
+ Если Не ЭтоПоследняяСтрока Тогда
+ СледующееДействие = Форма.Элементы.Найти(ИмяСледующегоДействия);
+ Если СледующееДействие <> Неопределено Тогда
+ Форма.Элементы.Переместить(Действие, ГруппаДействий, СледующееДействие);
+ КонецЕсли;
+ КонецЕсли;
+
+ Если ДобавлениеНовогоЗначения Тогда
+
+ Форма.ТекущийЭлемент = Форма.Элементы[ИмяРеквизита];
+
+ Если ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес
+ И ИнформацияОВидеКИ.РедактированиеТолькоВДиалоге Тогда
+
+ Результат.Вставить("ЭлементФормыАдреса", ИмяРеквизита);
+
+ КонецЕсли;
КонецЕсли;
@@ -1997,17 +2238,61 @@
Функция Группа(ИмяГруппы, Форма, Родитель, Группировка, ПорядокУдаления)
- НоваяГруппа = Форма.Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы"), Родитель);
- НоваяГруппа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
- НоваяГруппа.ОтображатьЗаголовок = Ложь;
- НоваяГруппа.Отображение = ОтображениеОбычнойГруппы.Нет;
- НоваяГруппа.Группировка = Группировка;
- ДобавитьОписаниеЭлемента(Форма, ИмяГруппы, ПорядокУдаления);
+ Группа = Форма.Элементы.Найти(ИмяГруппы);
- Возврат НоваяГруппа;
+ Если Группа = Неопределено Тогда
+ Группа = Форма.Элементы.Добавить(ИмяГруппы, Тип("ГруппаФормы"), Родитель);
+ Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
+ Группа.ОтображатьЗаголовок = Ложь;
+ Группа.Отображение = ОтображениеОбычнойГруппы.Нет;
+ Группа.Группировка = Группировка;
+ ДобавитьОписаниеЭлемента(Форма, ИмяГруппы, ПорядокУдаления);
+
+ КонецЕсли;
+
+ Возврат Группа;
КонецФункции
+Процедура ПроверитьНаличиеРеквизитовКонтактнойИнформации(Форма, МассивДобавляемыхРеквизитов)
+
+ СписокРеквизитовФормы = Форма.ПолучитьРеквизиты();
+
+ СоздатьПараметрыКонтактнойИнформации = Истина;
+ СоздатьТаблицуКонтактнойИнформации = Истина;
+ Для Каждого Реквизит Из СписокРеквизитовФормы Цикл
+ Если Реквизит.Имя = "ПараметрыКонтактнойИнформации" Тогда
+ СоздатьПараметрыКонтактнойИнформации = Ложь;
+ ИначеЕсли Реквизит.Имя = "КонтактнаяИнформацияОписаниеДополнительныхРеквизитов" Тогда
+ СоздатьТаблицуКонтактнойИнформации = Ложь;
+ КонецЕсли;
+ КонецЦикла;
+
+ Если СоздатьТаблицуКонтактнойИнформации Тогда
+
+ Строка500 = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(500));
+
+ // Создадим таблицу значений
+ ИмяОписания = "КонтактнаяИнформацияОписаниеДополнительныхРеквизитов";
+ МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ИмяОписания, Новый ОписаниеТипов("ТаблицаЗначений")));
+ МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ИмяРеквизита", Строка500, ИмяОписания));
+ МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Вид", Новый ОписаниеТипов("СправочникСсылка.ВидыКонтактнойИнформации"), ИмяОписания));
+ МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Тип", Новый ОписаниеТипов("ПеречислениеСсылка.ТипыКонтактнойИнформации"), ИмяОписания));
+ МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ЗначенияПолей", Новый ОписаниеТипов("СписокЗначений, Строка"), ИмяОписания));
+ МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Представление", Строка500, ИмяОписания));
+ МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Комментарий", Новый ОписаниеТипов("Строка"), ИмяОписания));
+ МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ЭтоРеквизитТабличнойЧасти", Новый ОписаниеТипов("Булево"), ИмяОписания));
+
+ КонецЕсли;
+
+ Если СоздатьПараметрыКонтактнойИнформации Тогда
+
+ МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ПараметрыКонтактнойИнформации", Новый ОписаниеТипов()));
+
+ КонецЕсли;
+
+КонецПроцедуры
+
Процедура УстановитьЗначенияРеквизитовПроверки(Объект, НастройкиПроверки = Неопределено)
Объект.ПроверятьКорректность = ?(НастройкиПроверки = Неопределено, Ложь, НастройкиПроверки.ПроверятьКорректность);
@@ -2022,7 +2307,7 @@
КонецПроцедуры
-Процедура ДобавитьРеквизитВОписание(Форма, СтрокаКИ, ЭтоНовыйВидКИ, ЭтоРеквизитТабличнойЧасти = Ложь)
+Процедура ДобавитьРеквизитВОписание(Форма, СтрокаКИ, ЭтоНовыйВидКИ, ЭтоРеквизитТабличнойЧасти = Ложь, ЗаполнятьЗначениеРеквизита = Истина)
НоваяСтрока = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Добавить();
НоваяСтрока.ИмяРеквизита = СтрокаКИ.ИмяРеквизита;
@@ -2039,7 +2324,7 @@
НоваяСтрока.Представление = СтрокаКИ.Представление;
НоваяСтрока.Комментарий = СтрокаКИ.Комментарий;
- Если Не ЭтоРеквизитТабличнойЧасти Тогда
+ Если ЗаполнятьЗначениеРеквизита И Не ЭтоРеквизитТабличнойЧасти Тогда
Форма[СтрокаКИ.ИмяРеквизита] = СтрокаКИ.Представление;
@@ -2050,7 +2335,7 @@
Если ЭтоНовыйВидКИ И СтруктураВидаКИ.РазрешитьВводНесколькихЗначений И Не ЭтоРеквизитТабличнойЧасти Тогда
- Форма.СписокДобавляемыхЭлементовКонтактнойИнформации.Добавить(СтруктураВидаКИ, СтрокаКИ.Вид.Наименование);
+ Форма.ПараметрыКонтактнойИнформации.СписокДобавляемыхЭлементов.Добавить(СтруктураВидаКИ, СтрокаКИ.Вид.Наименование);
КонецЕсли;
@@ -2058,15 +2343,15 @@
Процедура УдалитьКомандыИЭлементыФормы(Форма)
- ДобавленныеЭлементы = Форма.ДобавленныеЭлементыКонтактнойИнформации;
- ДобавленныеЭлементы.Сортировать("Приоритет");
+ ДобавленныеЭлементы = Форма.ПараметрыКонтактнойИнформации.ДобавленныеЭлементы;
+ ДобавленныеЭлементы.СортироватьПоПредставлению();
Для Каждого УдаляемыйЭлемент Из ДобавленныеЭлементы Цикл
- Если УдаляемыйЭлемент.ЭтоКоманда Тогда
- Форма.Команды.Удалить(Форма.Команды[УдаляемыйЭлемент.ИмяЭлемента]);
+ Если УдаляемыйЭлемент.Пометка Тогда
+ Форма.Команды.Удалить(Форма.Команды[УдаляемыйЭлемент.Значение]);
Иначе
- Форма.Элементы.Удалить(Форма.Элементы[УдаляемыйЭлемент.ИмяЭлемента]);
+ Форма.Элементы.Удалить(Форма.Элементы[УдаляемыйЭлемент.Значение]);
КонецЕсли;
КонецЦикла;
@@ -2447,9 +2732,14 @@
Если НЕ УправлениеКонтактнойИнформациейСлужебный.ЭтоРоссийскийАдрес(Источник) Тогда
Возврат 0;
КонецЕсли;
-
- Адрес = Источник.Состав;
ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.ПространствоИмен();
+
+ Если Источник <> Неопределено И Источник.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда
+ Адрес = Источник;
+ Иначе
+ Адрес = Источник.Состав;
+ КонецЕсли;
+
Если Адрес <> Неопределено И Адрес.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда
СписокОшибок = УправлениеКонтактнойИнформациейСлужебный.ОшибкиЗаполненияАдресаXDTO(Адрес, ВидИнформации);
Для Каждого Элемент Из СписокОшибок Цикл
@@ -2556,4 +2846,4 @@
Возврат ПроверкаРеквизита.Наименование = Неопределено;
КонецФункции
-#КонецОбласти
+#КонецОбласти
\ No newline at end of file
diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl
index 213aa3649..6cb2f0830 100644
--- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl
+++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl
@@ -107,7 +107,7 @@
Оповещение.ДополнительныеПараметры.Вставить("Результат", Результат);
Оповещение.ДополнительныеПараметры.Вставить("Форма", Форма);
- ОткрытьФормуКонтактнойИнформации(ПараметрыОткрытия,,,, Оповещение);
+ ОткрытьФормуКонтактнойИнформации(ПараметрыОткрытия,, Оповещение);
Возврат Неопределено;
КонецФункции
@@ -153,7 +153,7 @@
Оповещение = Новый ОписаниеОповещения("КонтактнаяИнформацияДобавитьПолеВводаЗавершение", ЭтотОбъект, Новый Структура);
Оповещение.ДополнительныеПараметры.Вставить("Форма", Форма);
- Форма.ПоказатьВыборИзМеню(Оповещение, Форма.СписокДобавляемыхЭлементовКонтактнойИнформации, Форма.Элементы.КонтактнаяИнформацияДобавитьПолеВвода);
+ Форма.ПоказатьВыборИзМеню(Оповещение, Форма.ПараметрыКонтактнойИнформации.СписокДобавляемыхЭлементов, Форма.Элементы.КонтактнаяИнформацияДобавитьПолеВвода);
Возврат Неопределено;
ИначеЕсли Лев(ИмяКоманды, 7) = "Команда" Тогда
@@ -283,8 +283,7 @@
//
// Возвращаемое значение: необходимая форма.
//
-Функция ОткрытьФормуКонтактнойИнформации(Параметры, Владелец = Неопределено, Уникальность = Неопределено, Окно = Неопределено,
- Оповещение = Неопределено) Экспорт
+Функция ОткрытьФормуКонтактнойИнформации(Параметры, Владелец = Неопределено, Оповещение = Неопределено) Экспорт
ВидИнформации = Параметры.ВидКонтактнойИнформации;
@@ -446,7 +445,10 @@
Иначе
Если Не ПустаяСтрока(ДанныеСтроки.Комментарий) Тогда
- Форма.Элементы["Комментарий" + Элемент.Имя].Заголовок = РезультатЗакрытия.Комментарий;
+ ЭлементКомментария = Форма.Элементы.Найти("Комментарий" + Элемент.Имя);
+ Если ЭлементКомментария <> Неопределено Тогда
+ ЭлементКомментария.Заголовок = РезультатЗакрытия.Комментарий;
+ КонецЕсли;
КонецЕсли;
КонецЕсли;
@@ -573,7 +575,8 @@
// Завершение модального диалога создания письма.
Процедура СоздатьПисьмоПоКонтактнойИнформацииЗавершение(Действие, АдресПочты) Экспорт
- ЗапуститьПриложение("mailto:" + АдресПочты);
+ ОписаниеОповещения = Новый ОписаниеОповещения("СоздатьПисьмоПоКонтактнойИнформацииПослеЗапускаПриложения", ЭтотОбъект);
+ НачатьЗапускПриложения(ОписаниеОповещения, "mailto:" + АдресПочты);
КонецПроцедуры
@@ -709,6 +712,8 @@
АдресаДляЗаполнения = УправлениеКонтактнойИнформациейСлужебныйВызовСервера.ДоступныеДляКопированияАдреса(ЗначенияПолейДляАнализа, НайденнаяСтрока.Вид);
Если АдресаДляЗаполнения.Количество() = 0 Тогда
+ ПоказатьПредупреждение(, НСтр("ru = 'Для того чтобы не вводить один и тот же адрес несколько раз, можно скопировать в это поле значение, ранее введенное в соседнем поле.'")
+ ,, НСтр("ru = 'Копирование адреса'"));
Возврат;
КонецЕсли;
@@ -823,4 +828,8 @@
КонецПроцедуры
+Процедура СоздатьПисьмоПоКонтактнойИнформацииПослеЗапускаПриложения(КодВозврата, ДополнительныеПараметры) Экспорт
+ // Действие не требуется
+КонецПроцедуры
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСерверПовтИсп/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСерверПовтИсп/Module.bsl
index 8bc4cad89..e7ba29d17 100644
--- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСерверПовтИсп/Module.bsl
+++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСерверПовтИсп/Module.bsl
@@ -62,9 +62,9 @@
Если Уровень = 90 Тогда
Если ВРег(ТипаАдресногоЭлемента) = "ГСК" Тогда
- Возврат "10300000";
- ИначеЕсли ВРег(ТипаАдресногоЭлемента) = "СНТ" Тогда
Возврат "10600000";
+ ИначеЕсли ВРег(ТипаАдресногоЭлемента) = "СНТ" Тогда
+ Возврат "10300000";
ИначеЕсли ВРег(ТипаАдресногоЭлемента) = "ТЕР" Тогда
Возврат "10700000";
Иначе
diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl
index 8e35991e5..4f31c08cc 100644
--- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl
@@ -57,6 +57,36 @@
КонецПроцедуры
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность редактирования реквизитов
+// с помощью экспортной функции ПолучитьБлокируемыеРеквизитыОбъекта.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Запрет редактирования реквизитов объектов".
+// В качестве значения - пустую строку.
+//
+Процедура ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты) Экспорт
+
+ Объекты.Вставить(Метаданные.Справочники.ВидыКонтактнойИнформации.ПолноеИмя(), "");
+
+КонецПроцедуры
+
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.Справочники.ВидыКонтактнойИнформации.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@@ -136,7 +166,7 @@
КонецПроцедуры
-// Разделенный обработчик для копирования стран мира из нулевой области.
+// Разделенный обработчик для копирования стран мира из нулевой области.
// Используется эталон, подготовленный на предыдущем шаге.
//
Процедура ОбновлениеПоЭталонуРазделенныхСтранМира() Экспорт
@@ -156,7 +186,6 @@
|ГДЕ
| Эталон.ОбластьДанных = 0
|");
-
Результат = Запрос.Выполнить().Выбрать();
Если НЕ Результат.Следующий() Тогда
Возврат;
@@ -277,7 +306,8 @@
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор");
- Возврат МодульАдресныйКлассификатор.КодРегионаПоНаименованию(ПолноеНаименование);
+ Код = МодульАдресныйКлассификатор.КодРегионаПоНаименованию(ПолноеНаименование);
+ Возврат Формат(Код, "ЧЦ=2; ЧН=; ЧВН=");
КонецЕсли;
Возврат Неопределено;
@@ -654,8 +684,12 @@
ПараметрыПроверки.ЗапрещатьВводНекорректного = Истина;
КонецЕсли;
+ Если ВРег(ФорматАдреса) = "ФИАС" Тогда
+ ПараметрыПроверки.Вставить("ПроверятьПоФИАС", Истина);
+ КонецЕсли;
+
ПараметрыПроверки.Вставить("ФорматАдреса", ФорматАдреса);
- ПараметрыПроверки.Вставить("АдресТолькоРоссийский ", АдресТолькоРоссийский );
+ ПараметрыПроверки.Вставить("АдресТолькоРоссийский ", АдресТолькоРоссийский);
Адрес = Источник.Состав;
@@ -1124,7 +1158,9 @@
Результат = СтрЗаменить(Запись.Закрыть(), Символы.ПС, "
");
Результат = СтрЗаменить(Результат, "<ВнутригРайон/>", "");// Совместимость с КЛАДР
+
Возврат Результат;
+
КонецФункции
// Преобразует XML в объект XDTO контактной информации.
@@ -1634,7 +1670,6 @@
Функция СловаТекстаТаблицей(Знач Текст, Знач Разделители = Неопределено)
// Удаление из текста спец. символов "точек, "номеров".
- Текст = СтрЗаменить(Текст, ".", "");
Текст = СтрЗаменить(Текст, "№", "");
НачалоСлова = 0;
@@ -1758,7 +1793,7 @@
// Возвращаемое значение:
// Строка - сформированное представление.
//
-Функция ПредставлениеКонтактнойИнформации(Знач XMLСтрока, Знач ВидКонтактнойИнформации) Экспорт
+Функция ПредставлениеКонтактнойИнформации(Знач XMLСтрока, Знач ФорматКонтактнойИнформации) Экспорт
ЭтоСтрока = ТипЗнч(XMLСтрока) = Тип("Строка");
Если ЭтоСтрока И Не УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВXML(XMLСтрока) Тогда
@@ -1767,10 +1802,10 @@
КонецЕсли;
Вид = Новый Структура("Тип,ВключатьСтрануВПредставление,ФорматАдреса", "", Ложь, "КЛАДР");
- Если ВидКонтактнойИнформации = Неопределено Тогда
+ Если ФорматКонтактнойИнформации = Неопределено Тогда
Вид.Тип = ТипКонтактнойИнформации(?(ЭтоСтрока, XMLСтрока, КонтактнаяИнформацияИзXML(XMLСтрока)));
Иначе
- ЗаполнитьЗначенияСвойств(Вид, ВидКонтактнойИнформации);
+ ЗаполнитьЗначенияСвойств(Вид, ФорматКонтактнойИнформации);
КонецЕсли;
ОбъектXDTO = ?(ЭтоСтрока, КонтактнаяИнформацияИзXML(XMLСтрока), XMLСтрока);
@@ -2010,12 +2045,12 @@
ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(90, "СНТ"));
Если ДополнительныйЭлементАдреса = Неопределено Тогда
ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(90, "ГСК"));
- КонецЕсли;
- Если ДополнительныйЭлементАдреса = Неопределено Тогда
- ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(90, "ТЕР"));
- КонецЕсли;
- Если ДополнительныйЭлементАдреса = Неопределено Тогда
- ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(90));
+ Если ДополнительныйЭлементАдреса = Неопределено Тогда
+ ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(90, "ТЕР"));
+ Если ДополнительныйЭлементАдреса = Неопределено Тогда
+ ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(90));
+ КонецЕсли;
+ КонецЕсли;
КонецЕсли;
Возврат ДополнительныйЭлементАдреса;
@@ -2061,7 +2096,7 @@
// Строка - почтовый индекс.
// Неопределено - индекс не найден или адрес иностранный.
//
-Функция ОпределитьПочтовыйИндексАдреса(XDTOАдрес) Экспорт
+Функция ОпределитьПочтовыйИндексАдреса(XDTOАдрес, Идентификатор = Неопределено) Экспорт
ПространствоИмен = УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.ПространствоИмен();
@@ -2079,7 +2114,7 @@
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда
// Вызов анализа и возврат индекса варианта.
МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный");
- Индекс = МодульАдресныйКлассификаторСлужебный.ИндексАдресаПоЧастямАдреса(XDTOАдресРФ);
+ Индекс = МодульАдресныйКлассификаторСлужебный.ИндексАдресаПоЧастямАдреса(XDTOАдресРФ, Идентификатор);
КонецЕсли;
Возврат Индекс;
@@ -2259,14 +2294,14 @@
ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(90, "СНТ"));
Если ДополнительныйЭлементАдреса = Неопределено Тогда
ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(90, "ГСК"));
+ Если ДополнительныйЭлементАдреса = Неопределено Тогда
+ ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(90, "ТЕР"));
+ Если ДополнительныйЭлементАдреса = Неопределено Тогда
+ ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(90));
+ КонецЕсли;
+ КонецЕсли;
КонецЕсли;
- Если ДополнительныйЭлементАдреса = Неопределено Тогда
- ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(90, "ТЕР"));
- КонецЕсли;
- Если ДополнительныйЭлементАдреса = Неопределено Тогда
- ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(90));
- КонецЕсли;
-
+
Адрес.Добавить(ДополнительныйЭлементАдреса);
Адрес.Добавить(ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(91)));
@@ -2286,9 +2321,8 @@
Страна = СокрЛП(XDTOАдрес.Страна);
Если ЭтоРоссийскийАдрес(АдресРФ) Тогда
- // Это российский адрес, смотрим на настройки.
- Если Не ВидИнформации.ВключатьСтрануВПредставление Тогда
- Страна = "";
+ Если ЗначениеЗаполнено(АдресРФ.Адрес_по_документу) Тогда
+ Возврат АдресРФ.Адрес_по_документу;
КонецЕсли;
// Значимые части
@@ -2309,12 +2343,12 @@
ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(90, "СНТ"));
Если ДополнительныйЭлементАдреса = Неопределено Тогда
ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(90, "ГСК"));
- КонецЕсли;
- Если ДополнительныйЭлементАдреса = Неопределено Тогда
- ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(90, "ТЕР"));
- КонецЕсли;
- Если ДополнительныйЭлементАдреса = Неопределено Тогда
- ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(90));
+ Если ДополнительныйЭлементАдреса = Неопределено Тогда
+ ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(90, "ТЕР"));
+ Если ДополнительныйЭлементАдреса = Неопределено Тогда
+ ДополнительныйЭлементАдреса = ДополнительныйЭлементАдреса(АдресРФ, УправлениеКонтактнойИнформациейКлиентСерверПовтИсп.XPathДополнительногоОбъектаАдресации(90));
+ КонецЕсли;
+ КонецЕсли;
КонецЕсли;
Адрес.Добавить(ДополнительныйЭлементАдреса);
@@ -2349,10 +2383,13 @@
Представление = СокрЛП(АдресРФ);
КонецЕсли;
- ДобавлениеСтраны = Новый Массив;
- ДобавлениеСтраны.Добавить(Страна);
- ДобавлениеСтраны.Добавить(Представление);
- Возврат УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПолноеНаименование(ДобавлениеСтраны);
+ Если ВидИнформации.ВключатьСтрануВПредставление Тогда
+ ДобавлениеСтраны = Новый Массив;
+ ДобавлениеСтраны.Добавить(Страна);
+ ДобавлениеСтраны.Добавить(Представление);
+ Представление = УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПолноеНаименование(ДобавлениеСтраны);
+ КонецЕсли;
+ Возврат Представление;
КонецФункции
// Возвращает перечень ошибок для адреса.
diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйПовтИсп/Module.bsl
index e5808eb38..9d15711c1 100644
--- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйПовтИсп/Module.bsl
+++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйПовтИсп/Module.bsl
@@ -12,7 +12,7 @@
ЕстьКлассификатор = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор");
Если ЕстьКлассификатор И НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный");
- МодульАдресныйКлассификаторСлужебный.ПроверитьНачальноеЗаполнение(); // Заполнение для АРМ.
+ МодульАдресныйКлассификаторСлужебный.ПроверитьНачальноеЗаполнение();
КонецЕсли;
Возврат ЕстьКлассификатор;
diff --git a/SSL/src/CommonModules/УправлениеПечатью/Module.bsl b/SSL/src/CommonModules/УправлениеПечатью/Module.bsl
index b8140eef2..f2a8a4f1f 100644
--- a/SSL/src/CommonModules/УправлениеПечатью/Module.bsl
+++ b/SSL/src/CommonModules/УправлениеПечатью/Module.bsl
@@ -118,7 +118,18 @@
// объединенное подменю Печать.
Процедура ПриСозданииНаСервере(Форма, МестоРазмещенияКомандПоУмолчанию = Неопределено, ОбъектыПечати = Неопределено) Экспорт
- КомандыПечати = КомандыПечатиФормы(Форма, ОбъектыПечати);
+ Если ТипЗнч(Форма) = Тип("УправляемаяФорма") Тогда
+ ИмяФормы = Форма.ИмяФормы;
+ Иначе
+ ИмяФормы = Форма;
+ КонецЕсли;
+
+ Если ОбъектыПечати = Неопределено Тогда
+ КомандыПечати = УправлениеПечатьюПовтИсп.КомандыПечатиФормы(ИмяФормы, ОбъектыПечати).Скопировать();
+ Иначе
+ КомандыПечати = КомандыПечатиФормы(ИмяФормы, ОбъектыПечати).Скопировать();
+ КонецЕсли;
+
Если МестоРазмещенияКомандПоУмолчанию <> Неопределено Тогда
Для Каждого КомандаПечати Из КомандыПечати Цикл
Если ПустаяСтрока(КомандаПечати.МестоРазмещения) Тогда
@@ -1428,13 +1439,19 @@
КонецЕсли;
ОднаКомандаПечати = КомандыПечати.Количество() = 1;
- Если Не ОднаКомандаПечати Тогда
- ПодменюПечать = Форма.Элементы.Добавить(МестоРазмещенияКоманд.Имя + "ПодменюПечать", Тип("ГруппаФормы"), МестоРазмещенияКоманд);
- ПодменюПечать.Вид = ВидГруппыФормы.Подменю;
- ПодменюПечать.Заголовок = НСтр("ru = 'Печать'");
- ПодменюПечать.Картинка = БиблиотекаКартинок.Печать;
-
- МестоРазмещенияКоманд = ПодменюПечать;
+ Если МестоРазмещенияКоманд.Вид = ВидГруппыФормы.Подменю Тогда
+ Если ОднаКомандаПечати Тогда
+ МестоРазмещенияКоманд.Вид = ВидГруппыФормы.ГруппаКнопок;
+ КонецЕсли;
+ Иначе
+ Если Не ОднаКомандаПечати Тогда
+ ПодменюПечать = Форма.Элементы.Добавить(МестоРазмещенияКоманд.Имя + "ПодменюПечать", Тип("ГруппаФормы"), МестоРазмещенияКоманд);
+ ПодменюПечать.Вид = ВидГруппыФормы.Подменю;
+ ПодменюПечать.Заголовок = НСтр("ru = 'Печать'");
+ ПодменюПечать.Картинка = БиблиотекаКартинок.Печать;
+
+ МестоРазмещенияКоманд = ПодменюПечать;
+ КонецЕсли;
КонецЕсли;
Для Каждого ОписаниеКомандыПечати Из КомандыПечати Цикл
@@ -1739,6 +1756,10 @@
ПакетОтображаемыхДокументов = Новый ПакетОтображаемыхДокументов;
КоллекцияПечатныхФорм = ТабличныеДокументы.ВыгрузитьЗначения();
+ Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
+ ПечататьКомплектами = ПечататьКомплектами Или ПечатнаяФорма.ДвусторонняяПечать <> ТипДвустороннейПечати.Нет;
+ КонецЦикла;
+
Если ПечататьКомплектами И ОбъектыПечати.Количество() > 0 Тогда
Для Каждого ОбъектПечати Из ОбъектыПечати Цикл
ИмяОбласти = ОбъектПечати.Представление;
@@ -1808,7 +1829,8 @@
Продолжить; // Не предусмотрены команды печати в основной форме списка объекта.
КонецЕсли;
ИмяФормыСписка = ОбъектМетаданных.ОсновнаяФормаСписка.ПолноеИмя();
- Для Каждого ДобавляемаяКомандаПечати Из КомандыПечатиФормы(ИмяФормыСписка) Цикл
+ КомандыПечатиФормы =УправлениеПечатьюПовтИсп.КомандыПечатиФормы(ИмяФормыСписка).Скопировать();
+ Для Каждого ДобавляемаяКомандаПечати Из КомандыПечатиФормы Цикл
// Поиск аналогичной ранее добавленной команды печати.
СтруктураОтбора = "Идентификатор,Обработчик,СразуНаПринтер,ФорматСохранения";
Если ПустаяСтрока(ДобавляемаяКомандаПечати.Обработчик) Тогда
diff --git a/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl
index dd8afdfa9..7082d4acd 100644
--- a/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl
+++ b/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl
@@ -259,6 +259,9 @@
// Создает соединение с выходной печатной формой.
// Необходимо вызвать перед любыми действиями над формой.
+// Функция не работает в любых других браузерах кроме IE.
+// Перед выполнением функции в веб-клиенте необходимо подключить расширение работы с файлами.
+//
// Параметры:
// ТипДокумента - Строка - тип печатной формы "DOC" или "ODT";
// НастройкиСтраницыМакета - Соответствие - параметры из структуры, возвращаемой функцией ИнициализироватьМакет;
@@ -271,10 +274,6 @@
//
Функция ИнициализироватьПечатнуюФорму(Знач ТипДокумента, Знач НастройкиСтраницыМакета = Неопределено, Макет = Неопределено) Экспорт
- Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
- Возврат Неопределено;
- КонецЕсли;
-
Если ВРег(ТипДокумента) = "DOC" Тогда
Параметр = ?(Макет = Неопределено, НастройкиСтраницыМакета, Макет); // для обратной совместимости
ПечатнаяФорма = УправлениеПечатьюMSWordКлиент.ИнициализироватьПечатнуюФормуMSWord(Параметр);
@@ -292,6 +291,8 @@
// Создает COM-соединение с макетом. В дальнейшем это соединение используется при получении из него областей (тегов и
// таблиц).
+// Функция не работает в любых других браузерах кроме IE.
+// Перед выполнением функции в веб-клиенте необходимо подключить расширение работы с файлами.
//
// Параметры:
// ДвоичныеДанныеМакета - ДвоичныеДанные - двоичные данные макета;
@@ -302,11 +303,6 @@
//
Функция ИнициализироватьМакетОфисногоДокумента(Знач ДвоичныеДанныеМакета, Знач ТипМакета, Знач ИмяМакета = "") Экспорт
- Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
- ПоказатьПредупреждение(, НСтр("ru = 'Расширение для работы с файлами не подключено. Печать невозможна.'"));
- Возврат Неопределено;
- КонецЕсли;
-
Макет = Неопределено;
ИмяВременногоФайла = "";
diff --git a/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl
index 0a005ebb0..1c8c5dcdf 100644
--- a/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl
+++ b/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl
@@ -8,7 +8,7 @@
// Переопределяет таблицу возможных форматов для сохранения табличного документа.
// Вызывается из ОбщегоНазначения.НастройкиФорматовСохраненияТабличногоДокумента()
//
-// Параметры
+// Параметры:
// ТаблицаФорматов - ТаблицаЗначений:
// * ТипФайлаТабличногоДокумента - ТипФайлаТабличногоДокумента - значение в
// платформе,
diff --git a/SSL/src/CommonModules/УправлениеПечатьюПовтИсп/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюПовтИсп/Module.bsl
new file mode 100644
index 000000000..9dac2b9e0
--- /dev/null
+++ b/SSL/src/CommonModules/УправлениеПечатьюПовтИсп/Module.bsl
@@ -0,0 +1,14 @@
+////////////////////////////////////////////////////////////////////////////////
+// Подсистема "Печать".
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция КомандыПечатиФормы(ИмяФормы, СписокОбъектов = Неопределено) Экспорт
+ Возврат УправлениеПечатью.КомандыПечатиФормы(ИмяФормы, СписокОбъектов);
+КонецФункции
+
+#КонецОбласти
+
+
diff --git a/SSL/src/CommonModules/УправлениеПечатьюПовтИсп/УправлениеПечатьюПовтИсп.mdo b/SSL/src/CommonModules/УправлениеПечатьюПовтИсп/УправлениеПечатьюПовтИсп.mdo
new file mode 100644
index 000000000..89c4e55e0
--- /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 81c40b230..1d0a9fc5c 100644
--- a/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl
+++ b/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl
@@ -13,14 +13,42 @@
// Вызывается из обработчика ПриСозданииНаСервере формы объекта со свойствами.
//
// Параметры:
-// Форма - УправляемаяФорма - в которой будут отображаться дополнительные реквизиты.
+// Форма - УправляемаяФорма - в которой будут отображаться дополнительные реквизиты.
//
-// Объект - Неопределено - взять объект из реквизита формы Объект.
-// - ДанныеФормыСтруктура - по типу объекта.
+// ДополнительныеПараметры - Неопределено - все дополнительные параметры имеют значения по умолчанию.
+// Ранее реквизит называлася "Объект" и имел смысл,
+// как одноименное свойство структуры, указанной ниже.
+// - Структура - с необязательными свойствами:
//
-// ИмяЭлементаДляРазмещения - Строка - имя группы формы, в которой будут размещены свойства.
+// * Объект - ДанныеФормыСтруктура - по типу объекта, если свойство не указано или Неопределено,
+// взять объект из реквизита формы "Объект".
//
-// ПроизвольныйОбъект - Булево - если Истина, тогда в форме создается таблица описания дополнительных реквизитов
+// * ИмяЭлементаДляРазмещения - Строка - имя группы формы, в которой будут размещены свойства.
+//
+// * ПроизвольныйОбъект - Булево - если Истина, тогда в форме создается таблица описания дополнительных
+// реквизитов параметр Объект игнорируется, дополнительные реквизиты не создаются и не заполняются.
+//
+// Это востребовано при последовательном использовании одной формы для просмотра или редактирования
+// дополнительных реквизитов разных объектов (в том числе разных типов).
+//
+// После выполнения ПриСозданииНаСервере следует вызывать ЗаполнитьДополнительныеРеквизитыВФорме()
+// для добавления и заполнения дополнительных реквизитов.
+// Чтобы сохранить изменения следует вызвать ПеренестиЗначенияИзРеквизитовФормыВОбъект(),
+// а для обновления состава реквизитов вызвать ОбновитьЭлементыДополнительныхРеквизитов().
+//
+// * ИмяЭлементаКоманднойПанели - Строка - имя группы формы, в которую будет добавлена кнопка.
+// РедактироватьСоставДополнительныхРеквизитов. Если имя элемента не указано,
+// используется стандартная группа "Форма.КоманднаяПанель".
+//
+// * СкрытьУдаленные - Булево - установить/отключить режим скрытия удаленных.
+// Если параметр не указан, а параметр объект указан и свойство Ссылка не заполнено,
+// тогда начальное значение устанавливается Истина, иначе Ложь.
+// При вызове процедуры ПередЗаписьюНаСервере в режиме скрытия удаленных, удаленные значения
+// очищаются (не переносятся обратно в объект), а режим СкрытьУдаленные устанавливается Ложь.
+//
+// Устарел3 - Строка - имя группы формы, в которой будут размещены свойства.
+//
+// Устарел4 - Булево - если Истина, тогда в форме создается таблица описания дополнительных реквизитов
// параметр Объект игнорируется, дополнительные реквизиты не создаются и не заполняются.
//
// Это востребовано при последовательном использовании одной формы для просмотра или редактирования
@@ -31,29 +59,48 @@
// Чтобы сохранить изменения следует вызвать ПеренестиЗначенияИзРеквизитовФормыВОбъект(),
// а для обновления состава реквизитов вызвать ОбновитьЭлементыДополнительныхРеквизитов().
//
-// ИмяЭлементаКоманднойПанели - Строка - имя группы формы, в которую будет добавлена кнопка.
+// Устарел5 - Строка - имя группы формы, в которую будет добавлена кнопка.
// РедактироватьСоставДополнительныхРеквизитов. Если имя элемента не указано,
// используется стандартная группа "Форма.КоманднаяПанель".
//
-Процедура ПриСозданииНаСервере(Форма, Объект = Неопределено, ИмяЭлементаДляРазмещения = "",
- ПроизвольныйОбъект = Ложь, ИмяЭлементаКоманднойПанели = "") Экспорт
+Процедура ПриСозданииНаСервере(Форма, ДополнительныеПараметры = Неопределено,
+ Устарел3 = "", Устарел4 = Ложь, Устарел5 = "") Экспорт
- Если ПроизвольныйОбъект Тогда
- СоздатьОписаниеДополнительныхРеквизитов = Истина;
+ Контекст = Новый Структура;
+ Контекст.Вставить("Объект", Неопределено);
+ Контекст.Вставить("ИмяЭлементаДляРазмещения", "");
+ Контекст.Вставить("ПроизвольныйОбъект", Ложь);
+ Контекст.Вставить("ИмяЭлементаКоманднойПанели", "");
+ Контекст.Вставить("СкрытьУдаленные", Неопределено);
+
+ Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") Тогда
+ ЗаполнитьЗначенияСвойств(Контекст, ДополнительныеПараметры);
Иначе
- Если Объект = Неопределено Тогда
- ОписаниеОбъекта = Форма.Объект;
- Иначе
- ОписаниеОбъекта = Объект;
- КонецЕсли;
- СоздатьОписаниеДополнительныхРеквизитов = ИспользоватьДопРеквизиты(ОписаниеОбъекта.Ссылка);
+ Контекст.Объект = ДополнительныеПараметры;
+ Контекст.ИмяЭлементаДляРазмещения = Устарел3;
+ Контекст.ПроизвольныйОбъект = Устарел4;
+ Контекст.ИмяЭлементаКоманднойПанели = Устарел5;
КонецЕсли;
- СоздатьОсновныеОбъектыФормы(Форма, ИмяЭлементаДляРазмещения,
- СоздатьОписаниеДополнительныхРеквизитов, ИмяЭлементаКоманднойПанели);
+ Если Контекст.ПроизвольныйОбъект Тогда
+ СоздатьОписаниеДополнительныхРеквизитов = Истина;
+ Иначе
+ Если Контекст.Объект = Неопределено Тогда
+ ОписаниеОбъекта = Форма.Объект;
+ Иначе
+ ОписаниеОбъекта = Контекст.Объект;
+ КонецЕсли;
+ СоздатьОписаниеДополнительныхРеквизитов = ИспользоватьДопРеквизиты(ОписаниеОбъекта.Ссылка);
+ Если Не ЗначениеЗаполнено(ОписаниеОбъекта.Ссылка) И Контекст.СкрытьУдаленные = Неопределено Тогда
+ Контекст.СкрытьУдаленные = Истина;
+ КонецЕсли;
+ КонецЕсли;
- Если НЕ ПроизвольныйОбъект Тогда
- ЗаполнитьДополнительныеРеквизитыВФорме(Форма, ОписаниеОбъекта);
+ СоздатьОсновныеОбъектыФормы(Форма, Контекст.ИмяЭлементаДляРазмещения,
+ СоздатьОписаниеДополнительныхРеквизитов, Контекст.ИмяЭлементаКоманднойПанели);
+
+ Если НЕ Контекст.ПроизвольныйОбъект Тогда
+ ЗаполнитьДополнительныеРеквизитыВФорме(Форма, ОписаниеОбъекта, , Контекст.СкрытьУдаленные);
КонецЕсли;
КонецПроцедуры
@@ -85,7 +132,7 @@
//
Процедура ПередЗаписьюНаСервере(Форма, ТекущийОбъект) Экспорт
- ПеренестиЗначенияИзРеквизитовФормыВОбъект(Форма, ТекущийОбъект);
+ УправлениеСвойствамиСлужебный.ПеренестиЗначенияИзРеквизитовФормыВОбъект(Форма, ТекущийОбъект, Истина);
КонецПроцедуры
@@ -172,20 +219,60 @@
ВидОбъекта[ИмяРеквизитаНабораСвойств] = НаборСвойствОбъект.Ссылка;
+ // Обновление наименований необщих дополнительных реквизитов и сведений.
+ Если Не ЗначениеЗаполнено(НаборСвойств) Тогда
+ Возврат;
+ КонецЕсли;
+
+ Запрос = Новый Запрос;
+ Запрос.УстановитьПараметр("НаборСвойств", НаборСвойств);
+ Запрос.Текст =
+ "ВЫБРАТЬ
+ | Свойства.Ссылка КАК Ссылка,
+ | Свойства.НаборСвойств.Наименование КАК НаименованиеНабора,
+ | Свойства.НаборСвойств.ПометкаУдаления КАК ПометкаУдаленияНабора
+ |ИЗ
+ | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Свойства
+ |ГДЕ
+ | Свойства.НаборСвойств = &НаборСвойств
+ | И ВЫБОР
+ | КОГДА Свойства.Наименование <> Свойства.Заголовок + "" ("" + Свойства.НаборСвойств.Наименование + "")""
+ | ТОГДА ИСТИНА
+ | КОГДА Свойства.ПометкаУдаления <> Свойства.НаборСвойств.ПометкаУдаления
+ | ТОГДА ИСТИНА
+ | ИНАЧЕ ЛОЖЬ
+ | КОНЕЦ";
+ Выборка = Запрос.Выполнить().Выбрать();
+
+ ВыборкаСвойств = Запрос.Выполнить().Выбрать();
+ Пока ВыборкаСвойств.Следующий() Цикл
+ ЗаблокироватьДанныеДляРедактирования(ВыборкаСвойств.Ссылка);
+ Объект = ВыборкаСвойств.Ссылка.ПолучитьОбъект();
+ Объект.Наименование = Объект.Заголовок + " (" + Строка(ВыборкаСвойств.НаименованиеНабора) + ")";
+ Объект.ПометкаУдаления = ВыборкаСвойств.ПометкаУдаленияНабора;
+ Объект.Записать();
+ КонецЦикла;
+
КонецПроцедуры
// Обновляет отображаемые данные на форме объекта со свойствами.
//
// Параметры:
-// Форма - УправляемаяФорма - уже настроена в процедуре ПриСозданииНаСервере.
-// Объект - Неопределено - взять объект из реквизита формы "Объект".
-// - Объект - СправочникОбъект, ДокументОбъект, ... , ДанныеФормыСтруктура (по типу объекта).
+// Форма - УправляемаяФорма - уже настроена в процедуре ПриСозданииНаСервере.
//
-Процедура ОбновитьЭлементыДополнительныхРеквизитов(Форма, Объект = Неопределено) Экспорт
+// Объект - Неопределено - взять объект из реквизита формы "Объект".
+// - Объект - СправочникОбъект, ДокументОбъект, ... , ДанныеФормыСтруктура (по типу объекта).
+//
+// СкрытьУдаленные - Неопределено - не менять текущий режим скрытия удаленных, установленный ранее.
+// - Булево - установить/отключить режим скрытия удаленных.
+// При вызове процедуры ПередЗаписьюНаСервере в режиме скрытия удаленных, удаленные значения
+// очищаются (не переносятся обратно в объект), а режим СкрытьУдаленные устанавливается Ложь.
+//
+Процедура ОбновитьЭлементыДополнительныхРеквизитов(Форма, Объект = Неопределено, СкрытьУдаленные = Неопределено) Экспорт
- ПеренестиЗначенияИзРеквизитовФормыВОбъект(Форма, Объект);
+ УправлениеСвойствамиСлужебный.ПеренестиЗначенияИзРеквизитовФормыВОбъект(Форма, Объект);
- ЗаполнитьДополнительныеРеквизитыВФорме(Форма, Объект);
+ ЗаполнитьДополнительныеРеквизитыВФорме(Форма, Объект, , СкрытьУдаленные);
КонецПроцедуры
@@ -195,18 +282,29 @@
// Создает/пересоздает дополнительные реквизиты и элементы в форме владельца свойств.
//
// Параметры:
-// Форма - УправляемаяФорма - уже настроена в процедуре ПриСозданииНаСервере.
-// Объект - Неопределено - взять объект из реквизита формы "Объект".
-// - Объект - СправочникОбъект, ДокументОбъект, ..., ДанныеФормыСтруктура (по типу объекта).
-// ПоляНадписей - Булево - если указать Истина, то вместо полей ввода на форме будут созданы поля надписей.
+// Форма - УправляемаяФорма - уже настроена в процедуре ПриСозданииНаСервере.
//
-Процедура ЗаполнитьДополнительныеРеквизитыВФорме(Форма, Объект = Неопределено, ПоляНадписей = Ложь) Экспорт
+// Объект - Неопределено - взять объект из реквизита формы "Объект".
+// - Объект - СправочникОбъект, ДокументОбъект, ..., ДанныеФормыСтруктура (по типу объекта).
+//
+// ПоляНадписей - Булево - если указать Истина, то вместо полей ввода на форме будут созданы поля надписей.
+//
+// СкрытьУдаленные - Неопределено - не менять текущий режим скрытия удаленных, установленный ранее.
+// - Булево - установить/отключить режим скрытия удаленных.
+// При вызове процедуры ПередЗаписьюНаСервере в режиме скрытия удаленных, удаленные значения
+// очищаются (не переносятся обратно в объект), а режим СкрытьУдаленные устанавливается Ложь.
+//
+Процедура ЗаполнитьДополнительныеРеквизитыВФорме(Форма, Объект = Неопределено, ПоляНадписей = Ложь, СкрытьУдаленные = Неопределено) Экспорт
Если НЕ Форма.Свойства_ИспользоватьСвойства
ИЛИ НЕ Форма.Свойства_ИспользоватьДопРеквизиты Тогда
Возврат;
КонецЕсли;
+ Если ТипЗнч(СкрытьУдаленные) = Тип("Булево") Тогда
+ Форма.Свойства_СкрытьУдаленные = СкрытьУдаленные;
+ КонецЕсли;
+
Если Объект = Неопределено Тогда
ОписаниеОбъекта = Форма.Объект;
Иначе
@@ -284,11 +382,15 @@
Для Каждого ОписаниеСвойства Из ОписаниеСвойств Цикл
- ЗаполнитьЗначенияСвойств(
- Форма.Свойства_ОписаниеДополнительныхРеквизитов.Добавить(), ОписаниеСвойства);
+ ФормаОписаниеСвойства = Форма.Свойства_ОписаниеДополнительныхРеквизитов.Добавить();
+ ЗаполнитьЗначенияСвойств(ФормаОписаниеСвойства, ОписаниеСвойства);
Форма[ОписаниеСвойства.ИмяРеквизитаЗначение] = ОписаниеСвойства.Значение;
+ Если ОписаниеСвойства.Удалено И Форма.Свойства_СкрытьУдаленные Тогда
+ Продолжить;
+ КонецЕсли;
+
Если НаборыСвойствОбъекта.Количество() > 1 Тогда
ЭлементСписка = Форма.Свойства_ЭлементыГруппДополнительныхРеквизитов.НайтиПоЗначению(
@@ -339,6 +441,7 @@
КонецЕсли;
Элемент = Форма.Элементы.Добавить(ОписаниеСвойства.ИмяРеквизитаЗначение, Тип("ПолеФормы"), Родитель);
+ ФормаОписаниеСвойства.ЭлементФормыДобавлен = Истина;
Если ОписаниеСвойства.Булево И ПустаяСтрока(ОписаниеСвойства.ФорматСвойства) Тогда
Элемент.Вид = ВидПоляФормы.ПолеФлажка
@@ -355,6 +458,14 @@
Элемент.ПутьКДанным = ОписаниеСвойства.ИмяРеквизитаЗначение;
Элемент.Подсказка = ОписаниеСвойства.Свойство.Подсказка;
+ Если Элемент.Вид = ВидПоляФормы.ПолеВвода
+ И Не ИспользоватьНеограниченнуюСтроку
+ И ОписаниеСвойства.ТипЗначения.Типы().Найти(Тип("Строка")) <> Неопределено Тогда
+
+ Элемент.СвязьПоТипу = Новый СвязьПоТипу("Свойства_ОписаниеДополнительныхРеквизитов.Свойство",
+ ОписаниеСвойств.Индекс(ОписаниеСвойства));
+ КонецЕсли;
+
Если ОписаниеСвойства.Свойство.МногострочноеПолеВвода > 0 Тогда
Если НЕ ПоляНадписей Тогда
Элемент.МногострочныйРежим = Истина;
@@ -459,56 +570,7 @@
//
Процедура ПеренестиЗначенияИзРеквизитовФормыВОбъект(Форма, Объект = Неопределено) Экспорт
- Если НЕ Форма.Свойства_ИспользоватьСвойства
- ИЛИ НЕ Форма.Свойства_ИспользоватьДопРеквизиты Тогда
-
- Возврат;
- КонецЕсли;
-
- Если Объект = Неопределено Тогда
- ОписаниеОбъекта = Форма.Объект;
- Иначе
- ОписаниеОбъекта = Объект;
- КонецЕсли;
-
- СтарыеЗначения = ОписаниеОбъекта.ДополнительныеРеквизиты.Выгрузить();
- ОписаниеОбъекта.ДополнительныеРеквизиты.Очистить();
-
- Для каждого Строка Из Форма.Свойства_ОписаниеДополнительныхРеквизитов Цикл
-
- Значение = Форма[Строка.ИмяРеквизитаЗначение];
-
- Если Значение = Неопределено Тогда
- Продолжить;
- КонецЕсли;
-
- Если Строка.ТипЗначения.Типы().Количество() = 1
- И (НЕ ЗначениеЗаполнено(Значение) Или Значение = Ложь) Тогда
-
- Продолжить;
- КонецЕсли;
-
- Если Строка.Удалено Тогда
- Если ЗначениеЗаполнено(Значение) Тогда
- ЗаполнитьЗначенияСвойств(
- ОписаниеОбъекта.ДополнительныеРеквизиты.Добавить(),
- СтарыеЗначения.Найти(Строка.Свойство, "Свойство"));
- КонецЕсли;
- Продолжить;
- КонецЕсли;
-
- НоваяСтрока = ОписаниеОбъекта.ДополнительныеРеквизиты.Добавить();
- НоваяСтрока.Свойство = Строка.Свойство;
- НоваяСтрока.Значение = Значение;
-
- // Поддержка строк неограниченной длины.
- ИспользоватьНеограниченнуюСтроку = УправлениеСвойствамиСлужебный.ИспользоватьНеограниченнуюСтроку(
- Строка.ТипЗначения, Строка.МногострочноеПолеВвода);
-
- Если ИспользоватьНеограниченнуюСтроку Тогда
- НоваяСтрока.ТекстоваяСтрока = Значение;
- КонецЕсли;
- КонецЦикла;
+ УправлениеСвойствамиСлужебный.ПеренестиЗначенияИзРеквизитовФормыВОбъект(Форма, Объект);
КонецПроцедуры
@@ -522,7 +584,9 @@
УдаляемыеРеквизиты = Новый Массив;
Для каждого ОписаниеСвойства Из Форма.Свойства_ОписаниеДополнительныхРеквизитов Цикл
УдаляемыеРеквизиты.Добавить(ОписаниеСвойства.ИмяРеквизитаЗначение);
- Форма.Элементы.Удалить(Форма.Элементы[ОписаниеСвойства.ИмяРеквизитаЗначение]);
+ Если ОписаниеСвойства.ЭлементФормыДобавлен Тогда
+ Форма.Элементы.Удалить(Форма.Элементы[ОписаниеСвойства.ИмяРеквизитаЗначение]);
+ КонецЕсли;
КонецЦикла;
Если УдаляемыеРеквизиты.Количество() > 0 Тогда
@@ -960,6 +1024,8 @@
ОпцияИспользоватьСвойства = Форма.ПолучитьФункциональнуюОпциюФормы("ИспользоватьДополнительныеРеквизитыИСведения");
РеквизитИспользоватьСвойства = Новый РеквизитФормы("Свойства_ИспользоватьСвойства", Новый ОписаниеТипов("Булево"));
Реквизиты.Добавить(РеквизитИспользоватьСвойства);
+ РеквизитСкрытьУдаленные = Новый РеквизитФормы("Свойства_СкрытьУдаленные", Новый ОписаниеТипов("Булево"));
+ Реквизиты.Добавить(РеквизитСкрытьУдаленные);
Если ОпцияИспользоватьСвойства Тогда
@@ -1000,6 +1066,9 @@
Реквизиты.Добавить(Новый РеквизитФормы(
"Наименование", Новый ОписаниеТипов("Строка"), ИмяОписания));
+ Реквизиты.Добавить(Новый РеквизитФормы(
+ "ЭлементФормыДобавлен", Новый ОписаниеТипов("Булево"), ИмяОписания));
+
// Добавление реквизита содержащего элементы создаваемых групп дополнительных реквизитов.
Реквизиты.Добавить(Новый РеквизитФормы(
"Свойства_ЭлементыГруппДополнительныхРеквизитов", Новый ОписаниеТипов("СписокЗначений")));
diff --git a/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl
index 97683b090..8bd8a2931 100644
--- a/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl
@@ -131,10 +131,102 @@
КонецФункции
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность редактирования реквизитов
+// с помощью экспортной функции ПолучитьБлокируемыеРеквизитыОбъекта.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Запрет редактирования реквизитов объектов".
+// В качестве значения - пустую строку.
+//
+Процедура ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПолноеИмя(), "");
+КонецПроцедуры
+
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ЗначенияСвойствОбъектов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.ЗначенияСвойствОбъектовИерархия.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.НаборыДополнительныхРеквизитовИСведений.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
+// См. одноименную процедуру в общем модуле УправлениеСвойствами.
+Процедура ПеренестиЗначенияИзРеквизитовФормыВОбъект(Форма, Объект = Неопределено, ПередЗаписью = Ложь) Экспорт
+
+ Если НЕ Форма.Свойства_ИспользоватьСвойства
+ ИЛИ НЕ Форма.Свойства_ИспользоватьДопРеквизиты Тогда
+
+ Возврат;
+ КонецЕсли;
+
+ Если Объект = Неопределено Тогда
+ ОписаниеОбъекта = Форма.Объект;
+ Иначе
+ ОписаниеОбъекта = Объект;
+ КонецЕсли;
+
+ СтарыеЗначения = ОписаниеОбъекта.ДополнительныеРеквизиты.Выгрузить();
+ ОписаниеОбъекта.ДополнительныеРеквизиты.Очистить();
+
+ Для каждого Строка Из Форма.Свойства_ОписаниеДополнительныхРеквизитов Цикл
+
+ Значение = Форма[Строка.ИмяРеквизитаЗначение];
+
+ Если Значение = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Если Строка.ТипЗначения.Типы().Количество() = 1
+ И (НЕ ЗначениеЗаполнено(Значение) Или Значение = Ложь) Тогда
+
+ Продолжить;
+ КонецЕсли;
+
+ Если Строка.Удалено Тогда
+ Если ЗначениеЗаполнено(Значение) И Не (ПередЗаписью И Форма.Свойства_СкрытьУдаленные) Тогда
+ НайденнаяСтрока = СтарыеЗначения.Найти(Строка.Свойство, "Свойство");
+ Если НайденнаяСтрока <> Неопределено Тогда
+ ЗаполнитьЗначенияСвойств(ОписаниеОбъекта.ДополнительныеРеквизиты.Добавить(), НайденнаяСтрока);
+ КонецЕсли;
+ КонецЕсли;
+ Продолжить;
+ КонецЕсли;
+
+ НоваяСтрока = ОписаниеОбъекта.ДополнительныеРеквизиты.Добавить();
+ НоваяСтрока.Свойство = Строка.Свойство;
+ НоваяСтрока.Значение = Значение;
+
+ // Поддержка строк неограниченной длины.
+ ИспользоватьНеограниченнуюСтроку = ИспользоватьНеограниченнуюСтроку(
+ Строка.ТипЗначения, Строка.МногострочноеПолеВвода);
+
+ Если ИспользоватьНеограниченнуюСтроку Тогда
+ НоваяСтрока.ТекстоваяСтрока = Значение;
+ КонецЕсли;
+ КонецЦикла;
+
+ Если ПередЗаписью Тогда
+ Форма.Свойства_СкрытьУдаленные = Ложь;
+ КонецЕсли;
+
+КонецПроцедуры
+
// Возвращает таблицу наборов доступных свойств владельца.
//
// Параметры:
diff --git a/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl b/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl
index 13618d254..3c58de7cb 100644
--- a/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl
+++ b/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl
@@ -1114,7 +1114,6 @@
Возврат;
КонецЕсли;
- //Контакт = Адрес;
Если НеопределенныеАдреса.Найти(Адрес) = Неопределено Тогда
НеопределенныеАдреса.Добавить(Адрес);
КонецЕсли;
diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебный/Module.bsl b/SSL/src/CommonModules/ФайловыеФункцииСлужебный/Module.bsl
index 7576ee0f0..2e31f4f69 100644
--- a/SSL/src/CommonModules/ФайловыеФункцииСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/ФайловыеФункцииСлужебный/Module.bsl
@@ -160,6 +160,22 @@
КонецПроцедуры
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.Справочники.ТомаХраненияФайлов.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
////////////////////////////////////////////////////////////////////////////////
// Стандартный программный интерфейс.
diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ФайловыеФункцииСлужебныйВМоделиСервиса/Module.bsl
index 44f8f5d68..912b2f464 100644
--- a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйВМоделиСервиса/Module.bsl
+++ b/SSL/src/CommonModules/ФайловыеФункцииСлужебныйВМоделиСервиса/Module.bsl
@@ -63,7 +63,7 @@
НоваяСтрока = ТаблицаИспользования.Добавить();
НоваяСтрока.РегламентноеЗадание = "ПланированиеИзвлеченияТекстаВМоделиСервиса";
- НоваяСтрока.Использование = Истина;
+ НоваяСтрока.Использование = ПолучитьФункциональнуюОпцию("ИспользоватьПолнотекстовыйПоиск");
КонецПроцедуры
diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиент/Module.bsl
index 979ca1f9f..102dfbfcf 100644
--- a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиент/Module.bsl
+++ b/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиент/Module.bsl
@@ -14,7 +14,7 @@
Процедура ВывестиНапоминаниеПриРедактировании(ОбработчикРезультата) Экспорт
ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами();
Если ПерсональныеНастройки.ПоказыватьПодсказкиПриРедактированииФайлов = Истина Тогда
- Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если НЕ РасширениеРаботыСФайламиПодключено() Тогда
Форма = ФайловыеФункцииСлужебныйКлиентПовтИсп.ПолучитьФормуНапоминанияПриРедактировании();
УстановитьОповещениеФормы(Форма, ОбработчикРезультата);
Форма.Открыть();
@@ -31,8 +31,13 @@
// ПредставлениеКоманды - Строка - Необязательный. Имя команды, для выполнения которой необходимо расширение.
//
Процедура ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(ОбработчикРезультата, ПредставлениеКоманды = "") Экспорт
- ТекстПредупреждения = НСтр("ru = 'Для выполнения команды ""%1"" необходимо
- |установить расширение для веб-клиента 1С:Предприятие.'");
+ Если Не КлиентПоддерживаетСинхронныеВызовы() Тогда
+ ТекстПредупреждения = НСтр("ru = 'Выполнение команды ""%1"" в браузере
+ |Google Chrome не поддерживается.'");
+ Иначе
+ ТекстПредупреждения = НСтр("ru = 'Для выполнения команды ""%1"" необходимо
+ |установить расширение для веб-клиента 1С:Предприятие.'");
+ КонецЕсли;
Если ЗначениеЗаполнено(ПредставлениеКоманды) Тогда
ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%1", ПредставлениеКоманды);
Иначе
@@ -48,6 +53,20 @@
КонецФункции
+// Возвращает путь к рабочему каталогу пользователя.
+//
+// Параметры:
+// Оповещение - ОписаниеОповещения - оповещение, которое выполняется после получения рабочего
+// каталога пользователя. В качестве результата возвращается Структура со свойствами:
+// * Каталог - Строка - полное имя рабочего каталога пользователя.
+// * ОписаниеОшибки - Строка - текст ошибки, если каталог получить не удалось.
+//
+Процедура ПолучитьРабочийКаталогПользователя(Оповещение) Экспорт
+
+ ФайловыеФункцииСлужебныйКлиентПовтИсп.ПолучитьРабочийКаталогПользователя(Оповещение);
+
+КонецПроцедуры
+
// Сохраняет путь к рабочему каталогу пользователя в настройках.
//
// Параметры:
@@ -229,9 +248,7 @@
Функция ВыбратьПутьККаталогуДанныхПользователя() Экспорт
ИмяКаталога = "";
- РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами();
-
- Если РасширениеПодключено Тогда
+ Если РасширениеРаботыСФайламиПодключено() Тогда
ИмяКаталога = РабочийКаталогДанныхПользователя();
КонецЕсли;
@@ -239,6 +256,53 @@
КонецФункции
+// Возвращает путь к рабочему каталогу данных пользователя. Этот каталог используется
+// в качестве начального значения для рабочего каталога пользователя.
+//
+// Параметры:
+// Оповещение - ОписаниеОповещения - оповещение, которое выполняется после получения рабочего
+// каталога пользователя. В качестве результата возвращается Структура со свойствами:
+// * Каталог - Строка - полное имя рабочего каталога данных пользователя.
+// * ОписаниеОшибки - Строка - текст ошибки, если каталог получить не удалось.
+//
+Процедура ПолучитьРабочийКаталогДанныхПользователя(Оповещение) Экспорт
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+
+ НачатьПолучениеРабочегоКаталогаДанныхПользователя(Новый ОписаниеОповещения(
+ "ПолучитьРабочийКаталогДанныхПользователяПослеПолучения", ЭтотОбъект, Контекст,
+ "ПолучитьРабочийКаталогДанныхПользователяПослеОшибкиПолучения", ЭтотОбъект));
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьРабочийКаталогДанныхПользователя.
+Процедура ПолучитьРабочийКаталогДанныхПользователяПослеОшибкиПолучения(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
+
+ СтандартнаяОбработка = Ложь;
+
+ Результат = Новый Структура;
+ Результат.Вставить("Каталог", "");
+ Результат.Вставить("ОписаниеОшибки", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Не удалось получить рабочий каталог данных пользователя по причине:
+ |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке)));
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьРабочийКаталогДанныхПользователя.
+Процедура ПолучитьРабочийКаталогДанныхПользователяПослеПолучения(КаталогДанныхПользователя, Контекст) Экспорт
+
+ Результат = Новый Структура;
+ Результат.Вставить("Каталог", КаталогДанныхПользователя);
+ Результат.Вставить("ОписаниеОшибки", "");
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+
+КонецПроцедуры
+
+
// Открывает Проводник Windows и выделяет указанный файл.
Функция ОткрытьПроводникСФайлом(Знач ПолноеИмяФайла) Экспорт
@@ -382,6 +446,30 @@
КонецПроцедуры
+// Возвращает результат подключения расширения работы с файлами.
+//
+// Возвращаемое значение:
+// Булево - в тонком клиенте всегда Истина, в браузере Google Chrome
+// всегда ложь.
+//
+Функция РасширениеРаботыСФайламиПодключено() Экспорт
+ Если КлиентПоддерживаетСинхронныеВызовы() Тогда
+ Возврат ПодключитьРасширениеРаботыСФайлами();
+ Иначе
+ Возврат Ложь;
+ КонецЕсли;
+КонецФункции
+
+// Описание процедуры см. ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами.
+//
+Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения) Экспорт
+ Если Не КлиентПоддерживаетСинхронныеВызовы() Тогда
+ ВыполнитьОбработкуОповещения(ОписаниеОповещения, Ложь);
+ Иначе
+ ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения);
+ КонецЕсли;
+КонецПроцедуры
+
////////////////////////////////////////////////////////////////////////////////
// Процедуры и функции работы с криптографией.
@@ -412,7 +500,7 @@
ДополнительныеПараметры.Вставить("ВыделенныеСтроки", ВыделенныеСтроки);
Если Не Форма.Объект.Зашифрован Тогда
- ПроверитьПодписиПродолжение(СсылкаНаДвоичныеДанные, ДополнительныеПараметры);
+ ПроверитьПодписиПослеПодготовкиДанных(СсылкаНаДвоичныеДанные, ДополнительныеПараметры);
Возврат;
КонецЕсли;
@@ -421,7 +509,6 @@
КонецЕсли;
ОписаниеДанных = Новый Структура;
- ОписаниеДанных.Вставить("ИдентификаторФормы", Форма.УникальныйИдентификатор);
ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Шифрование файла'"));
ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'"));
ОписаниеДанных.Вставить("Данные", СсылкаНаДвоичныеДанные);
@@ -443,12 +530,12 @@
Возврат;
КонецЕсли;
- ПроверитьПодписиПродолжение(ОписаниеДанных.РасшифрованныеДанные, ДополнительныеПараметры)
+ ПроверитьПодписиПослеПодготовкиДанных(ОписаниеДанных.РасшифрованныеДанные, ДополнительныеПараметры);
КонецПроцедуры
// Продолжение процедуры ПроверитьПодписи.
-Процедура ПроверитьПодписиПродолжение(Данные, ДополнительныеПараметры)
+Процедура ПроверитьПодписиПослеПодготовкиДанных(Данные, ДополнительныеПараметры)
Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
Возврат;
@@ -465,20 +552,14 @@
КонецЕсли;
Если Не ПроверятьЭлектронныеПодписиНаСервере Тогда
-
МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент");
- МенеджерКриптографии = МодульЭлектроннаяПодписьКлиент.МенеджерКриптографии("ПроверкаПодписи");
- Если МенеджерКриптографии = Неопределено Тогда
- Возврат;
- КонецЕсли;
-
- Для каждого Элемент Из Коллекция Цикл
- СтрокаПодписи = ?(ТипЗнч(Элемент) <> Тип("Число"), Элемент,
- ДополнительныеПараметры.Форма.ЭлектронныеПодписи.НайтиПоИдентификатору(Элемент));
-
- ПроверитьСтрокуПодписи(МенеджерКриптографии, СтрокаПодписи, Данные, МодульЭлектроннаяПодписьКлиент);
- КонецЦикла;
-
+ ДополнительныеПараметры.Вставить("Данные", Данные);
+ ДополнительныеПараметры.Вставить("Коллекция", Коллекция);
+ ДополнительныеПараметры.Вставить("МодульЭлектроннаяПодписьКлиент", МодульЭлектроннаяПодписьКлиент);
+ МодульЭлектроннаяПодписьКлиент.СоздатьМенеджерКриптографии(
+ Новый ОписаниеОповещения("ПроверитьПодписиПослеСозданияМенеджераКриптографии",
+ ЭтотОбъект, ДополнительныеПараметры),
+ "ПроверкаПодписи");
Возврат;
КонецЕсли;
@@ -515,10 +596,489 @@
КонецПроцедуры
+// Продолжение процедуры ПроверитьПодписи.
+Процедура ПроверитьПодписиПослеСозданияМенеджераКриптографии(МенеджерКриптографии, ДополнительныеПараметры) Экспорт
+
+ Если ТипЗнч(МенеджерКриптографии) <> Тип("МенеджерКриптографии") Тогда
+ Возврат;
+ КонецЕсли;
+
+ ДополнительныеПараметры.Вставить("Индекс", -1);
+ ДополнительныеПараметры.Вставить("МенеджерКриптографии", МенеджерКриптографии);
+
+ ПроверитьПодписиЦиклНачало(ДополнительныеПараметры);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьПодписи.
+Процедура ПроверитьПодписиЦиклНачало(ДополнительныеПараметры)
+
+ Если ДополнительныеПараметры.Коллекция.Количество() <= ДополнительныеПараметры.Индекс + 1 Тогда
+ ДополнительныеПараметры.Форма.ОбновитьОтображениеДанных();
+ Возврат;
+ КонецЕсли;
+
+ ДополнительныеПараметры.Индекс = ДополнительныеПараметры.Индекс + 1;
+ Элемент = ДополнительныеПараметры.Коллекция[ДополнительныеПараметры.Индекс];
+
+ ДополнительныеПараметры.Вставить("СтрокаПодписи", ?(ТипЗнч(Элемент) <> Тип("Число"), Элемент,
+ ДополнительныеПараметры.Форма.ЭлектронныеПодписи.НайтиПоИдентификатору(Элемент)));
+
+ МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент");
+ МодульЭлектроннаяПодписьКлиент.ПроверитьПодпись(
+ Новый ОписаниеОповещения("ПроверитьПодписиПослеПроверкиСтроки", ЭтотОбъект, ДополнительныеПараметры),
+ ДополнительныеПараметры.Данные,
+ ДополнительныеПараметры.СтрокаПодписи.АдресПодписи,
+ ДополнительныеПараметры.МенеджерКриптографии);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьПодписи.
+Процедура ПроверитьПодписиПослеПроверкиСтроки(Результат, ДополнительныеПараметры) Экспорт
+
+ СтрокаПодписи = ДополнительныеПараметры.СтрокаПодписи;
+
+ Если Результат = Истина Тогда
+ СтрокаПодписи.Статус = НСтр("ru = 'Верна'");
+ СтрокаПодписи.Неверна = Ложь;
+ Иначе
+ СтрокаПодписи.Статус = НСтр("ru = 'Неверна'") + ". " + Строка(Результат);
+ СтрокаПодписи.Неверна = Истина;
+ КонецЕсли;
+
+ ПроверитьПодписиЦиклНачало(ДополнительныеПараметры);
+
+КонецПроцедуры
+
+// Для формы файла.
+Процедура УстановитьДоступностьКомандСпискаЭлектронныхПодписей(Форма) Экспорт
+
+ Элементы = Форма.Элементы;
+ ЕстьПодписи = (Форма.ЭлектронныеПодписи.Количество() <> 0);
+
+ Элементы.ЭлектронныеПодписиОткрыть.Доступность = ЕстьПодписи;
+ Элементы.ЭлектронныеПодписиПроверить.Доступность = ЕстьПодписи;
+ Элементы.ЭлектронныеПодписиПроверитьВсе.Доступность = ЕстьПодписи;
+ Элементы.ЭлектронныеПодписиСохранить.Доступность = ЕстьПодписи;
+ Элементы.ЭлектронныеПодписиУдалить.Доступность = ЕстьПодписи;
+
+КонецПроцедуры
+
+// Для формы файла.
+Процедура УстановитьДоступностьКомандСпискаСертификатовШифрования(Форма) Экспорт
+
+ Объект = Форма.Объект;
+ Элементы = Форма.Элементы;
+
+ Элементы.СертификатыШифрованияОткрыть.Доступность = Объект.Зашифрован;
+
+КонецПроцедуры
+
+////////////////////////////////////////////////////////////////////////////////
+// Общие процедуры и функции работы с файлами операционной системы.
+
+// Выполняет пакет неинтерактивных действий с файлом.
+// Если файл не существует, то действия не будут пропущены.
+//
+// Можно получить следующие свойства: Имя, ИмяБезРасширения, ПолноеИмя, Путь, Расширение, Существует,
+// ВремяИзменения, УниверсальноеВремяИзменения, ТолькоЧтение, Невидимость, Размер, ЭтоКаталог, ЭтоФайл.
+//
+// Можно установить следующие свойства: ВремяИзменения, УниверсальноеВремяИзменения, ТолькоЧтение, Невидимость.
+// Можно выполнить действия с файлом: Удалить.
+//
+// Параметры:
+// Оповещение - ОписаниеОповещения - оповещение, которое выполняется после выполнения
+// действий с файлом. В качестве результата возвращается Структура со свойствами:
+// * ОписаниеОшибки - Строка - текст ошибки, если одно из действий выполнить не удалось.
+// * Результаты - Массив - содержит результат по каждому действию в виде структуры:
+// * Файл - Файл - инициализированный объект файл.
+// - Неопределено - ошибка инициализации файла.
+// * Существует - Булево - Ложь, если файл не существует.
+//
+// ДействияСФайлом - Массив - содержащий структуры с именем действия и параметрами действия;
+// * Действие - Строка - ПолучитьСвойства, УстановитьСвойства, Удалить, СкопироватьИзИсточника,
+// СоздатьКаталог, Получить, Поместить.
+// * Файл - Строка - полное имя файла на компьютере.
+// - Файл - инициализированный объект Файл.
+// * Свойства - Структура - см. свойства которые можно получить или установить.
+// * Источник - Строка - полное имя файла на компьютере из которого нужно создать копию.
+// * Адрес - Строка - адрес двоичных данных файла, например, адрес временного хранилища.
+// * ЗаголовокОшибки - Строка - текст к которому нужно добавить перевод строки и представление ошибки.
+//
+Процедура ОбработатьФайл(Оповещение, ДействияСФайлом, ИдентификаторФормы = Неопределено) Экспорт
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("ДействияСФайлом", ДействияСФайлом);
+ Контекст.Вставить("ИдентификаторФормы", ИдентификаторФормы);
+
+ Контекст.Вставить("РезультатДействий", Новый Структура);
+ Контекст.РезультатДействий.Вставить("ОписаниеОшибки", "");
+ Контекст.РезультатДействий.Вставить("Результаты", Новый Массив);
+
+ Контекст.Вставить("Индекс", -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 Тогда
+ ОбработатьФайлПослеУстановкиНевидимости(Контекст);
+
+ ИначеЕсли Контекст.СвойстваДляУстановки.Свойство("ВремяИзменения") Тогда
+ Контекст.Файл.НачатьУстановкуВремениИзменения(Новый ОписаниеОповещения(
+ "ОбработатьФайлПослеУстановкиВремениИзменения", ЭтотОбъект, Контекст,
+ "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.СвойстваДляУстановки.ВремяИзменения);
+ Иначе
+ ОбработатьФайлПослеУстановкиВремениИзменения(Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ОбработатьФайл.
+Процедура ОбработатьФайлПослеУстановкиВремениИзменения(Контекст) Экспорт
+
+ Если Контекст.СвойстваДляУстановки.Свойство("УниверсальноеВремяИзменения") Тогда
+ Контекст.Файл.НачатьУстановкуУниверсальногоВремениИзменения(Новый ОписаниеОповещения(
+ "ОбработатьФайлПослеУстановкиУниверсальногоВремениИзменения", ЭтотОбъект, Контекст,
+ "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.СвойстваДляУстановки.УниверсальноеВремяИзменения);
+ Иначе
+ ОбработатьФайлПослеУстановкиУниверсальногоВремениИзменения(Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ОбработатьФайл.
+Процедура ОбработатьФайлПослеУстановкиУниверсальногоВремениИзменения(Контекст) Экспорт
+
+ Если Контекст.СвойстваДляУстановки.Свойство("ТолькоЧтение") Тогда
+ Контекст.Файл.НачатьУстановкуТолькоЧтения(Новый ОписаниеОповещения(
+ "ОбработатьФайлПослеУстановкиТолькоЧтения", ЭтотОбъект, Контекст,
+ "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.СвойстваДляУстановки.ТолькоЧтение);
+ Иначе
+ ОбработатьФайлПослеУстановкиТолькоЧтения(Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ОбработатьФайл.
+Процедура ОбработатьФайлПослеУстановкиТолькоЧтения(Контекст) Экспорт
+
+ Если Контекст.СвойстваДляУстановки.Свойство("Невидимость") Тогда
+ Контекст.Файл.НачатьУстановкуНевидимости(Новый ОписаниеОповещения(
+ "ОбработатьФайлПослеУстановкиНевидимости", ЭтотОбъект, Контекст,
+ "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.СвойстваДляУстановки.Невидимость);
+ Иначе
+ ОбработатьФайлПослеУстановкиНевидимости(Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ОбработатьФайл.
+Процедура ОбработатьФайлПослеУстановкиНевидимости(Контекст) Экспорт
+
+ ОбработатьФайлЦиклНачало(Контекст);
+
+КонецПроцедуры
+
+
#Если НЕ ВебКлиент Тогда
// Извлекает текст из файла на диске на клиенте и помещает результат на сервер.
Процедура ИзвлечьТекстВерсии(ФайлИлиВерсияФайла,
@@ -583,7 +1143,7 @@
// Загружает файл с клиента во временное хранилище на сервере. Не работает без расширения работы с файлами.
Функция ПоместитьФайлСДискаВоВременноеХранилище(ПолноеИмяФайла, АдресФайла = "", УникальныйИдентификатор = Неопределено) Экспорт
- Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если Не РасширениеРаботыСФайламиПодключено() Тогда
Возврат Неопределено;
КонецЕсли;
ЧтоЗагрузить = Новый Массив;
@@ -637,22 +1197,23 @@
КонецЕсли;
КонецПроцедуры
-
-// Для процедуры ПроверитьПодписиПродолжение.
-Процедура ПроверитьСтрокуПодписи(МенеджерКриптографии, СтрокаПодписи, ИсходныеДанные, МодульЭлектроннаяПодписьКлиент)
+Функция КлиентПоддерживаетСинхронныеВызовы()
- ОписаниеОшибки = "";
- ПодписьПроверена = МодульЭлектроннаяПодписьКлиент.ПроверитьПодпись(МенеджерКриптографии,
- ИсходныеДанные, СтрокаПодписи.АдресПодписи, ОписаниеОшибки);
+#Если ВебКлиент Тогда
+ // В Chrome расширение не подключается.
+ СистемнаяИнформация = Новый СистемнаяИнформация;
+ ИнформацияПрограммыМассив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(
+ СистемнаяИнформация.ИнформацияПрограммыПросмотра, " ");
- Если ПодписьПроверена Тогда
- СтрокаПодписи.Статус = НСтр("ru = 'Верна'");
- СтрокаПодписи.Неверна = Ложь;
- Иначе
- СтрокаПодписи.Статус = НСтр("ru = 'Неверна'") + ". " + ОписаниеОшибки;
- СтрокаПодписи.Неверна = Истина;
- КонецЕсли;
+ Для Каждого ИнформацияПрограммы Из ИнформацияПрограммыМассив Цикл
+ Если Найти(ИнформацияПрограммы, "Chrome") > 0 Тогда
+ Возврат Ложь;
+ КонецЕсли;
+ КонецЦикла;
+#КонецЕсли
-КонецПроцедуры
+ Возврат Истина;
+
+КонецФункции
#КонецОбласти
diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентПовтИсп/Module.bsl
index 0e5a3bd45..be5c59460 100644
--- a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентПовтИсп/Module.bsl
+++ b/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентПовтИсп/Module.bsl
@@ -93,4 +93,75 @@
КонецФункции
+// См. одноименную процедуру в общем модуле ФайловыеФункцииСлужебныйКлиент.
+Процедура ПолучитьРабочийКаталогПользователя(Оповещение) Экспорт
+
+ ИмяПараметра = "СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена";
+ Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда
+ ПараметрыПриложения.Вставить(ИмяПараметра, Ложь);
+ КонецЕсли;
+
+ ИмяКаталога = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(
+ ).ПерсональныеНастройкиРаботыСФайлами.ПутьКЛокальномуКэшуФайлов;
+
+ // Уже установлен.
+ Если ИмяКаталога <> Неопределено
+ И НЕ ПустаяСтрока(ИмяКаталога)
+ И ПараметрыПриложения["СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"] Тогда
+
+ Результат = Новый Структура;
+ Результат.Вставить("Каталог", ИмяКаталога);
+ Результат.Вставить("ОписаниеОшибки", "");
+
+ ВыполнитьОбработкуОповещения(Оповещение, Результат);
+ Возврат;
+ КонецЕсли;
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("Каталог", ИмяКаталога);
+
+ ФайловыеФункцииСлужебныйКлиент.ПолучитьРабочийКаталогДанныхПользователя(Новый ОписаниеОповещения(
+ "ПолучитьРабочийКаталогПользователяПослеПолученияКаталогаДанных", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьРабочийКаталогПользователя.
+Процедура ПолучитьРабочийКаталогПользователяПослеПолученияКаталогаДанных(Результат, Контекст) Экспорт
+
+ Если ЗначениеЗаполнено(Результат.ОписаниеОшибки) Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+ Возврат;
+ КонецЕсли;
+
+#Если НЕ ВебКлиент Тогда
+
+ Если Результат.Каталог <> Контекст.Каталог Тогда
+ // Создать каталог для файлов.
+ Попытка
+ СоздатьКаталог(Контекст.Каталог);
+ ИмяКаталогаТестовое = Контекст.Каталог + "ПроверкаДоступа\";
+ СоздатьКаталог(ИмяКаталогаТестовое);
+ УдалитьФайлы(ИмяКаталогаТестовое);
+ Исключение
+ // Нет прав на создание каталога, или такой путь отсутствует,
+ // тогда установка настроек по умолчанию.
+ Контекст.Каталог = Неопределено;
+ КонецПопытки;
+ КонецЕсли;
+
+#КонецЕсли
+
+ ПараметрыПриложения["СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"] = Истина;
+
+ Если Контекст.Каталог = Неопределено Тогда
+ ФайловыеФункцииСлужебныйКлиент.УстановитьРабочийКаталогПользователя(Результат.Каталог);
+ Иначе
+ Результат.Каталог = Контекст.Каталог;
+ КонецЕсли;
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+
+КонецПроцедуры
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/ФизическиеЛицаКлиентСервер/Module.bsl b/SSL/src/CommonModules/ФизическиеЛицаКлиентСервер/Module.bsl
index 3f68eedac..3385f0797 100644
--- a/SSL/src/CommonModules/ФизическиеЛицаКлиентСервер/Module.bsl
+++ b/SSL/src/CommonModules/ФизическиеЛицаКлиентСервер/Module.bsl
@@ -5,86 +5,6 @@
#Область ПрограммныйИнтерфейс
-// Функция склоняет переданную фразу.
-// Только для работы на ОС Windows.
-//
-// Параметры:
-// ФИО - Строка - фамилия, имя и отчество в именительном падеже,
-// которые необходимо просклонять.
-// Падеж - Число - падеж, в который необходимо поставить ФИО:
-// 1 - Именительный
-// 2 - Родительный
-// 3 - Дательный
-// 4 - Винительный
-// 5 - Творительный
-// 6 - Предложный
-// Результат - Строка - в этот параметр помещается результат склонения.
-// Если ФИО не удалось просклонять, то возвращается значение ФИО.
-// Пол - Число - пол физического лица, 1 - мужской, 2 - женский.
-//
-// Возвращаемое значение:
-// Булево - Истина, если ФИО удалось просклонять.
-//
-Функция Просклонять(Знач ФИО, Падеж, Результат, Пол = Неопределено) Экспорт
-
- СистемнаяИнформация = Новый СистемнаяИнформация();
- Если СистемнаяИнформация.ТипПлатформы <> ТипПлатформы.Windows_x86
- И СистемнаяИнформация.ТипПлатформы <> ТипПлатформы.Windows_x86_64 Тогда
-
- Результат = ФИО;
- Возврат Ложь;
-
- КонецЕсли;
-
- ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаСклоненияФИО", "Decl");
- Компонента = Новый("AddIn.Decl.CNameDecl");
-
- Результат = "";
-
- МассивСтрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ФИО, " ");
-
- // Выделим первые 3 слова, так как компонента не умеет склонять фразу большую 3х символов.
- НомерНесклоняемогоСимвола = 4;
- Для Номер = 1 По Мин(МассивСтрок.Количество(), 3) Цикл
- Если Не ФИОНаписаноВерно(МассивСтрок[Номер-1], Истина) Тогда
- НомерНесклоняемогоСимвола = Номер;
- Прервать;
- КонецЕсли;
-
- Результат = Результат + ?(Номер > 1, " ", "") + МассивСтрок[Номер-1];
- КонецЦикла;
-
- Если ПустаяСтрока(Результат) Тогда
- Результат = ФИО;
- Возврат Ложь;
- КонецЕсли;
-
- Попытка
- Если Пол = Неопределено Тогда
- Результат = Компонента.Просклонять(Результат, Падеж) + " ";
-
- Иначе
- Результат = Компонента.Просклонять(Результат, Падеж, Пол) + " ";
-
- КонецЕсли;
-
- Исключение
- Результат = ФИО;
- Возврат Ложь;
-
- КонецПопытки;
-
- // Остальные символы добавим без склонения.
- Для Номер = НомерНесклоняемогоСимвола По МассивСтрок.Количество() Цикл
- Результат = Результат + " " + МассивСтрок[Номер-1];
- КонецЦикла;
-
- Результат = СокрЛП(Результат);
-
- Возврат Истина;
-
-КонецФункции
-
// Функция раскладывает ФИО в структуру.
//
// Параметры:
@@ -194,4 +114,15 @@
КонецФункции
+// Устарела. Следует использовать функцию ОбщегоНазначения.Просклонять.
+// Функция не работает на клиенте.
+Функция Просклонять(Знач ФИО, Падеж, Результат, Пол = Неопределено) Экспорт
+ #Если Сервер Тогда
+ Возврат ОбщегоНазначения.Просклонять(ФИО, Падеж, Результат, Пол);
+ #Иначе
+ Результат = ФИО;
+ Возврат Ложь;
+ #КонецЕсли
+КонецФункции
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl
index 4114aaf0b..0182a5899 100644
--- a/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl
+++ b/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl
@@ -19,6 +19,23 @@
КонецФункции
+// Возвращает текущую настройку проверки электронных подписей на сервере.
+Функция ПроверятьЭлектронныеПодписиНаСервере() Экспорт
+
+ Возврат ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ПроверятьЭлектронныеПодписиНаСервере;
+
+КонецФункции
+
+// Возвращает текущую настройку создания электронных подписей на сервере.
+// Настройка также предполагает шифрование и расшифровку на сервере.
+//
+Функция СоздаватьЭлектронныеПодписиНаСервере() Экспорт
+
+ Возврат ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().СоздаватьЭлектронныеПодписиНаСервере;
+
+КонецФункции
+
+
// Возвращает менеджер криптографии (на сервере) для указанной программы.
//
// Параметры:
@@ -69,9 +86,8 @@
// - Строка - полное имя файла, содержащего двоичные данные
// электронной подписи.
//
-// ОписаниеОшибки - Null - вызвать исключение при ошибке проверки (для обратной совместимости).
-// - Строка - содержит описание ошибки, если произошла ошибка (в случае ошибки
-// получения менеджера криптографии, когда он не указан, вызывается исключение).
+// ОписаниеОшибки - Null - вызвать исключение при ошибке проверки.
+// - Строка - содержит описание ошибки, если произошла ошибка.
//
// Возвращаемое значение:
// Булево - Истина, если проверка выполнена успешно.
@@ -83,6 +99,9 @@
МенеджерКриптографииДляПроверки = МенеджерКриптографии;
Если МенеджерКриптографииДляПроверки = Неопределено Тогда
МенеджерКриптографииДляПроверки = МенеджерКриптографии("ПроверкаПодписи", ОписаниеОшибки = Null, ОписаниеОшибки);
+ Если МенеджерКриптографииДляПроверки = Неопределено Тогда
+ Возврат Ложь;
+ КонецЕсли;
КонецЕсли;
ИсходныеДанныеДляПроверки = ИсходныеДанные;
@@ -124,31 +143,60 @@
// - ДвоичныеДанные - двоичные данные сертификата.
// - Строка - адрес временного хранилища, содержащего двоичные данные сертификата.
//
-// ОписаниеОшибки - Строка - содержит описание ошибки, если произошла ошибка (в случае ошибки
-// получения менеджера криптографии, когда он не указан, вызывается исключение).
+// ОписаниеОшибки - Null - вызвать исключение при ошибке проверки.
+// - Строка - содержит описание ошибки, если произошла ошибка.
//
// Возвращаемое значение:
// Булево - Истина, если проверка выполнена успешно,
// - Ложь, если не удалось получить менеджер криптографии (когда не указан).
//
-Функция ПроверитьСертификат(МенеджерКриптографии, Сертификат, ОписаниеОшибки) Экспорт
+Функция ПроверитьСертификат(МенеджерКриптографии, Сертификат, ОписаниеОшибки = Null) Экспорт
МенеджерКриптографииДляПроверки = МенеджерКриптографии;
Если МенеджерКриптографииДляПроверки = Неопределено Тогда
- МенеджерКриптографииДляПроверки = МенеджерКриптографии("ПроверкаСертификата", Ложь, ОписаниеОшибки);
+ МенеджерКриптографииДляПроверки = МенеджерКриптографии("ПроверкаСертификата", ОписаниеОшибки = Null, ОписаниеОшибки);
+ Если МенеджерКриптографииДляПроверки = Неопределено Тогда
+ Возврат Ложь;
+ КонецЕсли;
КонецЕсли;
- ТекущееОписаниеОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаПроверкиСертификата(
- МенеджерКриптографииДляПроверки, Сертификат);
+ СертификатДляПроверки = Сертификат;
- Если ТекущееОписаниеОшибки = Неопределено Тогда
- Возврат Истина;
+ Если ТипЗнч(Сертификат) = Тип("Строка") Тогда
+ СертификатДляПроверки = ПолучитьИзВременногоХранилища(Сертификат);
КонецЕсли;
- ОписаниеОшибки = ТекущееОписаниеОшибки;
+ Если ТипЗнч(СертификатДляПроверки) = Тип("ДвоичныеДанные") Тогда
+ СертификатДляПроверки = Новый СертификатКриптографии(СертификатДляПроверки);
+ КонецЕсли;
- Возврат Ложь;
+ РежимыПроверкиСертификата = ЭлектроннаяПодписьСлужебныйКлиентСервер.РежимыПроверкиСертификата();
+
+ Попытка
+ МенеджерКриптографииДляПроверки.ПроверитьСертификат(СертификатДляПроверки, РежимыПроверкиСертификата);
+ Исключение
+ ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
+ Возврат Ложь;
+ КонецПопытки;
+
+ Возврат Истина;
+
+КонецФункции
+
+// Находит сертификат на компьютере по строке отпечатка.
+//
+// Параметры:
+// Отпечаток - Строка - Base64 кодированный отпечаток сертификата.
+// ТолькоВЛичномХранилище - Булево - если Истина, тогда искать в личном хранилище, иначе везде.
+//
+// Возвращаемое значение:
+// СертификатКриптографии - сертификат электронной подписи и шифрования.
+// Неопределено - сертификат не найден в хранилище.
+//
+Функция ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище) Экспорт
+
+ Возврат ЭлектроннаяПодписьСлужебный.ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище);
КонецФункции
@@ -441,7 +489,6 @@
// Структура - Общие настройки подсистемы для работы с электронной подписью.
// * ИспользоватьЭлектронныеПодписи - Булево - если Истина, то электронный подписи используются.
// * ИспользоватьШифрование - Булево - если Истина, то шифрование используются.
-// * ВыполнятьШифрованиеНаСервере - Булево - если Истина то шифрование выполняется на сервере.
// * ПроверятьЭлектронныеПодписиНаСервере - Булево - если Истина, то электронные подписи и
// сертификаты проверяются на сервере.
// * СоздаватьЭлектронныеПодписиНаСервере - Булево - если Истина, то электронные подписи создаются
@@ -545,45 +592,6 @@
КонецФункции
-// Находит сертификат на компьютере по строке отпечатка.
-//
-// Параметры:
-// Отпечаток - Строка - Base64 кодированный отпечаток сертификата.
-// ТолькоВЛичномХранилище - Булево - Если Истина, то поиск производится только в личном хранилище.
-//
-// Возвращаемое значение:
-// СертификатКриптографии - сертификат электронной подписи и шифрования.
-// Неопределено - сертификат не найден.
-//
-Функция ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище,
- Программа = Неопределено, ПоказатьОшибку = Истина, ОписаниеОшибки = "") Экспорт
-
- МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии("ПолучениеСертификатов",
- ПоказатьОшибку, ОписаниеОшибки, Программа);
-
- Если МенеджерКриптографии = Неопределено Тогда
- Возврат Неопределено;
- КонецЕсли;
-
- Сертификат = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПолучитьСертификатПоОтпечатку(
- МенеджерКриптографии, Отпечаток, ТолькоВЛичномХранилище, ПоказатьОшибку, ОписаниеОшибки);
-
- Если Сертификат = Неопределено Тогда
- ТекстОшибки = НСтр("ru = 'Сертификат не найден на сервере.'");
- Если Не Пользователи.ЭтоПолноправныйПользователь(,, Ложь) Тогда
- ТекстОшибки = ТекстОшибки + Символы.ПС + НСтр("ru = 'Обратитесь к администратору.'")
- КонецЕсли;
- Если ТипЗнч(ОписаниеОшибки) = Тип("Структура") Тогда
- ОписаниеОшибки.Вставить("ОписаниеОшибки", ТекстОшибки);
- Иначе
- ОписаниеОшибки = ТекстОшибки;
- КонецЕсли;
- КонецЕсли;
-
- Возврат Сертификат;
-
-КонецФункции
-
////////////////////////////////////////////////////////////////////////////////
// Вспомогательные процедуры и функции.
diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl
index 215f73559..e5d56ee9e 100644
--- a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl
+++ b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl
@@ -19,9 +19,30 @@
КонецФункции
-// Возвращает менеджер криптографии (на клиенте) для указанной программы.
+// Возвращает текущую настройку проверки электронных подписей на сервере.
+Функция ПроверятьЭлектронныеПодписиНаСервере() Экспорт
+
+ Возврат ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ПроверятьЭлектронныеПодписиНаСервере;
+
+КонецФункции
+
+// Возвращает текущую настройку создания электронных подписей на сервере.
+// Настройка также предполагает шифрование и расшифровку на сервере.
+//
+Функция СоздаватьЭлектронныеПодписиНаСервере() Экспорт
+
+ Возврат ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().СоздаватьЭлектронныеПодписиНаСервере;
+
+КонецФункции
+
+
+// Создает и возвращает менеджер криптографии (на клиенте) для указанной программы.
//
// Параметры:
+// Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов.
+// МенеджерКриптографии - инициализированный менеджер криптографии.
+// Строка - описание ошибки при создании менеджера криптографии.
+//
// Операция - Строка - если не пустая, то должна содержать одну из строк, которые определяют
// операцию для вставки в описание ошибки: Подписание, ПроверкаПодписи, Шифрование,
// Расшифровка, ПроверкаСертификата, ПолучениеСертификатов.
@@ -32,32 +53,33 @@
// в которой можно увидеть почему программу не удалось задействовать,
// а также открыть инструкцию по установке.
//
-// ОписаниеОшибки - Строка - возвращаемое описание ошибки, если возвращено значение Неопределено.
-//
// Программа - Неопределено - возвращает менеджер криптографии первой
// программы из справочника для которой удалось его создать.
// - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - программа
// для которой нужно создать и вернуть менеджер криптографии.
//
-// Возвращаемое значение:
-// МенеджерКриптографии - менеджер криптографии.
-// Неопределено - произошла ошибка, описание которой в параметре ОписаниеОшибки.
-//
-Функция МенеджерКриптографии(Операция, ПоказатьОшибку = Истина, ОписаниеОшибки = "", Программа = Неопределено) Экспорт
+Процедура СоздатьМенеджерКриптографии(Оповещение, Операция, ПоказатьОшибку = Истина, Программа = Неопределено) Экспорт
- Ошибка = "";
- Результат = ЭлектроннаяПодписьСлужебныйКлиент.МенеджерКриптографии(Операция, ПоказатьОшибку, Ошибка, Программа);
-
- Если Результат = Неопределено Тогда
- ОписаниеОшибки = Ошибка;
+ Если ТипЗнч(Операция) <> Тип("Строка") Тогда
+ Операция = "";
КонецЕсли;
- Возврат Результат;
- ОписаниеОшибки = "";
+ Если ПоказатьОшибку <> Истина Тогда
+ ПоказатьОшибку = Ложь;
+ КонецЕсли;
-КонецФункции
+ ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографии(Оповещение, Операция, ПоказатьОшибку, Программа);
+
+КонецПроцедуры
// Подписывает данные, возвращает подпись и добавляет подпись в объект, если указано.
+//
+// Общий подход к обработке значений свойств с типом ОписаниеОповещения в параметре ОписаниеДанных.
+// При выполнении обработки оповещения в нее передается структура параметров, в которой всегда есть
+// свойство "Оповещение" типа ОписаниеОповещения, обработку которого нужно выполнить для продолжения.
+// Кроме того, в структуре всегда есть свойство ОписаниеДанных, полученное при вызове процедуры.
+// При вызове оповещения в качестве значения должна передаваться структура. Если в процессе асинхронного
+// выполнения возникает ошибка, тогда в эту структуру нужно вставить свойство ОписаниеОшибки типа Строка.
//
// Параметры:
// ОписаниеДанных - Структура - со свойствами:
@@ -78,17 +100,11 @@
// в) либо пароль установлен ранее методом УстановитьПарольСертификата.
// Если в процессе подписания возникла ошибка, тогда будет открыта форма
// с возможностью указать пароль. Параметр ПоказатьКомментарий игнорируется.
-// * КонтекстОперации - Неопределено - (необязательный) - если указан, тогда в свойство будет
-// установлено определенное значение произвольного типа, которое позволяет
-// выполнить действие с тем же сертификатом повторно (у пользователя
-// не запрашивается ни пароль, ни подтверждение действия).
-// * -------// ------- - Произвольный - (необязательный) - если определено, то действие будет выполнено
-// с тем же сертификатом без запроса пароля или подтверждения. Параметр.
-// ОтборСертификатов игнорируется, а параметр БезПодтверждения считается Истина.
-// * ПередВыполнением - ОписаниеОповещения - описание обработчика дополнительной подготовки данных,
-// после выбора сертификата, которым будут подписаны данные. В этом обработчике
-// можно заполнить параметр Данные, если он зависит от сертификата, который
-// в момент вызова уже вставлен в ОписаниеДанных, как ВыбранныйСертификат (см. ниже).
+// * ПередВыполнением - ОписаниеОповещения - (необязательный) - описание обработчика дополнительной
+// подготовки данных, после выбора сертификата, которым будут подписаны данные.
+// В этом обработчике можно заполнить параметр Данные, если он зависит
+// от сертификата, который в момент вызова уже вставлен в ОписаниеДанных,
+// как ВыбранныйСертификат (см. ниже). Следует учесть общий подход (см. выше).
// * ВыполнятьНаСервере - Неопределено, Булево - (необязательный) - когда не указан или Неопределено,
// тогда выполнение будет определено автоматически: если есть сервер, то сначала
// на сервере, потом при неудаче на клиенте, потом сообщение о двух ошибках.
@@ -98,25 +114,41 @@
// * ПараметрыДополнительныхДействий - Произвольный - (необязательный) - если указан, то передается
// на сервер в процедуру ПередНачаломОперации общего модуля.
// ЭлектроннаяПодписьПереопределяемый, как ВходныеПараметры.
+// * КонтекстОперации - Неопределено - (необязательный) - если указан, тогда в свойство будет
+// установлено определенное значение произвольного типа, которое позволяет
+// выполнить действие с тем же сертификатом повторно (у пользователя
+// не запрашивается ни пароль, ни подтверждение действия).
+// * ------ // ------ - Произвольный - (необязательный) - если определено, то действие будет выполнено
+// с тем же сертификатом без запроса пароля или подтверждения.
+// Параметр БезПодтверждения считается равным Истина.
+// Параметры Операция, ЗаголовокДанных, ПоказатьКомментарий, ОтборСертификатов
+// и ВыполнятьНаСервере игнорируются, их значения остаются, как при первом вызове.
+// Параметр ПараметрыДополнительныхДействий игнорируется.
+// Процедура ПередНачаломОперации не вызывается.
+// Если передать контекст, возвращенный процедурой Расшифровать, тогда
+// пароль, введенный для сертификата, может быть использован, как если бы
+// пароль был сохранен на время сеанса. В остальном контекст игнорируется.
// Вариант 1:
// * Данные - ДвоичныеДанные - данные для подписания.
-// * --// -- - Строка - адрес временного хранилища, содержащего двоичные данные.
-// * --// -- - ОписаниеОповещения - описание обработчика получения данных,
-// в параметр, переданный в этот обработчик. В момент вызова в.
-// ОписаниеДанных уже вставлен параметр ВыбранныйСертификат (см. ниже).
+// * -- // -- - Строка - адрес временного хранилища, содержащего двоичные данные.
+// * -- // -- - ОписаниеОповещения - обработчик получения данных, который возвращает
+// их в свойстве Данные (см. выше общий подход). В момент вызова
+// в ОписаниеДанных уже вставлен параметр ВыбранныйСертификат (см. ниже).
// * Объект - Ссылка - (необязательный) - ссылка на объект с табличной частью.
// ЭлектронныеПодписи, в которую нужно добавить подпись.
// Если не указан, то подпись не требуется добавлять.
-// * --// -- - ОписаниеОповещения - (необязательный) - описание обработчика
-// добавления подписи в табличную часть ЭлектронныеПодписи.
-// В обработчик передается ОписаниеДанных с параметром СвойстваПодписи.
+// * -- // -- - ОписаниеОповещения - (необязательный) - обработчик добавления подписи в
+// табличную часть ЭлектронныеПодписи. Следует учесть общий подход (см. выше).
+// В момент вызова в ОписаниеДанных уже вставлен параметр СвойстваПодписи.
// В случае параметра НаборДанных, в ОписаниеДанных вставляется
// свойство ТекущийЭлементНабораДанных, содержащее параметр СвойстваПодписи.
// * ВерсияОбъекта - Строка - (необязательный) - версия данных объекта для проверки и
// блокировки объекта перед добавлением подписи.
// * Представление - Ссылка, Строка, Структура - (необязательный), если не указан, тогда
// представление вычисляется по значению свойства Объект.
-// Структура содержит свойства Значение и Представление.
+// Структура содержит свойства:
+// * Значение - Ссылка, ОписаниеОповещения - для открытия.
+// * Представление - Строка - представление значения.
// Вариант 2:
// * НаборДанных - Массив - структуры со свойствами, описанными в Варианте 1.
// * ПредставлениеНабора - Строка - представления нескольких элементов набора данных, например, "Файлы (%1)".
@@ -171,10 +203,18 @@
ЭлектроннаяПодписьСлужебныйКлиент, КлиентскиеПараметры);
Если ОписаниеДанных.Свойство("КонтекстОперации")
- И ОписаниеДанных.КонтекстОперации <> Неопределено Тогда
-
- ОписаниеДанных.КонтекстОперации.ВыполнитьПодписание(КлиентскиеПараметры, ОбработкаЗавершения);
- Возврат;
+ И ТипЗнч(ОписаниеДанных.КонтекстОперации) = Тип("УправляемаяФорма") Тогда
+
+ ЭлектроннаяПодписьСлужебныйКлиент.ПродлитьХранениеКонтекстаОперации(ОписаниеДанных);
+ НачалоИмениФормы = "Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.";
+
+ Если ОписаниеДанных.КонтекстОперации.ИмяФормы = НачалоИмениФормы + "ПодписаниеДанных" Тогда
+ ОписаниеДанных.КонтекстОперации.ВыполнитьПодписание(КлиентскиеПараметры, ОбработкаЗавершения);
+ Возврат;
+ КонецЕсли;
+ Если ОписаниеДанных.КонтекстОперации.ИмяФормы = НачалоИмениФормы + "РасшифровкаДанных" Тогда
+ КлиентскиеПараметры.Вставить("УказанКонтекстДругойОперации");
+ КонецЕсли;
КонецЕсли;
СерверныеПараметры = Новый Структура;
@@ -193,6 +233,13 @@
// Предлагает пользователю выбрать файлы подписей для добавления к объекту и добавляет их.
//
+// Общий подход к обработке значений свойств с типом ОписаниеОповещения в параметре ОписаниеДанных.
+// При выполнении обработки оповещения в нее передается структура параметров, в которой всегда есть
+// свойство "Оповещение" типа ОписаниеОповещения, обработку которого нужно выполнить для продолжения.
+// Кроме того, в структуре всегда есть свойство ОписаниеДанных, полученное при вызове процедуры.
+// При вызове оповещения в качестве значения должна передаваться структура. Если в процессе асинхронного
+// выполнения возникает ошибка, тогда в эту структуру нужно вставить свойство ОписаниеОшибки типа Строка.
+//
// Параметры:
// ОписаниеДанных - Структура - со свойствами:
// * ЗаголовокДанных - Строка - заголовок элемента данных, например Файл.
@@ -200,9 +247,9 @@
// добавления подписей. Если не указан, значит Ложь.
// * Объект - Ссылка - (необязательный) - ссылка на объект с табличной частью.
// ЭлектронныеПодписи, в которую нужно добавить подпись.
-// * --// -- - ОписаниеОповещения - (необязательный) - описание обработчика
-// добавления подписи в табличную часть ЭлектронныеПодписи.
-// В обработчик передается ОписаниеДанных с параметром Подписи.
+// * -- // -- - ОписаниеОповещения - (необязательный) - обработчик добавления подписи в
+// табличную часть ЭлектронныеПодписи. Следует учесть общий подход (см. выше).
+// В момент вызова в ОписаниеДанных уже вставлен параметр Подписи.
// * ВерсияОбъекта - Строка - (необязательный) - версия данных объекта для проверки и
// блокировки объекта перед добавлением подписи.
// * Представление - Ссылка, Строка - (необязательный), если не указан, тогда
@@ -242,11 +289,11 @@
СерверныеПараметры.Вставить("ПоказатьКомментарий", Ложь);
ЗаполнитьЗначенияСвойств(СерверныеПараметры, ОписаниеДанных);
- ЭлектроннаяПодписьСлужебныйКлиент.НастроитьПредставлениеДанных(ОписаниеДанных, СерверныеПараметры);
-
КлиентскиеПараметры = Новый Структура;
- КлиентскиеПараметры.Вставить("ОписаниеДанных", ОписаниеДанных);
+ КлиентскиеПараметры.Вставить("ОписаниеДанных", ОписаниеДанных);
+ КлиентскиеПараметры.Вставить("Форма", Форма);
КлиентскиеПараметры.Вставить("ОбработкаРезультата", ОбработкаРезультата);
+ ЭлектроннаяПодписьСлужебныйКлиент.НастроитьПредставлениеДанных(КлиентскиеПараметры, СерверныеПараметры);
Обработчик = Новый ОписаниеОповещения("СтандартноеЗавершение",
ЭлектроннаяПодписьСлужебныйКлиент, КлиентскиеПараметры);
@@ -254,17 +301,47 @@
ФормаДобавления = ОткрытьФорму("ОбщаяФорма.ДобавлениеЭлектроннойПодписиИзФайла", СерверныеПараметры,,,,,
Новый ОписаниеОповещения("СтандартноеЗавершение", ЭлектроннаяПодписьСлужебныйКлиент, КлиентскиеПараметры));
- Если ФормаДобавления = Неопределено Или ФормаДобавления.Открыта() = Ложь Тогда
- ВыполнитьОбработкуОповещения(ОбработкаРезультата, ОписаниеДанных);
+ Если ФормаДобавления = Неопределено Тогда
+ Если ОбработкаРезультата <> Неопределено Тогда
+ ВыполнитьОбработкуОповещения(ОбработкаРезультата, ОписаниеДанных);
+ КонецЕсли;
+ Возврат;
+ КонецЕсли;
+
+ ФормаДобавления.КлиентскиеПараметры = КлиентскиеПараметры;
+
+ ОбщиеНастройки = ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки();
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("ОбработкаРезультата", ОбработкаРезультата);
+ Контекст.Вставить("ФормаДобавления", ФормаДобавления);
+ Контекст.Вставить("ПроверитьМенеджерКриптографииНаКлиенте", Истина);
+ Контекст.Вставить("ОписаниеДанных", ОписаниеДанных);
+
+ Если ( ОбщиеНастройки.ПроверятьЭлектронныеПодписиНаСервере
+ Или ОбщиеНастройки.СоздаватьЭлектронныеПодписиНаСервере)
+ И Не ЗначениеЗаполнено(ФормаДобавления.МенеджерКриптографииНаСервереОписаниеОшибки) Тогда
+
+ Контекст.ПроверитьМенеджерКриптографииНаКлиенте = Ложь;
+ ЭлектроннаяПодписьСлужебныйКлиент.ДобавитьПодписьИзФайлаПослеСозданияМенеджераКриптографии(, Контекст);
Иначе
- ФормаДобавления.ФормаОбъекта = Форма;
- ФормаДобавления.ОписаниеДанных = ОписаниеДанных;
+ ЭлектроннаяПодписьСлужебныйКлиент.СоздатьМенеджерКриптографии(Новый ОписаниеОповещения(
+ "ДобавитьПодписьИзФайлаПослеСозданияМенеджераКриптографии",
+ ЭлектроннаяПодписьСлужебныйКлиент, Контекст),
+ "", Неопределено);
КонецЕсли;
КонецПроцедуры
// Предлагает пользователю выбрать подписи для сохранения вместе с данными объекта.
//
+// Общий подход к обработке значений свойств с типом ОписаниеОповещения в параметре ОписаниеДанных.
+// При выполнении обработки оповещения в нее передается структура параметров, в которой всегда есть
+// свойство "Оповещение" типа ОписаниеОповещения, обработку которого нужно выполнить для продолжения.
+// Кроме того, в структуре всегда есть свойство ОписаниеДанных, полученное при вызове процедуры.
+// При вызове оповещения в качестве значения должна передаваться структура. Если в процессе асинхронного
+// выполнения возникает ошибка, тогда в эту структуру нужно вставить свойство ОписаниеОшибки типа Строка.
+//
// Параметры:
// ОписаниеДанных - Структура - со свойствами:
// * ЗаголовокДанных - Строка - заголовок элемента данных, например Файл.
@@ -274,15 +351,15 @@
// представление вычисляется по значению свойства Объект.
// * Объект - Ссылка - ссылка на объект с табличной частью ЭлектронныеПодписи,
// из которой нужно получить список подписей.
-// * --// -- - Строка - адрес временного хранилища массива подписей с составом свойств,
+// * -- // -- - Строка - адрес временного хранилища массива подписей с составом свойств,
// как возвращает процедура ДобавитьПодписьИзФайла.
-// * Данные - ОписаниеОповещения - описание обработчика сохранения данных и
-// получения полного имени файла с путем для сохранения электронных подписей.
-// В обработчик передается описание оповещения в результат которого нужно
-// поместить ПолноеИмяФайла типа Строка, после того как файл будет сохранен.
-// Если расширение для работы с файлами не подключено, то передать имя файла без пути.
-// Если переданное значение не будет заполнено, это считается отказом
-// продолжения и будет вызвана ОбработкаРезультата с результатом Ложь.
+// * Данные - ОписаниеОповещения - обработчик сохранения данных и получения полного имени
+// файла с путем (после его сохранения), возвращаемое в свойстве ПолноеИмяФайла
+// типа Строка для сохранения электронных подписей (см. выше общий подход).
+// Если расширение для работы с файлами не подключено, то нужно вернуть
+// имя файла без пути.
+// Если свойство не будет вставлено или заполнено - это считается отказом
+// от продолжения и будет вызвана ОбработкаРезультата с результатом Ложь.
//
// ОбработкаРезультата - ОписаниеОповещения - необязательный параметр.
// В результат передается параметр:
@@ -290,14 +367,7 @@
//
Процедура СохранитьДанныеВместеСПодписью(ОписаниеДанных, ОбработкаРезультата = Неопределено) Экспорт
- ПараметрыВыполнения = Новый Структура;
- ПараметрыВыполнения.Вставить("ОписаниеДанных", ОписаниеДанных);
- ПараметрыВыполнения.Вставить("ОбработкаРезультата", ОбработкаРезультата);
-
- ОбработкаПродолжения = Новый ОписаниеОповещения("СохранитьДанныеВместеСПодписьюНачало",
- ЭлектроннаяПодписьСлужебныйКлиент, ПараметрыВыполнения);
-
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОбработкаПродолжения);
+ ЭлектроннаяПодписьСлужебныйКлиент.СохранитьДанныеВместеСПодписью(ОписаниеДанных, ОбработкаРезультата);
КонецПроцедуры
@@ -306,9 +376,10 @@
// настроил проверку электронных подписей на сервере.
//
// Параметры:
-// МенеджерКриптографии - Неопределено - получить менеджер криптографии по-умолчанию
-// (менеджер первой программы в списке, как настроил администратор).
-// - МенеджерКриптографии - использовать указанный менеджер криптографии.
+// Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов:
+// Булево - Истина, если проверка выполнена успешно.
+// Строка - описание ошибки проверки подписи.
+// Неопределено - не удалось получить менеджер криптографии (когда не указан).
//
// ИсходныеДанные - ДвоичныеДанные - двоичные данные, которые были подписаны.
// Математическая проверка выполняется на стороне клиента, даже когда
@@ -317,156 +388,71 @@
// Это повышает производительность, а также безопасность когда проверяется
// подпись в расшифрованном файле (он не будет передан на сервер).
// - Строка - адрес временного хранилища, содержащего исходные двоичные данные.
-// - Строка - полное имя файла, содержащего данные, которые были подписаны
-// (в этом случае поведение аналогично поведению для типа ДвоичныеДанные).
//
// Подпись - ДвоичныеДанные - двоичные данные электронной подписи.
// - Строка - адрес временного хранилища, содержащего двоичные данные.
-// - Строка - полное имя файла, содержащего двоичные данные
-// электронной подписи.
//
-// ОписаниеОшибки - Null - вызвать исключение при ошибке проверки (для обратной совместимости).
-// - Строка - содержит описание ошибки, если произошла ошибка (в случае ошибки
-// получения менеджера криптографии, когда он не указан, содержит Неопределено).
-//
-// Возвращаемое значение:
-// Булево - Истина, если проверка выполнена успешно.
-// - Ложь, если не удалось получить менеджер криптографии (когда не указан),
-// или произошла ошибка указанная в параметре ОписаниеОшибки.
+// МенеджерКриптографии - Неопределено - получить менеджер криптографии по-умолчанию
+// (менеджер первой программы в списке, как настроил администратор).
+// - МенеджерКриптографии - использовать указанный менеджер криптографии.
//
-Функция ПроверитьПодпись(МенеджерКриптографии, ИсходныеДанные, Подпись, ОписаниеОшибки = Null) Экспорт
+Процедура ПроверитьПодпись(Оповещение, ИсходныеДанные, Подпись, МенеджерКриптографии = Неопределено) Экспорт
- МенеджерКриптографииДляПроверки = МенеджерКриптографии;
+ ЭлектроннаяПодписьСлужебныйКлиент.ПроверитьПодпись(Оповещение, ИсходныеДанные, Подпись, МенеджерКриптографии);
- Если Не ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ПроверятьЭлектронныеПодписиНаСервере Тогда
- // Проверка подписи и сертификата на стороне клиента.
- Если МенеджерКриптографииДляПроверки = Неопределено Тогда
- МенеджерКриптографииДляПроверки = МенеджерКриптографии("ПроверкаПодписи");
-
- Если МенеджерКриптографииДляПроверки = Неопределено Тогда
- ОписаниеОшибки = Неопределено;
- Возврат Ложь;
- КонецЕсли;
- КонецЕсли;
-
- ИсходныеДанныеДляПроверки = ИсходныеДанные;
- Если ТипЗнч(ИсходныеДанные) = Тип("Строка") И ЭтоАдресВременногоХранилища(ИсходныеДанные) Тогда
- ИсходныеДанныеДляПроверки = ПолучитьИзВременногоХранилища(ИсходныеДанные);
- КонецЕсли;
-
- ПодписьДляПроверки = Подпись;
- Если ТипЗнч(Подпись) = Тип("Строка") И ЭтоАдресВременногоХранилища(Подпись) Тогда
- ПодписьДляПроверки = ПолучитьИзВременногоХранилища(Подпись);
- КонецЕсли;
-
- Сертификат = Неопределено;
- Попытка
- МенеджерКриптографииДляПроверки.ПроверитьПодпись(ИсходныеДанныеДляПроверки, ПодписьДляПроверки, Сертификат);
- Исключение
- Если ОписаниеОшибки = Null Тогда
- ВызватьИсключение;
- КонецЕсли;
- ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
- Возврат Ложь;
- КонецПопытки;
-
- Если Не ПроверитьСертификат(МенеджерКриптографииДляПроверки, Сертификат, ОписаниеОшибки) Тогда
- Возврат Ложь;
- КонецЕсли;
-
- Возврат Истина;
- КонецЕсли;
-
- // Подготовка менеджера криптографии для определения возможности
- // математической проверки подписи на стороне клиента.
- Если МенеджерКриптографииДляПроверки = Неопределено Тогда
- МенеджерКриптографииДляПроверки = МенеджерКриптографии("ПроверкаПодписи", Ложь);
- КонецЕсли;
-
- Если МенеджерКриптографииДляПроверки <> Неопределено
- И Не (ТипЗнч(ИсходныеДанные) = Тип("Строка") И ЭтоАдресВременногоХранилища(ИсходныеДанные)) Тогда
- // Математическая проверка подписи на стороне клиента для повышения производительности и
- // безопасности в случае, когда ИсходныеДанные являются результатом расшифровки секретного файла.
-
- ПодписьДляПроверки = Подпись;
- Если ТипЗнч(Подпись) = Тип("Строка") И ЭтоАдресВременногоХранилища(Подпись) Тогда
- ПодписьДляПроверки = ПолучитьИзВременногоХранилища(Подпись);
- КонецЕсли;
-
- Сертификат = Неопределено;
- Попытка
- МенеджерКриптографииДляПроверки.ПроверитьПодпись(ИсходныеДанныеДляПроверки, ПодписьДляПроверки, Сертификат);
- Исключение
- Если ОписаниеОшибки = Null Тогда
- ВызватьИсключение;
- КонецЕсли;
- ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
- Возврат Ложь;
- КонецПопытки;
-
- // Проверка сертификата на сервере и на клиенте.
- Если Не ПроверитьСертификат(, Сертификат, ОписаниеОшибки) Тогда
- Возврат Ложь;
- КонецЕсли;
- Иначе
- // Проверка подписи и сертификата на сервере.
-
- Если ТипЗнч(ИсходныеДанные) = Тип("Строка") И ЭтоАдресВременногоХранилища(ИсходныеДанные) Тогда
- АдресИсходныхДанных = ИсходныеДанные;
-
- ИначеЕсли ТипЗнч(ИсходныеДанные) = Тип("ДвоичныеДанные") Тогда
- АдресИсходныхДанных = ПоместитьВоВременноеХранилище(ИсходныеДанные);
- Иначе
- ИсходныеДанныеДляПроверки = Новый ДвоичныеДанные(ИсходныеДанные);
- АдресИсходныхДанных = ПоместитьВоВременноеХранилище(ИсходныеДанныеДляПроверки);
- КонецЕсли;
-
- Если ТипЗнч(Подпись) = Тип("Строка") И ЭтоАдресВременногоХранилища(Подпись) Тогда
- АдресПодписи = Подпись;
-
- ИначеЕсли ТипЗнч(Подпись) = Тип("ДвоичныеДанные") Тогда
- АдресПодписи = ПоместитьВоВременноеХранилище(Подпись);
- Иначе
- ПодписьДляПроверки = Новый ДвоичныеДанные(Подпись);
- АдресПодписи = ПоместитьВоВременноеХранилище(ПодписьДляПроверки);
- КонецЕсли;
-
- Возврат ЭлектроннаяПодписьСлужебныйВызовСервера.ПроверитьПодпись(
- АдресИсходныхДанных, АдресПодписи, ОписаниеОшибки);
- КонецЕсли;
-
-КонецФункции
+КонецПроцедуры
// Шифрует данные, возвращает сертификаты шифрования и добавляет их объект, если указано.
//
+// Общий подход к обработке значений свойств с типом ОписаниеОповещения в параметре ОписаниеДанных.
+// При выполнении обработки оповещения в нее передается структура параметров, в которой всегда есть
+// свойство "Оповещение" типа ОписаниеОповещения, обработку которого нужно выполнить для продолжения.
+// Кроме того, в структуре всегда есть свойство ОписаниеДанных, полученное при вызове процедуры.
+// При вызове оповещения в качестве значения должна передаваться структура. Если в процессе асинхронного
+// выполнения возникает ошибка, тогда в эту структуру нужно вставить свойство ОписаниеОшибки типа Строка.
+//
// Параметры:
// ОписаниеДанных - Структура - со свойствами:
// * Операция - Строка - заголовок формы шифрования данных, например, Шифрование файла.
// * ЗаголовокДанных - Строка - заголовок элемента или набора данных, например Файл.
// * СообщитьОЗавершении - Булево - (необязательный) - если Ложь, то не будет показано оповещение о успешном
// завершении операции для представления данных, указанного рядом с заголовком.
-// * КонтекстОперации - Неопределено - (необязательный) - если указан, тогда в свойство будет
-// установлено определенное значение произвольного типа, которое позволяет
-// выполнить действие с теми же сертификатами шифрования повторно (у пользователя
-// не запрашивается подтверждение действия).
-// * -------// ------- - Произвольный - (необязательный) - если определено, то действие будет выполнено
-// с теми же сертификатами шифрования.
+// * НаборСертификатов - Строка - (необязательный) адрес временного хранилища, содержащего массив, описанный ниже.
+// - Массив - (необязательный) содержит значения
+// типа СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования или
+// типа ДвоичныеДанные (выгрузка сертификата).
+// - Ссылка - (необязательный) - ссылка на объект с табличной
+// частью СертификатыШифрования из которой их нужно получить.
+// * ИзменятьНабор - Булево - если Истина и НаборСертификатов задан и содержит только ссылки
+// на сертификаты, тогда будет возможность изменить состав сертификатов.
+// * БезПодтверждения - Булево - (необязательный) - пропустить подтверждение пользователя,
+// если указано свойство ОтборСертификатов.
// * ВыполнятьНаСервере - Неопределено, Булево - (необязательный) - когда не указан или Неопределено,
// тогда выполнение будет определено автоматически: если есть сервер, то сначала
// на сервере, потом при неудаче на клиенте, потом сообщение о двух ошибках.
// Когда Истина: если есть разрешено выполнение на сервере, тогда выполнение
// только на сервере, при неудаче одно сообщение об ошибке на сервере.
// Когда Ложь: выполнение только на клиенте, как будто нет сервера.
+// * КонтекстОперации - Неопределено - (необязательный) - если указан, тогда в свойство будет
+// установлено определенное значение произвольного типа, которое позволяет
+// выполнить действие с теми же сертификатами шифрования повторно (у пользователя
+// не запрашивается подтверждение действия).
+// * ------ // ------ - Произвольный - (необязательный) - если определено, то действие будет выполнено
+// с теми же сертификатами шифрования.
+// Параметр БезПодтверждения считается равным Истина.
+// Параметры Операция, ЗаголовокДанных, НаборСертификатов, ИзменятьНабор
+// и ВыполнятьНаСервере игнорируются, их значения остаются, как при первом вызове.
//
// Вариант 1:
// * Данные - ДвоичныеДанные - данные для шифрования.
-// * --// -- - Строка - адрес временного хранилища, содержащего двоичные данные.
-// * --// -- - ОписаниеОповещения - описание обработчика получения данных,
-// в параметр переданный в этот обработчик.
+// * -- // -- - Строка - адрес временного хранилища, содержащего двоичные данные.
+// * -- // -- - ОписаниеОповещения - обработчик получения данных, который возвращает
+// их в свойстве Данные (см. выше общий подход).
// * РазмещениеРезультата - Неопределено - (необязательный) - описывает куда поместить зашифрованные данные.
// Если не указан или Неопределено, тогда через параметр ОбработкаРезультата.
-// * --// -- - ОписаниеОповещения - описание обработчика сохранения зашифрованных данных.
-// В обработчик передается ОписаниеДанных с параметром ЗашифрованныеДанные.
+// * -- // -- - ОписаниеОповещения - обработчик сохранения зашифрованных данных.
+// Следует учесть общий подход (см. выше).
+// В момент вызова в ОписаниеДанных уже вставлен параметр ЗашифрованныеДанные.
// В случае параметра НаборДанных, в ОписаниеДанных вставляется
// свойство ТекущийЭлементНабораДанных, содержащее параметр ЗашифрованныеДанные.
// * Объект - Ссылка - (необязательный) - ссылка на объект с табличной частью.
@@ -476,7 +462,9 @@
// блокировки объекта перед добавлением сертификатов шифрования.
// * Представление - Ссылка, Строка, Структура - (необязательный), если не указан, тогда
// представление вычисляется по значению свойства Объект.
-// Структура содержит свойства Значение и Представление.
+// Структура содержит свойства:
+// * Значение - Ссылка, ОписаниеОповещения - для открытия.
+// * Представление - Строка - представление значения.
// Вариант 2:
// * НаборДанных - Массив - структуры со свойствами, описанными в Варианте 1.
// * ПредставлениеНабора - Строка - представления нескольких элементов набора данных, например, "Файлы (%1)".
@@ -522,15 +510,22 @@
ЭлектроннаяПодписьСлужебныйКлиент, КлиентскиеПараметры);
Если ОписаниеДанных.Свойство("КонтекстОперации")
- И ОписаниеДанных.КонтекстОперации <> Неопределено Тогда
-
- ОписаниеДанных.КонтекстОперации.ВыполнитьШифрование(КлиентскиеПараметры, ОбработкаЗавершения);
- Возврат;
+ И ТипЗнч(ОписаниеДанных.КонтекстОперации) = Тип("УправляемаяФорма") Тогда
+
+ ЭлектроннаяПодписьСлужебныйКлиент.ПродлитьХранениеКонтекстаОперации(ОписаниеДанных);
+ НачалоИмениФормы = "Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.";
+
+ Если ОписаниеДанных.КонтекстОперации.ИмяФормы = НачалоИмениФормы + "ШифрованиеДанных" Тогда
+ ОписаниеДанных.КонтекстОперации.ВыполнитьШифрование(КлиентскиеПараметры, ОбработкаЗавершения);
+ Возврат;
+ КонецЕсли;
КонецЕсли;
СерверныеПараметры = Новый Структура;
СерверныеПараметры.Вставить("Операция", НСтр("ru = 'Шифрование данных'"));
СерверныеПараметры.Вставить("ЗаголовокДанных", НСтр("ru = 'Данные'"));
+ СерверныеПараметры.Вставить("НаборСертификатов");
+ СерверныеПараметры.Вставить("ИзменятьНабор");
СерверныеПараметры.Вставить("ВыполнятьНаСервере");
ЗаполнитьЗначенияСвойств(СерверныеПараметры, ОписаниеДанных);
@@ -541,6 +536,13 @@
// Расшифровывает данные, возвращает их и помещает в объект, если указано.
//
+// Общий подход к обработке значений свойств с типом ОписаниеОповещения в параметре ОписаниеДанных.
+// При выполнении обработки оповещения в нее передается структура параметров, в которой всегда есть
+// свойство "Оповещение" типа ОписаниеОповещения, обработку которого нужно выполнить для продолжения.
+// Кроме того, в структуре всегда есть свойство ОписаниеДанных, полученное при вызове процедуры.
+// При вызове оповещения в качестве значения должна передаваться структура. Если в процессе асинхронного
+// выполнения возникает ошибка, тогда в эту структуру нужно вставить свойство ОписаниеОшибки типа Строка.
+//
// Параметры:
// ОписаниеДанных - Структура - со свойствами:
// * Операция - Строка - заголовок формы расшифровки данных, например, Расшифровка файла.
@@ -558,20 +560,14 @@
// в) либо пароль установлен ранее методом УстановитьПарольСертификата.
// Если в процессе расшифровки возникла ошибка, тогда будет открыта форма
// с возможностью указать пароль.
-// * КонтекстОперации - Неопределено - (необязательный) - если указан, тогда в свойство будет
-// установлено определенное значение произвольного типа, которое позволяет
-// выполнить действие с тем же сертификатом повторно (у пользователя
-// не запрашивается ни пароль, ни подтверждение действия).
-// * -------// ------- - Произвольный - (необязательный) - если определено, то действие будет выполнено
-// с тем же сертификатом без запроса пароля или подтверждения. Параметр.
-// ОтборСертификатов игнорируется, а параметр БезПодтверждения считается Истина.
// * ЭтоАутентификация - Булево - (необязательный) - если указан Истина, то вместо кнопки Расшифровать
// будет показана кнопка ОК. А также скорректированы некоторые надписи.
// Кроме того, параметр СообщитьОЗавершении устанавливается Ложь.
-// * ПередВыполнением - ОписаниеОповещения - описание обработчика дополнительной подготовки данных,
-// после выбора сертификата, которым будут расшифрованы данные. В этом обработчике
-// можно заполнить параметр Данные, если необходимо. В момент вызова уже вставлен
-// выбранный сертификат в ОписаниеДанных, как ВыбранныйСертификат (см. ниже).
+// * ПередВыполнением - ОписаниеОповещения - (необязательный) - описание обработчика дополнительной
+// подготовки данных, после выбора сертификата, которым будут расшифрованы данные.
+// В этом обработчике можно заполнить параметр Данные, если необходимо.
+// В момент вызова в ОписаниеДанных уже вставлен выбранный сертификат,
+// как ВыбранныйСертификат (см. ниже). Следует учесть общий подход (см. выше).
// * ВыполнятьНаСервере - Неопределено, Булево - (необязательный) - когда не указан или Неопределено,
// тогда выполнение будет определено автоматически: если есть сервер, то сначала
// на сервере, потом при неудаче на клиенте, потом сообщение о двух ошибках.
@@ -581,24 +577,39 @@
// * ПараметрыДополнительныхДействий - Произвольный - (необязательный) - если указан, то передается
// на сервер в процедуру ПередНачаломОперации общего модуля.
// ЭлектроннаяПодписьПереопределяемый, как ВходныеПараметры.
+// * КонтекстОперации - Неопределено - (необязательный) - если указан, тогда в свойство будет
+// установлено определенное значение произвольного типа, которое позволяет
+// выполнить действие с тем же сертификатом повторно (у пользователя
+// не запрашивается ни пароль, ни подтверждение действия).
+// * ------ // ------ - Произвольный - (необязательный) - если определено, то действие будет выполнено
+// с тем же сертификатом без запроса пароля или подтверждения.
+// Параметр БезПодтверждения считается равным Истина.
+// Параметры Операция, ЗаголовокДанных, ОтборСертификатов, ЭтоАутентификация
+// и ВыполнятьНаСервере игнорируются, их значения остаются, как при первом вызове.
+// Параметр ПараметрыДополнительныхДействий игнорируется.
+// Процедура ПередНачаломОперации не вызывается.
+// Если передать контекст, возвращенный процедурой Подписать, тогда
+// пароль, введенный для сертификата, может быть использован, как если бы
+// пароль был сохранен на время сеанса. В остальном контекст игнорируется.
//
// Вариант 1:
// * Данные - ДвоичныеДанные - данные для расшифровки.
-// * --// -- - Строка - адрес временного хранилища, содержащего двоичные данные.
-// * --// -- - ОписаниеОповещения - описание обработчика получения данных,
-// в параметр, переданный в этот обработчик. В момент вызова в.
-// ОписаниеДанных уже вставлен параметр ВыбранныйСертификат (см. ниже).
+// * -- // -- - Строка - адрес временного хранилища, содержащего двоичные данные.
+// * -- // -- - ОписаниеОповещения - обработчик получения данных, который возвращает
+// их в свойстве Данные (см. выше общий подход). В момент вызова
+// в ОписаниеДанных уже вставлен параметр ВыбранныйСертификат (см. ниже).
// * РазмещениеРезультата - Неопределено - (необязательный) - описывает куда поместить расшифрованные данные.
// Если не указан или Неопределено, тогда через параметр ОбработкаРезультата.
-// * --// -- - ОписаниеОповещения - описание обработчика сохранения расшифрованных данных.
-// В обработчик передается ОписаниеДанных с параметром РасшифрованныеДанные.
+// * -- // -- - ОписаниеОповещения - обработчик сохранения расшифрованных данных.
+// Следует учесть общий подход (см. выше).
+// В момент вызова в ОписаниеДанных уже вставлен параметр РасшифрованныеДанные.
// В случае параметра НаборДанных, в ОписаниеДанных вставляется
// свойство ТекущийЭлементНабораДанных, содержащее параметр РасшифрованныеДанные.
// * Объект - Ссылка - (необязательный) - ссылка на объект с табличной частью.
// СертификатыШифрования, из которой нужно получить сертификаты,
// а также очистить после успешного завершения расшифровки.
// Если не указан, то сертификаты не требуется получать из объекта и очищать.
-// * --// -- - Строка - адрес временного хранилища, содержащего массив сертификатов
+// * -- // -- - Строка - адрес временного хранилища, содержащего массив сертификатов
// шифрования в виде структур со свойствами:
// * Отпечаток - Строка - отпечаток сертификата в формате строки Base64.
// * Представление - Строка - сохраненное представление субъекта,
@@ -607,7 +618,10 @@
// который использовался для шифрования.
// * Представление - Ссылка, Строка, Структура - (необязательный), если не указан, тогда
// представление вычисляется по значению свойства Объект.
-// Структура содержит свойства Значение и Представление.
+// Структура содержит свойства:
+// * Значение - Ссылка, ОписаниеОповещения - для открытия.
+// * Представление - Строка - представление значения.
+//
// Вариант 2:
// * НаборДанных - Массив - структуры со свойствами, описанными в Варианте 1.
// * ПредставлениеНабора - Строка - представления нескольких элементов набора данных, например, "Файлы (%1)".
@@ -653,10 +667,18 @@
ЭлектроннаяПодписьСлужебныйКлиент, КлиентскиеПараметры);
Если ОписаниеДанных.Свойство("КонтекстОперации")
- И ОписаниеДанных.КонтекстОперации <> Неопределено Тогда
-
- ОписаниеДанных.КонтекстОперации.ВыполнитьРасшифровку(КлиентскиеПараметры, ОбработкаЗавершения);
- Возврат;
+ И ТипЗнч(ОписаниеДанных.КонтекстОперации) = Тип("УправляемаяФорма") Тогда
+
+ ЭлектроннаяПодписьСлужебныйКлиент.ПродлитьХранениеКонтекстаОперации(ОписаниеДанных);
+ НачалоИмениФормы = "Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.";
+
+ Если ОписаниеДанных.КонтекстОперации.ИмяФормы = НачалоИмениФормы + "РасшифровкаДанных" Тогда
+ ОписаниеДанных.КонтекстОперации.ВыполнитьРасшифровку(КлиентскиеПараметры, ОбработкаЗавершения);
+ Возврат;
+ КонецЕсли;
+ Если ОписаниеДанных.КонтекстОперации.ИмяФормы = НачалоИмениФормы + "ПодписаниеДанных" Тогда
+ КлиентскиеПараметры.Вставить("УказанКонтекстДругойОперации");
+ КонецЕсли;
КонецЕсли;
СерверныеПараметры = Новый Структура;
@@ -698,83 +720,24 @@
// Проверяет действительность сертификата криптографии.
//
// Параметры:
-// МенеджерКриптографии - Неопределено - получить менеджер криптографии автоматически.
-// - МенеджерКриптографии - использовать указанный менеджер криптографии
-// (проверка на сервере не будет выполнена).
+// Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов:
+// Булево - Истина, если проверка выполнена успешно.
+// Строка - описание ошибки проверки сертификата.
+// Неопределено - не удалось получить менеджер криптографии (когда не указан).
//
// Сертификат - СертификатКриптографии - сертификат.
// - ДвоичныеДанные - двоичные данные сертификата.
// - Строка - адрес временного хранилища, содержащего двоичные данные сертификата.
//
-// ОписаниеОшибки - Строка - содержит описание ошибки, если произошла ошибка (в случае ошибки
-// получения менеджера криптографии, когда он не указан, содержит Неопределено).
+// МенеджерКриптографии - Неопределено - получить менеджер криптографии автоматически.
+// - МенеджерКриптографии - использовать указанный менеджер криптографии
+// (проверка на сервере не будет выполнена).
//
-// Возвращаемое значение:
-// Булево - Истина, если проверка выполнена успешно,
-// - Ложь, если не удалось получить менеджер криптографии (когда не указан).
-//
-Функция ПроверитьСертификат(МенеджерКриптографии, Сертификат, ОписаниеОшибки) Экспорт
+Процедура ПроверитьСертификат(Оповещение, Сертификат, МенеджерКриптографии = Неопределено) Экспорт
- Если МенеджерКриптографии <> Неопределено Тогда
- // Когда менеджер криптографии указан, тогда выполняется проверка на клиенте.
- ТекущееОписаниеОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаПроверкиСертификата(
- МенеджерКриптографии, Сертификат);
-
- Если ТекущееОписаниеОшибки = Неопределено Тогда
- Возврат Истина;
- КонецЕсли;
- ОписаниеОшибки = ТекущееОписаниеОшибки;
- Возврат Ложь;
- КонецЕсли;
+ ЭлектроннаяПодписьСлужебныйКлиент.ПроверитьСертификат(Оповещение, Сертификат, МенеджерКриптографии);
- ОбщиеНастройки = ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки();
-
- Если ОбщиеНастройки.ПроверятьЭлектронныеПодписиНаСервере Тогда
-
- // Проверка сертификата на сервере.
- Если ТипЗнч(Сертификат) = Тип("СертификатКриптографии") Тогда
- АдресСертификата = ПоместитьВоВременноеХранилище(Сертификат.Выгрузить());
-
- ИначеЕсли ТипЗнч(Сертификат) = Тип("ДвоичныеДанные") Тогда
- АдресСертификата = ПоместитьВоВременноеХранилище(Сертификат);
- Иначе
- АдресСертификата = Сертификат;
- КонецЕсли;
-
- ТекущееОписаниеОшибки = Неопределено;
- Если ЭлектроннаяПодписьСлужебныйВызовСервера.ПроверитьСертификат(АдресСертификата, ТекущееОписаниеОшибки) Тогда
- Возврат Истина;
- КонецЕсли;
- КонецЕсли;
-
- // Проверка сертификата на клиенте.
- МенеджерКриптографииДляПроверки = МенеджерКриптографии(
- "ПроверкаСертификата", ТекущееОписаниеОшибки = Неопределено);
-
- Если МенеджерКриптографииДляПроверки = Неопределено Тогда
- Если ТекущееОписаниеОшибки = Неопределено Тогда
- ОписаниеОшибки = Неопределено;
- Иначе
- ОписаниеОшибки = ТекущееОписаниеОшибки;
- КонецЕсли;
- Возврат Ложь;
- КонецЕсли;
-
- ОписаниеОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ОшибкаПроверкиСертификата(
- МенеджерКриптографииДляПроверки, Сертификат);
-
- Если ОписаниеОшибки = Неопределено Тогда
- Возврат Истина;
- КонецЕсли;
-
- Если ТекущееОписаниеОшибки <> Неопределено Тогда
- ОписаниеОшибки = ТекущееОписаниеОшибки + " " + НСтр("ru = '(на сервере)'") + Символы.ПС
- + ОписаниеОшибки + " " + НСтр("ru = '(на клиенте)'");
- КонецЕсли;
-
- Возврат Ложь;
-
-КонецФункции
+КонецПроцедуры
// Открывает форму ПроверкаСертификата и возвращает результат проверки.
//
@@ -796,7 +759,8 @@
// проверка будет выполнена сразу без открытия формы.
// Если режим ПроверкаПриВыборе и установлен параметр ОбработкаРезультата, то
// форма не будет открыта, если параметр ПроверкиПройдены установлен Истина.
-// * ОбработкаЗавершения - ОписаниеОповещения - вызывается при закрытии формы.
+// * ОбработкаЗавершения - ОписаниеОповещения - вызывается при закрытии формы, в качестве результата
+// передается Неопределено или значение ПроверкиПройдены (см. ниже).
// * Результат - Неопределено - проверка ни разу не выполнялась.
// - Структура - (возвращаемое значение) - вставляется перед обработкой результата,
// содержит свойства:
@@ -805,7 +769,7 @@
// * ПроверкиНаСервере - Неопределено - проверка не выполнялась на сервере:
// - Структура - со свойствами, как в следующем параметре.
// * ПроверкиНаКлиенте - Структура - со свойствами:
-// * НаличиеСертификата - Булево, Неопределено - если Истина, тогда проверка прошла успешно, если.
+// * НаличиеСертификата - Булево, Неопределено - если Истина, тогда проверка прошла успешно, если
// Ложь - проверка прошла не успешно, если Неопределено - не выполнялась.
// * ДанныеСертификата - Булево, Неопределено - также, как указано выше.
// * НаличиеПрограммы - Булево, Неопределено - также, как указано выше.
@@ -824,6 +788,46 @@
КонецПроцедуры
+// Находит сертификат на компьютере по строке отпечатка.
+//
+// Параметры:
+// Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов:
+// СертификатКриптографии - найденный сертификат.
+// Неопределено - сертификат не найден в хранилище.
+// Строка - текст ошибки создания менеджера криптографии (или другая ошибка).
+//
+// Отпечаток - Строка - Base64 кодированный отпечаток сертификата.
+// ТолькоВЛичномХранилище - Булево - если Истина, тогда искать в личном хранилище, иначе везде.
+// ПоказатьОшибку - Булево - если Ложь, тогда ошибка, текст который будет возвращен, не будет показана.
+//
+Процедура ПолучитьСертификатПоОтпечатку(Оповещение, Отпечаток, ТолькоВЛичномХранилище, ПоказатьОшибку = Истина) Экспорт
+
+ Если ТипЗнч(ПоказатьОшибку) <> Тип("Булево") Тогда
+ ПоказатьОшибку = Истина;
+ КонецЕсли;
+
+ ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьСертификатПоОтпечатку(Оповещение,
+ Отпечаток, ТолькоВЛичномХранилище, ПоказатьОшибку);
+
+КонецПроцедуры
+
+// Получает отпечатки сертификатов пользователя ОС на компьютере.
+//
+// Параметры:
+// Оповещение - ОписаниеОповещение - вызывается для передачи возвращаемого значение:
+// * Соответствие - Ключ - отпечаток в формате строки Base64, а Значение - Истина;
+// * Строка - текст ошибки создания менеджера криптографии (или другая ошибка).
+//
+// ТолькоЛичные - Булево - Если Ложь, то к личным сертификатам добавляются сертификаты получателей.
+//
+// ПоказатьОшибку - Булево - показать ошибку создания менеджера криптографии.
+//
+Процедура ПолучитьОтпечаткиСертификатов(Оповещение, ТолькоЛичные, ПоказатьОшибку = Истина) Экспорт
+
+ ЭлектроннаяПодписьСлужебныйКлиент.ПолучитьОтпечаткиСертификатов(Оповещение, ТолькоЛичные, ПоказатьОшибку);
+
+КонецПроцедуры
+
// Показывает диалог установки расширения для работы с электронной подписью и шифрованием.
//
// Параметры:
@@ -842,23 +846,7 @@
//
Процедура УстановитьРасширение(БезВопроса, ОбработчикРезультата = Неопределено, ТекстВопроса = "", ЗаголовокВопроса = "") Экспорт
- Если ПодключитьРасширениеРаботыСКриптографией() Тогда
- ВыполнитьОбработкуОповещения(ОбработчикРезультата, Истина);
- Возврат;
- КонецЕсли;
-
- ДополнительныеПараметры = Новый Структура;
- ДополнительныеПараметры.Вставить("ОбработчикРезультата", ОбработчикРезультата);
- ДополнительныеПараметры.Вставить("ТекстВопроса", ТекстВопроса);
- ДополнительныеПараметры.Вставить("ЗаголовокВопроса", ЗаголовокВопроса);
- ДополнительныеПараметры.Вставить("БезВопроса", БезВопроса);
-
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(
- Новый ОписаниеОповещения("УстановитьРасширениеПродолжение",
- ЭлектроннаяПодписьСлужебныйКлиент, ДополнительныеПараметры),
- НСтр("ru = 'Перед установкой расширения для работы с электронной подписью и шифрованием
- |необходимо установить расширение для работы с файлами.'"),
- Ложь);
+ ЭлектроннаяПодписьСлужебныйКлиент.УстановитьРасширение(БезВопроса, ОбработчикРезультата, ТекстВопроса, ЗаголовокВопроса);
КонецПроцедуры
@@ -1029,41 +1017,7 @@
// Сохраняет подпись на диск
Процедура СохранитьПодпись(АдресПодписи) Экспорт
- РасширениеДляФайловПодписи = ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки().РасширениеДляФайловПодписи;
-
- ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
-
- Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Файлы электронных подписей (*.%1)|*.%1|Все файлы (*.*)|*.*'"),
- РасширениеДляФайловПодписи);
-
- ДиалогОткрытияФайла.Фильтр = Фильтр;
- ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
- ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файл для сохранения подписи'");
-
- Если ДиалогОткрытияФайла.Выбрать() Тогда
-
- ПолныйПутьПодписи = ДиалогОткрытияФайла.ПолноеИмяФайла;
-
- Файл = Новый Файл(ПолныйПутьПодписи);
- ПередаваемыеФайлы = Новый Массив;
- Описание = Новый ОписаниеПередаваемогоФайла(ПолныйПутьПодписи, АдресПодписи);
- ПередаваемыеФайлы.Добавить(Описание);
-
- ПутьКФайлу = Файл.Путь;
- ПутьКФайлу = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПутьКФайлу);
-
- // Сохранение Файла из информационной базы на диск.
- ПолучитьФайлы(ПередаваемыеФайлы,, ПутьКФайлу, Ложь);
-
- Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Электронная подпись сохранена в файл
- |""%1"".'"),
- ДиалогОткрытияФайла.ПолноеИмяФайла);
-
- Состояние(Текст);
-
- КонецЕсли;
+ ЭлектроннаяПодписьСлужебныйКлиент.СохранитьПодпись(АдресПодписи);
КонецПроцедуры
@@ -1082,56 +1036,10 @@
//
Процедура ОткрытьСертификат(ДанныеСертификата, ОткрытьДанные = Ложь) Экспорт
- Если ТипЗнч(ДанныеСертификата) = Тип("СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования") Тогда
- Ссылка = ДанныеСертификата;
-
- ИначеЕсли ТипЗнч(ДанныеСертификата) = Тип("ДвоичныеДанные") Тогда
- АдресСертификата = ПоместитьВоВременноеХранилище(ДанныеСертификата);
-
- ИначеЕсли ТипЗнч(ДанныеСертификата) = Тип("СертификатКриптографии") Тогда
- АдресСертификата = ПоместитьВоВременноеХранилище(ДанныеСертификата.Выгрузить());
-
- ИначеЕсли ТипЗнч(ДанныеСертификата) <> Тип("Строка") Тогда
- ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Ошибка при вызове процедуры ОткрытьСертификат общего модуля ЭлектроннаяПодписьКлиент:
- |Некорректное значение параметра ДанныеСертификата ""%1"".'"), Строка(ДанныеСертификата));
-
- ИначеЕсли ЭтоАдресВременногоХранилища(ДанныеСертификата) Тогда
- АдресСертификата = ДанныеСертификата;
- Иначе
- Отпечаток = ДанныеСертификата;
- КонецЕсли;
-
- Если Не ОткрытьДанные Тогда
- Если Ссылка = Неопределено Тогда
- Ссылка = ЭлектроннаяПодписьСлужебныйВызовСервера.СсылкаНаСертификат(Отпечаток, АдресСертификата);
- КонецЕсли;
- Если ЗначениеЗаполнено(Ссылка) Тогда
- ПоказатьЗначение(, Ссылка);
- Возврат;
- КонецЕсли;
- КонецЕсли;
-
- Если АдресСертификата = Неопределено И Ссылка = Неопределено Тогда
- Сертификат = ПолучитьСертификатПоОтпечатку(Отпечаток, Ложь, , Ложь);
- Если Сертификат <> Неопределено Тогда
- АдресСертификата = ПоместитьВоВременноеХранилище(Сертификат.Выгрузить());
- КонецЕсли;
- КонецЕсли;
-
- ПараметрыФормы = Новый Структура;
- ПараметрыФормы.Вставить("Ссылка", Ссылка);
- ПараметрыФормы.Вставить("АдресСертификата", АдресСертификата);
- ПараметрыФормы.Вставить("Отпечаток", Отпечаток);
-
- ОткрытьФорму("ОбщаяФорма.Сертификат", ПараметрыФормы);
+ ЭлектроннаяПодписьСлужебныйКлиент.ОткрытьСертификат(ДанныеСертификата, ОткрытьДанные);
КонецПроцедуры
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
// По окончании подписания сообщает о подписании.
//
// Параметры:
@@ -1146,22 +1054,19 @@
Если ИзФайла Тогда
Если МножествоДанных Тогда
- ШаблонСообщения = НСтр("ru = 'Добавлены подписи из файлов для ""%1""'");
+ ТекстСообщения = НСтр("ru = 'Добавлены подписи из файлов:'");
Иначе
- ШаблонСообщения = НСтр("ru = 'Добавлена подпись из файла для ""%1""'");
+ ТекстСообщения = НСтр("ru = 'Добавлена подпись из файла:'");
КонецЕсли;
Иначе
Если МножествоДанных Тогда
- ШаблонСообщения = НСтр("ru = 'Установлены подписи для ""%1""'");
+ ТекстСообщения = НСтр("ru = 'Установлены подписи:'");
Иначе
- ШаблонСообщения = НСтр("ru = 'Установлена подпись для ""%1""'");
+ ТекстСообщения = НСтр("ru = 'Установлена подпись:'");
КонецЕсли;
КонецЕсли;
- ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- ШаблонСообщения, ПредставлениеДанных);
-
- Состояние(ТекстСообщения);
+ ПоказатьОповещениеПользователя(ТекстСообщения, , ПредставлениеДанных);
КонецПроцедуры
@@ -1175,16 +1080,9 @@
//
Процедура ИнформироватьОШифрованииОбъекта(ПредставлениеДанных, МножествоДанных = Ложь) Экспорт
- Если МножествоДанных Тогда
- ШаблонСообщения = НСтр("ru = '""%1"" зашифрованы.'");
- Иначе
- ШаблонСообщения = НСтр("ru = '""%1"" зашифрован.'");
- КонецЕсли;
+ ТекстСообщения = НСтр("ru = 'Выполнено шифрование:'");
- ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- ШаблонСообщения, ПредставлениеДанных);
-
- Состояние(ТекстСообщения);
+ ПоказатьОповещениеПользователя(ТекстСообщения, , ПредставлениеДанных);
КонецПроцедуры
@@ -1198,271 +1096,9 @@
//
Процедура ИнформироватьОРасшифровкеОбъекта(ПредставлениеДанных, МножествоДанных = Ложь) Экспорт
- Если МножествоДанных Тогда
- ШаблонСообщения = НСтр("ru = '""%1"" расшифрованы.'");
- Иначе
- ШаблонСообщения = НСтр("ru = '""%1"" расшифрован.'");
- КонецЕсли;
+ ТекстСообщения = НСтр("ru = 'Выполнена расшифровка:'");
- ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- ШаблонСообщения, ПредставлениеДанных);
-
- Состояние(ТекстСообщения);
-
-КонецПроцедуры
-
-// Находит сертификат на компьютере по строке отпечатка.
-//
-// Параметры:
-// Отпечаток - Строка - Base64 кодированный отпечаток сертификата.
-// ТолькоВЛичномХранилище - Булево - Если Истина, то поиск производится только в личном хранилище.
-//
-// Возвращаемое значение:
-// СертификатКриптографии - сертификат электронной подписи и шифрования.
-// Неопределено - сертификат не найден.
-//
-Функция ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище,
- Программа = Неопределено, ПоказатьОшибку = Истина, ОписаниеОшибки = "") Экспорт
-
- МенеджерКриптографии = ЭлектроннаяПодписьСлужебныйКлиент.МенеджерКриптографии("ПолучениеСертификатов",
- ПоказатьОшибку, ОписаниеОшибки, Программа);
-
- Если МенеджерКриптографии = Неопределено Тогда
- Возврат Неопределено;
- КонецЕсли;
-
- Сертификат = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПолучитьСертификатПоОтпечатку(
- МенеджерКриптографии, Отпечаток, ТолькоВЛичномХранилище, ПоказатьОшибку, ОписаниеОшибки);
-
- Если Сертификат = Неопределено Тогда
- ТекстОшибки = НСтр("ru = 'Сертификат не найден на компьютере.'");
- Если ТипЗнч(ОписаниеОшибки) = Тип("Структура") Тогда
- ОписаниеОшибки.Вставить("ОписаниеОшибки", ТекстОшибки);
- Иначе
- ОписаниеОшибки = ТекстОшибки;
- КонецЕсли;
- КонецЕсли;
-
- Возврат Сертификат;
-
-КонецФункции
-
-// Заполняет структуру полями сертификата.
-//
-// Параметры:
-// Отпечаток - Строка - Base64 кодированный отпечаток сертификата.
-//
-// Возвращаемое значение:
-// Структура - Структура с полями сертификата.
-//
-Функция ЗаполнитьСтруктуруСертификатаПоОтпечатку(Отпечаток) Экспорт
-
- ДвоичныеДанныеОтпечатка = Base64Значение(Отпечаток);
-
- МенеджерКриптографии = МенеджерКриптографии("ПолучениеСертификатов");
- Если МенеджерКриптографии = Неопределено Тогда
- Возврат Неопределено;
- КонецЕсли;
-
- ХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов();
- Сертификат = ХранилищеСертификатов.НайтиПоОтпечатку(ДвоичныеДанныеОтпечатка);
-
- Если Сертификат = Неопределено Тогда
- ПоказатьПредупреждение(, НСтр("ru = 'Сертификат не найден'"));
- Возврат Неопределено;
- КонецЕсли;
-
- Возврат ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат);
-
-КонецФункции
-
-// Получает массив структур сертификатов для показа в диалоге выбора сертификатов для подписи или шифрования.
-//
-// Параметры:
-// ТолькоЛичные - Булево - Если Ложь, то берутся также и сертификаты получателей.
-//
-// Возвращаемое значение:
-// Массив - массив структур с полями сертификата.
-//
-Функция ПолучитьМассивСтруктурСертификатов(Знач ТолькоЛичные) Экспорт
-
- МассивСтруктурСертификатов = Новый Массив;
-
- МенеджерКриптографии = МенеджерКриптографии("ПолучениеСертификатов");
- Если МенеджерКриптографии = Неопределено Тогда
- Возврат МассивСтруктурСертификатов;
- КонецЕсли;
-
- // Используется для выявления истекших сертификатов, которые хранятся на клиентском компьютере.
- ТекущаяДата = ОбщегоНазначенияКлиент.ДатаУниверсальная();
-
- Хранилище = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
- СертификатыХранилища = Хранилище.ПолучитьВсе();
-
- МассивСтрокОтпечатков = Новый Массив;
-
- Для Каждого Сертификат Из СертификатыХранилища Цикл
- Если Сертификат.ДатаОкончания < ТекущаяДата Тогда
- Продолжить; // Пропуск истекших сертификатов.
- КонецЕсли;
-
- СтруктураСертификата = ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат);
- Если СтруктураСертификата <> Неопределено Тогда
- СтрокаОтпечатка = Base64Строка(Сертификат.Отпечаток);
-
- Если МассивСтрокОтпечатков.Найти(СтрокаОтпечатка) = Неопределено Тогда
- МассивСтрокОтпечатков.Добавить(СтрокаОтпечатка);
- МассивСтруктурСертификатов.Добавить(СтруктураСертификата);
- КонецЕсли;
- КонецЕсли;
-
- КонецЦикла;
-
- Если НЕ ТолькоЛичные Тогда
- Хранилище = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.СертификатыПолучателей);
- СертификатыХранилища = Хранилище.ПолучитьВсе();
-
- Для Каждого Сертификат Из СертификатыХранилища Цикл
- Если Сертификат.ДатаОкончания < ТекущаяДата Тогда
- Продолжить; // Пропуск истекших сертификатов.
- КонецЕсли;
-
- СтруктураСертификата = ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат);
- Если СтруктураСертификата <> Неопределено Тогда
- СтрокаОтпечатка = Base64Строка(Сертификат.Отпечаток);
-
- Если МассивСтрокОтпечатков.Найти(СтрокаОтпечатка) = Неопределено Тогда
- МассивСтрокОтпечатков.Добавить(СтрокаОтпечатка);
- МассивСтруктурСертификатов.Добавить(СтруктураСертификата);
- КонецЕсли;
- КонецЕсли;
-
- КонецЦикла;
- КонецЕсли;
-
- Возврат МассивСтруктурСертификатов;
-
-КонецФункции
-
-// Сохраняет сертификат в файл на диск.
-//
-// Параметры:
-// Сертификат - СертификатКриптографии - сертификат.
-// - ДвоичныеДанные - двоичные данные сертификата.
-// - Строка - адрес временного хранилища, содержащего двоичные данные сертификата.
-//
-Процедура СохранитьСертификат(Сертификат, ИмяФайлаБезРасширения = "") Экспорт
-
- Параметры = Новый Структура;
- Параметры.Вставить("Сертификат", Сертификат);
- Параметры.Вставить("ИмяФайлаБезРасширения", ИмяФайлаБезРасширения);
-
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(
- Новый ОписаниеОповещения("СохранитьСертификатПослеУстановкиРасширения", ЭтотОбъект, Параметры));
-
-КонецПроцедуры
-
-// Продолжение процедуры СохранитьСертификат.
-Процедура СохранитьСертификатПослеУстановкиРасширения(РасширениеПодключено, Параметры) Экспорт
-
- Сертификат = Параметры.Сертификат;
- ИмяФайлаБезРасширения = Параметры.ИмяФайлаБезРасширения;
-
- Если ТипЗнч(Сертификат) = Тип("СертификатКриптографии") Тогда
- АдресСертификата = ПоместитьВоВременноеХранилище(Сертификат.Выгрузить());
-
- ИначеЕсли ТипЗнч(Сертификат) = Тип("ДвоичныеДанные") Тогда
- АдресСертификата = ПоместитьВоВременноеХранилище(Сертификат);
-
- ИначеЕсли ТипЗнч(Сертификат) = Тип("Строка") И ЭтоАдресВременногоХранилища(Сертификат) Тогда
- АдресСертификата = Сертификат;
- Иначе
- Возврат;
- КонецЕсли;
-
- Если Не ЗначениеЗаполнено(ИмяФайлаБезРасширения) Тогда
- ИмяФайлаБезРасширения = ЭлектроннаяПодписьСлужебныйВызовСервера.ПредставлениеСертификата(АдресСертификата);
- КонецЕсли;
- ИмяФайла = ЭлектроннаяПодписьСлужебныйКлиент.ПодготовитьСтрокуДляИмениФайла(ИмяФайлаБезРасширения) + ".cer";
-
- Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
- Результат = ПолучитьФайл(АдресСертификата, ИмяФайла);
- Если Результат = Ложь Или Результат = Неопределено Тогда
- Возврат;
- КонецЕсли;
- Иначе
- Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
- Диалог.Заголовок = НСтр("ru = 'Выберите файл для сохранения сертификата'");
- Диалог.Фильтр = НСтр("ru = 'Файлы сертификатов (*.cer)|*.cer|Все файлы (*.*)|*.*'");
- Диалог.МножественныйВыбор = Ложь;
-
- ПолучаемыеФайлы = Новый Массив;
- ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла, АдресСертификата));
-
- Если Не ПолучитьФайлы(ПолучаемыеФайлы, , Диалог) Тогда
- Возврат;
- КонецЕсли;
- КонецЕсли;
-
- Состояние(НСтр("ru = 'Сертификат сохранен в файл.'"));
-
-КонецПроцедуры
-
-// Сохраняет запрос на сертификат в файл на диск.
-//
-// Параметры:
-// ЗапросНаСертификат - ДвоичныеДанные - данные запроса на сертификат.
-// - Строка - адрес временного хранилища, содержащего данные запроса на сертификат.
-// ИмяФайлаБезРасширения - Строка - начальное имя файла без расширения.
-//
-Процедура СохранитьЗапросНаСертификат(ЗапросНаСертификат, ИмяФайлаБезРасширения = "") Экспорт
-
- Параметры = Новый Структура;
- Параметры.Вставить("ЗапросНаСертификат", ЗапросНаСертификат);
- Параметры.Вставить("ИмяФайлаБезРасширения", ИмяФайлаБезРасширения);
-
- ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(
- Новый ОписаниеОповещения("СохранитьЗапросНаСертификатПослеУстановкиРасширения", ЭтотОбъект, Параметры));
-
-КонецПроцедуры
-
-// Продолжение процедуры СохранитьСертификат.
-Процедура СохранитьЗапросНаСертификатПослеУстановкиРасширения(РасширениеПодключено, Параметры) Экспорт
-
- ЗапросНаСертификат = Параметры.ЗапросНаСертификат;
- ИмяФайлаБезРасширения = Параметры.ИмяФайлаБезРасширения;
-
- Если ТипЗнч(ЗапросНаСертификат) = Тип("ДвоичныеДанные") Тогда
- АдресЗапросаНаСертификат = ПоместитьВоВременноеХранилище(ЗапросНаСертификат);
-
- ИначеЕсли ТипЗнч(ЗапросНаСертификат) = Тип("Строка") И ЭтоАдресВременногоХранилища(ЗапросНаСертификат) Тогда
- АдресЗапросаНаСертификат = ЗапросНаСертификат;
- Иначе
- Возврат;
- КонецЕсли;
-
- ИмяФайла = ЭлектроннаяПодписьСлужебныйКлиент.ПодготовитьСтрокуДляИмениФайла(ИмяФайлаБезРасширения + ".p10");
-
- Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
- Результат = ПолучитьФайл(АдресЗапросаНаСертификат, ИмяФайла);
- Если Результат = Ложь Или Результат = Неопределено Тогда
- Возврат;
- КонецЕсли;
- Иначе
- Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
- Диалог.Заголовок = НСтр("ru = 'Выберите файл для сохранения запроса на сертификат'");
- Диалог.Фильтр = НСтр("ru = 'Файлы сертификатов (*.p10)|*.p10|Все файлы (*.*)|*.*'");
- Диалог.МножественныйВыбор = Ложь;
-
- ПолучаемыеФайлы = Новый Массив;
- ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла, АдресЗапросаНаСертификат));
-
- Если Не ПолучитьФайлы(ПолучаемыеФайлы, , Диалог) Тогда
- Возврат;
- КонецЕсли;
- КонецЕсли;
-
- Состояние(НСтр("ru = 'Запрос на сертификат сохранен в файл.'"));
+ ПоказатьОповещениеПользователя(ТекстСообщения, , ПредставлениеДанных);
КонецПроцедуры
diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСервер/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСервер/Module.bsl
index 538c5d55a..a7aa84a01 100644
--- a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСервер/Module.bsl
+++ b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСервер/Module.bsl
@@ -100,7 +100,7 @@
Если ЗначениеЗаполнено(Издатель.ОбщееИмя)
И ЗначениеЗаполнено(Издатель.Организация)
- И Издатель.Организация <> Издатель.ОбщееИмя Тогда
+ И Найти(Издатель.ОбщееИмя, Издатель.Организация) = 0 Тогда
Представление = Издатель.ОбщееИмя + ", " + Издатель.Организация;
КонецЕсли;
@@ -124,28 +124,12 @@
Функция ЗаполнитьСтруктуруСертификата(Сертификат) Экспорт
Свойства = Новый Структура;
-
- Свойства.Вставить("Представление", ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(
- ПредставлениеСертификата(Сертификат)));
-
- Свойства.Вставить("КомуВыдан",ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(
- ПредставлениеСубъекта(Сертификат)));
-
- СвойстваИздателя = СвойстваИздателяСертификата(Сертификат);
-
- Свойства.Вставить("КемВыдан", ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(
- ПредставлениеИздателя(Сертификат)));
-
+ Свойства.Вставить("Отпечаток", Base64Строка(Сертификат.Отпечаток));
+ Свойства.Вставить("Представление", ПредставлениеСертификата(Сертификат));
+ Свойства.Вставить("КомуВыдан", ПредставлениеСубъекта(Сертификат));
+ Свойства.Вставить("КемВыдан", ПредставлениеИздателя(Сертификат));
Свойства.Вставить("ДействителенДо", Сертификат.ДатаОкончания);
-
- Если Сертификат.РасширенныеСвойства.Свойство("EKU") Тогда
- Свойства.Вставить("Назначение", ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(
- ПолучитьНазначение(Сертификат.РасширенныеСвойства.EKU)));
- Иначе
- Свойства.Вставить("Назначение", "");
- КонецЕсли;
-
- Свойства.Вставить("Отпечаток", Base64Строка(Сертификат.Отпечаток));
+ Свойства.Вставить("Назначение", ПолучитьНазначение(Сертификат));
Возврат Свойства;
@@ -301,69 +285,71 @@
Свойства.Вставить("Отчество");
Если Субъект.Свойство("CN") Тогда
- Свойства.ОбщееИмя = СокрЛП(Субъект.CN);
+ Свойства.ОбщееИмя = ПодготовитьСтроку(Субъект.CN);
КонецЕсли;
Если Субъект.Свойство("C") Тогда
- Свойства.Страна = СокрЛП(Субъект.C);
+ Свойства.Страна = ПодготовитьСтроку(Субъект.C);
КонецЕсли;
Если Субъект.Свойство("ST") Тогда
- Свойства.Регион = СокрЛП(Субъект.ST);
+ Свойства.Регион = ПодготовитьСтроку(Субъект.ST);
КонецЕсли;
Если Субъект.Свойство("L") Тогда
- Свойства.НаселенныйПункт = СокрЛП(Субъект.L);
+ Свойства.НаселенныйПункт = ПодготовитьСтроку(Субъект.L);
КонецЕсли;
Если Субъект.Свойство("Street") Тогда
- Свойства.Улица = СокрЛП(Субъект.Street);
+ Свойства.Улица = ПодготовитьСтроку(Субъект.Street);
КонецЕсли;
Если Субъект.Свойство("O") Тогда
- Свойства.Организация = СокрЛП(Субъект.O);
+ Свойства.Организация = ПодготовитьСтроку(Субъект.O);
КонецЕсли;
Если Субъект.Свойство("OU") Тогда
- Свойства.Подразделение = СокрЛП(Субъект.OU);
+ Свойства.Подразделение = ПодготовитьСтроку(Субъект.OU);
КонецЕсли;
Если Субъект.Свойство("E") Тогда
- Свойства.ЭлектроннаяПочта = СокрЛП(Субъект.E);
+ Свойства.ЭлектроннаяПочта = ПодготовитьСтроку(Субъект.E);
КонецЕсли;
Если Субъект.Свойство("OGRN")Тогда
- Свойства.ОГРН = СокрЛП(Субъект.OGRN);
+ Свойства.ОГРН = ПодготовитьСтроку(Субъект.OGRN);
КонецЕсли;
Если Субъект.Свойство("OGRNIP") Тогда
- Свойства.ОГРНИП = СокрЛП(Субъект.OGRNIP);
+ Свойства.ОГРНИП = ПодготовитьСтроку(Субъект.OGRNIP);
КонецЕсли;
Если Субъект.Свойство("SNILS") Тогда
- Свойства.СНИЛС = СокрЛП(Субъект.SNILS);
+ Свойства.СНИЛС = ПодготовитьСтроку(Субъект.SNILS);
КонецЕсли;
Если Субъект.Свойство("INN") Тогда
- Свойства.ИНН = СокрЛП(Субъект.INN);
+ Свойства.ИНН = ПодготовитьСтроку(Субъект.INN);
КонецЕсли;
Если Субъект.Свойство("SN") Тогда // Наличие фамилии (обычно для должностного лица).
+
// Извлечение ФИО из поля SN и GN.
- Свойства.Фамилия = СокрЛП(Субъект.SN);
+ Свойства.Фамилия = ПодготовитьСтроку(Субъект.SN);
+
Если Субъект.Свойство("GN") Тогда
- GivenName = СокрЛП(Субъект.GN);
+ GivenName = ПодготовитьСтроку(Субъект.GN);
Позиция = Найти(GivenName, " ");
Если Позиция = 0 Тогда
Свойства.Имя = GivenName;
Иначе
Свойства.Имя = Лев(GivenName, Позиция - 1);
- Свойства.Отчество = СокрЛП(Сред(GivenName, Позиция + 1));
+ Свойства.Отчество = ПодготовитьСтроку(Сред(GivenName, Позиция + 1));
КонецЕсли;
КонецЕсли;
Если Субъект.Свойство("T") Тогда
- Свойства.Должность = СокрЛП(Субъект.T);
+ Свойства.Должность = ПодготовитьСтроку(Субъект.T);
КонецЕсли;
ИначеЕсли Субъект.Свойство("OGRNIP") // Признак индивидуального предпринимателя.
@@ -371,7 +357,7 @@
Или ЭтоИННФизЛица(Субъект.Свойство("INN")) Тогда // Признак физического лица.
Если Свойства.ОбщееИмя <> Свойства.Организация
- И Не (Субъект.Свойство("T") И Свойства.ОбщееИмя = Субъект.T) Тогда
+ И Не (Субъект.Свойство("T") И Свойства.ОбщееИмя = ПодготовитьСтроку(Субъект.T)) Тогда
// Извлечение ФИО из поля CN.
Массив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(
@@ -456,43 +442,43 @@
Свойства.Вставить("ИНН");
Если Издатель.Свойство("CN") Тогда
- Свойства.ОбщееИмя = СокрЛП(Издатель.CN);
+ Свойства.ОбщееИмя = ПодготовитьСтроку(Издатель.CN);
КонецЕсли;
Если Издатель.Свойство("C") Тогда
- Свойства.Страна = СокрЛП(Издатель.C);
+ Свойства.Страна = ПодготовитьСтроку(Издатель.C);
КонецЕсли;
Если Издатель.Свойство("ST") Тогда
- Свойства.Регион = СокрЛП(Издатель.ST);
+ Свойства.Регион = ПодготовитьСтроку(Издатель.ST);
КонецЕсли;
Если Издатель.Свойство("L") Тогда
- Свойства.НаселенныйПункт = СокрЛП(Издатель.L);
+ Свойства.НаселенныйПункт = ПодготовитьСтроку(Издатель.L);
КонецЕсли;
Если Издатель.Свойство("Street") Тогда
- Свойства.Улица = СокрЛП(Издатель.Street);
+ Свойства.Улица = ПодготовитьСтроку(Издатель.Street);
КонецЕсли;
Если Издатель.Свойство("O") Тогда
- Свойства.Организация = СокрЛП(Издатель.O);
+ Свойства.Организация = ПодготовитьСтроку(Издатель.O);
КонецЕсли;
Если Издатель.Свойство("OU") Тогда
- Свойства.Подразделение = СокрЛП(Издатель.OU);
+ Свойства.Подразделение = ПодготовитьСтроку(Издатель.OU);
КонецЕсли;
Если Издатель.Свойство("E") Тогда
- Свойства.ЭлектроннаяПочта = СокрЛП(Издатель.E);
+ Свойства.ЭлектроннаяПочта = ПодготовитьСтроку(Издатель.E);
КонецЕсли;
Если Издатель.Свойство("OGRN") Тогда
- Свойства.ОГРН = СокрЛП(Издатель.OGRN);
+ Свойства.ОГРН = ПодготовитьСтроку(Издатель.OGRN);
КонецЕсли;
Если Издатель.Свойство("INN") Тогда
- Свойства.ИНН = СокрЛП(Издатель.INN);
+ Свойства.ИНН = ПодготовитьСтроку(Издатель.INN);
КонецЕсли;
Возврат Свойства;
@@ -538,9 +524,15 @@
// Получает назначение сертификата.
//
// Параметры:
-// ФиксированныйМассивСвойств - ФиксированныйМассив - массив расширенных свойств сертификата (EKU).
+// Сертификат - СертификатКриптографии - сертификат назначение которого нужно получить.
//
-Функция ПолучитьНазначение(ФиксированныйМассивСвойств)
+Функция ПолучитьНазначение(Сертификат)
+
+ Если Не Сертификат.РасширенныеСвойства.Свойство("EKU") Тогда
+ Возврат "";
+ КонецЕсли;
+
+ ФиксированныйМассивСвойств = Сертификат.РасширенныеСвойства.EKU;
Назначение = "";
@@ -549,7 +541,7 @@
Назначение = Назначение + Символы.ПС;
КонецЦикла;
- Возврат Назначение;
+ Возврат ПодготовитьСтроку(Назначение);
КонецФункции
@@ -573,4 +565,10 @@
КонецФункции
+Функция ПодготовитьСтроку(СтрокаИзСертификата)
+
+ Возврат СокрЛП(ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(СтрокаИзСертификата));
+
+КонецФункции
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьПереопределяемый/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьПереопределяемый/Module.bsl
index 2ebba584a..c16c79f7b 100644
--- a/SSL/src/CommonModules/ЭлектроннаяПодписьПереопределяемый/Module.bsl
+++ b/SSL/src/CommonModules/ЭлектроннаяПодписьПереопределяемый/Module.bsl
@@ -79,6 +79,11 @@
// * Фамилия - Строка - (возвращаемое значение) фамилия сотрудника.
// * Имя - Строка - (возвращаемое значение) имя сотрудника.
// * Отчество - Строка - (возвращаемое значение) отчество сотрудника.
+// * ДатаРождения - Дата - (возвращаемое значение) дата рождения сотрудника.
+// * Пол - Строка - (возвращаемое значение) пол сотрудника "Мужской" или "Женский".
+// * МестоРождения - Строка - (возвращаемое значение) описание места рождения сотрудника.
+// * Гражданство - СправочникСсылка.СтраныМира
+// - (возвращаемое значение) гражданство сотрудника.
// * СтраховойНомерПФР - Строка - (возвращаемое значение) СНИЛС сотрудника.
// * Должность - Строка - (возвращаемое значение) должность сотрудника в организации.
//
@@ -227,6 +232,7 @@
+
КонецПроцедуры
// Вызывается из формы ПроверкаСертификата, если при создании формы были добавлены дополнительные проверки.
diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьПереопределяемыйКлиент/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьПереопределяемыйКлиент/Module.bsl
index 19aa25ab9..d267d1b6b 100644
--- a/SSL/src/CommonModules/ЭлектроннаяПодписьПереопределяемыйКлиент/Module.bsl
+++ b/SSL/src/CommonModules/ЭлектроннаяПодписьПереопределяемыйКлиент/Module.bsl
@@ -29,17 +29,23 @@
// Вызывается из формы ПроверкаСертификата, если при создании формы были добавлены дополнительные проверки.
//
// Параметры:
-// Сертификат - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - проверяемый сертификат.
-// Проверка - Строка - имя проверки, добавленное в процедуре ПриСозданииФормыПроверкаСертификата
-// общего модуля ЭлектроннаяПодписьПереопределяемый.
-// МенеджерКриптографии - МенеджерКриптографии - подготовленный менеджер криптографии для
-// выполнения проверки.
-// ОписаниеОшибки - Строка - (возвращаемое значение) - описание ошибки, полученной при выполнении проверки.
-// Это описание сможет увидеть пользователь при нажатии на картинку результата.
-// ЭтоПредупреждение - Булево - (возвращаемое значение) - вид картинки Ошибка/Предупреждение
+// Параметры - Структура - со свойствами:
+// * ОжидатьПродолжения - Булево - (возвращаемое значение) - если Истина, тогда дополнительная проверка
+// будет выполнятся асинхронно, продолжение возобновится после выполнения оповещения.
+// Начальное значение Ложь.
+// * Оповещение - ОписаниеОповещения - обработка, которую нужно вызывать для продолжения
+// после асинхронного выполнения дополнительной проверки.
+// * Сертификат - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - проверяемый сертификат.
+// * Проверка - Строка - имя проверки, добавленное в процедуре ПриСозданииФормыПроверкаСертификата
+// общего модуля ЭлектроннаяПодписьПереопределяемый.
+// * МенеджерКриптографии - МенеджерКриптографии - подготовленный менеджер криптографии для
+// выполнения проверки.
+// * ОписаниеОшибки - Строка - (возвращаемое значение) - описание ошибки, полученной при выполнении проверки.
+// Это описание сможет увидеть пользователь при нажатии на картинку результата.
+// * ЭтоПредупреждение - Булево - (возвращаемое значение) - вид картинки Ошибка/Предупреждение
// начальное значение Ложь.
-//
-Процедура ПриДополнительнойПроверкеСертификата(Сертификат, Проверка, МенеджерКриптографии, ОписаниеОшибки, ЭтоПредупреждение) Экспорт
+//
+Процедура ПриДополнительнойПроверкеСертификата(Параметры) Экспорт
diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl
index ead5f7809..554f704e0 100644
--- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl
+++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl
@@ -86,7 +86,6 @@
КонецПроцедуры
-
// Определить список справочников, доступных для загрузки с помощью подсистемы "Загрузка данных из файла".
//
// Параметры:
@@ -111,6 +110,24 @@
КонецЕсли;
КонецПроцедуры
+
+// Определить объекты метаданных, в модулях менеджеров которых ограничивается возможность
+// редактирования реквизитов при групповом изменении.
+//
+// Параметры:
+// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных,
+// подключенного к подсистеме "Групповое изменение объектов".
+// Дополнительно в значении могут быть перечислены имена экспортных функций:
+// "РеквизитыНеРедактируемыеВГрупповойОбработке",
+// "РеквизитыРедактируемыеВГрупповойОбработке".
+// Каждое имя должно начинаться с новой строки.
+// Если указана пустая строка, значит в модуле менеджера определены обе функции.
+//
+Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
+ Объекты.Вставить(Метаданные.Справочники.ПрограммыЭлектроннойПодписиИШифрования.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
+ Объекты.Вставить(Метаданные.Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке");
+КонецПроцедуры
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@@ -151,33 +168,10 @@
//
Функция МенеджерКриптографии(Операция, ПоказатьОшибку = Истина, ОписаниеОшибки = "", Программа = Неопределено) Экспорт
- ЭтоLinux = ОбщегоНазначения.ЭтоLinuxСервер();
ИмяКомпьютера = ИмяКомпьютера();
- Если ЭтоLinux Тогда
- Запрос = Новый Запрос;
- Запрос.УстановитьПараметр("ИмяКомпьютера", ИмяКомпьютера);
- Запрос.Текст =
- "ВЫБРАТЬ
- | ПутиКПрограмме.Программа,
- | ПутиКПрограмме.ПутьКПрограмме
- |ИЗ
- | РегистрСведений.ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux КАК ПутиКПрограмме
- |ГДЕ
- | ПутиКПрограмме.ИмяКомпьютера = &ИмяКомпьютера";
-
- ПутиКПрограммамНаСерверахLinux = Новый Соответствие;
- Выборка = Запрос.Выполнить().Выбрать();
- Пока Выборка.Следующий() Цикл
- ПутиКПрограммамНаСерверахLinux.Вставить(Выборка.Программа, Выборка.ПутьКПрограмме);
- КонецЦикла;
- Иначе
- ПутиКПрограммамНаСерверахLinux = Неопределено;
- КонецЕсли;
-
Ошибки = Новый Массив;
- Менеджер = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографии(
- Программа, ЭтоLinux, Ошибки, Истина, ПутиКПрограммамНаСерверахLinux);
+ Менеджер = НовыйМенеджерКриптографии(Программа, Ошибки, ИмяКомпьютера);
Если Менеджер <> Неопределено Тогда
Возврат Менеджер;
@@ -258,6 +252,93 @@
КонецФункции
+// Находит сертификат на компьютере по строке отпечатка.
+//
+// Параметры:
+// Отпечаток - Строка - Base64 кодированный отпечаток сертификата.
+// ТолькоВЛичномХранилище - Булево - если Истина, тогда искать в личном хранилище, иначе везде.
+//
+// Возвращаемое значение:
+// СертификатКриптографии - сертификат электронной подписи и шифрования.
+// Неопределено - сертификат не найден.
+//
+Функция ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище,
+ ПоказатьОшибку = Истина, Программа = Неопределено, ОписаниеОшибки = "") Экспорт
+
+ МенеджерКриптографии = МенеджерКриптографии("ПолучениеСертификатов",
+ ПоказатьОшибку, ОписаниеОшибки, Программа);
+
+ Если МенеджерКриптографии = Неопределено Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ ТипХранилища = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТипХранилищаДляПоискаСертификата(ТолькоВЛичномХранилище);
+
+ Попытка
+ ДвоичныеДанныеОтпечатка = Base64Значение(Отпечаток);
+ Исключение
+ Если ПоказатьОшибку Тогда
+ ВызватьИсключение;
+ КонецЕсли;
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
+ КонецПопытки;
+
+ Если Не ЗначениеЗаполнено(ПредставлениеОшибки) Тогда
+ Попытка
+ ХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилища);
+ Исключение
+ Если ПоказатьОшибку Тогда
+ ВызватьИсключение;
+ КонецЕсли;
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
+ КонецПопытки;
+ КонецЕсли;
+
+ Если Не ЗначениеЗаполнено(ПредставлениеОшибки) Тогда
+ Попытка
+ Сертификат = ХранилищеСертификатов.НайтиПоОтпечатку(ДвоичныеДанныеОтпечатка);
+ Исключение
+ Если ПоказатьОшибку Тогда
+ ВызватьИсключение;
+ КонецЕсли;
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
+ КонецПопытки;
+ КонецЕсли;
+
+ Если ТипЗнч(Сертификат) = Тип("СертификатКриптографии") Тогда
+ Возврат Сертификат;
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(ПредставлениеОшибки) Тогда
+ ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Сертификат не найден на сервере по причине:
+ |%1
+ |'"),
+ ПредставлениеОшибки);
+ Иначе
+ ТекстОшибки = НСтр("ru = 'Сертификат не найден на сервере.'");
+ КонецЕсли;
+
+ Если Не Пользователи.ЭтоПолноправныйПользователь(,, Ложь) Тогда
+ ТекстОшибки = ТекстОшибки + Символы.ПС + НСтр("ru = 'Обратитесь к администратору.'")
+ КонецЕсли;
+
+ ТекстОшибки = СокрП(ТекстОшибки);
+
+ Если ТипЗнч(ОписаниеОшибки) = Тип("Структура") Тогда
+ ОписаниеОшибки = Новый Структура;
+ ОписаниеОшибки.Вставить("ОписаниеОшибки", ТекстОшибки);
+ Иначе
+ ОписаниеОшибки = ПредставлениеОшибки;
+ КонецЕсли;
+
+ Возврат Неопределено;
+
+КонецФункции
+
// Сохраняет настройки текущего пользователя для работы с электронной подписью.
Процедура СохранитьПерсональныеНастройки(ПерсональныеНастройки) Экспорт
@@ -354,8 +435,21 @@
МенеджерКриптографии = МенеджерКриптографии("ПолучениеСертификатов", Ложь, Ошибка);
Если МенеджерКриптографии <> Неопределено Тогда
- ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатовИзХранилища(
- ТаблицаСвойствСертификатов, МенеджерКриптографии, Личные, БезОтбора);
+
+ МассивСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(
+ ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты).ПолучитьВсе();
+
+ Если Не Личные Тогда
+ Массив = МенеджерКриптографии.ПолучитьХранилищеСертификатов(
+ ТипХранилищаСертификатовКриптографии.СертификатыПолучателей).ПолучитьВсе();
+
+ Для каждого Сертификат Из Массив Цикл
+ МассивСертификатов.Добавить(Сертификат);
+ КонецЦикла;
+ КонецЕсли;
+
+ ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатов(
+ ТаблицаСвойствСертификатов, МассивСертификатов, БезОтбора);
КонецЕсли;
КонецЕсли;
@@ -415,8 +509,14 @@
Если ЭлектроннаяПодпись.ОбщиеНастройки().СоздаватьЭлектронныеПодписиНаСервере Тогда
МенеджерКриптографии = МенеджерКриптографии("ПолучениеСертификатов", Ложь);
- ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьОтпечаткиСертификатовИзЛичногоХранилища(
- ОтпечаткиСертификатовНаКлиенте, МенеджерКриптографии);
+
+ Если МенеджерКриптографии <> Неопределено Тогда
+ ТипХранилища = ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты;
+ МассивСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилища).ПолучитьВсе();
+
+ ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьОтпечаткиСертификатов(
+ ОтпечаткиСертификатовНаКлиенте, МассивСертификатов);
+ КонецЕсли;
КонецЕсли;
Если ОтборСертификатов.Количество() > 0 Тогда
@@ -501,7 +601,11 @@
Форма.ВыполнятьНаСервере = Параметры.ВыполнятьНаСервере;
- Если Не Шифрование Тогда
+ Если Шифрование Тогда
+ Если Форма.УказанНаборСертификатов Тогда
+ Форма.БезПодтверждения = Параметры.БезПодтверждения;
+ КонецЕсли;
+ Иначе
Если ТипЗнч(Параметры.ОтборСертификатов) = Тип("Массив") Тогда
Форма.ОтборСертификатов.ЗагрузитьЗначения(Параметры.ОтборСертификатов);
КонецЕсли;
@@ -555,7 +659,9 @@
Сертификат = Форма.ОтборСертификатов[0].Значение;
КонецЕсли;
- Форма.Сертификат = Сертификат;
+ Если Не (Шифрование И Форма.УказанНаборСертификатов) Тогда
+ Форма.Сертификат = Сертификат;
+ КонецЕсли;
Если ЗначениеЗаполнено(Форма.Сертификат)
И ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Форма.Сертификат, "Ссылка") <> Форма.Сертификат Тогда
@@ -570,12 +676,14 @@
Элементы.Пароль.АктивизироватьПоУмолчанию = Истина;
КонецЕсли;
Иначе
- Элементы.Сертификат.АктивизироватьПоУмолчанию = Истина;
+ Если Не (Шифрование И Форма.УказанНаборСертификатов) Тогда
+ Элементы.Сертификат.АктивизироватьПоУмолчанию = Истина;
+ КонецЕсли;
КонецЕсли;
ЗаполнитьДополнительныеСвойстваСертификата(Форма);
- МенеджерКриптографииНаСервереОписаниеОшибки = Новый Структура;
+ Форма.МенеджерКриптографииНаСервереОписаниеОшибки = Новый Структура;
Если ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().СоздаватьЭлектронныеПодписиНаСервере Тогда
МенеджерКриптографии("ПолучениеСертификатов",
Ложь, Форма.МенеджерКриптографииНаСервереОписаниеОшибки);
@@ -781,6 +889,59 @@
КонецПроцедуры
+// Только для внутреннего использования.
+Функция СертификатИзДвоичныхДанных(ДанныеСертификата) Экспорт
+
+ Если ТипЗнч(ДанныеСертификата) <> Тип("ДвоичныеДанные") Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ Попытка
+ СертификатКриптографии = Новый СертификатКриптографии(ДанныеСертификата);
+ Исключение
+ СертификатКриптографии = Неопределено;
+ КонецПопытки;
+
+ Если СертификатКриптографии <> Неопределено Тогда
+ Возврат СертификатКриптографии;
+ КонецЕсли;
+
+ ПолноеИмяВременногоФайла = ПолучитьИмяВременногоФайла("cer");
+ ДанныеСертификата.Записать(ПолноеИмяВременногоФайла);
+ Текст = Новый ТекстовыйДокумент;
+ Текст.Прочитать(ПолноеИмяВременногоФайла);
+
+ Если Текст.КоличествоСтрок() < 3
+ Или Текст.ПолучитьСтроку(1) <> "-----BEGIN CERTIFICATE-----"
+ Или Текст.ПолучитьСтроку(Текст.КоличествоСтрок()) <> "-----END CERTIFICATE-----" Тогда
+
+ Возврат Неопределено;
+ КонецЕсли;
+
+ Текст.УдалитьСтроку(1);
+ Текст.УдалитьСтроку(Текст.КоличествоСтрок());
+ СтрокаBase64 = Текст.ПолучитьТекст();
+
+ Попытка
+ ДанныеСертификата = Base64Значение(СтрокаBase64);
+ Исключение
+ Возврат Неопределено;
+ КонецПопытки;
+
+ Если ТипЗнч(ДанныеСертификата) <> Тип("ДвоичныеДанные") Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ Попытка
+ СертификатКриптографии = Новый СертификатКриптографии(ДанныеСертификата);
+ Исключение
+ СертификатКриптографии = Неопределено;
+ КонецПопытки;
+
+ Возврат СертификатКриптографии;
+
+КонецФункции
+
////////////////////////////////////////////////////////////////////////////////
// Обновление информационной базы.
@@ -1133,9 +1294,110 @@
Возврат;
КонецЕсли;
- ЭлектроннаяПодпись.ПолучитьСертификатПоОтпечатку(Форма.СертификатОтпечаток,
- Истина, Форма.СертификатПрограмма, Ложь, Форма.СертификатНаСервереОписаниеОшибки);
+ ПолучитьСертификатПоОтпечатку(Форма.СертификатОтпечаток,
+ Истина, Ложь, Форма.СертификатПрограмма, Форма.СертификатНаСервереОписаниеОшибки);
КонецПроцедуры
+// Для функции МенеджерКриптографии.
+Функция НовыйМенеджерКриптографии(Программа, Ошибки, ИмяКомпьютера)
+
+ ОписанияПрограмм = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииОписанияПрограмм(
+ Программа, Ошибки);
+
+ Если ОписанияПрограмм = Неопределено Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ ЭтоLinux = ОбщегоНазначения.ЭтоLinuxСервер();
+
+ Если ЭтоLinux Тогда
+ Запрос = Новый Запрос;
+ Запрос.УстановитьПараметр("ИмяКомпьютера", ИмяКомпьютера);
+ Запрос.Текст =
+ "ВЫБРАТЬ
+ | ПутиКПрограмме.Программа,
+ | ПутиКПрограмме.ПутьКПрограмме
+ |ИЗ
+ | РегистрСведений.ПутиКПрограммамЭлектроннойПодписиИШифрованияНаСерверахLinux КАК ПутиКПрограмме
+ |ГДЕ
+ | ПутиКПрограмме.ИмяКомпьютера = &ИмяКомпьютера";
+
+ ПутиКПрограммамНаСерверахLinux = Новый Соответствие;
+ Выборка = Запрос.Выполнить().Выбрать();
+ Пока Выборка.Следующий() Цикл
+ ПутиКПрограммамНаСерверахLinux.Вставить(Выборка.Программа, Выборка.ПутьКПрограмме);
+ КонецЦикла;
+ Иначе
+ ПутиКПрограммамНаСерверахLinux = Неопределено;
+ КонецЕсли;
+
+ Менеджер = Неопределено;
+ Для каждого ОписаниеПрограммы Из ОписанияПрограмм Цикл
+
+ СвойстваПрограммы = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииСвойстваПрограммы(
+ ОписаниеПрограммы, ЭтоLinux, Ошибки, Истина, ПутиКПрограммамНаСерверахLinux);
+
+ Если СвойстваПрограммы = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Попытка
+ ИнформацияМодуля = СредстваКриптографии.ПолучитьИнформациюМодуляКриптографии(
+ СвойстваПрограммы.ИмяПрограммы,
+ СвойстваПрограммы.ПутьКПрограмме,
+ СвойстваПрограммы.ТипПрограммы);
+ Исключение
+ ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииДобавитьОшибку(Ошибки,
+ ОписаниеПрограммы.Ссылка, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()),
+ Истина, Истина, Истина);
+ Продолжить;
+ КонецПопытки;
+
+ Если ИнформацияМодуля = Неопределено Тогда
+ ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииПрограммаНеНайдена(
+ ОписаниеПрограммы, Ошибки, Истина);
+
+ Менеджер = Неопределено;
+ Продолжить;
+ КонецЕсли;
+
+ Если Не ЭтоLinux Тогда
+ ИмяПрограммыПолученное = ИнформацияМодуля.Имя;
+
+ ИмяПрограммыСовпадает = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииИмяПрограммыСовпадает(
+ ОписаниеПрограммы, ИмяПрограммыПолученное, Ошибки, Истина);
+
+ Если Не ИмяПрограммыСовпадает Тогда
+ Менеджер = Неопределено;
+ Продолжить;
+ КонецЕсли;
+ КонецЕсли;
+
+ Попытка
+ Менеджер = Новый МенеджерКриптографии(
+ СвойстваПрограммы.ИмяПрограммы,
+ СвойстваПрограммы.ПутьКПрограмме,
+ СвойстваПрограммы.ТипПрограммы);
+ Исключение
+ ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииДобавитьОшибку(Ошибки,
+ ОписаниеПрограммы.Ссылка, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()),
+ Истина, Истина, Истина);
+ Продолжить;
+ КонецПопытки;
+
+ АлгоритмыУстановлены = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииАлгоритмыУстановлены(
+ ОписаниеПрограммы, Менеджер, Ошибки);
+
+ Если Не АлгоритмыУстановлены Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Прервать; // Требуемый менеджер криптографии получен.
+ КонецЦикла;
+
+ Возврат Менеджер;
+
+КонецФункции
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl
index f8502cbaf..f8b9c0e87 100644
--- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl
+++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl
@@ -60,4 +60,128 @@
КонецФункции
+// Только для внутреннего использования.
+Функция ВыполнитьНаСторонеСервера(Знач Параметры, АдресРезультата, ОперацияНачалась, ОшибкаНаСервере) Экспорт
+
+ МенеджерКриптографии = ЭлектроннаяПодписьСлужебный.МенеджерКриптографии(Параметры.Операция,
+ Ложь, ОшибкаНаСервере, Параметры.СертификатПрограмма);
+
+ Если МенеджерКриптографии = Неопределено Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ // Если личный сертификат шифрования не используется, тогда его не нужно искать.
+ Если Параметры.Операция <> "Шифрование"
+ Или ЗначениеЗаполнено(Параметры.СертификатОтпечаток) Тогда
+
+ СертификатКриптографии = ЭлектроннаяПодписьСлужебный.ПолучитьСертификатПоОтпечатку(
+ Параметры.СертификатОтпечаток, Истина, Ложь, Параметры.СертификатПрограмма, ОшибкаНаСервере);
+
+ Если СертификатКриптографии = Неопределено Тогда
+ Возврат Ложь;
+ КонецЕсли;
+ КонецЕсли;
+
+ Попытка
+ Данные = ПолучитьИзВременногоХранилища(Параметры.ЭлементДанныхДляСервера.Данные);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ОшибкаНаСервере.Вставить("ОписаниеОшибки",
+ ЭлектроннаяПодписьСлужебныйКлиентСервер.ЗаголовокОшибкиПолученияДанных(Параметры.Операция)
+ + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+ Возврат Ложь;
+ КонецПопытки;
+
+ ОписаниеОшибки = "";
+ Если Параметры.Операция = "Подписание" Тогда
+ МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Параметры.ЗначениеПароля;
+ Попытка
+ ДвоичныеДанныеРезультата = МенеджерКриптографии.Подписать(Данные, СертификатКриптографии);
+ ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеДанныеПодписи(ДвоичныеДанныеРезультата, ОписаниеОшибки);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ КонецПопытки;
+ ИначеЕсли Параметры.Операция = "Шифрование" Тогда
+ Сертификаты = СертификатыКриптографии(Параметры.АдресСертификатов);
+ Попытка
+ ДвоичныеДанныеРезультата = МенеджерКриптографии.Зашифровать(Данные, Сертификаты);
+ ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеЗашифрованныеДанные(ДвоичныеДанныеРезультата, ОписаниеОшибки);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ КонецПопытки;
+ Иначе // Расшифровка.
+ МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Параметры.ЗначениеПароля;
+ Попытка
+ ДвоичныеДанныеРезультата = МенеджерКриптографии.Расшифровать(Данные);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ КонецПопытки;
+ КонецЕсли;
+
+ Если ИнформацияОбОшибке <> Неопределено Тогда
+ ОшибкаНаСервере.Вставить("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+ ОшибкаНаСервере.Вставить("Инструкция", Истина);
+ Возврат Ложь;
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
+ ОшибкаНаСервере.Вставить("ОписаниеОшибки", ОписаниеОшибки);
+ Возврат Ложь;
+ КонецЕсли;
+
+ ОперацияНачалась = Истина;
+
+ Если Параметры.Операция = "Подписание" Тогда
+ СвойстваСертификата = ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(СертификатКриптографии);
+ СвойстваСертификата.Вставить("ДвоичныеДанные", СертификатКриптографии.Выгрузить());
+
+ СвойстваПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваПодписи(ДвоичныеДанныеРезультата,
+ СвойстваСертификата, Параметры.Комментарий);
+
+ АдресРезультата = ПоместитьВоВременноеХранилище(СвойстваПодписи, Параметры.ИдентификаторФормы);
+
+ Если Параметры.ЭлементДанныхДляСервера.Свойство("Объект") Тогда
+ ВерсияОбъекта = Неопределено;
+ Параметры.ЭлементДанныхДляСервера.Свойство("ВерсияОбъекта", ВерсияОбъекта);
+ Попытка
+ ЭлектроннаяПодпись.ДобавитьПодпись(Параметры.ЭлементДанныхДляСервера.Объект, СвойстваПодписи,
+ Параметры.ИдентификаторФормы, ВерсияОбъекта);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ОшибкаНаСервере.Вставить("ОписаниеОшибки", НСтр("ru = 'При записи подписи возникла ошибка:'")
+ + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+ Возврат Ложь;
+ КонецПопытки;
+ КонецЕсли;
+ Иначе
+ АдресРезультата = ПоместитьВоВременноеХранилище(ДвоичныеДанныеРезультата, Параметры.ИдентификаторФормы);
+ КонецЕсли;
+
+ Возврат Истина;
+
+КонецФункции
+
+// Только для внутреннего использования.
+Процедура ДобавитьПодпись(СсылкаНаОбъект, СвойстваПодписи, ИдентификаторФормы, ВерсияОбъекта) Экспорт
+
+ ЭлектроннаяПодпись.ДобавитьПодпись(СсылкаНаОбъект, СвойстваПодписи, ИдентификаторФормы, ВерсияОбъекта);
+
+КонецПроцедуры
+
+// Для функции ВыполнитьНаСторонеСервера.
+Функция СертификатыКриптографии(Знач СвойстваСертификатов)
+
+ Если ТипЗнч(СвойстваСертификатов) = Тип("Строка") Тогда
+ СвойстваСертификатов = ПолучитьИзВременногоХранилища(СвойстваСертификатов);
+ КонецЕсли;
+
+ Сертификаты = Новый Массив;
+ Для каждого Свойства Из СвойстваСертификатов Цикл
+ Сертификаты.Добавить(Новый СертификатКриптографии(Свойства.Сертификат));
+ КонецЦикла;
+
+ Возврат Сертификаты;
+
+КонецФункции
+
#КонецОбласти
diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl
index 352c21c93..f0548c6b1 100644
--- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl
+++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl
@@ -5,9 +5,887 @@
#Область СлужебныеПроцедурыИФункции
-// Возвращает менеджер криптографии (на клиенте) для указанной программы.
+// Открывает форму просмотра данных сертификата.
//
// Параметры:
+// ДанныеСертификата - СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования - ссылка на сертификат.
+// - СертификатКриптографии - имеющийся сертификат.
+// - ДвоичныеДанные - двоичные данные сертификата.
+// - Строка - адрес временного хранилища содержащий ДвоичныеДанные сертификата.
+// - Строка - отпечаток сертификата для поиска во всех хранилищах.
+//
+// ОткрытьДанные - Булево - открыть данные сертификата, а не форму элемента справочника.
+// Если передана не ссылка на элемент справочника и элемент справочника
+// не удалось найти по отпечатку, тогда будут открыты данные сертификата.
+//
+Процедура ОткрытьСертификат(ДанныеСертификата, ОткрытьДанные = Ложь) Экспорт
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("ДанныеСертификата", ДанныеСертификата);
+ Контекст.Вставить("ОткрытьДанные", ОткрытьДанные);
+ Контекст.Вставить("АдресСертификата", Неопределено);
+
+ Если ТипЗнч(ДанныеСертификата) = Тип("СертификатКриптографии") Тогда
+ Контекст.СертификатКриптографии.НачатьВыгрузку(Новый ОписаниеОповещения(
+ "ОткрытьСертификатПослеВыгрузкиСертификата", ЭтотОбъект, Контекст));
+ Иначе
+ ОткрытьСертификатПродолжение(Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ОткрытьСертификат.
+Процедура ОткрытьСертификатПослеВыгрузкиСертификата(ВыгруженныеДанные, Контекст) Экспорт
+
+ Контекст.АдресСертификата = ПоместитьВоВременноеХранилище(ВыгруженныеДанные);
+
+ ОткрытьСертификатПродолжение(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ОткрытьСертификат.
+Процедура ОткрытьСертификатПродолжение(Контекст)
+
+ Если Контекст.АдресСертификата <> Неопределено Тогда
+ // Сертификат подготовлен.
+
+ ИначеЕсли ТипЗнч(Контекст.ДанныеСертификата) = Тип("СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования") Тогда
+ Ссылка = Контекст.ДанныеСертификата;
+
+ ИначеЕсли ТипЗнч(Контекст.ДанныеСертификата) = Тип("ДвоичныеДанные") Тогда
+ Контекст.АдресСертификата = ПоместитьВоВременноеХранилище(Контекст.ДанныеСертификата);
+
+ ИначеЕсли ТипЗнч(Контекст.ДанныеСертификата) <> Тип("Строка") Тогда
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Ошибка при вызове процедуры ОткрытьСертификат общего модуля ЭлектроннаяПодписьКлиент:
+ |Некорректное значение параметра ДанныеСертификата ""%1"".'"), Строка(Контекст.ДанныеСертификата));
+
+ ИначеЕсли ЭтоАдресВременногоХранилища(Контекст.ДанныеСертификата) Тогда
+ Контекст.АдресСертификата = Контекст.ДанныеСертификата;
+ Иначе
+ Отпечаток = Контекст.ДанныеСертификата;
+ КонецЕсли;
+
+ Если Не Контекст.ОткрытьДанные Тогда
+ Если Ссылка = Неопределено Тогда
+ Ссылка = ЭлектроннаяПодписьСлужебныйВызовСервера.СсылкаНаСертификат(Отпечаток, Контекст.АдресСертификата);
+ КонецЕсли;
+ Если ЗначениеЗаполнено(Ссылка) Тогда
+ ПоказатьЗначение(, Ссылка);
+ Возврат;
+ КонецЕсли;
+ КонецЕсли;
+
+ Контекст.Вставить("Ссылка", Ссылка);
+ Контекст.Вставить("Отпечаток", Отпечаток);
+
+ Если Контекст.АдресСертификата = Неопределено
+ И Ссылка = Неопределено Тогда
+
+ ПолучитьСертификатПоОтпечатку(Новый ОписаниеОповещения(
+ "ОткрытьСертификатПослеПоискаСертификата", ЭтотОбъект, Контекст), Отпечаток, Ложь);
+ Иначе
+ ОткрытьСертификатЗавершение(Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ОткрытьСертификат.
+Процедура ОткрытьСертификатПослеПоискаСертификата(Результат, Контекст) Экспорт
+
+ Если ТипЗнч(Результат) = Тип("СертификатКриптографии") Тогда
+ Результат.НачатьВыгрузку(Новый ОписаниеОповещения(
+ "ОткрытьСертификатПослеВыгрузкиНайденногоСертификата", ЭтотОбъект, Контекст));
+ Иначе
+ ОткрытьСертификатЗавершение(Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ОткрытьСертификат.
+Процедура ОткрытьСертификатПослеВыгрузкиНайденногоСертификата(ВыгруженныеДанные, Контекст) Экспорт
+
+ Контекст.АдресСертификата = ПоместитьВоВременноеХранилище(ВыгруженныеДанные);
+
+ ОткрытьСертификатЗавершение(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ОткрытьСертификат.
+Процедура ОткрытьСертификатЗавершение(Контекст)
+
+ ПараметрыФормы = Новый Структура;
+ ПараметрыФормы.Вставить("Ссылка", Контекст.Ссылка);
+ ПараметрыФормы.Вставить("АдресСертификата", Контекст.АдресСертификата);
+ ПараметрыФормы.Вставить("Отпечаток", Контекст.Отпечаток);
+
+ ОткрытьФорму("ОбщаяФорма.Сертификат", ПараметрыФормы);
+
+КонецПроцедуры
+
+
+// Сохраняет сертификат в файл на диск.
+//
+// Параметры:
+// Оповещение - ОписаниеОповещения - вызывается после сохранения.
+// - Неопределено - продолжение не требуется.
+//
+// Сертификат - СертификатКриптографии - сертификат.
+// - ДвоичныеДанные - двоичные данные сертификата.
+// - Строка - адрес временного хранилища, содержащего двоичные данные сертификата.
+//
+Процедура СохранитьСертификат(Оповещение, Сертификат, ИмяФайлаБезРасширения = "") Экспорт
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("Сертификат", Сертификат);
+ Контекст.Вставить("ИмяФайлаБезРасширения", ИмяФайлаБезРасширения);
+ Контекст.Вставить("АдресСертификата", Неопределено);
+
+ ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(
+ Новый ОписаниеОповещения("СохранитьСертификатПослеУстановкиРасширения", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры СохранитьСертификат.
+Процедура СохранитьСертификатПослеУстановкиРасширения(РасширениеПодключено, Контекст) Экспорт
+
+ Контекст.Вставить("РасширениеПодключено", РасширениеПодключено);
+
+ Если ТипЗнч(Контекст.Сертификат) = Тип("СертификатКриптографии") Тогда
+ Контекст.Сертификат.НачатьВыгрузку(Новый ОписаниеОповещения(
+ "СохранитьСертификатПослеВыгрузкиСертификата", ЭтотОбъект, Контекст));
+ Иначе
+ СохранитьСертификатПродолжение(Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры СохранитьСертификат.
+Процедура СохранитьСертификатПослеВыгрузкиСертификата(ВыгруженныеДанные, Контекст) Экспорт
+
+ Контекст.АдресСертификата = ПоместитьВоВременноеХранилище(ВыгруженныеДанные);
+
+ СохранитьСертификатПродолжение(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры СохранитьСертификат.
+Процедура СохранитьСертификатПродолжение(Контекст)
+
+ Если Контекст.АдресСертификата <> Неопределено Тогда
+ // Сертификат подготовлен.
+
+ ИначеЕсли ТипЗнч(Контекст.Сертификат) = Тип("ДвоичныеДанные") Тогда
+ Контекст.АдресСертификата = ПоместитьВоВременноеХранилище(Контекст.Сертификат);
+
+ ИначеЕсли ТипЗнч(Контекст.Сертификат) = Тип("Строка")
+ И ЭтоАдресВременногоХранилища(Контекст.Сертификат) Тогда
+
+ Контекст.АдресСертификата = Контекст.Сертификат;
+ Иначе
+ Если Контекст.Оповещение <> Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь);
+ КонецЕсли;
+ Возврат;
+ КонецЕсли;
+
+ Если Не ЗначениеЗаполнено(Контекст.ИмяФайлаБезРасширения) Тогда
+ Контекст.ИмяФайлаБезРасширения = ЭлектроннаяПодписьСлужебныйВызовСервера.ПредставлениеСертификата(
+ Контекст.АдресСертификата);
+ КонецЕсли;
+
+ ИмяФайла = ПодготовитьСтрокуДляИмениФайла(Контекст.ИмяФайлаБезРасширения) + ".cer";
+
+ Если Не Контекст.РасширениеПодключено Тогда
+ ПолучитьФайл(Контекст.АдресСертификата, ИмяФайла);
+ Если Контекст.Оповещение <> Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение);
+ КонецЕсли;
+ Возврат;
+ КонецЕсли;
+
+ Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
+ Диалог.Заголовок = НСтр("ru = 'Выберите файл для сохранения сертификата'");
+ Диалог.Фильтр = НСтр("ru = 'Файлы сертификатов (*.cer)|*.cer|Все файлы (*.*)|*.*'");
+ Диалог.МножественныйВыбор = Ложь;
+
+ ПолучаемыеФайлы = Новый Массив;
+ ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла, Контекст.АдресСертификата));
+
+ НачатьПолучениеФайлов(Новый ОписаниеОповещения(
+ "СохранитьСертификатПослеПолученияФайлов", ЭтотОбъект, Контекст), ПолучаемыеФайлы, Диалог);
+
+КонецПроцедуры
+
+// Продолжение процедуры СохранитьСертификат.
+Процедура СохранитьСертификатПослеПолученияФайлов(ПолученныеФайлы, Контекст) Экспорт
+
+ Если ПолученныеФайлы = Неопределено
+ Или ПолученныеФайлы.Количество() = 0 Тогда
+
+ ЕстьПолученныеФайлы = Ложь;
+ Иначе
+ ЕстьПолученныеФайлы = Истина;
+ ПоказатьОповещениеПользователя(НСтр("ru = 'Сертификат сохранен в файл:'"),,
+ ПолученныеФайлы[0].Имя);
+ КонецЕсли;
+
+ Если Контекст.Оповещение <> Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, ЕстьПолученныеФайлы);
+ КонецЕсли;
+
+КонецПроцедуры
+
+
+// Сохраняет запрос на сертификат в файл на диск.
+//
+// Параметры:
+// Оповещение - ОписаниеОповещения - вызывается после сохранения.
+// - Неопределено - продолжение не требуется.
+//
+// ЗапросНаСертификат - ДвоичныеДанные - данные запроса на сертификат.
+// - Строка - адрес временного хранилища, содержащего данные запроса на сертификат.
+// ИмяФайлаБезРасширения - Строка - начальное имя файла без расширения.
+//
+Процедура СохранитьЗапросНаСертификат(Оповещение, ЗапросНаСертификат, ИмяФайлаБезРасширения = "") Экспорт
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("ЗапросНаСертификат", ЗапросНаСертификат);
+ Контекст.Вставить("ИмяФайлаБезРасширения", ИмяФайлаБезРасширения);
+
+ ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(
+ Новый ОписаниеОповещения("СохранитьЗапросНаСертификатПослеУстановкиРасширения", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры СохранитьЗапросНаСертификат.
+Процедура СохранитьЗапросНаСертификатПослеУстановкиРасширения(РасширениеПодключено, Контекст) Экспорт
+
+ ЗапросНаСертификат = Контекст.ЗапросНаСертификат;
+ ИмяФайлаБезРасширения = Контекст.ИмяФайлаБезРасширения;
+
+ Если ТипЗнч(ЗапросНаСертификат) = Тип("ДвоичныеДанные") Тогда
+ АдресЗапросаНаСертификат = ПоместитьВоВременноеХранилище(ЗапросНаСертификат);
+
+ ИначеЕсли ТипЗнч(ЗапросНаСертификат) = Тип("Строка")
+ И ЭтоАдресВременногоХранилища(ЗапросНаСертификат) Тогда
+
+ АдресЗапросаНаСертификат = ЗапросНаСертификат;
+ Иначе
+ Если Контекст.Оповещение <> Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь);
+ КонецЕсли;
+ Возврат;
+ КонецЕсли;
+
+ ИмяФайла = ПодготовитьСтрокуДляИмениФайла(ИмяФайлаБезРасширения + ".p10");
+
+ Если Не РасширениеПодключено Тогда
+ ПолучитьФайл(АдресЗапросаНаСертификат, ИмяФайла);
+ Если Контекст.Оповещение <> Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение);
+ КонецЕсли;
+ Возврат;
+ КонецЕсли;
+
+ Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
+ Диалог.Заголовок = НСтр("ru = 'Выберите файл для сохранения запроса на сертификат'");
+ Диалог.Фильтр = НСтр("ru = 'Файлы сертификатов (*.p10)|*.p10|Все файлы (*.*)|*.*'");
+ Диалог.МножественныйВыбор = Ложь;
+
+ ПолучаемыеФайлы = Новый Массив;
+ ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла, АдресЗапросаНаСертификат));
+
+ НачатьПолучениеФайлов(Новый ОписаниеОповещения(
+ "СохранитьЗапросНаСертификатПослеПолученияФайлов", ЭтотОбъект, Контекст), ПолучаемыеФайлы, Диалог);
+
+КонецПроцедуры
+
+// Продолжение процедуры СохранитьЗапросНаСертификат.
+Процедура СохранитьЗапросНаСертификатПослеПолученияФайлов(ПолученныеФайлы, Контекст) Экспорт
+
+ Если ПолученныеФайлы = Неопределено
+ Или ПолученныеФайлы.Количество() = 0 Тогда
+
+ ЕстьПолученныеФайлы = Ложь;
+ Иначе
+ ЕстьПолученныеФайлы = Истина;
+ ПоказатьОповещениеПользователя(НСтр("ru = 'Запрос на сертификат сохранен в файл:'"),,
+ ПолученныеФайлы[0].Имя);
+ КонецЕсли;
+
+ Если Контекст.Оповещение <> Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, ЕстьПолученныеФайлы);
+ КонецЕсли;
+
+КонецПроцедуры
+
+
+// Сохраняет подпись на диск
+Процедура СохранитьПодпись(АдресПодписи) Экспорт
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("АдресПодписи", АдресПодписи);
+
+ НачатьПодключениеРасширенияРаботыСФайлами(Новый ОписаниеОповещения(
+ "СохранитьПодписьПослеПодключенияРасширенияРаботыСФайлами", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры СохранитьПодпись.
+Процедура СохранитьПодписьПослеПодключенияРасширенияРаботыСФайлами(Подключено, Контекст) Экспорт
+
+ Если Не Подключено Тогда
+ ПолучитьФайл(Контекст.АдресПодписи);
+ Возврат;
+ КонецЕсли;
+
+ РасширениеДляФайловПодписи = ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки().РасширениеДляФайловПодписи;
+
+ ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
+
+ Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Файлы электронных подписей (*.%1)|*.%1|Все файлы (*.*)|*.*'"),
+ РасширениеДляФайловПодписи);
+
+ ДиалогОткрытияФайла.Фильтр = Фильтр;
+ ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
+ ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файл для сохранения подписи'");
+
+ ПередаваемыеФайлы = Новый Массив;
+ ПередаваемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла("", Контекст.АдресПодписи));
+
+ // Сохранение Файла из информационной базы на диск.
+ НачатьПолучениеФайлов(Новый ОписаниеОповещения(
+ "СохранитьПодписьПослеПолученияФайла", ЭтотОбъект, Контекст), ПередаваемыеФайлы, ДиалогОткрытияФайла);
+
+КонецПроцедуры
+
+// Продолжение процедуры СохранитьПодпись.
+Процедура СохранитьПодписьПослеПолученияФайла(ПолученныеФайлы, Контекст) Экспорт
+
+ Если ПолученныеФайлы = Неопределено
+ Или ПолученныеФайлы.Количество() = 0 Тогда
+
+ Возврат;
+ КонецЕсли;
+
+ ПоказатьОповещениеПользователя(НСтр("ru = 'Электронная подпись сохранена в файл:'"),,
+ ПолученныеФайлы[0].Имя);
+
+КонецПроцедуры
+
+// Находит сертификат на компьютере по строке отпечатка.
+//
+// Параметры:
+// Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов:
+// СертификатКриптографии - найденный сертификат.
+// Неопределено - сертификат не найден в хранилище.
+// Строка - текст ошибки создания менеджера криптографии (или другая ошибка).
+// Структура - описание ошибки в виде структуры.
+//
+// Отпечаток - Строка - Base64 кодированный отпечаток сертификата.
+// ТолькоВЛичномХранилище - Булево - если Истина, тогда искать в личном хранилище, иначе везде.
+// - ТипХранилищаСертификатовКриптографии - указанный тип хранилища.
+//
+// ПоказатьОшибку - Булево - показать ошибку создания менеджера криптографии.
+// - Неопределено - не показывать ошибку и вернуть структуру ошибки,
+// в том числе добавить свойство СертификатНеНайден.
+//
+// Программа - Неопределено - искать с помощью любой программы.
+// - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - искать
+// с помощью указанной программы.
+// - МенеджерКриптографии - инициализированный менеджер криптографии,
+// который нужно использовать для поиска.
+//
+Процедура ПолучитьСертификатПоОтпечатку(Оповещение, Отпечаток, ТолькоВЛичномХранилище,
+ ПоказатьОшибку = Истина, Программа = Неопределено) Экспорт
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("Отпечаток", Отпечаток);
+ Контекст.Вставить("ТолькоВЛичномХранилище", ТолькоВЛичномХранилище);
+ Контекст.Вставить("ПоказатьОшибку", ПоказатьОшибку);
+
+ Если ТипЗнч(Программа) = Тип("МенеджерКриптографии") Тогда
+ ПолучитьСертификатПоОтпечаткуПослеСозданияМенеджераКриптографии(Программа, Контекст);
+ Иначе
+ СоздатьМенеджерКриптографии(Новый ОписаниеОповещения(
+ "ПолучитьСертификатПоОтпечаткуПослеСозданияМенеджераКриптографии", ЭтотОбъект, Контекст),
+ "ПолучениеСертификатов", ПоказатьОшибку, Программа);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьСертификатПоОтпечатку.
+Процедура ПолучитьСертификатПоОтпечаткуПослеСозданияМенеджераКриптографии(Результат, Контекст) Экспорт
+
+ Если ТипЗнч(Результат) <> Тип("МенеджерКриптографии") Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+ Возврат;
+ КонецЕсли;
+ Контекст.Вставить("МенеджерКриптографии", Результат);
+
+ ТипХранилища = ЭлектроннаяПодписьСлужебныйКлиентСервер.ТипХранилищаДляПоискаСертификата(
+ Контекст.ТолькоВЛичномХранилище);
+
+ Попытка
+ Контекст.Вставить("ДвоичныеДанныеОтпечатка", Base64Значение(Контекст.Отпечаток));
+ Исключение
+ Если Контекст.ПоказатьОшибку = Истина Тогда
+ ВызватьИсключение;
+ КонецЕсли;
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
+ ПолучитьСертификатПоОтпечаткуЗавершение(, ПредставлениеОшибки, Контекст);
+ Возврат;
+ КонецПопытки;
+
+ Контекст.МенеджерКриптографии.НачатьПолучениеХранилищаСертификатов(
+ Новый ОписаниеОповещения(
+ "ПолучитьСертификатПоОтпечаткуПослеПолученияХранилища", ЭтотОбъект, Контекст,
+ "ПолучитьСертификатПоОтпечаткуПослеОшибкиПолученияХранилища", ЭтотОбъект),
+ ТипХранилища);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьСертификатПоОтпечатку.
+Процедура ПолучитьСертификатПоОтпечаткуПослеОшибкиПолученияХранилища(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
+
+ Если Контекст.ПоказатьОшибку Тогда
+ Возврат;
+ КонецЕсли;
+
+ СтандартнаяОбработка = Ложь;
+
+ ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
+ ПолучитьСертификатПоОтпечаткуЗавершение(, ПредставлениеОшибки, Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьСертификатПоОтпечатку.
+Процедура ПолучитьСертификатПоОтпечаткуПослеПолученияХранилища(ХранилищеСертификатов, Контекст) Экспорт
+
+ ХранилищеСертификатов.НачатьПоискПоОтпечатку(Новый ОписаниеОповещения(
+ "ПолучитьСертификатПоОтпечаткуПослеПоиска", ЭтотОбъект, Контекст,
+ "ПолучитьСертификатПоОтпечаткуПослеОшибкиПоиска", ЭтотОбъект),
+ Контекст.ДвоичныеДанныеОтпечатка);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьСертификатПоОтпечатку.
+Процедура ПолучитьСертификатПоОтпечаткуПослеОшибкиПоиска(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
+
+ Если Контекст.ПоказатьОшибку Тогда
+ Возврат;
+ КонецЕсли;
+
+ СтандартнаяОбработка = Ложь;
+
+ ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
+
+ ПолучитьСертификатПоОтпечаткуЗавершение(, ПредставлениеОшибки, Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьСертификатПоОтпечатку.
+Процедура ПолучитьСертификатПоОтпечаткуПослеПоиска(Сертификат, Контекст) Экспорт
+
+ ПолучитьСертификатПоОтпечаткуЗавершение(Сертификат, , Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьСертификатПоОтпечатку.
+Процедура ПолучитьСертификатПоОтпечаткуЗавершение(Сертификат, ПредставлениеОшибки, Контекст)
+
+ Если ТипЗнч(Сертификат) = Тип("СертификатКриптографии") Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Сертификат);
+ Возврат;
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(ПредставлениеОшибки) Тогда
+ ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Сертификат не найден на компьютере по причине:
+ |%1'"),
+ ПредставлениеОшибки);
+ Иначе
+ ТекстОшибки = НСтр("ru = 'Сертификат не найден на компьютере.'");
+ КонецЕсли;
+
+ Если Контекст.ПоказатьОшибку = Неопределено Тогда
+ Результат = Новый Структура;
+ Результат.Вставить("ОписаниеОшибки", ТекстОшибки);
+ Если Не ЗначениеЗаполнено(ПредставлениеОшибки) Тогда
+ Результат.Вставить("СертификатНеНайден");
+ КонецЕсли;
+ ИначеЕсли Не ЗначениеЗаполнено(ПредставлениеОшибки) Тогда
+ Результат = Неопределено;
+ Иначе
+ Результат = ПредставлениеОшибки;
+ КонецЕсли;
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+
+КонецПроцедуры
+
+
+// Получает отпечатки сертификатов пользователя ОС на компьютере.
+//
+// Параметры:
+// Оповещение - ОписаниеОповещение - вызывается для передачи возвращаемого значение:
+// * Соответствие - Ключ - отпечаток в формате строки Base64, а Значение - Истина;
+// * Строка - текст ошибки создания менеджера криптографии (или другая ошибка).
+//
+// ТолькоЛичные - Булево - Если Ложь, то к личным сертификатам добавляются сертификаты получателей.
+//
+// ПоказатьОшибку - Булево - показать ошибку создания менеджера криптографии.
+//
+Процедура ПолучитьОтпечаткиСертификатов(Оповещение, ТолькоЛичные, ПоказатьОшибку = Истина) Экспорт
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("ТолькоЛичные", ТолькоЛичные);
+ Контекст.Вставить("ПоказатьОшибку", ПоказатьОшибку = Истина);
+
+ ПолучитьСвойстваСертификатовНаКлиенте(Новый ОписаниеОповещения(
+ "ПолучитьОтпечаткиСертификатовПослеВыполнения", ЭтотОбъект, Контекст),
+ ТолькоЛичные, Ложь, Истина, ПоказатьОшибку);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьОтпечаткиСертификатов.
+Процедура ПолучитьОтпечаткиСертификатовПослеВыполнения(Результат, Контекст) Экспорт
+
+ Если ЗначениеЗаполнено(Результат.ОшибкаПолученияСертификатовНаКлиенте) Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат.ОшибкаПолученияСертификатовНаКлиенте);
+ Возврат;
+ КонецЕсли;
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат.СвойстваСертификатовНаКлиенте);
+
+КонецПроцедуры
+
+
+// Проверяет действительность подписи и сертификата.
+// Сертификат всегда проверяется на сервере, если администратор
+// настроил проверку электронных подписей на сервере.
+//
+// Параметры:
+// Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов:
+// Булево - Истина, если проверка выполнена успешно.
+// Строка - описание ошибки проверки подписи.
+// Неопределено - не удалось получить менеджер криптографии (когда не указан).
+//
+// ИсходныеДанные - ДвоичныеДанные - двоичные данные, которые были подписаны.
+// Математическая проверка выполняется на стороне клиента, даже когда
+// администратор настроил проверку электронных подписей на сервере,
+// если указан менеджер криптографии или его удалось получить без ошибки.
+// Это повышает производительность, а также безопасность когда проверяется
+// подпись в расшифрованном файле (он не будет передан на сервер).
+// - Строка - адрес временного хранилища, содержащего исходные двоичные данные.
+//
+// Подпись - ДвоичныеДанные - двоичные данные электронной подписи.
+// - Строка - адрес временного хранилища, содержащего двоичные данные.
+//
+// МенеджерКриптографии - Неопределено - получить менеджер криптографии по-умолчанию
+// (менеджер первой программы в списке, как настроил администратор).
+// - МенеджерКриптографии - использовать указанный менеджер криптографии.
+//
+Процедура ПроверитьПодпись(Оповещение, ИсходныеДанные, Подпись, МенеджерКриптографии = Неопределено) Экспорт
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("ИсходныеДанные", ИсходныеДанные);
+ Контекст.Вставить("Подпись", Подпись);
+ Контекст.Вставить("ПроверятьНаСервере",
+ ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ПроверятьЭлектронныеПодписиНаСервере);
+
+ Если МенеджерКриптографии = Неопределено Тогда
+ СоздатьМенеджерКриптографии(Новый ОписаниеОповещения(
+ "ПроверитьПодписьПослеСозданияМенеджераКриптографии", ЭтотОбъект, Контекст),
+ "ПроверкаПодписи", Не Контекст.ПроверятьНаСервере);
+ Иначе
+ ПроверитьПодписьПослеСозданияМенеджераКриптографии(МенеджерКриптографии, Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьПодпись.
+Процедура ПроверитьПодписьПослеСозданияМенеджераКриптографии(Результат, Контекст) Экспорт
+
+ Если ТипЗнч(Результат) = Тип("МенеджерКриптографии") Тогда
+ МенеджерКриптографии = Результат;
+ Иначе
+ МенеджерКриптографии = Неопределено;
+ КонецЕсли;
+
+ Контекст.Вставить("МенеджерКриптографии", МенеджерКриптографии);
+
+ Если Не ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ПроверятьЭлектронныеПодписиНаСервере Тогда
+ // Проверка подписи и сертификата на стороне клиента.
+ Если МенеджерКриптографии = Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Неопределено);
+ Возврат;
+ КонецЕсли;
+
+ Если ТипЗнч(Контекст.ИсходныеДанные) = Тип("Строка")
+ И ЭтоАдресВременногоХранилища(Контекст.ИсходныеДанные) Тогда
+
+ Контекст.ИсходныеДанные = ПолучитьИзВременногоХранилища(Контекст.ИсходныеДанные);
+ КонецЕсли;
+
+ Контекст.Вставить("ПроверитьСертификатНаКлиенте");
+
+ ПроверитьПодписьНаКлиенте(Контекст);
+ Возврат;
+ КонецЕсли;
+
+ Если МенеджерКриптографии <> Неопределено
+ И Не ( ТипЗнч(Контекст.ИсходныеДанные) = Тип("Строка")
+ И ЭтоАдресВременногоХранилища(Контекст.ИсходныеДанные)) Тогда
+ // Математическая проверка подписи на стороне клиента для повышения производительности и
+ // безопасности в случае, когда ИсходныеДанные являются результатом расшифровки секретного файла.
+
+ // Сертификат проверяется и на сервере и на клиенте.
+ ПроверитьПодписьНаКлиенте(Контекст);
+ Возврат;
+ КонецЕсли;
+
+ // Проверка подписи и сертификата на сервере.
+ Если ТипЗнч(Контекст.ИсходныеДанные) = Тип("Строка")
+ И ЭтоАдресВременногоХранилища(Контекст.ИсходныеДанные) Тогда
+
+ АдресИсходныхДанных = Контекст.ИсходныеДанные;
+
+ ИначеЕсли ТипЗнч(Контекст.ИсходныеДанные) = Тип("ДвоичныеДанные") Тогда
+ АдресИсходныхДанных = ПоместитьВоВременноеХранилище(Контекст.ИсходныеДанные);
+ КонецЕсли;
+
+ Если ТипЗнч(Контекст.Подпись) = Тип("Строка")
+ И ЭтоАдресВременногоХранилища(Контекст.Подпись) Тогда
+
+ АдресПодписи = Контекст.Подпись;
+
+ ИначеЕсли ТипЗнч(Контекст.Подпись) = Тип("ДвоичныеДанные") Тогда
+ АдресПодписи = ПоместитьВоВременноеХранилище(Контекст.Подпись);
+ КонецЕсли;
+
+ ОписаниеОшибки = "";
+ Результат = ЭлектроннаяПодписьСлужебныйВызовСервера.ПроверитьПодпись(
+ АдресИсходныхДанных, АдресПодписи, ОписаниеОшибки);
+
+ Если Результат <> Истина Тогда
+ Результат = ОписаниеОшибки;
+ КонецЕсли;
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьПодпись.
+Процедура ПроверитьПодписьНаКлиенте(Контекст)
+
+ Подпись = Контекст.Подпись;
+
+ Если ТипЗнч(Подпись) = Тип("Строка") И ЭтоАдресВременногоХранилища(Подпись) Тогда
+ Подпись = ПолучитьИзВременногоХранилища(Подпись);
+ КонецЕсли;
+
+ Контекст.МенеджерКриптографии.НачатьПроверкуПодписи(Новый ОписаниеОповещения(
+ "ПроверитьПодписьНаКлиентеПослеПроверкиПодписи", ЭтотОбъект, Контекст,
+ "ПроверитьПодписьНаКлиентеПослеОшибкиПроверкиПодписи", ЭтотОбъект),
+ Контекст.ИсходныеДанные, Подпись);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьПодпись.
+Процедура ПроверитьПодписьНаКлиентеПослеОшибкиПроверкиПодписи(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
+
+ СтандартнаяОбработка = Ложь;
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьПодпись.
+Процедура ПроверитьПодписьНаКлиентеПослеПроверкиПодписи(Сертификат, Контекст) Экспорт
+
+ Если Сертификат = Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение,
+ НСтр("ru = 'Сертификат не найден в данных подписи.'"));
+ Возврат;
+ КонецЕсли;
+
+ Если Контекст.Свойство("ПроверитьСертификатНаКлиенте") Тогда
+ МенеджерКриптографии = Контекст.МенеджерКриптографии;
+ Иначе
+ // Проверка сертификата на сервере и на клиенте.
+ МенеджерКриптографии = Неопределено;
+ КонецЕсли;
+
+ ПроверитьСертификат(Контекст.Оповещение, Сертификат, МенеджерКриптографии);
+
+КонецПроцедуры
+
+
+// Проверяет действительность сертификата криптографии.
+//
+// Параметры:
+// Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов:
+// Булево - Истина, если проверка выполнена успешно.
+// Строка - описание ошибки проверки сертификата.
+// Неопределено - не удалось получить менеджер криптографии (когда не указан).
+//
+// Сертификат - СертификатКриптографии - сертификат.
+// - ДвоичныеДанные - двоичные данные сертификата.
+// - Строка - адрес временного хранилища, содержащего двоичные данные сертификата.
+//
+// МенеджерКриптографии - Неопределено - получить менеджер криптографии автоматически.
+// - МенеджерКриптографии - использовать указанный менеджер криптографии
+// (проверка на сервере не будет выполнена).
+//
+Процедура ПроверитьСертификат(Оповещение, Сертификат, МенеджерКриптографии = Неопределено) Экспорт
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("Сертификат", Сертификат);
+ Контекст.Вставить("МенеджерКриптографии", МенеджерКриптографии);
+ Контекст.Вставить("ОписаниеОшибкиНаСервере", Неопределено);
+
+ Если Контекст.МенеджерКриптографии = Неопределено
+ И ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ПроверятьЭлектронныеПодписиНаСервере Тогда
+
+ // Проверка на сервере перед проверкой на клиенте.
+ Если ТипЗнч(Сертификат) = Тип("СертификатКриптографии") Тогда
+
+ Сертификат.НачатьВыгрузку(Новый ОписаниеОповещения(
+ "ПроверитьСертификатПослеВыгрузкиСертификата", ЭтотОбъект, Контекст));
+ Иначе
+ ПроверитьСертификатПослеВыгрузкиСертификата(Сертификат, Контекст);
+ КонецЕсли;
+ Иначе
+ // Когда менеджер криптографии указан, тогда проверка выполняется только на клиенте.
+ ПроверитьСертификатНаКлиенте(Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьСертификат.
+Процедура ПроверитьСертификатПослеВыгрузкиСертификата(Сертификат, Контекст) Экспорт
+
+ // Проверка сертификата на сервере.
+ Если ТипЗнч(Сертификат) = Тип("ДвоичныеДанные") Тогда
+ АдресСертификата = ПоместитьВоВременноеХранилище(Сертификат);
+ Иначе
+ АдресСертификата = Сертификат;
+ КонецЕсли;
+
+ Если ЭлектроннаяПодписьСлужебныйВызовСервера.ПроверитьСертификат(АдресСертификата,
+ Контекст.ОписаниеОшибкиНаСервере) Тогда
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина);
+ Иначе
+ ПроверитьСертификатНаКлиенте(Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьСертификат.
+Процедура ПроверитьСертификатНаКлиенте(Контекст)
+
+ Если Контекст.МенеджерКриптографии = Неопределено Тогда
+ СоздатьМенеджерКриптографии(Новый ОписаниеОповещения(
+ "ПроверитьСертификатПослеСозданияМенеджераКриптографии", ЭтотОбъект, Контекст),
+ "ПроверкаСертификата", Контекст.ОписаниеОшибкиНаСервере = Неопределено);
+ Иначе
+ ПроверитьСертификатПослеСозданияМенеджераКриптографии(Контекст.МенеджерКриптографии, Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьСертификат.
+Процедура ПроверитьСертификатПослеСозданияМенеджераКриптографии(Результат, Контекст) Экспорт
+
+ Если ТипЗнч(Результат) <> Тип("МенеджерКриптографии") Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Контекст.ОписаниеОшибкиНаСервере);
+ Возврат;
+ КонецЕсли;
+
+ Контекст.МенеджерКриптографии = Результат;
+
+ СертификатДляПроверки = Контекст.Сертификат;
+
+ Если ТипЗнч(СертификатДляПроверки) = Тип("Строка") Тогда
+ СертификатДляПроверки = ПолучитьИзВременногоХранилища(СертификатДляПроверки);
+ КонецЕсли;
+
+ Если ТипЗнч(СертификатДляПроверки) = Тип("ДвоичныеДанные") Тогда
+ СертификатКриптографии = Новый СертификатКриптографии;
+ СертификатКриптографии.НачатьИнициализацию(Новый ОписаниеОповещения(
+ "ПроверитьСертификатПослеИнициализацииСертификата", ЭтотОбъект, Контекст),
+ СертификатДляПроверки);
+ Иначе
+ ПроверитьСертификатПослеИнициализацииСертификата(СертификатДляПроверки, Контекст)
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьСертификат.
+Процедура ПроверитьСертификатПослеИнициализацииСертификата(СертификатКриптографии, Контекст) Экспорт
+
+ РежимыПроверкиСертификата = ЭлектроннаяПодписьСлужебныйКлиентСервер.РежимыПроверкиСертификата();
+
+ Контекст.МенеджерКриптографии.НачатьПроверкуСертификата(Новый ОписаниеОповещения(
+ "ПроверитьСертификатНаКлиентеПослеПроверки", ЭтотОбъект, Контекст,
+ "ПроверитьСертификатНаКлиентеПослеОшибкиПроверки", ЭтотОбъект),
+ СертификатКриптографии, РежимыПроверкиСертификата);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьСертификат.
+Процедура ПроверитьСертификатНаКлиентеПослеОшибкиПроверки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
+
+ СтандартнаяОбработка = Ложь;
+ ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
+
+ Если Контекст.ОписаниеОшибкиНаСервере <> Неопределено Тогда
+ ОписаниеОшибки = Контекст.ОписаниеОшибкиНаСервере + " " + НСтр("ru = '(на сервере)'") + Символы.ПС
+ + ОписаниеОшибки + " " + НСтр("ru = '(на клиенте)'");
+ КонецЕсли;
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, ОписаниеОшибки);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПроверитьСертификат.
+Процедура ПроверитьСертификатНаКлиентеПослеПроверки(Контекст) Экспорт
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина);
+
+КонецПроцедуры
+
+
+// Создает и возвращает менеджер криптографии (на клиенте) для указанной программы.
+//
+// Параметры:
+// Оповещение - ОписаниеОповещения - оповещение о результате выполнения следующих типов:
+// МенеджерКриптографии - инициализированный менеджер криптографии.
+// Строка - описание ошибки при создании менеджера криптографии.
+// Структура - если ПоказатьОшибку = Неопределено. Содержит ошибки обращения к программам.
+// * ОписаниеОшибки - Строка - описание ошибки, когда оно возвращается строкой.
+// * ЗаголовокОшибки - Строка - заголовок ошибки, который соответствует операции.
+// * Описание - Строка - описание общей ошибки.
+// * Общая - Булево - если Истина, то содержит описание ошибки для всех программ,
+// иначе альтернативное описание массиву Ошибки.
+// * КАдминистратору - Булево - для исправления общей ошибки требуются права администратора.
+// * Ошибки - Массив - содержит структуры описания ошибок программ со свойствами:
+// * Программа - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования.
+// * Описание - Строка - содержит представление ошибки.
+// * ИзИсключения - Булево - описание содержит краткое представление информации об ошибке.
+// * НеУказанПуть - Булево - описание содержит ошибку о неуказанном пути для ОС Linux.
+// * КАдминистратору - Булево - для исправления ошибки требуются права администратора.
+//
// Операция - Строка - если не пустая, то должна содержать одну из строк, которые определяют
// операцию для вставки в описание ошибки: Подписание, ПроверкаПодписи, Шифрование,
// Расшифровка, ПроверкаСертификата, ПолучениеСертификатов.
@@ -17,34 +895,31 @@
// в форму персональных настроек на страницу "Установленные программы",
// в которой можно увидеть почему программу не удалось задействовать,
// а также открыть инструкцию по установке.
-//
-// ОписаниеОшибки - Строка - возвращаемое описание ошибки, если возвращено значение Неопределено.
-// - Структура - содержит ошибки обращения к программам, если возвращено Неопределено.
-// * ОписаниеОшибки - Строка - описание ошибки, когда оно возвращается строкой.
-// * ЗаголовокОшибки - Строка - заголовок ошибки, который соответствует операции.
-// * Описание - Строка - описание общей ошибки.
-// * Общая - Булево - если Истина, то содержит описание ошибки для всех программ,
-// иначе альтернативное описание массиву Ошибки.
-// * КАдминистратору - Булево - для исправления общей ошибки требуются права администратора.
-// * Ошибки - Массив - содержит структуры описания ошибок программ со свойствами:
-// * Программа - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования.
-// * Описание - Строка - содержит представление ошибки.
-// * ИзИсключения - Булево - описание содержит краткое представление информации об ошибке.
-// * НеУказанПуть - Булево - описание содержит ошибку о неуказанном пути для ОС Linux.
-// * КАдминистратору - Булево - для исправления ошибки требуются права администратора.
+// - Неопределено - вернуть все ошибки обращения к программам (см. выше).
//
// Программа - Неопределено - возвращает менеджер криптографии первой
// программы из справочника для которой удалось его создать.
// - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - программа
// для которой нужно создать и вернуть менеджер криптографии.
//
-// Возвращаемое значение:
-// МенеджерКриптографии - менеджер криптографии.
-// Неопределено - произошла ошибка, описание которой в параметре ОписаниеОшибки.
-//
-Функция МенеджерКриптографии(Операция, ПоказатьОшибку = Истина, ОписаниеОшибки = "", Программа = Неопределено) Экспорт
+Процедура СоздатьМенеджерКриптографии(Оповещение, Операция, ПоказатьОшибку = Истина, Программа = Неопределено) Экспорт
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("Операция", Операция);
+ Контекст.Вставить("ПоказатьОшибку", ПоказатьОшибку);
+ Контекст.Вставить("Программа", Программа);
+
+ НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения(
+ "СоздатьМенеджерКриптографииПослеПодключенияРасширенияРаботыСКриптографией", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры СоздатьМенеджерКриптографии.
+Процедура СоздатьМенеджерКриптографииПослеПодключенияРасширенияРаботыСКриптографией(Подключено, Контекст) Экспорт
ЗаголовокФормы = НСтр("ru = 'Требуется программа электронной подписи и шифрования'");
+ Операция = Контекст.Операция;
Если Операция = "Подписание" Тогда
ЗаголовокОшибки = НСтр("ru = 'Не удалось подписать данные по причине:'");
@@ -64,15 +939,13 @@
ИначеЕсли Операция = "ПолучениеСертификатов" Тогда
ЗаголовокОшибки = НСтр("ru = 'Не удалось получить сертификаты по причине:'");
+ ИначеЕсли Операция = Null И Контекст.ПоказатьОшибку <> Истина Тогда
+ ЗаголовокОшибки = "";
+
ИначеЕсли Операция <> "" Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Ошибка в функции МенеджерКриптографии.
|Неверное значение параметра Операция ""%1"".'"), Операция);
-
- ИначеЕсли ТипЗнч(ОписаниеОшибки) = Тип("Структура")
- И ОписаниеОшибки.Свойство("ЗаголовокОшибки") Тогда
-
- ЗаголовокОшибки = ОписаниеОшибки.ЗаголовокОшибки;
Иначе
ЗаголовокОшибки = НСтр("ru = 'Не удалось выполнить операцию по причине:'");
КонецЕсли;
@@ -82,7 +955,7 @@
СвойстваОшибки.Вставить("Общая", Ложь);
СвойстваОшибки.Вставить("КАдминистратору", Ложь);
- Если Не ПодключитьРасширениеРаботыСКриптографией() Тогда
+ Если Не Подключено Тогда
ТекстОшибки =
НСтр("ru = 'В обозреватель интернет требуется установить расширение
|для работы с электронной подписью и шифрованием.'");
@@ -92,32 +965,164 @@
СвойстваОшибки.Вставить("Ошибки", Новый Массив);
СвойстваОшибки.Вставить("Расширение", Истина);
- СвойстваОшибки.Вставить("ОписаниеОшибки", ЗаголовокОшибки + Символы.ПС + ТекстОшибки);
- Если ТипЗнч(ОписаниеОшибки) = Тип("Структура") Тогда
+ СвойстваОшибки.Вставить("ОписаниеОшибки", СокрЛП(ЗаголовокОшибки + Символы.ПС + ТекстОшибки));
+ Если Контекст.ПоказатьОшибку = Неопределено Тогда
ОписаниеОшибки = СвойстваОшибки;
Иначе
ОписаниеОшибки = СвойстваОшибки.ОписаниеОшибки;
КонецЕсли;
- Если ПоказатьОшибку Тогда
+ Если Контекст.ПоказатьОшибку = Истина Тогда
ПоказатьОшибкуОбращенияКПрограмме(
ЗаголовокФормы, ЗаголовокОшибки, СвойстваОшибки, Новый Структура);
КонецЕсли;
- Возврат Неопределено;
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, ОписаниеОшибки);
+ Возврат;
КонецЕсли;
- ЭтоLinux = ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент();
+ Контекст.Вставить("ЗаголовокФормы", ЗаголовокФормы);
+ Контекст.Вставить("ЗаголовокОшибки", ЗаголовокОшибки);
+ Контекст.Вставить("СвойстваОшибки", СвойстваОшибки);
+ Контекст.Вставить("ЭтоLinux", ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент());
- Ошибки = Новый Массив;
- Менеджер = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографии(
- Программа, ЭтоLinux, Ошибки, Ложь);
+ СвойстваОшибки.Вставить("Ошибки", Новый Массив);
- Если Менеджер <> Неопределено Тогда
- Возврат Менеджер;
+ ОписанияПрограмм = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииОписанияПрограмм(
+ Контекст.Программа, СвойстваОшибки.Ошибки);
+
+ Контекст.Вставить("Менеджер", Неопределено);
+
+ Если ОписанияПрограмм = Неопределено Или ОписанияПрограмм.Количество() = 0 Тогда
+ СоздатьМенеджерКриптографииПослеЦикла(Контекст);
+ Возврат;
КонецЕсли;
- СвойстваОшибки.Вставить("Ошибки", Ошибки);
+ Контекст.Вставить("ОписанияПрограмм", ОписанияПрограмм);
+ Контекст.Вставить("Индекс", -1);
- Если Ошибки.Количество() = 0 Тогда
+ СоздатьМенеджерКриптографииЦиклНачало(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры СоздатьМенеджерКриптографии.
+Процедура СоздатьМенеджерКриптографииЦиклНачало(Контекст) Экспорт
+
+ Если Контекст.ОписанияПрограмм.Количество() <= Контекст.Индекс + 1 Тогда
+ СоздатьМенеджерКриптографииПослеЦикла(Контекст);
+ Возврат;
+ КонецЕсли;
+ Контекст.Индекс = Контекст.Индекс + 1;
+ Контекст.Вставить("ОписаниеПрограммы", Контекст.ОписанияПрограмм[Контекст.Индекс]);
+
+ СвойстваПрограммы = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииСвойстваПрограммы(
+ Контекст.ОписаниеПрограммы,
+ Контекст.ЭтоLinux,
+ Контекст.СвойстваОшибки.Ошибки,
+ Ложь);
+
+ Если СвойстваПрограммы = Неопределено Тогда
+ СоздатьМенеджерКриптографииЦиклНачало(Контекст);
+ Возврат;
+ КонецЕсли;
+
+ Контекст.Вставить("СвойстваПрограммы", СвойстваПрограммы);
+
+ СредстваКриптографии.НачатьПолучениеИнформацииМодуляКриптографии(Новый ОписаниеОповещения(
+ "СоздатьМенеджерКриптографииЦиклПослеПолученияИнформации", ЭтотОбъект, Контекст,
+ "СоздатьМенеджерКриптографииЦиклПослеОшибкиПолученияИнформации", ЭтотОбъект),
+ Контекст.СвойстваПрограммы.ИмяПрограммы,
+ Контекст.СвойстваПрограммы.ПутьКПрограмме,
+ Контекст.СвойстваПрограммы.ТипПрограммы);
+
+КонецПроцедуры
+
+// Продолжение процедуры СоздатьМенеджерКриптографии.
+Процедура СоздатьМенеджерКриптографииЦиклПослеОшибкиПолученияИнформации(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
+
+ СоздатьМенеджерКриптографииЦиклПриОшибкеИнициализации(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры СоздатьМенеджерКриптографии.
+Процедура СоздатьМенеджерКриптографииЦиклПослеПолученияИнформации(ИнформацияМодуля, Контекст) Экспорт
+
+ Если ИнформацияМодуля = Неопределено Тогда
+ ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииПрограммаНеНайдена(
+ Контекст.ОписаниеПрограммы, Контекст.СвойстваОшибки.Ошибки, Ложь);
+
+ Контекст.Менеджер = Неопределено;
+ СоздатьМенеджерКриптографииЦиклНачало(Контекст);
+ Возврат;
+ КонецЕсли;
+
+ Если Не Контекст.ЭтоLinux Тогда
+ ИмяПрограммыПолученное = ИнформацияМодуля.Имя;
+
+ ИмяПрограммыСовпадает = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииИмяПрограммыСовпадает(
+ Контекст.ОписаниеПрограммы, ИмяПрограммыПолученное, Контекст.СвойстваОшибки.Ошибки, Ложь);
+
+ Если Не ИмяПрограммыСовпадает Тогда
+ Контекст.Менеджер = Неопределено;
+ СоздатьМенеджерКриптографииЦиклНачало(Контекст);
+ Возврат;
+ КонецЕсли;
+ КонецЕсли;
+
+ Контекст.Менеджер = Новый МенеджерКриптографии;
+
+ Контекст.Менеджер.НачатьИнициализацию(Новый ОписаниеОповещения(
+ "СоздатьМенеджерКриптографииЦиклПослеИнициализации", ЭтотОбъект, Контекст,
+ "СоздатьМенеджерКриптографииЦиклПриОшибкеИнициализации", ЭтотОбъект),
+ Контекст.СвойстваПрограммы.ИмяПрограммы,
+ Контекст.СвойстваПрограммы.ПутьКПрограмме,
+ Контекст.СвойстваПрограммы.ТипПрограммы);
+
+КонецПроцедуры
+
+// Продолжение процедуры СоздатьМенеджерКриптографии.
+Процедура СоздатьМенеджерКриптографииЦиклПриОшибкеИнициализации(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
+
+ СтандартнаяОбработка = Ложь;
+ Контекст.Менеджер = Неопределено;
+
+ ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииДобавитьОшибку(
+ Контекст.СвойстваОшибки.Ошибки,
+ Контекст.ОписаниеПрограммы.Ссылка,
+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке),
+ Ложь, Истина, Истина);
+
+ СоздатьМенеджерКриптографииЦиклНачало(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры СоздатьМенеджерКриптографии.
+Процедура СоздатьМенеджерКриптографииЦиклПослеИнициализации(Неопределен, Контекст) Экспорт
+
+ АлгоритмыУстановлены = ЭлектроннаяПодписьСлужебныйКлиентСервер.МенеджерКриптографииАлгоритмыУстановлены(
+ Контекст.ОписаниеПрограммы,
+ Контекст.Менеджер,
+ Контекст.СвойстваОшибки.Ошибки);
+
+ Если Не АлгоритмыУстановлены Тогда
+ СоздатьМенеджерКриптографииЦиклНачало(Контекст);
+ Возврат;
+ КонецЕсли;
+
+ // Требуемый менеджер криптографии получен.
+ СоздатьМенеджерКриптографииПослеЦикла(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры СоздатьМенеджерКриптографии.
+Процедура СоздатьМенеджерКриптографииПослеЦикла(Контекст) Экспорт
+
+ Если Контекст.Менеджер <> Неопределено Или Не Контекст.Свойство("ЗаголовокОшибки") Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Контекст.Менеджер);
+ Возврат;
+ КонецЕсли;
+
+ СвойстваОшибки = Контекст.СвойстваОшибки;
+
+ Если СвойстваОшибки.Ошибки.Количество() = 0 Тогда
ТекстОшибки = НСтр("ru = 'Не предусмотрено использование ни одной программы.'");
СвойстваОшибки.Вставить("Описание", ТекстОшибки);
СвойстваОшибки.Общая = Истина;
@@ -128,30 +1133,31 @@
СвойстваОшибки.Вставить("Инструкция", Истина);
СвойстваОшибки.Вставить("НастройкаПрограмм", Истина);
Иначе
- Если ЗначениеЗаполнено(Программа) Тогда
+ Если ЗначениеЗаполнено(Контекст.Программа) Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Программа %1 не доступна или не установлена на компьютере.'"), Программа);
+ НСтр("ru = 'Программа %1 не доступна или не установлена на компьютере.'"), Контекст.Программа);
Иначе
ТекстОшибки = НСтр("ru = 'Ни одна из программ не доступна или не установлена на компьютере.'");
КонецЕсли;
СвойстваОшибки.Вставить("Описание", ТекстОшибки);
КонецЕсли;
- СвойстваОшибки.Вставить("ОписаниеОшибки", ЗаголовокОшибки + Символы.ПС + ТекстОшибки);
- Если ТипЗнч(ОписаниеОшибки) = Тип("Структура") Тогда
+ СвойстваОшибки.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + Символы.ПС + ТекстОшибки);
+ Если Контекст.ПоказатьОшибку = Неопределено Тогда
ОписаниеОшибки = СвойстваОшибки;
Иначе
ОписаниеОшибки = СвойстваОшибки.ОписаниеОшибки;
КонецЕсли;
- Если ПоказатьОшибку = Истина Тогда
+ Если Контекст.ПоказатьОшибку = Истина Тогда
ПоказатьОшибкуОбращенияКПрограмме(
- ЗаголовокФормы, ЗаголовокОшибки, СвойстваОшибки, Новый Структура);
+ Контекст.ЗаголовокФормы, Контекст.ЗаголовокОшибки, СвойстваОшибки, Новый Структура);
КонецЕсли;
- Возврат Неопределено;
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, ОписаниеОшибки);
-КонецФункции
+КонецПроцедуры
+
// Готовит строку для использования в качестве имени файла.
Функция ПодготовитьСтрокуДляИмениФайла(Строка, ЗаменаПробела = Неопределено) Экспорт
@@ -202,6 +1208,7 @@
КонецФункции
+
// Только для внутреннего назначения.
//
// Параметры:
@@ -227,7 +1234,7 @@
КонецЕсли;
Если ПараметрыСоздания.Свойство("СоздатьЗаявление") И ПараметрыСоздания.СоздатьЗаявление = Истина Тогда
- ПослеВыбораНазначенияДобавляемогоСертификата("ЗаявлениеНаВыпускСертификата", ПараметрыСоздания);
+ ДобавитьСертификатПослеВыбораНазначения("ЗаявлениеНаВыпускСертификата", ПараметрыСоздания);
Возврат;
КонецЕсли;
@@ -237,46 +1244,34 @@
Форма = ОткрытьФорму("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.ДобавлениеСертификата",
Новый Структура("СкрытьЗаявление", ПараметрыСоздания.СкрытьЗаявление),,,,,
- Новый ОписаниеОповещения("ПослеВыбораНазначенияДобавляемогоСертификата", ЭтотОбъект, ПараметрыСоздания));
+ Новый ОписаниеОповещения("ДобавитьСертификатПослеВыбораНазначения", ЭтотОбъект, ПараметрыСоздания));
Если Форма = Неопределено Тогда
- ПослеВыбораНазначенияДобавляемогоСертификата("ДляПодписанияШифрованияИРасшифровки", ПараметрыСоздания);
+ ДобавитьСертификатПослеВыбораНазначения("ДляПодписанияШифрованияИРасшифровки", ПараметрыСоздания);
КонецЕсли;
КонецПроцедуры
+
// Только для внутреннего назначения.
-Процедура ПослеВыбораНазначенияДобавляемогоСертификата(Назначение, ПараметрыСоздания) Экспорт
+Процедура ДобавитьСертификатПослеВыбораНазначения(Назначение, ПараметрыСоздания) Экспорт
ПараметрыФормы = Новый Структура;
Если Назначение = "ЗаявлениеНаВыпускСертификата" Тогда
-
ПараметрыФормы.Вставить("ЛичныйСписокПриДобавлении", ПараметрыСоздания.ВЛичныйСписок);
ПараметрыФормы.Вставить("Организация", ПараметрыСоздания.Организация);
ОткрытьФорму("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата",
ПараметрыФормы);
-
- ИначеЕсли Назначение = "ТолькоДляШифрованияИзФайла" Тогда
- ДобавитьСертификатТолькоДляШифрованияИзФайла(ПараметрыСоздания.ВЛичныйСписок);
+ Возврат;
+ КонецЕсли;
- ИначеЕсли Назначение = "ТолькоДляШифрования" Тогда
-
- ОшибкаПолученияСертификатовНаКлиенте = Новый Структура;
- СвойстваСертификатовНаКлиенте = Новый Массив;
-
- МенеджерКриптографии = МенеджерКриптографии("ПолучениеСертификатов", Ложь,
- ОшибкаПолученияСертификатовНаКлиенте);
-
- ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатовИзХранилища(
- СвойстваСертификатовНаКлиенте, МенеджерКриптографии, Ложь, Ложь);
-
- ПараметрыФормы.Вставить("СвойстваСертификатовНаКлиенте", СвойстваСертификатовНаКлиенте);
- ПараметрыФормы.Вставить("ОшибкаПолученияСертификатовНаКлиенте", ОшибкаПолученияСертификатовНаКлиенте);
- ПараметрыФормы.Вставить("ЛичныйСписокПриДобавлении", ПараметрыСоздания.ВЛичныйСписок);
- Форма = ОткрытьФорму("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.ДобавлениеСертификатаДляШифрования",
- ПараметрыФормы);
- Иначе
+ Если Назначение = "ТолькоДляШифрованияИзФайла" Тогда
+ ДобавитьСертификатТолькоДляШифрованияИзФайла(ПараметрыСоздания.ВЛичныйСписок);
+ Возврат;
+ КонецЕсли;
+
+ Если Назначение <> "ТолькоДляШифрования" Тогда
ПараметрыФормы.Вставить("ДляШифрованияИРасшифровки", Неопределено);
Если Назначение = "ДляШифрованияИРасшифровки" Тогда
@@ -290,18 +1285,142 @@
ПараметрыФормы.Вставить("ЛичныйСписокПриДобавлении", ПараметрыСоздания.ВЛичныйСписок);
ПараметрыФормы.Вставить("Организация", ПараметрыСоздания.Организация);
ВыборСертификатаДляПодписанияИлиРасшифровки(ПараметрыФормы);
+ Возврат;
КонецЕсли;
+ Контекст = Новый Структура;
+ Контекст.Вставить("ПараметрыСоздания", ПараметрыСоздания);
+
+ ПолучитьСвойстваСертификатовНаКлиенте(Новый ОписаниеОповещения(
+ "ДобавитьСертификатПослеПолученияСвойствСертификатовНаКлиенте", ЭтотОбъект, Контекст),
+ Ложь, Ложь);
+
КонецПроцедуры
+// Продолжение процедуры ДобавитьСертификатПослеВыбораНазначения.
+Процедура ДобавитьСертификатПослеПолученияСвойствСертификатовНаКлиенте(Результат, Контекст) Экспорт
+
+ ПараметрыФормы = Новый Структура;
+ ПараметрыФормы.Вставить("СвойстваСертификатовНаКлиенте", Результат.СвойстваСертификатовНаКлиенте);
+ ПараметрыФормы.Вставить("ОшибкаПолученияСертификатовНаКлиенте", Результат.ОшибкаПолученияСертификатовНаКлиенте);
+ ПараметрыФормы.Вставить("ЛичныйСписокПриДобавлении", Контекст.ПараметрыСоздания.ВЛичныйСписок);
+ Форма = ОткрытьФорму("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.ДобавлениеСертификатаДляШифрования",
+ ПараметрыФормы);
+
+КонецПроцедуры
+
+
+// Только для внутреннего назначения.
+Процедура ПолучитьСвойстваСертификатовНаКлиенте(Оповещение, Личные, БезОтбора, ТолькоОтпечатки = Ложь, ПоказатьОшибку = Неопределено) Экспорт
+
+ Результат = Новый Структура;
+ Результат.Вставить("ОшибкаПолученияСертификатовНаКлиенте", Новый Структура);
+ Результат.Вставить("СвойстваСертификатовНаКлиенте", ?(ТолькоОтпечатки, Новый Соответствие, Новый Массив));
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("Личные", Личные);
+ Контекст.Вставить("БезОтбора", БезОтбора);
+ Контекст.Вставить("ТолькоОтпечатки", ТолькоОтпечатки);
+ Контекст.Вставить("Результат", Результат);
+
+ СоздатьМенеджерКриптографии(Новый ОписаниеОповещения(
+ "ПолучитьСвойстваСертификатовНаКлиентеПослеСозданияМенеджераКриптографии", ЭтотОбъект, Контекст),
+ "ПолучениеСертификатов", ПоказатьОшибку);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьСвойстваСертификатовНаКлиенте.
+Процедура ПолучитьСвойстваСертификатовНаКлиентеПослеСозданияМенеджераКриптографии(МенеджерКриптографии, Контекст) Экспорт
+
+ Если ТипЗнч(МенеджерКриптографии) <> Тип("МенеджерКриптографии") Тогда
+ Контекст.Результат.ОшибкаПолученияСертификатовНаКлиенте = МенеджерКриптографии;
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Контекст.Результат);
+ Возврат;
+ КонецЕсли;
+
+ Контекст.Вставить("МенеджерКриптографии", МенеджерКриптографии);
+
+ Контекст.МенеджерКриптографии.НачатьПолучениеХранилищаСертификатов(
+ Новый ОписаниеОповещения(
+ "ПолучитьСвойстваСертификатовНаКлиентеПослеПолученияПерсональногоХранилища", ЭтотОбъект, Контекст),
+ ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьСвойстваСертификатовНаКлиенте.
+Процедура ПолучитьСвойстваСертификатовНаКлиентеПослеПолученияПерсональногоХранилища(Хранилище, Контекст) Экспорт
+
+ Хранилище.НачатьПолучениеВсех(Новый ОписаниеОповещения(
+ "ПолучитьСвойстваСертификатовНаКлиентеПослеПолученияВсехПерсональныхСертификатов", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьСвойстваСертификатовНаКлиенте.
+Процедура ПолучитьСвойстваСертификатовНаКлиентеПослеПолученияВсехПерсональныхСертификатов(Массив, Контекст) Экспорт
+
+ Контекст.Вставить("МассивСертификатов", Массив);
+
+ Если Контекст.Личные Тогда
+ ПолучитьСвойстваСертификатовНаКлиентеПослеПолученияВсех(Контекст);
+ Возврат;
+ КонецЕсли;
+
+ Контекст.МенеджерКриптографии.НачатьПолучениеХранилищаСертификатов(
+ Новый ОписаниеОповещения(
+ "ПолучитьСвойстваСертификатовНаКлиентеПослеПолученияХранилищаПолучателей", ЭтотОбъект, Контекст),
+ ТипХранилищаСертификатовКриптографии.СертификатыПолучателей);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьСвойстваСертификатовНаКлиенте.
+Процедура ПолучитьСвойстваСертификатовНаКлиентеПослеПолученияХранилищаПолучателей(Хранилище, Контекст) Экспорт
+
+ Хранилище.НачатьПолучениеВсех(Новый ОписаниеОповещения(
+ "ПолучитьСвойстваСертификатовНаКлиентеПослеПолученияВсехСертификатовПолучателей", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьСвойстваСертификатовНаКлиенте.
+Процедура ПолучитьСвойстваСертификатовНаКлиентеПослеПолученияВсехСертификатовПолучателей(Массив, Контекст) Экспорт
+
+ Для каждого Сертификат Из Массив Цикл
+ Контекст.МассивСертификатов.Добавить(Сертификат);
+ КонецЦикла;
+
+ ПолучитьСвойстваСертификатовНаКлиентеПослеПолученияВсех(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьСвойстваСертификатовНаКлиенте.
+Процедура ПолучитьСвойстваСертификатовНаКлиентеПослеПолученияВсех(Контекст)
+
+ ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатов(
+ Контекст.Результат.СвойстваСертификатовНаКлиенте,
+ Контекст.МассивСертификатов,
+ Контекст.БезОтбора,
+ Контекст.ТолькоОтпечатки);
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Контекст.Результат);
+
+КонецПроцедуры
+
+
// Только для внутреннего назначения.
Процедура ДобавитьСертификатТолькоДляШифрованияИзФайла(ВЛичныйСписок = Ложь) Экспорт
- Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
- ОбработкаПродолжения = Новый ОписаниеОповещения(
- "ДобавитьСертификатТолькоДляШифрованияПриНачалеПомещенияФайла", ЭтотОбъект, ВЛичныйСписок);
-
- НачатьПомещениеФайла(ОбработкаПродолжения, ПоместитьВоВременноеХранилище(Неопределено));
+ Контекст = Новый Структура("ВЛичныйСписок", ВЛичныйСписок);
+ НачатьПодключениеРасширенияРаботыСФайлами(Новый ОписаниеОповещения(
+ "ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеПодключенияРасширения", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры ДобавитьСертификатТолькоДляШифрованияИзФайла.
+Процедура ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеПодключенияРасширения(Подключено, Контекст) Экспорт
+
+ Если Не Подключено Тогда
+ НачатьПомещениеФайла(Новый ОписаниеОповещения(
+ "ДобавитьСертификатТолькоДляШифрованияИзФайлаПриНачалеПомещенияФайла", ЭтотОбъект, Контекст));
Возврат;
КонецЕсли;
@@ -309,39 +1428,47 @@
Диалог.Заголовок = НСтр("ru = 'Выберите файл сертификата (только для шифрования)'");
Диалог.Фильтр = НСтр("ru = 'Сертификат X.509 (*.cer;*.crt)|*.cer;*.crt|Все файлы(*.*)|*.*'");
- ПомещенныеФайлы = Новый Массив;
- Если Не ПоместитьФайлы(, ПомещенныеФайлы, Диалог, Ложь) Тогда
- Возврат;
- КонецЕсли;
-
- ДобавитьСертификатТолькоДляШифрованияПослеПомещенияФайла(ПомещенныеФайлы[0].Хранение, ВЛичныйСписок);
+ НачатьПомещениеФайлов(Новый ОписаниеОповещения(
+ "ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеПомещенияФайлов", ЭтотОбъект, Контекст),
+ , Диалог, Ложь);
КонецПроцедуры
-// Только для внутреннего назначения.
-Процедура ДобавитьСертификатТолькоДляШифрованияПриНачалеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ВЛичныйСписок) Экспорт
+// Продолжение процедуры ДобавитьСертификатТолькоДляШифрованияИзФайла.
+Процедура ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеПомещенияФайлов(ПомещенныеФайлы, Контекст) Экспорт
+
+ Если Не ЗначениеЗаполнено(ПомещенныеФайлы) Тогда
+ Возврат;
+ КонецЕсли;
+
+ ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеПомещенияФайла(ПомещенныеФайлы[0].Хранение, Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ДобавитьСертификатТолькоДляШифрованияИзФайла.
+Процедура ДобавитьСертификатТолькоДляШифрованияИзФайлаПриНачалеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, Контекст) Экспорт
Если Результат <> Истина Тогда
Возврат;
КонецЕсли;
- ДобавитьСертификатТолькоДляШифрованияПослеПомещенияФайла(Адрес, ВЛичныйСписок);
+ ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеПомещенияФайла(Адрес, Контекст);
КонецПроцедуры
-// Только для внутреннего назначения.
-Процедура ДобавитьСертификатТолькоДляШифрованияПослеПомещенияФайла(Адрес, ВЛичныйСписок)
+// Продолжение процедуры ДобавитьСертификатТолькоДляШифрованияИзФайла.
+Процедура ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеПомещенияФайла(Адрес, Контекст)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("АдресДанныхСертификата", Адрес);
- ПараметрыФормы.Вставить("ЛичныйСписокПриДобавлении", ВЛичныйСписок);
+ ПараметрыФормы.Вставить("ЛичныйСписокПриДобавлении", Контекст.ВЛичныйСписок);
Форма = ОткрытьФорму("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.ДобавлениеСертификатаДляШифрования",
ПараметрыФормы);
Если Форма = Неопределено Тогда
- ПоказатьПредупреждение(,
- НСтр("ru = 'Файл сертификата должен быть в формате DER X.509, операция прервана.'"));
- Возврат;
+ ПоказатьПредупреждение(,
+ НСтр("ru = 'Файл сертификата должен быть в формате DER X.509, операция прервана.'"));
+ Возврат;
КонецЕсли;
Если Не Форма.Открыта() Тогда
@@ -349,21 +1476,21 @@
Кнопки.Добавить("Открыть", НСтр("ru = 'Открыть'"));
Кнопки.Добавить("Отмена", НСтр("ru = 'Отмена'"));
ПоказатьВопрос(
- Новый ОписаниеОповещения("ДобавитьСертификатТолькоДляШифрованияПослеПредупрежденияОСуществующем",
+ Новый ОписаниеОповещения("ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеПредупрежденияОСуществующем",
ЭтотОбъект, Форма.Сертификат),
НСтр("ru = 'Сертификат уже добавлен.'"), Кнопки);
КонецЕсли;
КонецПроцедуры
-// Только для внутреннего назначения.
-Процедура ДобавитьСертификатТолькоДляШифрованияПослеПредупрежденияОСуществующем(Ответ, Сертификат) Экспорт
+// Продолжение процедуры ДобавитьСертификатТолькоДляШифрованияИзФайла.
+Процедура ДобавитьСертификатТолькоДляШифрованияИзФайлаПослеПредупрежденияОСуществующем(Ответ, Сертификат) Экспорт
Если Ответ <> "Открыть" Тогда
Возврат;
КонецЕсли;
- ЭлектроннаяПодписьКлиент.ОткрытьСертификат(Сертификат);
+ ОткрытьСертификат(Сертификат);
КонецПроцедуры
@@ -372,6 +1499,18 @@
Процедура ПоказатьОшибкуОбращенияКПрограмме(ЗаголовокФормы, ЗаголовокОшибки, ОшибкаНаКлиенте, ОшибкаНаСервере,
ДополнительныеПараметры = Неопределено, ОбработкаПродолжения = Неопределено) Экспорт
+ Если ТипЗнч(ОшибкаНаКлиенте) <> Тип("Структура") Тогда
+ ВызватьИсключение
+ НСтр("ru = 'Для процедуры ПоказатьОшибкуОбращенияКПрограмме
+ |указан некорректный тип параметра ОшибкаНаКлиенте.'");
+ КонецЕсли;
+
+ Если ТипЗнч(ОшибкаНаСервере) <> Тип("Структура") Тогда
+ ВызватьИсключение
+ НСтр("ru = 'Для процедуры ПоказатьОшибкуОбращенияКПрограмме
+ |указан некорректный тип параметра ОшибкаНаСервере.'");
+ КонецЕсли;
+
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ПоказатьИнструкцию", Ложь);
ПараметрыФормы.Вставить("ПоказатьПереходКНастройкеПрограмм", Ложь);
@@ -387,10 +1526,22 @@
ПараметрыФормы.Вставить("ОшибкаНаКлиенте", ОшибкаНаКлиенте);
ПараметрыФормы.Вставить("ОшибкаНаСервере", ОшибкаНаСервере);
- ПараметрыФормы.Вставить("РасширениеПодключено", ПодключитьРасширениеРаботыСКриптографией());
+ Контекст = Новый Структура;
+ Контекст.Вставить("ПараметрыФормы", ПараметрыФормы);
+ Контекст.Вставить("ОбработкаПродолжения", ОбработкаПродолжения);
- ОткрытьФорму("Справочник.ПрограммыЭлектроннойПодписиИШифрования.Форма.ОшибкаОбращенияКПрограмме",
- ПараметрыФормы,,, ВариантОткрытияОкна.ОтдельноеОкно, , ОбработкаПродолжения);
+ НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения(
+ "ПоказатьОшибкуОбращенияКПрограммеПослеПодключенияРасширения", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры ПоказатьОшибкуОбращенияКПрограмме.
+Процедура ПоказатьОшибкуОбращенияКПрограммеПослеПодключенияРасширения(Подключено, Контекст) Экспорт
+
+ Контекст.ПараметрыФормы.Вставить("РасширениеПодключено", Подключено);
+
+ Форма = ОткрытьФорму("Справочник.ПрограммыЭлектроннойПодписиИШифрования.Форма.ОшибкаОбращенияКПрограмме",
+ Контекст.ПараметрыФормы,,,, , Контекст.ОбработкаПродолжения);
КонецПроцедуры
@@ -418,19 +1569,54 @@
СерверныеПараметры.Вставить("БезПодтверждения", Истина);
КонецЕсли;
- НастроитьПредставлениеДанных(ОписаниеДанных, СерверныеПараметры);
+ Если СерверныеПараметры.Свойство("НаборСертификатов")
+ И ОписаниеДанных.Свойство("БезПодтверждения")
+ И ОписаниеДанных.БезПодтверждения Тогда
+
+ СерверныеПараметры.Вставить("БезПодтверждения", Истина);
+ КонецЕсли;
- СерверныеПараметры.Вставить("ОтпечаткиСертификатовНаКлиенте", ОтпечаткиСертификатовНаКлиенте());
+ НастроитьПредставлениеДанных(КлиентскиеПараметры, СерверныеПараметры);
- ФормаПередачаПараметров().ОткрытьНовуюФорму(ВидФормы,
- СерверныеПараметры, КлиентскиеПараметры, ОбработкаЗавершения);
+ Контекст = Новый Структура;
+ Контекст.Вставить("ВидФормы", ВидФормы);
+ Контекст.Вставить("КлиентскиеПараметры", КлиентскиеПараметры);
+ Контекст.Вставить("СерверныеПараметры", СерверныеПараметры);
+ Контекст.Вставить("ОбработкаЗавершения", ОбработкаЗавершения);
+
+ ПолучитьОтпечаткиСертификатовНаКлиенте(Новый ОписаниеОповещения(
+ "ОткрытьНовуюФормуЗавершение", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры ОткрытьНовуюФорму.
+Процедура ОткрытьНовуюФормуЗавершение(ОтпечаткиСертификатовНаКлиенте, Контекст) Экспорт
+
+ Контекст.СерверныеПараметры.Вставить("ОтпечаткиСертификатовНаКлиенте",
+ ОтпечаткиСертификатовНаКлиенте);
+
+ ФормаПередачаПараметров().ОткрытьНовуюФорму(
+ Контекст.ВидФормы,
+ Контекст.СерверныеПараметры,
+ Контекст.КлиентскиеПараметры,
+ Контекст.ОбработкаЗавершения);
КонецПроцедуры
// Только для внутреннего использования.
-Процедура НастроитьПредставлениеДанных(ОписаниеДанных, СерверныеПараметры) Экспорт
+Процедура ОбновитьФормуПередПовторнымИспользованием(Форма, КлиентскиеПараметры) Экспорт
- ЭтоНаборЭлементовДанных = Ложь;
+ СерверныеПараметры = Новый Структура;
+ НастроитьПредставлениеДанных(КлиентскиеПараметры, СерверныеПараметры);
+
+ Форма.ПредставлениеДанных = СерверныеПараметры.ПредставлениеДанных;
+
+КонецПроцедуры
+
+// Только для внутреннего использования.
+Процедура НастроитьПредставлениеДанных(КлиентскиеПараметры, СерверныеПараметры) Экспорт
+
+ ОписаниеДанных = КлиентскиеПараметры.ОписаниеДанных;
Если ОписаниеДанных.Свойство("СписокПредставлений") Тогда
СписокПредставлений = ОписаниеДанных.СписокПредставлений;
@@ -475,13 +1661,14 @@
ОписаниеДанных.ПредставлениеНабора, ОписаниеДанных.НаборДанных.Количество()));
Иначе
СерверныеПараметры.Вставить("ПредставлениеДанныхОткрывается",
- ЗначениеЗаполнено(ТекущийСписокПредставлений[0].Значение));
+ ТипЗнч(ТекущийСписокПредставлений[0].Значение) = Тип("ОписаниеОповещения")
+ Или ЗначениеЗаполнено(ТекущийСписокПредставлений[0].Значение));
СерверныеПараметры.Вставить("ПредставлениеДанных",
ТекущийСписокПредставлений[0].Представление);
КонецЕсли;
- ОписаниеДанных.Вставить("ТекущийСписокПредставлений", ТекущийСписокПредставлений);
+ КлиентскиеПараметры.Вставить("ТекущийСписокПредставлений", ТекущийСписокПредставлений);
КонецПроцедуры
@@ -534,20 +1721,26 @@
ВладелецНовойФормы = Новый УникальныйИдентификатор;
КонецЕсли;
- ОшибкаПолученияСертификатовНаКлиенте = Новый Структура;
- СвойстваСертификатовНаКлиенте = Новый Массив;
+ Контекст = Новый Структура;
+ Контекст.Вставить("СерверныеПараметры", СерверныеПараметры);
+ Контекст.Вставить("ВладелецНовойФормы", ВладелецНовойФормы);
- МенеджерКриптографии = МенеджерКриптографии("ПолучениеСертификатов",
- Ложь, ОшибкаПолученияСертификатовНаКлиенте);
+ ПолучитьСвойстваСертификатовНаКлиенте(Новый ОписаниеОповещения(
+ "ВыборСертификатаДляПодписанияИлиРасшифровкиПродолжение", ЭтотОбъект, Контекст), Истина, Ложь);
- ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьСвойстваСертификатовИзХранилища(
- СвойстваСертификатовНаКлиенте, МенеджерКриптографии, Истина, Ложь);
+КонецПроцедуры
+
+// Продолжение процедуры ВыборСертификатаДляПодписанияИлиРасшифровки.
+Процедура ВыборСертификатаДляПодписанияИлиРасшифровкиПродолжение(Результат, Контекст) Экспорт
- СерверныеПараметры.Вставить("СвойстваСертификатовНаКлиенте", СвойстваСертификатовНаКлиенте);
- СерверныеПараметры.Вставить("ОшибкаПолученияСертификатовНаКлиенте", ОшибкаПолученияСертификатовНаКлиенте);
+ Контекст.СерверныеПараметры.Вставить("СвойстваСертификатовНаКлиенте",
+ Результат.СвойстваСертификатовНаКлиенте);
+
+ Контекст.СерверныеПараметры.Вставить("ОшибкаПолученияСертификатовНаКлиенте",
+ Результат.ОшибкаПолученияСертификатовНаКлиенте);
ФормаПередачаПараметров().ОткрытьНовуюФорму("ВыборСертификатаДляПодписанияИлиРасшифровки",
- СерверныеПараметры, , , ВладелецНовойФормы);
+ Контекст.СерверныеПараметры, , , Контекст.ВладелецНовойФормы);
КонецПроцедуры
@@ -596,14 +1789,71 @@
КонецПроцедуры
-// Только для внутреннего использования.
-Процедура СохранитьДанныеВместеСПодписьюНачало(Результат, ПараметрыВыполнения) Экспорт
+// Продолжение процедуры ЭлектроннаяПодписьКлиент.ДобавитьПодписьИзФайла.
+Процедура ДобавитьПодписьИзФайлаПослеСозданияМенеджераКриптографии(Результат, Контекст) Экспорт
+
+ Если Контекст.ПроверитьМенеджерКриптографииНаКлиенте
+ И ТипЗнч(Результат) <> Тип("МенеджерКриптографии") Тогда
+
+ ПоказатьОшибкуОбращенияКПрограмме(
+ НСтр("ru = 'Требуется программа электронной подписи и шифрования'"),
+ "", Результат, Контекст.ФормаДобавления.МенеджерКриптографииНаСервереОписаниеОшибки);
+ Иначе
+ Контекст.ФормаДобавления.Открыть();
+ Если Контекст.ФормаДобавления.Открыта() Тогда
+ Контекст.ФормаДобавления.ОбновитьОтображениеДанных();
+ Возврат;
+ КонецЕсли;
+ КонецЕсли;
+
+ Если Контекст.ОбработкаРезультата <> Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.ОбработкаРезультата, Контекст.ОписаниеДанных);
+ КонецЕсли;
+
+КонецПроцедуры
+
+
+// Предлагает пользователю выбрать подписи для сохранения вместе с данными объекта.
+//
+// Общий подход к обработке значений свойств с типом ОписаниеОповещения в параметре ОписаниеДанных.
+// При выполнении обработки оповещения в нее передается структура параметров, в которой всегда есть
+// свойство "Оповещение" типа ОписаниеОповещения, обработку которого нужно выполнить для продолжения.
+// Кроме того, в структуре всегда есть свойство ОписаниеДанных, полученное при вызове процедуры.
+// При вызове оповещения в качестве значения должна передаваться структура. Если в процессе асинхронного
+// выполнения возникает ошибка, тогда в эту структуру нужно вставить свойство ОписаниеОшибки типа Строка.
+//
+// Параметры:
+// ОписаниеДанных - Структура - со свойствами:
+// * ЗаголовокДанных - Строка - заголовок элемента данных, например Файл.
+// * ПоказатьКомментарий - Булево - (необязательный) - разрешает ввод комментария в форме
+// добавления подписей. Если не указан, значит Ложь.
+// * Представление - Ссылка, Строка - (необязательный), если не указан, тогда
+// представление вычисляется по значению свойства Объект.
+// * Объект - Ссылка - ссылка на объект с табличной частью ЭлектронныеПодписи,
+// из которой нужно получить список подписей.
+// * --// -- - Строка - адрес временного хранилища массива подписей с составом свойств,
+// как возвращает процедура ДобавитьПодписьИзФайла.
+// * Данные - ОписаниеОповещения - обработчик сохранения данных и получения полного имени
+// файла с путем (после его сохранения), возвращаемое в свойстве ПолноеИмяФайла
+// типа Строка для сохранения электронных подписей (см. выше общий подход).
+// Если расширение для работы с файлами не подключено, то нужно вернуть
+// имя файла без пути.
+// Если свойство не будет вставлено или заполнено - это считается отказом
+// от продолжения и будет вызвана ОбработкаРезультата с результатом Ложь.
+//
+// ОбработкаРезультата - ОписаниеОповещения - необязательный параметр.
+// В результат передается параметр:
+// * Булево - Истина, если все прошло успешно.
+//
+Процедура СохранитьДанныеВместеСПодписью(ОписаниеДанных, ОбработкаРезультата = Неопределено) Экспорт
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("ОписаниеДанных", ОписаниеДанных);
+ Контекст.Вставить("ОбработкаРезультата", ОбработкаРезультата);
СохранятьВсеПодписи = ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки(
).ДействияПриСохраненииСЭП = "СохранятьВсеПодписи";
- ОписаниеДанных = ПараметрыВыполнения.ОписаниеДанных;
-
СерверныеПараметры = Новый Структура;
СерверныеПараметры.Вставить("ЗаголовокДанных", НСтр("ru = 'Данные'"));
СерверныеПараметры.Вставить("ПоказатьКомментарий", Ложь);
@@ -612,20 +1862,23 @@
СерверныеПараметры.Вставить("СохранятьВсеПодписи", СохранятьВсеПодписи);
СерверныеПараметры.Вставить("Объект", ОписаниеДанных.Объект);
- НастроитьПредставлениеДанных(ОписаниеДанных, СерверныеПараметры);
+ КлиентскиеПараметры = Новый Структура;
+ КлиентскиеПараметры.Вставить("ОписаниеДанных", ОписаниеДанных);
+ НастроитьПредставлениеДанных(КлиентскиеПараметры, СерверныеПараметры);
ФормаСохранения = ОткрытьФорму("ОбщаяФорма.СохранениеВместеСЭлектроннойПодписью", СерверныеПараметры,,,,,
- Новый ОписаниеОповещения("СохранитьДанныеВместеСПодписьюПродолжение", ЭтотОбъект, ПараметрыВыполнения));
+ Новый ОписаниеОповещения("СохранитьДанныеВместеСПодписьюПослеВыбораПодписей", ЭтотОбъект, Контекст));
Завершить = Ложь;
+ Контекст.Вставить("Форма", ФормаСохранения);
Если ФормаСохранения = Неопределено Тогда
Завершить = Истина;
Иначе
- ФормаСохранения.ОписаниеДанных = ОписаниеДанных;
+ ФормаСохранения.КлиентскиеПараметры = КлиентскиеПараметры;
Если СохранятьВсеПодписи Тогда
- СохранитьДанныеВместеСПодписьюПродолжение(ФормаСохранения.ТаблицаПодписей, ПараметрыВыполнения);
+ СохранитьДанныеВместеСПодписьюПослеВыбораПодписей(ФормаСохранения.ТаблицаПодписей, Контекст);
Возврат;
ИначеЕсли Не ФормаСохранения.Открыта() Тогда
@@ -633,151 +1886,264 @@
КонецЕсли;
КонецЕсли;
- Если Завершить И ПараметрыВыполнения.ОбработкаРезультата <> Неопределено Тогда
- ВыполнитьОбработкуОповещения(ПараметрыВыполнения.ОбработкаРезультата, Ложь);
+ Если Завершить И Контекст.ОбработкаРезультата <> Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.ОбработкаРезультата, Ложь);
КонецЕсли;
КонецПроцедуры
-// Только для внутреннего использования.
-Процедура СохранитьДанныеВместеСПодписьюПродолжение(КоллекцияПодписей, ПараметрыВыполнения) Экспорт
+// Продолжение процедуры ЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью.
+Процедура СохранитьДанныеВместеСПодписьюПослеВыбораПодписей(КоллекцияПодписей, Контекст) Экспорт
Если ТипЗнч(КоллекцияПодписей) <> Тип("ДанныеФормыКоллекция") Тогда
- Если ПараметрыВыполнения.ОбработкаРезультата <> Неопределено Тогда
- ВыполнитьОбработкуОповещения(ПараметрыВыполнения.ОбработкаРезультата, Ложь);
+ Если Контекст.ОбработкаРезультата <> Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.ОбработкаРезультата, Ложь);
КонецЕсли;
Возврат;
КонецЕсли;
- ПараметрыВыполнения.Вставить("КоллекцияПодписей", КоллекцияПодписей);
+ Контекст.Вставить("КоллекцияПодписей", КоллекцияПодписей);
- ВыполнитьОбработкуОповещения(ПараметрыВыполнения.ОписаниеДанных.Данные,
- Новый ОписаниеОповещения("СохранитьДанныеВместеСПодписьюПродолжениеПослеВыбораПодписей",
- ЭтотОбъект, ПараметрыВыполнения));
+ ПараметрыВыполнения = Новый Структура;
+ ПараметрыВыполнения.Вставить("ОписаниеДанных", Контекст.ОписаниеДанных);
+ ПараметрыВыполнения.Вставить("Оповещение", Новый ОписаниеОповещения(
+ "СохранитьДанныеВместеСПодписьюПослеСохраненияФайлаДанных", ЭтотОбъект, Контекст));
+
+ Попытка
+ ВыполнитьОбработкуОповещения(Контекст.ОписаниеДанных.Данные, ПараметрыВыполнения);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ СохранитьДанныеВместеСПодписьюПослеСохраненияФайлаДанных(
+ Новый Структура("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)), Контекст);
+ КонецПопытки;
КонецПроцедуры
-// Только для внутреннего использования.
-Процедура СохранитьДанныеВместеСПодписьюПродолжениеПослеВыбораПодписей(ПолноеИмяФайла, ПараметрыВыполнения) Экспорт
+// Продолжение процедуры ЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью.
+Процедура СохранитьДанныеВместеСПодписьюПослеСохраненияФайлаДанных(Результат, Контекст) Экспорт
- Если ТипЗнч(ПолноеИмяФайла) <> Тип("Строка") Или ПустаяСтрока(ПолноеИмяФайла) Тогда
- Если ПараметрыВыполнения.ОбработкаРезультата <> Неопределено Тогда
- ВыполнитьОбработкуОповещения(ПараметрыВыполнения.ОбработкаРезультата, Ложь);
+ Если Результат.Свойство("ОписаниеОшибки") Тогда
+ Ошибка = Новый Структура("ОписаниеОшибки",
+ НСтр("ru = 'При записи файла возникла ошибка:'") + Символы.ПС + Результат.ОписаниеОшибки);
+
+ ПоказатьОшибкуОбращенияКПрограмме(
+ НСтр("ru = 'Не удалось сохранить подписи вместе с файлом'"), "", Ошибка, Новый Структура);
+ Возврат;
+
+ ИначеЕсли Не Результат.Свойство("ПолноеИмяФайла")
+ Или ТипЗнч(Результат.ПолноеИмяФайла) <> Тип("Строка")
+ Или ПустаяСтрока(Результат.ПолноеИмяФайла) Тогда
+
+ Если Контекст.ОбработкаРезультата <> Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.ОбработкаРезультата, Ложь);
КонецЕсли;
Возврат;
КонецЕсли;
- ОсновнойФайл = Новый Файл(ПолноеИмяФайла);
+ Контекст.Вставить("ПолноеИмяФайла", Результат.ПолноеИмяФайла);
+ Контекст.Вставить("СоставИмениФайлаДанных",
+ ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(Контекст.ПолноеИмяФайла));
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
- ПутьКФайлам = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ОсновнойФайл.Путь);
- ПолучаемыеФайлы = Новый Массив;
+ Если ЗначениеЗаполнено(Контекст.СоставИмениФайлаДанных.Путь) Тогда
+ ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Новый ОписаниеОповещения(
+ "СохранитьДанныеВместеСПодписьюПослеПодключенияРасширенияРаботыСФайлами", ЭтотОбъект, Контекст));
+ Иначе
+ СохранитьДанныеВместеСПодписьюПослеПодключенияРасширенияРаботыСФайлами(Ложь, Контекст);
КонецЕсли;
- ИменаФайлов = Новый Соответствие;
- ИменаФайлов.Вставить(ОсновнойФайл.Имя, Истина);
- ЕстьПолученныеФайлы = Ложь;
+КонецПроцедуры
+
+// Продолжение процедуры ЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью.
+Процедура СохранитьДанныеВместеСПодписьюПослеПодключенияРасширенияРаботыСФайлами(Подключено, Контекст) Экспорт
- РасширениеДляФайловПодписи = ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки().РасширениеДляФайловПодписи;
+ Контекст.Вставить("Подключено", Подключено);
- Для Каждого ОписаниеПодписи Из ПараметрыВыполнения.КоллекцияПодписей Цикл
- Если Не ОписаниеПодписи.Пометка Тогда
- Продолжить;
- КонецЕсли;
-
- ИмяФайлаПодписи = ОписаниеПодписи.ИмяФайлаПодписи;
-
- Если ПустаяСтрока(ИмяФайлаПодписи) Тогда
- ИмяФайлаПодписи = ОсновнойФайл.ИмяБезРасширения + " - "
- + Строка(ОписаниеПодписи.КомуВыданСертификат) + "." + РасширениеДляФайловПодписи;
- КонецЕсли;
-
- ИмяФайлаПодписи = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайлаПодписи);
- ФайлПоИмени = Новый Файл(ИмяФайлаПодписи);
- ИмяФайлаПодписиБезРасширения = ФайлПоИмени.ИмяБезРасширения;
-
- Счетчик = 0;
- Пока Истина Цикл
- Счетчик = Счетчик + 1;
-
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
- ПолноеИмяФайла = ПутьКФайлам + ИмяФайлаПодписи;
-
- ФайлПоИмени = Новый Файл(ПолноеИмяФайла);
- ФайлСуществует = ФайлПоИмени.Существует();
- Иначе
- ПолноеИмяФайла = ИмяФайлаПодписи;
- ФайлСуществует = ИменаФайлов[ПолноеИмяФайла] <> Неопределено;
- КонецЕсли;
-
- Если Не ФайлСуществует Тогда
- Прервать;
- КонецЕсли;
-
- ИмяФайлаПодписи = ИмяФайлаПодписиБезРасширения + " (" + Строка(Счетчик) + ")" + "." + РасширениеДляФайловПодписи;
- ИмяФайлаПодписи = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайлаПодписи);
- КонецЦикла;
-
- Файл = Новый Файл(ПолноеИмяФайла);
- ИменаФайлов.Вставить(Файл.Имя, Ложь);
-
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
- Описание = Новый ОписаниеПередаваемогоФайла(Файл.Имя, ОписаниеПодписи.АдресПодписи);
- ПолучаемыеФайлы.Добавить(Описание);
- Иначе
- // Сохранение Файла из базы данных на диск.
- Если ПолучитьФайл(ОписаниеПодписи.АдресПодписи, Файл.Имя) Тогда
- ЕстьПолученныеФайлы = Истина;
- ИменаФайлов.Вставить(Файл.Имя, Ложь);
- КонецЕсли;
- УдалитьИзВременногоХранилища(ОписаниеПодписи.АдресПодписи);
- КонецЕсли;
- КонецЦикла;
+ Контекст.Вставить("РасширениеДляФайловПодписи",
+ ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки().РасширениеДляФайловПодписи);
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если Контекст.Подключено Тогда
+ Контекст.Вставить("ПолучаемыеФайлы", Новый Массив);
+ Контекст.Вставить("ПутьКФайлам", ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(
+ Контекст.СоставИмениФайлаДанных.Путь));
+ КонецЕсли;
+
+ Контекст.Вставить("ИменаФайлов", Новый Соответствие);
+ Контекст.ИменаФайлов.Вставить(Контекст.СоставИмениФайлаДанных.Имя, Истина);
+
+ Контекст.Вставить("Индекс", -1);
+
+ СохранитьДанныеВместеСПодписьюЦиклНачало(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью.
+Процедура СохранитьДанныеВместеСПодписьюЦиклНачало(Контекст)
+
+ Если Контекст.КоллекцияПодписей.Количество() <= Контекст.Индекс + 1 Тогда
+ СохранитьДанныеВместеСПодписьюПослеЦикла(Контекст);
+ Возврат;
+ КонецЕсли;
+ Контекст.Индекс = Контекст.Индекс + 1;
+ Контекст.Вставить("ОписаниеПодписи", Контекст.КоллекцияПодписей[Контекст.Индекс]);
+
+ Если Не Контекст.ОписаниеПодписи.Пометка Тогда
+ СохранитьДанныеВместеСПодписьюЦиклНачало(Контекст);
+ Возврат;
+ КонецЕсли;
+
+ Контекст.Вставить("ИмяФайлаПодписи", Контекст.ОписаниеПодписи.ИмяФайлаПодписи);
+
+ Если ПустаяСтрока(Контекст.ИмяФайлаПодписи) Тогда
+ Контекст.ИмяФайлаПодписи = Контекст.СоставИмениФайлаДанных.ИмяБезРасширения + " - "
+ + Строка(Контекст.ОписаниеПодписи.КомуВыданСертификат) + "." + Контекст.РасширениеДляФайловПодписи;
+ КонецЕсли;
+
+ Контекст.ИмяФайлаПодписи = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(Контекст.ИмяФайлаПодписи);
+ СоставИмениФайлаПодписи = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(Контекст.ИмяФайлаПодписи);
+ Контекст.Вставить("ИмяФайлаПодписиБезРасширения", СоставИмениФайлаПодписи.ИмяБезРасширения);
+
+ Контекст.Вставить("Счетчик", 1);
+
+ СохранитьДанныеВместеСПодписьюЦиклВнутреннийЦиклНачало(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью.
+Процедура СохранитьДанныеВместеСПодписьюЦиклВнутреннийЦиклНачало(Контекст)
+
+ Контекст.Счетчик = Контекст.Счетчик + 1;
+
+ Если Контекст.Подключено Тогда
+ Контекст.Вставить("ПолноеИмяФайлаПодписи", Контекст.ПутьКФайлам + Контекст.ИмяФайлаПодписи);
+ Иначе
+ Контекст.Вставить("ПолноеИмяФайлаПодписи", Контекст.ИмяФайлаПодписи);
+ КонецЕсли;
+
+ Если Контекст.ИменаФайлов[Контекст.ИмяФайлаПодписи] <> Неопределено Тогда
+ СохранитьДанныеВместеСПодписьюЦиклВнутреннийЦиклПослеПроверкиСуществованияФайла(Истина, Контекст);
+
+ ИначеЕсли Контекст.Подключено Тогда
+ Файл = Новый Файл;
+ Файл.НачатьИнициализацию(Новый ОписаниеОповещения(
+ "СохранитьДанныеВместеСПодписьюЦиклВнутреннийЦиклПослеИнициализацииФайла", ЭтотОбъект, Контекст),
+ Контекст.ПолноеИмяФайлаПодписи);
+ Иначе
+ СохранитьДанныеВместеСПодписьюЦиклВнутреннийЦиклПослеПроверкиСуществованияФайла(Ложь, Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью.
+Процедура СохранитьДанныеВместеСПодписьюЦиклВнутреннийЦиклПослеИнициализацииФайла(Файл, Контекст) Экспорт
+
+ Файл.НачатьПроверкуСуществования(Новый ОписаниеОповещения(
+ "СохранитьДанныеВместеСПодписьюЦиклВнутреннийЦиклПослеПроверкиСуществованияФайла", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры ЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью.
+Процедура СохранитьДанныеВместеСПодписьюЦиклВнутреннийЦиклПослеПроверкиСуществованияФайла(Существует, Контекст) Экспорт
+
+ Если Не Существует Тогда
+ СохранитьДанныеВместеСПодписьюЦиклПослеВнутреннегоЦикла(Контекст);
+ Возврат;
+ КонецЕсли;
+
+ Контекст.ИмяФайлаПодписи = Контекст.ИмяФайлаПодписиБезРасширения
+ + " (" + Строка(Контекст.Счетчик) + ")" + "." + Контекст.РасширениеДляФайловПодписи;
+
+ Контекст.ИмяФайлаПодписи = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(Контекст.ИмяФайлаПодписи);
+
+ СохранитьДанныеВместеСПодписьюЦиклВнутреннийЦиклНачало(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью.
+Процедура СохранитьДанныеВместеСПодписьюЦиклПослеВнутреннегоЦикла(Контекст)
+
+ СоставИмениФайлаПодписи = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(Контекст.ПолноеИмяФайлаПодписи);
+ Контекст.ИменаФайлов.Вставить(СоставИмениФайлаПодписи.Имя, Ложь);
+
+ Если Контекст.Подключено Тогда
+ Описание = Новый ОписаниеПередаваемогоФайла(СоставИмениФайлаПодписи.Имя, Контекст.ОписаниеПодписи.АдресПодписи);
+ Контекст.ПолучаемыеФайлы.Добавить(Описание);
+ Иначе
// Сохранение Файла из базы данных на диск.
+ ПолучитьФайл(Контекст.ОписаниеПодписи.АдресПодписи, СоставИмениФайлаПодписи.Имя);
+ КонецЕсли;
+
+ СохранитьДанныеВместеСПодписьюЦиклНачало(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью.
+Процедура СохранитьДанныеВместеСПодписьюПослеЦикла(Контекст)
+
+ Если Не Контекст.Подключено Тогда
+ Возврат;
+ КонецЕсли;
+
+ // Сохранение Файла из базы данных на диск.
+ Если Контекст.ПолучаемыеФайлы.Количество() > 0 Тогда
ПолученныеФайлы = Новый Массив;
+ Контекст.Вставить("ПолучаемыеФайлы", Контекст.ПолучаемыеФайлы);
+
Вызовы = Новый Массив;
Вызов = Новый Массив;
- Вызов.Добавить("ПолучитьФайлы");
- Вызов.Добавить(ПолучаемыеФайлы);
- Вызов.Добавить(ПолученныеФайлы);
- Вызов.Добавить(ПутьКФайлам);
+ Вызов.Добавить("НачатьПолучениеФайлов");
+ Вызов.Добавить(Контекст.ПолучаемыеФайлы);
+ Вызов.Добавить(Контекст.ПутьКФайлам);
Вызов.Добавить(Ложь);
Вызовы.Добавить(Вызов);
- Если ЗапроситьРазрешениеПользователя(Вызовы) Тогда
- ЕстьПолученныеФайлы = ПолучитьФайлы(ПолучаемыеФайлы, ПолученныеФайлы, ПутьКФайлам, Ложь);
- Для каждого ПолученныйФайл Из ПолученныеФайлы Цикл
- Файл = Новый Файл(ПолученныйФайл.Имя);
- ИменаФайлов.Вставить(Описание.Имя, Файл.Имя);
- КонецЦикла;
- КонецЕсли;
-
- Для Каждого ОписаниеПодписи Из ПараметрыВыполнения.КоллекцияПодписей Цикл
- УдалитьИзВременногоХранилища(ОписаниеПодписи.АдресПодписи);
+ НачатьЗапросРазрешенияПользователя(Новый ОписаниеОповещения(
+ "СохранитьДанныеВместеСПодписьюПослеПолученияРазрешений", ЭтотОбъект, Контекст), Вызовы);
+ Иначе
+ СохранитьДанныеВместеСПодписьюПослеПолученияРазрешений(Ложь, Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью.
+Процедура СохранитьДанныеВместеСПодписьюПослеПолученияРазрешений(РазрешенияПолучены, Контекст) Экспорт
+
+ Если РазрешенияПолучены Тогда
+ НачатьПолучениеФайлов(Новый ОписаниеОповещения(
+ "СохранитьДанныеВместеСПодписьюПослеПолученияФайлов", ЭтотОбъект, Контекст),
+ Контекст.ПолучаемыеФайлы, Контекст.ПутьКФайлам, Ложь);
+ Иначе
+ СохранитьДанныеВместеСПодписьюПослеПолученияФайлов(Неопределено, Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью.
+Процедура СохранитьДанныеВместеСПодписьюПослеПолученияФайлов(ПолученныеФайлы, Контекст) Экспорт
+
+ ИменаПолученныхФайлов = Новый Соответствие;
+ ИменаПолученныхФайлов.Вставить(Контекст.СоставИмениФайлаДанных.Имя, Истина);
+
+ Если ТипЗнч(ПолученныеФайлы) = Тип("Массив") Тогда
+ Для каждого ПолученныйФайл Из ПолученныеФайлы Цикл
+ СоставИмениФайлаПодписи = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ПолученныйФайл.Имя);
+ ИменаПолученныхФайлов.Вставить(СоставИмениФайлаПодписи.Имя, Истина);
КонецЦикла;
КонецЕсли;
- Если ЕстьПолученныеФайлы
- И ПараметрыВыполнения.КоллекцияПодписей.Количество() <> 0 Тогда
-
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
- Текст = НСтр("ru = 'Каталог:'") + Символы.ПС;
- Текст = Текст + ПутьКФайлам;
- Текст = Текст + Символы.ПС + Символы.ПС;
- Иначе
- Текст = "";
- КонецЕсли;
-
- Текст = Текст + НСтр("ru = 'Файлы:'") + Символы.ПС;
-
- Для Каждого КлючИЗначение Из ИменаФайлов Цикл
- Текст = Текст + КлючИЗначение.Ключ + Символы.ПС;
- КонецЦикла;
-
- ПараметрыФормы = Новый Структура("Текст", Текст);
- ОткрытьФорму("ОбщаяФорма.ОтчетОСохраненииФайловЭлектронныхПодписей", ПараметрыФормы);
- КонецЕсли;
+ Текст = НСтр("ru = 'Папка с файлами:'") + Символы.ПС;
+ Текст = Текст + Контекст.ПутьКФайлам;
+ Текст = Текст + Символы.ПС + Символы.ПС;
+
+ Текст = Текст + НСтр("ru = 'Файлы:'") + Символы.ПС;
+
+ Для Каждого КлючИЗначение Из ИменаПолученныхФайлов Цикл
+ Текст = Текст + КлючИЗначение.Ключ + Символы.ПС;
+ КонецЦикла;
+
+ ПараметрыФормы = Новый Структура;
+ ПараметрыФормы.Вставить("Текст", Текст);
+ ПараметрыФормы.Вставить("ПапкаСФайлами", Контекст.СоставИмениФайлаДанных.Путь);
+
+ ОткрытьФорму("ОбщаяФорма.ОтчетОСохраненииФайловЭлектронныхПодписей", ПараметрыФормы);
КонецПроцедуры
@@ -797,67 +2163,123 @@
КонецПроцедуры
-// Продолжение процедуры ЭлектроннаяПодписьКлиент.УстановитьРасширение.
-Процедура УстановитьРасширениеПродолжение(РасширениеДляРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт
+// Показывает диалог установки расширения для работы с электронной подписью и шифрованием.
+//
+// Параметры:
+// БезВопроса - Булево - если указано Истина, тогда вопроса показано не будет.
+// Требуется, если пользователь нажал на кнопку Установить расширение.
+//
+// ОбработчикРезультата - ОписаниеОповещения - Описание процедуры, принимающей результат выбора.
+// ТекстВопроса - Строка - Текст вопроса.
+// ЗаголовокВопроса - Строка - Заголовок вопроса.
+//
+// Значение первого параметра, возвращаемого в обработчик вызывающего кода:
+// РасширениеУстановлено
+// * Истина - Пользователь подтвердил установку, после установки расширение было успешно подключено.
+// * Ложь - Пользователь подтвердил установку, однако после установки расширение не удалось подключить.
+// * Неопределено - Пользователь отказался от установки.
+//
+Процедура УстановитьРасширение(БезВопроса, ОбработчикРезультата = Неопределено, ТекстВопроса = "", ЗаголовокВопроса = "") Экспорт
- ОбработчикРезультата = ДополнительныеПараметры.ОбработчикРезультата;
- ТекстВопроса = ДополнительныеПараметры.ТекстВопроса;
- ЗаголовокВопроса = ДополнительныеПараметры.ЗаголовокВопроса;
- БезВопроса = ДополнительныеПараметры.БезВопроса;
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", ОбработчикРезультата);
+ Контекст.Вставить("ТекстВопроса", ТекстВопроса);
+ Контекст.Вставить("ЗаголовокВопроса", ЗаголовокВопроса);
+ Контекст.Вставить("БезВопроса", БезВопроса);
- Если Не ПодключитьРасширениеРаботыСФайлами() Тогда
- Если ОбработчикРезультата <> Неопределено Тогда
- ВыполнитьОбработкуОповещения(ОбработчикРезультата, Ложь);
+ НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения(
+ "УстановитьРасширениеПослеПроверкиПодключенияРасширенияРаботыСКриптографией", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры УстановитьРасширение.
+Процедура УстановитьРасширениеПослеПроверкиПодключенияРасширенияРаботыСКриптографией(Подключено, Контекст) Экспорт
+
+ Если Подключено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина);
+ Возврат;
+ КонецЕсли;
+
+ ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(
+ Новый ОписаниеОповещения("УстановитьРасширениеПослеПодключенияРасширенияРаботыСФайлами", ЭтотОбъект, Контекст),
+ НСтр("ru = 'Перед установкой расширения для работы с электронной подписью и шифрованием
+ |необходимо установить расширение для работы с файлами.'"),
+ Ложь);
+
+КонецПроцедуры
+
+// Продолжение процедуры УстановитьРасширение.
+Процедура УстановитьРасширениеПослеПодключенияРасширенияРаботыСФайлами(Подключено, Контекст) Экспорт
+
+ Если Не Подключено Тогда
+ Если Контекст.Оповещение <> Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь);
КонецЕсли;
Возврат;
КонецЕсли;
- Если ПодключитьРасширениеРаботыСКриптографией() Тогда
- Если ОбработчикРезультата <> Неопределено Тогда
- ВыполнитьОбработкуОповещения(ОбработчикРезультата, Истина);
+ НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения(
+ "УстановитьРасширениеПослеПодключенияРасширенияРаботыСКриптографией", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры УстановитьРасширение.
+Процедура УстановитьРасширениеПослеПодключенияРасширенияРаботыСКриптографией(Подключено, Контекст) Экспорт
+
+ Если Подключено Тогда
+ Если Контекст.Оповещение <> Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина);
КонецЕсли;
Возврат;
КонецЕсли;
- ДополнительныеПараметры = Новый Структура;
- ДополнительныеПараметры.Вставить("ОбработчикРезультата", ОбработчикРезультата);
- Обработчик = Новый ОписаниеОповещения("УстановитьРасширениеПослеОтвета", ЭтотОбъект, ДополнительныеПараметры);
+ Обработчик = Новый ОписаниеОповещения("УстановитьРасширениеПослеОтвета", ЭтотОбъект, Контекст);
- Если БезВопроса Тогда
+ Если Контекст.БезВопроса Тогда
ВыполнитьОбработкуОповещения(Обработчик, КодВозвратаДиалога.Да);
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура;
- ПараметрыФормы.Вставить("ЗаголовокВопроса", ЗаголовокВопроса);
- ПараметрыФормы.Вставить("ТекстВопроса", ТекстВопроса);
+ ПараметрыФормы.Вставить("ЗаголовокВопроса", Контекст.ЗаголовокВопроса);
+ ПараметрыФормы.Вставить("ТекстВопроса", Контекст.ТекстВопроса);
ОткрытьФорму("ОбщаяФорма.ВопросОбУстановкеРасширенияРаботыСКриптографией",
ПараметрыФормы,,,,, Обработчик);
КонецПроцедуры
-// Продолжение процедуры ЭлектроннаяПодписьКлиент.УстановитьРасширение.
-Процедура УстановитьРасширениеПослеОтвета(Ответ, ДополнительныеПараметры) Экспорт
+// Продолжение процедуры УстановитьРасширение.
+Процедура УстановитьРасширениеПослеОтвета(Ответ, Контекст) Экспорт
Если Ответ = КодВозвратаДиалога.Да Тогда
- Обработчик = Новый ОписаниеОповещения("УстановитьРасширениеПослеЗавершения", ЭтотОбъект, ДополнительныеПараметры);
- НачатьУстановкуРасширенияРаботыСКриптографией(Обработчик);
+ НачатьУстановкуРасширенияРаботыСКриптографией(Новый ОписаниеОповещения(
+ "УстановитьРасширениеПослеУстановкиРасширенияРаботыСКриптографией", ЭтотОбъект, Контекст));
Иначе
- Если ДополнительныеПараметры.ОбработчикРезультата <> Неопределено Тогда
- ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Неопределено);
+ Если Контекст.Оповещение <> Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Неопределено);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
-// Продолжение процедуры ЭлектроннаяПодписьКлиент.УстановитьРасширение.
-Процедура УстановитьРасширениеПослеЗавершения(ДополнительныеПараметры) Экспорт
+// Продолжение процедуры УстановитьРасширение.
+Процедура УстановитьРасширениеПослеУстановкиРасширенияРаботыСКриптографией(Контекст) Экспорт
- Результат = ПодключитьРасширениеРаботыСКриптографией();
+ НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения(
+ "УстановитьРасширениеПослеПодключенияУстановленногоРасширенияРаботыСКриптографией", ЭтотОбъект, Контекст));
- Если ДополнительныеПараметры.ОбработчикРезультата <> Неопределено Тогда
- ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Результат);
+КонецПроцедуры
+
+// Продолжение процедуры УстановитьРасширение.
+Процедура УстановитьРасширениеПослеПодключенияУстановленногоРасширенияРаботыСКриптографией(Подключено, Контекст) Экспорт
+
+ Если Подключено Тогда
+ Оповестить("Установка_РасширениеРаботыСКриптографией");
+ КонецЕсли;
+
+ Если Контекст.Оповещение <> Неопределено Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Подключено);
КонецЕсли;
КонецПроцедуры
@@ -866,7 +2288,7 @@
// Общие процедуры и функции управляемых форм.
// Только для внутреннего использования.
-Функция ПродолжитьОткрытиеНачало(Форма, КлиентскиеПараметры, Шифрование = Ложь, Расшифровка = Ложь) Экспорт
+Процедура ПродолжитьОткрытиеНачало(Оповещение, Форма, КлиентскиеПараметры, Шифрование = Ложь, Расшифровка = Ложь) Экспорт
Если Не Шифрование Тогда
ВходныеПараметры = Неопределено;
@@ -877,41 +2299,89 @@
?(Расшифровка, "Расшифровка", "Подписание"), ВходныеПараметры, ВыходныеПараметры);
КонецЕсли;
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("ОшибкаНаСервере", Новый Структура);
+
Если ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().СоздаватьЭлектронныеПодписиНаСервере Тогда
- Если ЗначениеЗаполнено(Форма.МенеджерКриптографииНаСервереОписаниеОшибки) Тогда
- ОписаниеОшибки = Новый Структура;
- МенеджерКриптографии("ПолучениеСертификатов",
- Ложь, ОписаниеОшибки);
-
- Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда
- ПоказатьОшибкуОбращенияКПрограмме(
- НСтр("ru = 'Требуется программа электронной подписи и шифрования'"),
- "", ОписаниеОшибки, Форма.МенеджерКриптографииНаСервереОписаниеОшибки);
- Возврат Ложь;
- КонецЕсли;
- КонецЕсли;
- Иначе
- Если МенеджерКриптографии("ПолучениеСертификатов") = Неопределено Тогда
- Возврат Ложь;
+ Если Не ЗначениеЗаполнено(Форма.МенеджерКриптографииНаСервереОписаниеОшибки) Тогда
+ ВыполнитьОбработкуОповещения(Оповещение, Истина);
+ Возврат;
КонецЕсли;
+ Контекст.ОшибкаНаСервере = Форма.МенеджерКриптографииНаСервереОписаниеОшибки;
КонецЕсли;
- Возврат Истина;
+ СоздатьМенеджерКриптографии(Новый ОписаниеОповещения(
+ "ПродолжитьОткрытиеНачалоПослеСозданияМенеджераКриптографии", ЭтотОбъект, Контекст),
+ "ПолучениеСертификатов", Неопределено);
-КонецФункции
+КонецПроцедуры
+
+// Продолжение процедуры ПродолжитьОткрытиеНачало.
+Процедура ПродолжитьОткрытиеНачалоПослеСозданияМенеджераКриптографии(Результат, Контекст) Экспорт
+
+ Если ТипЗнч(Результат) <> Тип("МенеджерКриптографии") Тогда
+
+ ПоказатьОшибкуОбращенияКПрограмме(
+ НСтр("ru = 'Требуется программа электронной подписи и шифрования'"),
+ "", Результат, Контекст.ОшибкаНаСервере);
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь);
+ Возврат;
+ КонецЕсли;
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина);
+
+КонецПроцедуры
+
// Только для внутреннего использования.
-Функция ОтпечаткиСертификатовНаКлиенте() Экспорт
+Процедура ПолучитьОтпечаткиСертификатовНаКлиенте(Оповещение) Экспорт
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("Оповещение", Оповещение);
+
+ СоздатьМенеджерКриптографии(Новый ОписаниеОповещения(
+ "ПолучитьОтпечаткиСертификатовНаКлиентеПослеСозданияМенеджераКриптографии", ЭтотОбъект, Контекст),
+ "ПолучениеСертификатов", Ложь);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьОтпечаткиСертификатовНаКлиенте.
+Процедура ПолучитьОтпечаткиСертификатовНаКлиентеПослеСозданияМенеджераКриптографии(МенеджерКриптографии, Контекст) Экспорт
+
+ Если ТипЗнч(МенеджерКриптографии) <> Тип("МенеджерКриптографии") Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Новый Массив);
+ Возврат;
+ КонецЕсли;
+
+ МенеджерКриптографии.НачатьПолучениеХранилищаСертификатов(
+ Новый ОписаниеОповещения(
+ "ПолучитьОтпечаткиСертификатовНаКлиентеПослеПолученияХранилища", ЭтотОбъект, Контекст),
+ ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьОтпечаткиСертификатовНаКлиенте.
+Процедура ПолучитьОтпечаткиСертификатовНаКлиентеПослеПолученияХранилища(ХранилищеСертификатов, Контекст) Экспорт
+
+ ХранилищеСертификатов.НачатьПолучениеВсех(Новый ОписаниеОповещения(
+ "ПолучитьОтпечаткиСертификатовНаКлиентеПослеПолученияВсех", ЭтотОбъект, Контекст));
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьОтпечаткиСертификатовНаКлиенте.
+Процедура ПолучитьОтпечаткиСертификатовНаКлиентеПослеПолученияВсех(МассивСертификатов, Контекст) Экспорт
ОтпечаткиСертификатовНаКлиенте = Новый Массив;
- МенеджерКриптографии = МенеджерКриптографии("ПолучениеСертификатов", Ложь);
- ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьОтпечаткиСертификатовИзЛичногоХранилища(
- ОтпечаткиСертификатовНаКлиенте, МенеджерКриптографии);
+ ЭлектроннаяПодписьСлужебныйКлиентСервер.ДобавитьОтпечаткиСертификатов(
+ ОтпечаткиСертификатовНаКлиенте, МассивСертификатов);
- Возврат ОтпечаткиСертификатовНаКлиенте;
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, ОтпечаткиСертификатовНаКлиенте);
-КонецФункции
+КонецПроцедуры
+
// Только для внутреннего использования.
Процедура ОбработатьПарольВФорме(Форма, ВнутренниеДанные, СвойстваПароля, ДополнительныеПараметры = Неопределено, НовыйПароль = Null) Экспорт
@@ -920,8 +2390,9 @@
СвойстваПароля = Новый Структура;
СвойстваПароля.Вставить("Значение", Неопределено);
СвойстваПароля.Вставить("ОбработкаПоясненияПароля", Неопределено);
- СвойстваПароля.Вставить("ПарольПроверен", Ложь); // Включается когда указан НовыйПароль и
- // при успешном выполнении операции. Разрешает запоминание без проверки.
+ // Свойство ПарольПроверен разрешает запоминание без проверки.
+ // Включается когда указан НовыйПароль и при успешном выполнении операции.
+ СвойстваПароля.Вставить("ПарольПроверен", Ложь);
КонецЕсли;
Если ДополнительныеПараметры = Неопределено Тогда
@@ -932,6 +2403,10 @@
ДополнительныеПараметры.Вставить("УсиленнаяЗащитаЗакрытогоКлюча",
Форма.СертификатУсиленнаяЗащитаЗакрытогоКлюча);
+ Если Не ДополнительныеПараметры.Свойство("ПриУстановкеПароляИзДругойОперации") Тогда
+ ДополнительныеПараметры.Вставить("ПриУстановкеПароляИзДругойОперации", Ложь);
+ КонецЕсли;
+
Если Не ДополнительныеПараметры.Свойство("ПриИзмененииРеквизитаПароль") Тогда
ДополнительныеПараметры.Вставить("ПриИзмененииРеквизитаПароль", Ложь);
КонецЕсли;
@@ -986,7 +2461,9 @@
КонецЕсли;
ДополнительныеПараметры.Вставить("ПарольУказан",
- ДополнительныеПараметры.ПарольУстановленПрограммно Или ДополнительныеПараметры.ПарольВПамяти);
+ ДополнительныеПараметры.ПарольУстановленПрограммно
+ Или ДополнительныеПараметры.ПарольВПамяти
+ Или ДополнительныеПараметры.ПриУстановкеПароляИзДругойОперации);
КонецПроцедуры
@@ -1018,24 +2495,647 @@
КонецПроцедуры
// Только для внутреннего использования.
-Процедура ПредставлениеДанныхНажатие(Форма, Элемент, СтандартнаяОбработка, ОписаниеДанных) Экспорт
+Процедура ПредставлениеДанныхНажатие(Форма, Элемент, СтандартнаяОбработка, ТекущийСписокПредставлений) Экспорт
СтандартнаяОбработка = Ложь;
- ТекущийСписокПредставлений = ОписаниеДанных.ТекущийСписокПредставлений;
-
Если ТекущийСписокПредставлений.Количество() > 1 Тогда
+ СписокПредставленийДанных = Новый Массив;
+ Для Каждого ЭлементСписка Из ТекущийСписокПредставлений Цикл
+ СписокПредставленийДанных.Добавить(ЭлементСписка.Представление);
+ КонецЦикла;
ПараметрыФормы = Новый Структура;
- ПараметрыФормы.Вставить("СписокПредставленийДанных", ТекущийСписокПредставлений);
+ ПараметрыФормы.Вставить("СписокПредставленийДанных", СписокПредставленийДанных);
ПараметрыФормы.Вставить("ПредставлениеДанных", Форма.ПредставлениеДанных);
- ОткрытьФорму("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.ПросмотрДанных",
+ НоваяФорма = ОткрытьФорму("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.ПросмотрДанных",
ПараметрыФормы, Элемент);
+ Если НоваяФорма = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+ НоваяФорма.УстановитьСписокПредставлений(ТекущийСписокПредставлений,);
Иначе
- ПоказатьЗначение(, ТекущийСписокПредставлений[0].Значение);
+ Значение = ТекущийСписокПредставлений[0].Значение;
+ Если ТипЗнч(Значение) = Тип("ОписаниеОповещения") Тогда
+ ВыполнитьОбработкуОповещения(Значение);
+ Иначе
+ ПоказатьЗначение(, Значение);
+ КонецЕсли;
КонецЕсли;
КонецПроцедуры
+// Только для внутреннего использования.
+Функция ПолноеПредставлениеДанных(Форма) Экспорт
+
+ Элементы = Форма.Элементы;
+
+ Если Элементы.ПредставлениеДанных.ПоложениеЗаголовка <> ПоложениеЗаголовкаЭлементаФормы.Нет
+ И ЗначениеЗаполнено(Элементы.ПредставлениеДанных.Заголовок) Тогда
+
+ Возврат Элементы.ПредставлениеДанных.Заголовок + ": " + Форма.ПредставлениеДанных;
+ Иначе
+ Возврат Форма.ПредставлениеДанных;
+ КонецЕсли;
+
+КонецФункции
+
+// Только для внутреннего использования.
+Процедура СертификатПодборИзСпискаВыбора(Форма, Текст, ДанныеВыбора, СтандартнаяОбработка) Экспорт
+
+ Если Текст = "" И Форма.СертификатСписокВыбора.Количество() = 0 Тогда
+ Возврат;
+ КонецЕсли;
+
+ СтандартнаяОбработка = Ложь;
+ ДанныеВыбора = Новый СписокЗначений;
+
+ Для каждого ЭлементСписка Из Форма.СертификатСписокВыбора Цикл
+ Если Найти(ВРег(ЭлементСписка.Представление), ВРег(Текст)) > 0 Тогда
+ ДанныеВыбора.Добавить(ЭлементСписка.Значение, ЭлементСписка.Представление);
+ КонецЕсли;
+ КонецЦикла;
+
+КонецПроцедуры
+
+
+// Только для внутреннего использования.
+Процедура ВыполнитьНаСтороне(Оповещение, Операция, СторонаВыполнения, ПараметрыВыполнения) Экспорт
+
+ Контекст = Новый Структура("ОписаниеДанных, Форма, ИдентификаторФормы, ЗначениеПароля");
+ ЗаполнитьЗначенияСвойств(Контекст, ПараметрыВыполнения);
+
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("Операция", Операция); // Подписание, Шифрование, Расшифровка.
+ Контекст.Вставить("НаСторонеКлиента", СторонаВыполнения = "НаСторонеКлиента");
+
+ Если Контекст.НаСторонеКлиента Тогда
+ СоздатьМенеджерКриптографии(Новый ОписаниеОповещения(
+ "ВыполнитьНаСторонеПослеСозданияМенеджераКриптографии", ЭтотОбъект, Контекст),
+ Null, Неопределено, Контекст.Форма.СертификатПрограмма);
+ Иначе
+ ВыполнитьНаСторонеЦиклЗапуск(Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьНаСтороне.
+Процедура ВыполнитьНаСторонеПослеСозданияМенеджераКриптографии(Результат, Контекст) Экспорт
+
+ Если ТипЗнч(Результат) <> Тип("МенеджерКриптографии") Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Новый Структура("Ошибка", Результат));
+ Возврат;
+ КонецЕсли;
+ Контекст.Вставить("МенеджерКриптографии", Результат);
+
+ // Если личный сертификат шифрования не используется, тогда его не нужно искать.
+ Если Контекст.Операция <> "Шифрование"
+ Или ЗначениеЗаполнено(Контекст.Форма.СертификатОтпечаток) Тогда
+
+ ПолучитьСертификатПоОтпечатку(Новый ОписаниеОповещения(
+ "ВыполнитьНаСторонеПослеПоискаСертификата", ЭтотОбъект, Контекст),
+ Контекст.Форма.СертификатОтпечаток, Истина, Неопределено, Контекст.Форма.СертификатПрограмма);
+ Иначе
+ ВыполнитьНаСторонеПослеПоискаСертификата(Null, Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьНаСтороне.
+Процедура ВыполнитьНаСторонеПослеПоискаСертификата(Результат, Контекст) Экспорт
+
+ Если ТипЗнч(Результат) <> Тип("СертификатКриптографии") И Результат <> Null Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+ Возврат;
+ КонецЕсли;
+ Контекст.Вставить("СертификатКриптографии", Результат);
+
+ Если Контекст.Операция = "Подписание" Тогда
+ Контекст.МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Контекст.ЗначениеПароля;
+ Контекст.Удалить("ЗначениеПароля");
+ Контекст.СертификатКриптографии.НачатьВыгрузку(Новый ОписаниеОповещения(
+ "ВыполнитьНаСторонеПослеВыгрузкиСертификата", ЭтотОбъект, Контекст));
+
+ ИначеЕсли Контекст.Операция = "Шифрование" Тогда
+ СвойстваСертификатов = Контекст.ОписаниеДанных.СертификатыШифрования;
+ Если ТипЗнч(СвойстваСертификатов) = Тип("Строка") Тогда
+ СвойстваСертификатов = ПолучитьИзВременногоХранилища(СвойстваСертификатов);
+ КонецЕсли;
+ Контекст.Вставить("Индекс", -1);
+ Контекст.Вставить("СвойстваСертификатов", СвойстваСертификатов);
+ Контекст.Вставить("СертификатыШифрования", Новый Массив);
+ ВыполнитьНаСторонеПодготовкаСертификатовЦиклНачало(Контекст);
+ Возврат;
+ Иначе
+ Контекст.МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Контекст.ЗначениеПароля;
+ Контекст.Удалить("ЗначениеПароля");
+ ВыполнитьНаСторонеЦиклЗапуск(Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьНаСтороне.
+Процедура ВыполнитьНаСторонеПодготовкаСертификатовЦиклНачало(Контекст)
+
+ Если Контекст.СвойстваСертификатов.Количество() <= Контекст.Индекс + 1 Тогда
+ ВыполнитьНаСторонеЦиклЗапуск(Контекст);
+ Возврат;
+ КонецЕсли;
+ Контекст.Индекс = Контекст.Индекс + 1;
+
+ СертификатКриптографии = Новый СертификатКриптографии;
+ СертификатКриптографии.НачатьИнициализацию(Новый ОписаниеОповещения(
+ "ВыполнитьНаСторонеПодготовкаСертификатовПослеИнициализацииСертификата", ЭтотОбъект, Контекст),
+ Контекст.СвойстваСертификатов[Контекст.Индекс].Сертификат);
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьНаСтороне.
+Процедура ВыполнитьНаСторонеПодготовкаСертификатовПослеИнициализацииСертификата(СертификатКриптографии, Контекст) Экспорт
+
+ Контекст.СертификатыШифрования.Добавить(СертификатКриптографии);
+
+ ВыполнитьНаСторонеПодготовкаСертификатовЦиклНачало(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьНаСтороне.
+Процедура ВыполнитьНаСторонеПослеВыгрузкиСертификата(ВыгруженныеДанные, Контекст) Экспорт
+
+ Контекст.Вставить("СвойстваСертификата", ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(
+ Контекст.СертификатКриптографии));
+ Контекст.СвойстваСертификата.Вставить("ДвоичныеДанные", ВыгруженныеДанные);
+
+ ВыполнитьНаСторонеЦиклЗапуск(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьНаСтороне.
+Процедура ВыполнитьНаСторонеЦиклЗапуск(Контекст)
+
+ Контекст.Вставить("ОперацияНачалась", Ложь);
+
+ Если Контекст.ОписаниеДанных.Свойство("Данные") Тогда
+ ЭлементыДанных = Новый Массив;
+ ЭлементыДанных.Добавить(Контекст.ОписаниеДанных);
+ Иначе
+ ЭлементыДанных = Контекст.ОписаниеДанных.НаборДанных;
+ КонецЕсли;
+
+ Контекст.Вставить("ЭлементыДанных", ЭлементыДанных);
+ Контекст.Вставить("Индекс", -1);
+
+ ВыполнитьНаСторонеЦиклНачало(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьНаСтороне.
+Процедура ВыполнитьНаСторонеЦиклНачало(Контекст)
+
+ Если Контекст.ЭлементыДанных.Количество() <= Контекст.Индекс + 1 Тогда
+ ВыполнитьНаСторонеПослеЦикла(Неопределено, Контекст);
+ Возврат;
+ КонецЕсли;
+ Контекст.Индекс = Контекст.Индекс + 1;
+ Контекст.Вставить("ЭлементДанных", Контекст.ЭлементыДанных[Контекст.Индекс]);
+
+ Если Не Контекст.ОписаниеДанных.Свойство("Данные") Тогда
+ Контекст.ОписаниеДанных.Вставить("ТекущийЭлементНабораДанных", Контекст.ЭлементДанных);
+ КонецЕсли;
+
+ Если Контекст.Операция = "Подписание"
+ И Контекст.ЭлементДанных.Свойство("СвойстваПодписи")
+ Или Контекст.Операция = "Шифрование"
+ И Контекст.ЭлементДанных.Свойство("ЗашифрованныеДанные")
+ Или Контекст.Операция = "Расшифровка"
+ И Контекст.ЭлементДанных.Свойство("РасшифрованныеДанные") Тогда
+
+ ВыполнитьНаСторонеЦиклНачало(Контекст);
+ Возврат;
+ КонецЕсли;
+
+ ПолучитьДанныеИзОписанияДанных(Новый ОписаниеОповещения(
+ "ВыполнитьНаСторонеЦиклПослеПолученияДанных", ЭтотОбъект, Контекст),
+ Контекст.Форма, Контекст.ОписаниеДанных, Контекст.ЭлементДанных.Данные, Контекст.НаСторонеКлиента);
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьНаСтороне.
+Процедура ВыполнитьНаСторонеЦиклПослеПолученияДанных(Результат, Контекст) Экспорт
+
+ Если ТипЗнч(Результат) = Тип("Структура") Тогда
+ Ошибка = Новый Структура("ОписаниеОшибки",
+ ЭлектроннаяПодписьСлужебныйКлиентСервер.ЗаголовокОшибкиПолученияДанных(Контекст.Операция)
+ + Символы.ПС + Результат.ОписаниеОшибки);
+ ВыполнитьНаСторонеПослеЦикла(Ошибка, Контекст);
+ Возврат;
+ КонецЕсли;
+ Данные = Результат;
+
+ Если Контекст.НаСторонеКлиента Тогда
+ МенеджерКриптографии = Контекст.МенеджерКриптографии;
+ Оповещение = Новый ОписаниеОповещения(
+ "ВыполнитьНаСторонеЦиклПослеОперацииНаКлиенте", ЭтотОбъект, Контекст,
+ "ВыполнитьНаСторонеЦиклПослеОшибкиОперацииНаКлиенте", ЭтотОбъект);
+
+ Если Контекст.Операция = "Подписание" Тогда
+ МенеджерКриптографии.НачатьПодписывание(Оповещение, Данные, Контекст.СертификатКриптографии);
+
+ ИначеЕсли Контекст.Операция = "Шифрование" Тогда
+ МенеджерКриптографии.НачатьШифрование(Оповещение, Данные, Контекст.СертификатыШифрования);
+ Иначе
+ МенеджерКриптографии.НачатьРасшифровку(Оповещение, Данные);
+ КонецЕсли;
+
+ Возврат;
+ КонецЕсли;
+
+ ЭлементДанныхДляСервера = Новый Структура;
+ ЭлементДанныхДляСервера.Вставить("Данные", Данные);
+
+ ПараметрыДляСервера = Новый Структура;
+ ПараметрыДляСервера.Вставить("Операция", Контекст.Операция);
+ ПараметрыДляСервера.Вставить("ИдентификаторФормы", Контекст.ИдентификаторФормы);
+ ПараметрыДляСервера.Вставить("СертификатПрограмма", Контекст.Форма.СертификатПрограмма);
+ ПараметрыДляСервера.Вставить("СертификатОтпечаток", Контекст.Форма.СертификатОтпечаток);
+ ПараметрыДляСервера.Вставить("ЭлементДанныхДляСервера", ЭлементДанныхДляСервера);
+
+ ОшибкаНаСервере = Новый Структура;
+ АдресРезультата = Неопределено;
+
+ Если Контекст.Операция = "Подписание" Тогда
+ ПараметрыДляСервера.Вставить("Комментарий", Контекст.Форма.Комментарий);
+ ПараметрыДляСервера.Вставить("ЗначениеПароля", Контекст.ЗначениеПароля);
+
+ Если Контекст.ЭлементДанных.Свойство("Объект")
+ И Не ТипЗнч(Контекст.ЭлементДанных.Объект) = Тип("ОписаниеОповещения") Тогда
+
+ ЭлементДанныхДляСервера.Вставить("Объект", Контекст.ЭлементДанных.Объект);
+
+ Если Контекст.ЭлементДанных.Свойство("ВерсияОбъекта") Тогда
+ ЭлементДанныхДляСервера.Свойство("ВерсияОбъекта", Контекст.ЭлементДанных.ВерсияОбъекта);
+ КонецЕсли;
+ КонецЕсли;
+
+ ИначеЕсли Контекст.Операция = "Шифрование" Тогда
+ ПараметрыДляСервера.Вставить("АдресСертификатов", Контекст.ОписаниеДанных.СертификатыШифрования);
+ Иначе // Расшифровка.
+ ПараметрыДляСервера.Вставить("ЗначениеПароля", Контекст.ЗначениеПароля);
+ КонецЕсли;
+
+ Успех = ЭлектроннаяПодписьСлужебныйВызовСервера.ВыполнитьНаСторонеСервера(ПараметрыДляСервера,
+ АдресРезультата, Контекст.ОперацияНачалась, ОшибкаНаСервере);
+
+ Если Не Успех Тогда
+ ВыполнитьНаСторонеПослеЦикла(ОшибкаНаСервере, Контекст);
+
+ ИначеЕсли Контекст.Операция = "Подписание" Тогда
+ ВыполнитьНаСторонеЦиклПослеПодписания(АдресРезультата, Контекст);
+
+ ИначеЕсли Контекст.Операция = "Шифрование" Тогда
+ ВыполнитьНаСторонеЦиклПослеШифрования(АдресРезультата, Контекст);
+ Иначе // Расшифровка.
+ ВыполнитьНаСторонеЦиклПослеРасшифровки(АдресРезультата, Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьНаСтороне.
+Процедура ВыполнитьНаСторонеЦиклПослеОшибкиОперацииНаКлиенте(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
+
+ СтандартнаяОбработка = Ложь;
+
+ ОшибкаНаКлиенте = Новый Структура("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+ ОшибкаНаКлиенте.Вставить("Инструкция", Истина);
+
+ ВыполнитьНаСторонеПослеЦикла(ОшибкаНаКлиенте, Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьНаСтороне.
+Процедура ВыполнитьНаСторонеЦиклПослеОперацииНаКлиенте(ДвоичныеДанные, Контекст) Экспорт
+
+ ОписаниеОшибки = "";
+ Если Контекст.Операция = "Подписание"
+ И ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеДанныеПодписи(ДвоичныеДанные, ОписаниеОшибки)
+ Или Контекст.Операция = "Шифрование"
+ И ЭлектроннаяПодписьСлужебныйКлиентСервер.ПустыеЗашифрованныеДанные(ДвоичныеДанные, ОписаниеОшибки) Тогда
+
+ ОшибкаНаКлиенте = Новый Структура("ОписаниеОшибки", ОписаниеОшибки);
+ ВыполнитьНаСторонеПослеЦикла(ОшибкаНаКлиенте, Контекст);
+ Возврат;
+ КонецЕсли;
+
+ Контекст.ОперацияНачалась = Истина;
+
+ Если Контекст.Операция = "Подписание" Тогда
+ СвойстваПодписи = ЭлектроннаяПодписьСлужебныйКлиентСервер.СвойстваПодписи(ДвоичныеДанные,
+ Контекст.СвойстваСертификата, Контекст.Форма.Комментарий);
+ ВыполнитьНаСторонеЦиклПослеПодписания(СвойстваПодписи, Контекст);
+
+ ИначеЕсли Контекст.Операция = "Шифрование" Тогда
+ ВыполнитьНаСторонеЦиклПослеШифрования(ДвоичныеДанные, Контекст);
+ Иначе
+ ВыполнитьНаСторонеЦиклПослеРасшифровки(ДвоичныеДанные, Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьНаСтороне.
+Процедура ВыполнитьНаСторонеЦиклПослеПодписания(СвойстваПодписи, Контекст)
+
+ ЭлементДанных = Контекст.ЭлементДанных;
+ ЭлементДанных.Вставить("СвойстваПодписи", СвойстваПодписи);
+
+ Если Не ЭлементДанных.Свойство("Объект") Тогда
+ ВыполнитьНаСторонеЦиклНачало(Контекст);
+ Возврат;
+ КонецЕсли;
+
+ Если ТипЗнч(ЭлементДанных.Объект) <> Тип("ОписаниеОповещения") Тогда
+ Если Контекст.НаСторонеКлиента Тогда
+ ВерсияОбъекта = Неопределено;
+ ЭлементДанных.Свойство("ВерсияОбъекта", ВерсияОбъекта);
+ Попытка
+ ЭлектроннаяПодписьСлужебныйВызовСервера.ДобавитьПодпись(ЭлементДанных.Объект,
+ СвойстваПодписи, Контекст.ИдентификаторФормы, ВерсияОбъекта);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ЭлементДанных.Удалить("СвойстваПодписи");
+ ОшибкаНаКлиенте = Новый Структура("ОписаниеОшибки",
+ НСтр("ru = 'При записи подписи возникла ошибка:'")
+ + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+ ВыполнитьНаСторонеПослеЦикла(ОшибкаНаКлиенте, Контекст);
+ Возврат;
+ КонецПопытки;
+ КонецЕсли;
+ ОповеститьОбИзменении(ЭлементДанных.Объект);
+ ВыполнитьНаСторонеЦиклНачало(Контекст);
+ Возврат;
+ КонецЕсли;
+
+ ПараметрыВыполнения = Новый Структура;
+ ПараметрыВыполнения.Вставить("ОписаниеДанных", Контекст.ОписаниеДанных);
+ ПараметрыВыполнения.Вставить("Оповещение", Новый ОписаниеОповещения(
+ "ВыполнитьНаСторонеЦиклПослеЗаписиПодписи", ЭтотОбъект, Контекст));
+
+ Попытка
+ ВыполнитьОбработкуОповещения(ЭлементДанных.Объект, ПараметрыВыполнения);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ВыполнитьНаСторонеЦиклПослеЗаписиПодписи(Новый Структура("ОписаниеОшибки",
+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке)), Контекст);
+ КонецПопытки;
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьНаСтороне.
+Процедура ВыполнитьНаСторонеЦиклПослеЗаписиПодписи(Результат, Контекст) Экспорт
+
+ Если Результат.Свойство("ОписаниеОшибки") Тогда
+ Контекст.ЭлементДанных.Удалить("СвойстваПодписи");
+ Ошибка = Новый Структура("ОписаниеОшибки",
+ НСтр("ru = 'При записи подписи возникла ошибка:'") + Символы.ПС + Результат.ОписаниеОшибки);
+ ВыполнитьНаСторонеПослеЦикла(Ошибка, Контекст);
+ Возврат;
+ КонецЕсли;
+
+ ВыполнитьНаСторонеЦиклНачало(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьНаСтороне.
+Процедура ВыполнитьНаСторонеЦиклПослеШифрования(ЗашифрованныеДанные, Контекст)
+
+ ЭлементДанных = Контекст.ЭлементДанных;
+ ЭлементДанных.Вставить("ЗашифрованныеДанные", ЗашифрованныеДанные);
+
+ Если Не ЭлементДанных.Свойство("РазмещениеРезультата")
+ Или ТипЗнч(ЭлементДанных.РазмещениеРезультата) <> Тип("ОписаниеОповещения") Тогда
+
+ ВыполнитьНаСторонеЦиклНачало(Контекст);
+ Возврат;
+ КонецЕсли;
+
+ ПараметрыВыполнения = Новый Структура;
+ ПараметрыВыполнения.Вставить("ОписаниеДанных", Контекст.ОписаниеДанных);
+ ПараметрыВыполнения.Вставить("Оповещение", Новый ОписаниеОповещения(
+ "ВыполнитьНаСторонеЦиклПослеЗаписиЗашифрованныхДанных", ЭтотОбъект, Контекст));
+
+ Попытка
+ ВыполнитьОбработкуОповещения(ЭлементДанных.РазмещениеРезультата, ПараметрыВыполнения);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ВыполнитьНаСторонеЦиклПослеЗаписиЗашифрованныхДанных(Новый Структура("ОписаниеОшибки",
+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке)), Контекст);
+ КонецПопытки;
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьНаСтороне.
+Процедура ВыполнитьНаСторонеЦиклПослеЗаписиЗашифрованныхДанных(Результат, Контекст) Экспорт
+
+ Если Результат.Свойство("ОписаниеОшибки") Тогда
+ Контекст.ЭлементДанных.Удалить("ЗашифрованныеДанные");
+ Ошибка = Новый Структура("ОписаниеОшибки",
+ НСтр("ru = 'При записи зашифрованных данных возникла ошибка:'")
+ + Символы.ПС + Результат.ОписаниеОшибки);
+ ВыполнитьНаСторонеПослеЦикла(Ошибка, Контекст);
+ Возврат;
+ КонецЕсли;
+
+ ВыполнитьНаСторонеЦиклНачало(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьНаСтороне.
+Процедура ВыполнитьНаСторонеЦиклПослеРасшифровки(РасшифрованныеДанные, Контекст)
+
+ ЭлементДанных = Контекст.ЭлементДанных;
+ ЭлементДанных.Вставить("РасшифрованныеДанные", РасшифрованныеДанные);
+
+ Если Не ЭлементДанных.Свойство("РазмещениеРезультата")
+ Или ТипЗнч(ЭлементДанных.РазмещениеРезультата) <> Тип("ОписаниеОповещения") Тогда
+
+ ВыполнитьНаСторонеЦиклНачало(Контекст);
+ Возврат;
+ КонецЕсли;
+
+ ПараметрыВыполнения = Новый Структура;
+ ПараметрыВыполнения.Вставить("ОписаниеДанных", Контекст.ОписаниеДанных);
+ ПараметрыВыполнения.Вставить("Оповещение", Новый ОписаниеОповещения(
+ "ВыполнитьНаСторонеЦиклПослеЗаписиРасшифрованныхДанных", ЭтотОбъект, Контекст));
+
+ Попытка
+ ВыполнитьОбработкуОповещения(ЭлементДанных.РазмещениеРезультата, ПараметрыВыполнения);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ВыполнитьНаСторонеЦиклПослеЗаписиЗашифрованныхДанных(Новый Структура("ОписаниеОшибки",
+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке)), Контекст);
+ КонецПопытки;
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьНаСтороне.
+Процедура ВыполнитьНаСторонеЦиклПослеЗаписиРасшифрованныхДанных(Результат, Контекст) Экспорт
+
+ Если Результат.Свойство("ОписаниеОшибки") Тогда
+ Контекст.ЭлементДанных.Удалить("РасшифрованныеДанные");
+ Ошибка = Новый Структура("ОписаниеОшибки",
+ НСтр("ru = 'При записи расшифрованных данных возникла ошибка:'")
+ + Символы.ПС + Результат.ОписаниеОшибки);
+ ВыполнитьНаСторонеПослеЦикла(Ошибка, Контекст);
+ Возврат;
+ КонецЕсли;
+
+ ВыполнитьНаСторонеЦиклНачало(Контекст);
+
+КонецПроцедуры
+
+// Продолжение процедуры ВыполнитьНаСтороне.
+Процедура ВыполнитьНаСторонеПослеЦикла(Ошибка, Контекст)
+
+ Результат = Новый Структура;
+ Если Ошибка <> Неопределено Тогда
+ Результат.Вставить("Ошибка", Ошибка);
+ КонецЕсли;
+
+ Если Контекст.ОперацияНачалась Тогда
+ Результат.Вставить("ОперацияНачалась");
+
+ Если Не Результат.Свойство("Ошибка") И Контекст.Индекс > 0 Тогда
+ Результат.Вставить("ЕстьОбработанныеЭлементыДанных");
+ КонецЕсли;
+ КонецЕсли;
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+
+КонецПроцедуры
+
+
+// Только для внутреннего использования.
+Процедура ПолучитьДанныеИзОписанияДанных(Оповещение, Форма, ОписаниеДанных, ИсточникДанных, ДляСтороныКлиента)
+
+ Контекст = Новый Структура;
+ Контекст.Вставить("Форма", Форма);
+ Контекст.Вставить("Оповещение", Оповещение);
+ Контекст.Вставить("ДляСтороныКлиента", ДляСтороныКлиента);
+
+ Если ТипЗнч(ИсточникДанных) = Тип("ОписаниеОповещения") Тогда
+ ПараметрыВыполнения = Новый Структура;
+ ПараметрыВыполнения.Вставить("ОписаниеДанных", ОписаниеДанных);
+ ПараметрыВыполнения.Вставить("Оповещение", Новый ОписаниеОповещения(
+ "ПолучитьДанныеИзОписанияДанныхПродолжение", ЭтотОбъект, Контекст));
+
+ Попытка
+ ВыполнитьОбработкуОповещения(ИсточникДанных, ПараметрыВыполнения);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ Результат = Новый Структура("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+ КонецПопытки;
+ Иначе
+ ПолучитьДанныеИзОписанияДанныхПродолжение(Новый Структура("Данные", ИсточникДанных), Контекст);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьДанныеИзОписанияДанных.
+Процедура ПолучитьДанныеИзОписанияДанныхПродолжение(Результат, Контекст) Экспорт
+
+ Если ТипЗнч(Результат) <> Тип("Структура")
+ Или Не Результат.Свойство("Данные")
+ Или ТипЗнч(Результат.Данные) <> Тип("ДвоичныеДанные")
+ И ТипЗнч(Результат.Данные) <> Тип("Строка") Тогда
+
+ Если ТипЗнч(Результат) <> Тип("Структура") Или Не Результат.Свойство("ОписаниеОшибки") Тогда
+ Ошибка = Новый Структура("ОписаниеОшибки", НСтр("ru = 'Некорректный тип данных.'"));
+ Иначе
+ Ошибка = Новый Структура("ОписаниеОшибки", Результат.ОписаниеОшибки);
+ КонецЕсли;
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ошибка);
+ Возврат;
+ КонецЕсли;
+
+ Данные = Результат.Данные;
+
+ Если Контекст.ДляСтороныКлиента Тогда
+ // Для стороны клиента требуются двоичные данные или путь к файлу.
+
+ Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Данные);
+
+ ИначеЕсли ЭтоАдресВременногоХранилища(Данные) Тогда
+ Попытка
+ ТекущийРезультат = ПолучитьИзВременногоХранилища(Данные);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ТекущийРезультат = Новый Структура("ОписаниеОшибки",
+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+ КонецПопытки;
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, ТекущийРезультат);
+
+ Иначе // Путь к файлу
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Данные);
+ КонецЕсли;
+ Иначе
+ // Для стороны сервера требуется адрес двоичных данных во временном хранилище.
+
+ Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение,
+ ПоместитьВоВременноеХранилище(Данные, Контекст.Форма.УникальныйИдентификатор));
+
+ ИначеЕсли ЭтоАдресВременногоХранилища(Данные) Тогда
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Данные);
+
+ Иначе // Путь к файлу
+ ПомещаемыеФайлы = Новый Массив;
+ Попытка
+ ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(Данные));
+ НачатьПомещениеФайлов(Новый ОписаниеОповещения(
+ "ПолучитьДанныеИзОписанияДанныхЗавершение", ЭтотОбъект, Контекст,
+ "ПолучитьДанныеИзОписанияДанныхЗавершениеПоОшибке", ЭтотОбъект),
+ ПомещаемыеФайлы, , Ложь, Контекст.Форма.УникальныйИдентификатор);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ ТекущийРезультат = Новый Структура("ОписаниеОшибки",
+ КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, ТекущийРезультат);
+ КонецПопытки;
+ КонецЕсли;
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьДанныеИзОписанияДанных.
+Процедура ПолучитьДанныеИзОписанияДанныхЗавершениеПоОшибке(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт
+
+ СтандартнаяОбработка = Ложь;
+
+ Результат = Новый Структура("ОписаниеОшибки", КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+
+КонецПроцедуры
+
+// Продолжение процедуры ПолучитьДанныеИзОписанияДанных.
+Процедура ПолучитьДанныеИзОписанияДанныхЗавершение(ПомещенныеФайлы, Контекст) Экспорт
+
+ Если ПомещенныеФайлы = Неопределено Или ПомещенныеФайлы.Количество() = 0 Тогда
+ Результат = Новый Структура("ОписаниеОшибки",
+ НСтр("ru = 'Передача данных отменена пользователем.'"));
+ Иначе
+ Результат = ПомещенныеФайлы[0].Хранение;
+ КонецЕсли;
+
+ ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат);
+
+КонецПроцедуры
+
+// Только для внутреннего использования.
+Процедура ПродлитьХранениеКонтекстаОперации(ОписаниеДанных) Экспорт
+
+ ФормаПередачаПараметров().ПродлитьХранениеКонтекстаОперации(ОписаниеДанных.КонтекстОперации);
+
+КонецПроцедуры
+
////////////////////////////////////////////////////////////////////////////////
// Вспомогательные процедуры и функции.
@@ -1103,6 +3203,11 @@
Пароль = ХранилищеПаролей.Получить(Сертификат);
ДополнительныеПараметры.Вставить("ПарольВПамяти", Пароль <> Неопределено);
+ Если ДополнительныеПараметры.ПриУстановкеПароляИзДругойОперации Тогда
+ РеквизитПароль = ?(СвойстваПароля.Значение <> "", "****************", "");
+ Возврат;
+ КонецЕсли;
+
Если ДополнительныеПараметры.ПриИзмененииРеквизитаПароль Тогда
СвойстваПароля.Значение = РеквизитПароль;
СвойстваПароля.ПарольПроверен = Ложь;
diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl
index 0edc2098b..ff6c04c38 100644
--- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl
+++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl
@@ -69,47 +69,8 @@
#Область СлужебныеПроцедурыИФункции
-// Проверяет сертификат. В случае ошибки возвращает описание.
-//
-// Параметры:
-// МенеджерКриптографии - МенеджерКриптографии - для выполнения проверки.
-// Сертификат - СертификатКриптографии - сертификат.
-// - ДвоичныеДанные - двоичные данные сертификата.
-// - Строка - адрес во временном хранилище с двоичными данными сертификата.
-//
-// Возвращаемое значение:
-// Неопределено - ошибки нет.
-// Строка - описание ошибки проверки сертификата.
-//
-Функция ОшибкаПроверкиСертификата(МенеджерКриптографии, Сертификат) Экспорт
-
- СертификатДляПроверки = Сертификат;
-
- Если ТипЗнч(Сертификат) = Тип("Строка") Тогда
- СертификатДляПроверки = ПолучитьИзВременногоХранилища(Сертификат);
- КонецЕсли;
-
- Если ТипЗнч(СертификатДляПроверки) = Тип("ДвоичныеДанные") Тогда
- СертификатДляПроверки = Новый СертификатКриптографии(СертификатДляПроверки);
- КонецЕсли;
-
- МассивРежимовПроверки = Новый Массив;
- МассивРежимовПроверки.Добавить(РежимПроверкиСертификатаКриптографии.ИгнорироватьВремяДействия);
- МассивРежимовПроверки.Добавить(РежимПроверкиСертификатаКриптографии.РазрешитьТестовыеСертификаты);
-
- Попытка
- МенеджерКриптографии.ПроверитьСертификат(СертификатДляПроверки, МассивРежимовПроверки);
- Исключение
- Возврат КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
- КонецПопытки;
-
- Возврат Неопределено;
-
-КонецФункции
-
// Только для внутреннего использования.
-Функция МенеджерКриптографии(Программа, ЭтоLinux, Ошибки, ЭтоСервер,
- ПутиКПрограммамНаСерверахLinux = Неопределено) Экспорт
+Функция МенеджерКриптографииОписанияПрограмм(Программа, Ошибки) Экспорт
ОписанияПрограмм = ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ОписанияПрограмм;
@@ -122,113 +83,153 @@
КонецЕсли;
КонецЦикла;
Если ПрограммаНеНайдена Тогда
- ДобавитьОшибку(Ошибки, Программа, НСтр("ru = 'Не предусмотрена для использования.'"), Истина);
+ МенеджерКриптографииДобавитьОшибку(Ошибки, Программа,
+ НСтр("ru = 'Не предусмотрена для использования.'"), Истина);
Возврат Неопределено;
КонецЕсли;
ОписанияПрограмм = Новый Массив;
ОписанияПрограмм.Добавить(ОписаниеПрограммы);
КонецЕсли;
- Менеджер = Неопределено;
- Для каждого ОписаниеПрограммы Из ОписанияПрограмм Цикл
-
- Если Не ЗначениеЗаполнено(ОписаниеПрограммы.ИмяПрограммы) Тогда
- ДобавитьОшибку(Ошибки, ОписаниеПрограммы.Ссылка, НСтр("ru = 'Не указано имя программы.'"), Истина);
- Продолжить;
- КонецЕсли;
-
- Если Не ЗначениеЗаполнено(ОписаниеПрограммы.ТипПрограммы) Тогда
- ДобавитьОшибку(Ошибки, ОписаниеПрограммы.Ссылка, НСтр("ru = 'Не указан тип программы.'"), Истина);
- Продолжить;
- КонецЕсли;
-
- Если ЭтоLinux Тогда
- Если ПутиКПрограммамНаСерверахLinux = Неопределено Тогда
- ПутьКПрограмме = ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки(
- ).ПутиКПрограммамЭлектроннойПодписиИШифрования.Получить(Программа);
- Иначе
- ПутьКПрограмме = ПутиКПрограммамНаСерверахLinux.Получить(Программа);
- КонецЕсли;
-
- Если Не ЗначениеЗаполнено(ПутьКПрограмме) Тогда
- ДобавитьОшибку(Ошибки, ОписаниеПрограммы.Ссылка,
- НСтр("ru = 'Не предусмотрена для использования.'"), ЭтоСервер, , , Истина);
- Продолжить;
- КонецЕсли;
-
- Попытка
- Менеджер = Новый МенеджерКриптографии(
- ОписаниеПрограммы.ИмяПрограммы,
- ПутьКПрограмме,
- ОписаниеПрограммы.ТипПрограммы);
- Исключение
- ДобавитьОшибку(Ошибки, ОписаниеПрограммы.Ссылка,
- КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ЭтоСервер, Истина, Истина);
- Продолжить;
- КонецПопытки;
- Иначе
- Попытка
- Менеджер = Новый МенеджерКриптографии(
- ОписаниеПрограммы.ИмяПрограммы,
- "",
- ОписаниеПрограммы.ТипПрограммы);
- Исключение
- ДобавитьОшибку(Ошибки, ОписаниеПрограммы.Ссылка,
- КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ЭтоСервер, Истина, Истина);
- Продолжить;
- КонецПопытки;
-
- ИмяПрограммыПолученное = Менеджер.ПолучитьИнформациюМодуляКриптографии().Имя;
- Если ИмяПрограммыПолученное <> ОписаниеПрограммы.ИмяПрограммы Тогда
- Менеджер = Неопределено;
- ДобавитьОшибку(Ошибки, ОписаниеПрограммы.Ссылка, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Получена другая программа с именем ""%1"".'"), ИмяПрограммыПолученное), ЭтоСервер, Истина);
- Продолжить;
- КонецЕсли;
- КонецЕсли;
-
- АлгоритмПодписи = Строка(ОписаниеПрограммы.АлгоритмПодписи);
- Попытка
- Менеджер.АлгоритмПодписи = АлгоритмПодписи;
- Исключение
- Менеджер = Неопределено;
- // Платформа использует обобщенное сообщение "Неизвестный алгоритм криптографии". Требуется более конкретное.
- ДобавитьОшибку(Ошибки, ОписаниеПрограммы.Ссылка, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Выбран неизвестный алгоритм подписи ""%1"".'"), АлгоритмПодписи), Истина);
- Продолжить;
- КонецПопытки;
-
- АлгоритмХеширования = Строка(ОписаниеПрограммы.АлгоритмХеширования);
- Попытка
- Менеджер.АлгоритмХеширования = АлгоритмХеширования;
- Исключение
- Менеджер = Неопределено;
- // Платформа использует обобщенное сообщение "Неизвестный алгоритм криптографии". Требуется более конкретное.
- ДобавитьОшибку(Ошибки, ОписаниеПрограммы.Ссылка, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Выбран неизвестный алгоритм хеширования ""%1"".'"), АлгоритмХеширования), Истина);
- Продолжить;
- КонецПопытки;
-
- АлгоритмШифрования = Строка(ОписаниеПрограммы.АлгоритмШифрования);
- Попытка
- Менеджер.АлгоритмШифрования = АлгоритмШифрования;
- Исключение
- Менеджер = Неопределено;
- // Платформа использует обобщенное сообщение "Неизвестный алгоритм криптографии". Требуется более конкретное.
- ДобавитьОшибку(Ошибки, ОписаниеПрограммы.Ссылка, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Выбран неизвестный алгоритм шифрования ""%1"".'"), АлгоритмШифрования), Истина);
- Продолжить;
- КонецПопытки;
-
- Прервать; // Требуемый менеджер криптографии получен.
- КонецЦикла;
-
- Возврат Менеджер;
+ Возврат ОписанияПрограмм;
КонецФункции
// Только для внутреннего использования.
-Функция ПолучитьСертификатПоОтпечатку(МенеджерКриптографии, Отпечаток, ТолькоВЛичномХранилище, ПоказатьОшибку, ОписаниеОшибки) Экспорт
+Функция МенеджерКриптографииСвойстваПрограммы(ОписаниеПрограммы, ЭтоLinux, Ошибки, ЭтоСервер,
+ ПутиКПрограммамНаСерверахLinux = Неопределено) Экспорт
+
+ Если Не ЗначениеЗаполнено(ОписаниеПрограммы.ИмяПрограммы) Тогда
+ МенеджерКриптографииДобавитьОшибку(Ошибки, ОписаниеПрограммы.Ссылка,
+ НСтр("ru = 'Не указано имя программы.'"), Истина);
+ Возврат Неопределено;
+ КонецЕсли;
+
+ Если Не ЗначениеЗаполнено(ОписаниеПрограммы.ТипПрограммы) Тогда
+ МенеджерКриптографииДобавитьОшибку(Ошибки, ОписаниеПрограммы.Ссылка,
+ НСтр("ru = 'Не указан тип программы.'"), Истина);
+ Возврат Неопределено;
+ КонецЕсли;
+
+ СвойстваПрограммы = Новый Структура("ИмяПрограммы, ПутьКПрограмме, ТипПрограммы");
+
+ Если ЭтоLinux Тогда
+ Если ПутиКПрограммамНаСерверахLinux = Неопределено Тогда
+ ПутьКПрограмме = ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки(
+ ).ПутиКПрограммамЭлектроннойПодписиИШифрования.Получить(ОписаниеПрограммы.Ссылка);
+ Иначе
+ ПутьКПрограмме = ПутиКПрограммамНаСерверахLinux.Получить(ОписаниеПрограммы.Ссылка);
+ КонецЕсли;
+
+ Если Не ЗначениеЗаполнено(ПутьКПрограмме) Тогда
+ МенеджерКриптографииДобавитьОшибку(Ошибки, ОписаниеПрограммы.Ссылка,
+ НСтр("ru = 'Не предусмотрена для использования.'"), ЭтоСервер, , , Истина);
+ Возврат Неопределено;
+ КонецЕсли;
+ Иначе
+ ПутьКПрограмме = "";
+ КонецЕсли;
+
+ СвойстваПрограммы = Новый Структура;
+ СвойстваПрограммы.Вставить("ИмяПрограммы", ОписаниеПрограммы.ИмяПрограммы);
+ СвойстваПрограммы.Вставить("ПутьКПрограмме", ПутьКПрограмме);
+ СвойстваПрограммы.Вставить("ТипПрограммы", ОписаниеПрограммы.ТипПрограммы);
+
+ Возврат СвойстваПрограммы;
+
+КонецФункции
+
+// Только для внутреннего использования.
+Функция МенеджерКриптографииАлгоритмыУстановлены(ОписаниеПрограммы, Менеджер, Ошибки) Экспорт
+
+ АлгоритмПодписи = Строка(ОписаниеПрограммы.АлгоритмПодписи);
+ Попытка
+ Менеджер.АлгоритмПодписи = АлгоритмПодписи;
+ Исключение
+ Менеджер = Неопределено;
+ // Платформа использует обобщенное сообщение "Неизвестный алгоритм криптографии". Требуется более конкретное.
+ МенеджерКриптографииДобавитьОшибку(Ошибки, ОписаниеПрограммы.Ссылка, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Выбран неизвестный алгоритм подписи ""%1"".'"), АлгоритмПодписи), Истина);
+ Возврат Ложь;
+ КонецПопытки;
+
+ АлгоритмХеширования = Строка(ОписаниеПрограммы.АлгоритмХеширования);
+ Попытка
+ Менеджер.АлгоритмХеширования = АлгоритмХеширования;
+ Исключение
+ Менеджер = Неопределено;
+ // Платформа использует обобщенное сообщение "Неизвестный алгоритм криптографии". Требуется более конкретное.
+ МенеджерКриптографииДобавитьОшибку(Ошибки, ОписаниеПрограммы.Ссылка, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Выбран неизвестный алгоритм хеширования ""%1"".'"), АлгоритмХеширования), Истина);
+ Возврат Ложь;
+ КонецПопытки;
+
+ АлгоритмШифрования = Строка(ОписаниеПрограммы.АлгоритмШифрования);
+ Попытка
+ Менеджер.АлгоритмШифрования = АлгоритмШифрования;
+ Исключение
+ Менеджер = Неопределено;
+ // Платформа использует обобщенное сообщение "Неизвестный алгоритм криптографии". Требуется более конкретное.
+ МенеджерКриптографииДобавитьОшибку(Ошибки, ОписаниеПрограммы.Ссылка, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Выбран неизвестный алгоритм шифрования ""%1"".'"), АлгоритмШифрования), Истина);
+ Возврат Ложь;
+ КонецПопытки;
+
+ Возврат Истина;
+
+КонецФункции
+
+// Только для внутреннего использования.
+Процедура МенеджерКриптографииПрограммаНеНайдена(ОписаниеПрограммы, Ошибки, ЭтоСервер) Экспорт
+
+ МенеджерКриптографииДобавитьОшибку(Ошибки, ОписаниеПрограммы.Ссылка,
+ НСтр("ru = 'Программа не найдена на компьютере.'"), ЭтоСервер, Истина);
+
+КонецПроцедуры
+
+// Только для внутреннего использования.
+Функция МенеджерКриптографииИмяПрограммыСовпадает(ОписаниеПрограммы, ИмяПрограммыПолученное, Ошибки, ЭтоСервер) Экспорт
+
+ Если ИмяПрограммыПолученное <> ОписаниеПрограммы.ИмяПрограммы Тогда
+ МенеджерКриптографииДобавитьОшибку(Ошибки, ОписаниеПрограммы.Ссылка, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Получена другая программа с именем ""%1"".'"), ИмяПрограммыПолученное), ЭтоСервер, Истина);
+ Возврат Ложь;
+ КонецЕсли;
+
+ Возврат Истина;
+
+КонецФункции
+
+// Только для внутреннего использования.
+Процедура МенеджерКриптографииДобавитьОшибку(Ошибки, Программа, Описание,
+ КАдминистратору, Инструкция = Ложь, ИзИсключения = Ложь, НеУказанПуть = Ложь) Экспорт
+
+ СвойстваОшибки = Новый Структура;
+ СвойстваОшибки.Вставить("Программа", Программа);
+ СвойстваОшибки.Вставить("Описание", Описание);
+ СвойстваОшибки.Вставить("КАдминистратору", КАдминистратору);
+ СвойстваОшибки.Вставить("Инструкция", Инструкция);
+ СвойстваОшибки.Вставить("ИзИсключения", ИзИсключения);
+ СвойстваОшибки.Вставить("НеУказанПуть", НеУказанПуть);
+ СвойстваОшибки.Вставить("НастройкаПрограмм", Истина);
+
+ Ошибки.Добавить(СвойстваОшибки);
+
+КонецПроцедуры
+
+// Только для внутреннего использования.
+Функция РежимыПроверкиСертификата() Экспорт
+
+ МассивРежимовПроверки = Новый Массив;
+ МассивРежимовПроверки.Добавить(РежимПроверкиСертификатаКриптографии.ИгнорироватьВремяДействия);
+ МассивРежимовПроверки.Добавить(РежимПроверкиСертификатаКриптографии.РазрешитьТестовыеСертификаты);
+
+ Возврат МассивРежимовПроверки;
+
+КонецФункции
+
+// Только для внутреннего использования.
+Функция ТипХранилищаДляПоискаСертификата(ТолькоВЛичномХранилище) Экспорт
Если ТипЗнч(ТолькоВЛичномХранилище) = Тип("ТипХранилищаСертификатовКриптографии") Тогда
ТипХранилища = ТолькоВЛичномХранилище;
@@ -238,72 +239,12 @@
ТипХранилища = Неопределено; // Хранилище, содержащее сертификаты всех доступных типов.
КонецЕсли;
- Попытка
- ХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилища);
- Исключение
- Если ПоказатьОшибку Тогда
- ВызватьИсключение;
- КонецЕсли;
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
- КонецПопытки;
-
- Если Не ЗначениеЗаполнено(ПредставлениеОшибки) Тогда
- Попытка
- ДвоичныеДанныеОтпечатка = Base64Значение(Отпечаток);
- Исключение
- Если ПоказатьОшибку Тогда
- ВызватьИсключение;
- КонецЕсли;
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
- КонецПопытки;
- КонецЕсли;
-
- Если Не ЗначениеЗаполнено(ПредставлениеОшибки) Тогда
- Попытка
- Сертификат = ХранилищеСертификатов.НайтиПоОтпечатку(ДвоичныеДанныеОтпечатка);
- Исключение
- Если ПоказатьОшибку Тогда
- ВызватьИсключение;
- КонецЕсли;
- ИнформацияОбОшибке = ИнформацияОбОшибке();
- ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
- КонецПопытки;
- КонецЕсли;
-
- Если ЗначениеЗаполнено(ПредставлениеОшибки) Тогда
- Если ТипЗнч(ОписаниеОшибки) = Тип("Структура") Тогда
- ОписаниеОшибки = Новый Структура;
- ОписаниеОшибки.Вставить("ОписаниеОшибки", ОписаниеОшибки);
- Иначе
- ОписаниеОшибки = ПредставлениеОшибки;
- КонецЕсли;
- Возврат Неопределено;
- КонецЕсли;
-
- Возврат Сертификат;
+ Возврат ТипХранилища;
КонецФункции
// Только для внутреннего использования.
-Процедура ДобавитьСвойстваСертификатовИзХранилища(Таблица, МенеджерКриптографии, Личные, БезОтбора) Экспорт
-
- Если МенеджерКриптографии = Неопределено Тогда
- Возврат;
- КонецЕсли;
-
- МассивСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(
- ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты).ПолучитьВсе();
-
- Если Не Личные Тогда
- Массив = МенеджерКриптографии.ПолучитьХранилищеСертификатов(
- ТипХранилищаСертификатовКриптографии.СертификатыПолучателей).ПолучитьВсе();
-
- Для каждого Сертификат Из Массив Цикл
- МассивСертификатов.Добавить(Сертификат);
- КонецЦикла;
- КонецЕсли;
+Процедура ДобавитьСвойстваСертификатов(Таблица, МассивСертификатов, БезОтбора, ТолькоОтпечатки = Ложь) Экспорт
#Если ВебКлиент Или ТонкийКлиент Тогда
ДатаУниверсальная = ОбщегоНазначенияКлиент.ДатаУниверсальная();
@@ -311,16 +252,31 @@
ДатаУниверсальная = ТекущаяУниверсальнаяДата();
#КонецЕсли
- ОтпечаткиУжеДобавленныхСертификатов = Новый Соответствие; // Для пропуска дублей.
- НаСервере = ТипЗнч(Таблица) <> Тип("Массив");
+ Если ТолькоОтпечатки Тогда
+ ОтпечаткиУжеДобавленныхСертификатов = Таблица;
+ НаСервере = Ложь;
+ Иначе
+ ОтпечаткиУжеДобавленныхСертификатов = Новый Соответствие; // Для пропуска дублей.
+ НаСервере = ТипЗнч(Таблица) <> Тип("Массив");
+ КонецЕсли;
Для Каждого ТекущийСертификат Из МассивСертификатов Цикл
Отпечаток = Base64Строка(ТекущийСертификат.Отпечаток);
+ Если ТекущийСертификат.ДатаОкончания <= ДатаУниверсальная Тогда
+ Если Не БезОтбора Тогда
+ Продолжить; // Пропуск просроченных сертификатов.
+ КонецЕсли;
+ КонецЕсли;
+
Если ОтпечаткиУжеДобавленныхСертификатов.Получить(Отпечаток) <> Неопределено Тогда
Продолжить;
КонецЕсли;
- ОтпечаткиУжеДобавленныхСертификатов.Вставить(Отпечаток);
+ ОтпечаткиУжеДобавленныхСертификатов.Вставить(Отпечаток, Истина);
+
+ Если ТолькоОтпечатки Тогда
+ Продолжить;
+ КонецЕсли;
Если НаСервере Тогда
Строка = Таблица.Найти(Отпечаток, "Отпечаток");
@@ -329,14 +285,8 @@
КонецЕсли;
КонецЕсли;
- Если ТекущийСертификат.ДатаОкончания <= ДатаУниверсальная Тогда
- Если Не БезОтбора Тогда
- Продолжить; // Пропуск просроченных сертификатов.
- КонецЕсли;
- КонецЕсли;
-
СвойстваСертификата = Новый Структура;
- СвойстваСертификата.Вставить("Отпечаток", Base64Строка(ТекущийСертификат.Отпечаток));
+ СвойстваСертификата.Вставить("Отпечаток", Отпечаток);
СвойстваСертификата.Вставить("Представление",
ЭлектроннаяПодписьКлиентСервер.ПредставлениеСертификата(ТекущийСертификат));
@@ -357,14 +307,7 @@
КонецПроцедуры
// Только для внутреннего использования.
-Процедура ДобавитьОтпечаткиСертификатовИзЛичногоХранилища(Массив, МенеджерКриптографии) Экспорт
-
- Если МенеджерКриптографии = Неопределено Тогда
- Возврат;
- КонецЕсли;
-
- ТипХранилища = ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты;
- МассивСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилища).ПолучитьВсе();
+Процедура ДобавитьОтпечаткиСертификатов(Массив, МассивСертификатов) Экспорт
#Если ВебКлиент Или ТонкийКлиент Тогда
ДатаУниверсальная = ОбщегоНазначенияКлиент.ДатаУниверсальная();
@@ -384,6 +327,38 @@
КонецПроцедуры
+// Только для внутреннего использования.
+Функция СвойстваПодписи(ДвоичныеДанныеПодписи, СвойстваСертификата, Комментарий, ИмяФайлаПодписи = "") Экспорт
+
+ СвойстваПодписи = Новый Структура;
+ СвойстваПодписи.Вставить("Подпись", ДвоичныеДанныеПодписи);
+ СвойстваПодписи.Вставить("УстановившийПодпись", ПользователиКлиентСервер.АвторизованныйПользователь());
+ СвойстваПодписи.Вставить("Комментарий", Комментарий);
+ СвойстваПодписи.Вставить("ИмяФайлаПодписи", ИмяФайлаПодписи);
+ СвойстваПодписи.Вставить("ДатаПодписи", Дата('00010101')); // Устанавливается перед записью.
+ // Производные свойства:
+ СвойстваПодписи.Вставить("Сертификат", СвойстваСертификата.ДвоичныеДанные);
+ СвойстваПодписи.Вставить("Отпечаток", СвойстваСертификата.Отпечаток);
+ СвойстваПодписи.Вставить("КомуВыданСертификат", СвойстваСертификата.КомуВыдан);
+
+ Возврат СвойстваПодписи;
+
+КонецФункции
+
+// Только для внутреннего использования.
+Функция ЗаголовокОшибкиПолученияДанных(Операция) Экспорт
+
+ Если Операция = "Подписание" Тогда
+ Возврат НСтр("ru = 'При получении данных для подписания возникла ошибка:'");
+
+ ИначеЕсли Операция = "Шифрование" Тогда
+ Возврат НСтр("ru = 'При получении данных для шифрования возникла ошибка:'");
+ Иначе
+ Возврат НСтр("ru = 'При получении данных для расшифровки возникла ошибка:'");
+ КонецЕсли;
+
+КонецФункции
+
// Только для внутреннего использования.
Функция ПустыеДанныеПодписи(ДанныеПодписи, ОписаниеОшибки) Экспорт
@@ -423,29 +398,13 @@
////////////////////////////////////////////////////////////////////////////////
// Вспомогательные процедуры и функции.
-// Для функции МенеджерКриптографии.
-Процедура ДобавитьОшибку(Ошибки, Программа, Описание, КАдминистратору, Инструкция = Ложь, ИзИсключения = Ложь, НеУказанПуть = Ложь)
-
- СвойстваОшибки = Новый Структура;
- СвойстваОшибки.Вставить("Программа", Программа);
- СвойстваОшибки.Вставить("Описание", Описание);
- СвойстваОшибки.Вставить("КАдминистратору", КАдминистратору);
- СвойстваОшибки.Вставить("Инструкция", Инструкция);
- СвойстваОшибки.Вставить("ИзИсключения", ИзИсключения);
- СвойстваОшибки.Вставить("НеУказанПуть", НеУказанПуть);
- СвойстваОшибки.Вставить("НастройкаПрограмм", Истина);
-
- Ошибки.Добавить(СвойстваОшибки);
-
-КонецПроцедуры
-
// Для функции ПолучитьСоответствиеФайловИПодписей.
Функция НайтиИменаФайловПодписей(ИмяФайлаДанных, ИменаФайловПодписей)
ИменаПодписей = Новый Массив;
- Файл = Новый Файл(ИмяФайлаДанных);
- ИмяБезРасширения = Файл.ИмяБезРасширения;
+ СтруктураИмени = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ИмяФайлаДанных);
+ ИмяБезРасширения = СтруктураИмени.ИмяБезРасширения;
Для Каждого ИмяФайлаПодписи Из ИменаФайловПодписей Цикл
Если Найти(ИмяФайлаПодписи, ИмяБезРасширения) > 0 Тогда
diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйПовтИсп/Module.bsl
index 9fb892527..35493e023 100644
--- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйПовтИсп/Module.bsl
+++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйПовтИсп/Module.bsl
@@ -36,11 +36,13 @@
// 1. Подсистема Контактная информация - российский адрес.
// 2. Подсистема Адресный классификатор - код региона по наименованию.
// 3. Подсистема Печать - стандартная печатная форма для заявления на выпуск сертификата.
+ // 4. Подсистема Работа с контрагентами - проверка ИНН, КПП, ОГРН, лицевого счета по БИК, СНИЛС.
ОбщиеНастройки.Вставить("ЗаявлениеНаВыпускСертификатаДоступно",
ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация")
И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор")
- И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать"));
+ И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать")
+ И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСКонтрагентами"));
Запрос = Новый Запрос;
Запрос.Текст =
diff --git a/SSL/src/CommonPictures/НезавершившаясяПроверка/Picture.gif b/SSL/src/CommonPictures/НезавершившаясяПроверка/Picture.gif
new file mode 100644
index 000000000..19c96a207
Binary files /dev/null and b/SSL/src/CommonPictures/НезавершившаясяПроверка/Picture.gif differ
diff --git a/SSL/src/CommonPictures/НезавершившаясяПроверка/НезавершившаясяПроверка.mdo b/SSL/src/CommonPictures/НезавершившаясяПроверка/НезавершившаясяПроверка.mdo
new file mode 100644
index 000000000..6aa0fefd5
--- /dev/null
+++ b/SSL/src/CommonPictures/НезавершившаясяПроверка/НезавершившаясяПроверка.mdo
@@ -0,0 +1,8 @@
+
+
+ НезавершившаясяПроверка
+
+ ru
+ Незавершившаяся проверка
+
+
diff --git a/SSL/src/CommonPictures/НекорректныйКонтрагент/Picture.png b/SSL/src/CommonPictures/НекорректныйКонтрагент/Picture.png
new file mode 100644
index 000000000..e442a4ebf
Binary files /dev/null and b/SSL/src/CommonPictures/НекорректныйКонтрагент/Picture.png differ
diff --git a/SSL/src/CommonPictures/НекорректныйКонтрагент/НекорректныйКонтрагент.mdo b/SSL/src/CommonPictures/НекорректныйКонтрагент/НекорректныйКонтрагент.mdo
new file mode 100644
index 000000000..ae36d18bf
--- /dev/null
+++ b/SSL/src/CommonPictures/НекорректныйКонтрагент/НекорректныйКонтрагент.mdo
@@ -0,0 +1,8 @@
+
+
+ НекорректныйКонтрагент
+
+ ru
+ Некорректный контрагент
+
+
diff --git a/SSL/src/CommonPictures/ПиктограммыНастроекОтчета/Picture.png b/SSL/src/CommonPictures/ПиктограммыНастроекОтчета/Picture.png
new file mode 100644
index 000000000..2878b8e98
Binary files /dev/null and b/SSL/src/CommonPictures/ПиктограммыНастроекОтчета/Picture.png differ
diff --git a/SSL/src/CommonPictures/ПиктограммыНастроекОтчета/ПиктограммыНастроекОтчета.mdo b/SSL/src/CommonPictures/ПиктограммыНастроекОтчета/ПиктограммыНастроекОтчета.mdo
new file mode 100644
index 000000000..1928d6ba5
--- /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
similarity index 100%
rename from SSL/src/CommonPictures/УдалитьПользовательскийМакет/Picture.png
rename to SSL/src/CommonPictures/ПользовательскийМакетУдалить/Picture.png
diff --git a/SSL/src/CommonPictures/УдалитьПользовательскийМакет/УдалитьПользовательскийМакет.mdo b/SSL/src/CommonPictures/ПользовательскийМакетУдалить/ПользовательскийМакетУдалить.mdo
similarity index 62%
rename from SSL/src/CommonPictures/УдалитьПользовательскийМакет/УдалитьПользовательскийМакет.mdo
rename to SSL/src/CommonPictures/ПользовательскийМакетУдалить/ПользовательскийМакетУдалить.mdo
index 17c866aca..321999f30 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 99398611f..000000000
Binary files a/SSL/src/CommonPictures/ПустоеСостояние/Picture.png and /dev/null differ
diff --git a/SSL/src/CommonPictures/ПустоеСостояние/ПустоеСостояние.mdo b/SSL/src/CommonPictures/ПустоеСостояние/ПустоеСостояние.mdo
deleted file mode 100644
index 59236891e..000000000
--- a/SSL/src/CommonPictures/ПустоеСостояние/ПустоеСостояние.mdo
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
- ПустоеСостояние
-
- ru
- Пустое состояние
-
-
diff --git a/SSL/src/CommonTemplates/ИнструкцияКакВыполнитьУстановкуОбновленияВручную/ru.html b/SSL/src/CommonTemplates/ИнструкцияКакВыполнитьУстановкуОбновленияВручную/ru.html
index 43ffd1d30..061baa131 100644
--- a/SSL/src/CommonTemplates/ИнструкцияКакВыполнитьУстановкуОбновленияВручную/ru.html
+++ b/SSL/src/CommonTemplates/ИнструкцияКакВыполнитьУстановкуОбновленияВручную/ru.html
@@ -1,4 +1,4 @@
-
+
Установка обновления конфигурации
Для установки обновления конфигурации необходимо выполнить следующие действия:
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/Template.htmldoc b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/Template.htmldoc
new file mode 100644
index 000000000..1621f1d23
--- /dev/null
+++ b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/Template.htmldoc
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/1 - копия.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/1 - копия.png
new file mode 100644
index 000000000..20cc8aa50
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/1 - копия.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/1.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/1.png
new file mode 100644
index 000000000..f9523721e
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/1.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/11.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/11.png
new file mode 100644
index 000000000..fead2c179
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/11.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/2.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/2.png
new file mode 100644
index 000000000..1d7d8f8a8
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/2.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/21.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/21.png
new file mode 100644
index 000000000..35ce58d93
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/21.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/22.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/22.png
new file mode 100644
index 000000000..042cfc01a
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/22.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Документ (2).png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Документ (2).png
new file mode 100644
index 000000000..e6c49728b
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Документ (2).png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Документ.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Документ.png
new file mode 100644
index 000000000..7c7ead45a
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Документ.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Журнал.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Журнал.png
new file mode 100644
index 000000000..4cc8655fa
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Журнал.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Контрагент.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Контрагент.png
new file mode 100644
index 000000000..80e508438
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Контрагент.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Контрагент1.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Контрагент1.png
new file mode 100644
index 000000000..f2abaa8b9
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Контрагент1.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Контрагент2.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Контрагент2.png
new file mode 100644
index 000000000..f2abaa8b9
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Контрагент2.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Контрагент3.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Контрагент3.png
new file mode 100644
index 000000000..f2abaa8b9
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Контрагент3.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Контрагент4.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Контрагент4.png
new file mode 100644
index 000000000..0f4a95f91
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Контрагент4.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Настройки.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Настройки.png
new file mode 100644
index 000000000..130208550
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Настройки.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Отчет.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Отчет.png
new file mode 100644
index 000000000..9d4c236f5
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Отчет.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Предложение на подключение (админ).png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Предложение на подключение (админ).png
new file mode 100644
index 000000000..94b3c3841
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Предложение на подключение (админ).png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Предложение на подключение (не админ).png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Предложение на подключение (не админ).png
new file mode 100644
index 000000000..04562c70f
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Предложение на подключение (не админ).png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Реализация.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Реализация.png
new file mode 100644
index 000000000..3fce69e7e
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Реализация.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Реализация1.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Реализация1.png
new file mode 100644
index 000000000..1b5b07732
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Реализация1.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Реализация2.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Реализация2.png
new file mode 100644
index 000000000..137acb804
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Реализация2.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Рег задание.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Рег задание.png
new file mode 100644
index 000000000..595b23152
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Рег задание.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Список документов.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Список документов.png
new file mode 100644
index 000000000..1314734a7
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Список документов.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Список контрагентов.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Список контрагентов.png
new file mode 100644
index 000000000..9796160f6
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Список контрагентов.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Список.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Список.png
new file mode 100644
index 000000000..dc42d11f0
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Список.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Форма списка контрагентов1.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Форма списка контрагентов1.png
new file mode 100644
index 000000000..144f376e3
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Форма списка контрагентов1.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Форма списка контрагентов11.png b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Форма списка контрагентов11.png
new file mode 100644
index 000000000..945faa8f5
Binary files /dev/null and b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/_files/Форма списка контрагентов11.png differ
diff --git a/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/ru.html b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/ru.html
new file mode 100644
index 000000000..6a67379d1
--- /dev/null
+++ b/SSL/src/CommonTemplates/ИнструкцияПоПроверкеКонтрагентов/ru.html
@@ -0,0 +1,26 @@
+
+
О сервисе проверки контрагентов ФНС
+
В программе реализована проверка контрагентов через Интернет посредством специализированного веб-сервиса ФНС. Сервис "Проверка реквизитов контрагентов" ФНС позволяет в онлайн-режиме проверять существование контрагента по его ключевым реквизитам - ИНН и КПП.
+
Проверка контрагентов осуществляется по ЕГРН (Единому государственному реестру налогоплательщиков), результатом проверки может являться один из следующих статусов:
+
+
Контрагент есть в базе ФНС
+
-
+
означает, что налогоплательщик зарегистрирован в ЕГРН и имеет статус действующего в интервале ± 6 дней от даты запроса
Не действует или изменен КПП
+
-
+
означает, что налогоплательщик зарегистрирован в ЕГРН, но не имеет статус действующего в интервале ± 6 дней от даты запроса. Такой ответ можно интерпретировать следующим образом: либо контрагент с указанной комбинацией ИНН и КПП прекратил деятельность, либо указанный КПП был изменен, то есть, ранее комбинация ИНН и КПП была действительной, но теперь она недействительна
КПП не соответствует данным базы ФНС
+
-
+
означает, что КПП налогоплательщика не соотвествует тому ИНН, который был указан в запросе. Такое сообщение означает, что такой комбинации ИНН и КПП в ЕГРН нет и никогда не было
Контрагент отсутствует в базе ФНС
+
-
+
означает, что налогоплательщик с указанным ИНН не зарегистрирован в ЕГРН
+
Проверка производится при вводе нового контрагента и изменении реквизитов существующего. Статус проверки отображается в карточке контрагента, формах списка и выбора справочника контрагентов. Результат проверки контрагента выводится в карточке в явном виде.
+
+
При отрицательном результате проверки в формах списка и выбора справочника ИНН и КПП контрагента окрашивается в красный цвет.
+
+
Если от ФНС получен ответ, что контрагент прекратил деятельность, то в форме списка контрагент будут выделен серым цветом.
+
Если контрагент уже был проверен ранее, то при открытии карточки контрагента повторная проверка не выполняется, а актуализация результата проверки контрагента выполняется регламентным заданием с периодичностью раз в неделю в фоновом режиме. В режиме сервиса «1С:Предприятие через Интернет» проверка включена по умолчанию и не требует дополнительных настроек.
+
В отчетах проверка контрагентов выполняется в режиме реального времени, результат проверки выводится на специальной панели. Если в отчетах есть строки с документами от контрагентов, которые не были действующими на даты документов +-6 дней, то такие строки в отчете выделяются красным фоном, а в панели проверки появляется кнопка для отбора таких строк.
+
+
В документах в зависимости от результатов проверки контрагент и счет-фактура выделяются красным или зеленым фоном. Проверка контрагентов в документах выполняется в режиме реального времени.
+
+
Проверка производится при открытии документа, а так же при изменении контрагента, даты или при вводе счета-фактуры. Документ выделяется красным фоном в списке, если на дату документа +- 6 дней контрагент не являлся действующим.
Предназначена для управления автоматическим извлечением текстов.
Если один или несколько рабочих процессов сервера работают под Linux, а часть или все клиенты подключаются с помощью веб-клиента, то в информационной базе могут быть добавлены файлы, текст из которых не извлечен, и соответственно эти файлы не могут быть найдены полнотекстовым поиском по содержимому. В этом случае на одном из клиентских компьютеров, работающих под управлением ОС Microsoft Windows, нужно запустить тонкий или толстый клиент, и на нем выполнить команду Управление полнотекстовым поиском - Запустить извлечение текстов в разделе Администрирование - Поддержка и обслуживание - Регламентные операции. Также можно выполнить команду Автоматическое извлечение текстов панели действий раздела Органайзер.
Содержит список пользователей, работающих в данный момент времени в программе.
В этом списке отображаются не только пользователи, работающие с информационной базой при помощи приложений "Тонкий клиент", "Веб-клиент" или "Конфигуратор", но и такие пользователи как "COM-соединение", "WS-соединение", "Фоновое задание" и т.п.
Список выводится по соответствующей команде раздела Администрирование - Поддержка и обслуживание.
diff --git a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Form.form b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Form.form
index 6752a7544..6744b5e3d 100644
--- a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Form.form
+++ b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Form.form
@@ -720,6 +720,23 @@
true
+
+ УдалениеПомеченныхОбъектов
+
+ ru
+ Удаление помеченных объектов
+
+ 7
+
+ Boolean
+
+
+ true
+
+
+ true
+
+ ЗавершитьСеансыИПерезапуститьПрограмму
@@ -782,6 +799,12 @@
AutoAuto
+
+ УдалениеПомеченныхОбъектов
+
+ Boolean
+
+
diff --git a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Module.bsl b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Module.bsl
index 72e3d4437..922390401 100644
--- a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Module.bsl
+++ b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Module.bsl
@@ -7,7 +7,13 @@
Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа.
Возврат;
КонецЕсли;
-
+
+ УдалениеПомеченныхОбъектов = Параметры.УдалениеПомеченныхОбъектов;
+ Если УдалениеПомеченныхОбъектов Тогда
+ Заголовок = НСтр("ru = 'Не удалось выполнить удаление помеченных объектов'");
+ Элементы.ТекстСообщенияОбОшибке.Заголовок = НСтр("ru = 'Невозможно выполнить удаление помеченных объектов, т.к. в программе работают другие пользователи:'");
+ КонецЕсли;
+
АктивныеПользователиШаблон = НСтр("ru = 'Активные пользователи (%1)'");
КоличествоАктивныхСеансов = СоединенияИБ.КоличествоСеансовИнформационнойБазы();
@@ -54,6 +60,7 @@
// Задание параметров блокировки ИБ.
ОбновитьКоличествоАктивныхСеансов();
УстановитьБлокировкуФайловойБазы();
+ СоединенияИБКлиент.УстановитьОбработчикиОжиданияЗавершенияРаботыПользователей(Истина);
ПодключитьОбработчикОжидания("ТаймАутЗавершенияРаботыПользователей", 60);
КонецПроцедуры
@@ -142,9 +149,15 @@
Процедура УстановитьБлокировкуФайловойБазы()
Объект.ВременноЗапретитьРаботуПользователей = Истина;
- Объект.НачалоДействияБлокировки = ТекущаяДатаСеанса() + 2*60;
- Объект.ОкончаниеДействияБлокировки = Объект.НачалоДействияБлокировки + 5*60;
- Объект.СообщениеДляПользователей = НСтр("ru = 'Программа заблокирована для выполнения обновления.'");
+ Если УдалениеПомеченныхОбъектов Тогда
+ Объект.НачалоДействияБлокировки = ТекущаяДатаСеанса() + 2*60;
+ Объект.ОкончаниеДействияБлокировки = Объект.НачалоДействияБлокировки + 60;
+ Объект.СообщениеДляПользователей = НСтр("ru = 'Программа заблокирована для удаления помеченных объектов.'");
+ Иначе
+ Объект.НачалоДействияБлокировки = ТекущаяДатаСеанса() + 2*60;
+ Объект.ОкончаниеДействияБлокировки = Объект.НачалоДействияБлокировки + 5*60;
+ Объект.СообщениеДляПользователей = НСтр("ru = 'Программа заблокирована для выполнения обновления.'");
+ КонецЕсли;
Попытка
РеквизитФормыВЗначение("Объект").ВыполнитьУстановку();
diff --git a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/Форма/Form.form b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/Форма/Form.form
index 6a0a4ecab..e40f12b26 100644
--- a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/Форма/Form.form
+++ b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/Форма/Form.form
@@ -395,10 +395,7 @@
truetrue
-
- true
- Role.ПолныеПрава
-
+ trueОбъект.КодДляРазблокировки
@@ -505,10 +502,7 @@
truetrue
-
- true
- Role.ПолныеПрава
-
+ trueОбъект.ЗапретитьРаботуРегламентныхЗаданий
diff --git a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/Форма/Module.bsl
index df71ff1c4..6a70d80f7 100644
--- a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/Форма/Module.bsl
+++ b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/Форма/Module.bsl
@@ -20,7 +20,7 @@
Элементы.ГруппаЗапретитьРаботуРегламентныхЗаданий.Видимость = Ложь;
КонецЕсли;
- Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
+ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Или Не Пользователи.РолиДоступны("ПолныеПрава") Тогда
Элементы.КодДляРазблокировки.Видимость = Ложь;
КонецЕсли;
diff --git a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Help/ru.html b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Help/ru.html
index 590f111ff..b3391c528 100644
--- a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Help/ru.html
+++ b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Для администратора в программе предусмотрена возможность завершать работу всех активных пользователей (включая пользователя, инициировавшего блокировку) и блокировать вход в программу на определенный период времени.
Такая возможность востребована для проведения профилактических или срочных работ в программе. Обычно такие работы проводят в ночные часы, чтобы не затруднять работу в программе других пользователей. Однако бывают различные внеплановые ситуации. Например, необходимо провести обновление версии программы, восстановление программы после сбоя электроснабжения, резервное копирование информационной базы, или главному бухгалтеру необходимо срочно рассчитать сложный отчет. Большинство этих работ не могут быть проведены, если пользователи продолжают работать в программе.
При работе в клиент-серверном режиме имеется возможность блокировки работы регламентных заданий.
Предназначена для выбора адреса по почтовому индексу.
Для поиска адреса по индексу необходимо, чтобы по соответствующему региону был загружен адресный классификатор.
Открывается из окна ввода адреса по команде Еще- Заполнить по почтовому индексу после ввода почтового индекса.
diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Module.bsl b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Module.bsl
index 8d5756a89..9da363c77 100644
--- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Module.bsl
+++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборАдресаПоУровню/Module.bsl
@@ -30,7 +30,7 @@
Параметры.Свойство("Уровень", Уровень);
Параметры.Свойство("ФорматАдреса", ФорматАдреса);
- Параметры.Свойство("СкрыватьНеактуальные", СкрыватьНеактуальные);
+ Параметры.Свойство("СкрыватьНеактуальные", СкрыватьНеактуальные);
Если ПустаяСтрока("ФорматАдреса") Тогда
ФорматАдреса = "ФИАС";
@@ -38,16 +38,17 @@
ПараметрыПоиска = Новый Структура;
ПараметрыПоиска.Свойство("ФорматАдреса", ФорматАдреса);
- ПараметрыПоиска.Свойство("СкрыватьНеактуальные", СкрыватьНеактуальные);
+ ПараметрыПоиска.Свойство("СкрыватьНеактуальные", СкрыватьНеактуальные);
ДанныеКлассификатора = УправлениеКонтактнойИнформациейСлужебный.АдресаДляИнтерактивногоВыбора(Родитель, Уровень, ПараметрыПоиска);
Если ДанныеКлассификатора.Отказ Тогда
// Сервис на обслуживании
- КраткоеПредставлениеОшибки = ДанныеКлассификатора.КраткоеПредставлениеОшибки;
+ КраткоеПредставлениеОшибки = НСтр("ru = 'Автоподбор и проверка адреса недоступны:'") + Символы.ПС + ДанныеКлассификатора.КраткоеПредставлениеОшибки;
Возврат;
ИначеЕсли ДанныеКлассификатора.Данные.Количество() = 0 Тогда
+ КраткоеПредставлениеОшибки = НСтр("ru = 'Поле ""'") + Параметры.Представление + НСтр("ru = '"" не содержит адресных сведений для выбора.'");;
// Нет данных, функционал выбора не применим.
КонецЕсли;
diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Form.form b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Form.form
index 22e711a52..7079817bc 100644
--- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Form.form
+++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Form.form
@@ -1340,6 +1340,9 @@
truetruetrue
+ None
+ None
+ Nonetrue
@@ -1909,6 +1912,26 @@
true
+
+ НомерПорции
+
+ ru
+ Номер порции
+
+ 18
+
+ Number
+
+ 10
+
+
+
+ true
+
+
+ true
+
+ СледующаяПорция
diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Help/ru.html b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Help/ru.html
index 6db6256f8..8fdee7bfc 100644
--- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Help/ru.html
+++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для выбора адреса по почтовому индексу.
Для поиска адреса по индексу необходимо, чтобы по соответствующему региону был загружен адресный классификатор.
Открывается из окна ввода адреса по команде Еще- Заполнить по почтовому индексу после ввода почтового индекса.
diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Module.bsl b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Module.bsl
index b588e47a5..038babb12 100644
--- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Module.bsl
+++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВыборУлицы/Module.bsl
@@ -26,10 +26,11 @@
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;
+ НомерПорции = Неопределено;
Параметры.Свойство("Родитель", Родитель);
Параметры.Свойство("Уровень", Уровень);
- Параметры.Свойство("СкрыватьНеактуальныеАдреса", СкрыватьНеактуальныеАдреса);
+ Параметры.Свойство("СкрыватьНеактуальныеАдреса", СкрыватьНеактуальныеАдреса);
Параметры.Свойство("ФорматАдреса", ФорматАдреса);
Если ПустаяСтрока(ФорматАдреса) Тогда
@@ -37,9 +38,10 @@
КонецЕсли;
ПараметрыПоиска = Новый Структура;
- ПараметрыПоиска.Вставить("СкрыватьНеактуальные", СкрыватьНеактуальныеАдреса);
+ ПараметрыПоиска.Вставить("СкрыватьНеактуальные", СкрыватьНеактуальныеАдреса);
ПараметрыПоиска.Вставить("ФорматАдреса", ФорматАдреса);
ПараметрыПоиска.Вставить("Сортировка", "ASC");
+ ПараметрыПоиска.Вставить("ПерваяЗапись", НомерПорции);
// Порционный режим, если необходимо.
ПолучениеДанныхСИспользованиемВебСервиса = УправлениеКонтактнойИнформациейСлужебный.КлассификаторДоступенЧерезВебСервис();
@@ -58,30 +60,6 @@
КонецЕсли;
ПараметрыПоиска.Вставить("РазмерПорции", РазмерПорции);
- Если ЗначениеЗаполнено(Параметры.ПредставлениеУлицы) И ПолучениеДанныхСИспользованиемВебСервиса Тогда
- НаименованиеСокращение = УправлениеКонтактнойИнформациейКлиентСервер.НаименованиеСокращение(Параметры.ПредставлениеУлицы);
- Идентификатор = ПолучитьИдентификаторЗаписи(НаименованиеСокращение.Наименование);
-
- ПараметрыПоиска = Новый Структура;
- ПараметрыПоиска.Вставить("СкрыватьНеактуальные", СкрыватьНеактуальныеАдреса);
- ПараметрыПоиска.Вставить("ФорматАдреса", ФорматАдреса);
- ПараметрыПоиска.Вставить("Сортировка", "DESC");
- ПараметрыПоиска.Вставить("ПерваяЗапись", Идентификатор);
- ПараметрыПоиска.Вставить("РазмерПорции", 1);
-
- ДанныеКлассификатора = УправлениеКонтактнойИнформациейСлужебный.АдресаДляИнтерактивногоВыбора(Родитель, Уровень, ПараметрыПоиска);
- Если ДанныеКлассификатора.Данные.Количество() > 0 Тогда
- Идентификатор = ДанныеКлассификатора.Данные[0].Идентификатор;
- ПараметрыПоиска.Вставить("ПерваяЗапись", Идентификатор);
- Иначе
- ПараметрыПоиска.Вставить("ПерваяЗапись", Неопределено);
- КонецЕсли;
- ПараметрыПоиска.Вставить("Сортировка", "ASC");
- ПараметрыПоиска.Вставить("РазмерПорции", РазмерПорции);
- Иначе
- ПараметрыПоиска.Вставить("ПерваяЗапись", Неопределено);
- КонецЕсли;
-
ДанныеКлассификатора = УправлениеКонтактнойИнформациейСлужебный.АдресаДляИнтерактивногоВыбора(Родитель, Уровень, ПараметрыПоиска);
ДанныеКлассификатораДополнительныеТерритории = УправлениеКонтактнойИнформациейСлужебный.АдресаДляИнтерактивногоВыбора(Родитель, 90, ПараметрыПоиска);
@@ -92,7 +70,6 @@
Если ДанныеКлассификатора.Данные.Количество() = 0 Тогда
Элементы.УлицыИНаселенныеПункты.Видимость = Ложь;
Элементы.Страницы.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет;
- Элементы.ВариантыДополнительныхТерриторийВыбрать.АктивизироватьПоУмолчанию = Истина;
КонецЕсли;
Если Элементы.ДополнительныеТерритории.Видимость = Ложь И Элементы.УлицыИНаселенныеПункты.Видимость = Ложь Тогда
КраткоеПредставлениеОшибки = НСтр("ru = 'Данные о улицах, населенных пунктах и дополнительных территориях для введенного адреса отсутствуют'");
@@ -100,7 +77,6 @@
КонецЕсли;
Элементы.ВыбратьУлицу.КнопкаПоУмолчанию = Истина;
-
ВариантыАдреса.Загрузить(ДанныеКлассификатора.Данные);
ВариантыДополнительныхТерриторий.Загрузить(ДанныеКлассификатораДополнительныеТерритории.Данные);
ОчищатьПодчиненные = Ложь;
@@ -124,7 +100,17 @@
&НаКлиенте
Процедура НайтиАвтоПодбор(Элемент, Текст, ДанныеВыбора, Параметры, Ожидание, СтандартнаяОбработка)
- ЗаполнитьПорциюВариантовПоПервойБукве(Текст);
+
+ Если Ожидание = 0 Тогда
+ // Формирование списка быстрого выбора, стандартную обработку не надо трогать.
+ Возврат;
+ КонецЕсли;
+
+ Если НЕ ПустаяСтрока(Текст) Тогда
+ ЗаполнитьПорциюВариантовПоПервойБукве(Текст);
+ Иначе
+ ПерейтиВНачалоСписка();
+ КонецЕсли;
КонецПроцедуры
@@ -260,7 +246,7 @@
&НаКлиенте
Процедура ВариантыАдресаПриАктивизацииСтроки(Элемент)
- Если ЕстьПодчиненныеЭлементы(Элемент.ТекущиеДанные.Идентификатор) Тогда
+ Если Элемент.ТекущиеДанные <> Неопределено И ЕстьПодчиненныеЭлементы(Элемент.ТекущиеДанные.Идентификатор) Тогда
Элементы.ДополнительныйЭлемент.Доступность = Истина;
Элементы.ПодчиненныйЭлемент.Доступность = Истина;
Иначе
@@ -279,7 +265,7 @@
Функция ЕстьПодчиненныеЭлементы(Идентификатор)
ПараметрыПоиска = Новый Структура;
ПараметрыПоиска.Свойство("ФорматАдреса", "ФИАС");
- ПараметрыПоиска.Свойство("СкрыватьНеактуальные", Истина);
+ ПараметрыПоиска.Свойство("СкрыватьНеактуальные", Истина);
ДанныеКлассификатора = УправлениеКонтактнойИнформациейСлужебный.АдресаДляИнтерактивногоВыбора(Идентификатор, 90, ПараметрыПоиска);
Если ДанныеКлассификатора.Данные.Количество() > 0 Тогда
@@ -301,14 +287,8 @@
Возврат;
КонецЕсли;
- ПараметрыПоиска = Новый Структура;
- ПараметрыПоиска.Вставить("СкрыватьНеактуальные", Ложь);
- ПараметрыПоиска.Вставить("ФорматАдреса", ФорматАдреса);
- ПараметрыПоиска.Вставить("РазмерПорции", РазмерПорции);
- ПараметрыПоиска.Вставить("ПерваяЗапись", Неопределено);
- ПараметрыПоиска.Вставить("Сортировка", "ASC");
-
- ЗаполнитьПорциюВариантов(ПараметрыПоиска);
+ ПерейтиВНачалоСписка();
+
КонецПроцедуры
&НаКлиенте
@@ -319,11 +299,17 @@
Возврат;
КонецЕсли;
+ Если НомерПорции > 0 Тогда
+ НомерПорции = НомерПорции - 1;
+ Иначе
+ НомерПорции = Неопределено;
+ КонецЕсли;
+
ПараметрыПоиска = Новый Структура;
ПараметрыПоиска.Вставить("СкрыватьНеактуальные", Ложь);
ПараметрыПоиска.Вставить("ФорматАдреса", ФорматАдреса);
ПараметрыПоиска.Вставить("РазмерПорции", РазмерПорции);
- ПараметрыПоиска.Вставить("ПерваяЗапись", ВариантыАдреса[0].Идентификатор);
+ ПараметрыПоиска.Вставить("ПерваяЗапись", НомерПорции);
ПараметрыПоиска.Вставить("Сортировка", "DESC");
ЗаполнитьПорциюВариантов(ПараметрыПоиска);
@@ -336,12 +322,18 @@
Если ЧислоЗаписей = 0 Или РазмерПорции = Неопределено Тогда
Возврат;
КонецЕсли;
-
+
+ Если ЗначениеЗаполнено(НомерПорции) Тогда
+ НомерПорции = НомерПорции + 1;
+ Иначе
+ НомерПорции = 1;
+ КонецЕсли;
+
ПараметрыПоиска = Новый Структура;
ПараметрыПоиска.Вставить("СкрыватьНеактуальные", Ложь);
ПараметрыПоиска.Вставить("ФорматАдреса", ФорматАдреса);
ПараметрыПоиска.Вставить("РазмерПорции", РазмерПорции);
- ПараметрыПоиска.Вставить("ПерваяЗапись", ВариантыАдреса[ЧислоЗаписей - 1].Идентификатор);
+ ПараметрыПоиска.Вставить("ПерваяЗапись", НомерПорции);
ПараметрыПоиска.Вставить("Сортировка", "ASC");
ЗаполнитьПорциюВариантов(ПараметрыПоиска);
@@ -413,6 +405,21 @@
КонецПроцедуры
+&НаКлиенте
+Процедура ПерейтиВНачалоСписка()
+
+ ПараметрыПоиска = Новый Структура;
+ ПараметрыПоиска.Вставить("СкрыватьНеактуальные", Ложь);
+ ПараметрыПоиска.Вставить("ФорматАдреса", ФорматАдреса);
+ ПараметрыПоиска.Вставить("РазмерПорции", РазмерПорции);
+ ПараметрыПоиска.Вставить("ПерваяЗапись", Неопределено);
+ ПараметрыПоиска.Вставить("Сортировка", "ASC");
+
+ ЗаполнитьПорциюВариантов(ПараметрыПоиска);
+
+КонецПроцедуры
+
+
&НаКлиенте
Процедура ПроизвестиВыборЗавершениеВопроса(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
@@ -513,62 +520,38 @@
КонецЕсли;
КонецПроцедуры
-
-&НаСервере
-Функция ПолучитьИдентификаторЗаписи(Текст)
-
- // Первый ID по букве
- ДополнительныеПараметры = Новый Структура;
- ДополнительныеПараметры.Вставить("ФорматАдреса", ФорматАдреса);
- ДополнительныеПараметры.Вставить("СкрыватьНеактуальные", Ложь);
- ДополнительныеПараметры.Вставить("РазмерПорции", 1);
-
- ДанныеКлассификатора = УправлениеКонтактнойИнформациейСлужебный.СписокАвтоподбораУлицы(Родитель, Текст, ДополнительныеПараметры);
- Если ДанныеКлассификатора.Отказ Тогда
- // Сервис поломался
- Возврат Неопределено;
- КонецЕсли;
-
- ДанныеВыбора = ДанныеКлассификатора.Данные;
- Если ДанныеВыбора.Количество() = 0 Тогда
- // Нет данных
- Возврат Неопределено;
- КонецЕсли;
-
- Возврат ДанныеВыбора[0].Значение.Значение.Идентификатор;
-
-КонецФункции
-
&НаСервере
Процедура ЗаполнитьПорциюВариантовПоПервойБукве(Текст)
+ ДанныеВыбора = Новый СписокЗначений;
+
+ Если СтрДлина(Текст) < 1 Или Не ЗначениеЗаполнено(Родитель)Тогда
+ // Нет вариантов, список пуст, стандартную обработку не надо трогать.
+ Возврат;
+ КонецЕсли;
- // Первый ID по букве
ДополнительныеПараметры = Новый Структура;
- ДополнительныеПараметры.Вставить("ФорматАдреса", ФорматАдреса);
- ДополнительныеПараметры.Вставить("СкрыватьНеактуальные", Ложь);
- ДополнительныеПараметры.Вставить("РазмерПорции", 1);
+ ДополнительныеПараметры.Вставить("ФорматАдреса", "ФИАС");
+ ДополнительныеПараметры.Вставить("СкрыватьНеактуальные", Ложь);
ДанныеКлассификатора = УправлениеКонтактнойИнформациейСлужебный.СписокАвтоподбораУлицы(Родитель, Текст, ДополнительныеПараметры);
Если ДанныеКлассификатора.Отказ Тогда
- // Сервис поломался
Возврат;
КонецЕсли;
ДанныеВыбора = ДанныеКлассификатора.Данные;
- Если ДанныеВыбора.Количество() = 0 Тогда
- // Нет данных
- Возврат;
+
+ // Стандартную обработку отключаем, только если есть наши варианты.
+ Если ДанныеВыбора.Количество() > 0 Тогда
+ СтандартнаяОбработка = Ложь;
+ ВариантыАдреса.Очистить();
+ Для каждого Адрес Из ДанныеВыбора Цикл
+ СтрокаАдреса = ВариантыАдреса.Добавить();
+ СтрокаАдреса.Представление = Адрес.Значение.Значение.Представление;
+ СтрокаАдреса.Идентификатор = Адрес.Значение.Значение.Идентификатор;
+ СтрокаАдреса.Неактуален = Адрес.Пометка;
+ КонецЦикла;
КонецЕсли;
-
- ПараметрыПоиска = Новый Структура;
- ПараметрыПоиска.Вставить("СкрыватьНеактуальные", Ложь);
- ПараметрыПоиска.Вставить("ФорматАдреса", ФорматАдреса);
- ПараметрыПоиска.Вставить("РазмерПорции", РазмерПорции);
- ПараметрыПоиска.Вставить("ПерваяЗапись", ДанныеВыбора[0].Значение.Значение.Идентификатор);
- ПараметрыПоиска.Вставить("Сортировка", "ASC");
-
- ЗаполнитьПорциюВариантов(ПараметрыПоиска);
-
+
КонецПроцедуры
&НаСервере
diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Help/ru.html b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Help/ru.html
index 10d6292ca..3bdf9730e 100644
--- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Help/ru.html
+++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для ввода населенного пункта по детальному шаблону.
Открывается из шаблона ввода адреса в поле Город, населенный пункт по кнопке Выбрать.
В поле Регион необходимо ввести наименование субъекта Российской Федерации, к которому относится населенный пункт. При вводе поля Регион, если адресный классификатор для этого субъекта Российской Федерации не заполнен и у текущего пользователя есть права на загрузку, будет выведено предложение загрузить классификатор. Также, при загруженном классификаторе, можно выбрать часть адреса из списка, нажав Выбрать.
diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Module.bsl b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Module.bsl
index 58933749c..2d9996093 100644
--- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Module.bsl
+++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Module.bsl
@@ -197,7 +197,8 @@
// Текущий элемент
ПараметрыОткрытия.Вставить("Идентификатор", ЧастьАдреса.Идентификатор);
- ПараметрыОткрытия.Вставить("Представление", ЧастьАдреса.Представление);
+ Представление = ?(ПустаяСтрока(ЧастьАдреса.Представление),ЧастьАдреса.Заголовок, ЧастьАдреса.Представление);
+ ПараметрыОткрытия.Вставить("Представление", Представление);
ОткрытьФорму("Обработка.ВводКонтактнойИнформации.Форма.ВыборАдресаПоУровню", ПараметрыОткрытия, Элемент);
КонецПроцедуры
@@ -250,6 +251,9 @@
Если СервисКлассификатораНедоступен Тогда
СтандартнаяОбработка = Ложь;
+ Если НЕ ПустаяСтрока(ВыбранноеЗначение.КраткоеПредставлениеОшибки) Тогда
+ ПоказатьПредупреждение(, ВыбранноеЗначение.КраткоеПредставлениеОшибки);
+ КонецЕсли;
Иначе
НеЗагружатьАдресныйКлассификатор = ПараметрыПриложения.Получить("АдресныйКлассификатор.НеЗагружатьКлассификатор");
Если НеЗагружатьАдресныйКлассификатор = Неопределено ИЛИ НеЗагружатьАдресныйКлассификатор = Ложь Тогда
@@ -270,11 +274,12 @@
// Преобразуем выбранное в строку.
ВыбранноеЗначение = УстановитьЗначениеЧастиАдреса(Элемент, ВыбранноеЗначение);
АдресИзменен = Истина;
+ ОбновитьОтображениеДанных();
ИначеЕсли ТипВыбранного = Тип("Строка") Тогда
УстановитьЗначениеЧастиАдреса(Элемент, ВыбранноеЗначение);
АдресИзменен = Истина;
-
+ ОбновитьОтображениеДанных();
Иначе
СтандартнаяОбработка = Ложь;
КонецЕсли;
diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Help/ru.html b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Help/ru.html
index 63e896be3..51da85b49 100644
--- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Help/ru.html
+++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Help/ru.html
@@ -1,4 +1,4 @@
-
+
После настройки необходимых видов контактной информации, используемых на предприятии или в организации, и загрузки адресного классификатора, можно приступать к заполнению контактной информации в списках и документах программы.
Контактную информацию можно вводить:
в виде произвольной строки,
diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ДополнительныеПараметры/Help/ru.html b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ДополнительныеПараметры/Help/ru.html
index 3cc7a12ee..c34cd522a 100644
--- a/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ДополнительныеПараметры/Help/ru.html
+++ b/SSL/src/DataProcessors/ГрупповоеИзменениеРеквизитов/Forms/ДополнительныеПараметры/Help/ru.html
@@ -1,4 +1,4 @@
-
+
После ввода значений для изменения реквизитов можно задать особые настройки с помощью команды Дополнительные параметры:
Изменять в транзакции (по умолчанию флажок установлен) - программа позволяет обрабатывать выбранные для изменения элементы списка в транзакции. Если в процессе записи при установленном флажке не удается записать один из объектов (например, потому что объект редактируется другим пользователем), то будут отменены изменения во всех объектах.
Администратору программы часто требуется выяснить, какие события происходили в программе в определенный момент времени или какие действия выполнял тот или иной пользователь. Для этих целей предназначен журнал регистрации.
В журнале регистрации могут фиксироваться основные действия, выполняемые по модификации данных, выполнению регламентных операций, подключению и отключению от программы и т.д. Настройка журнала производится в Конфигураторе.
Открыть журнал регистрации можно по соответствующей команде раздела Администрирование - Поддержка и обслуживание.
При работе с программой могут возникать события следующих видов, каждый из которых отображается в журнале регистрации специальным значком:
-
+
- Ошибка;
- Предупреждение;
- Информация;
diff --git a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Form.form b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Form.form
index 0ab21f4a3..e256ec1e4 100644
--- a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Form.form
+++ b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Form.form
@@ -466,6 +466,10 @@
ThickBorderTopUnderlineUndo
+
+ OnChange
+ ШаблонСДаннымиПриИзменении
+ ШаблонСДаннымиРасширеннаяПодсказка49
@@ -3969,6 +3973,21 @@
true
+
+ ДополнительныеПараметры
+
+ ru
+ Дополнительные параметры
+
+ 30
+
+
+ true
+
+
+ true
+
+ ЗагрузитьТаблицуИзФайла
@@ -4193,6 +4212,10 @@
+
+ ДополнительныеПараметры
+
+
diff --git a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Module.bsl b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Module.bsl
index c98399319..e7c32d706 100644
--- a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Module.bsl
+++ b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/ЗагрузкаДанныхИзФайла/Module.bsl
@@ -1,6 +1,9 @@
&НаКлиенте
Перем ПараметрыОбработчика;
+&НаКлиенте
+Перем ПодтверждениеЗакрытияФормы;
+
&НаКлиенте
Перем ФормаДлительнойОперации;
@@ -23,6 +26,8 @@
Возврат;
КонецЕсли;
+ ДополнительныеПараметры = Параметры.ДополнительныеПараметры;
+ ПодтверждениеЗакрытияФормы = Неопределено;
УстановитьОформлениеДанных();
СтандартныеПодсистемыСервер.УстановитьОтображениеЗаголовковГрупп(ЭтотОбъект);
@@ -84,7 +89,7 @@
ТаблицаИнформацияПоКолонкам = РеквизитФормыВЗначение("ИнформацияПоКолонкам");
КонецЕсли;
- Обработки.ЗагрузкаДанныхИзФайла.ИнициализироватьЗагрузкуВТабличнуюЧасть(ИмяОбъектаСопоставления, Параметры.ИмяМакетаСШаблоном, ТаблицаИнформацияПоКолонкам, ШаблонСДанными, Отказ);
+ Обработки.ЗагрузкаДанныхИзФайла.ИнициализироватьЗагрузкуВТабличнуюЧасть(ИмяОбъектаСопоставления, Параметры.ИмяМакетаСШаблоном, ТаблицаИнформацияПоКолонкам, ШаблонСДанными, ДополнительныеПараметры, Отказ);
Если Отказ Тогда
Возврат;
КонецЕсли;
@@ -103,175 +108,18 @@
&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
- Если ОткрытьСправочникПослеЗакрытияПомощника Тогда
- ОткрытьФорму(ФормаСписка(ИмяОбъектаСопоставления));
- КонецЕсли;
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область ОбработчикиКомандФормы
-
-&НаКлиенте
-Процедура ОтменитьСопоставление(Команда)
- Оповещение = Новый ОписаниеОповещения("ПослеВопросаПроОтменитьСопоставление", ЭтотОбъект);
- ПоказатьВопрос(Оповещение, НСтр("ru = 'Отменить сопоставление?'"), РежимДиалогаВопрос.ДаНет);
-КонецПроцедуры
-
-&НаКлиенте
-Процедура ИзменитьБланк(Команда)
- ПараметрыФормы = Новый Структура();
- ПараметрыФормы.Вставить("ИнформацияПоКолонкам", ИнформацияПоКолонкам);
- ПараметрыФормы.Вставить("ИмяОбъектаСопоставления", ИмяОбъектаСопоставления);
-
- Оповещение = Новый ОписаниеОповещения("ПослеВызоваФормыИзменитьБланк", ЭтотОбъект);
- ОткрытьФорму("Обработка.ЗагрузкаДанныхИзФайла.Форма.РедактированиеБланка", ПараметрыФормы, ЭтотОбъект,,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
-КонецПроцедуры
-
-&НаКлиенте
-Процедура РазрешитьНеоднозначность(Команда)
- ОткрытьФормуРазрешенияНеоднозначности(Элементы.ТаблицаСопоставленияДанных.ТекущаяСтрока,Элементы.ТаблицаСопоставленияДанных.ТекущийЭлемент.Имя, Истина);
-КонецПроцедуры
-
-&НаКлиенте
-Процедура ВставитьВСписок(Команда)
- ЗакрытьФормуИВернутьМассивСсылок();
-КонецПроцедуры
-
-&НаКлиенте
-Процедура Далее(Команда)
- ПереходКСледующемуШагуЗагрузкиДанных();
-КонецПроцедуры
-
-&НаКлиенте
-Процедура ПослеВопросаОДобавлениеВТабличнуюЧасть(Результат, ДополнительныеПараметры) Экспорт
- Если Результат = КодВозвратаДиалога.Да Тогда
- АдресЗагруженныхДанных = АдресВХранилищеТаблицыСопоставления();
- Закрыть(АдресЗагруженныхДанных);
- КонецЕсли;
-КонецПроцедуры
-
-&НаСервере
-Процедура ЗаполнитьТаблицуСопоставленияИзВременногоХранилища()
- СопоставленныеДанные = ПолучитьИзВременногоХранилища(ФоновоеЗаданиеАдресХранилища);
- ЗначениеВРеквизитФормы(СопоставленныеДанные, "ТаблицаСопоставленияДанных");
-КонецПроцедуры
-
-&НаКлиенте
-Процедура ЗакрытьФормуИВернутьМассивСсылок()
- МассивСсылок = Новый Массив;
- Для каждого Строка Из ТаблицаСопоставленияДанных Цикл
- Если ЗначениеЗаполнено(Строка.ОбъектСопоставления) Тогда
- МассивСсылок.Добавить(Строка.ОбъектСопоставления);
- КонецЕсли;
- КонецЦикла;
-
- Закрыть(МассивСсылок);
-КонецПроцедуры
-
-&НаКлиенте
-Процедура Назад(Команда)
-
- Если Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ЗаполнениеТаблицыДанными Тогда
- Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ВыборСправочникаДляЗагрузки;
- Элементы.Назад.Видимость = Ложь;
- ЭтотОбъект.Заголовок = НСтр("ru = 'Загрузка данных в справочник'");
- ОчиститьТаблицу();
- ИначеЕсли Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СопоставлениеЗагружаемыхДанных ИЛИ Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.НеНайдено Тогда
- Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ЗаполнениеТаблицыДанными;
- Элементы.ВставитьВСписок.Видимость = Ложь;
- Элементы.Далее.КнопкаПоУмолчанию = Истина;
- Элементы.Далее.Видимость = Истина;
- Если ТипЗагрузки = "ВставкаИзБуфераОбмена" Тогда
- Элементы.Далее.Заголовок = НСтр("ru = 'Вставить в список'");
+ Если ПодтверждениеЗакрытияФормы <> Неопределено Тогда
+ Если ПодтверждениеЗакрытияФормы <> Истина Тогда
+ Оповещение = Новый ОписаниеОповещения("ЗакрытиеФормыЗавершение", ЭтотОбъект);
+ Отказ = Истина;
+ ТекстВопроса = НСтр("ru = 'Введенные данные не будут записаны. Закрыть форму?'");
+ ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
Иначе
- Элементы.Далее.Заголовок = НСтр("ru = 'Далее >'");
- КонецЕсли;
- Если ТипЗагрузки = "ТабличнаяЧасть" ИЛИ ТипЗагрузки = "ВставкаИзБуфераОбмена" Тогда
- Элементы.Назад.Видимость = Ложь;
- КонецЕсли;
- ИначеЕсли Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ОтчетОЗагрузкеДанных Тогда
- Элементы.ОткрытьСправочникПослеЗакрытияПомощника.Видимость = Ложь;
- Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СопоставлениеЗагружаемыхДанных;
- КонецЕсли;
-
-КонецПроцедуры
-
-&НаКлиенте
-Процедура ВыгрузитьШаблонВФайл(Команда)
-
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
- Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда
- МодульФайловыеФункцииСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ФайловыеФункцииСлужебныйКлиент");
- ПутьКФайлу = МодульФайловыеФункцииСлужебныйКлиент.КаталогМоиДокументы();
- Иначе
- ПутьКФайлу = "";
- КонецЕсли;
-
- ИмяФайла = СформироватьИмяФайлаДляОбъектаМетаданных(ИмяОбъектаСопоставления);
- ПолучитьПутьКФайлуНачалоВыбора(РежимДиалогаВыбораФайла.Сохранение, ПутьКФайлу, ИмяФайла);
- ВыбранныйФайл = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ПутьКФайлу);
- РасширениеФайла = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(ВыбранныйФайл.Расширение);
- Если ЗначениеЗаполнено(ВыбранныйФайл.Имя) Тогда
- Если РасширениеФайла = "csv" Тогда
- СохранитьТаблицуВCSVФайл(ПутьКФайлу);
- ИначеЕсли РасширениеФайла = "xlsx" Тогда
- АдресВоВременномХранилище = ТабличныйДокументУдалениеПримечаний();
- ТабличныйДокументБезПримечаний = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище);
- ТабличныйДокументБезПримечаний.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.xlsx);
- ШаблонСДанными = ТабличныйДокументБезПримечаний;
- ИначеЕсли РасширениеФайла = "mxl" Тогда
- ШаблонСДанными.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.mxl);
- Иначе
- ПоказатьПредупреждение(, НСтр("ru = 'Шаблон файла не был сохранен.'"));
+ Если ОткрытьСправочникПослеЗакрытияПомощника Тогда
+ ОткрытьФорму(ФормаСписка(ИмяОбъектаСопоставления));
КонецЕсли;
КонецЕсли;
- Иначе
- Оповещение = Новый ОписаниеОповещения("ПослеВыбораРасширенияФайла", ЭтотОбъект);
- ОткрытьФорму("Обработка.ЗагрузкаДанныхИзФайла.Форма.РасширениеФайла",, ЭтотОбъект, Истина,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
- ПутьКФайлу = "";
КонецЕсли;
-
-КонецПроцедуры
-
-// Функция для обхода ошибки сохранения, если в документе есть примечания.
-//
-&НаСервере
-Функция ТабличныйДокументУдалениеПримечаний()
- ТабличныйДокументДляСохранения = Новый ТабличныйДокумент;
- ИзменитьБланкПоИнформацииПоКолонкам(ТабличныйДокументДляСохранения);
- АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ТабличныйДокументДляСохранения);
- Возврат АдресВоВременномХранилище;
-КонецФункции
-
-&НаКлиенте
-Процедура ЗагрузитьШаблонИзФайла(Команда)
-
- ПолноеИмяФайла = "";
- Интерактивно = Истина;
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
- Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда
- МодульФайловыеФункцииСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ФайловыеФункцииСлужебныйКлиент");
- ПутьКФайлу = МодульФайловыеФункцииСлужебныйКлиент.КаталогМоиДокументы();
- Иначе
- ПутьКФайлу = "";
- КонецЕсли;
-
- ИмяФайла = СформироватьИмяФайлаДляОбъектаМетаданных(ИмяОбъектаСопоставления);
- ПолучитьПутьКФайлуНачалоВыбора(РежимДиалогаВыбораФайла.Открытие, ПутьКФайлу, "");
- ВыбранныйФайл = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ПутьКФайлу);
- РасширениеФайла = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(ВыбранныйФайл.Расширение);
- Если ЗначениеЗаполнено(ВыбранныйФайл.Имя) Тогда
- ПолноеИмяФайла = ВыбранныйФайл.ПолноеИмя;
- Интерактивно = Ложь;
- Иначе
- Возврат;
- КонецЕсли;
- КонецЕсли;
- АдресВременногоХранилища = "";
- Оповещение = Новый ОписаниеОповещения("ПриОкончаниеПомещенияФайла", ЭтотОбъект);
- НачатьПомещениеФайла(Оповещение, АдресВременногоХранилища, ПолноеИмяФайла, Интерактивно);
- ТаблицаОтчет.ФиксацияСверху = 1;
КонецПроцедуры
@@ -393,6 +241,185 @@
#КонецОбласти
+#Область ОбработчикиСобытийЭлементовТаблицыФормыШаблонСДанными
+
+&НаКлиенте
+Процедура ШаблонСДаннымиВыбор(Элемент, Область, СтандартнаяОбработка)
+ Если Область.Верх = 1 Тогда
+ СтандартнаяОбработка = Ложь; // Нельзя редактировать шапку
+ КонецЕсли;
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ОбработчикиКомандФормы
+
+&НаКлиенте
+Процедура ОтменитьСопоставление(Команда)
+ Оповещение = Новый ОписаниеОповещения("ПослеВопросаПроОтменитьСопоставление", ЭтотОбъект);
+ ПоказатьВопрос(Оповещение, НСтр("ru = 'Отменить сопоставление?'"), РежимДиалогаВопрос.ДаНет);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ИзменитьБланк(Команда)
+ ПараметрыФормы = Новый Структура();
+ ПараметрыФормы.Вставить("ИнформацияПоКолонкам", ИнформацияПоКолонкам);
+ ПараметрыФормы.Вставить("ИмяОбъектаСопоставления", ИмяОбъектаСопоставления);
+
+ Оповещение = Новый ОписаниеОповещения("ПослеВызоваФормыИзменитьБланк", ЭтотОбъект);
+ ОткрытьФорму("Обработка.ЗагрузкаДанныхИзФайла.Форма.РедактированиеБланка", ПараметрыФормы, ЭтотОбъект,,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура РазрешитьНеоднозначность(Команда)
+ ОткрытьФормуРазрешенияНеоднозначности(Элементы.ТаблицаСопоставленияДанных.ТекущаяСтрока,Элементы.ТаблицаСопоставленияДанных.ТекущийЭлемент.Имя, Истина);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ВставитьВСписок(Команда)
+ ЗакрытьФормуИВернутьМассивСсылок();
+КонецПроцедуры
+
+&НаКлиенте
+Процедура Далее(Команда)
+ ПереходКСледующемуШагуЗагрузкиДанных();
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПослеВопросаОДобавлениеВТабличнуюЧасть(Результат, ДополнительныеПараметры) Экспорт
+ Если Результат = КодВозвратаДиалога.Да Тогда
+ АдресЗагруженныхДанных = АдресВХранилищеТаблицыСопоставления();
+ Закрыть(АдресЗагруженныхДанных);
+ КонецЕсли;
+КонецПроцедуры
+
+&НаСервере
+Процедура ЗаполнитьТаблицуСопоставленияИзВременногоХранилища()
+ СопоставленныеДанные = ПолучитьИзВременногоХранилища(ФоновоеЗаданиеАдресХранилища);
+ ЗначениеВРеквизитФормы(СопоставленныеДанные, "ТаблицаСопоставленияДанных");
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗакрытьФормуИВернутьМассивСсылок()
+ ПодтверждениеЗакрытияФормы = Истина;
+ МассивСсылок = Новый Массив;
+ Для каждого Строка Из ТаблицаСопоставленияДанных Цикл
+ Если ЗначениеЗаполнено(Строка.ОбъектСопоставления) Тогда
+ МассивСсылок.Добавить(Строка.ОбъектСопоставления);
+ КонецЕсли;
+ КонецЦикла;
+
+ Закрыть(МассивСсылок);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура Назад(Команда)
+
+ Если Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ЗаполнениеТаблицыДанными Тогда
+ Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ВыборСправочникаДляЗагрузки;
+ Элементы.Назад.Видимость = Ложь;
+ ЭтотОбъект.Заголовок = НСтр("ru = 'Загрузка данных в справочник'");
+ ОчиститьТаблицу();
+ ИначеЕсли Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СопоставлениеЗагружаемыхДанных ИЛИ Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.НеНайдено Тогда
+ Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ЗаполнениеТаблицыДанными;
+ Элементы.ВставитьВСписок.Видимость = Ложь;
+ Элементы.Далее.КнопкаПоУмолчанию = Истина;
+ Элементы.Далее.Видимость = Истина;
+ Если ТипЗагрузки = "ВставкаИзБуфераОбмена" Тогда
+ Элементы.Далее.Заголовок = НСтр("ru = 'Вставить в список'");
+ Иначе
+ Элементы.Далее.Заголовок = НСтр("ru = 'Далее >'");
+ КонецЕсли;
+ Если ТипЗагрузки = "ТабличнаяЧасть" ИЛИ ТипЗагрузки = "ВставкаИзБуфераОбмена" Тогда
+ Элементы.Назад.Видимость = Ложь;
+ КонецЕсли;
+ ИначеЕсли Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ОтчетОЗагрузкеДанных Тогда
+ Элементы.ОткрытьСправочникПослеЗакрытияПомощника.Видимость = Ложь;
+ Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СопоставлениеЗагружаемыхДанных;
+ КонецЕсли;
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ВыгрузитьШаблонВФайл(Команда)
+
+ Если ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда
+ МодульФайловыеФункцииСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ФайловыеФункцииСлужебныйКлиент");
+ ПутьКФайлу = МодульФайловыеФункцииСлужебныйКлиент.КаталогМоиДокументы();
+ Иначе
+ ПутьКФайлу = "";
+ КонецЕсли;
+
+ ИмяФайла = СформироватьИмяФайлаДляОбъектаМетаданных(ИмяОбъектаСопоставления);
+ ПолучитьПутьКФайлуНачалоВыбора(РежимДиалогаВыбораФайла.Сохранение, ПутьКФайлу, ИмяФайла);
+ ВыбранныйФайл = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ПутьКФайлу);
+ РасширениеФайла = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(ВыбранныйФайл.Расширение);
+ Если ЗначениеЗаполнено(ВыбранныйФайл.Имя) Тогда
+ Если РасширениеФайла = "csv" Тогда
+ СохранитьТаблицуВCSVФайл(ПутьКФайлу);
+ ИначеЕсли РасширениеФайла = "xlsx" Тогда
+ АдресВоВременномХранилище = ТабличныйДокументУдалениеПримечаний();
+ ТабличныйДокументБезПримечаний = ПолучитьИзВременногоХранилища(АдресВоВременномХранилище);
+ ТабличныйДокументБезПримечаний.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.xlsx);
+ ШаблонСДанными = ТабличныйДокументБезПримечаний;
+ ИначеЕсли РасширениеФайла = "mxl" Тогда
+ ШаблонСДанными.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.mxl);
+ Иначе
+ ПоказатьПредупреждение(, НСтр("ru = 'Шаблон файла не был сохранен.'"));
+ КонецЕсли;
+ КонецЕсли;
+ Иначе
+ Оповещение = Новый ОписаниеОповещения("ПослеВыбораРасширенияФайла", ЭтотОбъект);
+ ОткрытьФорму("Обработка.ЗагрузкаДанныхИзФайла.Форма.РасширениеФайла",, ЭтотОбъект, Истина,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
+ ПутьКФайлу = "";
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Функция для обхода ошибки сохранения, если в документе есть примечания.
+//
+&НаСервере
+Функция ТабличныйДокументУдалениеПримечаний()
+ ТабличныйДокументДляСохранения = Новый ТабличныйДокумент;
+ ИзменитьБланкПоИнформацииПоКолонкам(ТабличныйДокументДляСохранения);
+ АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ТабличныйДокументДляСохранения);
+ Возврат АдресВоВременномХранилище;
+КонецФункции
+
+&НаКлиенте
+Процедура ЗагрузитьШаблонИзФайла(Команда)
+
+ ПолноеИмяФайла = "";
+ Интерактивно = Истина;
+ Если ПодключитьРасширениеРаботыСФайлами() Тогда
+ Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда
+ МодульФайловыеФункцииСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ФайловыеФункцииСлужебныйКлиент");
+ ПутьКФайлу = МодульФайловыеФункцииСлужебныйКлиент.КаталогМоиДокументы();
+ Иначе
+ ПутьКФайлу = "";
+ КонецЕсли;
+
+ ИмяФайла = СформироватьИмяФайлаДляОбъектаМетаданных(ИмяОбъектаСопоставления);
+ ПолучитьПутьКФайлуНачалоВыбора(РежимДиалогаВыбораФайла.Открытие, ПутьКФайлу, "");
+ ВыбранныйФайл = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ПутьКФайлу);
+ РасширениеФайла = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(ВыбранныйФайл.Расширение);
+ Если ЗначениеЗаполнено(ВыбранныйФайл.Имя) Тогда
+ ПолноеИмяФайла = ВыбранныйФайл.ПолноеИмя;
+ Интерактивно = Ложь;
+ Иначе
+ Возврат;
+ КонецЕсли;
+ КонецЕсли;
+ АдресВременногоХранилища = "";
+ Оповещение = Новый ОписаниеОповещения("ПриОкончаниеПомещенияФайла", ЭтотОбъект);
+ НачатьПомещениеФайла(Оповещение, АдресВременногоХранилища, ПолноеИмяФайла, Интерактивно);
+ ТаблицаОтчет.ФиксацияСверху = 1;
+
+КонецПроцедуры
+
+#КонецОбласти
+
#Область ОбработчикиСобытийЭлементовТаблицыВидЗагрузкиДанных
&НаКлиенте
@@ -409,18 +436,6 @@
#КонецОбласти
-
-#Область ОбработчикиСобытийЭлементовТаблицыФормыШаблонСДанными
-
-&НаКлиенте
-Процедура ШаблонСДаннымиВыбор(Элемент, Область, СтандартнаяОбработка)
- Если Область.Верх = 1 Тогда
- СтандартнаяОбработка = Ложь; // Нельзя редактировать шапку
- КонецЕсли;
-КонецПроцедуры
-
-#КонецОбласти
-
#Область ОбработчикиСобытийЭлементовТаблицыСопоставленияДанных
&НаКлиенте
@@ -513,6 +528,17 @@
/////////////////////////////////////// КЛИЕНТ ///////////////////////////////////////////
+// Завершение диалога закрытия формы.
+&НаКлиенте
+Процедура ЗакрытиеФормыЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
+ Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
+ ПодтверждениеЗакрытияФормы = Истина;
+ Закрыть();
+ Иначе
+ ПодтверждениеЗакрытияФормы = Ложь;
+ КонецЕсли;
+КонецПроцедуры
+
&НаКлиенте
Процедура ПереходКСледующемуШагуЗагрузкиДанных()
@@ -531,6 +557,7 @@
ИначеЕсли Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СопоставлениеЗагружаемыхДанных Тогда
Элементы.ВставитьВСписок.Видимость = Ложь;
Если ТипЗагрузки = "ТабличнаяЧасть" Тогда
+ ПодтверждениеЗакрытияФормы = Истина;
Отбор = Новый Структура("РезультатСопоставленияСтроки", "НеСопоставлен");
Строки = ТаблицаСопоставленияДанных.НайтиСтроки(Отбор);
@@ -546,6 +573,7 @@
ИначеЕсли ТипЗагрузки = "ВставкаИзБуфераОбмена" Тогда
Элементы.Назад.Заголовок = НСтр("ru = '< В начало_'");
+ ПодтверждениеЗакрытияФормы = Истина;
ЗакрытьФормуИВернутьМассивСсылок();
Иначе
Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ДлительныеОперации;
@@ -698,11 +726,11 @@
&НаКлиенте
Функция ТаблицаСДаннымиПустая()
-
- Если ИнформацияПоКолонкам.Количество() = 1 Тогда
+ Если ИнформацияПоКолонкам.Количество() = 1 И ШаблонСДанными.ВысотаТаблицы < 2 Тогда
Если НЕ ЗначениеЗаполнено(ШаблонСДаннымиОднаКолонка) Тогда
Возврат Истина;
КонецЕсли;
+ СкопироватьОднуКолонкуВШаблонСДанными();
Иначе
Если ШаблонСДанными.ВысотаТаблицы < 2 Тогда
Возврат Истина;
@@ -831,10 +859,6 @@
&НаСервере
Процедура ВыполнитьШагСопоставлениеЗагружаемыхДанныхНаСервере(ФоновоеЗадание = Ложь)
- Если ИнформацияПоКолонкам.Количество() = 1 Тогда
- СкопироватьОднуКолонкуВШаблонСДанными();
- КонецЕсли;
-
ТаблицаСопоставления = РеквизитФормыВЗначение("ТаблицаСопоставленияДанных");
Если ТипЗагрузки = "ТабличнаяЧасть" Тогда
АдресЗагруженныхДанных = "";
@@ -845,7 +869,13 @@
СкопироватьСтруктуруТабличнойЧасти(АдресКопииТабличнойЧасти);
МенеджерОбъекта = МенеджерОбъекта(ИмяОбъектаСопоставления);
- МенеджерОбъекта.СопоставитьЗагружаемыеДанные(АдресЗагруженныхДанных, АдресКопииТабличнойЧасти, СписокНеоднозначностей, ИмяОбъектаСопоставления);
+
+ Попытка
+ МенеджерОбъекта.СопоставитьЗагружаемыеДанные(АдресЗагруженныхДанных, АдресКопииТабличнойЧасти, СписокНеоднозначностей, ИмяОбъектаСопоставления, ДополнительныеПараметры);
+ Исключение
+ // Используется старый вариант метода СопоставитьЗагружаемыеДанные без параметра ДополнительныеПараметры.
+ МенеджерОбъекта.СопоставитьЗагружаемыеДанные(АдресЗагруженныхДанных, АдресКопииТабличнойЧасти, СписокНеоднозначностей, ИмяОбъектаСопоставления);
+ КонецПопытки;
Если НЕ РеквизитыСозданы Тогда
СоздатьТаблицуСопоставленияПоИнформацииОКолонкахДляТЧ();
@@ -911,6 +941,7 @@
Возврат;
КонецЕсли;
+ ПодтверждениеЗакрытияФормы = Ложь;
СписокНезаполненныхКолонок = НезаполненныеОбязательныеКолонки();
Если СписокНезаполненныхКолонок.Количество() > 0 Тогда
Если СписокНезаполненныхКолонок.Количество() =1 Тогда
@@ -940,6 +971,9 @@
&НаКлиенте
Процедура ВыполнитьШагСопоставлениеЗагружаемыхДанныхПослеПроверки()
+ Элементы.Назад.Доступность = Ложь;
+ Элементы.Далее.Доступность = Ложь;
+
ФоновоеЗадание = Ложь;
ВыполнитьШагСопоставлениеЗагружаемыхДанныхНаСервере(ФоновоеЗадание);
@@ -993,21 +1027,12 @@
КонецПроцедуры
-&НаКлиенте
-Процедура ФоновоеЗаданиеЗаписьНаКлиенте()
- Результат = ФоновоеЗаданиеЗаписьПолучитьРезультат();
- Если Результат.ФоновоеЗаданиеВыполнено Тогда
- ЗаполнитьТаблицуСопоставленияИзВременногоХранилища();
- ФоновоеЗаданиеОтчетНаКлиенте(Ложь);
- Иначе
- ДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчика);
- ПодключитьОбработчикОжидания("ФоновоеЗаданиеЗаписьНаКлиенте", ПараметрыОбработчика.ТекущийИнтервал, Истина);
- КонецЕсли;
-КонецПроцедуры
-
&НаКлиенте
Процедура ЗаписатьЗагружаемыеДанныеКлиент()
+ Элементы.Назад.Доступность = Ложь;
+ Элементы.Далее.Доступность = Ложь;
+
ФоновоеЗаданиеПроцент = 0;
ФоновоеЗадание = Ложь;
ЗаписатьЗагружаемыеДанныеОтчет(ФоновоеЗадание);
@@ -1022,6 +1047,18 @@
КонецЕсли;
КонецПроцедуры
+&НаКлиенте
+Процедура ФоновоеЗаданиеЗаписьНаКлиенте()
+ Результат = ФоновоеЗаданиеЗаписьПолучитьРезультат();
+ Если Результат.ФоновоеЗаданиеВыполнено Тогда
+ ЗаполнитьТаблицуСопоставленияИзВременногоХранилища();
+ ФоновоеЗаданиеОтчетНаКлиенте(Ложь);
+ Иначе
+ ДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчика);
+ ПодключитьОбработчикОжидания("ФоновоеЗаданиеЗаписьНаКлиенте", ПараметрыОбработчика.ТекущийИнтервал, Истина);
+ КонецЕсли;
+КонецПроцедуры
+
&НаСервере
Функция ФоновоеЗаданиеЗаписьПолучитьРезультат()
Результат = Новый Структура;
@@ -1087,6 +1124,7 @@
Результат = ПолучитьИзВременногоХранилища(ФоновоеЗаданиеАдресХранилища);
ПоказатьОтчет(Результат);
+ ПодтверждениеЗакрытияФормы = Истина;
Иначе
ДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчика);
ПодключитьОбработчикОжидания("ФоновоеЗаданиеСозданиеОтчетаНаКлиенте", ПараметрыОбработчика.ТекущийИнтервал, Истина);
@@ -1134,7 +1172,6 @@
КонецЕсли;
КонецПроцедуры
-
#КонецОбласти
&НаКлиенте
@@ -1201,8 +1238,11 @@
Иначе
УстановитьОформлениеДляСтраницыСопоставления(Ложь, Элементы.ПояснениеДляПрикладнойЗагрузки, Ложь, НСтр("ru = 'Загрузить данные >'"));
КонецЕсли;
-
КонецЕсли;
+
+ Элементы.Назад.Доступность = Истина;
+ Элементы.Далее.Доступность = Истина;
+
КонецПроцедуры
&НаКлиенте
@@ -1261,6 +1301,7 @@
ПараметрыФормы.Вставить("ЗначенияЗагружаемыхКолонок", ЗначенияЗагружаемыхКолонок);
ПараметрыФормы.Вставить("СписокНеоднозначностей", Неопределено);
ПараметрыФормы.Вставить("ПолноеИмяТабличнойЧасти", ИмяОбъектаСопоставления);
+ ПараметрыФормы.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
Параметр = Новый Структура();
Параметр.Вставить("Идентификатор", ВыбраннаяСтрока);
@@ -2100,10 +2141,12 @@
ДобавитьСтандартныеКолонкиВТаблицуСопоставления(ВременнаяТЗ, СтруктураОбъектаСопоставления, Истина, Истина, Истина, Истина);
ДобавитьСтандартныеКолонкиВМассивРеквизитов(МассивРеквизитов, СтруктураОбъектаСопоставления, Истина, Истина, Истина, Истина);
- Для каждого Колонка Из ИнформацияПоКолонкам Цикл
- ПредставлениеКолонки = ?(ЗначениеЗаполнено(Колонка.Синоним), Колонка.Синоним, Колонка.ПредставлениеКолонки);
- ВременнаяТЗ.Колонки.Добавить(Колонка.ИмяКолонки, Колонка.ТипКолонки,ПредставлениеКолонки);
- МассивРеквизитов.Добавить(Новый РеквизитФормы(Колонка.ИмяКолонки, Колонка.ТипКолонки, "ТаблицаСопоставленияДанных", ПредставлениеКолонки));
+ Для каждого Колонка Из ИнформацияПоКолонкам Цикл
+ Если ВременнаяТЗ.Колонки.Найти(Колонка.ИмяКолонки) = Неопределено Тогда
+ ПредставлениеКолонки = ?(ЗначениеЗаполнено(Колонка.Синоним), Колонка.Синоним, Колонка.ПредставлениеКолонки);
+ ВременнаяТЗ.Колонки.Добавить(Колонка.ИмяКолонки, Колонка.ТипКолонки, ПредставлениеКолонки);
+ МассивРеквизитов.Добавить(Новый РеквизитФормы(Колонка.ИмяКолонки, Колонка.ТипКолонки, "ТаблицаСопоставленияДанных", ПредставлениеКолонки));
+ КонецЕсли;
КонецЦикла;
ИзменитьРеквизиты(МассивРеквизитов);
@@ -2487,11 +2530,26 @@
СформироватьМакетПоТипуЗагрузки();
КонецЕсли;
ИнформацияПоКолонкам.Сортировать("Позиция Возр");
+ ОбновитьНаименованияКолонокТаблицыСопоставления();
ИзменитьБланкПоИнформацииПоКолонкам();
КонецЕсли;
КонецПроцедуры
+&НаСервере
+Процедура ОбновитьНаименованияКолонокТаблицыСопоставления()
+
+ Для каждого СтрокаТаблицы Из ИнформацияПоКолонкам Цикл
+ Колонка = Элементы.ТаблицаСопоставленияДанных.ПодчиненныеЭлементы.Найти(СтрокаТаблицы.ИмяКолонки);
+ Если Колонка <> Неопределено Тогда
+ Колонка.Заголовок = ?(НЕ ПустаяСтрока(СтрокаТаблицы.Синоним),
+ СтрокаТаблицы.Синоним + " (" + СтрокаТаблицы.ПредставлениеКолонки +")",
+ СтрокаТаблицы.ПредставлениеКолонки);
+ КонецЕсли;
+ КонецЦикла;
+
+КонецПроцедуры
+
&НаСервере
Процедура ИзменитьБланкПоИнформацииПоКолонкам(Бланк = Неопределено)
@@ -2510,6 +2568,11 @@
КонецПроцедуры
+&НаКлиенте
+Процедура ШаблонСДаннымиПриИзменении(Элемент)
+ ПодтверждениеЗакрытияФормы = Ложь;
+КонецПроцедуры
+
#КонецОбласти
diff --git a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/РазрешенияНеоднозначностей/Module.bsl b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/РазрешенияНеоднозначностей/Module.bsl
index 54d870804..8bbdf64ad 100644
--- a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/РазрешенияНеоднозначностей/Module.bsl
+++ b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/Forms/РазрешенияНеоднозначностей/Module.bsl
@@ -10,7 +10,7 @@
УстановитьОформлениеДанных();
Если Параметры.ТипЗагрузки = "ТабличнаяЧасть" И ЗначениеЗаполнено(Параметры.ПолноеИмяТабличнойЧасти) Тогда
- СписокНеоднозначностей = Новый СписокЗначений;
+ СписокНеоднозначностей = Новый Массив;
МассивОбъекта = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивСлов(Параметры.ПолноеИмяТабличнойЧасти);
Если МассивОбъекта[0] = "Документ" Тогда
@@ -22,7 +22,13 @@
Возврат;
КонецЕсли;
- МенеджерОбъекта.ЗаполнитьСписокНеоднозначностей(Параметры.ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, Параметры.Имя, Параметры.ЗначенияЗагружаемыхКолонок);
+ Попытка
+ МенеджерОбъекта.ЗаполнитьСписокНеоднозначностей(Параметры.ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, Параметры.Имя, Параметры.ЗначенияЗагружаемыхКолонок, Параметры.ДополнительныеПараметры);
+ Исключение
+ // Используется старый вариант метода ЗаполнитьСписокНеоднозначностей без параметра ДополнительныеПараметры.
+ МенеджерОбъекта.ЗаполнитьСписокНеоднозначностей(Параметры.ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, Параметры.Имя, Параметры.ЗначенияЗагружаемыхКолонок);
+ КонецПопытки;
+
Элементы.ВариантРазрешенияНеоднозначности.Видимость = Ложь;
Элементы.ДекорацияЗаголовок.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Элементы.ДекорацияЗаголовок.Заголовок, Параметры.Имя);
Элементы.ДекорацияЗаголовок.Видимость = Истина;
@@ -58,7 +64,7 @@
ВременнаяТЗ.Колонки.Очистить();
МассивРеквизитов = Новый Массив;
- ПервыйЭлемент = СписокНеоднозначностей.Получить(0).Значение;
+ ПервыйЭлемент = СписокНеоднозначностей.Получить(0);
МетаданныеОбъект = ПервыйЭлемент.Метаданные();
Для каждого Реквизит Из ПервыйЭлемент.Метаданные().Реквизиты Цикл
@@ -83,35 +89,36 @@
Для каждого Элемент Из СписокНеоднозначностей Цикл
Строка = ВариантыВыбора.ПолучитьЭлементы().Добавить();
- Строка.Представление = Строка(Элемент.Значение);
- Строка.Ссылка = Элемент.Значение.Ссылка;
- МетаданныеОбъект = Элемент.Значение.Метаданные();
+ Строка.Представление = Строка(Элемент);
+ Строка.Ссылка = Элемент.Ссылка;
+ МетаданныеОбъект = Элемент.Метаданные();
Для каждого Реквизит Из МетаданныеОбъект.СтандартныеРеквизиты Цикл
Если Реквизит.Имя = "Код" ИЛИ Реквизит.Имя = "Наименование" Тогда
ПодСтрока = Строка.ПолучитьЭлементы().Добавить();
ПодСтрока.Представление = Реквизит.Представление() + ":";
- ПодСтрока.Значение = Элемент.Значение[Реквизит.Имя];
- ПодСтрока.Ссылка = Элемент.Значение.Ссылка;
+ ПодСтрока.Значение = Элемент[Реквизит.Имя];
+ ПодСтрока.Ссылка = Элемент.Ссылка;
КонецЕсли;
КонецЦикла;
Для каждого Реквизит Из МетаданныеОбъект.Реквизиты Цикл
ПодСтрока = Строка.ПолучитьЭлементы().Добавить();
ПодСтрока.Представление = Реквизит.Представление() + ":";
- ПодСтрока.Значение = Элемент.Значение[Реквизит.Имя];
- ПодСтрока.Ссылка = Элемент.Значение.Ссылка;
+ ПодСтрока.Значение = Элемент[Реквизит.Имя];
+ ПодСтрока.Ссылка = Элемент.Ссылка;
КонецЦикла;
КонецЦикла;
Для каждого Элемент Из СписокНеоднозначностей Цикл
Строка = ЭлементыСправочника.Добавить();
- Строка.Представление = Строка(Элемент.Значение);
+ Строка.Представление = Строка(Элемент);
Для Каждого Колонка Из ВременнаяТЗ.Колонки Цикл
Попытка
- Строка[Колонка.Имя] = Элемент.Значение[Колонка.Имя];
+ Строка[Колонка.Имя] = Элемент[Колонка.Имя];
Исключение
+ // Возможно падение при некорректном приведение типа
КонецПопытки;
КонецЦикла;
КонецЦикла;
diff --git a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/ManagerModule.bsl b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/ManagerModule.bsl
index db31eded2..534b501ba 100644
--- a/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/ManagerModule.bsl
+++ b/SSL/src/DataProcessors/ЗагрузкаДанныхИзФайла/ManagerModule.bsl
@@ -50,12 +50,14 @@
КонецФункции
// Сообщает все требуемые сведения о процедуре загрузки данных из файла в Табличную часть.
-Функция ПараметрыЗагрузкиИзФайлаВТЧ(ИмяТабличнойЧасти) Экспорт
+Функция ПараметрыЗагрузкиИзФайлаВТЧ(ИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт
ПараметрыПоУмолчанию= Новый Структура;
ПараметрыПоУмолчанию.Вставить("ОбязательныеКолонки",Новый Массив);
ПараметрыПоУмолчанию.Вставить("ИмяМакетаСШаблоном","ЗагрузкаИзФайла");
ПараметрыПоУмолчанию.Вставить("ИмяТабличнойЧасти", ИмяТабличнойЧасти);
+ ПараметрыПоУмолчанию.Вставить("ТипДанныхКолонки", Новый Соответствие);
+ ПараметрыПоУмолчанию.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
Возврат ПараметрыПоУмолчанию;
@@ -463,6 +465,9 @@
Если НЕ ЗначениеЗаполнено(ДанныеЯчейки) Тогда
ДанныеЯчейки = Справочники[ОписаниеОбъекта.НазваниеОбъекта].НайтиПоНаименованию(ЗначениеЯчейки, Истина);
КонецЕсли;
+ Если НЕ ЗначениеЗаполнено(ДанныеЯчейки) Тогда
+ ДанныеЯчейки = Справочники[ОписаниеОбъекта.НазваниеОбъекта].НайтиПоКоду(ЗначениеЯчейки, Истина);
+ КонецЕсли;
ИначеЕсли ОписаниеОбъекта.ТипОбъекта = "Перечисление" Тогда
Для каждого ЗначениеПеречисления Из Перечисления[ОписаниеОбъекта.НазваниеОбъекта] Цикл
Если Строка(ЗначениеПеречисления) = СокрЛП(ЗначениеЯчейки) Тогда
@@ -846,23 +851,29 @@
КонецПроцедуры
-Процедура ИнициализироватьЗагрузкуВТабличнуюЧасть(ПолноеИмяТабличнойЧасти, ИмяМакетаСШаблоном, ИнформацияПоКолонкам, ШаблонСДанными, Отказ) Экспорт
+Процедура ИнициализироватьЗагрузкуВТабличнуюЧасть(ПолноеИмяТабличнойЧасти, ИмяМакетаСШаблоном, ИнформацияПоКолонкам, ШаблонСДанными, ДополнительныеПараметры, Отказ) Экспорт
СтруктураНаименованияОбъекта = РазложитьПолноеИмяОбъекта(ПолноеИмяТабличнойЧасти);
- ПараметрыЗагрузкиИзФайла = ПараметрыЗагрузкиИзФайлаВТЧ(ПолноеИмяТабличнойЧасти);
+ ПараметрыЗагрузкиИзФайла = ПараметрыЗагрузкиИзФайлаВТЧ(ПолноеИмяТабличнойЧасти, ДополнительныеПараметры);
ПараметрыЗагрузкиИзФайла.Вставить("ПолноеИмяОбъекта", ПолноеИмяТабличнойЧасти);
Если СтруктураНаименованияОбъекта.ТипОбъекта = "Документ" Тогда
МенеджерОбъекта = Документы[СтруктураНаименованияОбъекта.НазваниеОбъекта];
МенеджерОбъекта.УстановитьПараметрыЗагрузкиИзФайлаВТЧ(ПараметрыЗагрузкиИзФайла);
- ПараметрыЗагрузки = ПараметрыЗагрузкиИзФайла;
+
+ Если ПараметрыЗагрузкиИзФайла.Свойство("ИмяМакетаСШаблоном") И ЗначениеЗаполнено(ПараметрыЗагрузкиИзФайла.ИмяМакетаСШаблоном) Тогда
+ ИмяМакетаСШаблоном = ПараметрыЗагрузкиИзФайла.ИмяМакетаСШаблоном;
+ КонецЕсли;
МакетМетаданные = Метаданные.Документы[СтруктураНаименованияОбъекта.НазваниеОбъекта].Макеты.Найти(ИмяМакетаСШаблоном);
- МакетМетаданные= Метаданные.Документы[СтруктураНаименованияОбъекта.НазваниеОбъекта].Макеты.Найти("ЗагрузкаИзФайла" + СтруктураНаименованияОбъекта.ИмяТабличнойЧасти);
Если МакетМетаданные = Неопределено Тогда
- МакетМетаданные = Метаданные.Документы[СтруктураНаименованияОбъекта.НазваниеОбъекта].Макеты.Найти("ЗагрузкаИзФайла");
+ МакетМетаданные= Метаданные.Документы[СтруктураНаименованияОбъекта.НазваниеОбъекта].Макеты.Найти("ЗагрузкаИзФайла" + СтруктураНаименованияОбъекта.ИмяТабличнойЧасти);
+ Если МакетМетаданные = Неопределено Тогда
+ МакетМетаданные = Метаданные.Документы[СтруктураНаименованияОбъекта.НазваниеОбъекта].Макеты.Найти("ЗагрузкаИзФайла");
+ КонецЕсли;
КонецЕсли;
+
Если МакетМетаданные <> Неопределено Тогда
Макет = МенеджерОбъекта.ПолучитьМакет(МакетМетаданные.Имя);
Иначе
@@ -1700,7 +1711,9 @@
КонецЕсли;
Для каждого Колонка Из ИнформацияПоКолонкам Цикл
- ЭлементСправочника[Колонка.ИмяКолонки] = СтрокаТаблицы[Колонка.ИмяКолонки];
+ Если Колонка.Видимость Тогда
+ ЭлементСправочника[Колонка.ИмяКолонки] = СтрокаТаблицы[Колонка.ИмяКолонки];
+ КонецЕсли;
КонецЦикла;
Если ЭлементСправочника.ПроверитьЗаполнение() Тогда
diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/СообщенияОбОшибках/Form.form b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/СообщенияОбОшибках/Form.form
new file mode 100644
index 000000000..aa8afcf5a
--- /dev/null
+++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/СообщенияОбОшибках/Form.form
@@ -0,0 +1,153 @@
+
+
+
+ ru
+ Подробнее
+
+
+ Текст
+ 1
+ true
+ true
+
+ true
+
+
+ Текст
+
+ None
+
+ ТекстРасширеннаяПодсказка
+ 3
+ Label
+ true
+ true
+
+ Left
+
+
+
+ ТекстКонтекстноеМеню
+ 2
+ true
+
+ InputField
+ Enter
+ true
+ Left
+ true
+
+ 50
+ true
+ 8
+ true
+ true
+ true
+ true
+ true
+ Normal
+
+
+ Bottom
+ true
+
+ ФормаКоманднаяПанель
+ -1
+
+ ФормаЗакрыть
+ 4
+ true
+ true
+
+ true
+
+
+ ФормаЗакрытьРасширеннаяПодсказка
+ 5
+ Label
+ true
+ true
+
+ Left
+
+
+ Form.StandardCommand.Close
+ Auto
+ true
+ true
+ true
+ UserCmds
+ Auto
+
+ Right
+ true
+
+
+ OnCreateAtServer
+ ПриСозданииНаСервере
+
+ Abort
+ Cancel
+ CustomizeForm
+ Help
+ Ignore
+ No
+ OK
+ RestoreValues
+ Retry
+ SaveValues
+ Yes
+ LockOwner
+ true
+ true
+ Vertical
+ true
+ true
+ true
+ auto
+ true
+
+ Объект
+ 1
+
+ DataProcessorObject.ЗагрузкаКурсовВалют
+
+
+ true
+
+
+ true
+
+ true
+
+
+ Текст
+
+ ru
+ Текст
+
+ 2
+
+ String
+
+
+
+ true
+
+
+ true
+
+
+
+ Текст
+
+ String
+
+
+
+
+
+
+
+
+
diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/СообщенияОбОшибках/Module.bsl b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/СообщенияОбОшибках/Module.bsl
new file mode 100644
index 000000000..133b64cff
--- /dev/null
+++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/СообщенияОбОшибках/Module.bsl
@@ -0,0 +1,8 @@
+#Область ОбработчикиСобытийФормы
+
+&НаСервере
+Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
+ Текст = Параметры.Текст;
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Module.bsl
index 736260d3b..eea7b7978 100644
--- a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Module.bsl
+++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Module.bsl
@@ -299,14 +299,16 @@
ЕстьУспешноЗагруженныеКурсы = Ложь;
БезОшибок = Истина;
+ КоличествоОшибок = 0;
+
+ СписокОшибок = Новый ТекстовыйДокумент;
Для Каждого СостояниеЗагрузки Из РезультатЗагрузки Цикл
Если СостояниеЗагрузки.СтатусОперации Тогда
ЕстьУспешноЗагруженныеКурсы = Истина;
Иначе
БезОшибок = Ложь;
- Индекс = Объект.СписокВалют.Индекс(Объект.СписокВалют.НайтиСтроки(Новый Структура("Валюта", СостояниеЗагрузки.Валюта))[0]);
- ИмяПоля = СтрЗаменить("СписокВалют[x].Представление", "x", Строка(Индекс));
- ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СостояниеЗагрузки.Сообщение,, ИмяПоля, "Объект");
+ КоличествоОшибок = КоличествоОшибок + 1;
+ СписокОшибок.ДобавитьСтроку(СостояниеЗагрузки.Сообщение + Символы.ПС);
КонецЕсли;
КонецЦикла;
@@ -318,16 +320,36 @@
МассивОбновляемыхВалют.Добавить(СтрокаТаблицы.Валюта);
КонецЦикла;
Оповестить("Запись_ЗагрузкаКурсовВалют", ПараметрыЗаписи, МассивОбновляемыхВалют);
-
РаботаСКурсамиВалютКлиент.ОповеститьКурсыУспешноОбновлены();
-
- Если БезОшибок Тогда
- Закрыть();
+ КонецЕсли;
+
+ Если БезОшибок Тогда
+ Закрыть();
+ Иначе
+ ПредставлениеОшибки = СокрЛП(СписокОшибок.ПолучитьТекст());
+ Если КоличествоОшибок > 1 Тогда
+ Кнопки = Новый СписокЗначений;
+ Кнопки.Добавить("Подробнее", НСтр("ru = 'Подробнее...'"));
+ Кнопки.Добавить("Продолжить", НСтр("ru = 'Продолжить'"));
+ ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось загрузить курсы валют (%1).'"), КоличествоОшибок);
+ ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьРезультатЗагрузкиПриОтветеНаВопрос", ЭтотОбъект, ПредставлениеОшибки);
+ ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки);
+ Иначе
+ ПоказатьПредупреждение(, ПредставлениеОшибки);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
+&НаКлиенте
+Процедура ОбработатьРезультатЗагрузкиПриОтветеНаВопрос(РезультатВопроса, ПредставлениеОшибки) Экспорт
+ Если РезультатВопроса <> "Подробнее" Тогда
+ Возврат;
+ КонецЕсли;
+
+ ОткрытьФорму("Обработка.ЗагрузкаКурсовВалют.Форма.СообщенияОбОшибках", Новый Структура("Текст", ПредставлениеОшибки));
+КонецПроцедуры
+
&НаСервереБезКонтекста
Функция ЗаданиеВыполнено(ИдентификаторФоновогоЗадания)
Возврат ДлительныеОперации.ЗаданиеВыполнено(ИдентификаторФоновогоЗадания);
diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Help/ru.html b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Help/ru.html
index f9a5971e1..c4681c1b6 100644
--- a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Help/ru.html
+++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Позволяет заменить один или несколько элементов на выбранный элемент.
Такая возможность востребована при удалении элементов, например, т.к. для окончательного удаления элемента необходимо избавиться от ссылок на него.
Открывается по кнопке Заменить и удалить из списков программы. Также можно воспользоваться командой Заменить во всех местах использования из окна Удаление помеченных объектов.
diff --git a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Module.bsl b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Module.bsl
index ee2b7006f..12c25e866 100644
--- a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Module.bsl
+++ b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ЗаменаЭлементов/Module.bsl
@@ -5,15 +5,10 @@
// Может быть коллекцией элементов, обладающих полем "Ссылка".
//
-// Флаг подтверждения, используется при не модальном закрытии.
-&НаКлиенте
-Перем ПодтверждениеЗакрытияФормы;
-
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
-
УстановитьУсловноеОформление();
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
@@ -54,6 +49,18 @@
Элементы.Список.ИзменятьПорядокСтрок = Ложь;
Элементы.Список.ИзменятьСоставСтрок = Ложь;
+ СписокЗаменяемых = Новый СписокЗначений;
+ СписокЗаменяемых.ЗагрузитьЗначения(ЗаменяемыеСсылки.Выгрузить().ВыгрузитьКолонку("Ссылка"));
+ ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
+ Список,
+ "Ссылка",
+ СписокЗаменяемых,
+ ВидСравненияКомпоновкиДанных.НеВСписке,
+ НСтр("ru = 'Не показывать заменяемые'"),
+ Истина,
+ РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный,
+ "5bf5cd06-c1fd-4bd3-94b9-4e9803e90fd5");
+
Если ОбщийВладелецЗаменяемыхСсылок <> Неопределено Тогда
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Список, "Владелец", ОбщийВладелецЗаменяемыхСсылок );
КонецЕсли;
@@ -71,7 +78,7 @@
Элементы.ПодсказкаВыбораЦелевогоЭлемента.Заголовок = НСтр("ru = 'Элемент для замены не выбран.'");
// Пошаговый мастер
- ИнициализироватьМастер(Элементы.ШагиМастера, Элементы.Далее, Элементы.Назад, Элементы.Отмена);
+ НастройкиПошаговогоМастера = ИнициализироватьМастер(Элементы.ШагиМастера, Элементы.Далее, Элементы.Назад, Элементы.Отмена);
// Добавляем шаги, зависящие от логики формы.
ИнициализироватьСценарийМастера();
@@ -93,13 +100,23 @@
&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
-
- Если ПодтверждениеЗакрытияФормы <> Истина Тогда
- Оповещение = Новый ОписаниеОповещения("ЗакрытиеФормыЗавершение", ЭтотОбъект);
+
+ // Проверка задания.
+ Если НастройкиПошаговогоМастера.ЗаданиеВыполнено = Ложь
+ И НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания <> Неопределено
+ И НастройкиПошаговогоМастера.ЕстьПодтверждениеОтменыЗадания = Ложь Тогда
Отказ = Истина;
-
- Текст = НСтр("ru = 'Закрыть замену элементов?'");
- ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет);
+ ФоновоеЗаданиеЗагрузитьНаКлиенте(Ложь, Истина);
+ КонецЕсли;
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПриЗакрытии()
+
+ Если НастройкиПошаговогоМастера.ЗаданиеВыполнено = Ложь
+ И НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания <> Неопределено Тогда
+ ФоновоеЗаданиеОтменить();
КонецЕсли;
КонецПроцедуры
@@ -215,36 +232,6 @@
КонецПроцедуры
-// Общий обработчик подтверждения закрытия.
-&НаКлиенте
-Процедура ЗакрытиеФормыЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
- Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
- ЗавершитьРаботуФормы();
- Иначе
- ПодтверждениеЗакрытияФормы = Неопределено;
- КонецЕсли;
-КонецПроцедуры
-
-&НаКлиенте
-Процедура ЗавершитьРаботуФормы(ПоказатьОповещение = Ложь)
-
- ОтменитьДлительнуюОперациюМастера();
-
- Если ПоказатьОповещение <> Неопределено Тогда
- ПоказатьОповещениеПользователя( , ПолучитьНавигационнуюСсылку(ЦелевойЭлемент),
- СообщениеОЗавершении(), БиблиотекаКартинок.Информация32);
- СписокОбновленного = Новый Массив;
- Для Каждого Строка Из ЗаменяемыеСсылки Цикл
- СписокОбновленного.Добавить(Строка.Ссылка);
- КонецЦикла;
- ОповеститьОбУспешнойЗамене(СписокОбновленного);
- КонецЕсли;
-
- // Закрываем без дополнительных вопросов.
- ПодтверждениеЗакрытияФормы = Истина;
- Закрыть();
-КонецПроцедуры
-
&НаКлиентеНаСервереБезКонтекста
Процедура СформироватьЦелевойЭлементИПодсказку(Контекст)
@@ -348,45 +335,6 @@
КонецФункции
-&НаСервере
-Процедура ЗапуститьЗаменуСсылок()
-
- ЦелевойЭлементРезультат = ЦелевойЭлемент;
- ПолноеИмяМетода = "ПоискИУдалениеДублей.ЗаменитьСсылки";
-
- ПарыЗамен = Новый Соответствие;
- Для Каждого Строка Из ЗаменяемыеСсылки Цикл
- ПарыЗамен.Вставить(Строка.Ссылка, ЦелевойЭлемент);
- КонецЦикла;
-
- ПараметрыЗамены = Новый Структура;
- ПараметрыЗамены.Вставить("СпособУдаления", ТекущийВариантУдаления);
- ПараметрыЗамены.Вставить("ВключатьБизнесЛогику", Истина);
-
- ПараметрыМетода = Новый Структура;
- ПараметрыМетода.Вставить("ПарыЗамен", ПарыЗамен);
- ПараметрыМетода.Вставить("Параметры", ПараметрыЗамены);
-
- ЗапуститьДлительнуюОперациюМастера(ПолноеИмяМетода, ПараметрыМетода);
-
-КонецПроцедуры
-
-&НаСервере
-Функция ПроверитьСостояниеИОбработатьЗаменуСсылок()
-
- ПроверитьСостояниеДлительнойОперации();
-
- Результат = Неопределено;
- Если НастройкиПошаговогоМастера.ЗаданиеВыполнено И НастройкиПошаговогоМастера.ИнформацияОбОшибке = Неопределено Тогда
- Результат = ПолучитьИзВременногоХранилища(НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания);
- Результат = Не ЗаполнитьНеудачныеЗамены(Результат);
- КонецЕсли;
-
- Возврат Новый Структура("Завершено,ИнформацияОбОшибке,Результат",
- НастройкиПошаговогоМастера.ЗаданиеВыполнено, НастройкиПошаговогоМастера.ИнформацияОбОшибке, Результат);
-
-КонецФункции
-
&НаСервере
Функция ЗаполнитьНеудачныеЗамены(Знач РезультатыЗамены)
// РезультатыЗамены - таблица с колонками Ссылка, ОбъектОшибки, ТипОшибки, ТекстОшибки.
@@ -565,11 +513,21 @@
КонецЕсли;
ИмяТаблицы = ОсновныеМетаданные.ПолноеИмя();
- Запрос = Новый Запрос("
- |ВЫБРАТЬ Ссылка КАК Ссылка" + ДополнительныеПоля + " ПОМЕСТИТЬ ЗаменяемыеСсылки
- |ИЗ " + ИмяТаблицы + " ГДЕ Ссылка В (&НаборСсылок)
- |ИНДЕКСИРОВАТЬ ПО Владелец, ЭтоГруппа
+ Запрос = Новый Запрос(
+ "ВЫБРАТЬ
+ |Ссылка КАК Ссылка
+ |" + ДополнительныеПоля + "
+ |ПОМЕСТИТЬ ЗаменяемыеСсылки
+ |ИЗ
+ | " + ИмяТаблицы + "
+ |ГДЕ
+ | Ссылка В (&НаборСсылок)
+ |ИНДЕКСИРОВАТЬ ПО
+ | Владелец,
+ | ЭтоГруппа
|;
+ |
+ |////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Владелец) КАК КоличествоВладельцев,
| МИНИМУМ(Владелец) КАК ОбщийВладелец,
@@ -578,18 +536,24 @@
|ИЗ
| ЗаменяемыеСсылки
|;
+ |
+ |////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| ЦелеваяТаблица.Ссылка
|ИЗ
| " + ИмяТаблицы + " КАК ЦелеваяТаблица
- |ЛЕВОЕ СОЕДИНЕНИЕ ЗаменяемыеСсылки ПО ЗаменяемыеСсылки.Ссылка = ЦелеваяТаблица.Ссылка
- |ГДЕ ЗаменяемыеСсылки.Ссылка IS NULL");
+ | ЛЕВОЕ СОЕДИНЕНИЕ ЗаменяемыеСсылки КАК ЗаменяемыеСсылки
+ | ПО ЦелеваяТаблица.Ссылка = ЗаменяемыеСсылки.Ссылка
+ | И ЦелеваяТаблица.Владелец = ЗаменяемыеСсылки.Владелец
+ |ГДЕ
+ | ЗаменяемыеСсылки.Ссылка ЕСТЬ NULL
+ | И НЕ ЦелеваяТаблица.ЭтоГруппа");
- Если ЕстьВладельцы Тогда
- Запрос.Текст = Запрос.Текст + " И ЦелеваяТаблица.Владелец = ЗаменяемыеСсылки.Владелец";
+ Если Не ЕстьВладельцы Тогда
+ Запрос.Текст = СтрЗаменить(Запрос.Текст, "И ЦелеваяТаблица.Владелец = ЗаменяемыеСсылки.Владелец", "");
КонецЕсли;
- Если ЕстьГруппы Тогда
- Запрос.Текст = Запрос.Текст + " И НЕ ЦелеваяТаблица.ЭтоГруппа";
+ Если Не ЕстьГруппы Тогда
+ Запрос.Текст = СтрЗаменить(Запрос.Текст, "И НЕ ЦелеваяТаблица.ЭтоГруппа", "");
КонецЕсли;
Запрос.УстановитьПараметр("НаборСсылок", МассивСсылок);
@@ -685,9 +649,6 @@
ДействиеШагаМастера("ПередДействиемНазад", "ШагПовторЗаменыПередДействиемНазад",
ДействиеШагаМастера("ПередДействиемОтмена", "ШагПовторЗаменыПередДействиемОтмена")))),
КнопкиМастера);
-
- // Вариант завершения работы - или демонстрацией страницы или всплывающим сообщением и закрытием.
- УстановитьПараметрПользователяМастера(ЭтотОбъект, "СообщатьОбУспехеВсплывающимОкном", Истина);
КонецПроцедуры
&НаКлиенте
@@ -743,61 +704,27 @@
&НаКлиенте
Процедура ШагВыборЦелевогоЭлементаПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт
- // Запрос подтверждения на отмену.
- ТекстВопроса = НСтр("ru = 'Отменить замену элементов и закрыть?'");
- Описание = Новый ОписаниеОповещения("ЗавершениеОтменыИЗакрытиеФормы", ЭтотОбъект, Новый Структура);
- Описание.ДополнительныеПараметры.Вставить("ПараметрыШага", ПараметрыШага);
-
- ПоказатьВопрос(Описание, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
+ Закрыть();
КонецПроцедуры
&НаКлиенте
Процедура ШагЗаменаПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт
// Стартуем длительную обработку по замене.
- ЗапуститьЗаменуСсылок();
+ ФоновоеЗаданиеЗапустить();
КонецПроцедуры
&НаКлиенте
Процедура ШагЗаменаПриОбработкеОжидания(Прекратить, Знач ДополнительныеПараметры) Экспорт
- // Ожидаем завершения замены ссылок.
- СостояниеОперации = ПроверитьСостояниеИОбработатьЗаменуСсылок();
- Если Не СостояниеОперации.Завершено Тогда
- Возврат;
- КонецЕсли;
-
- Если СостояниеОперации.ИнформацияОбОшибке = Неопределено Тогда
- // Выполнено успешно
- Если СостояниеОперации.Результат = Истина Тогда
- // Успешно заменили все элементы.
- Если Истина = ПрочитатьПараметрПользователяМастера(ЭтотОбъект, "СообщатьОбУспехеВсплывающимОкном") Тогда
- ЗавершитьРаботуФормы(Истина);
- Иначе
- // Переходим на страницу завершения.
- ШагМастера("Далее");
- КонецЕсли;
-
- Иначе
- // Остались необработанные, переходим на попытку повтора.
- ПерейтиНаШагМастера(Элементы.ШагПовторЗамены, Истина);
- КонецЕсли
- Иначе
- // Фоновое задание завершено с ошибкой.
+ Если ФоновоеЗаданиеЗагрузитьНаКлиенте(Ложь, Ложь) Тогда
Прекратить = Истина;
- ПоказатьПредупреждение(, СостояниеОперации.ИнформацияОбОшибке);
- ПерейтиНаШагМастера(Элементы.ШагВыборЦелевогоЭлемента);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ШагЗаменаПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт
- // Запрос подтверждения на отмену.
- ТекстВопроса = НСтр("ru = 'Прервать процесс замены и закрыть?'");
- Описание = Новый ОписаниеОповещения("ЗавершениеОтменыИЗакрытиеФормы", ЭтотОбъект, Новый Структура);
- Описание.ДополнительныеПараметры.Вставить("ПараметрыШага", ПараметрыШага);
-
- ПоказатьВопрос(Описание, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
+ ПроверитьФоновоеЗаданиеИЗакрытьФормуБезПодтверждения();
КонецПроцедуры
&НаКлиенте
@@ -818,9 +745,7 @@
&НаКлиенте
Процедура ШагУспешногоЗавершенияПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт
-
- ЗавершитьРаботуФормы();
-
+ Закрыть();
КонецПроцедуры
&НаКлиенте
@@ -847,9 +772,7 @@
&НаКлиенте
Процедура ШагПовторЗаменыПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт
-
- ЗавершитьРаботуФормы();
-
+ Закрыть();
КонецПроцедуры
// Возвращает список успешно замененных ссылок, тех которых нет в НеудачныеЗамены.
@@ -875,18 +798,6 @@
Возврат Результат;
КонецФункции
-// Общий обработчик немодального продолжения отмены с закрытием.
-&НаКлиенте
-Процедура ЗавершениеОтменыИЗакрытиеФормы(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
- Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
- // Подтверждаем продолжение процесса.
- ЗавершитьШагМастера(ДополнительныеПараметры.ПараметрыШага);
- Возврат;
- КонецЕсли;
-
- ЗавершитьРаботуФормы();
-КонецПроцедуры
-
&НаКлиенте
Процедура ПодтверждениеВыбораЦелевогоЭлемента(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
@@ -916,44 +827,44 @@
КонецПроцедуры
-// Инициализирует структуры мастера.
-//
-// Параметры:
-// ГруппаСтраниц - ГруппаФормы - Элемент формы, группа типа "страницы", содержащая в себе страницы-шаги мастера.
-// КнопкаДалее - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Далее".
-// КнопкаНазад - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Назад".
-// КнопкаОтмена - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Отмена".
-//
&НаСервере
-Процедура ИнициализироватьМастер(Знач ГруппаСтраниц, Знач КнопкаДалее, Знач КнопкаНазад, Знач КнопкаОтмена)
+Функция ИнициализироватьМастер(Знач ГруппаСтраниц, Знач КнопкаДалее, Знач КнопкаНазад, Знач КнопкаОтмена)
+ // Инициализирует структуры мастера.
+ //
+ // Параметры:
+ // ГруппаСтраниц - ГруппаФормы - Элемент формы, группа типа "страницы", содержащая в себе страницы-шаги мастера.
+ // КнопкаДалее - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Далее".
+ // КнопкаНазад - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Назад".
+ // КнопкаОтмена - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Отмена".
- НастройкиМастера = Новый Структура;
+ Результат = Новый Структура;
- НастройкиМастера.Вставить("Шаги", Новый Массив);
- НастройкиМастера.Вставить("НомерТекущегоШага", 0);
- НастройкиМастера.Вставить("СтраницаСтарта", Неопределено);
+ Результат.Вставить("Шаги", Новый Массив);
+ Результат.Вставить("НомерТекущегоШага", 0);
+ Результат.Вставить("СтраницаСтарта", Неопределено);
// Идентификаторы частей интерфейса.
- НастройкиМастера.Вставить("ГруппаСтраниц", ГруппаСтраниц.Имя);
- НастройкиМастера.Вставить("КнопкаДалее", КнопкаДалее.Имя);
- НастройкиМастера.Вставить("КнопкаНазад", КнопкаНазад.Имя);
- НастройкиМастера.Вставить("КнопкаОтмена", КнопкаОтмена.Имя);
+ Результат.Вставить("ГруппаСтраниц", ГруппаСтраниц.Имя);
+ Результат.Вставить("КнопкаДалее", КнопкаДалее.Имя);
+ Результат.Вставить("КнопкаНазад", КнопкаНазад.Имя);
+ Результат.Вставить("КнопкаОтмена", КнопкаОтмена.Имя);
// Таймаут вызова обработчика
- НастройкиМастера.Вставить("ТаймаутОжиданияДлительнойОперации",
+ Результат.Вставить("ТаймаутОжиданияДлительнойОперации",
?( ПолучитьСкоростьКлиентскогоСоединения() = СкоростьКлиентскогоСоединения.Низкая, 4, 2) );
-
+
// Для обработки длительных операций.
- НастройкиМастера.Вставить("ИдентификаторФоновогоЗадания");
- НастройкиМастера.Вставить("АдресРезультатаФоновогоЗадания");
- НастройкиМастера.Вставить("ИнформацияОбОшибке");
- НастройкиМастера.Вставить("ЗаданиеВыполнено", Ложь);
+ Результат.Вставить("ИдентификаторФоновогоЗадания");
+ Результат.Вставить("АдресРезультатаФоновогоЗадания");
+ Результат.Вставить("ИнформацияОбОшибке");
+ Результат.Вставить("ЗаданиеВыполнено", Ложь);
+ Результат.Вставить("ЕстьПодтверждениеОтменыЗадания", Ложь);
// Для хранения пользовательских параметров.
- НастройкиМастера.Вставить("ПользовательскиеПараметры", Новый Соответствие);
+ Результат.Вставить("ПользовательскиеПараметры", Новый Соответствие);
- НастройкиПошаговогоМастера = НастройкиМастера;
-КонецПроцедуры
+ Возврат Результат;
+КонецФункции
// Добавляет шаг мастера. Переходы между страницами будут происходить согласно порядку добавления.
//
@@ -1004,7 +915,7 @@
// Заголовок = "Отмена", Доступность = Истина, Видимость = Истина, КнопкаПоУмолчанию = Ложь;
//
// Для составления параметров рекомендуется использовать вспомогательные методы "ДобавитьШагМастера",
-// "ДействиеШагаМастера", "КнопкаШагаМастера".
+// "ДействиеШагаМастера", "КнопкиМастера".
//
&НаСервере
Процедура ДобавитьШагМастера(Знач Страница, Знач Действия, Знач Кнопки)
@@ -1104,22 +1015,6 @@
Возврат Результат;
КонецФункции
-// Читает пользовательский параметр мастера.
-&НаКлиентеНаСервереБезКонтекста
-Функция ПрочитатьПараметрПользователяМастера(Форма, Знач ИмяПараметраМастера)
-
- Возврат Форма.НастройкиПошаговогоМастера.ПользовательскиеПараметры[ИмяПараметраМастера];
-
-КонецФункции
-
-// Устанавливает пользовательский параметр мастера.
-&НаКлиентеНаСервереБезКонтекста
-Функция УстановитьПараметрПользователяМастера(Форма, Знач ИмяПараметраМастера, Знач ЗначениеПараметраМастера)
-
- Форма.НастройкиПошаговогоМастера.ПользовательскиеПараметры.Вставить(ИмяПараметраМастера, ЗначениеПараметраМастера);
-
-КонецФункции
-
// Устанавливает начальную страницу для первого запуска мастера.
//
// Параметры:
@@ -1137,15 +1032,13 @@
//
&НаКлиенте
Процедура ЗапуститьРаботуМастера()
- НастройкиМастера = НастройкиПошаговогоМастера;
-
- Если НастройкиМастера.СтраницаСтарта = Неопределено Тогда
+ Если НастройкиПошаговогоМастера.СтраницаСтарта = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'Перед запуском мастера должна быть установлена начальная страница.'");
- ИначеЕсли НастройкиМастера.СтраницаСтарта = -1 Тогда
+ ИначеЕсли НастройкиПошаговогоМастера.СтраницаСтарта = -1 Тогда
// Разогрев. Проверяем наличие обработчиков действий у всех шагов.
ВозможныеДействия = Новый Структура("ПриАктивации, ПередДействиемДалее, ПередДействиемНазад, ПередДействиемОтмена, ПриОбработкеОжидания");
- Для Каждого ОписаниеШага Из НастройкиМастера.Шаги Цикл
+ Для Каждого ОписаниеШага Из НастройкиПошаговогоМастера.Шаги Цикл
Для Каждого КлючЗначение Из ВозможныеДействия Цикл
ИмяДействия = КлючЗначение.Ключ;
ИмяОбработчика = ОписаниеШага[ИмяДействия];
@@ -1166,15 +1059,15 @@
КонецЦикла;
// Фактический запуск
- ПерейтиНаШагМастера(НастройкиМастера.НомерТекущегоШага, Истина);
+ ПерейтиНаШагМастера(НастройкиПошаговогоМастера.НомерТекущегоШага, Истина);
Иначе
// По умолчанию все отключено
- Элементы[НастройкиМастера.КнопкаДалее].Видимость = Ложь;
- Элементы[НастройкиМастера.КнопкаНазад].Видимость = Ложь;
- Элементы[НастройкиМастера.КнопкаОтмена].Видимость = Ложь;
+ Элементы[НастройкиПошаговогоМастера.КнопкаДалее].Видимость = Ложь;
+ Элементы[НастройкиПошаговогоМастера.КнопкаНазад].Видимость = Ложь;
+ Элементы[НастройкиПошаговогоМастера.КнопкаОтмена].Видимость = Ложь;
// Отложенный запуск
- НастройкиПошаговогоМастера.НомерТекущегоШага = НастройкиМастера.СтраницаСтарта;
+ НастройкиПошаговогоМастера.НомерТекущегоШага = НастройкиПошаговогоМастера.СтраницаСтарта;
НастройкиПошаговогоМастера.СтраницаСтарта = -1;
ПодключитьОбработчикОжидания("ЗапуститьРаботуМастера", 0.1, Истина);
КонецЕсли;
@@ -1187,8 +1080,6 @@
//
&НаКлиенте
Процедура ШагМастера(Знач КодКоманды)
- НастройкиМастера = НастройкиПошаговогоМастера;
-
Если КодКоманды = "Далее" Тогда
Направление = 1;
ИначеЕсли КодКоманды = "Назад" Тогда
@@ -1198,8 +1089,8 @@
Иначе
ВызватьИсключение НСтр("ru = 'Некорректная команда шага помощника'");
КонецЕсли;
-
- ОписаниеШага = НастройкиМастера.Шаги[НастройкиМастера.НомерТекущегоШага];
+
+ ОписаниеШага = НастройкиПошаговогоМастера.Шаги[НастройкиПошаговогоМастера.НомерТекущегоШага];
// Останавливаем обработчик, если есть.
Если ОписаниеШага.ПриОбработкеОжидания <> Неопределено Тогда
@@ -1209,13 +1100,10 @@
// Отрабатываем уход с текущей страницы.
Если Направление = 1 Тогда
Действие = ОписаниеШага.ПередДействиемДалее;
-
ИначеЕсли Направление = -1 Тогда
Действие = ОписаниеШага.ПередДействиемНазад;
-
Иначе
Действие = ОписаниеШага.ПередДействиемОтмена;
-
КонецЕсли;
Если ПустаяСтрока(Действие) Тогда
@@ -1234,8 +1122,6 @@
//
&НаКлиенте
Процедура ПерейтиНаШагМастера(Знач ИдентификаторШага, Знач ИнициироватьСобытия = Ложь)
- НастройкиМастера = НастройкиПошаговогоМастера;
-
СледующийШаг = НомерШагаМастераПоИдентификатору(ИдентификаторШага);
Если СледующийШаг = Неопределено Тогда
Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
@@ -1245,7 +1131,7 @@
ВызватьИсключение Ошибка;
КонецЕсли;
- ОписаниеШага = НастройкиМастера.Шаги[НастройкиМастера.НомерТекущегоШага];
+ ОписаниеШага = НастройкиПошаговогоМастера.Шаги[НастройкиПошаговогоМастера.НомерТекущегоШага];
// Останавливаем обработчик, если есть.
Если ОписаниеШага.ПриОбработкеОжидания <> Неопределено Тогда
@@ -1263,10 +1149,8 @@
//
&НаКлиенте
Процедура ЗавершитьШагМастера(Знач ПараметрыШага)
- НастройкиМастера = НастройкиПошаговогоМастера;
-
- СледующийШаг = НастройкиМастера.НомерТекущегоШага + ПараметрыШага;
- ПоследнийШаг = НастройкиМастера.Шаги.ВГраница();
+ СледующийШаг = НастройкиПошаговогоМастера.НомерТекущегоШага + ПараметрыШага;
+ ПоследнийШаг = НастройкиПошаговогоМастера.Шаги.ВГраница();
Если ПараметрыШага = 0 Тогда
// Подтверждение отмены - ничего не делаем.
@@ -1287,15 +1171,13 @@
&НаКлиенте
Процедура ШагМастераЗавершениеБезусловно(Знач СледующийШаг, Знач ИнициироватьСобытия = Истина)
- НастройкиМастера = НастройкиПошаговогоМастера;
-
- ОписаниеШага = НастройкиМастера.Шаги[СледующийШаг];
- ПоследнийШаг = НастройкиМастера.Шаги.ВГраница();
+ ОписаниеШага = НастройкиПошаговогоМастера.Шаги[СледующийШаг];
+ ПоследнийШаг = НастройкиПошаговогоМастера.Шаги.ВГраница();
// Переключаем на новую страницу.
- Элементы[НастройкиМастера.ГруппаСтраниц].ТекущаяСтраница = Элементы[ОписаниеШага.Страница];
+ Элементы[НастройкиПошаговогоМастера.ГруппаСтраниц].ТекущаяСтраница = Элементы[ОписаниеШага.Страница];
// Обход особенности платформы.
- ГруппаСтраницМастера = Элементы[НастройкиМастера.ГруппаСтраниц];
+ ГруппаСтраницМастера = Элементы[НастройкиПошаговогоМастера.ГруппаСтраниц];
НоваяТекущаяСтраница = Элементы[ОписаниеШага.Страница];
ВидГруппыСтраница = ВидГруппыФормы.Страница;
ТипГруппаФормы = Тип("ГруппаФормы");
@@ -1306,9 +1188,9 @@
КонецЦикла;
// Обновляем кнопки
- ОбновитьСвойстваКнопкиМастера(НастройкиМастера.КнопкаДалее, ОписаниеШага.КнопкаДалее);
- ОбновитьСвойстваКнопкиМастера(НастройкиМастера.КнопкаНазад, ОписаниеШага.КнопкаНазад);
- ОбновитьСвойстваКнопкиМастера(НастройкиМастера.КнопкаОтмена, ОписаниеШага.КнопкаОтмена);
+ ОбновитьСвойстваКнопкиМастера(НастройкиПошаговогоМастера.КнопкаДалее, ОписаниеШага.КнопкаДалее);
+ ОбновитьСвойстваКнопкиМастера(НастройкиПошаговогоМастера.КнопкаНазад, ОписаниеШага.КнопкаНазад);
+ ОбновитьСвойстваКнопкиМастера(НастройкиПошаговогоМастера.КнопкаОтмена, ОписаниеШага.КнопкаОтмена);
// Успешно перешли
НастройкиПошаговогоМастера.НомерТекущегоШага = СледующийШаг;
@@ -1335,9 +1217,7 @@
&НаКлиенте
Процедура ОбработкаАктивацииСтраницыМастера()
- НастройкиМастера = НастройкиПошаговогоМастера;
-
- ОписаниеШага = НастройкиМастера.Шаги[НастройкиМастера.НомерТекущегоШага];
+ ОписаниеШага = НастройкиПошаговогоМастера.Шаги[НастройкиПошаговогоМастера.НомерТекущегоШага];
Если Не ПустаяСтрока(ОписаниеШага.ПриАктивации) Тогда
Оповещение = Новый ОписаниеОповещения(ОписаниеШага.ПриАктивации, ЭтотОбъект);
ВыполнитьОбработкуОповещения(Оповещение, Элементы[ОписаниеШага.Страница]);
@@ -1351,34 +1231,27 @@
КонецПроцедуры
// Может быть номер шага или группа-страница, или ее идентификатор.
-//
&НаКлиенте
Функция НомерШагаМастераПоИдентификатору(Знач ИдентификаторШага)
- НастройкиМастера = НастройкиПошаговогоМастера;
- НомерШага = Неопределено;
-
ТипПараметра = ТипЗнч(ИдентификаторШага);
Если ТипПараметра = Тип("Число") Тогда
- НомерШага = ИдентификаторШага;
- Иначе
- ИмяПоиска = ?(ТипПараметра = Тип("ГруппаФормы"), ИдентификаторШага.Имя, ИдентификаторШага);
- Для НомерШага=0 По НастройкиМастера.Шаги.ВГраница() Цикл
- Если НастройкиМастера.Шаги[НомерШага].Страница = ИмяПоиска Тогда
- НомерШага = НомерШага;
- Прервать;
- КонецЕсли;
- КонецЦикла;
+ Возврат ИдентификаторШага;
КонецЕсли;
- Возврат НомерШага;
+ ИмяПоиска = ?(ТипПараметра = Тип("ГруппаФормы"), ИдентификаторШага.Имя, ИдентификаторШага);
+ Для НомерШага=0 По НастройкиПошаговогоМастера.Шаги.ВГраница() Цикл
+ Если НастройкиПошаговогоМастера.Шаги[НомерШага].Страница = ИмяПоиска Тогда
+ Возврат НомерШага;
+ КонецЕсли;
+ КонецЦикла;
+
+ ВызватьИсключение СтрЗаменить(НСтр("ru = 'Не найден шаг ""%1"".'"), "%1", ИмяПоиска);
КонецФункции
// Возвращает флаг отмены
&НаКлиенте
Функция ОбработкаОжиданияСтраницыМастера()
- НастройкиМастера = НастройкиПошаговогоМастера;
-
- ОписаниеШага = НастройкиМастера.Шаги[НастройкиМастера.НомерТекущегоШага];
+ ОписаниеШага = НастройкиПошаговогоМастера.Шаги[НастройкиПошаговогоМастера.НомерТекущегоШага];
Действие = ОписаниеШага.ПриОбработкеОжидания;
Если ПустаяСтрока(Действие) Тогда
Возврат Ложь;
@@ -1391,83 +1264,180 @@
Продолжать = Не Прекратить;
Если Продолжать Тогда
- ПодключитьОбработчикОжидания("ОбработкаОжиданияСтраницыМастера", НастройкиМастера.ТаймаутОжиданияДлительнойОперации, Истина);
+ ПодключитьОбработчикОжидания("ОбработкаОжиданияСтраницыМастера", НастройкиПошаговогоМастера.ТаймаутОжиданияДлительнойОперации, Истина);
КонецЕсли;
Возврат Продолжать;
КонецФункции
-&НаСервере
-Функция ЗапуститьДлительнуюОперациюМастера(Знач ИмяМетода, Знач ПараметрыМетода)
+&НаКлиенте
+Процедура ПослеПодтвержденияОтменыЗаданияИЗакрытияФормы(Ответ, ПараметрыВыполнения) Экспорт
+ Если Ответ = КодВозвратаДиалога.Прервать Тогда
+ ПроверитьФоновоеЗаданиеИЗакрытьФормуБезПодтверждения();
+ Иначе
+ ОбработкаОжиданияСтраницыМастера();
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПроверитьФоновоеЗаданиеИЗакрытьФормуБезПодтверждения()
+ Если Не ФоновоеЗаданиеЗагрузитьНаКлиенте(Истина, Ложь) Тогда
+ НастройкиПошаговогоМастера.ЕстьПодтверждениеОтменыЗадания = Истина;
+ Закрыть();
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Функция ФоновоеЗаданиеЗагрузитьНаКлиенте(ПрерватьЕслиНеВыполнено, ПоказатьДиалогПередЗакрытием)
- // Отменяем возможно незавершенное предыдущее.
- ОтменитьДлительнуюОперациюМастера();
+ ОтключитьОбработчикОжидания("ОбработкаОжиданияСтраницыМастера");
- Попытка
- Задание = ДлительныеОперации.ЗапуститьВыполнениеВФоне(УникальныйИдентификатор, ИмяМетода, ПараметрыМетода);
- Исключение
- НастройкиПошаговогоМастера.ЗаданиеВыполнено = Истина;
- НастройкиПошаговогоМастера.ИнформацияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
- НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено;
- НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = Неопределено;
- КонецПопытки;
-
- Если Задание <> Неопределено Тогда
- НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = Задание.АдресХранилища;
- Если Задание.ЗаданиеВыполнено Тогда
- НастройкиПошаговогоМастера.ЗаданиеВыполнено = Истина;
- НастройкиПошаговогоМастера.ИнформацияОбОшибке = Неопределено;
- НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено;
- Иначе
- НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Задание.ИдентификаторЗадания;
+ ИнформацияОЗадании = ФоновоеЗаданиеЗагрузитьРезультат(ПрерватьЕслиНеВыполнено);
+ Если Не ИнформацияОЗадании.Завершено Тогда
+ Если ПоказатьДиалогПередЗакрытием Тогда
+ Обработчик = Новый ОписаниеОповещения("ПослеПодтвержденияОтменыЗаданияИЗакрытияФормы", ЭтотОбъект);
+ ТекстВопроса = НСтр("ru = 'Прервать замену элементов и закрыть форму?'");
+
+ Кнопки = Новый СписокЗначений;
+ Кнопки.Добавить(КодВозвратаДиалога.Прервать, НСтр("ru = 'Прервать'"));
+ Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Не прерывать'"));
+
+ ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, , КодВозвратаДиалога.Нет);
КонецЕсли;
+ Возврат Ложь;
КонецЕсли;
+ Если ИнформацияОЗадании.ИнформацияОбОшибке = Неопределено Тогда
+ Если ИнформацияОЗадании.Результат = Истина Тогда
+ // Полностью успешно - закрыть форму и вывести оповещение.
+ ПоказатьОповещениеПользователя(,
+ ПолучитьНавигационнуюСсылку(ЦелевойЭлемент),
+ СообщениеОЗавершении(),
+ БиблиотекаКартинок.Информация32);
+ СписокОбновленного = Новый Массив;
+ Для Каждого Строка Из ЗаменяемыеСсылки Цикл
+ СписокОбновленного.Добавить(Строка.Ссылка);
+ КонецЦикла;
+ ОповеститьОбУспешнойЗамене(СписокОбновленного);
+ // Закрываем форму.
+ Закрыть();
+ Иначе
+ // Частично успешно - вывести расшифровку.
+ ПерейтиНаШагМастера(Элементы.ШагПовторЗамены, Истина);
+ Активизировать();
+ КонецЕсли
+ Иначе
+ // Фоновое задание завершено с ошибкой.
+ ПоказатьПредупреждение(, ИнформацияОЗадании.ИнформацияОбОшибке);
+ ПерейтиНаШагМастера(Элементы.ШагВыборЦелевогоЭлемента);
+ Активизировать();
+ КонецЕсли;
+
+ Возврат Истина;
КонецФункции
&НаСервере
-Процедура ПроверитьСостояниеДлительнойОперации()
+Функция ФоновоеЗаданиеЗапустить()
+ // Отмена предыдущего задания.
+ ФоновоеЗаданиеОтменить();
- Если НастройкиПошаговогоМастера.ЗаданиеВыполнено Тогда
- НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено;
- Возврат;
+ // Определение параметров запуска.
+ ЦелевойЭлементРезультат = ЦелевойЭлемент;
+
+ ПарыЗамен = Новый Соответствие;
+ Для Каждого Строка Из ЗаменяемыеСсылки Цикл
+ ПарыЗамен.Вставить(Строка.Ссылка, ЦелевойЭлемент);
+ КонецЦикла;
+
+ ПараметрыЗамены = Новый Структура;
+ ПараметрыЗамены.Вставить("СпособУдаления", ТекущийВариантУдаления);
+ ПараметрыЗамены.Вставить("ВключатьБизнесЛогику", Истина);
+
+ ПараметрыМетода = Новый Структура;
+ ПараметрыМетода.Вставить("ПарыЗамен", ПарыЗамен);
+ ПараметрыМетода.Вставить("Параметры", ПараметрыЗамены);
+
+ // Запуск.
+ ИнформацияОбОшибке = Неопределено;
+ Попытка
+ Задание = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
+ УникальныйИдентификатор,
+ "ПоискИУдалениеДублей.ЗаменитьСсылки",
+ ПараметрыМетода,
+ НСтр("ru = 'Поиск и удаление дублей: Замена ссылок'"));
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ КонецПопытки;
+ Если ИнформацияОбОшибке <> Неопределено Тогда
+ НастройкиПошаговогоМастера.ЗаданиеВыполнено = Истина;
+ НастройкиПошаговогоМастера.ИнформацияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
+ НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено;
+ НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = Неопределено;
+ Возврат Ложь;
КонецЕсли;
- Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания);
- Если Задание <> Неопределено Тогда
- Если Задание.ИнформацияОбОшибке <> Неопределено Тогда
- НастройкиПошаговогоМастера.ИнформацияОбОшибке = ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке);
- КонецЕсли;
- НастройкиПошаговогоМастера.ЗаданиеВыполнено = Задание.Состояние <> СостояниеФоновогоЗадания.Активно;
- Если НастройкиПошаговогоМастера.ЗаданиеВыполнено Тогда
- // Текущие сообщения фонового задания.
- НакопленныеСообщения = Задание.ПолучитьСообщенияПользователю(Истина);
- Если НакопленныеСообщения <> Неопределено Тогда
- Для Каждого Сообщение Из НакопленныеСообщения Цикл
- Сообщение.Сообщить();
- КонецЦикла;
+ НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = Задание.АдресХранилища;
+ НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Задание.ИдентификаторЗадания;
+ НастройкиПошаговогоМастера.ЗаданиеВыполнено = Задание.ЗаданиеВыполнено;
+
+ Если НастройкиПошаговогоМастера.ЗаданиеВыполнено Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ Возврат Истина;
+КонецФункции
+
+&НаСервере
+Функция ФоновоеЗаданиеЗагрузитьРезультат(Знач ПрерватьЕслиНеВыполнено = Ложь)
+ Если НастройкиПошаговогоМастера.ЗаданиеВыполнено Тогда
+ НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено;
+ Иначе
+ Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания);
+ Если Задание <> Неопределено Тогда
+ Если Задание.ИнформацияОбОшибке <> Неопределено Тогда
+ НастройкиПошаговогоМастера.ИнформацияОбОшибке = ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке);
+ КонецЕсли;
+ НастройкиПошаговогоМастера.ЗаданиеВыполнено = Задание.Состояние <> СостояниеФоновогоЗадания.Активно;
+ Если НастройкиПошаговогоМастера.ЗаданиеВыполнено Тогда
+ // Текущие сообщения фонового задания.
+ НакопленныеСообщения = Задание.ПолучитьСообщенияПользователю(Истина);
+ Если НакопленныеСообщения <> Неопределено Тогда
+ Для Каждого Сообщение Из НакопленныеСообщения Цикл
+ Сообщение.Сообщить();
+ КонецЦикла;
+ КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
-КонецПроцедуры
-
-// Отменяет текущую длительную операцию.
-&НаСервере
-Процедура ОтменитьДлительнуюОперациюМастера()
-
- Если НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания <> Неопределено Тогда
- Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания);
- Если Задание <> Неопределено Тогда
- Задание.Отменить();
+ Значение = Неопределено;
+ Если НастройкиПошаговогоМастера.ЗаданиеВыполнено Тогда
+ НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено;
+ Если НастройкиПошаговогоМастера.ИнформацияОбОшибке = Неопределено Тогда
+ Значение = ПолучитьИзВременногоХранилища(НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания);
+ Значение = Не ЗаполнитьНеудачныеЗамены(Значение);
КонецЕсли;
+ ИначеЕсли ПрерватьЕслиНеВыполнено Тогда
+ ФоновоеЗаданиеОтменить();
КонецЕсли;
- НастройкиПошаговогоМастера.ЗаданиеВыполнено = Ложь;
- НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = Неопределено;
- НастройкиПошаговогоМастера.ИнформацияОбОшибке = Неопределено;
- НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено;
+ ИнформацияОЗадании = Новый Структура;
+ ИнформацияОЗадании.Вставить("Завершено", НастройкиПошаговогоМастера.ЗаданиеВыполнено);
+ ИнформацияОЗадании.Вставить("ИнформацияОбОшибке", НастройкиПошаговогоМастера.ИнформацияОбОшибке);
+ ИнформацияОЗадании.Вставить("Результат", Значение);
+ Возврат ИнформацияОЗадании;
+КонецФункции
+
+&НаСервере
+Процедура ФоновоеЗаданиеОтменить()
+ Если НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания <> Неопределено Тогда
+ ДлительныеОперации.ОтменитьВыполнениеЗадания(НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания);
+ КонецЕсли;
+ НастройкиПошаговогоМастера.ЗаданиеВыполнено = Ложь;
+ НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = Неопределено;
+ НастройкиПошаговогоМастера.ИнформацияОбОшибке = Неопределено;
+ НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено;
КонецПроцедуры
#КонецОбласти
diff --git a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Form.form b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Form.form
index 907abc2a6..c09c7099d 100644
--- a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Form.form
+++ b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Form.form
@@ -2502,6 +2502,10 @@
OnCreateAtServerПриСозданииНаСервере
+
+ OnClose
+ ПриЗакрытии
+ AbortCancelIgnore
diff --git a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Help/ru.html b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Help/ru.html
index 79b43d371..0c8bf19d8 100644
--- a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Help/ru.html
+++ b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначено для устранения дублирующихся данных.
Открывается из списков программы по команде Еще - Объединить выделенные. Объединить можно несколько элементов, предварительно выделив их.
В списке элементов для объединения выводится:
diff --git a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Module.bsl b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Module.bsl
index 1985900e0..f9a66bded 100644
--- a/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Module.bsl
+++ b/SSL/src/DataProcessors/ЗаменаИОбъединениеЭлементов/Forms/ОбъединениеЭлементов/Module.bsl
@@ -5,15 +5,10 @@
// Может быть коллекцией элементов, обладающих полем "Ссылка".
//
-// Флаг подтверждения, используется при не модальном закрытии.
-&НаКлиенте
-Перем ПодтверждениеЗакрытияФормы;
-
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
-
УстановитьУсловноеОформление();
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
@@ -33,7 +28,7 @@
СобытиеОповещенияОЗамене = Обработки.ЗаменаИОбъединениеЭлементов.СобытиеОповещенияОЗамене();
ТекущийВариантУдаления = "Пометка";
- ИнициализироватьМастер(Элементы.ШагиМастера, Элементы.Далее, Элементы.Назад, Элементы.Отмена);
+ НастройкиПошаговогоМастера = ИнициализироватьМастер(Элементы.ШагиМастера, Элементы.Далее, Элементы.Назад, Элементы.Отмена);
// Добавляем шаги, зависящие от логики формы.
ИнициализироватьСценарийМастера();
@@ -55,14 +50,26 @@
&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
- // Проверяем клиентскую переменную.
- Если ПодтверждениеЗакрытияФормы<>Истина Тогда
- Оповещение = Новый ОписаниеОповещения("ЗакрытиеФормыЗавершение", ЭтотОбъект);
+
+ // Проверка задания.
+ Если НастройкиПошаговогоМастера.ИмяПроцедуры = "ЗаменитьСсылки" // Важно показывать только результат замены.
+ И НастройкиПошаговогоМастера.ЗаданиеВыполнено = Ложь
+ И НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания <> Неопределено
+ И НастройкиПошаговогоМастера.ЕстьПодтверждениеОтменыЗадания = Ложь Тогда
Отказ = Истина;
-
- Текст = НСтр("ru = 'Закрыть объединение элементов?'");
- ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет);
+ ФоновоеЗаданиеЗагрузитьНаКлиенте(Ложь, Истина);
КонецЕсли;
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПриЗакрытии()
+
+ Если НастройкиПошаговогоМастера.ЗаданиеВыполнено = Ложь
+ И НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания <> Неопределено Тогда
+ ФоновоеЗаданиеОтменить();
+ КонецЕсли;
+
КонецПроцедуры
#КонецОбласти
@@ -276,115 +283,61 @@
&НаСервере
Процедура УстановитьУсловноеОформление()
-
- УсловноеОформление.Элементы.Очистить();
-
- //
-
- Элемент = УсловноеОформление.Элементы.Добавить();
-
- ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
- ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МестаИспользованияОсновной.Имя);
-
- ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
- ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("МестаИспользования.Ссылка");
- ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
- ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ОсновнойЭлемент");
-
- Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
-
- //
-
- Элемент = УсловноеОформление.Элементы.Добавить();
-
- ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
- ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МестаИспользованияСсылка.Имя);
-
- ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
- ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МестаИспользованияКод.Имя);
-
- ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
- ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МестаИспользованияМестИспользования.Имя);
-
- ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
- ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("МестаИспользования.Ссылка");
- ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
- ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ОсновнойЭлемент");
-
- Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(WindowsШрифты.ШрифтДиалоговИМеню, , , Истина, Ложь, Ложь, Ложь, ));
-
- //
-
- Элемент = УсловноеОформление.Элементы.Добавить();
-
- ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
- ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МестаИспользованияНеИспользуется.Имя);
-
- ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
- ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("МестаИспользования.МестИспользования");
- ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
- ОтборЭлемента.ПравоеЗначение = 0;
-
- Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Истина);
- Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Истина);
-
- //
-
- Элемент = УсловноеОформление.Элементы.Добавить();
-
- ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
- ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МестаИспользованияНеИспользуется.Имя);
-
- ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
- ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("МестаИспользования.МестИспользования");
- ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
- ОтборЭлемента.ПравоеЗначение = 0;
-
- Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
- Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
-
- //
-
- Элемент = УсловноеОформление.Элементы.Добавить();
-
- ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
- ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МестаИспользованияМестИспользования.Имя);
-
- ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
- ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("МестаИспользования.МестИспользования");
- ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
- ОтборЭлемента.ПравоеЗначение = 0;
-
- Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
- Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
-
- //
-
- Элемент = УсловноеОформление.Элементы.Добавить();
-
- ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
- ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.НеудачныеЗаменыКод.Имя);
-
- ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
- ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НеудачныеЗамены.Код");
- ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
- Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);
-
- //
-
- Элемент = УсловноеОформление.Элементы.Добавить();
-
- ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
- ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МестаИспользованияМестИспользования.Имя);
-
- ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
- ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("МестаИспользования.МестИспользования");
- ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
- ОтборЭлемента.ПравоеЗначение = 0;
-
- Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Истина);
- Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Истина);
-
+
+ Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() = ВариантИнтерфейсаКлиентскогоПриложения.Версия8_2 Тогда
+ ШрифтВажнойНадписи = Новый Шрифт(, , Истина);
+ Иначе // Такси.
+ ШрифтВажнойНадписи = Новый Шрифт("Arial", 10, Истина, Ложь, Ложь, Ложь, 100);
+ КонецЕсли;
+
+ Инструкция = ПоискИУдалениеДублей.ИнструкцияУсловногоОформления();
+ Условие = Новый Структура("Вид, Значение", "НеРавно", Новый ПолеКомпоновкиДанных("ОсновнойЭлемент"));
+ Инструкция.Отборы.Вставить("МестаИспользования.Ссылка", Условие);
+ Инструкция.Поля = "МестаИспользованияОсновной";
+ Инструкция.Оформление.Вставить("Отображать", Ложь);
+ ПоискИУдалениеДублей.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция);
+
+ Инструкция = ПоискИУдалениеДублей.ИнструкцияУсловногоОформления();
+ Инструкция.Отборы.Вставить("МестаИспользования.Ссылка", Новый ПолеКомпоновкиДанных("ОсновнойЭлемент"));
+ Инструкция.Поля = "МестаИспользованияСсылка, МестаИспользованияКод, МестаИспользованияМестИспользования";
+ Инструкция.Оформление.Вставить("Шрифт", ШрифтВажнойНадписи);
+ ПоискИУдалениеДублей.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция);
+
+ Инструкция = ПоискИУдалениеДублей.ИнструкцияУсловногоОформления();
+ Инструкция.Отборы.Вставить("МестаИспользования.МестИспользования", Новый Структура("Вид, Значение", "МеньшеИлиРавно", 0));
+ Инструкция.Поля = "МестаИспользованияНеИспользуется";
+ Инструкция.Оформление.Вставить("Видимость", Истина);
+ Инструкция.Оформление.Вставить("Отображать", Истина);
+ ПоискИУдалениеДублей.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция);
+
+ Инструкция = ПоискИУдалениеДублей.ИнструкцияУсловногоОформления();
+ Инструкция.Отборы.Вставить("МестаИспользования.МестИспользования", Новый Структура("Вид, Значение", "Больше", 0));
+ Инструкция.Поля = "МестаИспользованияНеИспользуется";
+ Инструкция.Оформление.Вставить("Видимость", Ложь);
+ Инструкция.Оформление.Вставить("Отображать", Ложь);
+ ПоискИУдалениеДублей.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция);
+
+ Инструкция = ПоискИУдалениеДублей.ИнструкцияУсловногоОформления();
+ Инструкция.Отборы.Вставить("МестаИспользования.МестИспользования", Новый Структура("Вид, Значение", "МеньшеИлиРавно", 0));
+ Инструкция.Поля = "МестаИспользованияМестИспользования";
+ Инструкция.Оформление.Вставить("Видимость", Ложь);
+ Инструкция.Оформление.Вставить("Отображать", Ложь);
+ ПоискИУдалениеДублей.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция);
+
+ Инструкция = ПоискИУдалениеДублей.ИнструкцияУсловногоОформления();
+ Инструкция.Отборы.Вставить("НеудачныеЗамены.Код", Новый Структура("Вид, Значение", "НеЗаполнено"));
+ Инструкция.Поля = "НеудачныеЗаменыКод";
+ Инструкция.Оформление.Вставить("Видимость", Ложь);
+ Инструкция.Оформление.Вставить("Отображать", Ложь);
+ ПоискИУдалениеДублей.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция);
+
+ Инструкция = ПоискИУдалениеДублей.ИнструкцияУсловногоОформления();
+ Инструкция.Отборы.Вставить("МестаИспользования.МестИспользования", Новый Структура("Вид, Значение", "Больше", 0));
+ Инструкция.Поля = "МестаИспользованияМестИспользования";
+ Инструкция.Оформление.Вставить("Видимость", Истина);
+ Инструкция.Оформление.Вставить("Отображать", Истина);
+ ПоискИУдалениеДублей.ДобавитьЭлементУсловногоОформления(ЭтотОбъект, Инструкция);
+
КонецПроцедуры
&НаСервере
@@ -405,7 +358,7 @@
КонецЦикла;
КонецПроцедуры
-&НаСервереБезКонтекста
+&НаСервереБезКонтекста
Функция ПроверитьОбъединяемыеСсылки(Знач НаборСсылок)
Результат = Новый Структура("Ошибка, ОбщийВладелец");
@@ -471,15 +424,6 @@
Возврат Результат;
КонецФункции
-&НаКлиенте
-Процедура ЗакрытиеФормыЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
- Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
- ЗавершитьРаботуФормы();
- Иначе
- ПодтверждениеЗакрытияФормы = Неопределено;
- КонецЕсли;
-КонецПроцедуры
-
&НаКлиенте
Процедура МестаИспользованияПередУдалениемЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
@@ -510,43 +454,23 @@
СформироватьПодсказкуОбъединения();
КонецПроцедуры
-&НаКлиенте
-Процедура ЗавершитьРаботуФормы(ПоказатьОповещение = Ложь)
-
- ОтменитьДлительнуюОперациюМастера();
-
- Если ПоказатьОповещение <> Неопределено Тогда
- ПоказатьОповещениеПользователя( , ПолучитьНавигационнуюСсылку(ОсновнойЭлемент),
- СообщениеОЗавершении(), БиблиотекаКартинок.Информация32);
- СписокОбновленного = Новый Массив;
- Для Каждого Строка Из МестаИспользования Цикл
- СписокОбновленного.Добавить(Строка.Ссылка);
- КонецЦикла;
- ОповеститьОбУспешнойЗамене(СписокОбновленного);
- КонецЕсли;
-
- // Закрываем без дополнительных вопросов.
- ПодтверждениеЗакрытияФормы = Истина;
- Закрыть();
-КонецПроцедуры
-
&НаСервере
Процедура СформироватьПодсказкуОбъединения()
Если ЕстьПравоБезвозвратногоУдаления Тогда
Если ТекущийВариантУдаления = "Пометка" Тогда
- ТекстПодсказки = НСтр("ru = 'Все элементы списка (%1) будут помечены на удаление и заменены во всех местах
+ ТекстПодсказки = НСтр("ru = 'Элементы (%1) будут помечены на удаление и заменены во всех местах
|использования на ""%2"" (отмечен стрелкой).'");
Иначе
- ТекстПодсказки = НСтр("ru = 'Все элементы списка (%1) будут удалены безвозвратно и заменены во всех местах
+ ТекстПодсказки = НСтр("ru = 'Элементы (%1) будут удалены безвозвратно и заменены во всех местах
|использования на ""%2"" (отмечен стрелкой).'");
КонецЕсли;
Иначе
- ТекстПодсказки = НСтр("ru = 'Все элементы списка (%1) будут помечены на удаление и заменены во всех местах
+ ТекстПодсказки = НСтр("ru = 'Элементы (%1) будут помечены на удаление и заменены во всех местах
|использования на ""%2"" (отмечен стрелкой).'");
КонецЕсли;
- ТекстПодсказки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПодсказки, МестаИспользования.Количество(), ОсновнойЭлемент);
+ ТекстПодсказки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПодсказки, МестаИспользования.Количество()-1, ОсновнойЭлемент);
Элементы.ПодсказкаВыбораОсновногоЭлемента.Заголовок = СтроковыеФункцииКлиентСервер.ФорматированнаяСтрока(ТекстПодсказки);
КонецПроцедуры
@@ -592,27 +516,6 @@
КонецЕсли;
КонецПроцедуры
-&НаСервере
-Процедура ОпределитьМестаИспользования()
-
- ЗапуститьДлительнуюОперациюМастера("ПоискИУдалениеДублей.ОпределитьМестаИспользования",
- МассивСсылокИзНабора(МестаИспользования));
-
-КонецПроцедуры
-
-&НаСервере
-Функция ПроверитьСостояниеИОбработатьЗаполнениеМестИспользования();
-
- ПроверитьСостояниеДлительнойОперации();
- Если НастройкиПошаговогоМастера.ЗаданиеВыполнено И НастройкиПошаговогоМастера.ИнформацияОбОшибке = Неопределено Тогда
- Результат = ПолучитьИзВременногоХранилища(НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания);
- ЗаполнитьМестаИспользования(Результат);
- КонецЕсли;
-
- Возврат Новый Структура("Завершено,ИнформацияОбОшибке",
- НастройкиПошаговогоМастера.ЗаданиеВыполнено, НастройкиПошаговогоМастера.ИнформацияОбОшибке);
-КонецФункции
-
&НаСервере
Процедура ЗаполнитьМестаИспользования(Знач ТаблицаИспользования)
@@ -668,42 +571,6 @@
);
КонецПроцедуры
-&НаСервере
-Процедура ЗапуститьЗаменуСсылок()
-
- ПолноеИмяМетода = "ПоискИУдалениеДублей.ЗаменитьСсылки";
-
- ПарыЗамен = Новый Соответствие;
- Для Каждого Строка Из МестаИспользования Цикл
- ПарыЗамен.Вставить(Строка.Ссылка, ОсновнойЭлемент);
- КонецЦикла;
-
- ПараметрыЗамены = Новый Структура;
- ПараметрыЗамены.Вставить("СпособУдаления", ТекущийВариантУдаления);
- ПараметрыЗамены.Вставить("ВключатьБизнесЛогику", Истина);
-
- ПараметрыМетода = Новый Структура;
- ПараметрыМетода.Вставить("ПарыЗамен", ПарыЗамен);
- ПараметрыМетода.Вставить("Параметры", ПараметрыЗамены);
-
- ЗапуститьДлительнуюОперациюМастера(ПолноеИмяМетода, ПараметрыМетода);
-КонецПроцедуры
-
-&НаСервере
-Функция ПроверитьСостояниеИОбработатьЗаменуСсылок()
-
- ПроверитьСостояниеДлительнойОперации();
-
- Результат = Неопределено;
- Если НастройкиПошаговогоМастера.ЗаданиеВыполнено И НастройкиПошаговогоМастера.ИнформацияОбОшибке = Неопределено Тогда
- Результат = ПолучитьИзВременногоХранилища(НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания);
- Результат = Не ЗаполнитьНеудачныеЗамены(Результат);
- КонецЕсли;
-
- Возврат Новый Структура("Завершено,ИнформацияОбОшибке,Результат",
- НастройкиПошаговогоМастера.ЗаданиеВыполнено, НастройкиПошаговогоМастера.ИнформацияОбОшибке, Результат);
-КонецФункции
-
&НаСервере
Функция ЗаполнитьНеудачныеЗамены(Знач РезультатыЗамены)
// РезультатыЗамены - таблица с колонками Ссылка, ОбъектОшибки, ТипОшибки, ТекстОшибки.
@@ -908,102 +775,96 @@
КонецФункции
-&НаКлиенте
-Процедура ЗавершениеОтменыИЗакрытиеФормы(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
- Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
- // Подтверждаем продолжение процесса.
- ЗавершитьШагМастера(ДополнительныеПараметры.ПараметрыШага);
- Возврат;
- КонецЕсли;
-
- ЗавершитьРаботуФормы();
-КонецПроцедуры
-
&НаСервере
Процедура ИнициализироватьСценарийМастера()
// 0. Поиск мест использования по параметрам.
+ КнопкиМастера = КнопкиМастера();
+ КнопкиМастера.Назад.Видимость = Ложь;
+ КнопкиМастера.Далее.Видимость = Ложь;
+ КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Прервать'");
+ КнопкиМастера.Отмена.Подсказка = НСтр("ru = 'Отказаться от объединения элементов'");
+
ДобавитьШагМастера(Элементы.ШагПоискМестИспользования,
ДействиеШагаМастера("ПриАктивации", "ШагПоискМестИспользованияПриАктивации",
ДействиеШагаМастера("ПередДействиемОтмена", "ШагПоискМестИспользованияПередДействиемОтмена",
ДействиеШагаМастера("ПриОбработкеОжидания", "ШагПоискМестИспользованияПриОбработкеОжидания"))),
- КнопкаШагаМастера("Далее", "", "", Ложь, Ложь, Ложь,
- КнопкаШагаМастера("Назад", "", "", Ложь, Ложь, Ложь,
- КнопкаШагаМастера("Отмена", НСтр("ru = 'Прервать'"), НСтр("ru = 'Отказаться от объединения элементов'"), Истина, Ложь, Ложь))));
+ КнопкиМастера);
// 1. Выбор основного элемента.
+ КнопкиМастера = КнопкиМастера();
+ КнопкиМастера.Назад.Видимость = Ложь;
+ КнопкиМастера.Далее.КнопкаПоУмолчанию = Истина;
+ КнопкиМастера.Далее.Заголовок = НСтр("ru = 'Объединить >'");
+ КнопкиМастера.Далее.Подсказка = НСтр("ru = 'Начать объединение элементов'");
+ КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Отмена'");
+ КнопкиМастера.Отмена.Подсказка = НСтр("ru = 'Отказаться от объединения элементов'");
+
ДобавитьШагМастера(Элементы.ШагВыборОсновногоЭлемента,
ДействиеШагаМастера("ПриАктивации", "ШагВыборОсновногоЭлементаПриАктивации",
ДействиеШагаМастера("ПередДействиемДалее", "ШагВыборОсновногоЭлементаПередДействиемДалее",
ДействиеШагаМастера("ПередДействиемОтмена", "ШагВыборОсновногоЭлементаПередДействиемОтмена"))),
- КнопкаШагаМастера("Далее", НСтр("ru = 'Объединить >'"), НСтр("ru = 'Начать объединение элементов'"), Истина, Истина, Истина,
- КнопкаШагаМастера("Назад", "", "", Ложь, Ложь, Ложь,
- КнопкаШагаМастера("Отмена", НСтр("ru = 'Отмена'"), НСтр("ru = 'Отказаться от объединения элементов'"), Истина, Истина, Ложь))));
+ КнопкиМастера);
// 2. Ожидание процесса
+ КнопкиМастера = КнопкиМастера();
+ КнопкиМастера.Назад.Видимость = Ложь;
+ КнопкиМастера.Далее.Видимость = Ложь;
+ КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Прервать'");
+ КнопкиМастера.Отмена.Подсказка = НСтр("ru = 'Прервать объединение элементов'");
+
ДобавитьШагМастера(Элементы.ШагОбъединение,
ДействиеШагаМастера("ПриАктивации", "ШагОбъединениеПриАктивации",
ДействиеШагаМастера("ПередДействиемОтмена", "ШагОбъединениеПередДействиемОтмена",
ДействиеШагаМастера("ПриОбработкеОжидания", "ШагОбъединениеПриОбработкеОжидания"))),
- КнопкаШагаМастера("Далее", "", "", Ложь, Ложь, Ложь,
- КнопкаШагаМастера("Назад", "", "", Ложь, Ложь, Ложь,
- КнопкаШагаМастера("Отмена", НСтр("ru = 'Прервать'"), НСтр("ru = 'Прервать объединение элементов'"), Истина, Истина, Ложь))));
+ КнопкиМастера);
// 3. Успешное объединение
+ КнопкиМастера = КнопкиМастера();
+ КнопкиМастера.Назад.Видимость = Ложь;
+ КнопкиМастера.Далее.Видимость = Ложь;
+ КнопкиМастера.Отмена.КнопкаПоУмолчанию = Истина;
+ КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Закрыть'");
+ КнопкиМастера.Отмена.Подсказка = НСтр("ru = 'Закрыть результаты объединения'");
+
ДобавитьШагМастера(Элементы.ШагУспешногоЗавершения,
ДействиеШагаМастера("ПриАктивации", "ШагУспешногоЗавершенияПриАктивации",
ДействиеШагаМастера("ПередДействиемОтмена", "ШагУспешногоЗавершенияПередДействиемОтмена")),
- КнопкаШагаМастера("Далее", "", "", Ложь, Ложь, Ложь,
- КнопкаШагаМастера("Назад", "", "", Ложь, Ложь, Ложь,
- КнопкаШагаМастера("Отмена", НСтр("ru = 'Закрыть'"), НСтр("ru = 'Закрыть результаты объединения'"), Истина, Истина, Истина))));
+ КнопкиМастера);
// 4. Ошибки замены ссылок
+ КнопкиМастера = КнопкиМастера();
+ КнопкиМастера.Назад.Заголовок = НСтр("ru = '< В начало'");
+ КнопкиМастера.Назад.Подсказка = НСтр("ru = 'Вернутся к выбору основного элемента'");
+ КнопкиМастера.Далее.КнопкаПоУмолчанию = Истина;
+ КнопкиМастера.Далее.Заголовок = НСтр("ru = 'Повторить'");
+ КнопкиМастера.Далее.Подсказка = НСтр("ru = 'Повторить объединение'");
+ КнопкиМастера.Отмена.Заголовок = НСтр("ru = 'Отмена'");
+ КнопкиМастера.Отмена.Подсказка = НСтр("ru = 'Закрыть результаты объединения'");
+
ДобавитьШагМастера(Элементы.ШагПовторОбъединения,
ДействиеШагаМастера("ПриАктивации", "ШагПовторОбъединенияПриАктивации",
ДействиеШагаМастера("ПередДействиемДалее", "ШагПовторОбъединенияПередДействиемДалее",
ДействиеШагаМастера("ПередДействиемНазад", "ШагПовторОбъединенияПередДействиемНазад",
ДействиеШагаМастера("ПередДействиемОтмена", "ШагПовторОбъединенияПередДействиемОтмена")))),
- КнопкаШагаМастера("Далее", НСтр("ru = 'Повторить объединение >'"), НСтр("ru = 'Повторить объединение'"), Истина, Истина, Истина,
- КнопкаШагаМастера("Назад", НСтр("ru = '< Назад'"), НСтр("ru = 'Вернутся к выбору основного элемента'"), Истина, Истина, Ложь,
- КнопкаШагаМастера("Отмена", НСтр("ru = 'Закрыть'"), НСтр("ru = 'Закрыть результаты объединения'"), Истина, Истина, Ложь))));
-
- // Вариант завершения работы - или демонстрацией страницы или всплывающим сообщением и закрытием.
- УстановитьПараметрПользователяМастера(ЭтотОбъект, "СообщатьОбУспехеВсплывающимОкном", Истина);
+ КнопкиМастера);
КонецПроцедуры
&НаКлиенте
Процедура ШагПоискМестИспользованияПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт
-
- ОпределитьМестаИспользования();
-
+ ФоновоеЗаданиеЗапустить("ОпределитьМестаИспользования");
КонецПроцедуры
&НаКлиенте
Процедура ШагПоискМестИспользованияПриОбработкеОжидания(Прекратить, Знач ДополнительныеПараметры) Экспорт
- // Ожидаем завершения поиска ссылок.
- СостояниеОперации = ПроверитьСостояниеИОбработатьЗаполнениеМестИспользования();
-
- Если СостояниеОперации.Завершено Тогда
- Если СостояниеОперации.ИнформацияОбОшибке = Неопределено Тогда
- // Успешно выполнено, идем дальше.
- ШагМастера("Далее");
- Иначе
- Прекратить = Истина;
- ПоказатьПредупреждение(, СостояниеОперации.ИнформацияОбОшибке);
- КонецЕсли;
+ Если ФоновоеЗаданиеЗагрузитьНаКлиенте(Ложь, Ложь) Тогда
+ Прекратить = Истина;
КонецЕсли;
-
КонецПроцедуры
&НаКлиенте
Процедура ШагПоискМестИспользованияПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт
-
- // Запрос подтверждения на отмену.
- ТекстВопроса = НСтр("ru = 'Прервать поиск мест использования и закрыть?'");
- Описание = Новый ОписаниеОповещения("ЗавершениеОтменыИЗакрытиеФормы", ЭтотОбъект, Новый Структура);
- Описание.ДополнительныеПараметры.Вставить("ПараметрыШага", ПараметрыШага);
-
- ПоказатьВопрос(Описание, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
+ ПроверитьФоновоеЗаданиеИЗакрытьФормуБезПодтверждения();
КонецПроцедуры
&НаКлиенте
@@ -1034,61 +895,24 @@
&НаКлиенте
Процедура ШагВыборОсновногоЭлементаПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт
- // Запрос подтверждения на отмену.
- ТекстВопроса = НСтр("ru = 'Отменить объединение элементов и закрыть?'");
- Описание = Новый ОписаниеОповещения("ЗавершениеОтменыИЗакрытиеФормы", ЭтотОбъект, Новый Структура);
- Описание.ДополнительныеПараметры.Вставить("ПараметрыШага", ПараметрыШага);
-
- ПоказатьВопрос(Описание, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
+ Закрыть();
КонецПроцедуры
&НаКлиенте
Процедура ШагОбъединениеПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт
- // Стартуем длительную обработку по замене.
- ЗапуститьЗаменуСсылок();
+ ФоновоеЗаданиеЗапустить("ЗаменитьСсылки");
КонецПроцедуры
&НаКлиенте
Процедура ШагОбъединениеПриОбработкеОжидания(Прекратить, Знач ДополнительныеПараметры) Экспорт
- // Ожидаем завершения замены ссылок.
- СостояниеОперации = ПроверитьСостояниеИОбработатьЗаменуСсылок();
-
- Если Не СостояниеОперации.Завершено Тогда
- Возврат;
- КонецЕсли;
-
- Если СостояниеОперации.ИнформацияОбОшибке = Неопределено Тогда
- // Выполнено успешно
- Если СостояниеОперации.Результат = Истина Тогда
- // Успешно заменили все элементы.
- Если Истина = ПрочитатьПараметрПользователяМастера(ЭтотОбъект, "СообщатьОбУспехеВсплывающимОкном") Тогда
- ЗавершитьРаботуФормы(Истина);
- Иначе
- // Переходим на страницу завершения.
- ШагМастера("Далее");
- КонецЕсли;
-
- Иначе
- // Остались необработанные, переходим на попытку повтора.
- ПерейтиНаШагМастера(Элементы.ШагПовторОбъединения, Истина);
- КонецЕсли
- Иначе
- // Фоновое задание завершилось с ошибкой.
+ Если ФоновоеЗаданиеЗагрузитьНаКлиенте(Ложь, Ложь) Тогда
Прекратить = Истина;
- ПоказатьПредупреждение(, СостояниеОперации.ИнформацияОбОшибке);
- ПерейтиНаШагМастера(Элементы.ШагВыборОсновногоЭлемента);
КонецЕсли;
-
КонецПроцедуры
&НаКлиенте
Процедура ШагОбъединениеПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт
- // Запрос подтверждения на отмену.
- ТекстВопроса = НСтр("ru = 'Прервать объединение элементов и закрыть?'");
- Описание = Новый ОписаниеОповещения("ЗавершениеОтменыИЗакрытиеФормы", ЭтотОбъект, Новый Структура);
- Описание.ДополнительныеПараметры.Вставить("ПараметрыШага", ПараметрыШага);
-
- ПоказатьВопрос(Описание, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
+ ПроверитьФоновоеЗаданиеИЗакрытьФормуБезПодтверждения();
КонецПроцедуры
&НаКлиенте
@@ -1106,9 +930,10 @@
&НаКлиенте
Процедура ШагУспешногоЗавершенияПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт
-
- ЗавершитьРаботуФормы();
-
+ ЗавершитьШагМастера(ПараметрыШага);
+ Если Открыта() Тогда
+ Закрыть();
+ КонецЕсли;
КонецПроцедуры
&НаКлиенте
@@ -1135,52 +960,51 @@
&НаКлиенте
Процедура ШагПовторОбъединенияПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт
- // Это выход. Закрываем форму принудительно.
- ЗавершитьРаботуФормы();
+ Закрыть();
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ПОШАГОВОГО ПОМОЩНИКА
-// Инициализирует структуры мастера.
-//
-// Параметры:
-// ГруппаСтраниц - ГруппаФормы - Элемент формы, группа типа "страницы", содержащая в себе страницы-шаги мастера.
-// КнопкаДалее - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Далее".
-// КнопкаНазад - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Назад".
-// КнопкаОтмена - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Отмена".
-//
&НаСервере
-Процедура ИнициализироватьМастер(Знач ГруппаСтраниц, Знач КнопкаДалее, Знач КнопкаНазад, Знач КнопкаОтмена)
+Функция ИнициализироватьМастер(Знач ГруппаСтраниц, Знач КнопкаДалее, Знач КнопкаНазад, Знач КнопкаОтмена)
+ // Инициализирует структуры мастера.
+ //
+ // Параметры:
+ // ГруппаСтраниц - ГруппаФормы - Элемент формы, группа типа "страницы", содержащая в себе страницы-шаги мастера.
+ // КнопкаДалее - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Далее".
+ // КнопкаНазад - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Назад".
+ // КнопкаОтмена - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Отмена".
- НастройкиМастера = Новый Структура;
-
- НастройкиМастера.Вставить("Шаги", Новый Массив);
- НастройкиМастера.Вставить("НомерТекущегоШага", 0);
- НастройкиМастера.Вставить("СтраницаСтарта", Неопределено);
+ Результат = Новый Структура;
+
+ Результат.Вставить("Шаги", Новый Массив);
+ Результат.Вставить("НомерТекущегоШага", 0);
+ Результат.Вставить("СтраницаСтарта", Неопределено);
// Идентификаторы частей интерфейса.
- НастройкиМастера.Вставить("ГруппаСтраниц", ГруппаСтраниц.Имя);
- НастройкиМастера.Вставить("КнопкаДалее", КнопкаДалее.Имя);
- НастройкиМастера.Вставить("КнопкаНазад", КнопкаНазад.Имя);
- НастройкиМастера.Вставить("КнопкаОтмена", КнопкаОтмена.Имя);
+ Результат.Вставить("ГруппаСтраниц", ГруппаСтраниц.Имя);
+ Результат.Вставить("КнопкаДалее", КнопкаДалее.Имя);
+ Результат.Вставить("КнопкаНазад", КнопкаНазад.Имя);
+ Результат.Вставить("КнопкаОтмена", КнопкаОтмена.Имя);
// Таймаут вызова обработчика
- НастройкиМастера.Вставить("ТаймаутОжиданияДлительнойОперации",
+ Результат.Вставить("ТаймаутОжиданияДлительнойОперации",
?( ПолучитьСкоростьКлиентскогоСоединения() = СкоростьКлиентскогоСоединения.Низкая, 4, 2) );
// Для обработки длительных операций.
- НастройкиМастера.Вставить("ИдентификаторФоновогоЗадания");
- НастройкиМастера.Вставить("АдресРезультатаФоновогоЗадания");
- НастройкиМастера.Вставить("ИнформацияОбОшибке");
- НастройкиМастера.Вставить("ЗаданиеВыполнено", Ложь);
+ Результат.Вставить("ИдентификаторФоновогоЗадания");
+ Результат.Вставить("АдресРезультатаФоновогоЗадания");
+ Результат.Вставить("ИнформацияОбОшибке");
+ Результат.Вставить("ЗаданиеВыполнено", Ложь);
+ Результат.Вставить("ИмяПроцедуры");
+ Результат.Вставить("ЕстьПодтверждениеОтменыЗадания", Ложь);
// Для хранения пользовательских параметров.
- НастройкиМастера.Вставить("ПользовательскиеПараметры", Новый Соответствие);
+ Результат.Вставить("ПользовательскиеПараметры", Новый Соответствие);
- НастройкиПошаговогоМастера = НастройкиМастера;
-
-КонецПроцедуры
+ Возврат Результат;
+КонецФункции
// Добавляет шаг мастера. Переходы между страницами будут происходить согласно порядку добавления.
//
@@ -1231,7 +1055,7 @@
// Заголовок = "Отмена", Доступность = Истина, Видимость = Истина, КнопкаПоУмолчанию = Ложь;
//
// Для составления параметров рекомендуется использовать вспомогательные методы "ДобавитьШагМастера",
-// "ДействиеШагаМастера", "КнопкаШагаМастера".
+// "ДействиеШагаМастера", "КнопкиМастера".
//
&НаСервере
Процедура ДобавитьШагМастера(Знач Страница, Знач Действия, Знач Кнопки)
@@ -1285,55 +1109,51 @@
Возврат СлужебныеДанные;
КонецФункции
-// Вспомогательное формирование структуры, описывающей кнопку.
+// Вспомогательное формирование структуры, описывающей кнопки мастера.
//
-// Параметры:
-// Идентификатор - Строка - Идентификатор кнопки, может быть "Далее", "Назад" или "Отмена",
-// см описание метода "ДобавитьШагМастера".
-// Заголовок - Строка - Заголовок кнопки.
-// Подсказка - Строка - Подсказка для кнопки.
-// Видимость - Булево - параметр отображения кнопки.
-// Доступность - Булево - параметр отображения кнопки.
-// КнопкаПоУмолчанию - Булево - параметр отображения кнопки.
-// СлужебныеДанные - Структура - Накапливает значения.
-//
-// Возвращаемое значение - Структура - СлужебныеДанные с добавленными полями.
+// Возвращаемое значение:
+// Структура - Кнопки мастера.
+// * Назад - Структура - Описание кнопки Назад, сформированное методом КнопкаМастера().
+// * Далее - Структура - Описание кнопки Далее, сформированное методом КнопкаМастера().
+// * Отмена - Структура - Описание кнопки Отмена, сформированное методом КнопкаМастера().
//
&НаСервере
-Функция КнопкаШагаМастера(Знач Идентификатор, Знач Заголовок, Знач Подсказка, Знач Видимость,
- Знач Доступность, Знач КнопкаПоУмолчанию, Знач СлужебныеДанные = Неопределено)
+Функция КнопкиМастера()
- Если СлужебныеДанные = Неопределено Тогда
- СлужебныеДанные = Новый Структура;
- КонецЕсли;
-
- ОписаниеКнопки = Новый Структура;
- ОписаниеКнопки.Вставить("Заголовок", Заголовок);
- ОписаниеКнопки.Вставить("Подсказка", ?(ПустаяСтрока(Подсказка), Заголовок, Подсказка));
-
- ОписаниеКнопки.Вставить("Доступность", Доступность);
- ОписаниеКнопки.Вставить("Видимость", Видимость);
- ОписаниеКнопки.Вставить("КнопкаПоУмолчанию", КнопкаПоУмолчанию);
-
- СлужебныеДанные.Вставить(Идентификатор, ОписаниеКнопки);
- Возврат СлужебныеДанные;
+ Результат = Новый Структура("Далее, Назад, Отмена", КнопкаМастера(), КнопкаМастера(), КнопкаМастера());
+ Результат.Далее.КнопкаПоУмолчанию = Истина;
+ Результат.Далее.Заголовок = НСтр("ru = 'Далее >'");
+ Результат.Назад.Заголовок = НСтр("ru='< Назад'");
+ Результат.Отмена.Заголовок = НСтр("ru = 'Отмена'");
+ Возврат Результат;
КонецФункции
-// Читает пользовательский параметр мастера.
-&НаКлиентеНаСервереБезКонтекста
-Функция ПрочитатьПараметрПользователяМастера(Форма, Знач ИмяПараметраМастера)
+// Описание настроек кнопки мастера.
+//
+// Возвращаемое значение:
+// Структура - Настройки кнопки формы.
+// * Заголовок - Строка - Заголовок кнопки.
+// * Подсказка - Строка - Подсказка для кнопки.
+// * Видимость - Булево - Когда Истина то кнопка видна. Значение по умолчанию: Истина.
+// * Доступность - Булево - Когда Истина то кнопку можно нажимать. Значение по умолчанию: Истина.
+// * КнопкаПоУмолчанию - Булево - Когда Истина то кнопка будет основной кнопкой формы. Значение по умолчанию:
+// Ложь.
+//
+// См. также:
+// "КнопкаФормы" в синтакс-помощнике.
+//
+&НаСервере
+Функция КнопкаМастера()
+ Результат = Новый Структура;
+ Результат.Вставить("Заголовок", "");
+ Результат.Вставить("Подсказка", "");
- Возврат Форма.НастройкиПошаговогоМастера.ПользовательскиеПараметры[ИмяПараметраМастера];
-
-КонецФункции
-
-// Устанавливает пользовательский параметр мастера.
-&НаКлиентеНаСервереБезКонтекста
-Функция УстановитьПараметрПользователяМастера(Форма, Знач ИмяПараметраМастера, Знач ЗначениеПараметраМастера)
-
- Форма.НастройкиПошаговогоМастера.ПользовательскиеПараметры.Вставить(ИмяПараметраМастера, ЗначениеПараметраМастера);
+ Результат.Вставить("Доступность", Истина);
+ Результат.Вставить("Видимость", Истина);
+ Результат.Вставить("КнопкаПоУмолчанию", Ложь);
+ Возврат Результат;
КонецФункции
// Устанавливает начальную страницу для первого запуска мастера.
@@ -1352,15 +1172,13 @@
// "УстановитьНачальнуюСтраницуМастера".
&НаКлиенте
Процедура ЗапуститьРаботуМастера()
- НастройкиМастера = НастройкиПошаговогоМастера;
-
- Если НастройкиМастера.СтраницаСтарта = Неопределено Тогда
+ Если НастройкиПошаговогоМастера.СтраницаСтарта = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'Перед запуском мастера должна быть установлена начальная страница.'");
- ИначеЕсли НастройкиМастера.СтраницаСтарта = -1 Тогда
+ ИначеЕсли НастройкиПошаговогоМастера.СтраницаСтарта = -1 Тогда
// Разогрев. Проверяем наличие обработчиков действий у всех шагов.
ВозможныеДействия = Новый Структура("ПриАктивации, ПередДействиемДалее, ПередДействиемНазад, ПередДействиемОтмена, ПриОбработкеОжидания");
- Для Каждого ОписаниеШага Из НастройкиМастера.Шаги Цикл
+ Для Каждого ОписаниеШага Из НастройкиПошаговогоМастера.Шаги Цикл
Для Каждого КлючЗначение Из ВозможныеДействия Цикл
ИмяДействия = КлючЗначение.Ключ;
ИмяОбработчика = ОписаниеШага[ИмяДействия];
@@ -1381,15 +1199,15 @@
КонецЦикла;
// Фактический запуск
- ПерейтиНаШагМастера(НастройкиМастера.НомерТекущегоШага, Истина);
+ ПерейтиНаШагМастера(НастройкиПошаговогоМастера.НомерТекущегоШага, Истина);
Иначе
// По умолчанию все отключено
- Элементы[НастройкиМастера.КнопкаДалее].Видимость = Ложь;
- Элементы[НастройкиМастера.КнопкаНазад].Видимость = Ложь;
- Элементы[НастройкиМастера.КнопкаОтмена].Видимость = Ложь;
+ Элементы[НастройкиПошаговогоМастера.КнопкаДалее].Видимость = Ложь;
+ Элементы[НастройкиПошаговогоМастера.КнопкаНазад].Видимость = Ложь;
+ Элементы[НастройкиПошаговогоМастера.КнопкаОтмена].Видимость = Ложь;
// Отложенный запуск
- НастройкиПошаговогоМастера.НомерТекущегоШага = НастройкиМастера.СтраницаСтарта;
+ НастройкиПошаговогоМастера.НомерТекущегоШага = НастройкиПошаговогоМастера.СтраницаСтарта;
НастройкиПошаговогоМастера.СтраницаСтарта = -1;
ПодключитьОбработчикОжидания("ЗапуститьРаботуМастера", 0.1, Истина);
КонецЕсли;
@@ -1402,8 +1220,6 @@
//
&НаКлиенте
Процедура ШагМастера(Знач КодКоманды)
- НастройкиМастера = НастройкиПошаговогоМастера;
-
Если КодКоманды = "Далее" Тогда
Направление = 1;
ИначеЕсли КодКоманды = "Назад" Тогда
@@ -1414,7 +1230,7 @@
ВызватьИсключение НСтр("ru = 'Некорректная команда шага помощника'");
КонецЕсли;
- ОписаниеШага = НастройкиМастера.Шаги[НастройкиМастера.НомерТекущегоШага];
+ ОписаниеШага = НастройкиПошаговогоМастера.Шаги[НастройкиПошаговогоМастера.НомерТекущегоШага];
// Останавливаем обработчик, если есть.
Если ОписаниеШага.ПриОбработкеОжидания <> Неопределено Тогда
@@ -1449,8 +1265,6 @@
//
&НаКлиенте
Процедура ПерейтиНаШагМастера(Знач ИдентификаторШага, Знач ИнициироватьСобытия = Ложь)
- НастройкиМастера = НастройкиПошаговогоМастера;
-
СледующийШаг = НомерШагаМастераПоИдентификатору(ИдентификаторШага);
Если СледующийШаг = Неопределено Тогда
Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
@@ -1460,7 +1274,7 @@
ВызватьИсключение Ошибка;
КонецЕсли;
- ОписаниеШага = НастройкиМастера.Шаги[НастройкиМастера.НомерТекущегоШага];
+ ОписаниеШага = НастройкиПошаговогоМастера.Шаги[НастройкиПошаговогоМастера.НомерТекущегоШага];
// Останавливаем обработчик, если есть.
Если ОписаниеШага.ПриОбработкеОжидания <> Неопределено Тогда
@@ -1478,10 +1292,8 @@
//
&НаКлиенте
Процедура ЗавершитьШагМастера(Знач ПараметрыШага)
- НастройкиМастера = НастройкиПошаговогоМастера;
-
- СледующийШаг = НастройкиМастера.НомерТекущегоШага + ПараметрыШага;
- ПоследнийШаг = НастройкиМастера.Шаги.ВГраница();
+ СледующийШаг = НастройкиПошаговогоМастера.НомерТекущегоШага + ПараметрыШага;
+ ПоследнийШаг = НастройкиПошаговогоМастера.Шаги.ВГраница();
Если ПараметрыШага = 0 Тогда
// Подтверждение отмены - ничего не делаем.
@@ -1502,15 +1314,13 @@
&НаКлиенте
Процедура ШагМастераЗавершениеБезусловно(Знач СледующийШаг, Знач ИнициироватьСобытия = Истина)
- НастройкиМастера = НастройкиПошаговогоМастера;
-
- ОписаниеШага = НастройкиМастера.Шаги[СледующийШаг];
- ПоследнийШаг = НастройкиМастера.Шаги.ВГраница();
+ ОписаниеШага = НастройкиПошаговогоМастера.Шаги[СледующийШаг];
+ ПоследнийШаг = НастройкиПошаговогоМастера.Шаги.ВГраница();
// Переключаем на новую страницу.
- Элементы[НастройкиМастера.ГруппаСтраниц].ТекущаяСтраница = Элементы[ОписаниеШага.Страница];
+ Элементы[НастройкиПошаговогоМастера.ГруппаСтраниц].ТекущаяСтраница = Элементы[ОписаниеШага.Страница];
// Обход особенности платформы.
- ГруппаСтраницМастера = Элементы[НастройкиМастера.ГруппаСтраниц];
+ ГруппаСтраницМастера = Элементы[НастройкиПошаговогоМастера.ГруппаСтраниц];
НоваяТекущаяСтраница = Элементы[ОписаниеШага.Страница];
ВидГруппыСтраница = ВидГруппыФормы.Страница;
ТипГруппаФормы = Тип("ГруппаФормы");
@@ -1521,9 +1331,9 @@
КонецЦикла;
// Обновляем кнопки
- ОбновитьСвойстваКнопкиМастера(НастройкиМастера.КнопкаДалее, ОписаниеШага.КнопкаДалее);
- ОбновитьСвойстваКнопкиМастера(НастройкиМастера.КнопкаНазад, ОписаниеШага.КнопкаНазад);
- ОбновитьСвойстваКнопкиМастера(НастройкиМастера.КнопкаОтмена, ОписаниеШага.КнопкаОтмена);
+ ОбновитьСвойстваКнопкиМастера(НастройкиПошаговогоМастера.КнопкаДалее, ОписаниеШага.КнопкаДалее);
+ ОбновитьСвойстваКнопкиМастера(НастройкиПошаговогоМастера.КнопкаНазад, ОписаниеШага.КнопкаНазад);
+ ОбновитьСвойстваКнопкиМастера(НастройкиПошаговогоМастера.КнопкаОтмена, ОписаниеШага.КнопкаОтмена);
// Успешно перешли
НастройкиПошаговогоМастера.НомерТекущегоШага = СледующийШаг;
@@ -1550,9 +1360,7 @@
&НаКлиенте
Процедура ОбработкаАктивацииСтраницыМастера()
- НастройкиМастера = НастройкиПошаговогоМастера;
-
- ОписаниеШага = НастройкиМастера.Шаги[НастройкиМастера.НомерТекущегоШага];
+ ОписаниеШага = НастройкиПошаговогоМастера.Шаги[НастройкиПошаговогоМастера.НомерТекущегоШага];
Если Не ПустаяСтрока(ОписаниеШага.ПриАктивации) Тогда
Оповещение = Новый ОписаниеОповещения(ОписаниеШага.ПриАктивации, ЭтотОбъект);
ВыполнитьОбработкуОповещения(Оповещение, Элементы[ОписаниеШага.Страница]);
@@ -1568,31 +1376,25 @@
// Может быть номер шага или группа-страница, или ее идентификатор.
&НаКлиенте
Функция НомерШагаМастераПоИдентификатору(Знач ИдентификаторШага)
- НастройкиМастера = НастройкиПошаговогоМастера;
- НомерШага = Неопределено;
-
ТипПараметра = ТипЗнч(ИдентификаторШага);
Если ТипПараметра = Тип("Число") Тогда
- НомерШага = ИдентификаторШага;
- Иначе
- ИмяПоиска = ?(ТипПараметра = Тип("ГруппаФормы"), ИдентификаторШага.Имя, ИдентификаторШага);
- Для НомерШага=0 По НастройкиМастера.Шаги.ВГраница() Цикл
- Если НастройкиМастера.Шаги[НомерШага].Страница = ИмяПоиска Тогда
- НомерШага = НомерШага;
- Прервать;
- КонецЕсли;
- КонецЦикла;
+ Возврат ИдентификаторШага;
КонецЕсли;
- Возврат НомерШага;
+ ИмяПоиска = ?(ТипПараметра = Тип("ГруппаФормы"), ИдентификаторШага.Имя, ИдентификаторШага);
+ Для НомерШага=0 По НастройкиПошаговогоМастера.Шаги.ВГраница() Цикл
+ Если НастройкиПошаговогоМастера.Шаги[НомерШага].Страница = ИмяПоиска Тогда
+ Возврат НомерШага;
+ КонецЕсли;
+ КонецЦикла;
+
+ ВызватьИсключение СтрЗаменить(НСтр("ru = 'Не найден шаг ""%1"".'"), "%1", ИмяПоиска);
КонецФункции
// Возвращает флаг отмены
&НаКлиенте
Функция ОбработкаОжиданияСтраницыМастера()
- НастройкиМастера = НастройкиПошаговогоМастера;
-
- ОписаниеШага = НастройкиМастера.Шаги[НастройкиМастера.НомерТекущегоШага];
+ ОписаниеШага = НастройкиПошаговогоМастера.Шаги[НастройкиПошаговогоМастера.НомерТекущегоШага];
Действие = ОписаниеШага.ПриОбработкеОжидания;
Если ПустаяСтрока(Действие) Тогда
Возврат Ложь;
@@ -1605,86 +1407,219 @@
Продолжать = Не Прекратить;
Если Продолжать Тогда
- ПодключитьОбработчикОжидания("ОбработкаОжиданияСтраницыМастера", НастройкиМастера.ТаймаутОжиданияДлительнойОперации, Истина);
+ ПодключитьОбработчикОжидания("ОбработкаОжиданияСтраницыМастера", НастройкиПошаговогоМастера.ТаймаутОжиданияДлительнойОперации, Истина);
КонецЕсли;
Возврат Продолжать;
КонецФункции
-&НаСервере
-Функция ЗапуститьДлительнуюОперациюМастера(Знач ИмяМетода, Знач ПараметрыМетода)
+&НаКлиенте
+Процедура ПослеПодтвержденияОтменыЗаданияИЗакрытияФормы(Ответ, ПараметрыВыполнения) Экспорт
+ Если Ответ = КодВозвратаДиалога.Прервать Тогда
+ ПроверитьФоновоеЗаданиеИЗакрытьФормуБезПодтверждения();
+ Иначе
+ ОбработкаОжиданияСтраницыМастера();
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПроверитьФоновоеЗаданиеИЗакрытьФормуБезПодтверждения()
+ Если Не ФоновоеЗаданиеЗагрузитьНаКлиенте(Истина, Ложь) Тогда
+ НастройкиПошаговогоМастера.ЕстьПодтверждениеОтменыЗадания = Истина;
+ Закрыть();
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Функция ФоновоеЗаданиеЗагрузитьНаКлиенте(ПрерватьЕслиНеВыполнено, ПоказатьДиалогПередЗакрытием)
- // Отменяем возможно незавершенное предыдущее.
- ОтменитьДлительнуюОперациюМастера();
+ ОтключитьОбработчикОжидания("ОбработкаОжиданияСтраницыМастера");
- Попытка
- Задание = ДлительныеОперации.ЗапуститьВыполнениеВФоне(УникальныйИдентификатор, ИмяМетода, ПараметрыМетода);
- Исключение
- НастройкиПошаговогоМастера.ЗаданиеВыполнено = Истина;
- НастройкиПошаговогоМастера.ИнформацияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
- НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено;
- НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = Неопределено;
- КонецПопытки;
+ ИнформацияОЗадании = ФоновоеЗаданиеЗагрузитьРезультат(ПрерватьЕслиНеВыполнено);
+ Если Не ИнформацияОЗадании.Завершено Тогда
+ Если ПоказатьДиалогПередЗакрытием Тогда
+ Обработчик = Новый ОписаниеОповещения("ПослеПодтвержденияОтменыЗаданияИЗакрытияФормы", ЭтотОбъект);
+
+ Если НастройкиПошаговогоМастера.ИмяПроцедуры = "ОпределитьМестаИспользования" Тогда
+ ТекстВопроса = НСтр("ru = 'Прервать поиск мест использования и закрыть форму?'");
+ ИначеЕсли НастройкиПошаговогоМастера.ИмяПроцедуры = "ЗаменитьСсылки" Тогда
+ ТекстВопроса = НСтр("ru = 'Прервать объединение элементов и закрыть форму?'");
+ КонецЕсли;
+
+ Кнопки = Новый СписокЗначений;
+ Кнопки.Добавить(КодВозвратаДиалога.Прервать, НСтр("ru = 'Прервать'"));
+ Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Не прерывать'"));
+
+ ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, , КодВозвратаДиалога.Нет);
+ КонецЕсли;
+ Возврат Ложь;
+ КонецЕсли;
- Если Задание <> Неопределено Тогда
- НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = Задание.АдресХранилища;
- Если Задание.ЗаданиеВыполнено Тогда
- НастройкиПошаговогоМастера.ЗаданиеВыполнено = Истина;
- НастройкиПошаговогоМастера.ИнформацияОбОшибке = Неопределено;
- НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено;
+ Если НастройкиПошаговогоМастера.ИмяПроцедуры = "ОпределитьМестаИспользования" Тогда
+ Если ИнформацияОЗадании.ИнформацияОбОшибке = Неопределено Тогда
+ Активизировать();
+ ШагМастера("Далее");
Иначе
- НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Задание.ИдентификаторЗадания;
+ Активизировать();
+ ПоказатьПредупреждение(, ИнформацияОЗадании.ИнформацияОбОшибке);
+ КонецЕсли;
+ ИначеЕсли НастройкиПошаговогоМастера.ИмяПроцедуры = "ЗаменитьСсылки" Тогда
+ Если ИнформацияОЗадании.ИнформацияОбОшибке = Неопределено Тогда
+ Если ИнформацияОЗадании.Результат = Истина Тогда
+ // Полностью успешно - закрыть форму и вывести оповещение.
+ ПоказатьОповещениеПользователя(,
+ ПолучитьНавигационнуюСсылку(ОсновнойЭлемент),
+ СообщениеОЗавершении(),
+ БиблиотекаКартинок.Информация32);
+ СписокОбновленного = Новый Массив;
+ Для Каждого Строка Из МестаИспользования Цикл
+ СписокОбновленного.Добавить(Строка.Ссылка);
+ КонецЦикла;
+ ОповеститьОбУспешнойЗамене(СписокОбновленного);
+ // Закрываем форму.
+ Закрыть();
+ Иначе
+ // Частично успешно - вывести расшифровку.
+ Активизировать();
+ ПерейтиНаШагМастера(Элементы.ШагПовторОбъединения, Истина);
+ КонецЕсли
+ Иначе
+ // Фоновое задание завершилось с ошибкой.
+ Активизировать();
+ ПоказатьПредупреждение(, ИнформацияОЗадании.ИнформацияОбОшибке);
+ ПерейтиНаШагМастера(Элементы.ШагВыборОсновногоЭлемента);
КонецЕсли;
КонецЕсли;
+ Возврат Истина;
КонецФункции
&НаСервере
-Процедура ПроверитьСостояниеДлительнойОперации()
+Функция ФоновоеЗаданиеЗапустить(Знач ИмяПроцедуры)
+ // Отмена предыдущего задания.
+ ФоновоеЗаданиеОтменить();
- Если НастройкиПошаговогоМастера.ЗаданиеВыполнено Тогда
- Возврат;
+ // Определение параметров запуска.
+ ПолноеИмяМетода = "ПоискИУдалениеДублей." + ИмяПроцедуры;
+
+ Если ИмяПроцедуры = "ОпределитьМестаИспользования" Тогда
+
+ НаименованиеМетода = НСтр("ru = 'Поиск и удаление дублей: Определение мест использования'");
+ ПараметрыМетода = МассивСсылокИзНабора(МестаИспользования);
+
+ ИначеЕсли ИмяПроцедуры = "ЗаменитьСсылки" Тогда
+
+ НаименованиеМетода = НСтр("ru = 'Поиск и удаление дублей: Объединение элементов'");
+ ПарыЗамен = Новый Соответствие;
+ Для Каждого Строка Из МестаИспользования Цикл
+ ПарыЗамен.Вставить(Строка.Ссылка, ОсновнойЭлемент);
+ КонецЦикла;
+
+ ПараметрыЗамены = Новый Структура;
+ ПараметрыЗамены.Вставить("СпособУдаления", ТекущийВариантУдаления);
+ ПараметрыЗамены.Вставить("ВключатьБизнесЛогику", Истина);
+
+ ПараметрыМетода = Новый Структура;
+ ПараметрыМетода.Вставить("ПарыЗамен", ПарыЗамен);
+ ПараметрыМетода.Вставить("Параметры", ПараметрыЗамены);
+
+ Иначе
+
+ Возврат Ложь;
+
КонецЕсли;
- Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания);
- Если Задание <> Неопределено Тогда
- Если Задание.ИнформацияОбОшибке <> Неопределено Тогда
- НастройкиПошаговогоМастера.ИнформацияОбОшибке = ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке);
- КонецЕсли;
- НастройкиПошаговогоМастера.ЗаданиеВыполнено = Задание.Состояние <> СостояниеФоновогоЗадания.Активно;
- Если НастройкиПошаговогоМастера.ЗаданиеВыполнено Тогда
- // Текущие сообщения фонового задания.
- НакопленныеСообщения = Задание.ПолучитьСообщенияПользователю(Истина);
- Если НакопленныеСообщения <> Неопределено Тогда
- Для Каждого Сообщение Из НакопленныеСообщения Цикл
- Сообщение.Сообщить();
- КонецЦикла;
+ // Запуск.
+ ИнформацияОбОшибке = Неопределено;
+ Попытка
+ Задание = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
+ УникальныйИдентификатор,
+ ПолноеИмяМетода,
+ ПараметрыМетода,
+ НаименованиеМетода);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ КонецПопытки;
+ Если ИнформацияОбОшибке <> Неопределено Тогда
+ НастройкиПошаговогоМастера.ЗаданиеВыполнено = Истина;
+ НастройкиПошаговогоМастера.ИнформацияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
+ НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено;
+ НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = Неопределено;
+ НастройкиПошаговогоМастера.ИмяПроцедуры = Неопределено;
+ Возврат Ложь;
+ КонецЕсли;
+
+ НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = Задание.АдресХранилища;
+ НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Задание.ИдентификаторЗадания;
+ НастройкиПошаговогоМастера.ЗаданиеВыполнено = Задание.ЗаданиеВыполнено;
+ НастройкиПошаговогоМастера.ИмяПроцедуры = ИмяПроцедуры;
+
+ Если НастройкиПошаговогоМастера.ЗаданиеВыполнено Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ Возврат Истина;
+КонецФункции
+
+&НаСервере
+Функция ФоновоеЗаданиеЗагрузитьРезультат(Знач ПрерватьЕслиНеВыполнено = Ложь)
+ Если НастройкиПошаговогоМастера.ЗаданиеВыполнено Тогда
+ НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено;
+ Иначе
+ Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания);
+ Если Задание <> Неопределено Тогда
+ Если Задание.ИнформацияОбОшибке <> Неопределено Тогда
+ НастройкиПошаговогоМастера.ИнформацияОбОшибке = ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке);
+ КонецЕсли;
+ НастройкиПошаговогоМастера.ЗаданиеВыполнено = Задание.Состояние <> СостояниеФоновогоЗадания.Активно;
+ Если НастройкиПошаговогоМастера.ЗаданиеВыполнено Тогда
+ // Текущие сообщения фонового задания.
+ НакопленныеСообщения = Задание.ПолучитьСообщенияПользователю(Истина);
+ Если НакопленныеСообщения <> Неопределено Тогда
+ Для Каждого Сообщение Из НакопленныеСообщения Цикл
+ Сообщение.Сообщить();
+ КонецЦикла;
+ КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
- Если НастройкиПошаговогоМастера.Завершено Тогда
+ Значение = Неопределено;
+ Если НастройкиПошаговогоМастера.ЗаданиеВыполнено Тогда
НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено;
- КонецЕсли;
-
-КонецПроцедуры
-
-// Отменяет текущую длительную операцию.
-&НаСервере
-Процедура ОтменитьДлительнуюОперациюМастера()
-
- Если НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания <> Неопределено Тогда
- Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания);
- Если Задание <> Неопределено Тогда
- Задание.Отменить();
+ Если НастройкиПошаговогоМастера.ИнформацияОбОшибке = Неопределено Тогда
+ Значение = ПолучитьИзВременногоХранилища(НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания);
+ Если НастройкиПошаговогоМастера.ИмяПроцедуры = "ОпределитьМестаИспользования" Тогда
+ ЗаполнитьМестаИспользования(Значение);
+ Значение = Неопределено;
+ ИначеЕсли НастройкиПошаговогоМастера.ИмяПроцедуры = "ЗаменитьСсылки" Тогда
+ Значение = Не ЗаполнитьНеудачныеЗамены(Значение);
+ КонецЕсли;
КонецЕсли;
КонецЕсли;
- НастройкиПошаговогоМастера.ЗаданиеВыполнено = Ложь;
- НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = Неопределено;
- НастройкиПошаговогоМастера.ИнформацияОбОшибке = Неопределено;
- НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено;
+ Если ПрерватьЕслиНеВыполнено И Не НастройкиПошаговогоМастера.ЗаданиеВыполнено Тогда
+ ФоновоеЗаданиеОтменить();
+ КонецЕсли;
+ ИнформацияОЗадании = Новый Структура;
+ ИнформацияОЗадании.Вставить("Завершено", НастройкиПошаговогоМастера.ЗаданиеВыполнено);
+ ИнформацияОЗадании.Вставить("ИнформацияОбОшибке", НастройкиПошаговогоМастера.ИнформацияОбОшибке);
+ ИнформацияОЗадании.Вставить("Результат", Значение);
+
+ Возврат ИнформацияОЗадании;
+КонецФункции
+
+&НаСервере
+Процедура ФоновоеЗаданиеОтменить()
+ Если НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания <> Неопределено Тогда
+ ДлительныеОперации.ОтменитьВыполнениеЗадания(НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания);
+ КонецЕсли;
+ НастройкиПошаговогоМастера.ЗаданиеВыполнено = Ложь;
+ НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = Неопределено;
+ НастройкиПошаговогоМастера.ИнформацияОбОшибке = Неопределено;
+ НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено;
+ НастройкиПошаговогоМастера.ИмяПроцедуры = Неопределено;
КонецПроцедуры
#КонецОбласти
diff --git a/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Help/ru.html b/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Help/ru.html
index c0f68cab9..f5d088307 100644
--- a/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Help/ru.html
+++ b/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для просмотра событий доступа к персональным данным, зарегистрированным в программе.
Открывается по команде Защита персональных данных в разделе Администрирование - Поддержка и обслуживание.
Согласно Федеральному закону от 27.06.2006 №152-Ф3 "О персональных данных" и подзаконным актам в программе реализована регистрация следующих событий:
Для документов используется период отбора. В поле За период нажмите Выбрать, укажите период. Даты можно указать вручную или выбрать из календаря. С помощью ссылки Показать стандартные периоды можно быстро подобрать период.
diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Help/ru.html b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Help/ru.html
index bfe3a516d..afccdbb10 100644
--- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Help/ru.html
+++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Help/ru.html
@@ -1,4 +1,4 @@
-
+
+
+ Подменю1
+ 19
+ true
+ true
+
+ true
+
+
+ ru
+ Обучение
+
+
+ Подменю1РасширеннаяПодсказка
+ 20
+ Label
+ true
+ true
+
+ Left
+
+
+ Popup
+
+ Auto
+ Normal
+
+
+
+ Подменю2
+ 21
+ true
+ true
+
+ true
+
+
+ ru
+ Поддержка
+
+
+ Подменю2РасширеннаяПодсказка
+ 22
+ Label
+ true
+ true
+
+ Left
+
+
+ Popup
+
+ Auto
+ Normal
+
+
+
+ Подменю3
+ 23
+ true
+ true
+
+ true
+
+
+ ru
+ Предприятие 8
+
+
+ Подменю3РасширеннаяПодсказка
+ 24
+ Label
+ true
+ true
+
+ Left
+
+
+ Popup
+
+ Auto
+ Normal
+
+
+
+ Подменю4
+ 25
+ true
+ true
+
+ true
+
+
+ ru
+ Справочная информация
+
+
+ Подменю4РасширеннаяПодсказка
+ 26
+ Label
+ true
+ true
+
+ Left
+
+
+ Popup
+
+ Auto
+ Normal
+
+
+
+ Подменю5
+ 27
+ true
+ true
+
+ true
+
+
+ ru
+ Единый семинар
+
+
+ Подменю5РасширеннаяПодсказка
+ 28
+ Label
+ true
+ true
+
+ Left
+
+
+ Popup
+
+ Auto
+ Normal
+
+ truetrue
@@ -113,7 +279,6 @@
CommandBarLeft
- Form
@@ -282,10 +447,10 @@
- ДобавленныеКоманды
+ ПакетыСтраницru
- Добавленные команды
+ Пакеты страниц4
@@ -518,7 +683,7 @@
- ДобавленныеКоманды.ВебСтраницы
+ ПакетыСтраниц.ВебСтраницыОтносительноеИмя
@@ -634,10 +799,10 @@
- КомандаИдентификатор
+ ИдентификаторПакетаru
- Команда идентификатор
+ Идентификатор пакета1
@@ -820,6 +985,28 @@
AutoAuto
+
+ ГлавнаяСтраница
+
+ ru
+ Главная страница
+
+ 3
+
+ ru
+ Главная страница
+
+
+ true
+
+
+
+ Подключаемый_ПерейтиКСтранице
+
+
+ Auto
+ Auto
+
diff --git a/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Module.bsl
index eccd38a89..aa7664d14 100644
--- a/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Module.bsl
+++ b/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Module.bsl
@@ -1,4 +1,3 @@
-
#Область ОбработчикиСобытийФормы
&НаСервере
@@ -15,8 +14,6 @@
КонфигурацияМоделиСервиса = КонфигурацияМоделиСервиса Или МодульОбменДаннымиПовтИсп.ЭтоАвтономноеРабочееМесто();
КонецЕсли;
- ОпределитьКаталогВременныхФайлов();
-
СтандартныйПрефикс = ПолучитьНавигационнуюСсылкуИнформационнойБазы() + "/";
ЭтоВебКлиент = Найти(СтандартныйПрефикс, "http://") > 0;
Если ЭтоВебКлиент Тогда
@@ -26,7 +23,7 @@
ПравоСохраненияДанных = ПравоДоступа("СохранениеДанныхПользователя", Метаданные);
- Если КонфигурацияБазовая ИЛИ НЕ ПравоСохраненияДанных Тогда
+ Если КонфигурацияБазовая Или Не ПравоСохраненияДанных Тогда
Элементы.ПоказыватьПриНачалеРаботы.Видимость = Ложь;
Иначе
ПоказыватьПриНачалеРаботы = Истина;
@@ -34,8 +31,7 @@
ОтсутствуютДанныеДляОтображения = Ложь;
- Если НЕ ЗаполнитьКоманды()
- ИЛИ НЕ ПодготовитьДанныеФормы() Тогда
+ Если Не ПодготовитьДанныеФормы() Тогда
ОтсутствуютДанныеДляОтображения = Истина;
@@ -54,7 +50,7 @@
&НаКлиенте
Процедура ПриЗакрытии()
- Если НЕ КонфигурацияБазовая И ПравоСохраненияДанных Тогда
+ Если Не КонфигурацияБазовая И ПравоСохраненияДанных Тогда
СохранитьСостояниеФлажка(ПоказыватьПриНачалеРаботы);
КонецЕсли;
КонецПроцедуры
@@ -67,7 +63,8 @@
Процедура ВебСодержимоеПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
Если ДанныеСобытия.Свойство("href") И ЗначениеЗаполнено(ДанныеСобытия.href) Тогда
ИмяОткрываемойСтраницы = СокрЛП(ДанныеСобытия.href);
- Если Лев(ИмяОткрываемойСтраницы, 5) <> "http:" И Лев(ИмяОткрываемойСтраницы, 4) <> "e1c:" Тогда
+ Протокол = ВРег(СтрЛевДоСимвола(ИмяОткрываемойСтраницы, ":"));
+ Если Протокол <> "HTTP" И Протокол <> "HTTPS" И Протокол <> "E1C" Тогда
Возврат; // Не ссылка
КонецЕсли;
@@ -85,11 +82,7 @@
КонецЕсли;
ПросмотрСтраницы("ПоВнутреннейСсылке", ИмяОткрываемойСтраницы);
Иначе
- #Если ТолстыйКлиентОбычноеПриложение Тогда
- ЗапуститьПриложение(ИмяОткрываемойСтраницы);
- #Иначе
- ПерейтиПоНавигационнойСсылке(ИмяОткрываемойСтраницы);
- #КонецЕсли
+ ОбщегоНазначенияКлиент.ПерейтиПоСсылке(ИмяОткрываемойСтраницы);
КонецЕсли;
СтандартнаяОбработка = Ложь;
КонецЕсли;
@@ -118,196 +111,189 @@
#Область СлужебныеПроцедурыИФункции
-&НаСервере
-Процедура ОпределитьКаталогВременныхФайлов()
- // Определение пути.
- ПутьККаталогу = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла("extras"));
- СоздатьКаталог(ПутьККаталогу);
-
- // Проверка права записи.
- ИмяВременногоФайла = ПутьККаталогу + "null.tmp";
- ТекстовыйДокумент = Новый ТекстовыйДокумент;
- ТекстовыйДокумент.Вывод = ИспользованиеВывода.Разрешить;
- ТекстовыйДокумент.Записать(ИмяВременногоФайла);
- ТекстовыйДокумент = Неопределено;
- УдалитьФайлы(ИмяВременногоФайла);
-
- // Результат.
- КаталогВременныхФайлов = ПутьККаталогу;
-КонецПроцедуры
-
-&НаСервере
-Функция ЗаполнитьКоманды()
- // Считывает данные макета "Описатель", заполняя таблицу "ДобавленныеКоманды".
- ЭтаОбработка = РеквизитФормыВЗначение("Объект");
- ТекущаяДатаСеанса = ТекущаяДатаСеанса();
- ТабличныйДокумент = ЭтаОбработка.ПолучитьМакет("Описатель");
-
- Для НомерСтроки = 3 По ТабличныйДокумент.ВысотаТаблицы Цикл
- ПрефиксСтроки = "R"+ НомерСтроки +"C";
-
- // Чтение данных первой колонки.
- ИмяМакета = ДанныеКолонки(ТабличныйДокумент, ПрефиксСтроки, 1, , "КонецТаблицы");
- Если ВРег(ИмяМакета) = ВРег("КонецТаблицы") Тогда
- Прервать;
- КонецЕсли;
-
- // Чтение и преобразование сведений о команде в требуемый формат.
- СведенияОКоманде = Новый Структура;
- СведенияОКоманде.Вставить("Раздел", ДанныеКолонки(ТабличныйДокумент, ПрефиксСтроки, 2));
- СведенияОКоманде.Вставить("НаименованиеСтартовойСтраницы", ДанныеКолонки(ТабличныйДокумент, ПрефиксСтроки, 3));
- СведенияОКоманде.Вставить("ИмяФайлаСтартовойСтраницы", ДанныеКолонки(ТабличныйДокумент, ПрефиксСтроки, 4));
- СведенияОКоманде.Вставить("ДатаНачалаПоказа", ДанныеКолонки(ТабличныйДокумент, ПрефиксСтроки, 5, "Дата", '00010101'));
- СведенияОКоманде.Вставить("ДатаОкончанияПоказа", ДанныеКолонки(ТабличныйДокумент, ПрефиксСтроки, 6, "Дата", '29990101'));
- СведенияОКоманде.Вставить("ВключатьВПервыйПоказ", ДанныеКолонки(ТабличныйДокумент, ПрефиксСтроки, 7, "Число", 0));
- СведенияОКоманде.Вставить("ПоказыватьВПроф", ДанныеКолонки(ТабличныйДокумент, ПрефиксСтроки, 8, "Булево", Истина));
- СведенияОКоманде.Вставить("ПоказыватьВБазовой", ДанныеКолонки(ТабличныйДокумент, ПрефиксСтроки, 9, "Булево", Истина));
- СведенияОКоманде.Вставить("ПоказыватьВМоделиСервиса", ДанныеКолонки(ТабличныйДокумент, ПрефиксСтроки, 10, "Булево", Истина));
-
- // Пропуск если данные не актуальны.
- Если СведенияОКоманде.ДатаНачалаПоказа > ТекущаяДатаСеанса
- ИЛИ СведенияОКоманде.ДатаОкончанияПоказа < ТекущаяДатаСеанса Тогда
- Продолжить;
- КонецЕсли;
-
- // Пропуск если данные не подходят к конфигурации.
- Если КонфигурацияБазовая Тогда
- Если НЕ СведенияОКоманде.ПоказыватьВБазовой Тогда
- Продолжить;
- КонецЕсли;
- ИначеЕсли КонфигурацияМоделиСервиса Тогда
- Если НЕ СведенияОКоманде.ПоказыватьВМоделиСервиса Тогда
- Продолжить;
- КонецЕсли;
- Иначе
- Если НЕ СведенияОКоманде.ПоказыватьВПроф Тогда
- Продолжить;
- КонецЕсли;
- КонецЕсли;
-
- // Добавление информации о команде.
- СтрокаТаблицы = ДобавленныеКоманды.Добавить();
- СтрокаТаблицы.ИмяМакета = ИмяМакета;
- СтрокаТаблицы.Идентификатор = Строка(НомерСтроки - 2);
- ЗаполнитьЗначенияСвойств(СтрокаТаблицы, СведенияОКоманде);
-
- Если НРег(СтрокаТаблицы.Раздел) = НРег(НСтр("ru = 'Реклама'")) Тогда
- СтрокаТаблицы.Приоритет = 0;
- ИначеЕсли СтрокаТаблицы.ВключатьВПервыйПоказ <> 0 Тогда
- СтрокаТаблицы.Приоритет = СтрокаТаблицы.ВключатьВПервыйПоказ;
- Иначе
- СтрокаТаблицы.Приоритет = 100;
- КонецЕсли;
-
- КонецЦикла;
-
- Возврат ДобавленныеКоманды.Количество() > 0;
-
-КонецФункции
-
&НаСервере
Функция ПодготовитьДанныеФормы()
- ПоказываемыеИнформационныеСтраницы = Новый Массив;
- ИнформационныеСтраницы = Новый Массив;
- РекламныеСтраницы = Новый Массив;
-
+ Сегодня = НачалоДня(ТекущаяДатаСеанса());
НаименованиеТекущегоРаздела = "-";
ТекущееПодменю = Неопределено;
ДобавленоПодменю = 0;
МинимальныйПриоритет = 100;
+ ПакетыСтраницСМинимальнымПриоритетом = Новый Массив;
+ ГлавнаяЗанята = Ложь;
- ДобавленныеКоманды.Сортировать("Раздел");
- Для Каждого СтрокаТаблицы Из ДобавленныеКоманды Цикл
- СтрокаТаблицы.ЗаголовокФормы = НСтр("ru = 'Информация'");
-
- МинимальныйПриоритет = Мин(СтрокаТаблицы.Приоритет, МинимальныйПриоритет);
-
- Если Не ЗначениеЗаполнено(СтрокаТаблицы.НаименованиеСтартовойСтраницы) Тогда
+ ИспользоватьКэшРегистра = Истина;
+ Если ОбщегоНазначенияКлиентСервер.РежимОтладки()
+ Или НРег(СтрЛевДоСимвола(ЭтотОбъект.ИмяФормы, ".")) = НРег("ВнешняяОбработка") Тогда
+ ИспользоватьКэшРегистра = Ложь;
+ КонецЕсли;
+
+ Если ИспользоватьКэшРегистра Тогда
+ ЗаписьРегистра = РегистрыСведений.ПакетыИнформацииПриЗапуске.Получить(Новый Структура("Номер", 0));
+ Кэш = ЗаписьРегистра.Состав.Получить();
+ Иначе
+ Кэш = ИнформацияПриЗапуске.КэшДляПервогоПоказа(РеквизитФормыВЗначение("Объект"));
+ Кэш.Вставить("ПодготовленныеПакеты", Новый Соответствие);
+ КонецЕсли;
+
+ ПакетыСтраниц.Загрузить(Кэш.ПакетыСтраниц);
+ Если ПакетыСтраниц.Количество() = 0 Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ ПакетыСтраниц.Сортировать("Раздел");
+ Для Каждого ПакетСтраниц Из ПакетыСтраниц Цикл
+ // Пропуск если пакет не нужно показывать.
+ Если ПакетСтраниц.ДатаНачалаПоказа > Сегодня
+ Или ПакетСтраниц.ДатаОкончанияПоказа < Сегодня Тогда
Продолжить;
КонецЕсли;
- НаименованиеРаздела = СокрЛП(СтрокаТаблицы.Раздел);
+ ПакетСтраниц.ЗаголовокФормы = НСтр("ru = 'Информация'");
- Если НаименованиеТекущегоРаздела <> НаименованиеРаздела Тогда
- НаименованиеТекущегоРаздела = НаименованиеРаздела;
+ Если МинимальныйПриоритет > ПакетСтраниц.Приоритет Тогда
+ МинимальныйПриоритет = ПакетСтраниц.Приоритет;
+ ПакетыСтраницСМинимальнымПриоритетом = Новый Массив;
+ ПакетыСтраницСМинимальнымПриоритетом.Добавить(ПакетСтраниц);
+ ИначеЕсли МинимальныйПриоритет = ПакетСтраниц.Приоритет
+ И ПакетыСтраницСМинимальнымПриоритетом.Найти(ПакетСтраниц.ИмяМакета) = Неопределено Тогда
+ ПакетыСтраницСМинимальнымПриоритетом.Добавить(ПакетСтраниц);
+ КонецЕсли;
+
+ Если Не ЗначениеЗаполнено(ПакетСтраниц.НаименованиеСтартовойСтраницы) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Если Лев(ПакетСтраниц.Раздел, 1) = "_" Тогда
+ НомерПодменю = Сред(ПакетСтраниц.Раздел, 2);
+ Если НомерПодменю = "0" Тогда
+ ПакетСтраниц.Раздел = "";
+ Если Не ГлавнаяЗанята Тогда
+ ПакетСтраниц.Идентификатор = "ГлавнаяСтраница";
+ ГлавнаяЗанята = Истина;
+ Продолжить;
+ КонецЕсли;
+ ТекущееПодменю = Элементы.БезПодменю;
+ Иначе
+ ИмяПодменю = "Подменю" + НомерПодменю;
+ ТекущееПодменю = Элементы.Найти(ИмяПодменю);
+ Если ТекущееПодменю = Неопределено Тогда
+ ВызватьИсключение СтрЗаменить(НСтр("ru = 'Не найдена группа ""%1""'"), "%1", ИмяПодменю);
+ КонецЕсли;
+ ПакетСтраниц.Раздел = ТекущееПодменю.Заголовок;
+ КонецЕсли;
+ ИначеЕсли НаименованиеТекущегоРаздела <> ПакетСтраниц.Раздел Тогда
+ НаименованиеТекущегоРаздела = ПакетСтраниц.Раздел;
+
+ ЭтоГлавная = (ПакетСтраниц.Раздел = НСтр("ru = 'Главная'"));
+ Если ЭтоГлавная И Не ГлавнаяЗанята Тогда
+ ПакетСтраниц.Идентификатор = "ГлавнаяСтраница";
+ ГлавнаяЗанята = Истина;
+ Продолжить;
+ КонецЕсли;
- Если НаименованиеРаздела = НСтр("ru = 'Главная'") ИЛИ НаименованиеРаздела = "" Тогда
+ Если ЭтоГлавная Или ПакетСтраниц.Раздел = "" Тогда
ТекущееПодменю = Элементы.БезПодменю;
Иначе
ДобавленоПодменю = ДобавленоПодменю + 1;
- ТекущееПодменю = Элементы.Добавить("Подменю" + Строка(ДобавленоПодменю), Тип("ГруппаФормы"), Элементы.ВерхняяПанель);
- ТекущееПодменю.Вид = ВидГруппыФормы.Подменю;
- ТекущееПодменю.Заголовок = НаименованиеРаздела;
+ ИмяПодменю = "Подменю" + Строка(ДобавленоПодменю);
+ ТекущееПодменю = Элементы.Найти(ИмяПодменю);
+ Если ТекущееПодменю = Неопределено Тогда
+ ТекущееПодменю = Элементы.Добавить(ИмяПодменю, Тип("ГруппаФормы"), Элементы.ВерхняяПанель);
+ ТекущееПодменю.Вид = ВидГруппыФормы.Подменю;
+ КонецЕсли;
+ ТекущееПодменю.Заголовок = ПакетСтраниц.Раздел;
КонецЕсли;
-
КонецЕсли;
Если ТекущееПодменю <> Элементы.БезПодменю Тогда
- СтрокаТаблицы.ЗаголовокФормы = СтрокаТаблицы.ЗаголовокФормы + ": " + СтрокаТаблицы.Раздел +" / "+ СтрокаТаблицы.НаименованиеСтартовойСтраницы;
+ ПакетСтраниц.ЗаголовокФормы = ПакетСтраниц.ЗаголовокФормы + ": " + ПакетСтраниц.Раздел +" / "+ ПакетСтраниц.НаименованиеСтартовойСтраницы;
КонецЕсли;
- ИмяКоманды = "ДобавленныйЭлемент_" + СтрокаТаблицы.Идентификатор;
+ ИмяКоманды = "ДобавленныйЭлемент_" + ПакетСтраниц.Идентификатор;
Команда = Команды.Добавить(ИмяКоманды);
Команда.Действие = "Подключаемый_ПерейтиКСтранице";
- Команда.Заголовок = СтрокаТаблицы.НаименованиеСтартовойСтраницы;
+ Команда.Заголовок = ПакетСтраниц.НаименованиеСтартовойСтраницы;
Кнопка = Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), ТекущееПодменю);
Кнопка.ИмяКоманды = ИмяКоманды;
КонецЦикла;
+ Элементы.ГлавнаяСтраница.Видимость = ГлавнаяЗанята;
+
Если МинимальныйПриоритет = 100 Тогда
Возврат Ложь;
КонецЕсли;
- Найденные = ДобавленныеКоманды.НайтиСтроки(Новый Структура("Приоритет", МинимальныйПриоритет));
+ // Определение пакета для отображения.
ГенераторСлучайныхЧисел = Новый ГенераторСлучайныхЧисел;
- НомерСтроки = ГенераторСлучайныхЧисел.СлучайноеЧисло(1, Найденные.Количество());
+ НомерСтроки = ГенераторСлучайныхЧисел.СлучайноеЧисло(1, ПакетыСтраницСМинимальнымПриоритетом.Количество());
+ СтартовыйПакетСтраниц = ПакетыСтраницСМинимальнымПриоритетом[НомерСтроки-1];
- Возврат ПросмотрСтраницы("КомандаИзТаблицыДобавленных", Найденные[НомерСтроки-1]);
+ // Чтение пакета из регистра.
+ НомерПакета = Кэш.ПодготовленныеПакеты.Получить(СтартовыйПакетСтраниц.ИмяМакета);
+ Если НомерПакета = Неопределено Тогда
+ ФайлыПакета = Неопределено;
+ Иначе
+ ЗаписьРегистра = РегистрыСведений.ПакетыИнформацииПриЗапуске.Получить(Новый Структура("Номер", НомерПакета));
+ ФайлыПакета = ЗаписьРегистра.Состав.Получить();
+ КонецЕсли;
+ Если ФайлыПакета = Неопределено Тогда
+ ФайлыПакета = ИнформацияПриЗапуске.ИзвлечьФайлыПакета(РеквизитФормыВЗначение("Объект"), ПакетСтраниц.ИмяМакета);
+ КонецЕсли;
+
+ // Подготовка пакета к показу.
+ РазместитьСтраницыПакета(СтартовыйПакетСтраниц, ФайлыПакета);
+
+ // Показ первой страницы.
+ Если Не ПросмотрСтраницы("КомандаИзТаблицыДобавленных", СтартовыйПакетСтраниц) Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ Возврат Истина;
КонецФункции
&НаСервере
Функция ПросмотрСтраницы(ТипДействия, Параметр = Неопределено)
- Перем СтрокаКоманды, АдресСтраницы, НоваяСтрокаИстории, НоваяСтрокаИндекс;
+ Перем ПакетСтраниц, АдресСтраницы, НоваяСтрокаИстории, НоваяСтрокаИндекс;
Если ТипДействия = "ПоВнутреннейСсылке" Тогда
ИмяОткрываемойСтраницы = Параметр;
СтрокаИстории = ИсторияПросмотра.Получить(ТекущаяСтрокаИндекс);
- СтрокаКоманды = ДобавленныеКоманды.НайтиПоИдентификатору(СтрокаИстории.КомандаИдентификатор);
+ ПакетСтраниц = ПакетыСтраниц.НайтиПоИдентификатору(СтрокаИстории.ИдентификаторПакета);
Поиск = Новый Структура("ОтносительноеИмя", СтрЗаменить(ИмяОткрываемойСтраницы, "\", "/"));
- Найденные = СтрокаКоманды.ВебСтраницы.НайтиСтроки(Поиск);
+ Найденные = ПакетСтраниц.ВебСтраницы.НайтиСтроки(Поиск);
Если Найденные.Количество() = 0 Тогда
Возврат Ложь;
КонецЕсли;
АдресСтраницы = Найденные[0].Адрес;
- ИначеЕсли ТипДействия = "Назад" ИЛИ ТипДействия = "Вперед" Тогда
+ ИначеЕсли ТипДействия = "Назад" Или ТипДействия = "Вперед" Тогда
СтрокаИстории = ИсторияПросмотра.Получить(ТекущаяСтрокаИндекс);
НоваяСтрокаИндекс = ТекущаяСтрокаИндекс + ?(ТипДействия = "Назад", -1, +1);
НоваяСтрокаИстории = ИсторияПросмотра[НоваяСтрокаИндекс];
- СтрокаКоманды = ДобавленныеКоманды.НайтиПоИдентификатору(НоваяСтрокаИстории.КомандаИдентификатор);
+ ПакетСтраниц = ПакетыСтраниц.НайтиПоИдентификатору(НоваяСтрокаИстории.ИдентификаторПакета);
АдресСтраницы = НоваяСтрокаИстории.АдресСтраницы;
ИначеЕсли ТипДействия = "КомандаИзКоманднойПанели" Тогда
ИмяКоманды = Параметр;
- Найденные = ДобавленныеКоманды.НайтиСтроки(Новый Структура("Идентификатор", СтрЗаменить(ИмяКоманды, "ДобавленныйЭлемент_", "")));
+ Найденные = ПакетыСтраниц.НайтиСтроки(Новый Структура("Идентификатор", СтрЗаменить(ИмяКоманды, "ДобавленныйЭлемент_", "")));
Если Найденные.Количество() = 0 Тогда
Возврат Ложь;
КонецЕсли;
- СтрокаКоманды = Найденные[0];
+ ПакетСтраниц = Найденные[0];
ИначеЕсли ТипДействия = "КомандаИзТаблицыДобавленных" Тогда
- СтрокаКоманды = Параметр;
+ ПакетСтраниц = Параметр;
Иначе
@@ -316,18 +302,21 @@
КонецЕсли;
// Размещение во временном хранилище.
- РазместитьСтраницыКоманды(СтрокаКоманды);
+ Если ПакетСтраниц.АдресСтартовойСтраницы = "" Тогда
+ ФайлыПакета = ИнформацияПриЗапуске.ИзвлечьФайлыПакета(РеквизитФормыВЗначение("Объект"), ПакетСтраниц.ИмяМакета);
+ РазместитьСтраницыПакета(ПакетСтраниц, ФайлыПакета);
+ КонецЕсли;
// Получение адреса размещения страницы во временном хранилище.
Если АдресСтраницы = Неопределено Тогда
- АдресСтраницы = СтрокаКоманды.АдресСтартовойСтраницы;
+ АдресСтраницы = ПакетСтраниц.АдресСтартовойСтраницы;
КонецЕсли;
// Регистрация в истории просмотра.
Если НоваяСтрокаИстории = Неопределено Тогда
- НоваяСтрокаИсторииСтруктура = Новый Структура("КомандаИдентификатор, АдресСтраницы");
- НоваяСтрокаИсторииСтруктура.КомандаИдентификатор = СтрокаКоманды.ПолучитьИдентификатор();
+ НоваяСтрокаИсторииСтруктура = Новый Структура("ИдентификаторПакета, АдресСтраницы");
+ НоваяСтрокаИсторииСтруктура.ИдентификаторПакета = ПакетСтраниц.ПолучитьИдентификатор();
НоваяСтрокаИсторииСтруктура.АдресСтраницы = АдресСтраницы;
Найденные = ИсторияПросмотра.НайтиСтроки(НоваяСтрокаИсторииСтруктура);
@@ -359,114 +348,53 @@
// Установка веб содержимого и заголовка формы.
ВебСодержимое = ПолучитьИзВременногоХранилища(АдресСтраницы);
- Заголовок = СтрокаКоманды.ЗаголовокФормы;
+ Заголовок = ПакетСтраниц.ЗаголовокФормы;
Возврат Истина;
КонецФункции
&НаСервере
-Процедура РазместитьСтраницыКоманды(СтрокаТаблицы)
- // Выход если страницы команды уже размещены.
- Если СтрокаТаблицы.АдресСтартовойСтраницы <> "" Тогда
- Возврат;
- КонецЕсли;
-
- // Извлечение страницы
- АрхивПолноеИмя = КаталогВременныхФайлов + "tmp.zip";
- Попытка
- ДвоичныеДанные = РеквизитФормыВЗначение("Объект").ПолучитьМакет(СтрокаТаблицы.ИмяМакета);
- ДвоичныеДанные.Записать(АрхивПолноеИмя);
- Исключение
- ЗаписьЖурналаРегистрации(
- НСтр("ru = 'Информация при запуске'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
- УровеньЖурналаРегистрации.Ошибка,
- ,
- ,
- ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
- Возврат;
- КонецПопытки;
-
- ЧтениеZipФайла = Новый ЧтениеZipФайла(АрхивПолноеИмя);
- ЧтениеZipФайла.ИзвлечьВсе(КаталогВременныхФайлов, РежимВосстановленияПутейФайловZIP.Восстанавливать);
-
- УдалитьФайлы(АрхивПолноеИмя);
-
- Картинки = Новый Соответствие; // Ключ - относительное имя, Значение - адрес в хранилище.
-
- // Регистрация ссылок страниц и создание списка картинок.
- КаталогиФайлов = Новый СписокЗначений;
- КаталогиФайлов.Добавить(КаталогВременныхФайлов, "");
- Осталось = 1;
- Пока Осталось > 0 Цикл
- Осталось = Осталось - 1;
- Каталог = КаталогиФайлов[0];
- КаталогПолныйПуть = Каталог.Значение; // Полный путь в формате файловой системы.
- КаталогОтносительныйПуть = Каталог.Представление; // Относительный путь в URL формате.
- КаталогиФайлов.Удалить(0);
-
- Найденные = НайтиФайлы(КаталогПолныйПуть, "*", Ложь);
- Для Каждого Файл Из Найденные Цикл
- ФайлОтносительноеИмя = КаталогОтносительныйПуть + Файл.Имя;
-
- Если Файл.ЭтоКаталог() Тогда
- Осталось = Осталось + 1;
- КаталогиФайлов.Добавить(Файл.ПолноеИмя, ФайлОтносительноеИмя + "/");
- Продолжить;
- КонецЕсли;
-
- Расширение = СтрЗаменить(НРег(Файл.Расширение), ".", "");
-
- Если Расширение = "htm" ИЛИ Расширение = "html" Тогда
- РазмещениеФайла = СтрокаТаблицы.ВебСтраницы.Добавить();
- РазмещениеФайла.ОтносительноеИмя = ФайлОтносительноеИмя;
- РазмещениеФайла.Адрес = Файл.ПолноеИмя;
- РазмещениеФайла.ОтносительныйКаталог = КаталогОтносительныйПуть;
- Иначе
- Картинка = Новый Картинка(Новый ДвоичныеДанные(Файл.ПолноеИмя));
- АдресКартинки = ПоместитьВоВременноеХранилище(Картинка, УникальныйИдентификатор);
- Картинки.Вставить(ФайлОтносительноеИмя, АдресКартинки);
- КонецЕсли;
- КонецЦикла;
- КонецЦикла;
+Процедура РазместитьСтраницыПакета(ПакетСтраниц, ФайлыПакета)
+ ФайлыПакета.Картинки.Колонки.Добавить("Адрес", Новый ОписаниеТипов("Строка"));
// Регистрация картинок и ссылок на страницы встроенной справки.
- Для НомерСтроки = 1 По СтрокаТаблицы.ВебСтраницы.Количество() Цикл
- РазмещениеФайла = СтрокаТаблицы.ВебСтраницы[НомерСтроки-1];
+ Для Каждого ВебСтраница Из ФайлыПакета.ВебСтраницы Цикл
+ ТекстHTML = ВебСтраница.Данные;
- ЧтениеТекста = Новый ЧтениеТекста(РазмещениеФайла.Адрес, );
- ТекстHTML = ЧтениеТекста.Прочитать();
- ЧтениеТекста.Закрыть();
- ЧтениеТекста = Неопределено;
-
- // Регистрация картинок
- Длина = СтрДлина(РазмещениеФайла.ОтносительныйКаталог);
- Для Каждого КлючИЗначение Из Картинки Цикл
- ПутьККартинке = КлючИЗначение.Ключ;
- АдресКартинки = КлючИЗначение.Значение;
- Если Длина > 0 И Лев(ПутьККартинке, Длина) = РазмещениеФайла.ОтносительныйКаталог Тогда
+ // Регистрация картинок.
+ Длина = СтрДлина(ВебСтраница.ОтносительныйКаталог);
+ Для Каждого Картинка Из ФайлыПакета.Картинки Цикл
+ // Помещение картинок во временное хранилище.
+ Если ПустаяСтрока(Картинка.Адрес) Тогда
+ Картинка.Адрес = ПоместитьВоВременноеХранилище(Картинка.Данные, УникальныйИдентификатор);
+ КонецЕсли;
+ // Вычисление пути к картинки от страницы.
+ // Например в странице "/1/a.htm" путь к картинке "/1/2/b.png" будет значиться как "2/b.png".
+ ПутьККартинке = Картинка.ОтносительноеИмя;
+ Если Длина > 0 И Лев(ПутьККартинке, Длина) = ВебСтраница.ОтносительныйКаталог Тогда
ПутьККартинке = Сред(ПутьККартинке, Длина + 1);
КонецЕсли;
- ТекстHTML = СтрЗаменить(ТекстHTML, ПутьККартинке, АдресКартинки);
+ // Замена относительных путей картинки на адреса во временном хранилище.
+ ТекстHTML = СтрЗаменить(ТекстHTML, ПутьККартинке, Картинка.Адрес);
КонецЦикла;
// Замена относительных встроенных ссылок на абсолютные для этой ИБ.
ТекстHTML = СтрЗаменить(ТекстHTML, "v8config://", СтандартныйПрефикс + "e1cib/helpservice/topics/v8config/");
// Регистрация гиперссылок встроенной справки.
- ДобавитьГиперссылкиВстроеннойСправки(ТекстHTML, СтрокаТаблицы.ВебСтраницы);
+ ДобавитьГиперссылкиВстроеннойСправки(ТекстHTML, ПакетСтраниц.ВебСтраницы);
// Размещение HTML содержимого во временном хранилище.
- РазмещениеФайла.Адрес = ПоместитьВоВременноеХранилище(ТекстHTML, УникальныйИдентификатор);
+ РегистрацияВебСтраницы = ПакетСтраниц.ВебСтраницы.Добавить();
+ РегистрацияВебСтраницы.ОтносительноеИмя = ВебСтраница.ОтносительноеИмя;
+ РегистрацияВебСтраницы.ОтносительныйКаталог = ВебСтраница.ОтносительныйКаталог;
+ РегистрацияВебСтраницы.Адрес = ПоместитьВоВременноеХранилище(ТекстHTML, УникальныйИдентификатор);
// Регистрация стартовой страницы.
- Если РазмещениеФайла.ОтносительноеИмя = СтрокаТаблицы.ИмяФайлаСтартовойСтраницы Тогда
- СтрокаТаблицы.АдресСтартовойСтраницы = РазмещениеФайла.Адрес;
+ Если РегистрацияВебСтраницы.ОтносительноеИмя = ПакетСтраниц.ИмяФайлаСтартовойСтраницы Тогда
+ ПакетСтраниц.АдресСтартовойСтраницы = РегистрацияВебСтраницы.Адрес;
КонецЕсли;
-
КонецЦикла;
-
- // Удаление временных файлов (все файлы были помещены во временные хранилища).
- УдалитьФайлы(КаталогВременныхФайлов, "*");
КонецПроцедуры
&НаСервереБезКонтекста
@@ -478,22 +406,6 @@
КонецЕсли;
КонецПроцедуры
-&НаСервере
-Функция ДанныеКолонки(ТабличныйДокумент, ПрефиксСтроки, НомерКолонки, Тип = "Строка", ЗначениеПоУмолчанию = "")
- Результат = СокрЛП(ТабличныйДокумент.Область(ПрефиксСтроки + Строка(НомерКолонки)).Текст);
- Если ПустаяСтрока(Результат) Тогда
- Возврат ЗначениеПоУмолчанию;
- ИначеЕсли Тип = "Число" Тогда
- Возврат Число(Результат);
- ИначеЕсли Тип = "Дата" Тогда
- Возврат Дата(Результат);
- ИначеЕсли Тип = "Булево" Тогда
- Возврат Результат <> "0";
- Иначе
- Возврат Результат;
- КонецЕсли;
-КонецФункции
-
&НаСервере
Функция ДобавитьГиперссылкиВстроеннойСправки(ТекстHTML, ВебСтраницы)
ПрефиксГиперссылкиВстроеннойСправки = """" + СтандартныйПрефикс + "e1cib/helpservice/topics/v8config/v8cfgHelp/";
@@ -522,4 +434,17 @@
КонецЦикла;
КонецФункции
+&НаКлиентеНаСервереБезКонтекста
+Функция СтрЛевДоСимвола(Строка, Разделитель, Остаток = Неопределено)
+ Позиция = Найти(Строка, Разделитель);
+ Если Позиция = 0 Тогда
+ СтрокаДоТочки = Строка;
+ Остаток = "";
+ Иначе
+ СтрокаДоТочки = Лев(Строка, Позиция - 1);
+ Остаток = Сред(Строка, Позиция + СтрДлина(Разделитель));
+ КонецЕсли;
+ Возврат СтрокаДоТочки;
+КонецФункции
+
#КонецОбласти
diff --git a/SSL/src/DataProcessors/ИнформацияПриЗапуске/Help/ru.html b/SSL/src/DataProcessors/ИнформацияПриЗапуске/Help/ru.html
index 05624c738..6b2f122af 100644
--- a/SSL/src/DataProcessors/ИнформацияПриЗапуске/Help/ru.html
+++ b/SSL/src/DataProcessors/ИнформацияПриЗапуске/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для просмотра справочной, нормативной и другой информации, поставляемой в составе программы.
Для базовых версий показ дополнительной информации при начале работы программы выполняется всегда.
Открывается по команде Информация при запуске из группы Информация на странице Главное. При открытии сразу показывается одна из страниц дополнительной информации.
Открывается из списка Мои бизнес-процессы или из окна бизнес-процесса (например, Задания) по кнопке Карта маршрута.
Ход выполнения бизнес-процесса в программе наглядно представлен в виде карты маршрута. Карта маршрута описывает логику бизнес-процесса и весь его жизненный цикл в виде схематического изображения - последовательности прохождения точек маршрута. Точка маршрута отражает этап бизнес-процесса, связанный с выполнением, как правило, одной операции. При переходе бизнес-процесса в какую-либо точку маршрута, предусматривающую действия конкретного исполнителя, формируется задача. После того как исполнитель отметит задачу как выполненную, бизнес-процесс автоматически перейдет к следующей точке маршрута. Таким образом, с помощью выполнения задач бизнес-процесс продвигается к точке своего завершения.
При работе с программой предусмотрена возможность отображения актуальной карты маршрута для конкретного бизнес-процесса, с учетом пройденных и активных точек маршрута. Пройденные (выполненные) точки маршрута обозначаются штриховкой.
diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/ObjectModule.bsl b/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/ObjectModule.bsl
new file mode 100644
index 000000000..236e6a958
--- /dev/null
+++ b/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/ObjectModule.bsl
@@ -0,0 +1,453 @@
+#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
+
+#Область ПрограммныйИнтерфейс
+
+#Область ЭкспортныеСвойства
+
+// Функция-свойство: результат выполнения обмена данными.
+//
+// Тип: ПеречислениеСсылка.РезультатыВыполненияОбмена
+//
+Функция РезультатВыполненияОбмена() Экспорт
+
+ Возврат КомпонентыОбмена.СостояниеОбменаДанными.РезультатВыполненияОбмена;
+
+КонецФункции
+
+// Функция-свойство: количество объектов, которые были загружены.
+//
+// Тип: Число
+//
+Функция СчетчикЗагруженныхОбъектов() Экспорт
+
+ Возврат КомпонентыОбмена.СчетчикЗагруженныхОбъектов;
+
+КонецФункции
+
+// Функция-свойство: количество объектов, которые были выгружены.
+//
+// Тип: Число
+//
+Функция СчетчикВыгруженныхОбъектов() Экспорт
+
+ Возврат КомпонентыОбмена.СчетчикВыгруженныхОбъектов;
+
+КонецФункции
+
+// Функция-свойство: строка, которая содержит сообщение об ошибке при обмене данными.
+//
+// Тип: Строка
+//
+Функция СтрокаСообщенияОбОшибке() Экспорт
+
+ Возврат КомпонентыОбмена.СтрокаСообщенияОбОшибке;
+
+КонецФункции
+
+// Функция-свойство: флаг ошибки выполнения обмена данными.
+//
+// Тип: Булево
+//
+Функция ФлагОшибки() Экспорт
+
+ Возврат КомпонентыОбмена.ФлагОшибки;
+
+КонецФункции
+
+// Функция-свойство: номер сообщения обмена данными.
+//
+// Тип: Число
+//
+Функция НомерСообщения() Экспорт
+
+ Возврат КомпонентыОбмена.НомерВходящегоСообщения;
+
+КонецФункции
+
+// Функция-свойство: таблица значений со статистической и дополнительной информацией о входящем сообщении обмена.
+//
+// Тип: ТаблицаЗначений
+//
+Функция ТаблицаДанныхЗаголовкаПакета() Экспорт
+
+ Если КомпонентыОбмена = Неопределено Тогда
+ Возврат ОбменДаннымиXDTOСервер.НоваяТаблицаДанныхЗаголовкаПакета();
+ Иначе
+ Возврат КомпонентыОбмена.ТаблицаДанныхЗаголовкаПакета;
+ КонецЕсли;
+
+КонецФункции
+
+// Функция-свойство: соответствие с таблицами данных входящего сообщения обмена.
+//
+// Тип: Соответствие
+//
+Функция ТаблицыДанныхСообщенияОбмена() Экспорт
+
+ Если КомпонентыОбмена = Неопределено Тогда
+ Возврат Новый Соответствие;
+ Иначе
+ Возврат КомпонентыОбмена.ТаблицыДанныхСообщенияОбмена;
+ КонецЕсли;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ВыгрузкаДанных
+
+// Выполняет выгрузку данных
+// -- Все объекты выгружаются в один файл.
+//
+// Параметры:
+//
+Процедура ВыполнитьВыгрузкуДанных(ОбработкаДляЗагрузкиДанных = Неопределено) Экспорт
+
+ КомпонентыОбмена = ОбменДаннымиXDTOСервер.ИнициализироватьКомпонентыОбмена("Отправка");
+
+ КомпонентыОбмена.ВедениеПротоколаДанных.ВыводВПротоколИнформационныхСообщений = ВыводВПротоколИнформационныхСообщений;
+ КомпонентыОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации;
+
+ #Область НастройкаКомпонентовОбменаНаРаботуСУзлом
+ КомпонентыОбмена.УзелКорреспондента = УзелДляОбмена;
+
+ КомпонентыОбмена.ВерсияФорматаОбмена = ОбменДаннымиXDTOСервер.ВерсияФорматаОбменаПриВыгрузке(УзелДляОбмена);
+
+ ФорматОбмена = ОбменДаннымиXDTOСервер.ФорматОбмена(
+ УзелДляОбмена, КомпонентыОбмена.ВерсияФорматаОбмена);
+ КомпонентыОбмена.XMLСхема = ФорматОбмена;
+
+ КомпонентыОбмена.МенеджерОбмена = ОбменДаннымиXDTOСервер.МенеджерОбменаВерсииФормата(
+ УзелДляОбмена, КомпонентыОбмена.ВерсияФорматаОбмена);
+
+ КомпонентыОбмена.ТаблицаПравилаРегистрацииОбъектов = ОбменДаннымиXDTOСервер.ПравилаРегистрацииОбъектов(УзелДляОбмена);
+ КомпонентыОбмена.СвойстваУзлаПланаОбмена = ОбменДаннымиXDTOСервер.СвойстваУзлаПланаОбмена(УзелДляОбмена);
+
+ ОбменДаннымиXDTOСервер.ИнициализироватьТаблицыПравилОбмена(КомпонентыОбмена);
+ #КонецОбласти
+
+ ОбменДаннымиXDTOСервер.ИнициализироватьВедениеПротоколаОбмена(КомпонентыОбмена, ИмяФайлаПротоколаОбмена);
+
+ // Открываем файл обмена
+ ОбменДаннымиXDTOСервер.ОткрытьФайлВыгрузки(КомпонентыОбмена, ИмяФайлаОбмена);
+
+ Если КомпонентыОбмена.ФлагОшибки Тогда
+ КомпонентыОбмена.ФайлОбмена = Неопределено;
+ ОбменДаннымиXDTOСервер.ЗавершитьВедениеПротоколаОбмена(КомпонентыОбмена);
+ Возврат;
+ КонецЕсли;
+
+ // ВЫГРУЗКА ДАННЫХ
+ Попытка
+ ОбменДаннымиXDTOСервер.ПроизвестиВыгрузкуДанных(КомпонентыОбмена);
+ Исключение
+ Если КомпонентыОбмена.ЭтоОбменЧерезПланОбмена Тогда
+ РазблокироватьДанныеДляРедактирования(УзелДляОбмена);
+ КонецЕсли;
+ ОбменДаннымиXDTOСервер.ЗаписатьВПротоколВыполнения(КомпонентыОбмена, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
+ ОбменДаннымиXDTOСервер.ЗавершитьВедениеПротоколаОбмена(КомпонентыОбмена);
+ КомпонентыОбмена.ФайлОбмена = Неопределено;
+ Возврат;
+ КонецПопытки;
+
+ КомпонентыОбмена.ФайлОбмена.Закрыть();
+
+ ОбменДаннымиXDTOСервер.ЗавершитьВедениеПротоколаОбмена(КомпонентыОбмена);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ЗагрузкаДанных
+
+// Выполняет загрузку данных из файла сообщения обмена.
+// Данные загружаются в информационную базу.
+//
+// Параметры:
+//
+Процедура ВыполнитьЗагрузкуДанных() Экспорт
+
+ КомпонентыОбмена = ОбменДаннымиXDTOСервер.ИнициализироватьКомпонентыОбмена("Получение");
+ КомпонентыОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации;
+ КомпонентыОбмена.УзелКорреспондента = УзелОбменаЗагрузкаДанных;
+
+ КомпонентыОбмена.ВедениеПротоколаДанных.ВыводВПротоколИнформационныхСообщений = ВыводВПротоколИнформационныхСообщений;
+ РежимЗагрузкиДанных = "ЗагрузкаВИнформационнуюБазу";
+
+ КомпонентыОбмена.СостояниеОбменаДанными.ДатаНачала = ТекущаяДатаСеанса();
+
+ ОбменДаннымиXDTOСервер.ИнициализироватьВедениеПротоколаОбмена(КомпонентыОбмена, ИмяФайлаПротоколаОбмена);
+
+ Если ПустаяСтрока(ИмяФайлаОбмена) Тогда
+ ОбменДаннымиXDTOСервер.ЗаписатьВПротоколВыполнения(КомпонентыОбмена, 15);
+ ОбменДаннымиXDTOСервер.ЗавершитьВедениеПротоколаОбмена(КомпонентыОбмена);
+ Возврат;
+ КонецЕсли;
+
+ Если ПродолжитьПриОшибке Тогда
+ ИспользоватьТранзакции = Ложь;
+ КомпонентыОбмена.ИспользоватьТранзакции = Ложь;
+ КонецЕсли;
+
+ ОбменДаннымиXDTOСервер.ОткрытьФайлЗагрузки(КомпонентыОбмена, ИмяФайлаОбмена);
+
+ Если КомпонентыОбмена.ФлагОшибки Тогда
+ ОбменДаннымиXDTOСервер.ЗавершитьВедениеПротоколаОбмена(КомпонентыОбмена);
+ Возврат;
+ КонецЕсли;
+
+ ОбменДаннымиXDTOСервер.ИнициализироватьТаблицыПравилОбмена(КомпонентыОбмена);
+
+ Попытка
+ ОбменДаннымиXDTOСервер.ПроизвестиЧтениеДанных(КомпонентыОбмена);
+ Исключение
+ СтрокаСообщения = НСтр("ru = 'Ошибка при загрузке данных: %1'");
+ СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ОписаниеОшибки());
+ ОбменДаннымиXDTOСервер.ЗаписатьВПротоколВыполнения(КомпонентыОбмена, СтрокаСообщения,,,,,Истина);
+ КомпонентыОбмена.ФлагОшибки = Истина;
+ КонецПопытки;
+
+ КомпонентыОбмена.ФайлОбмена.Закрыть();
+
+ Если Не КомпонентыОбмена.ФлагОшибки Тогда
+
+ // Запишем информацию о номере входящего сообщения.
+ ОбъектУзла = УзелОбменаЗагрузкаДанных.ПолучитьОбъект();
+ ОбъектУзла.НомерПринятого = КомпонентыОбмена.НомерВходящегоСообщения;
+ ОбъектУзла.ДополнительныеСвойства.Вставить("ПолучениеСообщенияОбмена");
+ ОбъектУзла.Записать();
+
+ КонецЕсли;
+
+ ОбменДаннымиXDTOСервер.ЗавершитьВедениеПротоколаОбмена(КомпонентыОбмена);
+
+КонецПроцедуры
+
+// Выполняет загрузку данных из файла сообщения обмена в Информационную Базу только заданных типов объектов.
+//
+// Параметры:
+// ТаблицыДляЗагрузки - Массив - массив типов, которые необходимо загрузить из сообщения обмена; элемент массива -
+// Строка.
+// Например, для загрузки из сообщения обмена только элементов справочника Контрагенты:
+// ТаблицыДляЗагрузки = Новый Массив;
+// ТаблицыДляЗагрузки.Добавить("СправочникСсылка.Контрагенты");
+//
+// Список всех типов, которые содержаться в текущем сообщении обмена
+// можно получить вызовом процедуры ВыполнитьАнализСообщенияОбмена().
+//
+Процедура ВыполнитьЗагрузкуДанныхВИнформационнуюБазу(ТаблицыДляЗагрузки) Экспорт
+
+ КомпонентыОбмена = ОбменДаннымиXDTOСервер.ИнициализироватьКомпонентыОбмена("Получение");
+ КомпонентыОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации;
+ КомпонентыОбмена.ВедениеПротоколаДанных.ВыводВПротоколИнформационныхСообщений = ВыводВПротоколИнформационныхСообщений;
+ КомпонентыОбмена.УзелКорреспондента = УзелОбменаЗагрузкаДанных;
+
+ РежимЗагрузкиДанных = "ЗагрузкаВИнформационнуюБазу";
+
+ КомпонентыОбмена.СостояниеОбменаДанными.ДатаНачала = ТекущаяДатаСеанса();
+
+ ОбменДаннымиXDTOСервер.ОткрытьФайлЗагрузки(КомпонентыОбмена, ИмяФайлаОбмена);
+
+ Если КомпонентыОбмена.ФлагОшибки Тогда
+ ОбменДаннымиXDTOСервер.ЗавершитьВедениеПротоколаОбмена(КомпонентыОбмена);
+ Возврат;
+ КонецЕсли;
+
+ ОбменДаннымиXDTOСервер.ИнициализироватьТаблицыПравилОбмена(КомпонентыОбмена);
+
+ // Запись в журнале регистрации.
+ СтрокаСообщения = НСтр("ru = 'Начало процесса обмена данными для узла: %1'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка());
+ СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, Строка(УзелОбменаЗагрузкаДанных));
+ ОбменДаннымиXDTOСервер.ЗаписьЖурналаРегистрацииОбменДанными(СтрокаСообщения, КомпонентыОбмена, УровеньЖурналаРегистрации.Информация);
+
+ ОбменДаннымиXDTOСервер.ПроизвестиЧтениеДанных(КомпонентыОбмена, ТаблицыДляЗагрузки);
+
+ // Запись в журнале регистрации.
+ СтрокаСообщения = НСтр("ru = '%1, %2; Обработано %3 объектов'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка());
+ СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения,
+ КомпонентыОбмена.СостояниеОбменаДанными.РезультатВыполненияОбмена,
+ Перечисления.ДействияПриОбмене.ЗагрузкаДанных,
+ Формат(КомпонентыОбмена.СчетчикЗагруженныхОбъектов, "ЧГ=0"));
+
+ ОбменДаннымиXDTOСервер.ЗаписьЖурналаРегистрацииОбменДанными(СтрокаСообщения, КомпонентыОбмена, УровеньЖурналаРегистрации.Информация);
+
+КонецПроцедуры
+
+// Выполняет последовательное чтение файла сообщения обмена при этом:
+// - удаляется регистрация изменений по номеру входящей квитанции
+// - загружаются правила обмена
+// - загружается информация о типах данных
+// - зачитывается информация сопоставления данных и записывается и ИБ
+// - собирается информация о типах объектов и их количестве.
+//
+// Параметры:
+// Нет.
+//
+Процедура ВыполнитьАнализСообщенияОбмена(ПараметрыАнализа = Неопределено) Экспорт
+
+ РежимЗагрузкиДанных = "ЗагрузкаВТаблицуЗначений";
+ ИспользоватьТранзакции = Ложь;
+
+ КомпонентыОбмена = ОбменДаннымиXDTOСервер.ИнициализироватьКомпонентыОбмена("Получение");
+ КомпонентыОбмена.ВедениеПротоколаДанных.ВыводВПротоколИнформационныхСообщений = ВыводВПротоколИнформационныхСообщений;
+ КомпонентыОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации;
+ КомпонентыОбмена.УзелКорреспондента = УзелОбменаЗагрузкаДанных;
+ КомпонентыОбмена.РежимЗагрузкиДанныхВИнформационнуюБазу = Ложь;
+
+ ОбменДаннымиXDTOСервер.ИнициализироватьВедениеПротоколаОбмена(КомпонентыОбмена, ИмяФайлаПротоколаОбмена);
+
+ Если ПустаяСтрока(ИмяФайлаОбмена) Тогда
+ ОбменДаннымиXDTOСервер.ЗаписатьВПротоколВыполнения(КомпонентыОбмена, 15);
+ ОбменДаннымиXDTOСервер.ЗавершитьВедениеПротоколаОбмена(КомпонентыОбмена);
+ Возврат;
+ КонецЕсли;
+
+ // дата начала анализа
+ КомпонентыОбмена.СостояниеОбменаДанными.ДатаНачала = ТекущаяДатаСеанса();
+
+ ОбменДаннымиXDTOСервер.ОткрытьФайлЗагрузки(КомпонентыОбмена, ИмяФайлаОбмена);
+
+ Если КомпонентыОбмена.ФлагОшибки Тогда
+ ОбменДаннымиXDTOСервер.ЗавершитьВедениеПротоколаОбмена(КомпонентыОбмена);
+ Возврат;
+ КонецЕсли;
+
+ ОбменДаннымиXDTOСервер.ИнициализироватьТаблицыПравилОбмена(КомпонентыОбмена);
+
+ Попытка
+
+ // Зачитываем данные из сообщения обмена.
+ ОбменДаннымиXDTOСервер.ПроизвестиЧтениеДанныхВРежимеАнализа(КомпонентыОбмена, ПараметрыАнализа);
+
+ // Формируем временную таблицу данных.
+ ТаблицаДанныхЗаголовкаПакетаВременная = КомпонентыОбмена.ТаблицаДанныхЗаголовкаПакета.Скопировать(, "ТипИсточникаСтрокой, ТипПриемникаСтрокой, ПоляПоиска, ПоляТаблицы");
+ ТаблицаДанныхЗаголовкаПакетаВременная.Свернуть("ТипИсточникаСтрокой, ТипПриемникаСтрокой, ПоляПоиска, ПоляТаблицы");
+
+ // Сворачиваем таблицу данных заголовка пакета.
+ КомпонентыОбмена.ТаблицаДанныхЗаголовкаПакета.Свернуть(
+ "ТипОбъектаСтрокой, ТипИсточникаСтрокой, ТипПриемникаСтрокой, СинхронизироватьПоИдентификатору, ЭтоКлассификатор, ЭтоУдалениеОбъекта, ИспользоватьПредварительныйПросмотр",
+ "КоличествоОбъектовВИсточнике"
+ );
+ //
+ КомпонентыОбмена.ТаблицаДанныхЗаголовкаПакета.Колонки.Добавить("ПоляПоиска", Новый ОписаниеТипов("Строка"));
+ КомпонентыОбмена.ТаблицаДанныхЗаголовкаПакета.Колонки.Добавить("ПоляТаблицы", Новый ОписаниеТипов("Строка"));
+
+ Для Каждого СтрокаТаблицы Из КомпонентыОбмена.ТаблицаДанныхЗаголовкаПакета Цикл
+
+ Отбор = Новый Структура;
+ Отбор.Вставить("ТипИсточникаСтрокой", СтрокаТаблицы.ТипИсточникаСтрокой);
+ Отбор.Вставить("ТипПриемникаСтрокой", СтрокаТаблицы.ТипПриемникаСтрокой);
+
+ СтрокиВременнойТаблицы = ТаблицаДанныхЗаголовкаПакетаВременная.НайтиСтроки(Отбор);
+
+ СтрокаТаблицы.ПоляПоиска = СтрокиВременнойТаблицы[0].ПоляПоиска;
+ СтрокаТаблицы.ПоляТаблицы = СтрокиВременнойТаблицы[0].ПоляТаблицы;
+
+ КонецЦикла;
+
+ Исключение
+ СтрокаСообщения = НСтр("ru = 'Ошибка при анализе данных: %1'");
+ СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ОписаниеОшибки());
+ ОбменДаннымиXDTOСервер.ЗаписатьВПротоколВыполнения(КомпонентыОбмена, СтрокаСообщения,,,,,Истина);
+ КонецПопытки;
+
+ КомпонентыОбмена.ФайлОбмена.Закрыть();
+
+ ОбменДаннымиXDTOСервер.ЗавершитьВедениеПротоколаОбмена(КомпонентыОбмена);
+
+КонецПроцедуры
+
+// Выполняет загрузку данных из файла сообщения обмена в Таблицу значений только заданных типов объектов.
+//
+// Параметры:
+// ТаблицыДляЗагрузки - Массив - массив типов, которые необходимо загрузить из сообщения обмена; элемент массива -
+// Строка.
+// Например, для загрузки из сообщения обмена только элементов справочника Контрагенты:
+// ТаблицыДляЗагрузки = Новый Массив;
+// ТаблицыДляЗагрузки.Добавить("СправочникСсылка.Контрагенты");
+//
+// Список всех типов, которые содержаться в текущем сообщении обмена
+// можно получить вызовом процедуры ВыполнитьАнализСообщенияОбмена().
+//
+Процедура ВыполнитьЗагрузкуДанныхВТаблицуЗначений(ТаблицыДляЗагрузки) Экспорт
+
+ РежимЗагрузкиДанных = "ЗагрузкаВТаблицуЗначений";
+ ИспользоватьТранзакции = Ложь;
+
+ Если КомпонентыОбмена = Неопределено Тогда
+
+ КомпонентыОбмена = ОбменДаннымиXDTOСервер.ИнициализироватьКомпонентыОбмена("Получение");
+ КомпонентыОбмена.КлючСообщенияЖурналаРегистрации = КлючСообщенияЖурналаРегистрации;
+ КомпонентыОбмена.ВедениеПротоколаДанных.ВыводВПротоколИнформационныхСообщений = ВыводВПротоколИнформационныхСообщений;
+ КомпонентыОбмена.УзелКорреспондента = УзелОбменаЗагрузкаДанных;
+
+ ОбменДаннымиXDTOСервер.ОткрытьФайлЗагрузки(КомпонентыОбмена, ИмяФайлаОбмена);
+
+ Если КомпонентыОбмена.ФлагОшибки Тогда
+ ОбменДаннымиXDTOСервер.ЗавершитьВедениеПротоколаОбмена(КомпонентыОбмена);
+ Возврат;
+ КонецЕсли;
+
+ ОбменДаннымиXDTOСервер.ИнициализироватьТаблицыПравилОбмена(КомпонентыОбмена);
+ Иначе
+ ОбменДаннымиXDTOСервер.ОткрытьФайлЗагрузки(КомпонентыОбмена, ИмяФайлаОбмена);
+ КонецЕсли;
+
+ КомпонентыОбмена.СостояниеОбменаДанными.ДатаНачала = ТекущаяДатаСеанса();
+ КомпонентыОбмена.РежимЗагрузкиДанныхВИнформационнуюБазу = Ложь;
+
+ // Инициализируем таблицы данных сообщения обмена.
+ Для Каждого КлючТаблицыДанных Из ТаблицыДляЗагрузки Цикл
+
+ МассивПодстрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(КлючТаблицыДанных, "#");
+
+ ТипОбъекта = МассивПодстрок[1];
+
+ КомпонентыОбмена.ТаблицыДанныхСообщенияОбмена.Вставить(КлючТаблицыДанных, ИнициализацияТаблицыДанныхСообщенияОбмена(Тип(ТипОбъекта)));
+
+ КонецЦикла;
+
+ ОбменДаннымиXDTOСервер.ПроизвестиЧтениеДанных(КомпонентыОбмена, ТаблицыДляЗагрузки);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область Прочее
+
+Функция ИнициализацияТаблицыДанныхСообщенияОбмена(ТипОбъекта)
+
+ ТаблицаДанныхСообщенияОбмена = Новый ТаблицаЗначений;
+
+ Колонки = ТаблицаДанныхСообщенияОбмена.Колонки;
+
+ // обязательные поля
+ Колонки.Добавить("УникальныйИдентификатор", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(36)));
+ Колонки.Добавить("ТипСтрокой", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(255)));
+
+ ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипОбъекта);
+
+ // Получаем описание всех полей объекта метаданного из конфигурации.
+ ТаблицаОписанияСвойствОбъекта = ОбщегоНазначения.ПолучитьТаблицуОписанияСвойствОбъекта(ОбъектМетаданных, "Имя, Тип");
+
+ Для Каждого ОписаниеСвойства Из ТаблицаОписанияСвойствОбъекта Цикл
+
+ Колонки.Добавить(ОписаниеСвойства.Имя, ОписаниеСвойства.Тип);
+
+ КонецЦикла;
+
+ Возврат ТаблицаДанныхСообщенияОбмена;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ОператорыОсновнойПрограммы
+
+Параметры = Новый Структура;
+
+#КонецОбласти
+
+#КонецЕсли
\ No newline at end of file
diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/КонвертацияОбъектовXDTO.mdo b/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/КонвертацияОбъектовXDTO.mdo
new file mode 100644
index 000000000..5c7198238
--- /dev/null
+++ b/SSL/src/DataProcessors/КонвертацияОбъектовXDTO/КонвертацияОбъектовXDTO.mdo
@@ -0,0 +1,271 @@
+
+
+
+
+
+
+ КонвертацияОбъектовXDTO
+
+ ru
+ Конвертация объектов XDTO
+
+ true
+
+ ВыводВОкноСообщенийИнформационныхСообщений
+
+ ru
+ Вывод в окно сообщений информационных сообщений
+
+
+ Boolean
+
+
+
+
+
+ ВыводВПротоколИнформационныхСообщений
+
+ ru
+ Вывод в протокол информационных сообщений
+
+
+ Boolean
+
+
+
+
+
+ ВыгружатьТолькоРазрешенные
+
+ ru
+ Выгружать только разрешенные
+
+
+ Boolean
+
+
+
+
+
+ ДописыватьДанныеВПротоколОбмена
+
+ ru
+ Дописывать данные в протокол обмена
+
+
+ Boolean
+
+
+
+
+
+ ИмяПланаОбменаВРО
+
+ ru
+ Имя плана обмена с выборочной регистраций объектов
+
+
+ String
+
+ 150
+
+
+
+
+
+
+ ИмяФайлаОбмена
+
+ ru
+ Имя файла обмена
+
+
+ String
+
+
+
+
+
+
+ ИмяФайлаПротоколаОбмена
+
+ ru
+ Имя файла протокола обмена
+
+
+ String
+
+ 255
+
+
+
+
+
+
+ ИспользоватьТранзакции
+
+ ru
+ Использовать транзакции
+
+
+ Boolean
+
+
+
+
+
+ КоличествоОбработанныхОбъектовДляОбновленияСтатуса
+
+ ru
+ Количество обработанных объектов для обновления статуса
+
+
+ Number
+
+ 10
+ true
+
+
+
+
+
+
+ КоличествоОбъектовНаТранзакцию
+
+ ru
+ Количество объектов на транзакцию
+
+
+ Number
+
+ 10
+ true
+
+
+
+
+
+
+ КомментарийПриВыгрузкеДанных
+
+ ru
+ Комментарий при выгрузке данных
+
+
+ String
+
+
+
+
+
+
+ КомментарийПриЗагрузкеДанных
+
+ ru
+ Комментарий при загрузке данных
+
+
+ String
+
+
+
+
+
+
+ Параметры
+
+ ru
+ Параметры
+
+
+
+
+
+
+ ПродолжитьПриОшибке
+
+ ru
+ Продолжить при ошибке
+
+
+ Boolean
+
+
+
+
+
+ РежимЗагрузкиДанных
+
+ ru
+ Режим загрузки данных
+
+
+ String
+
+
+
+
+
+
+ РежимОбмена
+
+ ru
+ Режим обмена
+
+
+ String
+
+ 10
+
+
+
+
+
+
+ УзелДляОбмена
+
+ ru
+ Узел для обмена
+
+
+ ExchangePlanRef
+
+
+
+
+
+ УзелОбменаЗагрузкаДанных
+
+ ru
+ Узел обмена загрузка данных
+
+
+ ExchangePlanRef
+
+
+
+
+
+ КомпонентыОбмена
+
+ ru
+ Компоненты обмена
+
+
+
+
+
+
+ КлючСообщенияЖурналаРегистрации
+
+ ru
+ Ключ сообщения журнала регистрации
+
+
+ String
+
+
+
+
+
+
diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl b/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl
index ebaa088c6..07ca9d4a7 100644
--- a/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl
+++ b/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl
@@ -441,21 +441,6 @@
Возврат ПолеТаблицыОписанийСвойствОбъектов;
КонецФункции
-Функция ДокументыДляОтложенногоПроведения()
-
- Если ТипЗнч(ПолеДокументыДляОтложенногоПроведения) <> Тип("ТаблицаЗначений") Тогда
-
- // Инициализируем таблицу для отложенного проведения документов.
- ПолеДокументыДляОтложенногоПроведения = Новый ТаблицаЗначений;
- ПолеДокументыДляОтложенногоПроведения.Колонки.Добавить("ДокументСсылка");
- ПолеДокументыДляОтложенногоПроведения.Колонки.Добавить("ДатаДокумента", одОписаниеТипа("Дата"));
-
- КонецЕсли;
-
- Возврат ПолеДокументыДляОтложенногоПроведения;
-
-КонецФункции
-
Функция ДополнительныеСвойстваДляОтложенногоПроведения()
Если ТипЗнч(СоответствиеДокументовДляОтложенногоПроведения) <> Тип("Соответствие") Тогда
@@ -882,12 +867,12 @@
// Отложенная запись того, что не записали.
ПровестиЗаписьНеЗаписанныхОбъектов();
+ ВыполнитьОбработчикПослеЗагрузкиДанных();
+
Если ФлагОшибки() Тогда
ВызватьИсключение НСтр("ru = 'Возникли ошибки при загрузке данных.'");
КонецЕсли;
- ЗакончитьЧтениеСообщения(ЧтениеСообщения);
-
Если ИспользоватьТранзакции Тогда
ЗафиксироватьТранзакцию();
КонецЕсли;
@@ -903,6 +888,8 @@
ВыполнитьОтложенноеПроведениеДокументов();
ВыполнитьОтложеннуюЗаписьОбъектов();
+ ЗакончитьЧтениеСообщения(ЧтениеСообщения);
+
Исключение
Если ЧтениеСообщения <> Неопределено
И ЧтениеСообщения.СообщениеБылоПринятоРанее Тогда
@@ -1125,6 +1112,8 @@
КонецЦикла;
+ ВыполнитьОбработчикПослеЗагрузкиДанных();
+
ЗакончитьЧтениеСообщения(ЧтениеСообщения);
Исключение
@@ -1621,7 +1610,8 @@
ИмяКонстантыДляВыгрузки = "",
ЭтоВыгружаетсяОбъект = Неопределено,
ЭтоПравилоСГлобальнойВыгрузкойОбъектов = Ложь,
- НеИспользоватьПравилоСГлобальнойВыгрузкойИНеЗапоминатьВыгруженные = Ложь) Экспорт
+ НеИспользоватьПравилоСГлобальнойВыгрузкойИНеЗапоминатьВыгруженные = Ложь,
+ СтекВыгрузкиОбъекта = Неопределено) Экспорт
//
ОпределитьПКОПоПараметрам(ПКО, Источник, ИмяПКО);
@@ -1663,7 +1653,27 @@
ЭтоПравилоСГлобальнойВыгрузкойОбъектов = Ложь;
- ЗапоминатьВыгруженные = Ложь;
+ Если СтекВыгрузкиОбъекта = Неопределено Тогда
+ СтекВыгрузкиОбъекта = Новый Массив;
+ КонецЕсли;
+
+ СвойстваДляПереноса = Новый Структура("Ссылка");
+ Если Источник <> Неопределено И ТипЗнч(Источник) <> Тип("Строка") Тогда
+ ЗаполнитьЗначенияСвойств(СвойстваДляПереноса, Источник);
+ КонецЕсли;
+ ИсточникСсылка = СвойстваДляПереноса.Ссылка;
+
+ ОбъектВыгружаетсяПоСсылкеИзСамогоСебя = Ложь;
+ Если ЗначениеЗаполнено(ИсточникСсылка) Тогда
+ ПорядковыйНомерВСтеке = СтекВыгрузкиОбъекта.Найти(ИсточникСсылка);
+ ОбъектВыгружаетсяПоСсылкеИзСамогоСебя = ПорядковыйНомерВСтеке <> Неопределено;
+ КонецЕсли;
+
+ СтекВыгрузкиОбъекта.Добавить(ИсточникСсылка);
+
+ // Циклическая ссылка на объект.
+ ЗапоминатьВыгруженные = ОбъектВыгружаетсяПоСсылкеИзСамогоСебя;
+
ВыгруженныеОбъекты = ПКО.Выгруженные;
ВсеОбъектыВыгружены = ПКО.ВсеОбъектыВыгружены;
НеЗамещатьОбъектПриЗагрузке = ПКО.НеЗамещать;
@@ -1978,7 +1988,7 @@
Если НеНужноВыгружатьПоСоответствиюЗначений Тогда
Если ПКО.СвойстваПоиска.Количество() > 0
- ИЛИ ИмяПредопределенногоЭлемента <> Неопределено Тогда
+ ИЛИ ИмяПредопределенногоЭлемента <> Неопределено Тогда
// Формируем узел ссылки
УзелСсылки = СоздатьУзел("Ссылка");
@@ -2017,7 +2027,7 @@
ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, ПКО.СвойстваПоиска,
УзелСсылки, , ИмяПредопределенногоЭлемента, Истина,
- Истина, ВыгружаетсяОбъект, КлючВыгружаемыхДанных, , ЗначениеСсылкиВДругойИБ);
+ Истина, ВыгружаетсяОбъект, КлючВыгружаемыхДанных, , ЗначениеСсылкиВДругойИБ,,, СтекВыгрузкиОбъекта);
КонецЕсли;
@@ -2204,7 +2214,8 @@
, // НеИспользоватьПравилаСГлобальнойВыгрузкойИНеЗапоминатьВыгруженные = Ложь
ЗначениеСсылкиВДругойИБ, // ЗначениеСсылкиВДругойИБ
СписокВременныхФайлов, // СписокВременныхФайлов = Неопределено
- ВыгрузкаСтрокиНабораЗаписейРегистра); // ВыгрузкаСтрокиНабораЗаписейРегистра = Ложь
+ ВыгрузкаСтрокиНабораЗаписейРегистра, // ВыгрузкаСтрокиНабораЗаписейРегистра = Ложь
+ СтекВыгрузкиОбъекта);
КонецЕсли;
@@ -2561,6 +2572,48 @@
КонецПроцедуры
+// Возвращает таблицу значений, в которой содержатся ссылки на документы для отложенного проведения,
+// а также даты этих документов для предварительной сортировки.
+//
+// Возвращаемое значение:
+// Таблица значений, колонки:
+// ДокументСсылка - ссылка, ссылка на загруженный документ требующий отложенного проведения;
+// ДатаДокумента - дата, дата загруженного документа для предварительной сортировки таблицы.
+//
+Функция ДокументыДляОтложенногоПроведения() Экспорт
+
+ Если ТипЗнч(ПолеДокументыДляОтложенногоПроведения) <> Тип("ТаблицаЗначений") Тогда
+
+ // Инициализируем таблицу для отложенного проведения документов.
+ ПолеДокументыДляОтложенногоПроведения = Новый ТаблицаЗначений;
+ ПолеДокументыДляОтложенногоПроведения.Колонки.Добавить("ДокументСсылка");
+ ПолеДокументыДляОтложенногоПроведения.Колонки.Добавить("ДатаДокумента", одОписаниеТипа("Дата"));
+
+ КонецЕсли;
+
+ Возврат ПолеДокументыДляОтложенногоПроведения;
+
+КонецФункции
+
+// Добавляет в таблицу отложенного проведения строку содержащую ссылку на документ,
+// который необходимо провести и дату документа для предварительной сортировки.
+//
+// Параметры:
+// СсылкаНаОбъект - Ссылка, объект, который необходимо провести отложенно;
+// ДатаОбъекта - Дата, дата объекта;
+// ДополнительныеСвойства - Структура, дополнительные свойства записываемого объекта.
+//
+Процедура ДобавитьОбъектДляОтложенногоПроведения(СсылкаНаОбъект, ДатаОбъекта, ДополнительныеСвойства) Экспорт
+
+ ТаблицаОтложенногоПроведения = ДокументыДляОтложенногоПроведения();
+ НоваяСтрока = ТаблицаОтложенногоПроведения.Добавить();
+ НоваяСтрока.ДокументСсылка = СсылкаНаОбъект;
+ НоваяСтрока.ДатаДокумента = ДатаОбъекта;
+
+ ДополнительныеСвойстваДляОтложенногоПроведения().Вставить(СсылкаНаОбъект, ДополнительныеСвойства);
+
+КонецПроцедуры
+
Процедура ПолучитьЗначенияПредопределенныхДанных(Знач ПКО)
ПКО.ЗначенияПредопределенныхДанных = Новый Соответствие;
@@ -4542,7 +4595,11 @@
КонецЕсли;
- // ПОЛУЧАЕМ ПОЛЯ ТАБЛИЦЫ И ПОЛЯ ПОИСКА ДЛЯ ПРАВИЛ ЗАГРУЗКИ ДАННЫХ (ЗаписьXML)
+ КонецЕсли;
+
+ ПоляТаблицы = "";
+ ПоляПоиска = "";
+ Если НоваяСтрока.Свойства.Количество() > 0 Тогда
СвойстваМассив = НоваяСтрока.Свойства.Скопировать(Новый Структура("ЭтоГруппа, ИмяПараметраДляПередачи", Ложь, ""), "Приемник").ВыгрузитьКолонку("Приемник");
@@ -4571,6 +4628,21 @@
ПоляТаблицы = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(СвойстваМассив);
ПоляПоиска = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(СвойстваПоискаМассив);
+ КонецЕсли;
+
+ Если РежимОбмена = "Загрузка" Тогда
+
+ // Загрузка правил корреспондента - необходимо запомнить поля поиска и поля таблицы.
+ Если Не ЗначениеЗаполнено(НоваяСтрока.ПоляТаблицы) Тогда
+ НоваяСтрока.ПоляТаблицы = ПоляТаблицы;
+ КонецЕсли;
+
+ Если Не ЗначениеЗаполнено(НоваяСтрока.ПоляПоиска) Тогда
+ НоваяСтрока.ПоляПоиска = ПоляПоиска;
+ КонецЕсли;
+
+ Иначе
+
Если Не ПустаяСтрока(ПоляТаблицы) Тогда
одЗаписатьЭлемент(ЗаписьXML, "ПоляТаблицы", ПоляТаблицы);
КонецЕсли;
@@ -5952,7 +6024,7 @@
КонецПроцедуры
-Процедура ЗакончитьЧтениеСообщения(Знач ЧтениеСообщения)
+Процедура ВыполнитьОбработчикПослеЗагрузкиДанных()
// {Обработчик: ПослеЗагрузкиДанных} Начало
Если Не ПустаяСтрока(Конвертация.ПослеЗагрузкиДанных) Тогда
@@ -5976,6 +6048,10 @@
КонецЕсли;
// {Обработчик: ПослеЗагрузкиДанных} Окончание
+КонецПроцедуры
+
+Процедура ЗакончитьЧтениеСообщения(Знач ЧтениеСообщения)
+
Если ФайлОбмена.ТипУзла <> ТипУзлаXML.КонецЭлемента Тогда
ВызватьИсключение НСтр("ru = 'Ошибка формата сообщения обмена.'");
КонецЕсли;
@@ -7492,8 +7568,13 @@
СсылкаНаОбъект = НайтиЭлементПоСвойствамПоиска(ТипОбъекта, ИмяТипаОбъекта, СвойстваПоиска, СтруктураСвойств,
СтрокаИменСвойствПоиска, ПоискПоДатеНаРавенство);
- НеНужноВыполнятьПоиск = ЗначениеЗаполнено(СсылкаНаОбъект);
-
+ НеНужноВыполнятьПоиск = ЗначениеЗаполнено(СсылкаНаОбъект);
+
+ Если СсылкаНаОбъект <> Неопределено
+ И СсылкаНаОбъект.Пустая() Тогда
+ СсылкаНаОбъект = Неопределено;
+ КонецЕсли;
+
КонецЕсли;
Если НеНужноВыполнятьПоиск Тогда
@@ -7925,6 +8006,7 @@
КопияТЧДляПоиска = Неопределено;
Движения = Объект.Движения[Имя];
+ Движения.Записывать = Истина;
Движения.Прочитать();
@@ -10392,8 +10474,6 @@
ДобавитьПодчиненный(УзелСубконто, УзелСвойства);
-
-
// Значение
УзелСвойства = СоздатьУзел("Свойство");
@@ -10432,7 +10512,33 @@
Иначе
ЭтоПравилоСГлобальнойВыгрузкой = Ложь;
- УзелСсылки = ВыгрузитьПоПравилу(Субконто,, ИсходящиеДанные, , ИмяПКО, , ИСТИНА, ПКОЗначение, , , , , Ложь, ЭтоПравилоСГлобальнойВыгрузкой);
+
+ ВыгрузитьТолькоСсылку = Истина;
+ Если ВыгружатьОбъектПоСсылке(Субконто, УзелДляОбмена) Тогда
+
+ Если Не ОбъектПроходитФильтрРазрешенныхОбъектов(Субконто) Тогда
+
+ // Выставляем признак того, что объект должен быть выгружен полностью.
+ ВыгрузитьТолькоСсылку = Ложь;
+
+ // Добавляем запись в регистр сопоставления.
+ СтруктураЗаписи = Новый Структура;
+ СтруктураЗаписи.Вставить("УзелИнформационнойБазы", УзелДляОбмена);
+ СтруктураЗаписи.Вставить("УникальныйИдентификаторИсточника", Субконто);
+ СтруктураЗаписи.Вставить("ОбъектВыгруженПоСсылке", Истина);
+
+ РегистрыСведений.СоответствияОбъектовИнформационныхБаз.ДобавитьЗапись(СтруктураЗаписи, Истина);
+
+ // Добавляем объект в массив выгруженных по ссылке объектов
+ // для последующей регистрации объектов на текущем узле
+ // и для присвоения номера текущего отправленного сообщения обмена.
+ ВыгруженныеПоСсылкеОбъектыДобавитьЗначение(Субконто);
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ УзелСсылки = ВыгрузитьПоПравилу(Субконто,, ИсходящиеДанные, , ИмяПКО, , ВыгрузитьТолькоСсылку, ПКОЗначение, , , , , Ложь, ЭтоПравилоСГлобальнойВыгрузкой);
УстановитьАтрибут(УзелСвойства, "Имя", "Значение");
ВыгрузитьТипСвойстваЭлемента(УзелСвойства, ТипПриемника);
@@ -10820,7 +10926,8 @@
НеИспользоватьПравилаСГлобальнойВыгрузкойИНеЗапоминатьВыгруженные = Ложь,
ЗначениеСсылкиВДругойИБ = "",
СписокВременныхФайлов = Неопределено,
- ВыгрузкаСтрокиНабораЗаписейРегистра = Ложь)
+ ВыгрузкаСтрокиНабораЗаписейРегистра = Ложь,
+ СтекВыгрузкиОбъекта = Неопределено)
// Переменные-заглушки для поддержки механизма отладки кода обработчиков событий.
Перем КлючИЗначение, ВидСубконто, Субконто, ИмяПКОВидСубконто, УзелСубконто;
@@ -11209,9 +11316,15 @@
КонецЕсли;
+ Если ЗначениеЗаполнено(СтекВыгрузкиОбъекта) Тогда
+ ОтветвлениеСтекаВыгрузки = ОбщегоНазначенияКлиентСервер.СкопироватьМассив(СтекВыгрузкиОбъекта);
+ Иначе
+ ОтветвлениеСтекаВыгрузки = Новый Массив;
+ КонецЕсли;
+
ПравилоСГлобальнойВыгрузкой = Ложь;
УзелСсылки = ВыгрузитьПоПравилу(Значение, , ИсходящиеДанные, , ИмяПКО, , ВыгрузитьТолькоСсылку, ПКОСвойств, , , , , Ложь,
- ПравилоСГлобальнойВыгрузкой, НеИспользоватьПравилаСГлобальнойВыгрузкойИНеЗапоминатьВыгруженные);
+ ПравилоСГлобальнойВыгрузкой, НеИспользоватьПравилаСГлобальнойВыгрузкойИНеЗапоминатьВыгруженные, ОтветвлениеСтекаВыгрузки);
Если УзелСсылки = Неопределено Тогда
@@ -13391,12 +13504,12 @@
// Отложенная запись того, что не записали.
ПровестиЗаписьНеЗаписанныхОбъектов();
+ ВыполнитьОбработчикПослеЗагрузкиДанных();
+
Если ФлагОшибки() Тогда
ВызватьИсключение НСтр("ru = 'Возникли ошибки при загрузке данных.'");
КонецЕсли;
- ЗакончитьЧтениеСообщения(ЧтениеСообщения);
-
Если ИспользоватьТранзакции Тогда
ЗафиксироватьТранзакцию();
КонецЕсли;
@@ -13412,6 +13525,8 @@
ВыполнитьОтложенноеПроведениеДокументов();
ВыполнитьОтложеннуюЗаписьОбъектов();
+ ЗакончитьЧтениеСообщения(ЧтениеСообщения);
+
Исключение
Если ЧтениеСообщения <> Неопределено
И ЧтениеСообщения.СообщениеБылоПринятоРанее Тогда
@@ -15017,6 +15132,8 @@
ОтработатьУдалениеОбъекта(Данные);
Продолжить;
+ ИначеЕсли ТипДанныхДляВыгрузки = ТипРегистрСоответствия Тогда
+ Продолжить;
КонецЕсли;
ОбъектМетаданныхТекущий = Данные.Метаданные();
diff --git a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Help/ru.html b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Help/ru.html
index 2bd3e5f4b..fc0e5c5d0 100644
--- a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Help/ru.html
+++ b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для проверки легальности получения обновлений.
При обновлении программа запрашивает у администратора подтверждение, что файлы обновления были получены легальным способом.
УСЛОВИЯ РАСПРОСТРАНЕНИЯ ОБНОВЛЕНИЙ ПРОГРАММ "1С:ПРЕДПРИЯТИЕ"
Обновления к программам производства фирмы "1С", также как и сами программы, являются объектами исключительного права фирмы "1С" и распространяются по правилам, установленным фирмой "1С" как правообладателем в соответствии со ст. 1225 Гражданского кодекса.
В случае если в кластере серверов 1С:Предприятия для данной информационной базы используются профили безопасности, ограничивающие доступ к внешним (относительно кластера серверов 1С:Предприятия) ресурсам, то для корректной работы программы требуется внести изменения в состав разрешений в профиле безопасности.
В списке перечислены внешние ресурсы, возможность использования которых будет разрешена.
В данной панели осуществляется настройка использования для информационной базы профилей безопасности кластера серверов 1С:Предприятия. Профили безопасности предназначены для контроля за использованием программой внешних ресурсов (относительно кластера серверов 1С:Предприятия).
Находится в разделе Администрирование - Поддержка и обслуживание - Безопасность.
Профили безопасности - механизм версии 8.3 платформы "1С:Предприятие", позволяющий ограничивать использование информационной базой внешних (по отношению к кластеру серверов платформы "1С:Предприятие" ресурсов, такие, как каталоги файловой системы, COM-объекты (на Windows-системах), внешние (по отношению к конфигурации) программные модули на встроенном языке платформы "1С:Предприятие" (внешние отчеты и обработки, вызовы методов Выполнить и Вычислить, внешние компоненты, приложения операционной системы и Интернет-ресурсы. Таким образом, с помощью профилей безопасности можно изолировать каждую информационную базу, позволяя ей использовать только те внешние ресурсы, использование которых явно одобрено администратором.
Ранее программа могла работать только с профилем безопасности, в котором разрешен полный доступ к внешним отчетам и обработкам. В данной версии это ограничение снято, что позволяет предоставлять для внешнего кода (в том числе, кода внешних отчетов и обработок) более строгие разрешения на использование внешних ресурсов, нежели для информационной базы.
Реализовано автоматическое управление разрешениями на доступ к внешним (относительно кластера серверов платформы "1С:Предприятие ресурсам. Таким образом, администратору не требуется самостоятельно отслеживать перечень внешних ресурсов, к которым нужно предоставить доступ (иначе программа не сможет функционировать), вместо этого - при необходимости получения разрешения администратору выводится диалог с перечнем требуемых разрешений. В случае одобрения новых разрешений администратором, они будут автоматически добавлены в профиль безопасности в кластере серверов. При этом для программы автоматически формируется максимально ограниченный профиль безопасности, в котором, в частности, снят признак Полный доступ к внешним отчетам и обработкам.
Предназначена для настройки резервного копирования информационной базы.
Иногда возникают ситуации, которые приводят к потере данных, например, сбои энергоснабжения, отказы компьютеров или неправильные действия в программе. С целью уменьшения риска потери данных администратору программы необходимо регулярно выполнять резервное копирование информационной базы, в этом случае информационную базу можно восстановить. Частота создания резервных копий зависит от интенсивности ввода новых данных в программу. Также резервные копии рекомендуется создавать перед любыми операциями в программе, которые связаны с изменением большого объема данных, например, перед групповым изменением объектов.
В любой момент времени можно восстановить данные из созданной ранее резервной копии. Однако необходимо учитывать, что в восстановленной информационной базе будут только те данные, которые были введены на момент создания резервной копии. Данные, которые были введены позже, будут безвозвратно утеряны. Поэтому очень важно составить расписание резервного копирования так, чтобы снизить потери данных до минимума.
@@ -22,7 +22,7 @@
При хранении файлов в томах на диске для этих файлов также необходимо проводить резервное копирование, другими средствами.
Ошибки при резервном копировании
Если резервное копирование завершилось неудачей, а во временном log-файле имеется запись: "Исключение в createConnection: Error, Automation server can't create object", то, скорее всего, используется 32-разрядная компонента comcntr.dll на компьютере под управлением 64-разрядной операционной системы. Для устранения данной проблемы необходимо взять 64-разрядную компоненту comcntr.dll из поставки 1С Предприятие x64 Сервер и зарегистрировать ее, запустив из командной строки:
Важно: для того чтобы войти в информационную базу, если резервное копирование не выполнилось, необходимо запустить 1С:Предприятие с параметрами: ENTERPRISE /F <путь к информационной базе> /CРазрешитьРаботуПользователей /UC РезервноеКопирование.
+
Важно: для того чтобы войти в информационную базу, если резервное копирование не выполнилось, необходимо запустить 1С:Предприятие с параметрами: ENTERPRISE /F <путь к информационной базе> /CРазрешитьРаботуПользователей /UC РезервноеКопирование.
\ No newline at end of file
diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Help/ru.html b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Help/ru.html
index 2eb91b30c..12923db9a 100644
--- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Help/ru.html
+++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Внешний вид - выводятся настройки внешнего вида рабочего стола, форм (например, различных списков программы) и командного интерфейса программы.
diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Help/ru.html b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Help/ru.html
index 1f02e91b9..0b069d91e 100644
--- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Help/ru.html
+++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Список состоит из двух частей: в левой части списка располагаются группы, в правой отражаются входящие в них пользователи (внешние пользователи). По умолчанию выбрана группа Все пользователи (Все внешние пользователи).
Для того чтобы увидеть всех пользователей, включенных в дочерние группы с учетом иерархии, необходимо установить флажок Показывать пользователей дочерних групп в нижней части списка.
Предназначена для копирования настроек одного пользователя другим пользователям программы. При этом скопировать можно настройки в пределах одного списка - Пользователи или Внешние пользователи.
Удобно использовать в случае, если настраивается несколько новых пользователей в одной группе, в которой уже есть пользователи.
Команда для копирования настроек пользователей находится в разделе Администрирование - Настройки пользователей и прав.
Предназначена для удаления пользовательских настроек.
Иногда требуется удалить пользовательские настройки, например, если из-за этих неправильных настроек работа в программе стала невозможной. Очистить можно все настройки, в том числе и личные варианты отчетов.
Команда для очистки настроек пользователей находится в разделе Администрирование - Настройки пользователей и прав.
Далее следует выбрать актуальную (последнюю официально опубликованную) версию технологической платформы
+
Для скачивания файла перейдите в раздел «Технологическая платформа 1С:Предприятия для Windows»:
-
-
Сохраните файл на диск, запомните папку, в которую его сохранили:
-
+
+
Далее, по ссылке "Скачать дистрибутив" откроется диалог сохранения файла на диск. Запомните папку, в которую его сохранили:
+
2. Установить новую версию 1С:Предприятия 8.3
Обратите внимание: для установки программы пользователь Windows должен обладать правами администратора! Распакуйте загруженный файл с архивом. В папке, в которую распаковали архив, найдите и запустите файл Setup.exe:
-
-
Далее следуйте инструкциям программы – установщика:
-
-
-
-
-
-
+
+
Далее следуйте инструкциям программы-установщика:
+
3. Создать резервную копию информационной базы
Определите и откройте каталог, в котором находится нужная база данных:
-
-
\ No newline at end of file
+
+
+
4. Начало работы с новой версией платформы
+
По кнопке "1С:Предприятие" можно начать работы с выбранной информационной базой на новой версии платформы.
\ No newline at end of file
diff --git a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОбновленияИБ/Help/ru.html b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОбновленияИБ/Help/ru.html
index 521951fc6..93f692d76 100644
--- a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОбновленияИБ/Help/ru.html
+++ b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОбновленияИБ/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Индикатор показывает ход обновления ИБ.
В сообщении выводится номер версии, на которую производится обновление ИБ.
Обновление может занять длительное время, в зависимости от объема данных и производительности компьютера.
Предназначена для индикации хода и просмотра результатов отложенного обновления ИБ.
При обновлении версии ИБ в программе предусмотрена возможность часть данных обрабатывать отложенно, во время работы программы, в фоновом режиме. В этом случае документы, которые еще не были обработаны, будут недоступны. При попытке открыть такой документ программа выдает сообщение, что действия с документом временно запрещены, так как не завершен переход на новую версию программы. Некоторые отчеты также могут быть недоступны. Программа при попытке сформировать отчет выдает сообщение, что отчет может содержать некорректные данные, так как не завершен переход на новую версию программы.
Открывается автоматически при входе в программу после обновления ИБ одновременно с открытием окна Описание изменений программы (Что нового в конфигурации).
@@ -10,6 +10,24 @@
Нажмите Выполнить, для того чтобы начать обработку данных.
Если выполнение начато, то ссылка указывает, сколько процедур выполнено.
После завершения дополнительных процедур обработки данных указывается дата и время их завершения. Ссылка принимает значение Все процедуры обновления выполнены успешно (в скобках указывается количество выполненных процедур).
Настройка расписания обработки данных
-
Как правило, обработка данных может занимать длительное время (от нескольких минут до нескольких часов в зависимости от объема введенных данных в программе и производительности компьютера), а также во время ее выполнения может наблюдаться существенное замедление работы пользователей. Поэтому рекомендуется выполнять обработку в период наименьшей активности пользователей, настроив расписание регламентного задания Отложенное обновление ИБ.
-
Для того чтобы настроить выполнение регламентного задания Отложенное обновление ИБ, нажмите Настроить расписание.
-
Как правило, обработка данных может занимать длительное время (от нескольких минут до нескольких часов в зависимости от объема введенных данных в программе и производительности компьютера), а также во время ее выполнения может наблюдаться существенное замедление работы пользователей. Поэтому рекомендуется выполнять обработку в период наименьшей активности пользователей.
+
В клиент-серверном режиме можно настроить расписание регламентного задания Отложенное обновление ИБ. Для того чтобы настроить выполнение регламентного задания Отложенное обновление ИБ, нажмите Настроить расписание.
+
Если в клиент-серверном режиме установлена блокировка регламентных заданий, то отложенное обновление не будет выполняться.
+
+
Проконтролировать блокировку можно:
+
+
С помощью ссылки Проверить блокировку регламентных заданий;
+
+
С помощью консоли администрирования кластера серверов. Подробнее о консоли см. документацию о платформе.
+
+
Запустить консоль можно из меню Пуск, выбрав раздел Все программы - 1С:Предприятие 8 - Дополнительно.
+
+
Для отображения свойств отдельной информационной базы выберите нужный центральный сервер, нужный кластер, нужную информационную базу.
+
+
Для просмотра параметров информационной базы щелкните по имени информационной базы в списке правой кнопкой мыши.
+
+
Найдите в списке параметров информационной базы сведения о блокировке пользователей и регламентных заданий.
+
+
Подробнее о блокировках выбранной информационной базы можно узнать, выбрав группу Блокировки в дереве консоли.
\ No newline at end of file
diff --git a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Form.form b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Form.form
index 5cfd732f5..2f43792d4 100644
--- a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Form.form
+++ b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Form.form
@@ -616,7 +616,7 @@
20ru
- В данный момент выполняются дополнительные процедуры обновления
+ В данный момент выполняются дополнительные процедуры обработки данныхtrue
diff --git a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Help/ru.html b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Help/ru.html
index 387a5540c..5463801c0 100644
--- a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Help/ru.html
+++ b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для просмотра дополнительных процедур обработки данных, которые проходят после обновления версии отложенно, в фоновом режиме.
Список можно открыть, перейдя по соответствующей ссылке из окна Результаты обновления программы, в которое можно перейти по команде Результаты обновления и дополнительная обработка данных раздела Администрирование - Поддержка и обслуживание.
В списке выводится:
diff --git a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Module.bsl b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Module.bsl
index db8242db8..41a5c8a53 100644
--- a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Module.bsl
+++ b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Module.bsl
@@ -59,6 +59,7 @@
&НаКлиенте
Процедура ГиперссылкаОтложенноеОбновлениеНажатие(Элемент)
+ ПолучитьСведенияОбОбновлении();
Если ЗначениеЗаполнено(ВремяНачалаОтложенногоОбновления) И ЗначениеЗаполнено(ВремяОкончанияОтложенногоОбновления) Тогда
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ДатаНачала", ВремяНачалаОтложенногоОбновления);
@@ -111,6 +112,13 @@
КонецПроцедуры
+&НаСервере
+Процедура ПолучитьСведенияОбОбновлении()
+ СведенияОбОбновлении = ОбновлениеИнформационнойБазыСлужебный.СведенияОбОбновленииИнформационнойБазы();
+ ВремяНачалаОтложенногоОбновления = СведенияОбОбновлении.ВремяНачалаОтложенногоОбновления;
+ ВремяОкончанияОтложенногоОбновления = СведенияОбОбновлении.ВремяОкончаниеОтложенногоОбновления;
+КонецПроцедуры
+
&НаСервере
Процедура СформироватьТаблицуОтложенныхОбработчиков(ВыполненыВсеОбработчики = Истина, НачальноеЗаполнение = Ложь)
@@ -154,15 +162,13 @@
Элементы.ТекстПояснения.Заголовок = НСтр("ru = 'Невыполненные процедуры рекомендуется запустить повторно.'");
КонецЕсли;
- ОтложенныеОбработчики.Сортировать("Вес Убыв");
-
НомерЭлемента = 1;
Для Каждого СтрокаТаблицы Из ОтложенныеОбработчики Цикл
СтрокаТаблицы.Номер = НомерЭлемента;
НомерЭлемента = НомерЭлемента + 1;
КонецЦикла;
- Элементы.ОбновлениеВыполняется.Видимость = ОбновлениеВыполняется;
+ Элементы.ОбновлениеВыполняется.Видимость = Не ВыполненыВсеОбработчики;
КонецПроцедуры
@@ -189,25 +195,21 @@
СтрокаСписка.ИнформацияОПроцедуреОбновления =
НСтр("ru = 'Процедура ""%1"" обработки данных завершилась успешно.'");
СтрокаСписка.СтатусОбработчика = НСтр("ru = 'Выполнено'");
- СтрокаСписка.Вес = 1;
СтрокаСписка.СтатусКартинка = БиблиотекаКартинок.Успешно;
ИначеЕсли СтрокаОбработчика.Статус = "Выполняется" Тогда
ОбработчикиНеВыполнялись = Ложь;
СтрокаСписка.ИнформацияОПроцедуреОбновления =
НСтр("ru = 'Процедура ""%1"" обработки данных в данный момент выполняется.'");
СтрокаСписка.СтатусОбработчика = НСтр("ru = 'Выполняется'");
- СтрокаСписка.Вес = 3;
ИначеЕсли СтрокаОбработчика.Статус = "Ошибка" Тогда
ОбработчикиНеВыполнялись = Ложь;
ВыполненыВсеОбработчики = Ложь;
СтрокаСписка.ИнформацияОПроцедуреОбновления = СтрокаОбработчика.ИнформацияОбОшибке;
СтрокаСписка.СтатусОбработчика = НСтр("ru = 'Ошибка'");
- СтрокаСписка.Вес = 4;
СтрокаСписка.СтатусКартинка = БиблиотекаКартинок.Остановить;
Иначе
ВыполненыВсеОбработчики = Ложь;
СтрокаСписка.СтатусОбработчика = НСтр("ru = 'Не выполнялась'");
- СтрокаСписка.Вес = 2;
СтрокаСписка.ИнформацияОПроцедуреОбновления = НСтр("ru = 'Процедура ""%1"" обработки данных еще не выполнялась.'");
КонецЕсли;
@@ -216,5 +218,4 @@
КонецПроцедуры
-#КонецОбласти
-
+#КонецОбласти
\ No newline at end of file
diff --git a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/СообщениеОНеудачномОбновлении/Help/ru.html b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/СообщениеОНеудачномОбновлении/Help/ru.html
index 17d54f45f..e666b5faa 100644
--- a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/СообщениеОНеудачномОбновлении/Help/ru.html
+++ b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/СообщениеОНеудачномОбновлении/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначено для информирования об ошибке во время обновления ИБ.
Для того чтобы посмотреть в журнале регистрации сведения об ошибках, перейдите по ссылке Подробности см. в Журнале регистрации.
Для того чтобы выйти из программы, нажмите Завершить.
diff --git a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/СообщениеОНеудачномОбновлении/Module.bsl b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/СообщениеОНеудачномОбновлении/Module.bsl
index 2ded7ef3e..72f7f6437 100644
--- a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/СообщениеОНеудачномОбновлении/Module.bsl
+++ b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/СообщениеОНеудачномОбновлении/Module.bsl
@@ -91,8 +91,19 @@
ДиалогОткрытияФайла.Фильтр = НСтр("ru = 'Внешняя обработка'") + "(*.epf)|*.epf";
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите внешнюю обработку'");
- Если ДиалогОткрытияФайла.Выбрать() Тогда
- ВыбраннаяОбработка = Новый ДвоичныеДанные(ДиалогОткрытияФайла.ПолноеИмяФайла);
+
+ ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьВнешнююОбработкуЗавершение", ЭтотОбъект);
+ ДиалогОткрытияФайла.Показать(ОписаниеОповещения);
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОткрытьВнешнююОбработкуЗавершение(Результат, ДополнительныеПараметры) Экспорт
+
+ Если Результат <> Неопределено
+ И Результат.Количество() = 1 Тогда
+ ПолноеИмяФайла = Результат[0];
+ ВыбраннаяОбработка = Новый ДвоичныеДанные(ПолноеИмяФайла);
АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ВыбраннаяОбработка, УникальныйИдентификатор);
ИмяВнешнейОбработки = ПодключитьВнешнююОбработку(АдресВоВременномХранилище);
ОткрытьФорму(ИмяВнешнейОбработки + ".Форма");
diff --git a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Help/ru.html b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Help/ru.html
index 07dba8cbf..dfe1cf24e 100644
--- a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Help/ru.html
+++ b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Существует два метода обновления ИБ, которые могут применяться, дополняя друг друга:
Для обновления с пользовательского сайта необходимо указать код пользователя и пароль для доступа. Доступ к получению обновлений имеют только зарегистрированные пользователи программ 1С:Предприятие. Подробная информация о том, как можно получить код пользователя и пароль, содержится в разделе методической поддержки на сайте v8.1c.ru.
Открывается по команде Настройка обновления программы через Интернет из раздела Администрирование - Поддержка и обслуживания - Обновление версии программы.
Предназначена для настройки резервного копирования информационной базы при обновлении программы.
Перед началом обновления программы рекомендуется создавать резервную копию информационной базы. Резервная копия используется для автоматического восстановления информационной базы в случае нештатной ситуации.
Открывается по ссылке Создавать временную резервную копию ИБ и выполнять откат при нештатной ситуации из окна Поиск и установка обновлений.
diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Module.bsl b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Module.bsl
index df63b96e4..420633c7b 100644
--- a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Module.bsl
+++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Module.bsl
@@ -19,16 +19,17 @@
&НаКлиенте
Процедура ПолеКаталогРезервнойКопииНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
+
СтандартнаяОбработка = Ложь;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
- Диалог.Каталог = ОбновлениеКонфигурацииКлиент.ПолучитьКаталогФайла(Объект.ИмяКаталогаРезервнойКопииИБ);
+ Диалог.Каталог = Объект.ИмяКаталогаРезервнойКопииИБ;
Диалог.ПроверятьСуществованиеФайла = Истина;
Диалог.Заголовок = НСтр("ru = 'Выбор каталога резервной копии ИБ'");
-
Если Диалог.Выбрать() Тогда
Объект.ИмяКаталогаРезервнойКопииИБ = Диалог.Каталог;
КонецЕсли;
+
КонецПроцедуры
&НаКлиенте
diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Form.form b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Form.form
index 26016809f..529dff6db 100644
--- a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Form.form
+++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Form.form
@@ -1538,10 +1538,8 @@
StartChoiceПолеФайлОбновленияНачалоВыбора
- 50truetrue
- falsetruetruetrue
@@ -3342,124 +3340,19 @@
ГруппаДлительнаяОперация1032
- ПанельОжиданиеДлительнойОперации
- 151
-
- Интернет
- 152
-
- Группа18
- 146
-
- ДекорацияКартинка33
- 147
- true
- true
-
- true
-
-
- ДекорацияКартинка33ExtendedTooltip
- 835
- Label
- true
- true
-
- Left
-
-
-
- ДекорацияКартинка33КонтекстноеМеню
- 148
- true
-
- 5
- true
- 3
- true
- false
-
-
- CommonPicture.ДлительнаяОперация48
-
-
-
-
- Декорация34
- 149
-
- ru
- Получение обновления программы может занять от нескольких минут до нескольких часов в зависимости от размера обновления, скорости подключения к Интернету и производительности компьютера.
-
- true
- true
-
- true
-
-
- Декорация34ExtendedTooltip
- 836
- Label
- true
- true
-
- Left
-
-
-
- Декорация34КонтекстноеМеню
- 150
- true
-
- Label
- true
- true
- true
- true
- false
-
- Left
- Center
- 2
-
-
- true
- true
-
- true
-
- false
-
- Группа18ExtendedTooltip
- 834
- Label
- true
- true
-
- Left
-
-
- UsualGroup
-
- Auto
- true
- true
- Auto
- Auto
-
-
+ ГруппаАнимация
+ 1077
+
+ ДекорацияКартинка33
+ 147truetruetrue
-
- ru
- Интернет
-
- ИнтернетExtendedTooltip
- 833
+ ДекорацияКартинка33ExtendedTooltip
+ 835Labeltruetrue
@@ -3467,10 +3360,59 @@
Left
- Page
-
- Vertical
- auto
+
+ ДекорацияКартинка33КонтекстноеМеню
+ 148
+ true
+
+ 6
+ true
+ 3
+ true
+ false
+
+
+ CommonPicture.ДлительнаяОперация48
+
+
+
+
+ Декорация34
+ 149
+
+ ru
+ Получение обновления программы может занять от нескольких минут до нескольких часов в зависимости от размера обновления, скорости подключения к Интернету и производительности компьютера.
+
+ true
+ true
+
+ true
+
+
+ Декорация34ExtendedTooltip
+ 836
+ Label
+ true
+ true
+
+ Left
+
+
+
+ Декорация34КонтекстноеМеню
+ 150
+ true
+
+ Label
+ true
+ true
+ true
+ true
+ false
+
+ Left
+ Center
+ 2true
@@ -3478,14 +3420,10 @@
true
-
- ru
- Панель ожидание длительной операции
-
- false
+ false
- ПанельОжиданиеДлительнойОперацииExtendedTooltip
- 832
+ ГруппаАнимацияРасширеннаяПодсказка
+ 1078Labeltruetrue
@@ -3493,8 +3431,12 @@
Left
- Pages
-
+ UsualGroup
+
+ Auto
+ true
+ true
+ AutoAuto
@@ -4718,7 +4660,7 @@
- Группа7
+ ГруппаДатаОбновления1048Декорация2
@@ -4803,7 +4745,7 @@
true
- Группа7РасширеннаяПодсказка
+ ГруппаДатаОбновленияРасширеннаяПодсказка1049Labeltrue
@@ -5621,7 +5563,8 @@
259ru
- Благодарим Вас за обновление программы.
+ Установка новой версии программы успешно завершена.
+Нажмите кнопку "Готово" для завершения обновления.truetrue
@@ -5652,20 +5595,16 @@
- НадписьИнформацияОбОбновленииПриЗавершении
- 522
-
- ru
- Новое в этой версии
-
+ Декорация4
+ 1085truetruetrue
- НадписьИнформацияОбОбновленииПриЗавершенииExtendedTooltip
- 924
+ Декорация4РасширеннаяПодсказка
+ 1087Labeltruetrue
@@ -5674,114 +5613,33 @@
- НадписьИнформацияОбОбновленииПриЗавершенииКонтекстноеМеню
- 523
+ Декорация4КонтекстноеМеню
+ 1086trueLabeltrue
+ 2true
- false
-
- Click
- НадписьИнформацияОбОбновленииПриЗавершенииНажатие
-
- trueLeft
- Center
-
- ПанельПорядокОбновленияПриЗавершении
- 261
-
- Картинка3
- 262
- true
- true
-
- true
-
-
- Картинка3ExtendedTooltip
- 926
- Label
- true
- true
-
- Left
-
-
-
- Картинка3КонтекстноеМеню
- 263
- true
-
- 4
- true
- 2
- true
- false
-
-
- CommonPicture.Предупреждение32
-
-
-
-
- УспешноеОбновлениеНадписьПорядокОбновления
- 265
-
- ru
- Пожалуйста, ознакомьтесь с <link ПорядокОбновления>дополнительными инструкциями</> для завершения обновления.
-
- true
- true
-
- true
-
-
- УспешноеОбновлениеНадписьПорядокОбновленияРасширеннаяПодсказка
- 928
- Label
- true
- true
-
- Left
-
-
-
- УспешноеОбновлениеНадписьПорядокОбновленияКонтекстноеМеню
- 266
- true
-
- true
- Label
- true
- 2
- true
- false
-
-
- URLProcessing
- УспешноеОбновлениеНадписьПорядокОбновленияОбработкаНавигационнойСсылки
-
- Left
-
-
+
+ ПоказатьНовоеВВерсии
+ 1082truetruetrue
-
- ru
- Панель порядок обновления при завершении
-
+
+ ПоказатьНовоеВВерсии
+
+ Right
- ПанельПорядокОбновленияПриЗавершенииExtendedTooltip
- 925
+ ПоказатьНовоеВВерсииРасширеннаяПодсказка
+ 1084Labeltruetrue
@@ -5789,15 +5647,51 @@
Left
- UsualGroup
-
- Auto
- NormalSeparation
- true
- true
- Auto
- Auto
-
+
+ ПоказатьНовоеВВерсииКонтекстноеМеню
+ 1083
+ true
+
+ CheckBoxField
+ Enter
+ true
+ Left
+ true
+
+
+
+ ОзнакомитьсяСДополнительнымиИнструкциями
+ 1079
+ true
+ true
+
+ true
+
+
+ ОзнакомитьсяСДополнительнымиИнструкциями
+
+ Right
+
+ ОзнакомитьсяСДополнительнымиИнструкциямиРасширеннаяПодсказка
+ 1081
+ Label
+ true
+ true
+
+ Left
+
+
+
+ ОзнакомитьсяСДополнительнымиИнструкциямиКонтекстноеМеню
+ 1080
+ true
+
+ CheckBoxField
+ Enter
+ true
+ Left
+ true
+ Отступ45
@@ -5831,41 +5725,6 @@
Left
-
- НадписьСообщениеДалее2
- 269
-
- ru
- Нажмите кнопку "Готово", чтобы закрыть помощник обновления конфигурации.
-
- true
- true
-
- true
-
-
- НадписьСообщениеДалее2ExtendedTooltip
- 931
- Label
- true
- true
-
- Left
-
-
-
- НадписьСообщениеДалее2КонтекстноеМеню
- 270
- true
-
- Label
- true
- true
- false
-
- Left
-
- truetrue
@@ -6681,6 +6540,57 @@
true
+
+ ПоказатьНовоеВВерсии
+
+ ru
+ Показать новое в версии
+
+ 6
+
+ Boolean
+
+
+ true
+
+
+ true
+
+
+
+ ОзнакомитьсяСДополнительнымиИнструкциями
+
+ ru
+ Ознакомиться с информацией о порядке обновления
+
+ 10
+
+ Boolean
+
+
+ true
+
+
+ true
+
+
+
+ ЕстьАктивныеСеансы
+
+ ru
+ Есть активные сеансы
+
+ 11
+
+ Boolean
+
+
+ true
+
+
+ true
+
+ Назад
diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Module.bsl
index 0d7b3d0dd..522c0f886 100644
--- a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Module.bsl
+++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Module.bsl
@@ -38,6 +38,7 @@
Если Параметры.ЗавершениеРаботыСистемы Тогда
Элементы.ПереключательОбновленияФайл.Видимость = Ложь;
Элементы.ПереключательОбновленияСервер.Видимость = Ложь;
+ Элементы.ГруппаДатаОбновления.Видимость = Ложь;
КонецЕсли;
Если Параметры.ПолученоОбновлениеКонфигурации Тогда
@@ -47,10 +48,10 @@
КонецЕсли;
ИнформацияОНаличииСоединений = СоединенияИБ.ИнформацияОСоединениях();
- Параметры.ВыполнитьОбновление = ?(ИнформацияОНаличииСоединений.НаличиеАктивныхСоединений, Ложь, Параметры.ВыполнитьОбновление);
+ ЕстьАктивныеСеансы = Не ИнформацияОНаличииСоединений.НаличиеАктивныхСоединений;
- Элементы.НадписьОбновлениеКонфигурацииВыполняетсяПриОбменеДаннымиСГлавнымУзлом.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Элементы.НадписьОбновлениеКонфигурацииВыполняетсяПриОбменеДаннымиСГлавнымУзлом.Заголовок, ПланыОбмена.ГлавныйУзел());
- Элементы.НадписьПроцессОбновленияМожетЗанятьМногоВремени.Видимость = Не Параметры.ЗавершениеРаботыСистемы;
+ Элементы.НадписьОбновлениеКонфигурацииВыполняетсяПриОбменеДаннымиСГлавнымУзлом.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ Элементы.НадписьОбновлениеКонфигурацииВыполняетсяПриОбменеДаннымиСГлавнымУзлом.Заголовок, ПланыОбмена.ГлавныйУзел());
ПараметрыАутентификации = СтандартныеПодсистемыСервер.ПараметрыАутентификацииНаСайте();
@@ -69,7 +70,10 @@
ВосстановитьНастройкиОбновленияКонфигурации();
Если Параметры.ВыполнитьОбновление Тогда
- Если ПроверитьДоступКИБ() Тогда
+ Если ЕстьАктивныеСеансы Тогда
+ ПерейтиКВыборуРежимаОбновления();
+ Возврат;
+ ИначеЕсли ПроверитьДоступКИБ() Тогда
ВыполнитьОбновление = Истина;
ОбновлениеКонфигурацииКлиентПереопределяемый.ПередЗавершениемРаботыСистемы();
ПараметрыПриложения.Вставить("СтандартныеПодсистемы.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы", Истина);
@@ -110,7 +114,7 @@
ИмяФайлаИнформацияОбОбновлении = ПолучитьИмяЛокальногоФайлаОписанияОбновления();
Если НЕ ФайлСуществуетНаКлиенте(ИмяФайлаИнформацияОбОбновлении) Тогда
- ИмяФайлаПорядокОбновления = "";
+ ИмяФайлаИнформацияОбОбновлении = "";
КонецЕсли;
ИмяСтраницы = ? (Объект.РезультатОбновления, Страницы.УспешноеОбновление.Имя, Страницы.НеуспешноеОбновление.Имя);
@@ -259,7 +263,19 @@
&НаКлиенте
Процедура НадписьОткрытьЖурналРегистрацииНажатие(Элемент)
- ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", Новый Структура("Пользователь", ИмяПользователя()));
+
+ СписокПриложений = Новый Массив;
+ СписокПриложений.Добавить("COMConnection");
+ СписокПриложений.Добавить("Designer");
+ СписокПриложений.Добавить("1CV8");
+ СписокПриложений.Добавить("1CV8C");
+
+ ОтборЖурналаРегистрации = Новый Структура;
+ ОтборЖурналаРегистрации.Вставить("Пользователь", ИмяПользователя());
+ ОтборЖурналаРегистрации.Вставить("ИмяПриложения", СписокПриложений);
+
+ ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", ОтборЖурналаРегистрации);
+
КонецПроцедуры
&НаКлиенте
@@ -375,32 +391,6 @@
КонецПроцедуры
-////////////////////////////////////////////////////////////////////////////////
-// Страница УспешноеОбновление
-
-&НаКлиенте
-Процедура НадписьИнформацияОбОбновленииПриЗавершенииНажатие(Элемент)
-
- ПараметрыФормы = Новый Структура;
- ПараметрыФормы.Вставить("ПоказыватьТолькоИзменения", Истина);
-
- ОткрытьФорму("ОбщаяФорма.ОписаниеИзмененийСистемы", ПараметрыФормы);
-
-КонецПроцедуры
-
-&НаКлиенте
-Процедура УспешноеОбновлениеНадписьПорядокОбновленияОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка)
-
- СтандартнаяОбработка = Ложь;
-
- Если НЕ ПустаяСтрока(ИмяФайлаПорядокОбновления) Тогда
- ОбновлениеКонфигурацииКлиент.ОткрытьВебСтраницу(ИмяФайлаПорядокОбновления);
- Иначе
- ПоказатьПредупреждение(, НСтр("ru = 'Описание порядка обновления отсутствует.'"));
- КонецЕсли;
-
-КонецПроцедуры
-
#КонецОбласти
#Область ОбработчикиКомандФормы
@@ -453,7 +443,7 @@
Функция НаличиеАктивныхСоединений(СообщенияДляЖурналаРегистрации = Неопределено)
// Запись накопленных событий ЖР.
ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации);
- Возврат СоединенияИБ.КоличествоСеансовИнформационнойБазы(Ложь) > 1;
+ Возврат СоединенияИБ.КоличествоСеансовИнформационнойБазы(Ложь, Ложь) > 1;
КонецФункции
&НаСервере
@@ -540,7 +530,7 @@
Результат = СтрЗаменить(Результат, "[ВосстанавливатьИнформационнуюБазу]" , ?(Объект.ВосстанавливатьИнформационнуюБазу, "true", "false"));
Результат = СтрЗаменить(Результат, "[БлокироватьСоединенияИБ]" , ?(БлокироватьСоединенияИБ, "true", "false"));
Результат = СтрЗаменить(Результат, "[ИмяCOMСоединителя]" , Форматировать(СтруктураПараметров.ИмяCOMСоединителя));
- Результат = СтрЗаменить(Результат, "[ИспользоватьCOMСоединитель]" , ?(СтруктураПараметров.ЭтоБазоваяВерсияКонфигурации, "false", "true"));
+ Результат = СтрЗаменить(Результат, "[ИспользоватьCOMСоединитель]" , ?(СтруктураПараметров.ИспользоватьCOMСоединитель, "false", "true"));
Результат = СтрЗаменить(Результат, "[ЗапускСеансаПослеОбновления]" , ?(Параметры.ЗавершениеРаботыСистемы, "false", "true"));
Результат = СтрЗаменить(Результат, "[ВыполнятьСжатиеТаблицИБ]" , ?(ВыполнятьСжатиеТаблицИБ(), "true", "false"));
@@ -976,9 +966,6 @@
ДоступностьКнопкиНазад = Ложь;
ДоступностьКнопкиЗакрыть = Ложь;
- СтраницыОжидания = Элементы.ПанельОжиданиеДлительнойОперации.ПодчиненныеЭлементы;
- Элементы.ПанельОжиданиеДлительнойОперации.ТекущаяСтраница = СтраницыОжидания.Интернет;
-
ИначеЕсли НоваяТекущаяСтраница = Страницы.ВыборРежимаОбновленияФайл Тогда
ФункцияКнопкиДалее = (Объект.РежимОбновления = 0);// Если НЕ обновляем сейчас, то "готово".
@@ -1039,7 +1026,9 @@
КонецЕсли;
ИначеЕсли НоваяТекущаяСтраница = Страницы.УспешноеОбновление Тогда
- Элементы.ПанельПорядокОбновленияПриЗавершении.Видимость = НЕ ПустаяСтрока(ИмяФайлаПорядокОбновления);
+ ОзнакомитьсяСДополнительнымиИнструкциями = Не ПустаяСтрока(ИмяФайлаПорядокОбновления);
+ ПоказатьНовоеВВерсии = Не ОзнакомитьсяСДополнительнымиИнструкциями;
+ Элементы.ОзнакомитьсяСДополнительнымиИнструкциями.Видимость = ОзнакомитьсяСДополнительнымиИнструкциями;
ФункцияКнопкиДалее = Ложь;
ДоступностьКнопкиНазад = Ложь;
ДоступностьКнопкиЗакрыть = Ложь;
@@ -1448,9 +1437,18 @@
&НаКлиенте
Функция ОбработатьСтраницуУспешноеОбновление(ВыдаватьСообщения = Истина)
- Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы;
+
+ Если ПоказатьНовоеВВерсии Тогда
+ ОткрытьФорму("ОбщаяФорма.ОписаниеИзмененийСистемы", Новый Структура("ПоказыватьТолькоИзменения", Истина));
+ КонецЕсли;
+
+ Если ОзнакомитьсяСДополнительнымиИнструкциями Тогда
+ ОбновлениеКонфигурацииКлиент.ОткрытьВебСтраницу(ИмяФайлаПорядокОбновления);
+ КонецЕсли;
+
Закрыть();
- Возврат Страницы.УспешноеОбновление.Имя;
+ Возврат Элементы.УспешноеОбновление.Имя;
+
КонецФункции
&НаКлиенте
@@ -1781,7 +1779,7 @@
// В базовых версиях проверку подключения не осуществляем;
// при некорректном вводе имени и пароля обновление завершится неуспешно.
ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента();
- Если ПараметрыРаботыКлиента.ЭтоБазоваяВерсияКонфигурации Тогда
+ Если ПараметрыРаботыКлиента.ЭтоБазоваяВерсияКонфигурации Или ПараметрыРаботыКлиента.ЭтоУчебнаяПлатформа Тогда
Возврат Результат;
КонецЕсли;
@@ -1815,11 +1813,10 @@
&НаКлиенте
Функция ПроверитьНастройкиЭлектроннойПочты(ИмяТекущейСтраницы, ВыдаватьСообщения = Истина)
- Если Найти(Объект.АдресЭлектроннойПочты, "@") = 0 ИЛИ Найти(Объект.АдресЭлектроннойПочты, ".") = 0 Тогда
+ Если Не ОбщегоНазначенияКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям(Объект.АдресЭлектроннойПочты) Тогда
Если ВыдаватьСообщения Тогда
ПоказатьПредупреждение(, НСтр("ru = 'Укажите допустимый адрес электронной почты.'"));
КонецЕсли;
- ТекущийЭлемент = Элементы.ПолеАдресЭлектроннойПочты;
Возврат ИмяТекущейСтраницы;
КонецЕсли;
Возврат "";
@@ -1946,14 +1943,14 @@
// Структура параметров необходима для их определения на клиенте и передачи на сервер.
СтруктураПараметров = Новый Структура;
- СтруктураПараметров.Вставить("ИмяИсполняемогоФайлаКонфигуратора", ПараметрыОбновления.ИмяИсполняемогоФайлаКонфигуратора);
- СтруктураПараметров.Вставить("ИмяИсполняемогоФайлаКлиента" , СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИмяИсполняемогоФайлаКлиента);
- СтруктураПараметров.Вставить("СобытиеЖурналаРегистрации" , ПараметрыОбновления.СобытиеЖурналаРегистрации);
- СтруктураПараметров.Вставить("ИмяCOMСоединителя" , ПараметрыРаботыКлиента.ИмяCOMСоединителя);
- СтруктураПараметров.Вставить("ЭтоБазоваяВерсияКонфигурации" , ПараметрыРаботыКлиента.ЭтоБазоваяВерсияКонфигурации);
- СтруктураПараметров.Вставить("ИнформационнаяБазаФайловая" , ПараметрыРаботыКлиента.ИнформационнаяБазаФайловая);
- СтруктураПараметров.Вставить("ПараметрыСкрипта" , ПолучитьПараметрыАутентификацииАдминистратораОбновления());
- СтруктураПараметров.Вставить("ПараметрыАдминистрирования" , ПараметрыАдминистрирования);
+ СтруктураПараметров.Вставить("ИмяИсполняемогоФайлаКонфигуратора", ПараметрыОбновления.ИмяИсполняемогоФайлаКонфигуратора);
+ СтруктураПараметров.Вставить("ИмяИсполняемогоФайлаКлиента" , СтандартныеПодсистемыКлиент.ИмяИсполняемогоФайлаПриложения());
+ СтруктураПараметров.Вставить("СобытиеЖурналаРегистрации" , ПараметрыОбновления.СобытиеЖурналаРегистрации);
+ СтруктураПараметров.Вставить("ИмяCOMСоединителя" , ПараметрыРаботыКлиента.ИмяCOMСоединителя);
+ СтруктураПараметров.Вставить("ИспользоватьCOMСоединитель" , ПараметрыРаботыКлиента.ЭтоБазоваяВерсияКонфигурации Или ПараметрыРаботыКлиента.ЭтоУчебнаяПлатформа);
+ СтруктураПараметров.Вставить("ИнформационнаяБазаФайловая" , ПараметрыРаботыКлиента.ИнформационнаяБазаФайловая);
+ СтруктураПараметров.Вставить("ПараметрыСкрипта" , ПолучитьПараметрыАутентификацииАдминистратораОбновления());
+ СтруктураПараметров.Вставить("ПараметрыАдминистрирования" , ПараметрыАдминистрирования);
// Добавим в структуру и имя запускаемой программы.
@@ -2628,7 +2625,6 @@
СтрокаЗапуска = "cmd /c """"%1"""" [p1]%2[/p1][p2]%3[/p2]";
СтрокаЗапуска = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаЗапуска, ИмяГлавногоФайлаСкрипта,
ПараметрыАдминистрирования.ПарольАдминистратораИнформационнойБазы, ПараметрыАдминистрирования.ПарольАдминистратораКластера);
-
Оболочка = Новый COMОбъект("Wscript.Shell");
Оболочка.RegWrite("HKCU\Software\Microsoft\Internet Explorer\Styles\MaxScriptStatements", 1107296255, "REG_DWORD");
Оболочка.Run(СтрокаЗапуска, 0);
diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Help/ru.html b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Help/ru.html
index a22c0d557..408dab518 100644
--- a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Help/ru.html
+++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Поиск и установка обновлений позволяет получать информацию о последних обновлениях на пользовательском сайте в сети Интернет и автоматически их устанавливать.
Открывается по команде Поиск и установка обновлений раздела Администрирование - Поддержка и обслуживание.
Программа позволяет обновлять конфигурацию ИБ в режиме 1С:Предприятия. Обновление производится по требованию или в указанное время.
Предназначена для настройки регламентного задания по экспорту замеров производительности.
Это может потребоваться, например, для выполнения анализа производительности в другой программе.
Вызывается по команде Еще -Настройка из окна Оценка производительности.
diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Module.bsl b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Module.bsl
index dd009194e..80eb2c9db 100644
--- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Module.bsl
+++ b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/АвтоматическийЭкспортЗамеровПроизводительности/Module.bsl
@@ -131,11 +131,21 @@
ВыборФайла.МножественныйВыбор = Ложь;
ВыборФайла.Заголовок = НСтр("ru = 'Выбор каталога экспорта'");
- Если ВыборФайла.Выбрать() Тогда
- ВыбранныйКаталог = ВыборФайла.Каталог;
- ЛокальныйКаталогЭкспорта = ВыбранныйКаталог;
- ЭтотОбъект.Модифицированность = Истина;
- КонецЕсли;
+ ОписаниеОповещения = Новый ОписаниеОповещения("ДействиеПослеВыбораКаталогаЭкспорта", ЭтотОбъект);
+ ВыборФайла.Показать(ОписаниеОповещения);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ДействиеПослеВыбораКаталогаЭкспорта(Результат, ДополнительныеПараметры) Экспорт
+
+ Если ЗначениеЗаполнено(Результат) Тогда
+
+ ВыбранныйКаталог = Результат;
+ ЛокальныйКаталогЭкспорта = Результат;
+ ЭтотОбъект.Модифицированность = Истина;
КонецЕсли;
diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/Форма/Module.bsl
index f8429c8ab..3577ea6c2 100644
--- a/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/Форма/Module.bsl
+++ b/SSL/src/DataProcessors/ОценкаПроизводительности/Forms/Форма/Module.bsl
@@ -484,11 +484,11 @@
Процедура ИзменитьСоставРеквизитовОбъекта(КолонкиТаблицаКлючевыхОпераций, УдаляемыеРеквизиты)
// Удаление колонок из табличной части "Производительность".
- Для а = 0 По УдаляемыеРеквизиты.Количество() - 1 Цикл
+ Для ИндексРеквизита = 0 По УдаляемыеРеквизиты.Количество() - 1 Цикл
// Имена удаляемых реквизитов Объект.Производительность.ПроизводительностьN
// где N номер, это выражение получает строку вида ПроизводительностьN.
- Элемент = Элементы.Найти(Сред(УдаляемыеРеквизиты[а], 27));
+ Элемент = Элементы.Найти(Сред(УдаляемыеРеквизиты[ИндексРеквизита], 27));
Если Элемент <> Неопределено Тогда
Элементы.Удалить(Элемент);
КонецЕсли;
@@ -557,14 +557,14 @@
УдаляемыеРеквизиты = Новый Массив;
- а = 0;
- Пока а < РеквизитыОбъекта.Количество() Цикл
+ ИндексРеквизита = 0;
+ Пока ИндексРеквизита < РеквизитыОбъекта.Количество() Цикл
- ИмяРеквизита = РеквизитыОбъекта[а].Имя;
+ ИмяРеквизита = РеквизитыОбъекта[ИндексРеквизита].Имя;
Если Лев(ИмяРеквизита, 18) = "Производительность" Тогда
УдаляемыеРеквизиты.Добавить("Объект.Производительность." + ИмяРеквизита);
КонецЕсли;
- а = а + 1;
+ ИндексРеквизита = ИндексРеквизита + 1;
КонецЦикла;
@@ -642,7 +642,7 @@
КоличествоПолей = ПоляОтбора.Количество() - 1;
// Оформление если операция не выполнялась.
- Для а = 0 По КоличествоПолей Цикл
+ Для ИндексПоля = 0 По КоличествоПолей Цикл
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
@@ -651,11 +651,11 @@
// Условие для оформления
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
- ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПоляОтбора[а]);
+ ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПоляОтбора[ИндексПоля]);
ЭлементОтбора.ПравоеЗначение = 0;
// Оформляемое поле
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
- ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ПоляОформления[а]);
+ ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ПоляОформления[ИндексПоля]);
КонецЦикла;
@@ -663,7 +663,7 @@
Соответствие = СоответствиеЦветовУровнюАпдекса();
Для Каждого КлючЗначение Из Соответствие Цикл
- Для а = 0 По КоличествоПолей Цикл
+ Для ИндексПоля = 0 По КоличествоПолей Цикл
ЭлементОформления = УсловноеОформление.Элементы.Добавить();
@@ -672,16 +672,16 @@
// Условие для оформления
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
- ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПоляОтбора[а]);
+ ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПоляОтбора[ИндексПоля]);
ЭлементОтбора.ПравоеЗначение = КлючЗначение.Значение.От;
// Условие для оформления
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
- ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПоляОтбора[а]);
+ ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПоляОтбора[ИндексПоля]);
ЭлементОтбора.ПравоеЗначение = КлючЗначение.Значение.До;
// Оформляемое поле
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
- ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ПоляОформления[а]);
+ ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(ПоляОформления[ИндексПоля]);
КонецЦикла;
@@ -951,9 +951,9 @@
ЗаписьXML.ЗаписатьАтрибут("EndDate", Строка(Конец));
ЗаписьXML.ЗаписатьАтрибут("ExportDate", Строка(ТекущаяДата()));
- Для а = 0 По МассивКлючевыхОпераций.Количество() - 1 Цикл
+ Для ИндексОперации = 0 По МассивКлючевыхОпераций.Количество() - 1 Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("KeyOperation");
- ЗаписьXML.ЗаписатьАтрибут("name", Строка(МассивКлючевыхОпераций[а]));
+ ЗаписьXML.ЗаписатьАтрибут("name", Строка(МассивКлючевыхОпераций[ИндексОперации]));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
@@ -1109,8 +1109,8 @@
ТЧ = Объект.Производительность;
Отбор = Новый Массив;
- Для а = 0 По ТЧ.Количество() -1 Цикл
- Отбор.Добавить(ТЧ[а].КлючеваяОперация);
+ Для ТекИндекс = 0 По ТЧ.Количество() - 1 Цикл
+ Отбор.Добавить(ТЧ[ТекИндекс].КлючеваяОперация);
КонецЦикла;
ПараметрыФормы = Новый Структура;
diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/Help/ru.html b/SSL/src/DataProcessors/ОценкаПроизводительности/Help/ru.html
index 866f979d7..45a0f3f0c 100644
--- a/SSL/src/DataProcessors/ОценкаПроизводительности/Help/ru.html
+++ b/SSL/src/DataProcessors/ОценкаПроизводительности/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для оценки производительности работы программы.
В программе предусмотрены встроенные средства для сбора и анализа данных о производительности работы по APDEX, которая является международным стандартом оценки производительности информационных систем.
Для того чтобы оценивать производительность, необходимо в начале работы программы заполнить список Ключевые операции.
diff --git a/SSL/src/DataProcessors/ОценкаПроизводительности/ObjectModule.bsl b/SSL/src/DataProcessors/ОценкаПроизводительности/ObjectModule.bsl
index a2e301346..f47beac35 100644
--- a/SSL/src/DataProcessors/ОценкаПроизводительности/ObjectModule.bsl
+++ b/SSL/src/DataProcessors/ОценкаПроизводительности/ObjectModule.bsl
@@ -168,11 +168,11 @@
Колонки = "";
Итоги = "";
НачалоПериода = ПараметрыВычисления.ДатаНачала;
- Для а = 0 По ПараметрыВычисления.КоличествоШагов - 1 Цикл
+ Для ТекШаг = 0 По ПараметрыВычисления.КоличествоШагов - 1 Цикл
- КонецПериода = ?(а = ПараметрыВычисления.КоличествоШагов - 1, ПараметрыВычисления.ДатаОкончания, НачалоПериода + ПараметрыВычисления.ШагЧисло - 1);
+ КонецПериода = ?(ТекШаг = ПараметрыВычисления.КоличествоШагов - 1, ПараметрыВычисления.ДатаОкончания, НачалоПериода + ПараметрыВычисления.ШагЧисло - 1);
- ИндексШага = Формат(а, "ЧН=0; ЧГ=0");
+ ИндексШага = Формат(ТекШаг, "ЧН=0; ЧГ=0");
Запрос.УстановитьПараметр("НачалоПериода" + ИндексШага, НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода" + ИндексШага, КонецПериода);
@@ -184,7 +184,7 @@
Колонки = СтрЗаменить(Колонки, "%Номер%", ИндексШага);
Если ПараметрыВычисления.ВыводитьИтоги Тогда
- Итоги = Итоги + Итог + ?(а = ПараметрыВычисления.КоличествоШагов - 1, "", ",");
+ Итоги = Итоги + Итог + ?(ТекШаг = ПараметрыВычисления.КоличествоШагов - 1, "", ",");
Итоги = СтрЗаменить(Итоги, "%Номер%", ИндексШага);
КонецЕсли;
@@ -209,24 +209,24 @@
// ТаблицаКлючевыхОпераций.Сдвинуть(0, ТаблицаКлючевыхОпераций.Количество() - 1);
КонецЕсли;
- а = 0;
+ ИндексКолонки = 0;
ИндексМассива = 0;
- Пока а <= ТаблицаКлючевыхОпераций.Колонки.Количество() - 1 Цикл
+ Пока ИндексКолонки <= ТаблицаКлючевыхОпераций.Колонки.Количество() - 1 Цикл
- КолонкаТаблицаКлючевыхОпераций = ТаблицаКлючевыхОпераций.Колонки[а];
+ КолонкаТаблицаКлючевыхОпераций = ТаблицаКлючевыхОпераций.Колонки[ИндексКолонки];
Если Лев(КолонкаТаблицаКлючевыхОпераций.Имя, 4) = "Врем" Тогда
ТаблицаКлючевыхОпераций.Колонки.Удалить(КолонкаТаблицаКлючевыхОпераций);
Продолжить;
КонецЕсли;
- Если а < 3 Тогда
- а = а + 1;
+ Если ИндексКолонки < 3 Тогда
+ ИндексКолонки = ИндексКолонки + 1;
Продолжить;
КонецЕсли;
КолонкаТаблицаКлючевыхОпераций.Заголовок = ЗаголовкиКолонок[ИндексМассива];
ИндексМассива = ИндексМассива + 1;
- а = а + 1;
+ ИндексКолонки = ИндексКолонки + 1;
КонецЦикла;
@@ -346,7 +346,7 @@
Колонка = ИндексНачальнойКолонки;
Пока Колонка < ИндексПоследнейКолонки Цикл
- Н = 0;
+ НН = 0;
НС = 0;
НТ = 0;
@@ -365,17 +365,17 @@
ТаблицаКлючевыхОпераций[Строка][Колонка + 1] = ТаблицаКлючевыхОпераций[Строка][Колонка + 1] * Коэффициент;
ТаблицаКлючевыхОпераций[Строка][Колонка + 2] = ТаблицаКлючевыхОпераций[Строка][Колонка + 2] * Коэффициент;
- Н = Н + ТаблицаКлючевыхОпераций[Строка][Колонка];
+ НН = НН + ТаблицаКлючевыхОпераций[Строка][Колонка];
НС = НС + ТаблицаКлючевыхОпераций[Строка][Колонка + 1];
НТ = НТ + ТаблицаКлючевыхОпераций[Строка][Колонка + 2];
КонецЦикла;
- Если Н = 0 Тогда
+ Если НН = 0 Тогда
ИтоговыйAPDEX = 0;
- ИначеЕсли НС = 0 И НТ = 0 И Н <> 0 Тогда
+ ИначеЕсли НС = 0 И НТ = 0 И НН <> 0 Тогда
ИтоговыйAPDEX = 0.001;
Иначе
- ИтоговыйAPDEX = (НС + НТ / 2) / Н;
+ ИтоговыйAPDEX = (НС + НТ / 2) / НН;
КонецЕсли;
ТаблицаКлючевыхОпераций[ИндексСтрокиИтогов][Колонка + 3] = ИтоговыйAPDEX;
diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Help/ru.html
index ff77372c0..7ca638bff 100644
--- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Help/ru.html
+++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиПользователейИПрав/Help/ru.html
@@ -4,7 +4,7 @@
TD {
VERTICAL-ALIGN: top
}
-
+
В данной панели осуществляется администрирование пользователей и настройка прав доступа. Доступны команды:
Пользователи - администрирование пользователей, которые работают с программой.
diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Help/ru.html
index d3f71eb5c..33f275c83 100644
--- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Help/ru.html
+++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиРаботыСФайлами/Help/ru.html
@@ -4,7 +4,7 @@
TD {
VERTICAL-ALIGN: top
}
-
+
В данной панели осуществляется настройка параметров загрузки, хранения и обработки файлов. Доступны команды:
Синхронизация данных - переход к настройке и выполнению синхронизации данных с другими программами (например, с 1С:Бухгалтерия предприятия, редакция 3.0), а также организации совместной работы в распределенной информационной базе.
diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиСинхронизацииДанных/Module.bsl b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиСинхронизацииДанных/Module.bsl
index 73bee46f2..06002f4e2 100644
--- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиСинхронизацииДанных/Module.bsl
+++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиСинхронизацииДанных/Module.bsl
@@ -91,16 +91,21 @@
#Область ОбработчикиКомандФормы
+// Обработка оповещений от других открытых форм.
+//
+// Параметры:
+// ИмяСобытия - Строка - имя события. Может быть использовано для идентификации сообщений принимающими их формами.
+// Параметр - Произвольный - параметр сообщения. Могут быть переданы любые необходимые данные.
+// Источник - Произвольный - источник события. Например, в качестве источника может быть указана другая форма.
+//
+// Пример:
+// Если ИмяСобытия = "НаборКонстант.ПрефиксУзлаРаспределеннойИнформационнойБазы" Тогда
+// НаборКонстант.ПрефиксУзлаРаспределеннойИнформационнойБазы = Параметр;
+// КонецЕсли;
+//
&НаКлиенте
Процедура ОбработчикОповещений(ИмяСобытия, Параметр, Источник)
- // Обработка оповещений от других открытых форм.
- //
- // Пример:
- // Если ИмяСобытия = "НаборКонстант.ПрефиксУзлаРаспределеннойИнформационнойБазы" Тогда
- // НаборКонстант.ПрефиксУзлаРаспределеннойИнформационнойБазы = Параметр;
- // КонецЕсли;
-
КонецПроцедуры
diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Help/ru.html
index 31376c160..3326c990a 100644
--- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Help/ru.html
+++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ОбщиеНастройки/Help/ru.html
@@ -4,7 +4,7 @@
TD {
VERTICAL-ALIGN: top
}
-
+
В данной панели осуществляется настройка основных параметров программы.
Заголовок программы - введите текст, который будет отображаться в заголовке окна программы.
Часовой пояс - часовой пояс, по которому ведется учет в программе. Все даты документов и регистров программы хранятся в этом часовом поясе.
diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Help/ru.html
index 43b01adc0..ab17ebaec 100644
--- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Help/ru.html
+++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/Органайзер/Help/ru.html
@@ -4,7 +4,7 @@
TD {
VERTICAL-ALIGN: top
}
-
+
В данной панели осуществляется настройка электронной почты, заметок, напоминаний и бизнес-процессов. Доступны команды:
Почтовый клиент - включите флажок, для того чтобы использовать возможности встроенного в программу почтового клиента для взаимодействий с помощью электронных писем (e-mail).
diff --git a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Help/ru.html b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Help/ru.html
index 20b15a444..e764c670d 100644
--- a/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Help/ru.html
+++ b/SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/ПечатныеФормыОтчетыИОбработки/Help/ru.html
@@ -4,7 +4,7 @@
TD {
VERTICAL-ALIGN: top
}
-
+
В данной панели осуществляется настройка печатных форм, вариантов отчетов, рассылок отчетов, дополнительных отчетов и обработок. Доступны команды:
Макеты печатных форм - переход к списку макетов для настройки печатных форм, формируемых из программы.
Программа позволяет производить полнотекстовый поиск в любых справочниках, документах и других объектах, отыскивая заданную строку во всех полях объектов. При наличии присоединенных файлов, содержащих текстовую информацию, поиск осуществляется также и по ним. Полнотекстовый поиск используется при поиске данных в программе по содержимому справочников, документов и других объектов программы.
В разделе Администрирование предусмотрены средства, при помощи которых можно изменять параметры работы, проводить регламентные операции и контролировать состояние программы.
Для эффективной работы программы ее необходимо правильно настроить.
При необходимости, часто используемые настройки можно вынести в командный интерфейс раздела Администрирование в настройках панели навигации или панели действий, в зависимости от типа настройки.
Предназначена для поиска и устранения дублирования элементов во всех списках программы (для администраторов программы).
При работе пользователей в программе часто ошибочно вводятся дубли (например, неправильно производился поиск элемента, в результате его не нашли и ввели заново), которые мешают правильному учету. В документах указывают то один экземпляр элемента, то другой, в результате при проведении документов возникают неправильные проводки, и баланс не сходится. Поэтому от дублирования в программе необходимо избавляться.
Программа позволяет найти вхождения всех дублирующихся элементов и производит в документах замену всех ссылок на дубли ссылками на выбранный "правильный" элемент, затем помечает на удаление дублирующиеся элементы в списке.
diff --git a/SSL/src/DataProcessors/ПоискИУдалениеДублей/ObjectModule.bsl b/SSL/src/DataProcessors/ПоискИУдалениеДублей/ObjectModule.bsl
index 40f7f1045..23b3cf991 100644
--- a/SSL/src/DataProcessors/ПоискИУдалениеДублей/ObjectModule.bsl
+++ b/SSL/src/DataProcessors/ПоискИУдалениеДублей/ObjectModule.bsl
@@ -1,7 +1,6 @@
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область СлужебныйПрограммныйИнтерфейс
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Заполняет список всех возможных областей для поиска дублей.
//
@@ -129,7 +128,7 @@
ПараметрыЗамены = Новый Структура;
ПараметрыЗамены.Вставить("СпособУдаления", Параметры.СпособУдаления);
- ПараметрыЗамены.Вставить("ВключатьБизнесЛогику", Истина);
+ ПараметрыЗамены.Вставить("ВключатьБизнесЛогику", Параметры.УчитыватьПрикладныеПравила);
ЗаменитьСсылки(Параметры.ПарыЗамен, ПараметрыЗамены, АдресРезультата);
@@ -352,7 +351,7 @@
ТаблицаДублей.Индексы.Добавить("Родитель");
ТаблицаДублей.Индексы.Добавить("Ссылка, Родитель");
- Результат = Новый Структура("ТаблицаДублей, ОписаниеОшибки", ТаблицаДублей);
+ Результат = Новый Структура("ТаблицаДублей, ОписаниеОшибки, МестаИспользования", ТаблицаДублей);
СтруктураПолей = Новый Структура;
СтруктураПолей.Вставить("РасшифровкаДополнительныхПолей", РасшифровкаДополнительныхПолей);
@@ -475,10 +474,28 @@
КонецФункции
+// Интерфейс для выполнения команд обработки.
+Процедура ВыполнитьКоманду(ПараметрыВыполнения, АдресРезультата) Экспорт
+
+ Если ПараметрыВыполнения.ИмяПроцедуры = "ФоновыйПоискДублей" Тогда
+
+ ФоновыйПоискДублей(ПараметрыВыполнения, АдресРезультата);
+
+ ИначеЕсли ПараметрыВыполнения.ИмяПроцедуры = "ФоновоеУдалениеДублей" Тогда
+
+ ФоновоеУдалениеДублей(ПараметрыВыполнения, АдресРезультата);
+
+ Иначе
+
+ ВызватьИсключение НСтр("ru = 'Поиск и удаление дублей: Команда ""%1"" не поддерживается.'");
+
+ КонецЕсли;
+
+КонецПроцедуры
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Преобразуем объект в таблицу для помещения в запрос.
Функция ОбъектВТаблицуЗначений(Знач ОбъектДанных)
@@ -501,7 +518,7 @@
Возврат Результат;
КонецФункции
-
+
// Дополнительный анализ кандидатов в дубли прикладном методом.
//
Процедура ДобавитьДублиПоПрикладнымПравилам(СтрокиДереваРезультата, Знач МенеджерОбластиПоиска, Знач ОсновныеДанные, Знач ТаблицаКандидатов, Знач СтруктураПолей, Знач ДополнительныеПараметры)
@@ -752,9 +769,8 @@
Возврат "";
КонецФункции
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
// Нечеткое сравнение строк
-//
Функция СтрокиПодобны(Знач Строка1, Знач Строка2)
@@ -899,8 +915,6 @@
Возврат Коэффициенты[Длина1][Длина2];
КонецФункции
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
Процедура ГруппаОбластейПоискаДублей(Результат, ОбъектыСПоискомДублей, Знач АнализироватьПрикладныеПравила, Знач МенеджерГруппы, Знач Пиктограмма)
Для Каждого Элемент Из МенеджерГруппы Цикл
@@ -924,9 +938,8 @@
КонецПроцедуры
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
// Для автономной работы.
-//
// [ОбщегоНазначения.МестаИспользования]
Функция МестаИспользованияСсылок(Знач НаборСсылок, Знач АдресРезультата = "")
@@ -946,5 +959,4 @@
#КонецОбласти
-
#КонецЕсли
\ No newline at end of file
diff --git a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/Форма/Module.bsl
index a2d111cab..da291364c 100644
--- a/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/Форма/Module.bsl
+++ b/SSL/src/DataProcessors/ПолнотекстовыйПоискВДанных/Forms/Форма/Module.bsl
@@ -223,13 +223,11 @@
Элементы.Далее.Доступность = Ложь;
Элементы.Назад.Доступность = Ложь;
- ТекстПоиска = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Комбинация слов ""%1"" нигде не встречается.
+ ТекстПоиска = НСтр("ru = 'Искомая комбинация слов нигде не встречается.
|Рекомендации:
|
Убедитесь, что все слова написаны без ошибок.
|
Попробуйте использовать другие ключевые слова.
- |
Попробуйте уменьшить количество искомых слов.'"),
- СокрЛП(СтрокаПоиска));
+ |
Полнотекстовый поиск данных позволяет находить любые сведения не только по полям карточек, но и по содержимому присоединенных файлов.
Полнотекстовый поиск можно выполнять прямо с Рабочего стола программы.
Полнотекстовый поиск предоставляет такие возможности как:
@@ -10,7 +10,7 @@
В файловом варианте информационной базы индекс полнотекстового поиска не обновляется автоматически и поэтому должен периодически обновляться вручную. Если индекс полнотекстового поиска не актуален (т.е. есть такие данные, которые еще не прошли индексирование), то в файловом варианте информационной базы становится доступна кнопка Обновить индекс.
Примеры
-
Пример поиска
+
Пример поиска
Результат
«Реализация 00016422»
Найдет документ «реализация товаров и услуг» с номером «00016422»
«Платежное 120000»
Найдет платежные поручения на суммы 120000 и 120000,50
«Иванов Акация»
diff --git a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Module.bsl
index 86d5588c6..af1a9ad8d 100644
--- a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Module.bsl
+++ b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Forms/Форма/Module.bsl
@@ -665,44 +665,82 @@
Возврат;
КонецЕсли;
- Оповещение = Новый ОписаниеОповещения("ОткрытьКаталогОбменаИнформациейУзлаЗавершение", ЭтотОбъект, Новый Структура);
- Оповещение.ДополнительныеПараметры.Вставить("ИмяКаталога", ИмяКаталога);
+ ДополнительныеПараметры = Новый Структура();
+ ДополнительныеПараметры.Вставить("ИмяКаталога", ИмяКаталога);
+
+ Оповещение = Новый ОписаниеОповещения("ПослеПроверкиРасширенияРаботыСФайлами", ЭтаФорма, ДополнительныеПараметры);
+
ТекстПредложения = Нстр("ru = 'Для открытия каталога необходимо необходимо установить расширение работы с файлами.'");
+ ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстПредложения);
- ОбщегоНазначенияКлиент.ПроверитьРасширениеРаботыСФайламиПодключено(Оповещение, ТекстПредложения);
КонецПроцедуры
+// Продолжение процедуры (см. выше).
&НаКлиенте
-Процедура ОткрытьКаталогОбменаИнформациейУзлаЗавершение(Результат, ДополнительныеПараметры) Экспорт
+Процедура ПослеПроверкиРасширенияРаботыСФайлами(Результат, ДополнительныеПараметры) Экспорт
- ИмяКаталога = ДополнительныеПараметры.ИмяКаталога;
+ Если Результат Тогда
- ТекстПредупреждения = "";
+ Файл = Новый Файл();
+ ОписаниеОповещения = Новый ОписаниеОповещения("ПроверитьСуществованиеФайла", ЭтаФорма, ДополнительныеПараметры);
+ Файл.НачатьИнициализацию(ОписаниеОповещения, ДополнительныеПараметры.ИмяКаталога);
- Файл = Новый Файл(ИмяКаталога);
- Если Не Файл.Существует() Тогда
- ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Каталог ""%1"" не существует или к нему нет доступа.'"),
- ИмяКаталога
- );
-
- ИначеЕсли Не Файл.ЭтоКаталог() Тогда
- ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = '""%1"" является файлом, а не каталогом.'"),
- ИмяКаталога
- );
-
- КонецЕсли;
-
- Если ПустаяСтрока(ТекстПредупреждения) Тогда
- // Независимое от платформы открытие каталога.
- ЗапуститьПриложение(ИмяКаталога);
Иначе
+ ТекстПредупреждения = Нстр("ru = 'Расширение для работы с файлами не установлено, открытие каталога не возможно.'");
ПоказатьПредупреждение(, ТекстПредупреждения);
КонецЕсли;
КонецПроцедуры
+// Продолжение процедуры (см. выше).
+&НаКлиенте
+Процедура ПроверитьСуществованиеФайла(Файл, ДополнительныеПараметры) Экспорт
+ ДополнительныеПараметры.Вставить("Файл", Файл);
+ ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОпределенияСуществованияФайла", ЭтаФорма, ДополнительныеПараметры);
+ Файл.НачатьПроверкуСуществования(ОписаниеОповещения);
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+&НаКлиенте
+Процедура ПослеОпределенияСуществованияФайла(Существует, ДополнительныеПараметры) Экспорт
+
+ Если Существует Тогда
+ Файл = ДополнительныеПараметры.Файл;
+ ОписаниеОповещения = Новый ОписаниеОповещения("ОпределитьЭтоКаталог", ЭтаФорма, ДополнительныеПараметры);
+ Файл.НачатьПроверкуЭтоКаталог(ОписаниеОповещения);
+ Иначе
+ ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Каталог ""%1"" не существует или к нему нет доступа.'"),
+ ДополнительныеПараметры.ИмяКаталога
+ );
+ ПоказатьПредупреждение(, ТекстПредупреждения);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+&НаКлиенте
+Процедура ОпределитьЭтоКаталог(ЭтоКаталог, ДополнительныеПараметры) Экспорт
+
+ Если ЭтоКаталог Тогда
+ ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьКаталогСФайлом", ЭтаФорма, ДополнительныеПараметры);
+ НачатьЗапускПриложения(ОписаниеОповещения, ДополнительныеПараметры.ИмяКаталога);
+ Иначе
+ ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = '""%1"" является файлом, а не каталогом.'"),
+ ДополнительныеПараметры.ИмяКаталога
+ );
+ ПоказатьПредупреждение(, ТекстПредупреждения);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+&НаКлиенте
+Процедура ОткрытьКаталогСФайлом(КодВозврата, ДополнительныеПараметры) Экспорт
+ // Обработка не требуется.
+КонецПроцедуры
+
&НаКлиенте
Процедура ПерейтиВЖурналРегистрации(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
diff --git a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Help/ru.html b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Help/ru.html
index cc2c8ec54..785141d70 100644
--- a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Help/ru.html
+++ b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Помощник интерактивной синхронизации данных предназначен для выполнения синхронизации данных с возможностью предварительного просмотра и сопоставления загружаемых данных. Помощник позволяет выполнять сопоставление объектов двух информационных баз, между которыми настроена синхронизация данных. После выполнения сопоставления выполняется загрузка данных и последующая выгрузка данных.
Режим интерактивной синхронизации данных следует использовать в случае, когда до начала синхронизации один и тот же объект мог быть введен независимо в обеих обменивающихся ИБ. Другими словами, интерактивный режим синхронизации данных следует выбирать при первой синхронизации данных между ИБ, учет в которых уже ведется. Поскольку вероятность существования в таких ИБ одних и тех же объектов очень высока. В этом случае интерактивный режим позволит такие объекты сопоставить вручную.
Открыть помощник можно, нажав кнопку Синхронизировать данные, задав дополнительные параметры в списке Синхронизация данных.
diff --git a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ObjectModule.bsl b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ObjectModule.bsl
index 94b255982..e8fbba8d9 100644
--- a/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ObjectModule.bsl
+++ b/SSL/src/DataProcessors/ПомощникИнтерактивногоОбменаДанными/ObjectModule.bsl
@@ -305,12 +305,14 @@
УстановитьПривилегированныйРежим(Истина);
- ОбработкаОбменаДанными = ОбменДаннымиСервер.ОбработкаОбменаДляЗагрузкиДанных(Отказ, УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена);
+ СтруктураНастроекОбмена = ОбменДаннымиСервер.СтруктураНастроекОбменаДляСеансаИнтерактивнойЗагрузки(УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена);
- Если Отказ Тогда
+ Если СтруктураНастроекОбмена.Отказ Тогда
Возврат;
КонецЕсли;
+ ОбработкаОбменаДанными = СтруктураНастроекОбмена.ОбработкаОбменаДанными;
+
ПараметрыАнализа = Новый Структура("СобиратьСтатистикуКлассификаторов", Истина);
ОбработкаОбменаДанными.ВыполнитьАнализСообщенияОбмена(ПараметрыАнализа);
@@ -365,12 +367,14 @@
//
Процедура ВыполнитьЗагрузкуДанныхИзСообщенияОбменаВКэш(Отказ, ИндексыСтрок)
- ОбработкаОбменаДанными = ОбменДаннымиСервер.ОбработкаОбменаДляЗагрузкиДанных(Отказ, УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена);
+ СтруктураНастроекОбмена = ОбменДаннымиСервер.СтруктураНастроекОбменаДляСеансаИнтерактивнойЗагрузки(УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена);
- Если Отказ Тогда
+ Если СтруктураНастроекОбмена.Отказ Тогда
Возврат;
КонецЕсли;
+ ОбработкаОбменаДанными = СтруктураНастроекОбмена.ОбработкаОбменаДанными;
+
// Получаем массив таблиц, которые необходимо пакетно загрузить в кэш платформы.
ТаблицыДляЗагрузки = Новый Массив;
diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Form.form b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Form.form
index ef46abba5..4e96b27d6 100644
--- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Form.form
+++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Form.form
@@ -16410,6 +16410,23 @@
true
+
+ ЭтоПланОбменаXDTO
+
+ ru
+ Это план обмена XDTO
+
+ 75
+
+ Boolean
+
+
+ true
+
+
+ true
+
+ КомандаДалее
diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Module.bsl
index 061a50740..874637753 100644
--- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Module.bsl
+++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Forms/Форма/Module.bsl
@@ -53,6 +53,7 @@
// Получаем значения по умолчанию для плана обмена.
МенеджерПланаОбмена = ПланыОбмена[Объект.ИмяПланаОбмена];
+
КраткоеОписание = МенеджерПланаОбмена.КраткаяИнформацияПоОбмену(Объект.ВариантНастройкиОбмена);
СсылкаНаПодробноеОписание = МенеджерПланаОбмена.ПодробнаяИнформацияПоОбмену(Объект.ВариантНастройкиОбмена);
@@ -63,6 +64,7 @@
НастройкаОтборовНаУзле = ОбменДаннымиСервер.НастройкаОтборовНаУзле(Объект.ИмяПланаОбмена, ВерсияКонфигурацииКорреспондента, ФормаНастройкиУзла, Объект.ВариантНастройкиОбмена);
ЗначенияПоУмолчаниюНаУзле = ОбменДаннымиСервер.ЗначенияПоУмолчаниюНаУзле(Объект.ИмяПланаОбмена, ВерсияКонфигурацииКорреспондента, ФормаНастройкиЗначенийПоУмолчанию, Объект.ВариантНастройкиОбмена);
+ ЭтоПланОбменаXDTO = ОбменДаннымиСервер.ЭтоПланОбменаXDTO(Объект.ИмяПланаОбмена);
НастройкиПараметровУчетаПоясняющаяНадпись = МенеджерПланаОбмена.ПояснениеДляНастройкиПараметровУчета();
@@ -739,25 +741,11 @@
#Иначе
- Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
-
- Диалог.Заголовок = НСтр("ru = 'Укажите имя файла настроек синхронизации данных'");
- Диалог.Расширение = "xml";
- Диалог.Фильтр = "Файл настроек синхронизации данных(*.xml)|*.xml";
- Диалог.ПолноеИмяФайла = ИмяФайлаНастроекДляПриемника;
-
- Если Диалог.Выбрать() Тогда
-
- Объект.ИмяФайлаНастроекОбменаДанными = Диалог.ПолноеИмяФайла;
-
- ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
-
- УдалитьИзВременногоХранилища(АдресВременногоХранилища);
-
- // получаем файл
- ДвоичныеДанные.Записать(Объект.ИмяФайлаНастроекОбменаДанными);
-
- КонецЕсли;
+ ДополнительныеПараметры = Новый Структура();
+ ДополнительныеПараметры.Вставить("АдресВременногоХранилища", АдресВременногоХранилища);
+ ТекстПредложения = Нстр("ru = 'Для открытия каталога необходимо необходимо установить расширение работы с файлами.'");
+ Оповещение = Новый ОписаниеОповещения("ПослеПроверкиРасширенияРаботыСФайлами", ЭтаФорма, ДополнительныеПараметры);
+ ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстПредложения);
#КонецЕсли
@@ -765,6 +753,39 @@
КонецПроцедуры
+// Продолжение процедуры (см. выше).
+&НаКлиенте
+Процедура ПослеПроверкиРасширенияРаботыСФайлами(Результат, ДополнительныеПараметры) Экспорт
+
+ Если Результат Тогда
+
+ Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
+
+ Диалог.Заголовок = НСтр("ru = 'Укажите имя файла настроек синхронизации данных'");
+ Диалог.Расширение = "xml";
+ Диалог.Фильтр = "Файл настроек синхронизации данных(*.xml)|*.xml";
+ Диалог.ПолноеИмяФайла = ИмяФайлаНастроекДляПриемника;
+
+ Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтаФорма, ДополнительныеПараметры);
+ Диалог.Показать(Оповещение);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+&НаКлиенте
+Процедура ПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
+
+ Если ВыбранныеФайлы.Количество() = 1 Тогда
+ Объект.ИмяФайлаНастроекОбменаДанными = ВыбранныеФайлы[0];
+ ДвоичныеДанные = ПолучитьИзВременногоХранилища(ДополнительныеПараметры.АдресВременногоХранилища);
+ УдалитьИзВременногоХранилища(ДополнительныеПараметры.АдресВременногоХранилища);
+ ДвоичныеДанные.Записать(Объект.ИмяФайлаНастроекОбменаДанными);
+ КонецЕсли;
+
+КонецПроцедуры
+
&НаКлиенте
Процедура ПроверитьПодключениеFILE(Команда)
@@ -2237,8 +2258,7 @@
ОбменДаннымиКлиент.ОткрытьФормуПослеЗакрытияТекущей(ЭтотОбъект, "Обработка.ПомощникИнтерактивногоОбменаДанными.Форма", ПараметрыФормы, ПараметрыОткрытия);
Иначе
- ОткрытьФорму("Обработка.ПомощникИнтерактивногоОбменаДанными.Форма", ПараметрыФормы, , , ВариантОткрытияОкна.ОтдельноеОкно, , ,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
-
+ ОткрытьФорму("Обработка.ПомощникИнтерактивногоОбменаДанными.Форма", ПараметрыФормы);
КонецЕсли;
КонецЕсли;
@@ -2373,22 +2393,12 @@
ПараметрыФормы.Вставить("РасширенныйРежимДополненияВыгрузки", Истина);
ИмяФормыПомощника = "Обработка.ПомощникИнтерактивногоОбменаДанными.Форма";
-
- Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ОбменДаннымиXDTO") Тогда
-
- МодульОбменДаннымиXDTOКлиентПовтИсп = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбменДаннымиXDTOКлиентПовтИсп");
- Если МодульОбменДаннымиXDTOКлиентПовтИсп.ЭтоПланОбменаXDTO(Объект.УзелИнформационнойБазы) Тогда
- ИмяФормыПомощника = "Обработка.ПомощникИнтерактивногоОбменаДаннымиЧерезXDTO.Форма";
- КонецЕсли;
-
- КонецЕсли;
-
Если ОткрыватьПослеЗакрытияТекущей Тогда
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("РежимОткрытияОкна", РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
ОбменДаннымиКлиент.ОткрытьФормуПослеЗакрытияТекущей(ЭтотОбъект, ИмяФормыПомощника, ПараметрыФормы, ПараметрыОткрытия);
Иначе
- ОткрытьФорму(ИмяФормыПомощника, ПараметрыФормы, , , ВариантОткрытияОкна.ОтдельноеОкно, , ,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
+ ОткрытьФорму(ИмяФормыПомощника, ПараметрыФормы);
КонецЕсли;
КонецЕсли;
@@ -3728,27 +3738,6 @@
Процедура СтраницаМастераОжиданиеСинхронизацииДанныхЗагрузкаДлительнаяОперацияОкончание_ОбработкаДлительнойОперации()
ДлительнаяОперация = Ложь;
- ДлительнаяОперацияЗавершена = Ложь;
- ИдентификаторДлительнойОперации = "";
-
- ПараметрыМетода = Новый Структура;
- ПараметрыМетода.Вставить("УзелИнформационнойБазы", Объект.УзелИнформационнойБазы);
- ПараметрыМетода.Вставить("ИдентификаторФайла", ИдентификаторФайлаСообщенияВСервисе);
- ПараметрыМетода.Вставить("ДатаНачалаОперации", ДатаНачалаОперации);
- ПараметрыМетода.Вставить("ПараметрыАутентификации", Объект.WSПароль);
-
- Результат = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
- УникальныйИдентификатор,
- "Обработки.ПомощникСозданияОбменаДанными.ВыполнитьЗагрузкуДанных",
- ПараметрыМетода,
- НСтр("ru = 'Загрузка справочников из сообщения обмена'"));
-
- Если Не Результат.ЗаданиеВыполнено Тогда
-
- ДлительнаяОперация = Истина;
- ИдентификаторДлительнойОперации = Результат.ИдентификаторЗадания;
-
- КонецЕсли;
КонецПроцедуры
@@ -4720,7 +4709,7 @@
НовыйПереход.ИмяОбработчикаПриПереходеДалее = "СтраницаМастераСопоставлениеДанных_ПриПереходеДалее";
НовыйПереход.ИмяОбработчикаПриОткрытии = "СтраницаМастераСопоставлениеДанных_ПриОткрытии";
- // Синхронизация справочников
+ // Синхронизация справочников.
НовыйПереход = ТаблицаПереходов.Добавить();
НовыйПереход.ПорядковыйНомерПерехода = 13;
@@ -4934,7 +4923,7 @@
НовыйПереход.ИмяОбработчикаПриПереходеДалее = "СтраницаМастераСопоставлениеДанных_ПриПереходеДалее";
НовыйПереход.ИмяОбработчикаПриОткрытии = "СтраницаМастераСопоставлениеДанных_ПриОткрытии";
- // Синхронизация справочников
+ // Синхронизация справочников.
НовыйПереход = ТаблицаПереходов.Добавить();
НовыйПереход.ПорядковыйНомерПерехода = 12;
diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Help/ru.html b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Help/ru.html
index 83f4e8307..36a68fb2a 100644
--- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Help/ru.html
+++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для настройки синхронизации данных между двумя программами. Возможна настройка синхронизации данных по правилам обмена, без использования правил обмена и организация совместной работы в распределенной информационной базе (РИБ).
Этапы настройки параметров синхронизации данных
Настройка синхронизации данных при выборе варианта подключения через другие каналы связи выполняется в два этапа. Первый шаг настройки синхронизации данных выполняется в текущей программе, затем необходимо перейти в другую программу и закончить в ней настройку синхронизации данных. Для передачи информации между этапами настройки синхронизации данных используется временный файл с настройками. При настройке синхронизации данных через прямое соединение с базой или через веб-сервисы вся настройка для обеих программ выполняется в текущей программе.
diff --git a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo
index ce9df53cd..42b66c8f2 100644
--- a/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo
+++ b/SSL/src/DataProcessors/ПомощникСозданияОбменаДанными/ПомощникСозданияОбменаДанными.mdo
@@ -797,6 +797,10 @@
ИндексКартинки
+
+ ru
+ Индекс картинки
+ Number
diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Настройки/Module.bsl b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Настройки/Module.bsl
index 8994a2f75..4bbe2155b 100644
--- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Настройки/Module.bsl
+++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/Настройки/Module.bsl
@@ -65,13 +65,59 @@
&НаКлиенте
Процедура ОбработкаЗапросаПутьНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
- Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
- Диалог.ПроверятьСуществованиеФайла = Истина;
- Диалог.Фильтр = НСтр("ru = 'Внешние обработки (*.epf)|*.epf'");
- Если Диалог.Выбрать() Тогда
- ВариантИспользованияКонсолиЗапросов = 2;
- УстановитьНастройкуАдресВнешнейОбработкиЗапросов(Диалог.ПолноеИмяФайла);
+
+ ДополнительныеПараметры = Новый Структура();
+
+ ТекстПредложения = Нстр("ru = 'Для открытия каталога необходимо необходимо установить расширение работы с файлами.'");
+ ОписаниеОповещенияОЗакрытии = Новый ОписаниеОповещения("ПослеПроверкиРасширенияРаботыСФайлами", ЭтаФорма, ДополнительныеПараметры);
+
+ ОписаниеОповещенияЗавершение = Новый ОписаниеОповещения("ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиЗавершение",
+ ЭтотОбъект, ОписаниеОповещенияОЗакрытии);
+
+#Если Не ВебКлиент Тогда
+ // В тонком и толстом клиентах расширение подключено всегда.
+ ВыполнитьОбработкуОповещения(ОписаниеОповещенияЗавершение, "ПодключениеНеТребуется");
+ Возврат;
+#КонецЕсли
+
+ ДополнительныеПараметры = Новый Структура;
+ ДополнительныеПараметры.Вставить("ОписаниеОповещенияЗавершение", ОписаниеОповещенияЗавершение);
+ ДополнительныеПараметры.Вставить("ТекстПредложения", ТекстПредложения);
+ ДополнительныеПараметры.Вставить("ВозможноПродолжениеБезУстановки", Истина);
+
+ Оповещение = Новый ОписаниеОповещения("ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиПриУстановкеРасширения",
+ ЭтотОбъект, ДополнительныеПараметры);
+ НачатьПодключениеРасширенияРаботыСФайлами(Оповещение);
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+&НаКлиенте
+Процедура ПослеПроверкиРасширенияРаботыСФайлами(Результат, ДополнительныеПараметры) Экспорт
+
+ Если Результат Тогда
+
+ Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
+
+ Диалог.ПроверятьСуществованиеФайла = Истина;
+ Диалог.Фильтр = НСтр("ru = 'Внешние обработки (*.epf)|*.epf'");
+
+ Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтаФорма, ДополнительныеПараметры);
+ Диалог.Показать(Оповещение);
+
КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+&НаКлиенте
+Процедура ПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
+
+ Если ВыбранныеФайлы.Количество() = 1 Тогда
+ ВариантИспользованияКонсолиЗапросов = 2;
+ УстановитьНастройкуАдресВнешнейОбработкиЗапросов(ВыбранныеФайлы[0]);
+ КонецЕсли;
+
КонецПроцедуры
#КонецОбласти
diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/СообщениеОбОбычномИнтерфейсе/Form.oform b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/СообщениеОбОбычномИнтерфейсе/Form.oform
index d7f4ba947..f36e6e9b6 100644
Binary files a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/СообщениеОбОбычномИнтерфейсе/Form.oform and b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Forms/СообщениеОбОбычномИнтерфейсе/Form.oform differ
diff --git a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Help/ru.html b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Help/ru.html
index 4faaa5f83..57ed0d22a 100644
--- a/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Help/ru.html
+++ b/SSL/src/DataProcessors/РегистрацияИзмененийДляОбменаДанными/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для регистрации изменений данных в программе. Это необходимо для последующей отправки данных при синхронизации в другие программы.
Список можно открыть по команде Еще -Состав отправляемых данных из списка Синхронизации данных.
Ведется регистрация номеров сообщений. Нажмите на ссылку с номерами сообщений, чтобы просмотреть их или исправить.
Как правило, необходимость в изменении свойств регламентных заданий возникает редко. Чаще всего, используется флажок Включено, с помощью которого можно отключить выполнение регламентного задания.
В некоторых случаях бывает необходимо задать два разных расписания для одного регламентного задания. Тогда в список можно добавить новое регламентное задание по одному из предопределенных шаблонов, предусмотренных в программе.
Наименование - копия поля Наименованиерегламентного задания. При применении кнопки Выполнить сейчас на командной панели регламентного задания, наименованию фонового задания присваивается значение "Запуск вручную: <Представление регламентного задания>".
diff --git a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Help/ru.html b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Help/ru.html
index 3714287c0..37543d41c 100644
--- a/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Help/ru.html
+++ b/SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Help/ru.html
@@ -1,11 +1,19 @@
-
+
Предназначен для администрирования регламентных и фоновых заданий.
Ряд действий в программе может выполняться автоматически в фоновом режиме, по определенному расписанию. Такие действия называются регламентными заданиями, например, это ежедневная загрузка курсов валют, регулярная рассылка отчетов, отложенное проведение документов и т.п. Регламентные задания облегчают работу в программе, позволяя перенести выполнение рутинных задач в саму программу, и в то же время они снижают человеческий фактор (например, можно забыть загрузить курсы валют в один из перегруженных другими задачами дней).
Открывается по команде Регламентные и фоновые задания в разделе Администрирование - Поддержка и обслуживание.
Особенности запуска регламентных заданий в файловом режиме работы
+
+
Внимание! При одновременной параллельной работе с файловой базой нескольких пользователей рекомендуется выделить для выполнения регламентных заданий отдельное приложение (запуск с параметром /AllowExecuteScheduledJobs -Force).
+
+
Желательно, чтобы приложение запускалось на том же компьютере, где расположена информационная база.
+
+
Это связано с тем, что выполнение регламентных заданий во время одновременной работы нескольких пользователей (от 4 и выше) в файловой базе может существенно затормозить их работу.
+
+
Если пользователей более 10, то необходимо воспользоваться отдельным приложением для выполнения регламентных заданий.
В списке можно включить (или отключить) то или иное регламентное задание и поменять расписание.
В списке выводится:
- флажок в колонке означает, что регламентное задание Включено и выполняется в соответствии с заданным расписанием;
@@ -40,7 +48,7 @@
Окончание - дата и время окончания выполнения фонового задания;
Регламентное задание - наименование регламентного задания.
Для контроля выполнения регламентных заданий можно воспользоваться отбором фоновых заданий по различным признакам:
-
Отбор
+
Отбор
Описание
По состоянию
Позволяет выполнить отбор по состоянию (дополнительно к отбору по периоду и по регламентному заданию):
diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Help/ru.html b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Help/ru.html
index 28cb6f1bf..b29fa6925 100644
--- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Help/ru.html
+++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для восстановления данных из резервной копии.
Открывается командой Восстановление из резервной копии раздела Администрирование - Поддержка и обслуживание - Резервное копирование и восстановление.
В любой момент времени можно восстановить данные из созданной ранее резервной копии. Необходимо учитывать, что все данные в восстановленной информационно базе будут актуальны на момент создания копии. Данные, введенные в программу после создания резервной копии, будут отсутствовать в восстановленной ИБ.
@@ -7,6 +7,6 @@
В данном помощнике при восстановлении данных можно использовать только архивы формата .zip, содержащие один файл - файл информационной базы 1cv8.cd. Лучше всего использовать архивы, созданные помощником создания резервной копии.
Программа выводит предупреждение о том, что имеются другие пользователи, которые кроме вас работают с информационной базой в текущий момент. Перейдите по ссылке, для того чтобы Посмотреть список активных сеансов.
Нажмите Восстановить данные. Если присутствуют активные сеансы, будет запущен механизм отключения их от информационной базы. Затем программа выполнит восстановление данных.
Вход в базу в случае сбоя восстановления данных
-
Важно: Для того чтобы войти в информационную базу, если восстановление данных не выполнилось, необходимо запустить 1С:Предприятие с параметрами: ENTERPRISE /F <путь к информационной базе> /CРазрешитьРаботуПользователей /UC РезервноеКопирование.
См. также:
+
Важно: Для того чтобы войти в информационную базу, если восстановление данных не выполнилось, необходимо запустить 1С:Предприятие с параметрами: ENTERPRISE /F <путь к информационной базе> /CРазрешитьРаботуПользователей /UC РезервноеКопирование.
\ No newline at end of file
diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Module.bsl b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Module.bsl
index 22d58f77c..dab561a4e 100644
--- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Module.bsl
+++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Module.bsl
@@ -24,7 +24,7 @@
ПарольАдминистратораИБ = НастройкиРезервногоКопирования.ПарольАдминистратораИБ;
Объект.КаталогСРезервнымиКопиями = НастройкиРезервногоКопирования.КаталогХраненияРезервныхКопий;
- Если СоединенияИБ.КоличествоСеансовИнформационнойБазы() > 1 Тогда
+ Если КоличествоСеансовИнформационнойБазы() > 1 Тогда
Элементы.СтраницыСтатусаВосстановления.ТекущаяСтраница = Элементы.СтраницаАктивныеПользователи;
@@ -150,13 +150,15 @@
Страницы.ТекущаяСтраница = Элементы.СтраницаИнформацииИВыполненияРезервногоКопирования;
Элементы.Закрыть.Доступность = Истина;
- ОбновитьКоличествоАктивныхПользователей();
Элементы.Готово.Доступность = Ложь;
+ КоличествоСеансовИнформационнойБазы = КоличествоСеансовИнформационнойБазы();
+ Элементы.КоличествоАктивныхПользователей.Заголовок = КоличествоСеансовИнформационнойБазы;
+
УстановитьБлокировкуСоединений = Истина;
СоединенияИБВызовСервера.УстановитьБлокировкуСоединений(Нстр("ru = 'Выполняется восстановление информационной базы.'"), "РезервноеКопирование");
- Если СоединенияИБВызовСервера.КоличествоСеансовИнформационнойБазы() = 1 Тогда
+ Если КоличествоСеансовИнформационнойБазы = 1 Тогда
СоединенияИБКлиент.УстановитьПризнакРаботаПользователейЗавершается(УстановитьБлокировкуСоединений);
СоединенияИБКлиент.ЗавершитьРаботуЭтогоСеанса(Ложь);
НачатьРезервноеКопирование();
@@ -194,14 +196,6 @@
КонецПроцедуры
-// Процедура обновляет заголовок гиперссылки количества активных пользователей.
-&НаКлиенте
-Процедура ОбновитьКоличествоАктивныхПользователей()
-
- Элементы.КоличествоАктивныхПользователей.Заголовок = СоединенияИБВызовСервера.КоличествоСеансовИнформационнойБазы();
-
-КонецПроцедуры
-
// Функция запрашивает у пользователя и возвращает путь к файлу или каталогу.
&НаКлиенте
Процедура ВыбратьФайлРезервнойКопии()
@@ -307,11 +301,11 @@
&НаКлиенте
Процедура ПроверкаНаЕдинственностьПодключения()
- Если СоединенияИБВызовСервера.КоличествоСеансовИнформационнойБазы() = 1 Тогда
+ Если КоличествоСеансовИнформационнойБазы() = 1 Тогда
НачатьРезервноеКопирование();
КонецЕсли;
-КонецПроцедуры
+КонецПроцедуры
&НаКлиенте
Процедура НачатьРезервноеКопирование()
@@ -504,4 +498,11 @@
КонецПроцедуры
+&НаСервере
+Функция КоличествоСеансовИнформационнойБазы()
+
+ Возврат СоединенияИБ.КоличествоСеансовИнформационнойБазы(Ложь, Ложь);
+
+КонецФункции
+
#КонецОбласти
diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Form.form b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Form.form
index a5318ee6e..dc64aff9e 100644
--- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Form.form
+++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Form.form
@@ -1927,106 +1927,26 @@
Auto
-
- КоманднаяПанель
- 387
-
- КоманднаяПанельСправа
- 383
-
- Далее
- 1
-
- ru
- Далее >
-
- true
- true
-
- true
-
-
- ДалееExtendedTooltip
- 288
- Label
- true
- true
-
- Left
-
-
- Form.Command.ФормаДалее
- Auto
- true
- true
- true
- UserCmds
- Auto
-
-
- Отмена
- 2
-
- ru
- Отмена
-
- true
- true
-
- true
-
-
- ОтменаExtendedTooltip
- 289
- Label
- true
- true
-
- Left
-
-
- Form.Command.ФормаОтмена
- Normal
- Auto
- true
- true
- UserCmds
- Auto
-
-
- Справка
- 385
- true
- true
-
- true
-
-
- СправкаРасширеннаяПодсказка
- 386
- Label
- true
- true
-
- Left
-
-
- Form.StandardCommand.Help
- Normal
- Auto
- true
- true
- UserCmds
- Auto
-
+ Bottom
+ true
+
+ ФормаКоманднаяПанель
+ -1
+
+ Далее
+ 1
+
+ ru
+ Далее >
+ truetruetrue
- КоманднаяПанельСправаРасширеннаяПодсказка
- 384
+ ДалееExtendedTooltip
+ 288Labeltruetrue
@@ -2034,48 +1954,70 @@
Left
- CommandBar
-
- Right
-
-
- true
- true
-
- true
-
-
- ru
- Командная панель
-
-
- ru
- Командная панель
-
-
- КоманднаяПанельРасширеннаяПодсказка
- 388
- Label
+ Form.Command.ФормаДалее
+ Auto
+ truetruetrue
-
- Left
-
-
- UsualGroup
-
- Auto
- true
- true
- Auto
- Auto
-
-
- Bottom
- true
-
- ФормаКоманднаяПанель
- -1
+ UserCmds
+ Auto
+
+
+ Отмена
+ 2
+
+ ru
+ Отмена
+
+ true
+ true
+
+ true
+
+
+ ОтменаExtendedTooltip
+ 289
+ Label
+ true
+ true
+
+ Left
+
+
+ Form.Command.ФормаОтмена
+ Normal
+ Auto
+ true
+ true
+ UserCmds
+ Auto
+
+
+ Справка
+ 385
+ true
+ true
+
+ true
+
+
+ СправкаРасширеннаяПодсказка
+ 386
+ Label
+ true
+ true
+
+ Left
+
+
+ Form.StandardCommand.Help
+ Normal
+ Auto
+ true
+ true
+ UserCmds
+ Auto
+ Right
diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Help/ru.html b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Help/ru.html
index ea5b898cc..ba2edc450 100644
--- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Help/ru.html
+++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для создания резервной копии информационной базы.
Рекомендуется создавать резервные копии перед любой операцией в программе, которая может необратимо изменить большие объемы данных, например, перед групповым изменением реквизитов объектов программы. В этом случае необходимо выполнить резервное копирование в ручном режиме.
Открывается по команде Создание резервной копии из раздела Администрирование - Поддержка и обслуживание - Резервное копирование.
@@ -14,5 +14,5 @@
Если программе не удалось принудительно отключить сеансы, и администратором также не были предприняты какие-либо действия, то резервное копирование может не состояться. В этом случае программа выводит предупреждение, что резервное копирование не было проведено, и список сеансов, которые не удалось завершить (например, Конфигуратор).
Запуск программы в случае ошибок во время резервного копирования
Перед началом резервного копирования программа выводит сообщение с рекомендациями по немедленному запуску.
-
Для того, чтобы войти в информационную базу, если резервное копирование не выполнилось, необходимо запустить 1С:Предприятие с параметрами: ENTERPRISE /F <путь к информационной базе> /CРазрешитьРаботуПользователей /UC РезервноеКопирование.
См. также:
+
Для того, чтобы войти в информационную базу, если резервное копирование не выполнилось, необходимо запустить 1С:Предприятие с параметрами: ENTERPRISE /F <путь к информационной базе> /CРазрешитьРаботуПользователей /UC РезервноеКопирование.
\ No newline at end of file
diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Module.bsl b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Module.bsl
index fe995cfc5..e6f2cb881 100644
--- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Module.bsl
+++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Module.bsl
@@ -64,13 +64,20 @@
// Первая часть проверки на сервере - если в информационной базе есть пользователи.
ТребуетсяВводПароля = (ПользователиИнформационнойБазы.ПолучитьПользователей().Количество() > 0);
- Если СоединенияИБ.КоличествоСеансовИнформационнойБазы() > 1 Тогда
+ РучнойЗапуск = (Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СтраницаВыполненияРезервногоКопирования);
+
+ Если РучнойЗапуск Тогда
- Элементы.СтраницыСтатусаКопирования.ТекущаяСтраница = Элементы.СтраницаАктивныеПользователи;
+ Если КоличествоСеансовИнформационнойБазы() > 1 Тогда
+
+ Элементы.СтраницыСтатусаКопирования.ТекущаяСтраница = Элементы.СтраницаАктивныеПользователи;
+
+ КонецЕсли;
+
+ Элементы.Далее.Заголовок = Нстр("ru = 'Сохранить резервную копию'");
КонецЕсли;
- РучнойЗапуск = (Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СтраницаВыполненияРезервногоКопирования);
РезервноеКопированиеИБСервер.УстановитьЗначениеНастройки("РучнойЗапускПоследнегоРезервногоКопирования", РучнойЗапуск);
КонецПроцедуры
@@ -203,7 +210,7 @@
ТекущаяСтраницаПомощника = Элементы.СтраницыПомощника.ТекущаяСтраница;
Если ТекущаяСтраницаПомощника = Элементы.СтраницыПомощника.ПодчиненныеЭлементы.СтраницаВыполненияРезервногоКопирования Тогда
- ОбработатьВыборРежимаИнтерактивногоКопирования();
+ ПерейтиНаСтраницу(Элементы.СтраницаИнформацииИВыполненияРезервногоКопирования);
УстановитьПутьАрхиваСКопиями(Объект.КаталогСРезервнымиКопиями);
Иначе
@@ -234,9 +241,7 @@
Процедура ПерейтиНаСтраницу(НоваяСтраница)
ПодчиненныеСтраницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы;
- Если НоваяСтраница = ПодчиненныеСтраницы.СтраницаВыполненияРезервногоКопирования Тогда
- ПерейтиНаСтраницуВыполненияРезервногоКопирования();
- ИначеЕсли НоваяСтраница = ПодчиненныеСтраницы.СтраницаИнформацииИВыполненияРезервногоКопирования Тогда
+ Если НоваяСтраница = ПодчиненныеСтраницы.СтраницаИнформацииИВыполненияРезервногоКопирования Тогда
ПерейтиНаСтраницуИнформацииИВыполненияРезервногоКопирования();
ИначеЕсли НоваяСтраница = ПодчиненныеСтраницы.СтраницаОшибокПриКопировании
ИЛИ НоваяСтраница = ПодчиненныеСтраницы.СтраницаУспешногоВыполненияКопирования Тогда
@@ -251,19 +256,6 @@
КонецПроцедуры
-&НаКлиенте
-Процедура ПерейтиНаСтраницуВыполненияРезервногоКопирования()
-
- Если СоединенияИБВызовСервера.КоличествоСеансовИнформационнойБазы() > 1 Тогда
-
- Элементы.СтраницыСтатусаКопирования.ТекущаяСтраница = Элементы.СтраницаАктивныеПользователи;
-
- КонецЕсли;
-
- Элементы.Далее.Заголовок = Нстр("ru = 'Сохранить резервную копию'");
-
-КонецПроцедуры
-
&НаКлиенте
Процедура ПерейтиНаСтраницуИнформацииИВыполненияРезервногоКопирования()
@@ -271,7 +263,7 @@
РезервноеКопированиеИБВызовСервера.УстановитьЗначениеНастройки("ПроцессВыполняется", Истина);
Элементы.Отмена.Доступность = Истина;
- ОбновитьКоличествоАктивныхПользователей();
+ Элементы.КоличествоАктивныхПользователей.Заголовок = КоличествоСеансовИнформационнойБазы();
УстановитьЗаголовокКнопкиДалее(Истина);
Элементы.Далее.Доступность = Ложь;
@@ -287,7 +279,7 @@
Возврат;
КонецЕсли;
- Если СоединенияИБВызовСервера.КоличествоСеансовИнформационнойБазы() = 1 Тогда
+ Если КоличествоСеансовИнформационнойБазы() = 1 Тогда
СоединенияИБВызовСервера.УстановитьБлокировкуСоединений(Нстр("ru = 'Для выполнения резервного копирования.'"), "РезервноеКопирование");
СоединенияИБКлиент.УстановитьПризнакЗавершитьВсеСеансыКромеТекущего(Истина);
@@ -429,25 +421,6 @@
КонецПроцедуры
-// Обработчик значения переключателя "Код типа резервного копирования" при нажатии на кнопку "Далее".
-&НаКлиенте
-Процедура ОбработатьВыборРежимаИнтерактивногоКопирования()
-
- НоваяСтраницаПомощника = Неопределено;
-
- Если РезервноеКопированиеИБКлиент.ПроверитьДоступКИнформационнойБазе(ПарольАдминистратораИБ) Тогда
- УстановитьПараметрыРезервногоКопирования();
- Иначе
- Элементы.СтраницыСтатусаКопирования.ТекущаяСтраница = Элементы.СтраницыСтатусаКопирования.ПодчиненныеЭлементы.СтраницаОшибкаПодключения;
- Возврат;
- КонецЕсли;
-
- НоваяСтраницаПомощника = Элементы.СтраницыПомощника.ПодчиненныеЭлементы.СтраницаИнформацииИВыполненияРезервногоКопирования;
-
- ПерейтиНаСтраницу(НоваяСтраницаПомощника);
-
-КонецПроцедуры
-
&НаКлиенте
Процедура УстановитьОбработчикОжиданияИстеченияТаймаутаРезервногоКопирования()
@@ -505,7 +478,7 @@
&НаКлиенте
Процедура ПроверкаНаЕдинственностьПодключения()
- КоличествоПользователей = СоединенияИБВызовСервера.КоличествоСеансовИнформационнойБазы();
+ КоличествоПользователей = КоличествоСеансовИнформационнойБазы();
Элементы.КоличествоАктивныхПользователей.Заголовок = Строка(КоличествоПользователей);
Если КоличествоПользователей = 1 Тогда
НачатьРезервноеКопирование();
@@ -543,13 +516,6 @@
КонецФункции
-&НаКлиенте
-Процедура ОбновитьКоличествоАктивныхПользователей()
-
- Элементы.КоличествоАктивныхПользователей.Заголовок = СоединенияИБВызовСервера.КоличествоСеансовИнформационнойБазы();
-
-КонецПроцедуры
-
&НаКлиенте
Процедура НачатьРезервноеКопирование()
@@ -750,4 +716,11 @@
ОбщегоНазначенияКлиент.ЗарегистрироватьCOMСоединитель();
КонецПроцедуры
+&НаСервере
+Функция КоличествоСеансовИнформационнойБазы()
+
+ Возврат СоединенияИБ.КоличествоСеансовИнформационнойБазы(Ложь, Ложь);
+
+КонецФункции
+
#КонецОбласти
diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаРезервногоКопирования/Template.txt b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаРезервногоКопирования/Template.txt
index c1ecc7ab9..71c4b9e99 100644
--- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаРезервногоКопирования/Template.txt
+++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/ЗаставкаРезервногоКопирования/Template.txt
@@ -110,7 +110,7 @@
// Передача управления IE и повторный вызов main через 1 секунду (достаточно для завершения COM-соединения).
// Если еще не все сеансы завершены, то ret = -1 и ждем 18 секунд до следующей проверки.
if (!finish)
- setTimeout("main()", ret != -1 ? 1000 : 18 * 1000);
+ setTimeout("main()", ret != -1 ? 1000 : 5 * 1000);
}
function checkClose() {
diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/МакетФайлаРезервногоКопирования/Template.txt b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/МакетФайлаРезервногоКопирования/Template.txt
index 8353b3dfb..7ff858f68 100644
--- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/МакетФайлаРезервногоКопирования/Template.txt
+++ b/SSL/src/DataProcessors/РезервноеКопированиеИБ/Templates/МакетФайлаРезервногоКопирования/Template.txt
@@ -40,6 +40,8 @@ oShell.CurrentDirectory = thisFileDir;
var errorMarker = "{ERR}";
var successMarker = "{OK }";
+var FileSize = 0;
+
// Переменные состояния
var backupCreated = false;
var logging1C = false;
@@ -229,7 +231,7 @@ function finalize(success)
if (!success)
{
- allowConnections(); // Разрешение подключений
+ allowConnections(false); // Разрешение подключений
}
@@ -398,11 +400,16 @@ function WaitUntilFinish()
// файл резервной копии не найден, ожидаем далее
return -1;
}
- FileSize = FileArchive.size / 1024;
+ var nowSize = FileArchive.size;
// файл все еще не начал создаваться, возможно выполняется интерактив, ожидаем далее
- if (FileSize < 5)
- return -1;
+ if (nowSize/1024 < 5){
+ FileSize = nowSize;
+ return -1;}
+
+ if (FileSize != nowSize){
+ FileSize = nowSize;
+ return -1;}
return 0;
}
diff --git a/SSL/src/DataProcessors/РекомендацияПоПовышениюСкоростиРаботы/Forms/Форма/Form.form b/SSL/src/DataProcessors/РекомендацияПоПовышениюСкоростиРаботы/Forms/Форма/Form.form
new file mode 100644
index 000000000..8915a11a5
--- /dev/null
+++ b/SSL/src/DataProcessors/РекомендацияПоПовышениюСкоростиРаботы/Forms/Форма/Form.form
@@ -0,0 +1,68 @@
+
+
+
+ ФормаКоманднаяПанель
+ -1
+ Left
+ true
+
+
+ OnOpen
+ ПриОткрытии
+
+
+ OnCreateAtServer
+ ПриСозданииНаСервере
+
+ DontBlock
+ true
+ true
+ true
+ Vertical
+ true
+ true
+ true
+ auto
+ true
+
+ Объект
+ 1
+
+ DataProcessorObject.РекомендацияПоПовышениюСкоростиРаботы
+
+
+ true
+
+
+ true
+
+ true
+
+
+ РекомендуемыйОбъем
+
+ ru
+ Рекомендуемый объем
+
+ 2
+
+ Number
+
+ 10
+ 1
+ true
+
+
+
+ true
+
+
+ true
+
+
+
+
+
+
+
+
diff --git a/SSL/src/DataProcessors/РекомендацияПоПовышениюСкоростиРаботы/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/РекомендацияПоПовышениюСкоростиРаботы/Forms/Форма/Module.bsl
new file mode 100644
index 000000000..b4cb5206d
--- /dev/null
+++ b/SSL/src/DataProcessors/РекомендацияПоПовышениюСкоростиРаботы/Forms/Форма/Module.bsl
@@ -0,0 +1,61 @@
+
+#Область ОбработчикиСобытийФормы
+
+&НаСервере
+Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
+ ОбщиеПараметры = ОбщегоНазначения.ОбщиеПараметрыБазовойФункциональности();
+ РекомендуемыйОбъем = ОбщиеПараметры.РекомендуемыйОбъемОперативнойПамяти;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПриОткрытии(Отказ)
+
+ Отказ = Истина;
+
+ СистемнаяИнформация = Новый СистемнаяИнформация;
+ ДоступныйОбъем = Окр(СистемнаяИнформация.ОперативнаяПамять / 1024, 1);
+
+ Если ДоступныйОбъем >= РекомендуемыйОбъем Тогда
+ Возврат;
+ КонецЕсли;
+
+ ТекстСообщения = НСтр("ru = 'На компьютере установлено %1 Гб оперативной памяти.
+ |Для того чтобы программа работала быстрее,
+ |рекомендуется увеличить объем памяти до %2 Гб.'");
+
+ ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ДоступныйОбъем, РекомендуемыйОбъем);
+
+ ЗаголовокСообщения = НСтр("ru = 'Рекомендация по повышению скорости работы'");
+
+ ПараметрыВопроса = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю();
+ ПараметрыВопроса.Заголовок = ЗаголовокСообщения;
+ ПараметрыВопроса.Картинка = БиблиотекаКартинок.Предупреждение32;
+ ПараметрыВопроса.Вставить("ТекстФлажка", НСтр("ru = 'Не показывать в течение двух месяцев'"));
+
+ Кнопки = Новый СписокЗначений;
+ Кнопки.Добавить("ПродолжитьРаботу", НСтр("ru = 'Продолжить работу'"));
+
+ ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПоказаРекомендации", ЭтотОбъект);
+ СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(ОписаниеОповещения, ТекстСообщения, Кнопки, ПараметрыВопроса);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+&НаКлиенте
+Процедура ПослеПоказаРекомендации(Результат, ДополнительныеПараметры) Экспорт
+ Если Результат = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+
+ РекомендацияПоОбъемуОперативнойПамяти = Новый Структура;
+ РекомендацияПоОбъемуОперативнойПамяти.Вставить("Показывать", Не Результат.БольшеНеЗадаватьЭтотВопрос);
+ РекомендацияПоОбъемуОперативнойПамяти.Вставить("ДатаПредыдущегоПоказа", ОбщегоНазначенияКлиент.ДатаСеанса());
+
+ ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("ОбщиеНастройкиПользователя",
+ "РекомендацияПоОбъемуОперативнойПамяти", РекомендацияПоОбъемуОперативнойПамяти);
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/SSL/src/DataProcessors/РекомендацияПоПовышениюСкоростиРаботы/РекомендацияПоПовышениюСкоростиРаботы.mdo b/SSL/src/DataProcessors/РекомендацияПоПовышениюСкоростиРаботы/РекомендацияПоПовышениюСкоростиРаботы.mdo
new file mode 100644
index 000000000..0973358db
--- /dev/null
+++ b/SSL/src/DataProcessors/РекомендацияПоПовышениюСкоростиРаботы/РекомендацияПоПовышениюСкоростиРаботы.mdo
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+ РекомендацияПоПовышениюСкоростиРаботы
+
+ ru
+ Рекомендация по повышению скорости работы
+
+ true
+ DataProcessor.РекомендацияПоПовышениюСкоростиРаботы.Form.Форма
+
+ Форма
+
+ ru
+ Форма
+
+ PersonalComputer
+ MobileDevice
+
+
diff --git a/SSL/src/DataProcessors/СбросНастроекПроверкиКонтрагентов/Commands/ОткрытьФормуСбросаНастроек/CommandModule.bsl b/SSL/src/DataProcessors/СбросНастроекПроверкиКонтрагентов/Commands/ОткрытьФормуСбросаНастроек/CommandModule.bsl
new file mode 100644
index 000000000..ba530483d
--- /dev/null
+++ b/SSL/src/DataProcessors/СбросНастроекПроверкиКонтрагентов/Commands/ОткрытьФормуСбросаНастроек/CommandModule.bsl
@@ -0,0 +1,6 @@
+
+&НаКлиенте
+Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
+ ПараметрыФормы = Новый Структура("", );
+ ОткрытьФорму("Обработка.СбросНастроекПроверкиКонтрагентов.Форма", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
+КонецПроцедуры
diff --git a/SSL/src/DataProcessors/СбросНастроекПроверкиКонтрагентов/Forms/Форма/Form.form b/SSL/src/DataProcessors/СбросНастроекПроверкиКонтрагентов/Forms/Форма/Form.form
new file mode 100644
index 000000000..7c92167a0
--- /dev/null
+++ b/SSL/src/DataProcessors/СбросНастроекПроверкиКонтрагентов/Forms/Форма/Form.form
@@ -0,0 +1,94 @@
+
+
+
+ СбросНастроек
+ 1
+ true
+ true
+
+ true
+
+
+ СбросНастроекРасширеннаяПодсказка
+ 2
+
+ ru
+ Отключение проверки контрагентов, сброс даты последнего отображения предложения на использование сервиса, сброс отказа от подключения к сервису
+
+ Label
+ true
+ true
+
+ Style.ПоясняющийТекст
+
+
+ Left
+
+
+ UsualButton
+ Form.Command.СбросНастроек
+ Normal
+ Auto
+ true
+ true
+ UserCmds
+ ShowBottom
+ Auto
+
+
+ ФормаКоманднаяПанель
+ -1
+ Left
+
+ DontBlock
+ true
+ true
+ true
+ Vertical
+ true
+ true
+ true
+ auto
+ true
+
+ Объект
+ 1
+
+ DataProcessorObject.СбросНастроекПроверкиКонтрагентов
+
+
+ true
+
+
+ true
+
+ true
+
+
+ СбросНастроек
+
+ ru
+ Сброс настроек
+
+ 1
+
+ ru
+ Сброс настроек
+
+
+ true
+
+
+
+ СбросНастроек
+
+
+ Auto
+ Auto
+
+
+
+
+
+
+
diff --git a/SSL/src/DataProcessors/СбросНастроекПроверкиКонтрагентов/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/СбросНастроекПроверкиКонтрагентов/Forms/Форма/Module.bsl
new file mode 100644
index 000000000..bd34cc049
--- /dev/null
+++ b/SSL/src/DataProcessors/СбросНастроекПроверкиКонтрагентов/Forms/Форма/Module.bsl
@@ -0,0 +1,27 @@
+#Область ОбработчикиКомандФормы
+
+&НаКлиенте
+Процедура СбросНастроек(Команда)
+ СбросНастроекНаСервере();
+КонецПроцедуры
+
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+&НаСервереБезКонтекста
+Процедура СбросНастроекНаСервере()
+
+ ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ПроверкаКонтрагентов",
+ "ПроверкаКонтрагентов_ДатаПоследнегоОтображенияПредложенияНаВключениеСервиса", ТекущаяДатаСеанса() - 60*60*6);
+ ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ПроверкаКонтрагентов",
+ "ПроверкаКонтрагентов_БольшеНеПоказыватьПредложениеИспользоватьСервис", Неопределено);
+ УстановитьПривилегированныйРежим(Истина);
+
+ ПроверкаКонтрагентов.ВключитьВыключитьПроверкуКонтрагентов(Ложь);
+
+КонецПроцедуры
+
+#КонецОбласти
+
diff --git a/SSL/src/DataProcessors/СбросНастроекПроверкиКонтрагентов/СбросНастроекПроверкиКонтрагентов.mdo b/SSL/src/DataProcessors/СбросНастроекПроверкиКонтрагентов/СбросНастроекПроверкиКонтрагентов.mdo
new file mode 100644
index 000000000..55a133f1f
--- /dev/null
+++ b/SSL/src/DataProcessors/СбросНастроекПроверкиКонтрагентов/СбросНастроекПроверкиКонтрагентов.mdo
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+ СбросНастроекПроверкиКонтрагентов
+
+ ru
+ Сброс настроек проверки контрагентов
+
+ DataProcessor.СбросНастроекПроверкиКонтрагентов.Form.Форма
+
+ Форма
+
+ ru
+ Форма
+
+ PersonalComputer
+ MobileDevice
+
+
+ ОткрытьФормуСбросаНастроек
+
+ ru
+ Сброс настроек проверки контрагентов
+
+ NavigationPanelOrdinary
+ Auto
+
+
diff --git a/SSL/src/DataProcessors/СдвигГраницыИтогов/Forms/ОсновнаяФорма/Module.bsl b/SSL/src/DataProcessors/СдвигГраницыИтогов/Forms/ОсновнаяФорма/Module.bsl
index 7151a7023..df37a9b0f 100644
--- a/SSL/src/DataProcessors/СдвигГраницыИтогов/Forms/ОсновнаяФорма/Module.bsl
+++ b/SSL/src/DataProcessors/СдвигГраницыИтогов/Forms/ОсновнаяФорма/Module.bsl
@@ -66,7 +66,7 @@
УникальныйИдентификатор,
"Обработки.СдвигГраницыИтогов.ВыполнитьКоманду",
Новый Структура,
- НСтр("ru = 'Рассылки отчетов: Выполнение рассылок в фоне'"));
+ НСтр("ru = 'Итоги и агрегаты: Ускорение проведения документов и формирования отчетов'"));
ЗаполнитьЗначенияСвойств(ПараметрыЗадания, Запуск);
Если ПараметрыЗадания.ЗаданиеВыполнено Тогда
diff --git a/SSL/src/DataProcessors/СогласиеНаОбработкуПерсональныхДанных/Help/ru.html b/SSL/src/DataProcessors/СогласиеНаОбработкуПерсональныхДанных/Help/ru.html
index 430476b06..a75411af7 100644
--- a/SSL/src/DataProcessors/СогласиеНаОбработкуПерсональныхДанных/Help/ru.html
+++ b/SSL/src/DataProcessors/СогласиеНаОбработкуПерсональныхДанных/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для печати формы согласия на обработку персональных данных.
Федеральный закон от 27.06.2006 № 152-Ф3 "О персональных данных" предписывает со всех субъектов, чьи персональные данные в программе обрабатываются, получить согласие на такую обработку.
Открывается из списков программы или из элементов списков по команде Еще - Согласие на обработку персональных данных. Печать формы возможна из всех списков программы, в которых имеются персональные данные.
diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Module.bsl
index c8659b0fc..eb3d09236 100644
--- a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Module.bsl
+++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Forms/Форма/Module.bsl
@@ -364,7 +364,7 @@
&НаКлиенте
Процедура ВыполнитьЗагрузкуДанных(Команда)
НСтрока = НСтр("ru = 'Получить данные в информационную базу?'");
- Оповещение = Новый ОписаниеОповещения("ВыполнитьЗагрузкуДанныхЗавершение1", ЭтотОбъект);
+ Оповещение = Новый ОписаниеОповещения("ВыполнитьЗагрузкуДанныхПослеВопросаОПодтвержденииПолученияДанных", ЭтотОбъект);
ПоказатьВопрос(Оповещение, НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Да);
КонецПроцедуры
@@ -672,33 +672,33 @@
КонецПроцедуры
&НаКлиенте
-Процедура ВыполнитьЗагрузкуДанныхЗавершение1(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
+Процедура ВыполнитьЗагрузкуДанныхПослеВопросаОПодтвержденииПолученияДанных(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
Если Объект.ДанныеУспешноЗагружены Тогда
НСтрока = НСтр("ru = 'Данные уже были получены. Выполнить получение данных повторно?'");
- Оповещение = Новый ОписаниеОповещения("ВыполнитьЗагрузкуДанныхЗавершение2", ЭтотОбъект);
+ Оповещение = Новый ОписаниеОповещения("ВыполнитьЗагрузкуДанныхПослеВопросаОПовторномПолученииДанных", ЭтотОбъект);
ПоказатьВопрос(Оповещение, НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Нет);
Возврат;
КонецЕсли;
- ВыполнитьЗагрузкуДанныхЗавершение3();
+ ВыполнитьЗагрузкуДанныхПослеПодтвержденияПолученияДанных();
КонецПроцедуры
&НаКлиенте
-Процедура ВыполнитьЗагрузкуДанныхЗавершение2(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
+Процедура ВыполнитьЗагрузкуДанныхПослеВопросаОПовторномПолученииДанных(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
- ВыполнитьЗагрузкуДанныхЗавершение3();
+ ВыполнитьЗагрузкуДанныхПослеПодтвержденияПолученияДанных();
КонецПроцедуры
&НаКлиенте
-Процедура ВыполнитьЗагрузкуДанныхЗавершение3()
+Процедура ВыполнитьЗагрузкуДанныхПослеПодтвержденияПолученияДанных()
// Оповещение состояния
Состояние(НСтр("ru = 'Выполняется получение данных. Пожалуйста, подождите...'"));
@@ -711,7 +711,7 @@
НСтрока = НСтр("ru = 'При получении данных возникли ошибки.
|Перейти в журнал регистрации?'");
- Оповещение = Новый ОписаниеОповещения("ВыполнитьЗагрузкуДанныхЗавершение4", ЭтотОбъект);
+ Оповещение = Новый ОписаниеОповещения("ВыполнитьЗагрузкуДанныхПослеВопросаОПереходеВЖурналРегистрации", ЭтотОбъект);
ПоказатьВопрос(Оповещение, НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Нет);
Возврат;
@@ -722,7 +722,7 @@
КонецПроцедуры
&НаКлиенте
-Процедура ВыполнитьЗагрузкуДанныхЗавершение4(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
+Процедура ВыполнитьЗагрузкуДанныхПослеВопросаОПереходеВЖурналРегистрации(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт
Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
Возврат;
КонецЕсли;
@@ -825,9 +825,17 @@
&НаСервере
Процедура ОтменитьУтвержденноеСопоставлениеНаСервере(Отбор)
- Отбор.Вставить("УзелИнформационнойБазы", Объект.УзелИнформационнойБазы);
+ Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(Объект.УзелИнформационнойБазы) Тогда
+ ОтборПубличныеИдентификаторы = Новый Структура("УзелИнформационнойБазы, Идентификатор, Ссылка",
+ Объект.УзелИнформационнойБазы,
+ Отбор.УникальныйИдентификаторПриемника,
+ Отбор.УникальныйИдентификаторИсточника);
+ РегистрыСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов.УдалитьЗапись(ОтборПубличныеИдентификаторы);
+ Иначе
+ Отбор.Вставить("УзелИнформационнойБазы", Объект.УзелИнформационнойБазы);
- РегистрыСведений.СоответствияОбъектовИнформационныхБаз.УдалитьЗапись(Отбор);
+ РегистрыСведений.СоответствияОбъектовИнформационныхБаз.УдалитьЗапись(Отбор);
+ КонецЕсли;
КонецПроцедуры
diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Help/ru.html b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Help/ru.html
index d58c71b37..8f14d75a3 100644
--- a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Help/ru.html
+++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для сопоставления данных двух программ.
Список открывается по команде Выполнить сопоставление на странице Сопоставление данныхПомощника интерактивной синхронизации данных. Также можно дважды щелкнуть мышью по строке, в которой обнаружены проблемы сопоставления данных.
Список состоит из двух колонок, каждая из которых соответствует информационной базе, участвующей в обмене. Данные сгруппированы по объектам программы (документы, списки). В нижней части списка выводится информационная строка: сколько элементов сопоставлено, сколько не сопоставлено.
diff --git a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/ObjectModule.bsl b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/ObjectModule.bsl
index 35f4ead3a..4666c1eff 100644
--- a/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/ObjectModule.bsl
+++ b/SSL/src/DataProcessors/СопоставлениеОбъектовИнформационныхБаз/ObjectModule.bsl
@@ -85,13 +85,31 @@
Для Каждого СтрокаТаблицы Из ТаблицаНеутвержденныхСвязей Цикл
- СтруктураЗаписи = Новый Структура("УникальныйИдентификаторИсточника, УникальныйИдентификаторПриемника, ТипИсточника, ТипПриемника");
-
- СтруктураЗаписи.Вставить("УзелИнформационнойБазы", УзелИнформационнойБазы);
-
- ЗаполнитьЗначенияСвойств(СтруктураЗаписи, СтрокаТаблицы);
-
- РегистрыСведений.СоответствияОбъектовИнформационныхБаз.ДобавитьЗапись(СтруктураЗаписи);
+ Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(УзелИнформационнойБазы) Тогда
+
+ Если Строка(СтрокаТаблицы.УникальныйИдентификаторИсточника.УникальныйИдентификатор()) = СтрокаТаблицы.УникальныйИдентификаторПриемника Тогда
+ Продолжить;
+ КонецЕсли;
+
+ СтруктураЗаписи = Новый Структура("Ссылка, Идентификатор");
+
+ СтруктураЗаписи.Вставить("УзелИнформационнойБазы", УзелИнформационнойБазы);
+ СтруктураЗаписи.Вставить("Ссылка", СтрокаТаблицы.УникальныйИдентификаторИсточника);
+ СтруктураЗаписи.Вставить("Идентификатор", СтрокаТаблицы.УникальныйИдентификаторПриемника);
+
+ РегистрыСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов.ДобавитьЗапись(СтруктураЗаписи);
+
+ Иначе
+
+ СтруктураЗаписи = Новый Структура("УникальныйИдентификаторИсточника, УникальныйИдентификаторПриемника, ТипИсточника, ТипПриемника");
+
+ СтруктураЗаписи.Вставить("УзелИнформационнойБазы", УзелИнформационнойБазы);
+
+ ЗаполнитьЗначенияСвойств(СтруктураЗаписи, СтрокаТаблицы);
+
+ РегистрыСведений.СоответствияОбъектовИнформационныхБаз.ДобавитьЗапись(СтруктураЗаписи);
+
+ КонецЕсли;
КонецЦикла;
@@ -153,12 +171,14 @@
ДанныеУспешноЗагружены = Ложь;
- ОбработкаОбменаДанными = ОбменДаннымиСервер.ОбработкаОбменаДляЗагрузкиДанных(Отказ, УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена);
+ СтруктураНастроекОбмена = ОбменДаннымиСервер.СтруктураНастроекОбменаДляСеансаИнтерактивнойЗагрузки(УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена);
- Если Отказ Тогда
+ Если СтруктураНастроекОбмена.Отказ Тогда
Возврат;
КонецЕсли;
+ ОбработкаОбменаДанными = СтруктураНастроекОбмена.ОбработкаОбменаДанными;
+
ОбработкаОбменаДанными.ВыполнитьЗагрузкуДанныхВИнформационнуюБазу(ТаблицыДляЗагрузки);
// Удаляем загруженные в ИБ таблицы из кэша обработки, т.к. они стали неактуальными.
@@ -502,7 +522,7 @@
// ТаблицаСопоставленныхОбъектовПриемникаПоРегистру
// ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям.
//
- // ТаблицаСопоставленныхОбъектов
+ // ТаблицаСопоставленныхОбъектов.
//
// ТаблицаНеСопоставленныхОбъектовИсточника
// ТаблицаНеСопоставленныхОбъектовПриемника.
@@ -525,434 +545,624 @@
| Ссылка,
| УникальныйИдентификатор
|;
- |
- |//////////////////////////////////////////////////////////////////////////////// {ТаблицаРегистраСоответствияОбъектовИнформационныхБаз}
- |ВЫБРАТЬ
- | УникальныйИдентификаторИсточника,
- | УникальныйИдентификаторПриемника,
- | ТипПриемника,
- | ТипИсточника
- |ПОМЕСТИТЬ ТаблицаРегистраСоответствияОбъектовИнформационныхБаз
- |ИЗ
- | РегистрСведений.СоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз
- |ГДЕ
- | СоответствияОбъектовИнформационныхБаз.УзелИнформационнойБазы = &УзелИнформационнойБазы
- | И СоответствияОбъектовИнформационныхБаз.ТипПриемника = &ТипИсточника
- | И СоответствияОбъектовИнформационныхБаз.ТипИсточника = &ТипПриемника
- |ИНДЕКСИРОВАТЬ ПО
- | УникальныйИдентификаторПриемника,
- | ТипПриемника,
- | ТипИсточника
- |;
- |
- |//////////////////////////////////////////////////////////////////////////////// {ТаблицаНеутвержденныхСвязей}
- |ВЫБРАТЬ
- |
- | УникальныйИдентификаторИсточника,
- | УникальныйИдентификаторПриемника,
- | ТипПриемника,
- | ТипИсточника
- |
- |ПОМЕСТИТЬ ТаблицаНеутвержденныхСвязей
- |ИЗ
- | &ТаблицаНеутвержденныхСвязей КАК ТаблицаНеутвержденныхСвязей
- |ИНДЕКСИРОВАТЬ ПО
- | УникальныйИдентификаторПриемника,
- | ТипПриемника
- |;
- |
- |//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектовИсточникаПоРегистру}
- |ВЫБРАТЬ
- |
- | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
- |
- | #ПОЛЕ_СОРТИРОВКИ_Приемник#
- |
- | Ссылка,
- | 0 КАК СтатусСопоставления, // сопоставленные объекты (0)
- | 0 КАК СтатусСопоставленияДополнительный, // сопоставленные объекты (0)
- |
- | ЭтоГруппаИсточник,
- | ЭтоГруппаПриемник,
- |
- | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
- | УникальныйИдентификаторИсточника,
- | УникальныйИдентификаторПриемника,
- | ТипИсточника,
- | ТипПриемника
- |ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектовИсточникаПоРегистру
- |ИЗ
- | (ВЫБРАТЬ
- |
- | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовИсточникаПоРегистру_ВложенныйЗапрос#
- |
- | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК Ссылка,
- |
- | #ТаблицаИсточникаЭтоГруппа# КАК ЭтоГруппаИсточник,
- | #СоответствияОбъектовИнформационныхБазЭтоГруппа# КАК ЭтоГруппаПриемник,
- |
- | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
- | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника,
- | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника КАК УникальныйИдентификаторИсточника,
- | СоответствияОбъектовИнформационныхБаз.ТипПриемника КАК ТипИсточника,
- | СоответствияОбъектовИнформационныхБаз.ТипИсточника КАК ТипПриемника
- | ИЗ
- | ТаблицаИсточника КАК ТаблицаИсточника
- | ЛЕВОЕ СОЕДИНЕНИЕ
- | ТаблицаРегистраСоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз
- | ПО
- | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника = ТаблицаИсточника.УникальныйИдентификатор
- | И СоответствияОбъектовИнформационныхБаз.ТипПриемника = ТаблицаИсточника.ТипОбъекта
- | ГДЕ
- | НЕ СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника ЕСТЬ NULL
- | ) КАК ВложенныйЗапрос
- |;
- |
- |//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектовПриемникаПоРегистру}
- |ВЫБРАТЬ
- |
- | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
- |
- | #ПОЛЕ_СОРТИРОВКИ_Приемник#
- |
- | Ссылка,
- | 0 КАК СтатусСопоставления, // сопоставленные объекты (0)
- | 0 КАК СтатусСопоставленияДополнительный, // сопоставленные объекты (0)
- |
- | ЭтоГруппаИсточник,
- | ЭтоГруппаПриемник,
- |
- | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
- | УникальныйИдентификаторИсточника,
- | УникальныйИдентификаторПриемника,
- | ТипИсточника,
- | ТипПриемника
- |ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектовПриемникаПоРегистру
- |ИЗ
- | (ВЫБРАТЬ
- |
- | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПриемникаПоРегистру_ВложенныйЗапрос#
- |
- | ТаблицаПриемника.Ссылка КАК Ссылка,
- |
- | #ТаблицаПриемникаЭтоГруппа# КАК ЭтоГруппаИсточник,
- | #ТаблицаПриемникаЭтоГруппа# КАК ЭтоГруппаПриемник,
- |
- | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
- | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника,
- | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника КАК УникальныйИдентификаторИсточника,
- | СоответствияОбъектовИнформационныхБаз.ТипПриемника КАК ТипИсточника,
- | СоответствияОбъектовИнформационныхБаз.ТипИсточника КАК ТипПриемника
- | ИЗ
- | #ТаблицаПриемника# КАК ТаблицаПриемника
- | ЛЕВОЕ СОЕДИНЕНИЕ
- | ТаблицаРегистраСоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз
- | ПО
- | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника = ТаблицаПриемника.Ссылка
- | И СоответствияОбъектовИнформационныхБаз.ТипИсточника = &ТипПриемника
- | ЛЕВОЕ СОЕДИНЕНИЕ
- | ТаблицаСопоставленныхОбъектовИсточникаПоРегистру КАК ТаблицаСопоставленныхОбъектовИсточникаПоРегистру
- | ПО
- | ТаблицаСопоставленныхОбъектовИсточникаПоРегистру.Ссылка = ТаблицаПриемника.Ссылка
- |
- | ГДЕ
- | НЕ СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника ЕСТЬ NULL
- | И ТаблицаСопоставленныхОбъектовИсточникаПоРегистру.Ссылка ЕСТЬ NULL
- | ) КАК ВложенныйЗапрос
- |;
- |
- |//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям}
- |ВЫБРАТЬ
- |
- | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
- |
- | #ПОЛЕ_СОРТИРОВКИ_Приемник#
- |
- | Ссылка,
- | 3 КАК СтатусСопоставления, // неутвержденные связи (3)
- | 0 КАК СтатусСопоставленияДополнительный, // сопоставленные объекты (0)
- |
- | ЭтоГруппаИсточник,
- | ЭтоГруппаПриемник,
- |
- | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
- | УникальныйИдентификаторИсточника,
- | УникальныйИдентификаторПриемника,
- | ТипИсточника,
- | ТипПриемника
- |ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям
- |ИЗ
- | (ВЫБРАТЬ
- |
- | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям_ВложенныйЗапрос#
- |
- | ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника КАК Ссылка,
- |
- | #ТаблицаИсточникаЭтоГруппа# КАК ЭтоГруппаИсточник,
- | #ТаблицаНеутвержденныхСвязейЭтоГруппа# КАК ЭтоГруппаПриемник,
- |
- | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
- | ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника,
- | ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторПриемника КАК УникальныйИдентификаторИсточника,
- | ТаблицаНеутвержденныхСвязей.ТипПриемника КАК ТипИсточника,
- | ТаблицаНеутвержденныхСвязей.ТипИсточника КАК ТипПриемника
- | ИЗ
- | ТаблицаИсточника КАК ТаблицаИсточника
- | ЛЕВОЕ СОЕДИНЕНИЕ
- | ТаблицаНеутвержденныхСвязей КАК ТаблицаНеутвержденныхСвязей
- | ПО
- | ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторПриемника = ТаблицаИсточника.УникальныйИдентификатор
- | И ТаблицаНеутвержденныхСвязей.ТипПриемника = ТаблицаИсточника.ТипОбъекта
- |
- | ГДЕ
- | НЕ ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника ЕСТЬ NULL
- | ) КАК ВложенныйЗапрос
- |;
- |
- |//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектов}
- |ВЫБРАТЬ
- |
- | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
- |
- | #ПОЛЯ_СОРТИРОВКИ#
- |
- | Ссылка,
- | СтатусСопоставления,
- | СтатусСопоставленияДополнительный,
- |
- | // {ИНДЕКС КАРТИНКИ}
- | ВЫБОР КОГДА ЭтоГруппаИсточник ЕСТЬ NULL
- | ТОГДА 0
- | ИНАЧЕ
- | ВЫБОР КОГДА ЭтоГруппаИсточник = ИСТИНА
- | ТОГДА 1
- | ИНАЧЕ 2
- | КОНЕЦ
- | КОНЕЦ КАК ИсточникИндексКартинки,
- |
- | ВЫБОР КОГДА ЭтоГруппаПриемник ЕСТЬ NULL
- | ТОГДА 0
- | ИНАЧЕ
- | ВЫБОР КОГДА ЭтоГруппаПриемник = ИСТИНА
- | ТОГДА 1
- | ИНАЧЕ 2
- | КОНЕЦ
- | КОНЕЦ КАК ПриемникИндексКартинки,
- |
- | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
- | УникальныйИдентификаторИсточника,
- | УникальныйИдентификаторПриемника,
- | ТипИсточника,
- | ТипПриемника
- |ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектов
- |ИЗ
- | (
- | ВЫБРАТЬ
- |
- | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
- |
- | #ПОЛЯ_СОРТИРОВКИ#
- |
- | Ссылка,
- | СтатусСопоставления,
- | СтатусСопоставленияДополнительный,
- |
- | ЭтоГруппаИсточник,
- | ЭтоГруппаПриемник,
- |
- | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
- | УникальныйИдентификаторИсточника,
- | УникальныйИдентификаторПриемника,
- | ТипИсточника,
- | ТипПриемника
- | ИЗ
- | ТаблицаСопоставленныхОбъектовИсточникаПоРегистру
- |
- | ОБЪЕДИНИТЬ ВСЕ
- |
- | ВЫБРАТЬ
- |
- | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
- |
- | #ПОЛЯ_СОРТИРОВКИ#
- |
- | Ссылка,
- | СтатусСопоставления,
- | СтатусСопоставленияДополнительный,
- |
- | ЭтоГруппаИсточник,
- | ЭтоГруппаПриемник,
- |
- | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
- | УникальныйИдентификаторИсточника,
- | УникальныйИдентификаторПриемника,
- | ТипИсточника,
- | ТипПриемника
- | ИЗ
- | ТаблицаСопоставленныхОбъектовПриемникаПоРегистру
- |
- | ОБЪЕДИНИТЬ ВСЕ
- |
- | ВЫБРАТЬ
- |
- | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
- |
- | #ПОЛЯ_СОРТИРОВКИ#
- |
- | Ссылка,
- | СтатусСопоставления,
- | СтатусСопоставленияДополнительный,
- |
- | ЭтоГруппаИсточник,
- | ЭтоГруппаПриемник,
- |
- | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
- | УникальныйИдентификаторИсточника,
- | УникальныйИдентификаторПриемника,
- | ТипИсточника,
- | ТипПриемника
- | ИЗ
- | ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям
- |
- | ) КАК ВложенныйЗапрос
- |
- |ИНДЕКСИРОВАТЬ ПО
- | Ссылка
- |;
- |
- |//////////////////////////////////////////////////////////////////////////////// {ТаблицаНеСопоставленныхОбъектовИсточника}
- |ВЫБРАТЬ
- |
- | Ссылка,
- |
- | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
- |
- | #ПОЛЕ_СОРТИРОВКИ_Источник#
- |
- | -1 КАК СтатусСопоставления, // несопоставленные объекты источника (-1)
- | 1 КАК СтатусСопоставленияДополнительный, // несопоставленные объекты (1)
- |
- | // {ИНДЕКС КАРТИНКИ}
- | ВЫБОР КОГДА ЭтоГруппаИсточник ЕСТЬ NULL
- | ТОГДА 0
- | ИНАЧЕ
- | ВЫБОР КОГДА ЭтоГруппаИсточник = ИСТИНА
- | ТОГДА 1
- | ИНАЧЕ 2
- | КОНЕЦ
- | КОНЕЦ КАК ИсточникИндексКартинки,
- |
- | ВЫБОР КОГДА ЭтоГруппаПриемник ЕСТЬ NULL
- | ТОГДА 0
- | ИНАЧЕ
- | ВЫБОР КОГДА ЭтоГруппаПриемник = ИСТИНА
- | ТОГДА 1
- | ИНАЧЕ 2
- | КОНЕЦ
- | КОНЕЦ КАК ПриемникИндексКартинки,
- |
- | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
- | УникальныйИдентификаторИсточника,
- | УникальныйИдентификаторПриемника,
- | ТипИсточника,
- | ТипПриемника
- |ПОМЕСТИТЬ ТаблицаНеСопоставленныхОбъектовИсточника
- |ИЗ
- | (ВЫБРАТЬ
- |
- | #ТаблицаИсточникаЭтоГруппа# КАК ЭтоГруппаИсточник,
- | NULL КАК ЭтоГруппаПриемник,
- |
- | ТаблицаИсточника.Ссылка КАК Ссылка,
- |
- | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовИсточника_ВложенныйЗапрос#
- |
- | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
- | NULL КАК УникальныйИдентификаторПриемника,
- | ТаблицаИсточника.УникальныйИдентификатор КАК УникальныйИдентификаторИсточника,
- | &ТипИсточника КАК ТипИсточника,
- | &ТипПриемника КАК ТипПриемника
- | ИЗ
- | ТаблицаИсточника КАК ТаблицаИсточника
- | ЛЕВОЕ СОЕДИНЕНИЕ
- | ТаблицаСопоставленныхОбъектов КАК ТаблицаСопоставленныхОбъектов
- | ПО
- | ТаблицаИсточника.Ссылка = ТаблицаСопоставленныхОбъектов.Ссылка
- | ИЛИ ТаблицаИсточника.УникальныйИдентификатор = ТаблицаСопоставленныхОбъектов.УникальныйИдентификаторИсточника
- | ГДЕ
- | ТаблицаСопоставленныхОбъектов.Ссылка ЕСТЬ NULL
- | ) КАК ВложенныйЗапрос
- |;
- |
- |//////////////////////////////////////////////////////////////////////////////// {ТаблицаНеСопоставленныхОбъектовПриемника}
- |ВЫБРАТЬ
- |
- | Ссылка,
- |
- | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
- |
- | #ПОЛЕ_СОРТИРОВКИ_Приемник#
- |
- | 1 КАК СтатусСопоставления, // несопоставленные объекты приемника (1)
- | 1 КАК СтатусСопоставленияДополнительный, // несопоставленные объекты (1)
- |
- | // {ИНДЕКС КАРТИНКИ}
- | ВЫБОР КОГДА ЭтоГруппаИсточник ЕСТЬ NULL
- | ТОГДА 0
- | ИНАЧЕ
- | ВЫБОР КОГДА ЭтоГруппаИсточник = ИСТИНА
- | ТОГДА 1
- | ИНАЧЕ 2
- | КОНЕЦ
- | КОНЕЦ КАК ИсточникИндексКартинки,
- |
- | ВЫБОР КОГДА ЭтоГруппаПриемник ЕСТЬ NULL
- | ТОГДА 0
- | ИНАЧЕ
- | ВЫБОР КОГДА ЭтоГруппаПриемник = ИСТИНА
- | ТОГДА 1
- | ИНАЧЕ 2
- | КОНЕЦ
- | КОНЕЦ КАК ПриемникИндексКартинки,
- |
- | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
- | УникальныйИдентификаторИсточника,
- | УникальныйИдентификаторПриемника,
- | ТипИсточника,
- | ТипПриемника
- |ПОМЕСТИТЬ ТаблицаНеСопоставленныхОбъектовПриемника
- |ИЗ
- | (ВЫБРАТЬ
- |
- | ТаблицаПриемника.Ссылка КАК Ссылка,
- |
- | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовПриемника_ВложенныйЗапрос#
- |
- | NULL КАК ЭтоГруппаИсточник,
- | #ТаблицаПриемникаЭтоГруппа# КАК ЭтоГруппаПриемник,
- |
- | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
- | ТаблицаПриемника.Ссылка КАК УникальныйИдентификаторПриемника,
- | Неопределено КАК УникальныйИдентификаторИсточника,
- | Неопределено КАК ТипИсточника,
- | &ТипПриемника КАК ТипПриемника
- | ИЗ
- | #ТаблицаПриемника# КАК ТаблицаПриемника
- | ЛЕВОЕ СОЕДИНЕНИЕ
- | ТаблицаСопоставленныхОбъектов КАК ТаблицаСопоставленныхОбъектов
- | ПО
- | ТаблицаПриемника.Ссылка = ТаблицаСопоставленныхОбъектов.Ссылка
- | ГДЕ
- | ТаблицаСопоставленныхОбъектов.Ссылка ЕСТЬ NULL
- | ) КАК ВложенныйЗапрос
- |;
- |
|";
+ Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(УзелИнформационнойБазы) Тогда
+ ТекстЗапроса = ТекстЗапроса + "
+ |//////////////////////////////////////////////////////////////////////////////// {ТаблицаРегистраСоответствияОбъектовИнформационныхБаз}
+ |ВЫБРАТЬ
+ | Ссылка КАК УникальныйИдентификаторИсточника,
+ | Идентификатор КАК УникальныйИдентификаторПриемника,
+ | ""#ТипИсточника#"" КАК ТипПриемника,
+ | ""#ТипПриемника#"" КАК ТипИсточника
+ |ПОМЕСТИТЬ ТаблицаРегистраСоответствияОбъектовИнформационныхБаз
+ |ИЗ
+ | РегистрСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов КАК СоответствияОбъектовИнформационныхБаз
+ |ГДЕ
+ | СоответствияОбъектовИнформационныхБаз.УзелИнформационнойБазы = &УзелИнформационнойБазы
+ | И СоответствияОбъектовИнформационныхБаз.Ссылка ССЫЛКА #ТаблицаПриемника#
+ |
+ |ИНДЕКСИРОВАТЬ ПО
+ | УникальныйИдентификаторПриемника
+ |;
+ |";
+ Иначе
+ ТекстЗапроса = ТекстЗапроса + "
+ |//////////////////////////////////////////////////////////////////////////////// {ТаблицаРегистраСоответствияОбъектовИнформационныхБаз}
+ |ВЫБРАТЬ
+ | УникальныйИдентификаторИсточника,
+ | УникальныйИдентификаторПриемника,
+ | ТипПриемника,
+ | ТипИсточника
+ |ПОМЕСТИТЬ ТаблицаРегистраСоответствияОбъектовИнформационныхБаз
+ |ИЗ
+ | РегистрСведений.СоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз
+ |ГДЕ
+ | СоответствияОбъектовИнформационныхБаз.УзелИнформационнойБазы = &УзелИнформационнойБазы
+ | И СоответствияОбъектовИнформационныхБаз.ТипПриемника = &ТипИсточника
+ | И СоответствияОбъектовИнформационныхБаз.ТипИсточника = &ТипПриемника
+ |ИНДЕКСИРОВАТЬ ПО
+ | УникальныйИдентификаторПриемника,
+ | ТипПриемника,
+ | ТипИсточника
+ |;
+ |";
+ КонецЕсли;
+
+ ТекстЗапроса = ТекстЗапроса + "
+ |//////////////////////////////////////////////////////////////////////////////// {ТаблицаНеутвержденныхСвязей}
+ |ВЫБРАТЬ
+ |
+ | УникальныйИдентификаторИсточника,
+ | УникальныйИдентификаторПриемника,
+ | ТипПриемника,
+ | ТипИсточника
+ |
+ |ПОМЕСТИТЬ ТаблицаНеутвержденныхСвязей
+ |ИЗ
+ | &ТаблицаНеутвержденныхСвязей КАК ТаблицаНеутвержденныхСвязей
+ |ИНДЕКСИРОВАТЬ ПО
+ | УникальныйИдентификаторПриемника,
+ | ТипПриемника
+ |;
+ |";
+
+ Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(УзелИнформационнойБазы) Тогда
+ ТекстЗапроса = ТекстЗапроса + "
+ |//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектовИсточникаПоРегистру}
+ |ВЫБРАТЬ
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
+ |
+ | #ПОЛЕ_СОРТИРОВКИ_Приемник#
+ |
+ | Ссылка,
+ | 0 КАК СтатусСопоставления, // сопоставленные объекты (0)
+ | 0 КАК СтатусСопоставленияДополнительный, // сопоставленные объекты (0)
+ |
+ | ЭтоГруппаИсточник,
+ | ЭтоГруппаПриемник,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | УникальныйИдентификаторИсточника,
+ | УникальныйИдентификаторПриемника,
+ | ТипИсточника,
+ | ТипПриемника
+ |ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектовИсточникаПоРегистру
+ |ИЗ
+ | (ВЫБРАТЬ
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовИсточникаПоРегистру_ВложенныйЗапрос#
+ |
+ | ЕСТЬNULL(СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника, ТаблицаПриемника.Ссылка) КАК Ссылка,
+ |
+ | #ТаблицаИсточникаЭтоГруппа# КАК ЭтоГруппаИсточник,
+ | #СоответствияОбъектовИнформационныхБазЭтоГруппа# КАК ЭтоГруппаПриемник,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | ЕСТЬNULL(СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника, ТаблицаПриемника.Ссылка) КАК УникальныйИдентификаторПриемника,
+ | ЕСТЬNULL(СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника, ТаблицаИсточника.УникальныйИдентификатор) КАК УникальныйИдентификаторИсточника,
+ | ЕСТЬNULL(СоответствияОбъектовИнформационныхБаз.ТипПриемника, ""#ТипИсточника#"") КАК ТипИсточника,
+ | ЕСТЬNULL(СоответствияОбъектовИнформационныхБаз.ТипИсточника, ""#ТипПриемника#"") КАК ТипПриемника
+ | ИЗ
+ | ТаблицаИсточника КАК ТаблицаИсточника
+ | ЛЕВОЕ СОЕДИНЕНИЕ
+ | ТаблицаРегистраСоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз
+ | ПО
+ | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника = ТаблицаИсточника.УникальныйИдентификатор
+ | И СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника ССЫЛКА #ТаблицаПриемника#
+ | ЛЕВОЕ СОЕДИНЕНИЕ
+ | #ТаблицаПриемника# КАК ТаблицаПриемника
+ | ПО
+ | ТаблицаИсточника.Ссылка = ТаблицаПриемника.Ссылка
+ | ГДЕ
+ | НЕ СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника ЕСТЬ NULL
+ | ИЛИ НЕ ТаблицаПриемника.Ссылка ЕСТЬ NULL
+ | ) КАК ВложенныйЗапрос
+ |;
+ |
+ |//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектовПриемникаПоРегистру}
+ |ВЫБРАТЬ
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
+ |
+ | #ПОЛЕ_СОРТИРОВКИ_Приемник#
+ |
+ | Ссылка,
+ | 0 КАК СтатусСопоставления, // сопоставленные объекты (0)
+ | 0 КАК СтатусСопоставленияДополнительный, // сопоставленные объекты (0)
+ |
+ | ЭтоГруппаИсточник,
+ | ЭтоГруппаПриемник,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | УникальныйИдентификаторИсточника,
+ | УникальныйИдентификаторПриемника,
+ | ТипИсточника,
+ | ТипПриемника
+ |ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектовПриемникаПоРегистру
+ |ИЗ
+ | (ВЫБРАТЬ
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПриемникаПоРегистру_ВложенныйЗапрос#
+ |
+ | ТаблицаПриемника.Ссылка КАК Ссылка,
+ |
+ | #ТаблицаПриемникаЭтоГруппа# КАК ЭтоГруппаИсточник,
+ | #ТаблицаПриемникаЭтоГруппа# КАК ЭтоГруппаПриемник,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника,
+ | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника КАК УникальныйИдентификаторИсточника,
+ | СоответствияОбъектовИнформационныхБаз.ТипПриемника КАК ТипИсточника,
+ | СоответствияОбъектовИнформационныхБаз.ТипИсточника КАК ТипПриемника
+ | ИЗ
+ | #ТаблицаПриемника# КАК ТаблицаПриемника
+ | ЛЕВОЕ СОЕДИНЕНИЕ
+ | ТаблицаРегистраСоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз
+ | ПО
+ | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника = ТаблицаПриемника.Ссылка
+ | ЛЕВОЕ СОЕДИНЕНИЕ
+ | ТаблицаСопоставленныхОбъектовИсточникаПоРегистру КАК ТаблицаСопоставленныхОбъектовИсточникаПоРегистру
+ | ПО
+ | ТаблицаСопоставленныхОбъектовИсточникаПоРегистру.Ссылка = ТаблицаПриемника.Ссылка
+ |
+ | ГДЕ
+ | НЕ СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника ЕСТЬ NULL
+ | И ТаблицаСопоставленныхОбъектовИсточникаПоРегистру.Ссылка ЕСТЬ NULL
+ | ) КАК ВложенныйЗапрос
+ |;
+ |
+ |//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям}
+ |ВЫБРАТЬ
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
+ |
+ | #ПОЛЕ_СОРТИРОВКИ_Приемник#
+ |
+ | Ссылка,
+ | 3 КАК СтатусСопоставления, // неутвержденные связи (3)
+ | 0 КАК СтатусСопоставленияДополнительный, // сопоставленные объекты (0)
+ |
+ | ЭтоГруппаИсточник,
+ | ЭтоГруппаПриемник,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | УникальныйИдентификаторИсточника,
+ | УникальныйИдентификаторПриемника,
+ | ТипИсточника,
+ | ТипПриемника
+ |ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям
+ |ИЗ
+ | (ВЫБРАТЬ
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям_ВложенныйЗапрос#
+ |
+ | ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника КАК Ссылка,
+ |
+ | #ТаблицаИсточникаЭтоГруппа# КАК ЭтоГруппаИсточник,
+ | #ТаблицаНеутвержденныхСвязейЭтоГруппа# КАК ЭтоГруппаПриемник,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника,
+ | ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторПриемника КАК УникальныйИдентификаторИсточника,
+ | ТаблицаНеутвержденныхСвязей.ТипПриемника КАК ТипИсточника,
+ | ТаблицаНеутвержденныхСвязей.ТипИсточника КАК ТипПриемника
+ | ИЗ
+ | ТаблицаИсточника КАК ТаблицаИсточника
+ | ЛЕВОЕ СОЕДИНЕНИЕ
+ | ТаблицаНеутвержденныхСвязей КАК ТаблицаНеутвержденныхСвязей
+ | ПО
+ | ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторПриемника = ТаблицаИсточника.УникальныйИдентификатор
+ | И ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника ССЫЛКА #ТаблицаПриемника#
+ |
+ | ГДЕ
+ | НЕ ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника ЕСТЬ NULL
+ | ) КАК ВложенныйЗапрос
+ |;
+ |";
+ Иначе
+ ТекстЗапроса = ТекстЗапроса + "
+ |//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектовИсточникаПоРегистру}
+ |ВЫБРАТЬ
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
+ |
+ | #ПОЛЕ_СОРТИРОВКИ_Приемник#
+ |
+ | Ссылка,
+ | 0 КАК СтатусСопоставления, // сопоставленные объекты (0)
+ | 0 КАК СтатусСопоставленияДополнительный, // сопоставленные объекты (0)
+ |
+ | ЭтоГруппаИсточник,
+ | ЭтоГруппаПриемник,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | УникальныйИдентификаторИсточника,
+ | УникальныйИдентификаторПриемника,
+ | ТипИсточника,
+ | ТипПриемника
+ |ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектовИсточникаПоРегистру
+ |ИЗ
+ | (ВЫБРАТЬ
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовИсточникаПоРегистру_ВложенныйЗапрос#
+ |
+ | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК Ссылка,
+ |
+ | #ТаблицаИсточникаЭтоГруппа# КАК ЭтоГруппаИсточник,
+ | #СоответствияОбъектовИнформационныхБазЭтоГруппа# КАК ЭтоГруппаПриемник,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника,
+ | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника КАК УникальныйИдентификаторИсточника,
+ | СоответствияОбъектовИнформационныхБаз.ТипПриемника КАК ТипИсточника,
+ | СоответствияОбъектовИнформационныхБаз.ТипИсточника КАК ТипПриемника
+ | ИЗ
+ | ТаблицаИсточника КАК ТаблицаИсточника
+ | ЛЕВОЕ СОЕДИНЕНИЕ
+ | ТаблицаРегистраСоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз
+ | ПО
+ | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника = ТаблицаИсточника.УникальныйИдентификатор
+ | И СоответствияОбъектовИнформационныхБаз.ТипПриемника = ТаблицаИсточника.ТипОбъекта
+ | ГДЕ
+ | НЕ СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника ЕСТЬ NULL
+ | ) КАК ВложенныйЗапрос
+ |;
+ |//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектовПриемникаПоРегистру}
+ |ВЫБРАТЬ
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
+ |
+ | #ПОЛЕ_СОРТИРОВКИ_Приемник#
+ |
+ | Ссылка,
+ | 0 КАК СтатусСопоставления, // сопоставленные объекты (0)
+ | 0 КАК СтатусСопоставленияДополнительный, // сопоставленные объекты (0)
+ |
+ | ЭтоГруппаИсточник,
+ | ЭтоГруппаПриемник,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | УникальныйИдентификаторИсточника,
+ | УникальныйИдентификаторПриемника,
+ | ТипИсточника,
+ | ТипПриемника
+ |ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектовПриемникаПоРегистру
+ |ИЗ
+ | (ВЫБРАТЬ
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПриемникаПоРегистру_ВложенныйЗапрос#
+ |
+ | ТаблицаПриемника.Ссылка КАК Ссылка,
+ |
+ | #ТаблицаПриемникаЭтоГруппа# КАК ЭтоГруппаИсточник,
+ | #ТаблицаПриемникаЭтоГруппа# КАК ЭтоГруппаПриемник,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника,
+ | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника КАК УникальныйИдентификаторИсточника,
+ | СоответствияОбъектовИнформационныхБаз.ТипПриемника КАК ТипИсточника,
+ | СоответствияОбъектовИнформационныхБаз.ТипИсточника КАК ТипПриемника
+ | ИЗ
+ | #ТаблицаПриемника# КАК ТаблицаПриемника
+ | ЛЕВОЕ СОЕДИНЕНИЕ
+ | ТаблицаРегистраСоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз
+ | ПО
+ | СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника = ТаблицаПриемника.Ссылка
+ | И СоответствияОбъектовИнформационныхБаз.ТипИсточника = &ТипПриемника
+ | ЛЕВОЕ СОЕДИНЕНИЕ
+ | ТаблицаСопоставленныхОбъектовИсточникаПоРегистру КАК ТаблицаСопоставленныхОбъектовИсточникаПоРегистру
+ | ПО
+ | ТаблицаСопоставленныхОбъектовИсточникаПоРегистру.Ссылка = ТаблицаПриемника.Ссылка
+ |
+ | ГДЕ
+ | НЕ СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника ЕСТЬ NULL
+ | И ТаблицаСопоставленныхОбъектовИсточникаПоРегистру.Ссылка ЕСТЬ NULL
+ | ) КАК ВложенныйЗапрос
+ |;
+ |
+ |//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям}
+ |ВЫБРАТЬ
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
+ |
+ | #ПОЛЕ_СОРТИРОВКИ_Приемник#
+ |
+ | Ссылка,
+ | 3 КАК СтатусСопоставления, // неутвержденные связи (3)
+ | 0 КАК СтатусСопоставленияДополнительный, // сопоставленные объекты (0)
+ |
+ | ЭтоГруппаИсточник,
+ | ЭтоГруппаПриемник,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | УникальныйИдентификаторИсточника,
+ | УникальныйИдентификаторПриемника,
+ | ТипИсточника,
+ | ТипПриемника
+ |ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям
+ |ИЗ
+ | (ВЫБРАТЬ
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям_ВложенныйЗапрос#
+ |
+ | ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника КАК Ссылка,
+ |
+ | #ТаблицаИсточникаЭтоГруппа# КАК ЭтоГруппаИсточник,
+ | #ТаблицаНеутвержденныхСвязейЭтоГруппа# КАК ЭтоГруппаПриемник,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника,
+ | ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторПриемника КАК УникальныйИдентификаторИсточника,
+ | ТаблицаНеутвержденныхСвязей.ТипПриемника КАК ТипИсточника,
+ | ТаблицаНеутвержденныхСвязей.ТипИсточника КАК ТипПриемника
+ | ИЗ
+ | ТаблицаИсточника КАК ТаблицаИсточника
+ | ЛЕВОЕ СОЕДИНЕНИЕ
+ | ТаблицаНеутвержденныхСвязей КАК ТаблицаНеутвержденныхСвязей
+ | ПО
+ | ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторПриемника = ТаблицаИсточника.УникальныйИдентификатор
+ | И ТаблицаНеутвержденныхСвязей.ТипПриемника = ТаблицаИсточника.ТипОбъекта
+ |
+ | ГДЕ
+ | НЕ ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника ЕСТЬ NULL
+ | ) КАК ВложенныйЗапрос
+ |;
+ |";
+ КонецЕсли;
+
+ ТекстЗапроса = ТекстЗапроса + "
+ |//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектов}
+ |ВЫБРАТЬ
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
+ |
+ | #ПОЛЯ_СОРТИРОВКИ#
+ |
+ | Ссылка,
+ | СтатусСопоставления,
+ | СтатусСопоставленияДополнительный,
+ |
+ | // {ИНДЕКС КАРТИНКИ}
+ | ВЫБОР КОГДА ЭтоГруппаИсточник ЕСТЬ NULL
+ | ТОГДА 0
+ | ИНАЧЕ
+ | ВЫБОР КОГДА ЭтоГруппаИсточник = ИСТИНА
+ | ТОГДА 1
+ | ИНАЧЕ 2
+ | КОНЕЦ
+ | КОНЕЦ КАК ИсточникИндексКартинки,
+ |
+ | ВЫБОР КОГДА ЭтоГруппаПриемник ЕСТЬ NULL
+ | ТОГДА 0
+ | ИНАЧЕ
+ | ВЫБОР КОГДА ЭтоГруппаПриемник = ИСТИНА
+ | ТОГДА 1
+ | ИНАЧЕ 2
+ | КОНЕЦ
+ | КОНЕЦ КАК ПриемникИндексКартинки,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | УникальныйИдентификаторИсточника,
+ | УникальныйИдентификаторПриемника,
+ | ТипИсточника,
+ | ТипПриемника
+ |ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектов
+ |ИЗ
+ | (
+ | ВЫБРАТЬ
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
+ |
+ | #ПОЛЯ_СОРТИРОВКИ#
+ |
+ | Ссылка,
+ | СтатусСопоставления,
+ | СтатусСопоставленияДополнительный,
+ |
+ | ЭтоГруппаИсточник,
+ | ЭтоГруппаПриемник,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | УникальныйИдентификаторИсточника,
+ | УникальныйИдентификаторПриемника,
+ | ТипИсточника,
+ | ТипПриемника
+ | ИЗ
+ | ТаблицаСопоставленныхОбъектовИсточникаПоРегистру
+ |
+ | ОБЪЕДИНИТЬ ВСЕ
+ |
+ | ВЫБРАТЬ
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
+ |
+ | #ПОЛЯ_СОРТИРОВКИ#
+ |
+ | Ссылка,
+ | СтатусСопоставления,
+ | СтатусСопоставленияДополнительный,
+ |
+ | ЭтоГруппаИсточник,
+ | ЭтоГруппаПриемник,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | УникальныйИдентификаторИсточника,
+ | УникальныйИдентификаторПриемника,
+ | ТипИсточника,
+ | ТипПриемника
+ | ИЗ
+ | ТаблицаСопоставленныхОбъектовПриемникаПоРегистру
+ |
+ | ОБЪЕДИНИТЬ ВСЕ
+ |
+ | ВЫБРАТЬ
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
+ |
+ | #ПОЛЯ_СОРТИРОВКИ#
+ |
+ | Ссылка,
+ | СтатусСопоставления,
+ | СтатусСопоставленияДополнительный,
+ |
+ | ЭтоГруппаИсточник,
+ | ЭтоГруппаПриемник,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | УникальныйИдентификаторИсточника,
+ | УникальныйИдентификаторПриемника,
+ | ТипИсточника,
+ | ТипПриемника
+ | ИЗ
+ | ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям
+ |
+ | ) КАК ВложенныйЗапрос
+ |
+ |ИНДЕКСИРОВАТЬ ПО
+ | Ссылка
+ |;
+ |
+ |//////////////////////////////////////////////////////////////////////////////// {ТаблицаНеСопоставленныхОбъектовИсточника}
+ |ВЫБРАТЬ
+ |
+ | Ссылка,
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
+ |
+ | #ПОЛЕ_СОРТИРОВКИ_Источник#
+ |
+ | -1 КАК СтатусСопоставления, // несопоставленные объекты источника (-1)
+ | 1 КАК СтатусСопоставленияДополнительный, // несопоставленные объекты (1)
+ |
+ | // {ИНДЕКС КАРТИНКИ}
+ | ВЫБОР КОГДА ЭтоГруппаИсточник ЕСТЬ NULL
+ | ТОГДА 0
+ | ИНАЧЕ
+ | ВЫБОР КОГДА ЭтоГруппаИсточник = ИСТИНА
+ | ТОГДА 1
+ | ИНАЧЕ 2
+ | КОНЕЦ
+ | КОНЕЦ КАК ИсточникИндексКартинки,
+ |
+ | ВЫБОР КОГДА ЭтоГруппаПриемник ЕСТЬ NULL
+ | ТОГДА 0
+ | ИНАЧЕ
+ | ВЫБОР КОГДА ЭтоГруппаПриемник = ИСТИНА
+ | ТОГДА 1
+ | ИНАЧЕ 2
+ | КОНЕЦ
+ | КОНЕЦ КАК ПриемникИндексКартинки,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | УникальныйИдентификаторИсточника,
+ | УникальныйИдентификаторПриемника,
+ | ТипИсточника,
+ | ТипПриемника
+ |ПОМЕСТИТЬ ТаблицаНеСопоставленныхОбъектовИсточника
+ |ИЗ
+ | (ВЫБРАТЬ
+ |
+ | #ТаблицаИсточникаЭтоГруппа# КАК ЭтоГруппаИсточник,
+ | NULL КАК ЭтоГруппаПриемник,
+ |
+ | ТаблицаИсточника.Ссылка КАК Ссылка,
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовИсточника_ВложенныйЗапрос#
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | NULL КАК УникальныйИдентификаторПриемника,
+ | ТаблицаИсточника.УникальныйИдентификатор КАК УникальныйИдентификаторИсточника,
+ | &ТипИсточника КАК ТипИсточника,
+ | &ТипПриемника КАК ТипПриемника
+ | ИЗ
+ | ТаблицаИсточника КАК ТаблицаИсточника
+ | ЛЕВОЕ СОЕДИНЕНИЕ
+ | ТаблицаСопоставленныхОбъектов КАК ТаблицаСопоставленныхОбъектов
+ | ПО
+ | ТаблицаИсточника.Ссылка = ТаблицаСопоставленныхОбъектов.Ссылка
+ | ИЛИ ТаблицаИсточника.УникальныйИдентификатор = ТаблицаСопоставленныхОбъектов.УникальныйИдентификаторИсточника
+ | ГДЕ
+ | ТаблицаСопоставленныхОбъектов.Ссылка ЕСТЬ NULL
+ | ) КАК ВложенныйЗапрос
+ |;
+ |
+ |//////////////////////////////////////////////////////////////////////////////// {ТаблицаНеСопоставленныхОбъектовПриемника}
+ |ВЫБРАТЬ
+ |
+ | Ссылка,
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#
+ |
+ | #ПОЛЕ_СОРТИРОВКИ_Приемник#
+ |
+ | 1 КАК СтатусСопоставления, // несопоставленные объекты приемника (1)
+ | 1 КАК СтатусСопоставленияДополнительный, // несопоставленные объекты (1)
+ |
+ | // {ИНДЕКС КАРТИНКИ}
+ | ВЫБОР КОГДА ЭтоГруппаИсточник ЕСТЬ NULL
+ | ТОГДА 0
+ | ИНАЧЕ
+ | ВЫБОР КОГДА ЭтоГруппаИсточник = ИСТИНА
+ | ТОГДА 1
+ | ИНАЧЕ 2
+ | КОНЕЦ
+ | КОНЕЦ КАК ИсточникИндексКартинки,
+ |
+ | ВЫБОР КОГДА ЭтоГруппаПриемник ЕСТЬ NULL
+ | ТОГДА 0
+ | ИНАЧЕ
+ | ВЫБОР КОГДА ЭтоГруппаПриемник = ИСТИНА
+ | ТОГДА 1
+ | ИНАЧЕ 2
+ | КОНЕЦ
+ | КОНЕЦ КАК ПриемникИндексКартинки,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | УникальныйИдентификаторИсточника,
+ | УникальныйИдентификаторПриемника,
+ | ТипИсточника,
+ | ТипПриемника
+ |ПОМЕСТИТЬ ТаблицаНеСопоставленныхОбъектовПриемника
+ |ИЗ
+ | (ВЫБРАТЬ
+ |
+ | ТаблицаПриемника.Ссылка КАК Ссылка,
+ |
+ | #ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовПриемника_ВложенныйЗапрос#
+ |
+ | NULL КАК ЭтоГруппаИсточник,
+ | #ТаблицаПриемникаЭтоГруппа# КАК ЭтоГруппаПриемник,
+ |
+ | // {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
+ | ТаблицаПриемника.Ссылка КАК УникальныйИдентификаторПриемника,
+ | Неопределено КАК УникальныйИдентификаторИсточника,
+ | Неопределено КАК ТипИсточника,
+ | &ТипПриемника КАК ТипПриемника
+ | ИЗ
+ | #ТаблицаПриемника# КАК ТаблицаПриемника
+ | ЛЕВОЕ СОЕДИНЕНИЕ
+ | ТаблицаСопоставленныхОбъектов КАК ТаблицаСопоставленныхОбъектов
+ | ПО
+ | ТаблицаПриемника.Ссылка = ТаблицаСопоставленныхОбъектов.Ссылка
+ | ГДЕ
+ | ТаблицаСопоставленныхОбъектов.Ссылка ЕСТЬ NULL
+ | ) КАК ВложенныйЗапрос
+ |;
+ |
+ |";
+
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаИсточника#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаИсточникаПараметр.# КАК #,"));
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ИсточникПолеNN, ПриемникПолеNN,"));
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоСсылке_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаПриемника.# КАК ПриемникПолеNN, ТаблицаИсточника.# КАК ИсточникПолеNN,"));
- ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовИсточникаПоРегистру_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ВЫРАЗИТЬ(СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК [ИмяТаблицыПриемника]).# КАК ПриемникПолеNN, ТаблицаИсточника.# КАК ИсточникПолеNN,"));
+
+ Если ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(УзелИнформационнойБазы) Тогда
+ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовИсточникаПоРегистру_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ВЫРАЗИТЬ(ЕСТЬNULL(СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника, ТаблицаПриемника.Ссылка) КАК [ИмяТаблицыПриемника]).# КАК ПриемникПолеNN, ТаблицаИсточника.# КАК ИсточникПолеNN,"));
+ Иначе
+ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовИсточникаПоРегистру_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ВЫРАЗИТЬ(СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК [ИмяТаблицыПриемника]).# КАК ПриемникПолеNN, ТаблицаИсточника.# КАК ИсточникПолеNN,"));
+ КонецЕсли;
+
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПриемникаПоРегистру_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаПриемника.# КАК ПриемникПолеNN, NULL КАК ИсточникПолеNN,"));
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ВЫРАЗИТЬ(ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника КАК [ИмяТаблицыПриемника]).# КАК ПриемникПолеNN, ТаблицаИсточника.# КАК ИсточникПолеNN,"));
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовИсточника_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаИсточника.# КАК ИсточникПолеNN, NULL КАК ПриемникПолеNN,"));
@@ -1646,12 +1856,14 @@
// Возвращаемое значение функции.
ТаблицаДанных = Неопределено;
- ОбработкаОбменаДанными = ОбменДаннымиСервер.ОбработкаОбменаДляЗагрузкиДанных(Отказ, УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена);
+ СтруктураНастроекОбмена = ОбменДаннымиСервер.СтруктураНастроекОбменаДляСеансаИнтерактивнойЗагрузки(УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена);
- Если Отказ Тогда
+ Если СтруктураНастроекОбмена.Отказ Тогда
Возврат Неопределено;
КонецЕсли;
+ ОбработкаОбменаДанными = СтруктураНастроекОбмена.ОбработкаОбменаДанными;
+
КлючТаблицыДанных = ОбменДаннымиСервер.КлючТаблицыДанных(ТипИсточникаСтрокой, ТипПриемникаСтрокой, ЭтоУдалениеОбъекта);
// Таблица данных может быть уже загружена и находиться в кэше обработки ОбработкаОбменаДанными.
diff --git a/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Help/ru.html b/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Help/ru.html
index b5ccc122d..4a56a0a12 100644
--- a/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Help/ru.html
+++ b/SSL/src/DataProcessors/СписокРеспондента/Forms/АрхивАнкет/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для просмотра анкет, работа над которыми была завершена.
Открывается с рабочего стола респондента по команде Архив анкет.
В списке отображаются анкеты, у которых составитель установил флажок Показывать в архиве анкет.
Предназначен для просмотра и редактирования анкет, доступных респонденту.
После входа в программу респондента для него открывается список Доступные анкеты. В списке выводятся наименования анкет.
Если опрос был запланирован с ограничением по времени проведения, то в списке доступных анкет после названия анкеты будет указан срок, до которого необходимо ее заполнить.
diff --git a/SSL/src/DataProcessors/ТекущиеДела/Forms/НастройкаПанели/Module.bsl b/SSL/src/DataProcessors/ТекущиеДела/Forms/НастройкаПанели/Module.bsl
index afe24dbff..f756149e9 100644
--- a/SSL/src/DataProcessors/ТекущиеДела/Forms/НастройкаПанели/Module.bsl
+++ b/SSL/src/DataProcessors/ТекущиеДела/Forms/НастройкаПанели/Module.bsl
@@ -280,9 +280,12 @@
КонецЕсли;
СтрокаРаздела.Индекс = СохраненныйРаздел.Индекс;
Дела = СтрокаРаздела.Строки;
+ ИндексПоследнегоДела = Дела.Количество() - 1;
Для Каждого СтрокаДело Из Дела Цикл
СохраненноеДело = СохраненныйРаздел.Строки.Найти(СтрокаДело.Идентификатор, "Идентификатор");
Если СохраненноеДело = Неопределено Тогда
+ СтрокаДело.Индекс = ИндексПоследнегоДела;
+ ИндексПоследнегоДела = ИндексПоследнегоДела - 1;
Продолжить;
КонецЕсли;
СтрокаДело.Индекс = СохраненноеДело.Индекс;
diff --git a/SSL/src/DataProcessors/ТекущиеДела/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ТекущиеДела/Forms/Форма/Module.bsl
index f5a8cee71..8d91da748 100644
--- a/SSL/src/DataProcessors/ТекущиеДела/Forms/Форма/Module.bsl
+++ b/SSL/src/DataProcessors/ТекущиеДела/Forms/Форма/Module.bsl
@@ -49,6 +49,7 @@
&НаКлиенте
Процедура ПриЗакрытии()
+ ОтключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания");
ДействияПриЗакрытииПанелиТекущихДел();
КонецПроцедуры
@@ -171,6 +172,7 @@
Иначе
// Дочерние дела создаются заново.
СоздатьДочернееДело(Дело);
+ ЗаполнитьПараметрыДела(Дело);
КонецЕсли;
КонецЦикла;
@@ -193,7 +195,9 @@
Если Элемент = Неопределено Тогда
// Дела нету в списке, вероятно оно появилось после включения функциональной опции,
// в таком случае добавим его.
- СоздатьДело(Дело, РодительДела, ВключенаВидимостьДела);
+ ИмяГруппыДела = СтрЗаменить(РодительДела.Имя, "ОбщаяГруппа", "Группа");
+ ГруппаДела = РодительДела.ПодчиненныеЭлементы.Найти(ИмяГруппыДела);
+ СоздатьДело(Дело, ГруппаДела, ВключенаВидимостьДела);
ЗаполнитьПараметрыДела(Дело);
Возврат;
КонецЕсли;
diff --git a/SSL/src/DataProcessors/ТекущиеДела/Help/ru.html b/SSL/src/DataProcessors/ТекущиеДела/Help/ru.html
index 6ed88eec5..94e84c5e7 100644
--- a/SSL/src/DataProcessors/ТекущиеДела/Help/ru.html
+++ b/SSL/src/DataProcessors/ТекущиеДела/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для вывода списка текущих дел пользователя на рабочий стол.
Программа позволяет выводить список текущих дел пользователя на рабочем столе: новые письма, задачи, заявки, несогласованные заказы и т.п. Список дел может включать в себя важные и обычные дела, однострочные и многострочные, с количественными показателями и без. Список дел сгруппирован по разделам командного интерфейса, предусмотрена возможность настраивать видимость и порядок отображения, автоматическое обновление через заданный интервал. Важные дела выделяются цветом.
Дела отображаются в виде ссылок, перейдя по которым, можно открыть соответствующие списки, документы или другие объекты программы.
diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Form.form b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Form.form
index 31a851ce1..c19a85eee 100644
--- a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Form.form
+++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Form.form
@@ -55,7 +55,7 @@
ru
- Автоматическое удаление всех отмеченных объектов
+ Автоматическое удаление всех помеченных объектовПолный
@@ -148,8 +148,9 @@
ruУдаление помеченных объектов может занять длительное время
(от нескольких секунд до нескольких часов в зависимости от объема удаляемых данных).<1/>
-Во время удаления может наблюдаться существенное замедление работы <a href="1">пользователей (%1)</a>.
-Рекомендуется выполнять удаление в период наименьшей активности пользователей.
+Во время удаления может наблюдаться существенное замедление работы <a href="1">пользователей</a>.
+Рекомендуется выполнять удаление в период наименьшей активности пользователей.
+truetrue
@@ -215,6 +216,54 @@
Auto
+
+ УскоритьУдалениеПомеченных
+ 439
+
+ ru
+ Заблокировать всю работу в программе и ускорить удаление
+
+ true
+ true
+
+ true
+
+
+ Монопольно
+
+ Right
+ Button
+
+ УскоритьУдалениеПомеченныхРасширеннаяПодсказка
+ 441
+
+ ru
+ Если флажок установлен, то на время удаления вход в программу будет закрыт и установлен монопольный режим.
+Это существенно ускорит процесс удаления.
+
+Рекомендации по использованию флажка:
+- рекомендуется включать для срочного удаления больших объемов данных, например, после выполнения свертки базы;
+- во всех остальных случаях его не рекомендуется включать, чтобы не блокировать работу пользователей с программой.
+
+ Label
+ true
+ true
+
+ Left
+
+
+
+ УскоритьУдалениеПомеченныхКонтекстноеМеню
+ 440
+ true
+
+ CheckBoxField
+ Enter
+ true
+ Left
+ true
+
+ truetrue
@@ -991,21 +1040,194 @@
Left
-
- НадписьДлительнаяОперация
- 202
-
- ru
- Удаляются объекты, помеченные на удаление...
-
+
+ Группа1
+ 442
+
+ ФоновоеЗаданиеАнимация
+ 446
+
+ ru
+ Фоновое задание анимация
+
+ true
+ true
+
+ true
+
+
+ ФоновоеЗаданиеАнимацияРасширеннаяПодсказка
+ 448
+ Label
+ true
+ true
+
+ Left
+
+
+
+ ФоновоеЗаданиеАнимацияКонтекстноеМеню
+ 447
+ true
+
+ 5
+ true
+ 2
+ true
+
+
+ CommonPicture.ДлительнаяОперация48
+
+
+
+
+ Группа2
+ 444
+
+ НадписьДлительнаяОперация
+ 202
+ true
+ true
+
+ true
+
+
+ НадписьДлительнаяОперацияРасширеннаяПодсказка
+ 204
+ Label
+ true
+ true
+
+ Left
+
+
+
+ НадписьДлительнаяОперацияКонтекстноеМеню
+ 203
+ true
+
+ Label
+ true
+ 1
+ true
+ true
+
+ Left
+
+
+
+ ФоновоеЗаданиеПроцент
+ 184
+ true
+ true
+
+ true
+
+
+ ФоновоеЗаданиеПроцент
+
+ None
+
+ ФоновоеЗаданиеПроцентРасширеннаяПодсказка
+ 186
+ Label
+ true
+ true
+
+ Left
+
+
+
+ ФоновоеЗаданиеПроцентКонтекстноеМеню
+ 185
+ true
+
+ ProgressBarField
+ Enter
+ true
+ Left
+ true
+
+ 32
+ true
+ 1
+ true
+ true
+ 100
+ true
+
+
+
+ ФоновоеЗаданиеСостояние
+ 194
+ true
+ true
+
+ true
+
+
+ ФоновоеЗаданиеСостояние
+
+ None
+
+ ФоновоеЗаданиеСостояниеРасширеннаяПодсказка
+ 196
+ Label
+ true
+ true
+
+ Left
+
+
+
+ ФоновоеЗаданиеСостояниеКонтекстноеМеню
+ 195
+ true
+
+ LabelField
+ Center
+ Enter
+ true
+ Left
+ true
+
+ true
+ true
+
+
+ true
+ true
+
+ true
+
+
+ Группа2РасширеннаяПодсказка
+ 445
+ Label
+ true
+ true
+
+ Left
+
+
+ UsualGroup
+
+ Vertical
+ Auto
+ true
+ true
+ Auto
+ Auto
+
+ truetruetrue
- НадписьДлительнаяОперацияРасширеннаяПодсказка
- 204
+ Группа1РасширеннаяПодсказка
+ 443Labeltruetrue
@@ -1013,98 +1235,13 @@
Left
-
- НадписьДлительнаяОперацияКонтекстноеМеню
- 203
- true
-
- Label
- true
- 1
- true
- true
-
- Left
-
-
-
- ФоновоеЗаданиеПроцент
- 184
- true
- true
-
- true
-
-
- ФоновоеЗаданиеПроцент
-
- None
-
- ФоновоеЗаданиеПроцентРасширеннаяПодсказка
- 186
- Label
- true
- true
-
- Left
-
-
-
- ФоновоеЗаданиеПроцентКонтекстноеМеню
- 185
- true
-
- ProgressBarField
- Enter
- true
- Left
- true
-
- 32
- true
- 1
- true
- true
- 100
- true
-
-
-
- ФоновоеЗаданиеСостояние
- 194
- true
- true
-
- true
-
-
- ФоновоеЗаданиеСостояние
-
- None
-
- ФоновоеЗаданиеСостояниеРасширеннаяПодсказка
- 196
- Label
- true
- true
-
- Left
-
-
-
- ФоновоеЗаданиеСостояниеКонтекстноеМеню
- 195
- true
-
- LabelField
- Center
- Enter
- true
- Left
- true
-
- true
- true
+ UsualGroup
+
+ Auto
+ true
+ true
+ Auto
+ Auto
@@ -1488,6 +1625,15 @@
Labeltruetrue
+
+ System.DefaultGUIFont
+ Arial
+ 10.0
+ true
+ false
+ false
+ false
+
LeftCenter
@@ -1949,6 +2095,62 @@
ГруппаПричины315
+
+ НеУдаленныеПодсказка
+ 436
+
+ Style.FieldTextColor
+
+ true
+ true
+
+ true
+
+
+ НеУдаленныеПодсказка
+
+ None
+
+ НеУдаленныеПодсказкаРасширеннаяПодсказка
+ 438
+ Label
+ true
+ true
+
+ Left
+
+
+
+ НеУдаленныеПодсказкаКонтекстноеМеню
+ 437
+ true
+
+ LabelField
+ Left
+ Bottom
+ Enter
+ true
+ Left
+ true
+
+ true
+ 2
+ true
+ false
+
+ Style.FieldTextColor
+
+
+ System.DefaultGUIFont
+ Arial
+ 10.0
+ false
+ false
+ false
+ false
+
+
+ СтраницыВариантовОтображенияПричин255
@@ -2141,7 +2343,7 @@
SortListAscSortListDesc
- ПричиныНеудаленияПредставление
+ СвязиНеУдаленныхПредставление248truetrue
@@ -2152,7 +2354,7 @@
СвязиНеУдаленных.Представление
- ПричиныНеудаленияПредставлениеРасширеннаяПодсказка
+ СвязиНеУдаленныхПредставлениеРасширеннаяПодсказка250Labeltrue
@@ -2162,7 +2364,7 @@
- ПричиныНеудаленияПредставлениеКонтекстноеМеню
+ СвязиНеУдаленныхПредставлениеКонтекстноеМеню249true
@@ -2499,22 +2701,17 @@
ru
- ShowTopГруппаПричиныРасширеннаяПодсказка316Labeltruetrue
- true
- falseStyle.FormTextColorLeft
- Bottom
- 2UsualGroup
@@ -2928,7 +3125,7 @@
RetrySaveValuesYes
- 90
+ 100LockOwnerUsetrue
@@ -3584,6 +3781,58 @@
true
+
+ ПометкаУдаленияМодифицирована
+
+ ru
+ Пометка удаления модифицирована
+
+ 10
+
+ Boolean
+
+
+ true
+
+
+ true
+
+
+
+
+ НеУдаленныеПодсказка
+
+ ru
+ Не удаленные подсказка
+
+ 22
+
+ String
+
+
+
+ true
+
+
+ true
+
+
+
+ Монопольно
+
+ ru
+ Монопольно
+
+ 8
+
+ Boolean
+
+
+ true
+
+
+ true
+ КомандаДалее
diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Module.bsl b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Module.bsl
index bc0e55ca5..218624632 100644
--- a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Module.bsl
+++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/Module.bsl
@@ -72,7 +72,7 @@
&НаКлиенте
Процедура ПриЗакрытии()
Если ФоновоеЗаданиеИдентификатор <> Неопределено Тогда
- ФоновоеЗаданиеОтменить(ФоновоеЗаданиеИдентификатор);
+ ФоновоеЗаданиеОтменить(ФоновоеЗаданиеИдентификатор, Монопольно);
ФоновоеЗаданиеИдентификатор = Неопределено;
КонецЕсли;
КонецПроцедуры
@@ -268,7 +268,7 @@
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СвязиНеУдаленных.Имя);
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
- ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПричиныНеУдаленияПредставление.Имя);
+ ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СвязиНеУдаленныхПредставление.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СвязиНеУдаленных.Видимость");
@@ -344,6 +344,19 @@
ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчика);
ПодключитьОбработчикОжидания("ФоновоеЗаданиеПроверитьНаКлиенте", 1, Истина);
ПараметрыОбработчика.МаксимальныйИнтервал = 5;
+ ИначеЕсли Результат.ОшибкаПриУстановкеМонопольногоРежима Тогда
+ Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда
+ Оповещение = Новый ОписаниеОповещения("ФоновоеЗаданиеЗапуститьПослеУстановкиМонопольногоРежима", ЭтотОбъект, Действие);
+ ПараметрыФормы = Новый Структура;
+ ПараметрыФормы.Вставить("УдалениеПомеченныхОбъектов", Истина);
+ МодульСоединенияИБКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СоединенияИБКлиент");
+ МодульСоединенияИБКлиент.ПриОткрытииФормыОшибкиУстановкиМонопольногоРежима(Оповещение, ПараметрыФормы);
+ Иначе
+ СтандартныеПодсистемыКлиентСервер.ВывестиПредупреждение(
+ Результат,
+ НСтр("ru = 'Не удалось запустить удаление помеченных объектов'"),
+ Результат.ТекстОшибкиУстановкиМонопольногоРежима);
+ КонецЕсли;
КонецЕсли;
СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(ЭтотОбъект, Результат);
КонецПроцедуры
@@ -353,43 +366,46 @@
СтрокаДерева = Элементы.НеУдаленные.ТекущиеДанные;
Если СтрокаДерева = Неопределено Или СтрокаДерева.НомерКартинки < 1 Тогда
// Ничего не выбрано или выбрана группа.
- Элементы.СтраницыВариантовОтображенияПричин.ТекущаяСтраница = Элементы.СтраницаВыберитеНеУдаленныйОбъект;
- Элементы.ГруппаПричины.Подсказка = " ";
+ ТекущаяСтраница = Элементы.СтраницаВыберитеНеУдаленныйОбъект;
+ НеУдаленныеПодсказка = " ";
ТекстОшибки = НСтр("ru = 'Выберите объект, чтобы узнать причину,
|по которой его не удалось удалить.'");
- Возврат;
- КонецЕсли;
-
- // Выбрана ссылка не удаленного объекта.
- Скрываемые = СвязиНеУдаленных.НайтиСтроки(Новый Структура("Видимость", Истина));
- Для Каждого СтрокаТаблицы Из Скрываемые Цикл
- СтрокаТаблицы.Видимость = Ложь;
- КонецЦикла;
-
- ТекстОшибки = "";
- ПоказыватьТекстОшибки = Истина;
- Показываемые = СвязиНеУдаленных.НайтиСтроки(Новый Структура("УдаляемыйСсылка", СтрокаДерева.УдаляемыйСсылка));
- Для Каждого СтрокаТаблицы Из Показываемые Цикл
- СтрокаТаблицы.Видимость = Истина;
- Если СтрокаТаблицы.ЭтоОшибка Тогда
- ТекстОшибки = СтрокаТаблицы.ОбнаруженныйСсылка;
- Иначе
- Если ПоказыватьТекстОшибки Тогда
- Элементы.СвязиНеУдаленных.ТекущаяСтрока = СтрокаТаблицы.ПолучитьИдентификатор();
- ПоказыватьТекстОшибки = Ложь;
- КонецЕсли;
- КонецЕсли;
- КонецЦикла;
-
- Если ПоказыватьТекстОшибки Тогда
- Элементы.СтраницыВариантовОтображенияПричин.ТекущаяСтраница = Элементы.СтраницаТекстОшибки;
- Элементы.ГруппаПричины.Подсказка = " ";
Иначе
- Элементы.СтраницыВариантовОтображенияПричин.ТекущаяСтраница = Элементы.СтраницаПричиныНеУдаления;
- Элементы.ГруппаПричины.Подсказка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Места использования объекта ""%1"" (%2):'"),
- СтрокаДерева.Представление,
- Формат(СтрокаДерева.КоличествоСвязей, "ЧН=0; ЧГ="));
+ // Выбрана ссылка не удаленного объекта.
+ Скрываемые = СвязиНеУдаленных.НайтиСтроки(Новый Структура("Видимость", Истина));
+ Для Каждого СтрокаТаблицы Из Скрываемые Цикл
+ СтрокаТаблицы.Видимость = Ложь;
+ КонецЦикла;
+
+ ТекстОшибки = "";
+ ПоказыватьТекстОшибки = Истина;
+ Показываемые = СвязиНеУдаленных.НайтиСтроки(Новый Структура("УдаляемыйСсылка", СтрокаДерева.УдаляемыйСсылка));
+ Для Каждого СтрокаТаблицы Из Показываемые Цикл
+ СтрокаТаблицы.Видимость = Истина;
+ Если СтрокаТаблицы.ЭтоОшибка Тогда
+ ТекстОшибки = СтрокаТаблицы.ОбнаруженныйСсылка;
+ Иначе
+ Если ПоказыватьТекстОшибки Тогда
+ Элементы.СвязиНеУдаленных.ТекущаяСтрока = СтрокаТаблицы.ПолучитьИдентификатор();
+ ПоказыватьТекстОшибки = Ложь;
+ КонецЕсли;
+ КонецЕсли;
+ КонецЦикла;
+
+ Если ПоказыватьТекстОшибки Тогда
+ ТекущаяСтраница = Элементы.СтраницаТекстОшибки;
+ НеУдаленныеПодсказка = " ";
+ Иначе
+ ТекущаяСтраница = Элементы.СтраницаПричиныНеУдаления;
+ НеУдаленныеПодсказка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Места использования объекта ""%1"" (%2):'"),
+ СтрокаДерева.Представление,
+ Формат(СтрокаДерева.КоличествоСвязей, "ЧН=0; ЧГ=")
+ );
+ КонецЕсли;
+ КонецЕсли;
+ Если Элементы.СтраницыВариантовОтображенияПричин.ТекущаяСтраница <> ТекущаяСтраница Тогда
+ Элементы.СтраницыВариантовОтображенияПричин.ТекущаяСтраница = ТекущаяСтраница;
КонецЕсли;
КонецПроцедуры
@@ -686,42 +702,47 @@
&НаСервере
Функция ПомеченныеНаУдалениеСоСтраницыРезультатов()
- ПомеченныеНаУдаление = Новый Массив;
+ Результат = Новый Массив;
ДеревоЗначений = РеквизитФормыВЗначение("НеУдаленные");
Найденные = ДеревоЗначений.Строки.НайтиСтроки(Новый Структура("ПометкаУдаления", Истина), Истина);
Для Каждого СтрокаДерева Из Найденные Цикл
Если ТипЗнч(СтрокаДерева.УдаляемыйСсылка) <> Тип("Строка")
- И ПомеченныеНаУдаление.Найти(СтрокаДерева.УдаляемыйСсылка) = Неопределено Тогда
- ПомеченныеНаУдаление.Добавить(СтрокаДерева.УдаляемыйСсылка);
+ И Результат.Найти(СтрокаДерева.УдаляемыйСсылка) = Неопределено Тогда
+ Результат.Добавить(СтрокаДерева.УдаляемыйСсылка);
КонецЕсли;
КонецЦикла;
ТаблицаЗначений = РеквизитФормыВЗначение("СвязиНеУдаленных");
- Найденные = ТаблицаЗначений.НайтиСтроки(Новый Структура("ПометкаУдаления", Истина));
+ Если РежимУдаления = "Полный" Тогда
+ Фильтр = Новый Структура("ПометкаУдаления", Истина);
+ Иначе
+ Фильтр = Новый Структура("ПометкаУдаления, ПометкаУдаленияМодифицирована", Истина, Истина);
+ КонецЕсли;
+ Найденные = ТаблицаЗначений.НайтиСтроки(Фильтр);
Для Каждого СтрокаДерева Из Найденные Цикл
Если ТипЗнч(СтрокаДерева.ОбнаруженныйСсылка) <> Тип("Строка")
- И ПомеченныеНаУдаление.Найти(СтрокаДерева.ОбнаруженныйСсылка) = Неопределено Тогда
- ПомеченныеНаУдаление.Добавить(СтрокаДерева.ОбнаруженныйСсылка);
+ И Результат.Найти(СтрокаДерева.ОбнаруженныйСсылка) = Неопределено Тогда
+ Результат.Добавить(СтрокаДерева.ОбнаруженныйСсылка);
КонецЕсли;
КонецЦикла;
- Возврат ПомеченныеНаУдаление;
+ Возврат Результат;
КонецФункции
&НаСервере
Функция ПомеченныеНаУдалениеСоСтраницыУстановкиФлажков()
- ПомеченныеНаУдаление = Новый Массив;
+ Результат = Новый Массив;
ДеревоЗначений = РеквизитФормыВЗначение("ДеревоПомеченныхНаУдаление");
Найденные = ДеревоЗначений.Строки.НайтиСтроки(Новый Структура("Пометка", Истина), Истина);
Для Каждого СтрокаДерева Из Найденные Цикл
Если ТипЗнч(СтрокаДерева.Значение) <> Тип("Строка") Тогда
- ПомеченныеНаУдаление.Добавить(СтрокаДерева.Значение);
+ Результат.Добавить(СтрокаДерева.Значение);
КонецЕсли;
КонецЦикла;
- Возврат ПомеченныеНаУдаление;
+ Возврат Результат;
КонецФункции
&НаСервере
@@ -742,23 +763,40 @@
Функция ФоновоеЗаданиеЗапустить(Знач ПараметрыЗадания)
Результат = СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения();
Результат.Вставить("ФоновоеЗаданиеЗапущено", Ложь);
+ Результат.Вставить("ОшибкаПриУстановкеМонопольногоРежима", Ложь);
+ Результат.Вставить("ТекстОшибкиУстановкиМонопольногоРежима", Неопределено);
+
+ Если ПараметрыЗадания.УдалятьПомеченные И Монопольно Тогда
+ ИнформацияОбОшибке = Неопределено;
+ Попытка
+ ОбщегоНазначения.ЗаблокироватьИБ();
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ КонецПопытки;
+ Если ИнформацияОбОшибке <> Неопределено Тогда
+ Результат.ОшибкаПриУстановкеМонопольногоРежима = Истина;
+ Результат.ТекстОшибкиУстановкиМонопольногоРежима = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
+ Возврат Результат;
+ КонецЕсли;
+ КонецЕсли;
// Запуск фонового задания
Если Не ПараметрыЗадания.ИскатьПомеченные Тогда
Если ПараметрыЗадания.ПрочитатьПомеченныеСоСтраницыРезультатов Тогда
- ПомеченныеНаУдаление = ПомеченныеНаУдалениеСоСтраницыРезультатов();
+ ПользовательскиеОбъекты = ПомеченныеНаУдалениеСоСтраницыРезультатов();
ИначеЕсли ПараметрыЗадания.ПрочитатьПомеченныеСоСтраницыУстановкиФлажков Тогда
- ПомеченныеНаУдаление = ПомеченныеНаУдалениеСоСтраницыУстановкиФлажков();
+ ПользовательскиеОбъекты = ПомеченныеНаУдалениеСоСтраницыУстановкиФлажков();
КонецЕсли;
- Если ПомеченныеНаУдаление.Количество() = 0 Тогда
+ Если ПользовательскиеОбъекты.Количество() = 0 Тогда
Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаУдалениеНеТребуется;
ВидимостьДоступность(ЭтотОбъект);
Возврат Результат;
КонецЕсли;
- ПараметрыЗадания.Вставить("ПомеченныеНаУдаление", ПомеченныеНаУдаление);
+ ПараметрыЗадания.Вставить("ПользовательскиеОбъекты", ПользовательскиеОбъекты);
КонецЕсли;
ПараметрыЗадания.Вставить("ПериодЗаписи", 1); // Секунд
+ ПараметрыЗадания.Вставить("Монопольно", Монопольно);
РезультатФоновогоЗадания = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
УникальныйИдентификатор,
@@ -773,8 +811,8 @@
ФоновоеЗаданиеЗагрузитьРезультат(Результат);
Результат.ФоновоеЗаданиеЗапущено = Ложь;
Иначе
+ ФоновоеЗаданиеПоказатьСтраницуДлительнойОперации(ПараметрыЗадания);
ФоновоеЗаданиеПрочитатьПромежуточныйРезультат(Результат);
- Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаДлительнаяОперация;
Результат.ФоновоеЗаданиеЗапущено = Истина;
КонецЕсли;
ВидимостьДоступность(ЭтотОбъект);
@@ -783,13 +821,16 @@
КонецФункции
&НаСервереБезКонтекста
-Процедура ФоновоеЗаданиеОтменить(ФоновоеЗаданиеИдентификатор)
+Процедура ФоновоеЗаданиеОтменить(Знач ФоновоеЗаданиеИдентификатор, Знач Монопольно)
ДлительныеОперации.ОтменитьВыполнениеЗадания(ФоновоеЗаданиеИдентификатор);
+ Если Монопольно Тогда
+ СнятьМонопольныйРежим();
+ КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ИзменитьПометкуУдаленияОбъектов(МассивСсылок, ПометкаУдаления)
- Результат = СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения();
+ Результат = Новый Структура;
Количество = МассивСсылок.Количество();
Для Номер = 1 По Количество Цикл
ОбратныйИндекс = Количество - Номер;
@@ -808,7 +849,6 @@
ТаблицаЗначений = РеквизитФормыВЗначение("СвязиНеУдаленных");
Для Каждого Ссылка Из МассивСсылок Цикл
-
Найденные = ДеревоЗначений.Строки.НайтиСтроки(Новый Структура("УдаляемыйСсылка", Ссылка), Истина);
Для Каждого СтрокаДерева Из Найденные Цикл
Если СтрокаДерева.ПометкаУдаления = ПометкаУдаления Тогда
@@ -825,31 +865,36 @@
КонецЕсли;
СтрокаТаблицы.ПометкаУдаления = ПометкаУдаления;
СтрокаТаблицы.НомерКартинки = СтрокаТаблицы.НомерКартинки + ?(ПометкаУдаления, 1, -1);
+ СтрокаТаблицы.ПометкаУдаленияМодифицирована = Истина;
КонецЦикла;
-
КонецЦикла;
ЗагрузитьКоллекцию("НеУдаленные", ДеревоЗначений, "УдаляемыйСсылка");
ЗагрузитьКоллекцию("СвязиНеУдаленных", ТаблицаЗначений, "УдаляемыйСсылка, ОбнаруженныйСсылка");
СтандартныеПодсистемыКлиентСервер.РазвернутьУзлыДерева(Результат, "НеУдаленные", "*", Истина);
-
КонецЕсли;
- СтандартныеПодсистемыКлиентСервер.ПодготовитьОповещениеДинамическихСписков(МассивСсылок, Результат);
- Результат.ВыводОповещения.Использование = Истина;
- Если ПометкаУдаления Тогда
- Результат.ВыводОповещения.Заголовок = НСтр("ru = 'Пометка удаления установлена'");
- Иначе
- Результат.ВыводОповещения.Заголовок = НСтр("ru = 'Пометка удаления снята'");
- КонецЕсли;
+ СтандартныеПодсистемыКлиентСервер.ОповеститьДинамическиеСписки(Результат, МассивСсылок);
+
+ ОповещениеТекст = Неопределено;
+ ОповещениеСсылка = Неопределено;
Если КоличествоОбъектов = 0 Тогда
- Результат.ВыводОповещения.Заголовок = НСтр("ru = 'Объект не найден'");
- ИначеЕсли КоличествоОбъектов = 1 Тогда
- Результат.ВыводОповещения.Ссылка = МассивСсылок[0];
- Результат.ВыводОповещения.Текст = Строка(Результат.ВыводОповещения.Ссылка);
+ ОповещениеЗаголовок = НСтр("ru = 'Объект не найден'");
Иначе
- Результат.ВыводОповещения.Заголовок = Результат.ВыводОповещения.Заголовок + " (" + Формат(КоличествоОбъектов, "ЧН=0; ЧГ=") + ")";
+ Если ПометкаУдаления Тогда
+ ОповещениеЗаголовок = НСтр("ru = 'Пометка удаления установлена'");
+ Иначе
+ ОповещениеЗаголовок = НСтр("ru = 'Пометка удаления снята'");
+ КонецЕсли;
+ Если КоличествоОбъектов = 1 Тогда
+ ОповещениеСсылка = МассивСсылок[0];
+ ОповещениеТекст = Строка(ОповещениеСсылка);
+ Иначе
+ ОповещениеЗаголовок = ОповещениеЗаголовок + " (" + Формат(КоличествоОбъектов, "ЧН=0; ЧГ=") + ")";
+ КонецЕсли;
КонецЕсли;
+ СтандартныеПодсистемыКлиентСервер.ВывестиОповещение(Результат, ОповещениеЗаголовок, ОповещениеТекст, , ОповещениеСсылка);
+
Возврат Результат;
КонецФункции
@@ -962,28 +1007,51 @@
Возврат Найденные;
КонецФункции
+&НаСервереБезКонтекста
+Процедура СнятьМонопольныйРежим()
+ ОбщегоНазначения.РазблокироватьИБ();
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ФоновоеЗаданиеЗапуститьПослеУстановкиМонопольногоРежима(Результат, ДополнительныеПараметры) Экспорт
+ Если Результат = Ложь Тогда // Монопольный режим был установлен.
+ ФоновоеЗаданиеЗапуститьНаКлиенте(ДополнительныеПараметры);
+ КонецЕсли;
+КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Сервер
&НаСервере
Процедура ПриСозданииНаСервереУстановитьТекстПоясненияКОбработке()
- КоличествоСоединений = 0;
- НомерЭтогоСеанса = НомерСеансаИнформационнойБазы();
- Для Каждого СеансИнформационнойБазы Из ПолучитьСеансыИнформационнойБазы() Цикл
- Если СеансИнформационнойБазы.НомерСеанса = НомерЭтогоСеанса Тогда
- Продолжить;
- КонецЕсли;
- Если СеансИнформационнойБазы.ИмяПриложения = "1CV8" // Толстый клиент.
- Или СеансИнформационнойБазы.ИмяПриложения = "1CV8C" // Тонкий клиент.
- Или СеансИнформационнойБазы.ИмяПриложения = "WebClient" // Веб-клиент.
- Тогда
- КоличествоСоединений = КоличествоСоединений + 1;
- КонецЕсли;
- КонецЦикла;
+ Если СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() Тогда
+ КоличествоСоединений = 0;
+ ВыводитьПодпись = Ложь;
+ ВыводитьКоличество = Ложь;
+ ИначеЕсли ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
+ КоличествоСоединений = 0;
+ НомерЭтогоСеанса = НомерСеансаИнформационнойБазы();
+ Для Каждого СеансИнформационнойБазы Из ПолучитьСеансыИнформационнойБазы() Цикл
+ Если СеансИнформационнойБазы.НомерСеанса = НомерЭтогоСеанса Тогда
+ Продолжить;
+ КонецЕсли;
+ Если СеансИнформационнойБазы.ИмяПриложения = "1CV8" // Толстый клиент.
+ Или СеансИнформационнойБазы.ИмяПриложения = "1CV8C" // Тонкий клиент.
+ Или СеансИнформационнойБазы.ИмяПриложения = "WebClient" // Веб-клиент.
+ Тогда
+ КоличествоСоединений = КоличествоСоединений + 1;
+ КонецЕсли;
+ КонецЦикла;
+ ВыводитьПодпись = (КоличествоСоединений > 0);
+ ВыводитьКоличество = Истина;
+ Иначе
+ КоличествоСоединений = 0;
+ ВыводитьПодпись = Истина;
+ ВыводитьКоличество = Ложь;
+ КонецЕсли;
ШаблонЗаголовка = Элементы.ПояснениеКОбработке.Заголовок;
- Если КоличествоСоединений = 0 Тогда
+ Если Не ВыводитьПодпись Тогда
Элементы.ПояснениеКОбработке.Заголовок = Лев(ШаблонЗаголовка, Найти(ШаблонЗаголовка, "<1/>") - 1);
КлючСохраненияПоложенияОкна = "1";
Иначе
@@ -1004,7 +1072,9 @@
Позиция = Найти(ОпределениеСсылки, """");
АдресСсылки = Лев(ОпределениеСсылки, Позиция - 1);
ТекстСсылки = Сред(ОпределениеСсылки, Позиция + 2);
- ТекстСсылки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСсылки, Формат(КоличествоСоединений, "ЧГ="));
+ Если ВыводитьКоличество Тогда
+ ТекстСсылки = ТекстСсылки + " (" + Формат(КоличествоСоединений, "ЧГ=") + ")";
+ КонецЕсли;
МассивСтрок.Добавить(Новый ФорматированнаяСтрока(ТекстСсылки, , , , АдресСсылки));
МассивСтрок.Добавить(Остаток);
@@ -1014,6 +1084,26 @@
КонецЕсли;
КонецПроцедуры
+&НаСервере
+Процедура ФоновоеЗаданиеПоказатьСтраницуДлительнойОперации(ПараметрыЗадания)
+ ПредставлениеРежима = Элементы.РежимУдаления.СписокВыбора.НайтиПоЗначению(РежимУдаления).Представление;
+
+ ПоказыватьБублик = ПараметрыЗадания.УдалятьПомеченные И Монопольно;
+ Элементы.ФоновоеЗаданиеАнимация.Видимость = ПоказыватьБублик;
+ Элементы.ФоновоеЗаданиеПроцент.Видимость = Не ПоказыватьБублик;
+ Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаДлительнаяОперация;
+ Если ПоказыватьБублик Тогда
+ Элементы.НадписьДлительнаяОперация.Заголовок = НСтр("ru = 'Пожалуйста, подождите...'");
+ Элементы.ФоновоеЗаданиеСостояние.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Лево;
+ ИначеЕсли ПараметрыЗадания.УдалятьПомеченные Тогда
+ Элементы.НадписьДлительнаяОперация.Заголовок = НСтр("ru = 'Удаляются объекты, помеченные на удаление...'");
+ Элементы.ФоновоеЗаданиеСостояние.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Центр;
+ Иначе
+ Элементы.НадписьДлительнаяОперация.Заголовок = НСтр("ru = 'Поиск объектов, помеченных на удаление...'");
+ Элементы.ФоновоеЗаданиеСостояние.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Центр;
+ КонецЕсли;
+КонецПроцедуры
+
&НаСервере
Процедура ФоновоеЗаданиеПрочитатьПромежуточныйРезультат(Результат)
Прогресс = ДлительныеОперации.ПрочитатьПрогресс(ФоновоеЗаданиеИдентификатор);
@@ -1025,6 +1115,10 @@
&НаСервере
Процедура ФоновоеЗаданиеЗагрузитьРезультат(Результат)
+ Если Монопольно Тогда
+ СнятьМонопольныйРежим();
+ КонецЕсли;
+
// Получение результата.
РезультатВыполненияВФоне = ПолучитьИзВременногоХранилища(ФоновоеЗаданиеАдресХранилища);
Если РезультатВыполненияВФоне = Неопределено Тогда
@@ -1034,7 +1128,7 @@
Если РезультатВыполненияВФоне.УдалятьПомеченные Тогда
// Подготовка оповещения для динамических списков.
- СтандартныеПодсистемыКлиентСервер.ПодготовитьОповещениеДинамическихСписков(РезультатВыполненияВФоне.Удаленные, Результат);
+ СтандартныеПодсистемыКлиентСервер.ОповеститьДинамическиеСписки(Результат, РезультатВыполненияВФоне.Удаленные);
УдаленныеКоличество = РезультатВыполненияВФоне.Удаленные.Количество();
НеУдаленныеКоличество = РезультатВыполненияВФоне.НеУдаленные.Количество();
@@ -1094,18 +1188,19 @@
КонецЕсли;
Если ОповещениеТекст <> Неопределено Тогда
- Результат.ВыводОповещения.Использование = Истина;
- Результат.ВыводОповещения.Заголовок = НСтр("ru = 'Удаление помеченных'");
- Результат.ВыводОповещения.Текст = ОповещениеТекст;
- Результат.ВыводОповещения.Ссылка = НавигационнаяСсылка;
- Результат.ВыводОповещения.Картинка = ОповещениеКартинка;
+ СтандартныеПодсистемыКлиентСервер.ВывестиОповещение(
+ Результат,
+ НСтр("ru = 'Удаление помеченных'"),
+ ОповещениеТекст,
+ ОповещениеКартинка,
+ НавигационнаяСсылка);
КонецЕсли;
Иначе
// Заполнение дерева помеченных на удаление.
- ПомеченныеНаУдаление = ПомеченныеНаУдалениеСоСтраницыРезультатов();
- ПометкиУстанавливаютсяВыборочно = (ПомеченныеНаУдаление.Количество() > 0);
+ Отмеченные = ПомеченныеНаУдалениеСоСтраницыРезультатов();
+ ПометкиУстанавливаютсяВыборочно = (Отмеченные.Количество() > 0);
ОбработкаМенеджер = Обработки.УдалениеПомеченныхОбъектов;
@@ -1115,8 +1210,8 @@
УзлыПервогоУровня = Новый Соответствие;
- ПомеченныеНаУдаление = РезультатВыполненияВФоне.ПомеченныеНаУдаление;
- Для Каждого УдаляемыйСсылка Из ПомеченныеНаУдаление Цикл
+ ПользовательскиеОбъекты = РезультатВыполненияВФоне.ПользовательскиеОбъекты;
+ Для Каждого УдаляемыйСсылка Из ПользовательскиеОбъекты Цикл
ТипУдаляемого = ТипЗнч(УдаляемыйСсылка);
УдаляемыйИнформация = ОбработкаМенеджер.СформироватьИнформациюОТипах(РезультатВыполненияВФоне, ТипУдаляемого);
@@ -1139,7 +1234,7 @@
УзелУдаляемого.Пометка = Истина;
УзелУдаляемого.НомерКартинки = НомерКартинки(УдаляемыйСсылка, Истина, УдаляемыйИнформация.Вид, Истина);
- Если ПометкиУстанавливаютсяВыборочно И ПомеченныеНаУдаление.Найти(УдаляемыйСсылка) = Неопределено Тогда
+ Если ПометкиУстанавливаютсяВыборочно И Отмеченные.Найти(УдаляемыйСсылка) = Неопределено Тогда
УзелУдаляемого.Пометка = Ложь;
УзелТипа.Пометка = Ложь;
КонецЕсли;
diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Help/ru.html b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Help/ru.html
index 121527266..d38d1c88c 100644
--- a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Help/ru.html
+++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для окончательного удаления помеченных объектов.
В процессе работы с программой можно помечать на удаление объекты (например, ошибочно введенные). Помеченные на удаление объекты могут быть безвозвратно удалены пользователем с административными правами.
Команда Удаление помеченных объектов находится в разделе Администрирование - Поддержка и обслуживание.
diff --git a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/ManagerModule.bsl b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/ManagerModule.bsl
index 107a794b8..fd3214ec0 100644
--- a/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/ManagerModule.bsl
+++ b/SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/ManagerModule.bsl
@@ -13,7 +13,7 @@
//
Процедура УдалитьПомеченныеОбъектыИнтерактивно(ПараметрыВыполнения, АдресХранилища) Экспорт
УдалитьПомеченныеОбъекты(ПараметрыВыполнения);
- ПоместитьВоВременноеХранилище(ПараметрыВыполнения, АдресХранилища);
+ ПоместитьВоВременноеХранилище(ИзвлечьРезультат(ПараметрыВыполнения), АдресХранилища);
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
@@ -28,7 +28,7 @@
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
-// Общая механика
+// Инициализация и запуск.
// Основная механика удаления помеченных объектов.
Процедура УдалитьПомеченныеОбъекты(ПараметрыВыполнения)
@@ -39,7 +39,7 @@
ИнициализироватьПараметры(ПараметрыВыполнения);
- Если ПараметрыВыполнения.ПомеченныеНаУдаление = Неопределено Тогда
+ Если ПараметрыВыполнения.ИскатьПомеченные Тогда
ПолучитьПомеченныеНаУдаление(ПараметрыВыполнения);
КонецЕсли;
@@ -48,27 +48,45 @@
КонецЕсли;
Если ПараметрыВыполнения.Интерактивное
- И ПараметрыВыполнения.ПомеченныеНаУдаление.Количество() = 0 Тогда
+ И ПараметрыВыполнения.ВсеПомеченныеНаУдаление.Количество() = 0 Тогда
Возврат; // Не удалять технологические объекты при интерактивном запуске если нет пользовательских объектов.
КонецЕсли;
+ Если ПараметрыВыполнения.Монопольно Тогда
+ УдалитьПомеченныеОбъектыМонопольно(ПараметрыВыполнения);
+ Иначе // Не монопольно.
+ УдалитьПомеченныеОбъектыКонкурентно(ПараметрыВыполнения);
+ КонецЕсли;
+
+ Обработчики = ОбщегоНазначения.ОбработчикиСлужебногоСобытия("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов\ПослеУдаленияПомеченных");
+ Для Каждого Обработчик Из Обработчики Цикл
+ Обработчик.Модуль.ПослеУдаленияПомеченных(ПараметрыВыполнения);
+ КонецЦикла;
+
+КонецПроцедуры
+
+////////////////////////////////////////////////////////////////////////////////
+// Конкурентное удаление помеченных.
+
+// Основная механика.
+Процедура УдалитьПомеченныеОбъектыКонкурентно(ПараметрыВыполнения)
УстановитьПривилегированныйРежим(Истина);
// Удаление технологических объектов (которые создавались и помечались на удаление без участия пользователя).
Если ПараметрыВыполнения.ТехнологическиеОбъекты <> Неопределено Тогда
КлиентОтметитьНачалоОбхода(ПараметрыВыполнения, "ТехнологическиеОбъекты");
Для Каждого Ссылка Из ПараметрыВыполнения.ТехнологическиеОбъекты Цикл
- УдалитьСсылку(ПараметрыВыполнения, Ссылка);
+ УдалитьСсылку(ПараметрыВыполнения, Ссылка); // Для технологических объектов результат не выводится.
КлиентОтметитьПрогрессОбходаКоллекции(ПараметрыВыполнения, "ТехнологическиеОбъекты");
КонецЦикла;
КонецЕсли;
// Удаление помеченных на удаление.
- КлиентОтметитьНачалоОбхода(ПараметрыВыполнения, "ПомеченныеНаУдаление");
- Для Каждого Ссылка Из ПараметрыВыполнения.ПомеченныеНаУдаление Цикл
+ КлиентОтметитьНачалоОбхода(ПараметрыВыполнения, "ПользовательскиеОбъекты");
+ Для Каждого Ссылка Из ПараметрыВыполнения.ПользовательскиеОбъекты Цикл
Результат = УдалитьСсылку(ПараметрыВыполнения, Ссылка);
- ЗарегистрироватьРезультатУдаления(ПараметрыВыполнения, Ссылка, Результат, "ПомеченныеНаУдаление");
- КлиентОтметитьПрогрессОбходаКоллекции(ПараметрыВыполнения, "ПомеченныеНаУдаление");
+ ЗарегистрироватьРезультатУдаления(ПараметрыВыполнения, Ссылка, Результат, "ПользовательскиеОбъекты");
+ КлиентОтметитьПрогрессОбходаКоллекции(ПараметрыВыполнения, "ПользовательскиеОбъекты");
КонецЦикла;
// Удаление цепочек (линейно связанных объектов).
@@ -86,12 +104,6 @@
// Удаление циклов (кольцевых связей объектов).
УдалитьОставшиесяОбъектыВОднойТранзакции(ПараметрыВыполнения);
- // Подключаемые обработчики подсистем БСП.
- Обработчики = ОбщегоНазначения.ОбработчикиСлужебногоСобытия("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов\ПослеУдаленияПомеченных");
- Для Каждого Обработчик Из Обработчики Цикл
- Обработчик.Модуль.ПослеУдаленияПомеченных(ПараметрыВыполнения);
- КонецЦикла;
-
КонецПроцедуры
// Удаление одиночного объекта с контролем результата и откатом транзакции в случае неудачи.
@@ -406,144 +418,239 @@
Причина.УдаляемыйТип = ТипЗнч(Причина.УдаляемыйСсылка);
Причина.ОбнаруженныйСсылка = ТекстОшибки;
Причина.ОбнаруженныйТип = Тип("Строка");
-
СформироватьИнформациюОТипах(ПараметрыВыполнения, Причина.УдаляемыйТип);
- Иначе // Регистрация препятствующих удалению.
+ Иначе // Регистрация связей (причин не удаления) для вывода пользователю.
Для Каждого СтрокаТаблицы Из Результат.ПрепятствующиеУдалению Цикл
- // Регистрация причины неудаления.
- Причина = ПараметрыВыполнения.ПрепятствующиеУдалению.Добавить();
- ЗаполнитьЗначенияСвойств(Причина, СтрокаТаблицы);
- Причина.УдаляемыйТип = ТипЗнч(Причина.УдаляемыйСсылка);
- Причина.ОбнаруженныйТип = ТипЗнч(Причина.ОбнаруженныйСсылка);
-
- Если СтрокаТаблицы.ОбнаруженныйСсылка = Неопределено Тогда
- Если Метаданные.Константы.Содержит(СтрокаТаблицы.ОбнаруженныйМетаданные) Тогда
- Причина.ОбнаруженныйТип = Тип("КонстантаМенеджерЗначения." + СтрокаТаблицы.ОбнаруженныйМетаданные.Имя);
- Иначе
- Причина.ОбнаруженныйСсылка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Обнаружены неразрешимые ссылки (%1)'"),
- СтрокаТаблицы.ОбнаруженныйМетаданные.Представление());
- Причина.ОбнаруженныйТип = Тип("Строка");
- Продолжить;
- КонецЕсли;
- КонецЕсли;
-
- // Регистрация информации об объектах метаданных (если требуется).
- СформироватьИнформациюОТипах(ПараметрыВыполнения, Причина.УдаляемыйТип);
- ОбнаруженныйИнформация = СформироватьИнформациюОТипах(ПараметрыВыполнения, Причина.ОбнаруженныйТип);
-
- // Заполнение подчиненных полей.
- Если ОбнаруженныйИнформация.Ссылочный Тогда
- Причина.ОбнаруженныйПометкаУдаления = Причина.ОбнаруженныйСсылка.ПометкаУдаления;
- Иначе
- Причина.ОбнаруженныйПометкаУдаления = Ложь;
- КонецЕсли;
+ ЗаписатьПричинуВРезультат(ПараметрыВыполнения, СтрокаТаблицы);
КонецЦикла;
КонецЕсли;
+
КонецЕсли; // Результат.Успех.
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
-// Передача информации на клиент.
+// Монопольное удаление помеченных.
-Процедура КлиентОтметитьНачалоОбхода(ПараметрыВыполнения, ИмяКоллекции)
- Если Не ПараметрыВыполнения.Интерактивное Тогда
- Возврат;
+// Основная механика удаления помеченных объектов.
+Процедура УдалитьПомеченныеОбъектыМонопольно(ПараметрыВыполнения)
+
+ Если Не ПараметрыВыполнения.Свойство("ИсключенияПоискаСсылок") Тогда
+ ПараметрыВыполнения.Вставить("ИсключенияПоискаСсылок", ОбщегоНазначения.ПолучитьОбщийСписокИсключенийПоискаСсылок());
КонецЕсли;
- ПараметрыВыполнения.ДостигнутыйПроцент = ПараметрыВыполнения.ДостигнутыйПроцент + ПараметрыВыполнения.Диапазон;
- ПараметрыВыполнения.Диапазон = ПараметрыВыполнения.Диапазоны[ИмяКоллекции];
- Коллекция = Неопределено;
- Если ПараметрыВыполнения.Свойство(ИмяКоллекции, Коллекция) Тогда
- ПараметрыВыполнения.Всего = Коллекция.Количество();
- ПараметрыВыполнения.Номер = 0;
- Иначе
- ПараметрыВыполнения.Всего = 1;
- ПараметрыВыполнения.Номер = 0;
- КлиентОтметитьПрогрессОбходаКоллекции(ПараметрыВыполнения, ИмяКоллекции);
- КонецЕсли;
-КонецПроцедуры
-
-Процедура КлиентОтметитьПрогрессОбходаКоллекции(ПараметрыВыполнения, ИмяКоллекции)
- Если Не ПараметрыВыполнения.Интерактивное Тогда
- Возврат;
+ Если Не ПараметрыВыполнения.Свойство("ИсключающиеПравила") Тогда
+ ПараметрыВыполнения.Вставить("ИсключающиеПравила", Новый Соответствие); // Кэш правил исключений поиска.
КонецЕсли;
- // Регистрация прогресса.
- ПараметрыВыполнения.Номер = ПараметрыВыполнения.Номер + 1;
+ УдаляемыеОбъекты = ПараметрыВыполнения.ВсеПомеченныеНаУдаление;
- // Проверка что подошло время передачи информации на клиент.
- Если ТекущаяДатаСеанса() >= ПараметрыВыполнения.Время Тогда
- // Установка следующего времени передачи информации на клиент.
- ПараметрыВыполнения.Время = ПараметрыВыполнения.Время + ПараметрыВыполнения.ПериодЗаписи;
- ИначеЕсли ПараметрыВыполнения.Номер = ПараметрыВыполнения.Всего Тогда
- // Вывод последнего.
- Иначе
- Возврат;
- КонецЕсли;
-
- Процент = ПараметрыВыполнения.ДостигнутыйПроцент
- + ПараметрыВыполнения.Диапазон*ПараметрыВыполнения.Номер/ПараметрыВыполнения.Всего;
-
- // Подготовка передаваемых параметров.
- Если ИмяКоллекции = "ПередПоискомПомеченныхНаУдаление" Тогда
+ Пока УдаляемыеОбъекты.Количество() > 0 Цикл
- Текст = НСтр("ru = 'Подготовка к поиску объектов, помеченных на удаление.'");
+ КлиентОтметитьНачалоОбхода(ПараметрыВыполнения, "МонопольноеУдаление");
- ИначеЕсли ИмяКоллекции = "НайтиПомеченныеНаУдаление" Тогда
+ ПрепятствующиеУдалению = Новый ТаблицаЗначений;
- Текст = НСтр("ru = 'Поиск объектов, помеченных на удаление.'");
+ // Попытка удалить с контролем ссылочной целостности.
+ Попытка
+ УстановитьПривилегированныйРежим(Истина);
+ УдалитьОбъекты(УдаляемыеОбъекты, Истина, ПрепятствующиеУдалению);
+ УстановитьПривилегированныйРежим(Ложь);
+ Исключение
+ ЗаписатьПредупреждение(Неопределено, ИнформацияОбОшибке());
+ КонецПопытки;
- ИначеЕсли ИмяКоллекции = "ВсеПомеченныеНаУдаление" Тогда
+ // Назначение имен колонок для таблицы конфликтов, возникших при удалении.
+ ПрепятствующиеУдалению.Колонки[0].Имя = "УдаляемыйСсылка";
+ ПрепятствующиеУдалению.Колонки[1].Имя = "ОбнаруженныйСсылка";
+ ПрепятствующиеУдалению.Колонки[2].Имя = "ОбнаруженныйМетаданные";
- Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Анализ помеченных на удаление объектов: %1 из %2.'"),
- Формат(ПараметрыВыполнения.Номер, "ЧН=0; ЧГ="),
- Формат(ПараметрыВыполнения.Всего, "ЧН=0; ЧГ="));
+ ВсеСвязиВИсключениях = Истина;
- ИначеЕсли ИмяКоллекции = "ТехнологическиеОбъекты" Тогда
+ // Анализ причин не удаления (мест использования помеченных на удаление).
+ КлиентОтметитьНачалоОбхода(ПараметрыВыполнения, "ПрепятствующиеУдалению", ПрепятствующиеУдалению);
+ Для Каждого СтрокаТаблицы Из ПрепятствующиеУдалению Цикл
+ КлиентОтметитьПрогрессОбходаКоллекции(ПараметрыВыполнения, "ПрепятствующиеУдалению");
+
+ // Проверка исключающих правил.
+ Если СвязьВИсключенияхПоискаСсылок(ПараметрыВыполнения, СтрокаТаблицы) Тогда
+ Продолжить; // Связь не препятствует удалению.
+ КонецЕсли;
+
+ // Невозможно удалить объект (мешает обнаруженная ссылка или запись регистра).
+ ВсеСвязиВИсключениях = Ложь;
+
+ // Сокращение удаляемых объектов.
+ Индекс = УдаляемыеОбъекты.Найти(СтрокаТаблицы.УдаляемыйСсылка);
+ Если Индекс <> Неопределено Тогда
+ УдаляемыеОбъекты.Удалить(Индекс);
+ КонецЕсли;
+
+ // Регистрация связи для вывода пользователю.
+ ЗаписатьПричинуВРезультат(ПараметрыВыполнения, СтрокаТаблицы);
+ КонецЦикла;
- Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Подготовка к удалению (%1 из %2).'"),
- Формат(ПараметрыВыполнения.Номер, "ЧН=0; ЧГ="),
- Формат(ПараметрыВыполнения.Всего, "ЧН=0; ЧГ="));
-
- ИначеЕсли ИмяКоллекции = "ПомеченныеНаУдаление" Тогда
-
- НеУдалено = ПараметрыВыполнения.НеУдаленные.Количество();
- Если НеУдалено = 0 Тогда
- Шаблон = НСтр("ru = 'Удалено: %1 из %2 объектов.'");
- Иначе
- Шаблон = НСтр("ru = 'Обработано: %1 из %2 объектов, из них не удалено: %3.'");
+ // Удаление без контроля, если все связи в исключениях поиска ссылок.
+ Если ВсеСвязиВИсключениях Тогда
+ Попытка
+ УстановитьПривилегированныйРежим(Истина);
+ УдалитьОбъекты(УдаляемыеОбъекты, Ложь);
+ УстановитьПривилегированныйРежим(Ложь);
+ Исключение
+ ЗаписатьПредупреждение(Неопределено, ИнформацияОбОшибке());
+ КонецПопытки;
+ Прервать; // Выход из цикла.
КонецЕсли;
- Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- Шаблон,
- Формат(ПараметрыВыполнения.Номер, "ЧН=0; ЧГ="),
- Формат(ПараметрыВыполнения.Всего, "ЧН=0; ЧГ="),
- Формат(НеУдалено, "ЧН=0; ЧГ="));
+ КонецЦикла;
+
+ ПараметрыВыполнения.Вставить("Удаленные", УдаляемыеОбъекты);
+ ПараметрыВыполнения.Удалить("ИсключенияПоискаСсылок");
+ ПараметрыВыполнения.Удалить("ИсключающиеПравила");
+
+КонецПроцедуры
+
+// Проверяет что связь в исключениях.
+Функция СвязьВИсключенияхПоискаСсылок(ПараметрыВыполнения, СтрокаТаблицы)
+ // Определение исключающего правила для объекта метаданных, препятствующего удалению:
+ // Для регистров (т.н. "необъектных таблиц") - массива реквизитов для поиска в записи регистра.
+ // Для ссылочных типов (т.н. "объектных таблиц") - готового запроса для поиска в реквизитах.
+ Правило = ПараметрыВыполнения.ИсключающиеПравила[СтрокаТаблицы.ОбнаруженныйМетаданные]; // Кэш.
+ Если Правило = Неопределено Тогда
+ Правило = СформироватьИсключающееПравило(ПараметрыВыполнения, СтрокаТаблицы);
+ ПараметрыВыполнения.ИсключающиеПравила.Вставить(СтрокаТаблицы.ОбнаруженныйМетаданные, Правило);
+ КонецЕсли;
+
+ // Проверка исключающего правила.
+ Если Правило = "*" Тогда
+ Возврат Истина; // Можно удалять (обнаруженный объект метаданных не мешает).
+ ИначеЕсли ТипЗнч(Правило) = Тип("Массив") Тогда // Имена измерений регистра.
+ Для Каждого ИмяРеквизита Из Правило Цикл
+ Если СтрокаТаблицы.ОбнаруженныйСсылка[ИмяРеквизита] = СтрокаТаблицы.УдаляемыйСсылка Тогда
+ Возврат Истина; // Можно удалять (обнаруженная запись регистра не мешает).
+ КонецЕсли;
+ КонецЦикла;
+ ИначеЕсли ТипЗнч(Правило) = Тип("Запрос") Тогда // Запрос к ссылочному объекту.
+ Правило.УстановитьПараметр("УдаляемыйСсылка", СтрокаТаблицы.УдаляемыйСсылка);
+ Правило.УстановитьПараметр("ОбнаруженныйСсылка", СтрокаТаблицы.ОбнаруженныйСсылка);
+ Если НЕ Правило.Выполнить().Пустой() Тогда
+ Возврат Истина; // Можно удалять (обнаруженная ссылка не мешает).
+ КонецЕсли;
+ КонецЕсли;
+
+ Возврат Ложь;
+КонецФункции
+
+// Компонует правило оптимально для проверки.
+Функция СформироватьИсключающееПравило(ПараметрыВыполнения, СтрокаТаблицы)
+ ИсключениеПоиска = ПараметрыВыполнения.ИсключенияПоискаСсылок[СтрокаТаблицы.ОбнаруженныйМетаданные];
+ Если ИсключениеПоиска = "*" Тогда
+ Возврат "*"; // Можно удалять (обнаруженный объект метаданных не мешает).
+ КонецЕсли;
+
+ // Формирование исключающего правила.
+ ЭтоРегистрСведений = Метаданные.РегистрыСведений.Содержит(СтрокаТаблицы.ОбнаруженныйМетаданные);
+ Если ЭтоРегистрСведений
+ Или Метаданные.РегистрыБухгалтерии.Содержит(СтрокаТаблицы.ОбнаруженныйМетаданные) // ЭтоРегистрБухгалтерии
+ Или Метаданные.РегистрыНакопления.Содержит(СтрокаТаблицы.ОбнаруженныйМетаданные) Тогда // ЭтоРегистрНакопления
- ИначеЕсли ИмяКоллекции = "ПовторноУдаляемые" Тогда
+ Правило = Новый Массив;
+ Если ЭтоРегистрСведений Тогда
+ Для Каждого Измерение Из СтрокаТаблицы.ОбнаруженныйМетаданные.Измерения Цикл
+ Если Измерение.Ведущее Тогда
+ Правило.Добавить(Измерение.Имя);
+ КонецЕсли;
+ КонецЦикла;
+ Иначе
+ Для Каждого Измерение Из СтрокаТаблицы.ОбнаруженныйМетаданные.Измерения Цикл
+ Правило.Добавить(Измерение.Имя);
+ КонецЦикла;
+ КонецЕсли;
- Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru = 'Повторная проверка не удаленных объектов: %1 из %2.'"),
- Формат(ПараметрыВыполнения.Номер, "ЧН=0; ЧГ="),
- Формат(ПараметрыВыполнения.Всего, "ЧН=0; ЧГ="));
+ Если ТипЗнч(ИсключениеПоиска) = Тип("Массив") Тогда
+ Для Каждого ИмяРеквизита Из ИсключениеПоиска Цикл
+ Если Правило.Найти(ИмяРеквизита) = Неопределено Тогда
+ Правило.Добавить(ИмяРеквизита);
+ КонецЕсли;
+ КонецЦикла;
+ КонецЕсли;
+
+ ИначеЕсли ТипЗнч(ИсключениеПоиска) = Тип("Массив") Тогда
+
+ ТекстыЗапросов = Новый Соответствие;
+ ИмяКорневойТаблицы = СтрокаТаблицы.ОбнаруженныйМетаданные.ПолноеИмя();
+
+ Для Каждого ПутьКРеквизиту Из ИсключениеПоиска Цикл
+ ПозицияТочки = Найти(ПутьКРеквизиту, ".");
+ Если ПозицияТочки = 0 Тогда
+ ПолноеИмяТаблицы = ИмяКорневойТаблицы;
+ ИмяРеквизита = ПутьКРеквизиту;
+ Иначе
+ ПолноеИмяТаблицы = ИмяКорневойТаблицы + "." + Лев(ПутьКРеквизиту, ПозицияТочки - 1);
+ ИмяРеквизита = Сред(ПутьКРеквизиту, ПозицияТочки + 1);
+ КонецЕсли;
+
+ ТекстВложенногоЗапроса = ТекстыЗапросов.Получить(ПолноеИмяТаблицы);
+ Если ТекстВложенногоЗапроса = Неопределено Тогда
+ ТекстВложенногоЗапроса =
+ "ВЫБРАТЬ ПЕРВЫЕ 1
+ | 1
+ |ИЗ
+ | "+ ПолноеИмяТаблицы +" КАК Таблица
+ |ГДЕ
+ | Таблица.Ссылка = &ОбнаруженныйСсылка
+ | И (";
+ Иначе
+ ТекстВложенногоЗапроса = ТекстВложенногоЗапроса + Символы.ПС + Символы.Таб + Символы.Таб + "ИЛИ ";
+ КонецЕсли;
+ ТекстВложенногоЗапроса = ТекстВложенногоЗапроса + "Таблица." + ИмяРеквизита + " = &УдаляемыйСсылка";
+
+ ТекстыЗапросов.Вставить(ПолноеИмяТаблицы, ТекстВложенногоЗапроса);
+ КонецЦикла;
+
+ ТекстЗапроса = "";
+ Для Каждого КлючИЗначение Из ТекстыЗапросов Цикл
+ Если ТекстЗапроса <> "" Тогда
+ ТекстЗапроса = ТекстЗапроса + Символы.ПС + Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС + Символы.ПС;
+ КонецЕсли;
+ ТекстЗапроса = ТекстЗапроса + КлючИЗначение.Значение + ")";
+ КонецЦикла;
+
+ Правило = Новый Запрос;
+ Правило.Текст = ТекстЗапроса;
Иначе
- Возврат;
+ Правило = "";
КонецЕсли;
- // Регистрация сообщения для чтения из клиентского сеанса.
- ДлительныеОперации.СообщитьПрогресс(Процент, Текст);
-КонецПроцедуры
+ Возврат Правило;
+КонецФункции
////////////////////////////////////////////////////////////////////////////////
-// Служебные методы
+// Общая механика.
// Инициализирует структуру параметров, необходимых для выполнения других служебных методов.
Процедура ИнициализироватьПараметры(ПараметрыВыполнения) Экспорт
// Определение параметров работы программы.
+ Если Не ПараметрыВыполнения.Свойство("ИскатьПомеченные") Тогда
+ ПараметрыВыполнения.Вставить("ИскатьПомеченные", Истина);
+ КонецЕсли;
+ Если Не ПараметрыВыполнения.Свойство("УдалятьПомеченные") Тогда
+ ПараметрыВыполнения.Вставить("УдалятьПомеченные", Истина);
+ КонецЕсли;
+ Если Не ПараметрыВыполнения.Свойство("Монопольно") Тогда
+ ПараметрыВыполнения.Вставить("Монопольно", Ложь);
+ КонецЕсли;
+ Если Не ПараметрыВыполнения.Свойство("ТехнологическиеОбъекты") Тогда
+ ПараметрыВыполнения.Вставить("ТехнологическиеОбъекты", Новый Массив);
+ КонецЕсли;
+ Если Не ПараметрыВыполнения.Свойство("ПользовательскиеОбъекты") Тогда
+ ПараметрыВыполнения.Вставить("ПользовательскиеОбъекты", Новый Массив);
+ КонецЕсли;
+ Если Не ПараметрыВыполнения.Свойство("ВсеПомеченныеНаУдаление") Тогда
+ ПараметрыВыполнения.Вставить("ВсеПомеченныеНаУдаление", Новый Массив);
+ ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ПараметрыВыполнения.ВсеПомеченныеНаУдаление, ПараметрыВыполнения.ТехнологическиеОбъекты);
+ ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ПараметрыВыполнения.ВсеПомеченныеНаУдаление, ПараметрыВыполнения.ПользовательскиеОбъекты);
+ КонецЕсли;
Если Не ПараметрыВыполнения.Свойство("МодельСервиса") Тогда
ПараметрыВыполнения.Вставить("МодельСервиса", ОбщегоНазначенияПовтИсп.РазделениеВключено());
Если ПараметрыВыполнения.МодельСервиса Тогда
@@ -552,18 +659,9 @@
ПараметрыВыполнения.Вставить("РазделительВспомогательныхДанных", ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных());
КонецЕсли;
КонецЕсли;
- Если Не ПараметрыВыполнения.Свойство("ПомеченныеНаУдаление") Тогда
- ПараметрыВыполнения.Вставить("ПомеченныеНаУдаление", Неопределено);
- КонецЕсли;
Если Не ПараметрыВыполнения.Свойство("ИнформацияОТипах") Тогда
ПараметрыВыполнения.Вставить("ИнформацияОТипах", Новый Соответствие);
КонецЕсли;
- Если Не ПараметрыВыполнения.Свойство("ТехнологическиеОбъекты") Тогда
- ПараметрыВыполнения.Вставить("ТехнологическиеОбъекты", Неопределено);
- КонецЕсли;
- Если Не ПараметрыВыполнения.Свойство("ВсеПомеченныеНаУдаление") Тогда
- ПараметрыВыполнения.Вставить("ВсеПомеченныеНаУдаление", Неопределено);
- КонецЕсли;
ПрепятствующиеУдалению = Новый ТаблицаЗначений;
ПрепятствующиеУдалению.Колонки.Добавить("УдаляемыйСсылка");
@@ -578,38 +676,11 @@
ПараметрыВыполнения.Вставить("ПовторноУдаляемые", Новый Массив);
ПараметрыВыполнения.Вставить("Интерактивное", ПараметрыВыполнения.Свойство("ПериодЗаписи"));
- Если ПараметрыВыполнения.Интерактивное Тогда
- ПараметрыВыполнения.Вставить("ДостигнутыйПроцент", 0);
- ПараметрыВыполнения.Вставить("Диапазон", 0);
- ПараметрыВыполнения.Вставить("Всего", 0);
- ПараметрыВыполнения.Вставить("Номер", 0);
- ПараметрыВыполнения.Вставить("Время", ТекущаяДатаСеанса() - 0.1);
-
- ПараметрыВыполнения.Вставить("Диапазоны", Новый Соответствие);
- Если ПараметрыВыполнения.ИскатьПомеченные И ПараметрыВыполнения.УдалятьПомеченные Тогда
- ПараметрыВыполнения.Диапазоны.Вставить("ПередПоискомПомеченныхНаУдаление", 5);
- ПараметрыВыполнения.Диапазоны.Вставить("ПоискПомеченныхНаУдаление", 4);
- ПараметрыВыполнения.Диапазоны.Вставить("ВсеПомеченныеНаУдаление", 1);
- ПараметрыВыполнения.Диапазоны.Вставить("ТехнологическиеОбъекты", 10);
- ПараметрыВыполнения.Диапазоны.Вставить("ПомеченныеНаУдаление", 70);
- ПараметрыВыполнения.Диапазоны.Вставить("ПовторноУдаляемые", 10);
- ИначеЕсли ПараметрыВыполнения.УдалятьПомеченные Тогда
- ПараметрыВыполнения.Диапазоны.Вставить("ТехнологическиеОбъекты", 10);
- ПараметрыВыполнения.Диапазоны.Вставить("ПомеченныеНаУдаление", 80);
- ПараметрыВыполнения.Диапазоны.Вставить("ПовторноУдаляемые", 10);
- ИначеЕсли ПараметрыВыполнения.ИскатьПомеченные Тогда
- ПараметрыВыполнения.Диапазоны.Вставить("ПередПоискомПомеченныхНаУдаление", 30);
- ПараметрыВыполнения.Диапазоны.Вставить("ПоискПомеченныхНаУдаление", 40);
- ПараметрыВыполнения.Диапазоны.Вставить("ВсеПомеченныеНаУдаление", 30);
- КонецЕсли;
- КонецЕсли;
-
+ КлиентИнициализироватьПараметры(ПараметрыВыполнения);
КонецПроцедуры
// Формирует массив помеченных на удаление с учетом разделения.
Процедура ПолучитьПомеченныеНаУдаление(ПараметрыВыполнения) Экспорт
- ПараметрыВыполнения.ПомеченныеНаУдаление = Новый Массив;
- ПараметрыВыполнения.ТехнологическиеОбъекты = Новый Массив;
КлиентОтметитьНачалоОбхода(ПараметрыВыполнения, "ПередПоискомПомеченныхНаУдаление");
УдалениеПомеченныхОбъектовПереопределяемый.ПередПоискомПомеченныхНаУдаление(ПараметрыВыполнения);
@@ -622,31 +693,37 @@
// Распределение помеченных на удаление по коллекциям.
КлиентОтметитьНачалоОбхода(ПараметрыВыполнения, "ВсеПомеченныеНаУдаление");
- Для Каждого Ссылка Из ПараметрыВыполнения.ВсеПомеченныеНаУдаление Цикл
+ Количество = ПараметрыВыполнения.ВсеПомеченныеНаУдаление.Количество();
+ Для Номер = 1 По Количество Цикл
+ ОбратныйИндекс = Количество - Номер;
+ Ссылка = ПараметрыВыполнения.ВсеПомеченныеНаУдаление[ОбратныйИндекс];
+
Информация = СформироватьИнформациюОТипах(ПараметрыВыполнения, ТипЗнч(Ссылка));
КлиентОтметитьПрогрессОбходаКоллекции(ПараметрыВыполнения, "ВсеПомеченныеНаУдаление");
Если ПараметрыВыполнения.МодельСервиса
- И ПараметрыВыполнения.ВОбластиДанных
+ И ПараметрыВыполнения.ВОбластиДанных
И Не Информация.Разделенный Тогда
+ ПараметрыВыполнения.ВсеПомеченныеНаУдаление.Удалить(ОбратныйИндекс);
Продолжить; // Неразделенные объекты запрещено изменять из области данных.
КонецЕсли;
Если Информация.ЕстьПредопределенные И Информация.Предопределенные.Найти(Ссылка) <> Неопределено Тогда
+ ПараметрыВыполнения.ВсеПомеченныеНаУдаление.Удалить(ОбратныйИндекс);
Продолжить; // Предопределенные элементы создаются и удаляются только автоматически.
КонецЕсли;
Если Информация.Технический = Истина Тогда
ПараметрыВыполнения.ТехнологическиеОбъекты.Добавить(Ссылка);
Иначе
- ПараметрыВыполнения.ПомеченныеНаУдаление.Добавить(Ссылка);
+ ПараметрыВыполнения.ПользовательскиеОбъекты.Добавить(Ссылка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Формирует информацию о типе объекта метаданных, как то: полное имя, представления, вид и т.п.
Функция СформироватьИнформациюОТипах(ПараметрыВыполнения, Тип) Экспорт
- Информация = ПараметрыВыполнения.ИнформацияОТипах.Получить(Тип);
+ Информация = ПараметрыВыполнения.ИнформацияОТипах.Получить(Тип); // Кэш.
Если Информация <> Неопределено Тогда
Возврат Информация;
КонецЕсли;
@@ -779,6 +856,197 @@
ТекстДляЖурнала);
КонецПроцедуры
+// Регистрация причины неудаления.
+Процедура ЗаписатьПричинуВРезультат(ПараметрыВыполнения, СтрокаТаблицы)
+ УдаляемыйТип = ТипЗнч(СтрокаТаблицы.УдаляемыйСсылка);
+ УдаляемыйИнформация = СформироватьИнформациюОТипах(ПараметрыВыполнения, УдаляемыйТип);
+ Если УдаляемыйИнформация.Технический Тогда
+ Возврат;
+ КонецЕсли;
+
+ // Добавление не удаленных объектов.
+ Если ПараметрыВыполнения.НеУдаленные.Найти(СтрокаТаблицы.УдаляемыйСсылка) = Неопределено Тогда
+ ПараметрыВыполнения.НеУдаленные.Добавить(СтрокаТаблицы.УдаляемыйСсылка);
+ КонецЕсли;
+
+ Причина = ПараметрыВыполнения.ПрепятствующиеУдалению.Добавить();
+ ЗаполнитьЗначенияСвойств(Причина, СтрокаТаблицы);
+ Причина.УдаляемыйТип = УдаляемыйТип;
+ Причина.ОбнаруженныйТип = ТипЗнч(Причина.ОбнаруженныйСсылка);
+
+ Если СтрокаТаблицы.ОбнаруженныйСсылка = Неопределено Тогда
+ Если Метаданные.Константы.Содержит(СтрокаТаблицы.ОбнаруженныйМетаданные) Тогда
+ Причина.ОбнаруженныйТип = Тип("КонстантаМенеджерЗначения." + СтрокаТаблицы.ОбнаруженныйМетаданные.Имя);
+ Иначе
+ Причина.ОбнаруженныйСсылка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Обнаружены неразрешимые ссылки (%1)'"),
+ СтрокаТаблицы.ОбнаруженныйМетаданные.Представление());
+ Причина.ОбнаруженныйТип = Тип("Строка");
+ Возврат;
+ КонецЕсли;
+ КонецЕсли;
+
+ // Регистрация информации об объектах метаданных (если требуется).
+ ОбнаруженныйИнформация = СформироватьИнформациюОТипах(ПараметрыВыполнения, Причина.ОбнаруженныйТип);
+
+ // Заполнение подчиненных полей.
+ Если ОбнаруженныйИнформация.Ссылочный Тогда
+ Причина.ОбнаруженныйПометкаУдаления = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Причина.ОбнаруженныйСсылка, "ПометкаУдаления");
+ Иначе
+ Причина.ОбнаруженныйПометкаУдаления = Ложь;
+ КонецЕсли;
+КонецПроцедуры
+
+// Основная механика удаления помеченных объектов.
+Функция ИзвлечьРезультат(ПараметрыВыполнения)
+ РезультатУдаления = ПараметрыВыполнения;
+ РезультатУдаления.Удалить("ВсеПомеченныеНаУдаление");
+ РезультатУдаления.Удалить("ВсеПомеченныеНаУдаление");
+ Возврат РезультатУдаления;
+КонецФункции
+
+////////////////////////////////////////////////////////////////////////////////
+// Передача информации на клиент.
+
+// Инициализирует структуру параметров, необходимых для передачи на клиент.
+Процедура КлиентИнициализироватьПараметры(ПараметрыВыполнения)
+ Если Не ПараметрыВыполнения.Интерактивное Тогда
+ Возврат;
+ КонецЕсли;
+
+ ПараметрыВыполнения.Вставить("ДостигнутыйПроцент", 0);
+ ПараметрыВыполнения.Вставить("Диапазон", 0);
+ ПараметрыВыполнения.Вставить("Всего", 0);
+ ПараметрыВыполнения.Вставить("Номер", 0);
+ ПараметрыВыполнения.Вставить("Время", ТекущаяДатаСеанса() - 0.1);
+
+ ПараметрыВыполнения.Вставить("Диапазоны", Новый Соответствие);
+
+ ОбщийВес = 0;
+ Если ПараметрыВыполнения.ИскатьПомеченные Тогда
+ ПараметрыВыполнения.Диапазоны.Вставить("ПередПоискомПомеченныхНаУдаление", 5);
+ ПараметрыВыполнения.Диапазоны.Вставить("ПоискПомеченныхНаУдаление", 4);
+ ПараметрыВыполнения.Диапазоны.Вставить("ВсеПомеченныеНаУдаление", 1);
+ ОбщийВес = ОбщийВес + 10;
+ КонецЕсли;
+ Если ПараметрыВыполнения.УдалятьПомеченные Тогда
+ Если ПараметрыВыполнения.Монопольно Тогда
+ ПараметрыВыполнения.Диапазоны.Вставить("МонопольноеУдаление", 80);
+ ПараметрыВыполнения.Диапазоны.Вставить("ПрепятствующиеУдалению", 10);
+ Иначе // Не монопольно.
+ ПараметрыВыполнения.Диапазоны.Вставить("ТехнологическиеОбъекты", 10);
+ ПараметрыВыполнения.Диапазоны.Вставить("ПользовательскиеОбъекты", 70);
+ ПараметрыВыполнения.Диапазоны.Вставить("ПовторноУдаляемые", 10);
+ КонецЕсли;
+ ОбщийВес = ОбщийВес + 90;
+ КонецЕсли;
+ Если ОбщийВес <> 0 И ОбщийВес <> 100 Тогда
+ Коэффициент = 100/ОбщийВес;
+ Для Каждого КлючИЗначение Из ПараметрыВыполнения.Диапазоны Цикл
+ ПараметрыВыполнения.Диапазоны.Вставить(КлючИЗначение.Ключ, Окр(КлючИЗначение.Значение*Коэффициент, 0));
+ КонецЦикла;
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Регистрирует начало процесса.
+Процедура КлиентОтметитьНачалоОбхода(ПараметрыВыполнения, ИмяКоллекции, Коллекция = Неопределено)
+ Если Не ПараметрыВыполнения.Интерактивное Тогда
+ Возврат;
+ КонецЕсли;
+ ПараметрыВыполнения.ДостигнутыйПроцент = ПараметрыВыполнения.ДостигнутыйПроцент + ПараметрыВыполнения.Диапазон;
+ ПараметрыВыполнения.Диапазон = ПараметрыВыполнения.Диапазоны[ИмяКоллекции];
+ Если Коллекция <> Неопределено Или ПараметрыВыполнения.Свойство(ИмяКоллекции, Коллекция) Тогда
+ ПараметрыВыполнения.Всего = Коллекция.Количество();
+ ПараметрыВыполнения.Номер = 0;
+ Иначе
+ ПараметрыВыполнения.Всего = 1;
+ ПараметрыВыполнения.Номер = 0;
+ КлиентОтметитьПрогрессОбходаКоллекции(ПараметрыВыполнения, ИмяКоллекции);
+ КонецЕсли;
+КонецПроцедуры
+
+// Регистрирует прогресс.
+Процедура КлиентОтметитьПрогрессОбходаКоллекции(ПараметрыВыполнения, ИмяКоллекции)
+ Если Не ПараметрыВыполнения.Интерактивное Тогда
+ Возврат;
+ КонецЕсли;
+
+ // Регистрация прогресса.
+ ПараметрыВыполнения.Номер = ПараметрыВыполнения.Номер + 1;
+
+ // Проверка что подошло время передачи информации на клиент.
+ Если ТекущаяДатаСеанса() >= ПараметрыВыполнения.Время Тогда
+ // Установка следующего времени передачи информации на клиент.
+ ПараметрыВыполнения.Время = ПараметрыВыполнения.Время + ПараметрыВыполнения.ПериодЗаписи;
+ ИначеЕсли ПараметрыВыполнения.Номер = ПараметрыВыполнения.Всего Тогда
+ // Вывод последнего.
+ Иначе
+ Возврат;
+ КонецЕсли;
+
+ Процент = ПараметрыВыполнения.ДостигнутыйПроцент
+ + ПараметрыВыполнения.Диапазон*ПараметрыВыполнения.Номер/ПараметрыВыполнения.Всего;
+
+ // Подготовка передаваемых параметров.
+ Если ИмяКоллекции = "ПередПоискомПомеченныхНаУдаление" Тогда
+
+ Текст = НСтр("ru = 'Подготовка к поиску объектов, помеченных на удаление.'");
+
+ ИначеЕсли ИмяКоллекции = "НайтиПомеченныеНаУдаление" Тогда
+
+ Текст = НСтр("ru = 'Поиск объектов, помеченных на удаление.'");
+
+ ИначеЕсли ИмяКоллекции = "ВсеПомеченныеНаУдаление" Тогда
+
+ Текст = НСтр("ru = 'Анализ помеченных на удаление.'");
+
+ ИначеЕсли ИмяКоллекции = "ТехнологическиеОбъекты" Тогда
+
+ Текст = НСтр("ru = 'Подготовка к удалению.'");
+
+ ИначеЕсли ИмяКоллекции = "МонопольноеУдаление" Тогда
+
+ Текст = НСтр("ru = 'Выполняется удаление объектов.'");
+
+ ИначеЕсли ИмяКоллекции = "ПользовательскиеОбъекты" Тогда
+
+ НеУдалено = ПараметрыВыполнения.НеУдаленные.Количество();
+ Если НеУдалено = 0 Тогда
+ Шаблон = НСтр("ru = 'Удалено: %1 из %2 объектов.'");
+ Иначе
+ Шаблон = НСтр("ru = 'Обработано: %1 из %2 объектов, из них не удалено: %3.'");
+ КонецЕсли;
+ Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ Шаблон,
+ Формат(ПараметрыВыполнения.Номер, "ЧН=0; ЧГ="),
+ Формат(ПараметрыВыполнения.Всего, "ЧН=0; ЧГ="),
+ Формат(НеУдалено, "ЧН=0; ЧГ="));
+
+ ИначеЕсли ИмяКоллекции = "ПовторноУдаляемые" Тогда
+
+ Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Повторная проверка не удаленных объектов: %1 из %2.'"),
+ Формат(ПараметрыВыполнения.Номер, "ЧН=0; ЧГ="),
+ Формат(ПараметрыВыполнения.Всего, "ЧН=0; ЧГ="));
+
+ ИначеЕсли ИмяКоллекции = "ПрепятствующиеУдалению" Тогда
+
+ Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Анализ объектов, препятствующих удалению: %1 из %2.'"),
+ Формат(ПараметрыВыполнения.Номер, "ЧН=0; ЧГ="),
+ Формат(ПараметрыВыполнения.Всего, "ЧН=0; ЧГ="));
+
+ Иначе
+
+ Возврат;
+
+ КонецЕсли;
+
+ // Регистрация сообщения для чтения из клиентского сеанса.
+ ДлительныеОперации.СообщитьПрогресс(Процент, Текст);
+КонецПроцедуры
+
#КонецОбласти
#КонецЕсли
diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФорма/Module.bsl b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФорма/Module.bsl
index 700766783..a992901fc 100644
--- a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФорма/Module.bsl
+++ b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФорма/Module.bsl
@@ -723,17 +723,39 @@
//
&НаКлиенте
Процедура ОткрытьВПриложении(ИмяФайла, СтандартнаяОбработка = Ложь)
-
- Файл = Новый Файл(ИмяФайла);
-
- Если Файл.Существует() Тогда
-
- ЗапуститьПриложение(ИмяФайла);
-
- КонецЕсли;
СтандартнаяОбработка = Ложь;
+ ДополнительныеПараметры = Новый Структура();
+ ДополнительныеПараметры.Вставить("ИмяФайла", ИмяФайла);
+ ДополнительныеПараметры.Вставить("ОписаниеОповещения", Новый ОписаниеОповещения("ОткрытьКаталогСФайлом", ЭтаФорма, ДополнительныеПараметры));
+
+ Файл = Новый Файл();
+ Файл.НачатьИнициализацию(Новый ОписаниеОповещения("ПроверитьСуществованиеФайла", ЭтаФорма, ДополнительныеПараметры), ИмяФайла);
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+&НаКлиенте
+Процедура ПроверитьСуществованиеФайла(Файл, ДополнительныеПараметры) Экспорт
+ ОписаниеОповещения = Новый ОписаниеОповещения("ПослеОпределенияСуществованияФайла", ЭтаФорма, ДополнительныеПараметры);
+ Файл.НачатьПроверкуСуществования(ОписаниеОповещения);
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+&НаКлиенте
+Процедура ПослеОпределенияСуществованияФайла(Существует, ДополнительныеПараметры) Экспорт
+
+ Если Существует Тогда
+ НачатьЗапускПриложения(ДополнительныеПараметры.ОписаниеОповещения, ДополнительныеПараметры.ИмяФайла);
+ КонецЕсли;
+
+КонецПроцедуры
+
+// Продолжение процедуры (см. выше).
+&НаКлиенте
+Процедура ОткрытьКаталогСФайлом(КодВозврата, ДополнительныеПараметры) Экспорт
+ // Обработка не требуется.
КонецПроцедуры
&НаКлиенте
diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФормаНастройкиОтладкиОбработчиков/Module.bsl b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФормаНастройкиОтладкиОбработчиков/Module.bsl
index f0dd79880..c1cf689cf 100644
--- a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФормаНастройкиОтладкиОбработчиков/Module.bsl
+++ b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФормаНастройкиОтладкиОбработчиков/Module.bsl
@@ -199,22 +199,49 @@
&НаКлиенте
Процедура ПоказатьОбработчикиСобытийВОкне()
- ФайлОбработчиков = Новый Файл(Объект.ИмяВременногоФайлаОбработчиковСобытий);
- Если ФайлОбработчиков.Существует() И ФайлОбработчиков.Размер() <> 0 Тогда
- ТекстовыйДокумент = Новый ТекстовыйДокумент;
- ТекстовыйДокумент.Прочитать(Объект.ИмяВременногоФайлаОбработчиковСобытий);
- ТекстовыйДокумент.Показать(Нстр("ru = 'Модуль отладки обработчиков'"));
+ ОбработчикиСобытий = ОбработчикиСобытий();
+ Если ОбработчикиСобытий <> Неопределено Тогда
+ ОбработчикиСобытий.Показать(Нстр("ru = 'Модуль отладки обработчиков'"));
КонецЕсли;
- ФайлОшибок = Новый Файл(Объект.ИмяВременногоФайлаПротоколаОбмена);
- Если ФайлОшибок.Существует() И ФайлОшибок.Размер() <> 0 Тогда
- ТекстовыйДокумент = Новый ТекстовыйДокумент;
- ТекстовыйДокумент.Прочитать(Объект.ИмяВременногоФайлаОбработчиковСобытий);
- ТекстовыйДокумент.Показать(Нстр("ru = 'Ошибки выгрузки модуля обработчиков'"));
+
+ ПротоколОбмена = ПротоколОбмена();
+ Если ПротоколОбмена <> Неопределено Тогда
+ ПротоколОбмена.Показать(Нстр("ru = 'Ошибки выгрузки модуля обработчиков'"));
КонецЕсли;
КонецПроцедуры
+&НаСервере
+Функция ОбработчикиСобытий()
+
+ ОбработчикиСобытий = Неопределено;
+
+ ФайлОбработчиков = Новый Файл(Объект.ИмяВременногоФайлаОбработчиковСобытий);
+ Если ФайлОбработчиков.Существует() И ФайлОбработчиков.Размер() <> 0 Тогда
+ ОбработчикиСобытий = Новый ТекстовыйДокумент;
+ ОбработчикиСобытий.Прочитать(Объект.ИмяВременногоФайлаОбработчиковСобытий);
+ КонецЕсли;
+
+ Возврат ОбработчикиСобытий;
+
+КонецФункции
+
+&НаСервере
+Функция ПротоколОбмена()
+
+ ПротоколОбмена = Неопределено;
+
+ ФайлОшибок = Новый Файл(Объект.ИмяВременногоФайлаПротоколаОбмена);
+ Если ФайлОшибок.Существует() И ФайлОшибок.Размер() <> 0 Тогда
+ ПротоколОбмена = Новый ТекстовыйДокумент;
+ ПротоколОбмена.Прочитать(Объект.ИмяВременногоФайлаОбработчиковСобытий);
+ КонецЕсли;
+
+ Возврат ПротоколОбмена;
+
+КонецФункции
+
&НаСервере
Процедура ВыгрузитьОбработчикиСобытийНаСервере(Отказ)
diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Help/ru.html b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Help/ru.html
index 8e2ff73a3..246f42b4c 100644
--- a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Help/ru.html
+++ b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Обработка "Универсальный обмен данными в формате XML" предназначена для загрузки и выгрузки данных в файл из любой конфигурации, реализованной на платформе 1С:Предприятие 8.
Режим работы
При использовании управляемой формы обработка имеет два режим работы: 1. На клиенте. При использовании этого режима файлы правил и загружаемых данных передаются с клиента на сервер, а файл выгружаемых данных передается с сервера на клиент. Пути к этим файлам, находящимся на клиенте, необходимо указывать в диалоговом окне непосредственно перед выполнением действия. 2. На сервере. В этом режиме файлы не передаются на клиент и пути к ним необходимо указывать на сервере. Примечание: Файл внешней обработки и файлы протоколов обмена всегда должны находиться на сервере вне зависимости от режима работы.
diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/ObjectModule.bsl b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/ObjectModule.bsl
index df126c756..408dffd85 100644
--- a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/ObjectModule.bsl
+++ b/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/ObjectModule.bsl
@@ -2955,25 +2955,25 @@
мМакетОбщиеПроцедурыФункции = ПолучитьМакет("ОбщиеПроцедурыФункции");
- // Выводим комментарии
+ // Выводим комментарии.
ДобавитьВПотокКомментарий(Результат, "Шапка");
ДобавитьВПотокКомментарий(Результат, "ПеременныеОбработки");
- // Выводим служебный код
+ // Выводим служебный код.
ДобавитьВПотокСлужебныйКод(Результат, "ПеременныеОбработки");
// Выгружаем глобальные обработчики.
ВыгрузитьОбработчикиКонвертации(Результат);
- //Выгружаем ПВД
+ // Выгружаем ПВД.
ДобавитьВПотокКомментарий(Результат, "ПВД", ТаблицаПравилВыгрузки.Строки.Количество() <> 0);
ВыгрузитьОбработчикиПравилВыгрузкиДанных(Результат, ТаблицаПравилВыгрузки.Строки);
- //Выгружаем ПОД
+ // Выгружаем ПОД.
ДобавитьВПотокКомментарий(Результат, "ПОД", ТаблицаПравилОчистки.Строки.Количество() <> 0);
ВыгрузитьОбработчикиПравилОчисткиДанных(Результат, ТаблицаПравилОчистки.Строки);
- //Выгружаем ПКО, ПКС, ПКГС
+ // Выгружаем ПКО, ПКС, ПКГС.
ВыгрузитьОбработчикиПравилКонвертации(Результат);
Если РежимОтладкиАлгоритмов = мРежимыОтладкиАлгоритмов.ПроцедурныйВызов Тогда
@@ -3161,9 +3161,9 @@
ВывестиКомментарий = ТаблицаПравилКонвертации.Количество() <> 0;
- //Выгружаем ПКО
+ // Выгружаем ПКО.
ДобавитьВПотокКомментарий(Результат, "ПКО", ВывестиКомментарий);
-
+
Для Каждого ПКО Из ТаблицаПравилКонвертации Цикл
Для Каждого Элемент Из ИменаОбработчиков.ПКО Цикл
@@ -3174,7 +3174,7 @@
КонецЦикла;
- // Выгружаем ПКС и ПКГС
+ // Выгружаем ПКС и ПКГС.
ДобавитьВПотокКомментарий(Результат, "ПКС", ВывестиКомментарий);
Для Каждого ПКО Из ТаблицаПравилКонвертации Цикл
@@ -4860,7 +4860,7 @@
Пока ФайлОбмена.Прочитать() Цикл
ИмяУзла = ФайлОбмена.ЛокальноеИмя;
-
+
Если ИмяУзла = "Значение" Тогда
ИскатьПоСвойству = одАтрибут(ФайлОбмена, одТипСтрока, "Свойство");
@@ -5692,7 +5692,11 @@
Процедура ОбработатьУстановкуСвойствПоискаУОбъекта(УстанавливатьУОбъектаВсеСвойстваПоиска, ТипОбъекта, СвойстваПоиска,
СвойстваПоискаНеЗамещать, СсылкаНаОбъект, СозданныйОбъект, ЗаписыватьНовыйОбъектВИнформационнуюБазу = Истина, ИзмененыРеквизитыОбъекта = Ложь)
- Если СсылкаНаОбъект = Неопределено Тогда
+ Если УстанавливатьУОбъектаВсеСвойстваПоиска <> Истина Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
Возврат;
КонецЕсли;
@@ -6018,15 +6022,20 @@
НеНужноВыполнятьПоиск = ЗначениеЗаполнено(СсылкаНаОбъект);
+ Если СсылкаНаОбъект <> Неопределено
+ И СсылкаНаОбъект.Пустая() Тогда
+ СсылкаНаОбъект = Неопределено;
+ КонецЕсли;
+
КонецЕсли;
Если НеНужноВыполнятьПоиск Тогда
Если РежимПоискаОсновногоОбъекта И УстанавливатьУОбъектаВсеСвойстваПоиска = Истина Тогда
-
+
ОбработатьУстановкуСвойствПоискаУОбъекта(УстанавливатьУОбъектаВсеСвойстваПоиска, ТипОбъекта, СвойстваПоиска, СвойстваПоискаНеЗамещать,
СсылкаНаОбъект, СозданныйОбъект, НЕ РежимПоискаОсновногоОбъекта, СвойстваОбъектаМодифицированы);
-
+
КонецЕсли;
Прервать;
@@ -6402,6 +6411,7 @@
КопияТЧДляПоиска = Неопределено;
Движения = Объект.Движения[Имя];
+ Движения.Записывать = Истина;
Если Движения.Количество()=0 Тогда
Движения.Прочитать();
@@ -8645,15 +8655,20 @@
И ПКС.Источник = "{УникальныйИдентификатор}"
И ПКС.Приемник = "{УникальныйИдентификатор}" Тогда
- Попытка
-
+ Если ЗначениеСсылочногоТипа(Источник) Тогда
УникальныйИдентификатор = Источник.УникальныйИдентификатор();
+ Иначе
- Исключение
+ НачальноеЗначение = Новый УникальныйИдентификатор();
+ СтруктураДляПроверкиНаличияСвойства = Новый Структура("Ссылка", НачальноеЗначение);
+ ЗаполнитьЗначенияСвойств(СтруктураДляПроверкиНаличияСвойства, Источник);
- УникальныйИдентификатор = Источник.Ссылка.УникальныйИдентификатор();
+ Если НачальноеЗначение <> СтруктураДляПроверкиНаличияСвойства.Ссылка
+ И ЗначениеСсылочногоТипа(СтруктураДляПроверкиНаличияСвойства.Ссылка) Тогда
+ УникальныйИдентификатор = Источник.Ссылка.УникальныйИдентификатор();
+ КонецЕсли;
- КонецПопытки;
+ КонецЕсли;
УзелКоллекцииСвойств.ЗаписатьНачалоЭлемента("Свойство");
УстановитьАтрибут(УзелКоллекцииСвойств, "Имя", "{УникальныйИдентификатор}");
@@ -13609,7 +13624,7 @@
Процедура ИнициализацияСтруктурыИменОбработчиков()
- //Обработчики Конвертации
+ // Обработчики Конвертации.
ИменаОбработчиковКонвертации = Новый Структура;
ИменаОбработчиковКонвертации.Вставить("ПередВыгрузкойДанных");
ИменаОбработчиковКонвертации.Вставить("ПослеВыгрузкиДанных");
@@ -13629,7 +13644,7 @@
ИменаОбработчиковКонвертации.Вставить("ПослеЗагрузкиПравилОбмена");
ИменаОбработчиковКонвертации.Вставить("ПослеЗагрузкиПараметров");
- //Обработчики ПКО
+ // Обработчики ПКО.
ИменаОбработчиковПКО = Новый Структура;
ИменаОбработчиковПКО.Вставить("ПередВыгрузкой");
ИменаОбработчиковПКО.Вставить("ПриВыгрузке");
@@ -13642,13 +13657,13 @@
ИменаОбработчиковПКО.Вставить("ПоследовательностьПолейПоиска");
- //Обработчики ПКС
+ // Обработчики ПКС.
ИменаОбработчиковПКС = Новый Структура;
ИменаОбработчиковПКС.Вставить("ПередВыгрузкой");
ИменаОбработчиковПКС.Вставить("ПриВыгрузке");
ИменаОбработчиковПКС.Вставить("ПослеВыгрузки");
- //Обработчики ПКГС
+ // Обработчики ПКГС.
ИменаОбработчиковПКГС = Новый Структура;
ИменаОбработчиковПКГС.Вставить("ПередВыгрузкой");
ИменаОбработчиковПКГС.Вставить("ПриВыгрузке");
@@ -13657,14 +13672,14 @@
ИменаОбработчиковПКГС.Вставить("ПередОбработкойВыгрузки");
ИменаОбработчиковПКГС.Вставить("ПослеОбработкиВыгрузки");
- //Обработчики ПВД
+ // Обработчики ПВД.
ИменаОбработчиковПВД = Новый Структура;
ИменаОбработчиковПВД.Вставить("ПередОбработкой");
ИменаОбработчиковПВД.Вставить("ПослеОбработки");
ИменаОбработчиковПВД.Вставить("ПередВыгрузкой");
ИменаОбработчиковПВД.Вставить("ПослеВыгрузки");
- //Обработчики ПОД
+ // Обработчики ПОД.
ИменаОбработчиковПОД = Новый Структура;
ИменаОбработчиковПОД.Вставить("ПередОбработкой");
ИменаОбработчиковПОД.Вставить("ПослеОбработки");
@@ -13743,6 +13758,32 @@
КонецФункции
+// Проверить, что значение имеет ссылочный тип данных.
+//
+// Параметры:
+// Значение - Произвольный - проверяемое значение.
+//
+// Возвращаемое значение:
+// Булево - Истина, если тип значения ссылочный.
+//
+Функция ЗначениеСсылочногоТипа(Значение)
+
+ Тип = ТипЗнч(Значение);
+
+ Возврат Тип <> Тип("Неопределено")
+ И (Справочники.ТипВсеСсылки().СодержитТип(Тип)
+ ИЛИ Документы.ТипВсеСсылки().СодержитТип(Тип)
+ ИЛИ Перечисления.ТипВсеСсылки().СодержитТип(Тип)
+ ИЛИ ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип)
+ ИЛИ ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип)
+ ИЛИ ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип)
+ ИЛИ БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип)
+ ИЛИ БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().СодержитТип(Тип)
+ ИЛИ Задачи.ТипВсеСсылки().СодержитТип(Тип)
+ ИЛИ ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип));
+
+КонецФункции
+
#КонецОбласти
////////////////////////////////////////////////////////////////////////////////
diff --git a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Module.bsl b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Module.bsl
index 660df8da3..61d19fea8 100644
--- a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Module.bsl
+++ b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ОсновнаяФорма/Module.bsl
@@ -13,7 +13,7 @@
ПутьКОбъектуМетаданных = РеквизитФормыВЗначение("Объект").Метаданные().ПолноеИмя();
- Если НЕ Пользователи.ЭтоПолноправныйПользователь() Тогда
+ Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда
СтандартнаяОбработка = Ложь;
Возврат;
КонецЕсли;
@@ -101,28 +101,12 @@
ПараметрыИтогов.Вставить("Значение2", ВыбранноеЗначение.МинимальныйЭффект);
ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru='Ошибка перестроения агрегатов.'"));
- УправлениеАгрегатом(ПараметрыИтогов);
+ ИзменитьАгрегатыКлиент(ПараметрыИтогов);
ИначеЕсли КонтекстВыбора = "АгрегатыОптимальные" Тогда
ОптимальныйОтносительныйРазмер = ВыбранноеЗначение.ОтносительныйРазмер;
- ПутьКОптимальнымАгрегатам = ВыборПутиККаталогу(ПутьКОптимальнымАгрегатам);
-
- Если ПустаяСтрока(ПутьКОптимальнымАгрегатам) Тогда
- Возврат;
- КонецЕсли;
-
- ПараметрыИтогов = Новый Структура;
- ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок", НСтр("ru='Получение списка оптимальных агрегатов ...'"));
- ПараметрыИтогов.Вставить("ПослеПроцесса", НСтр("ru='Получение списка оптимальных агрегатов завершено'"));
- ПараметрыИтогов.Вставить("Действие", "ПолучитьОптимальныеАгрегаты");
- ПараметрыИтогов.Вставить("МассивСтрок", Элементы.АгрегатыПоРегистрам.ВыделенныеСтроки);
- ПараметрыИтогов.Вставить("Поле", "Наименование");
- ПараметрыИтогов.Вставить("Значение1", ВыбранноеЗначение.ОтносительныйРазмер);
- ПараметрыИтогов.Вставить("Значение2", Неопределено);
- ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru='Ошибка получения списка оптимальных агрегатов.'"));
-
- УправлениеАгрегатом(ПараметрыИтогов);
+ ПолучитьОптимальныеАгрегатКлиент();
КонецЕсли;
@@ -138,7 +122,7 @@
Процедура ГиперссылкаСТекстомНажатие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
- ПолныеВозможности = НЕ ПолныеВозможности;
+ ПолныеВозможности = Не ПолныеВозможности;
УстановитьРасширенныйРежим();
КонецПроцедуры
@@ -269,8 +253,8 @@
Для Каждого Индекс Из Элементы.СписокИтогов.ВыделенныеСтроки Цикл
ИнформацияПоРегистру = СписокИтогов.НайтиПоИдентификатору(Индекс);
- ПараметрыФормы.РегНакопления = ПараметрыФормы.РегНакопления ИЛИ ИнформацияПоРегистру.Тип = 0;
- ПараметрыФормы.РегБухгалтерии = ПараметрыФормы.РегБухгалтерии ИЛИ ИнформацияПоРегистру.Тип = 1;
+ ПараметрыФормы.РегНакопления = ПараметрыФормы.РегНакопления Или ИнформацияПоРегистру.Тип = 0;
+ ПараметрыФормы.РегБухгалтерии = ПараметрыФормы.РегБухгалтерии Или ИнформацияПоРегистру.Тип = 1;
КонецЦикла;
ОткрытьФорму("Обработка.УправлениеИтогамиИАгрегатами.Форма.ФормаВыбораПериода", ПараметрыФормы, ЭтотОбъект);
@@ -355,7 +339,7 @@
ПараметрыИтогов.Вставить("Значение2", Неопределено);
ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru='Ошибка включения режима агрегатов.'"));
- УправлениеАгрегатом(ПараметрыИтогов);
+ ИзменитьАгрегатыКлиент(ПараметрыИтогов);
КонецПроцедуры
@@ -372,7 +356,7 @@
ПараметрыИтогов.Вставить("Значение2", Неопределено);
ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru='Ошибка включения режима итогов.'"));
- УправлениеАгрегатом(ПараметрыИтогов);
+ ИзменитьАгрегатыКлиент(ПараметрыИтогов);
КонецПроцедуры
@@ -389,7 +373,7 @@
ПараметрыИтогов.Вставить("Значение2", Неопределено);
ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru='Ошибка включения использования агрегатов.'"));
- УправлениеАгрегатом(ПараметрыИтогов);
+ ИзменитьАгрегатыКлиент(ПараметрыИтогов);
КонецПроцедуры
@@ -406,7 +390,7 @@
ПараметрыИтогов.Вставить("Значение2", Неопределено);
ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru='Ошибка выключения использования агрегатов.'"));
- УправлениеАгрегатом(ПараметрыИтогов);
+ ИзменитьАгрегатыКлиент(ПараметрыИтогов);
КонецПроцедуры
@@ -451,13 +435,12 @@
ПараметрыИтогов.Вставить("Значение2", Неопределено);
ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru='Ошибка заполнения агрегатов.'"));
- УправлениеАгрегатом(ПараметрыИтогов);
+ ИзменитьАгрегатыКлиент(ПараметрыИтогов);
КонецПроцедуры
&НаКлиенте
Процедура АгрегатыОптимальные(Команда)
-
КонтекстВыбора = "АгрегатыОптимальные";
ПараметрыФормы = Новый Структура;
@@ -466,7 +449,6 @@
ПараметрыФормы.Вставить("РежимПерестроения", Ложь);
ОткрытьФорму("Обработка.УправлениеИтогамиИАгрегатами.Форма.ФормаПараметровПерестроения", ПараметрыФормы, ЭтотОбъект);
-
КонецПроцедуры
&НаКлиенте
@@ -550,7 +532,7 @@
ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru='Ошибка перестроения агрегатов.'"));
ПараметрыИтогов.Вставить("ГрупповаяОбработка", Истина);
- УправлениеАгрегатом(ПараметрыИтогов);
+ ИзменитьАгрегатыКлиент(ПараметрыИтогов);
ПараметрыИтогов = Новый Структура;
ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок", НСтр("ru='Заполнение агрегатов ...'"));
@@ -562,37 +544,13 @@
ПараметрыИтогов.Вставить("Значение2", Неопределено);
ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru='Ошибка заполнения агрегатов.'"));
- УправлениеАгрегатом(ПараметрыИтогов);
+ ИзменитьАгрегатыКлиент(ПараметрыИтогов);
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьОптимальныеАгрегаты(Команда)
-
- Если АгрегатыПоРегистрам.Количество() = 0 Тогда
- ПоказатьПредупреждение(, НСтр("ru='Отсутствуют регистры, для которых можно выполнить данную операцию.'"));
- Возврат;
- КонецЕсли;
-
- ПутьКОптимальнымАгрегатам = ВыборПутиККаталогу(ПутьКОптимальнымАгрегатам);
- Если ПустаяСтрока(ПутьКОптимальнымАгрегатам) Тогда
-
- Возврат;
- КонецЕсли;
-
- ПараметрыИтогов = Новый Структура;
- ПараметрыИтогов.Вставить("ОбрабатыватьЗаголовок", НСтр("ru='Получение списка оптимальных агрегатов ...'"));
- ПараметрыИтогов.Вставить("ПослеПроцесса", НСтр("ru='Получение списка оптимальных агрегатов завершено'"));
- ПараметрыИтогов.Вставить("Действие", "ПолучитьОптимальныеАгрегаты");
- ПараметрыИтогов.Вставить("МассивСтрок", АгрегатыПоРегистрам);
- ПараметрыИтогов.Вставить("Поле", "");
- ПараметрыИтогов.Вставить("Значение1", 0);
- ПараметрыИтогов.Вставить("Значение2", Неопределено);
- ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru='Ошибка получения списка оптимальных агрегатов.'"));
- ПараметрыИтогов.Вставить("ГрупповаяОбработка", Истина);
-
- УправлениеАгрегатом(ПараметрыИтогов);
-
+ ПолучитьОптимальныеАгрегатКлиент();
КонецПроцедуры
&НаКлиенте
@@ -771,7 +729,7 @@
ПараметрыИтогов.Вставить("Значение2", Неопределено);
ПараметрыИтогов.Вставить("ТекстСообщенияОбОшибке", НСтр("ru='Ошибка очистки агрегатов.'"));
- УправлениеАгрегатом(ПараметрыИтогов);
+ ИзменитьАгрегатыКлиент(ПараметрыИтогов);
КонецЕсли;
КонецПроцедуры
@@ -822,7 +780,12 @@
КонецПроцедуры
&НаКлиенте
-Процедура УправлениеАгрегатом(Знач ПараметрыИтогов)
+Процедура ПоказатьРезультатВыполнения(Результат, ПараметрыВыполнения) Экспорт
+ СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(ЭтотОбъект, ПараметрыВыполнения);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ИзменитьАгрегатыКлиент(Знач ПараметрыИтогов)
Результат = Истина;
ОчиститьСообщения();
@@ -833,7 +796,6 @@
КонецЕсли;
ШагПроцесса = 100/Выбранные.Количество();
- Действие = НРег(ПараметрыИтогов.Действие);
Если ПараметрыИтогов.Свойство("ГрупповаяОбработка") Тогда
ТребуетсяПрерватьПослеОшибки = ?(ПараметрыИтогов.ГрупповаяОбработка, Ложь, ПрерыватьПриОшибке);
@@ -842,22 +804,19 @@
КонецЕсли;
Для Счетчик = 1 По Выбранные.Количество() Цикл
-
Если ТипЗнч(Выбранные[Счетчик - 1]) = Тип("Число") Тогда
ВыбраннаяСтрока = АгрегатыПоРегистрам.НайтиПоИдентификатору(Выбранные[Счетчик-1]);
Иначе
ВыбраннаяСтрока = Выбранные[Счетчик-1];
КонецЕсли;
- ПолеСообщенияОбОшибке = ?(
- ПустаяСтрока(ПараметрыИтогов.Поле),
- "",
- "АгрегатыПоРегистрам[" + Выбранные[Счетчик-1] + "]."+ПараметрыИтогов.Поле);
+ ПолеСообщенияОбОшибке = "";
+ Если Не ПустаяСтрока(ПараметрыИтогов.Поле) Тогда
+ ПолеСообщенияОбОшибке = "АгрегатыПоРегистрам[" + Выбранные[Счетчик-1] + "]." + ПараметрыИтогов.Поле;
+ КонецЕсли;
- Если НЕ ВыбраннаяСтрока.РежимАгрегатов
- И НЕ ( ВРег(Действие) = ВРег("УстановитьРежимАгрегатов")
- ИЛИ ВРег(Действие) = ВРег("ПолучитьОптимальныеАгрегаты") ) Тогда
-
+ Если Не ВыбраннаяСтрока.РежимАгрегатов
+ И ВРег(ПараметрыИтогов.Действие) <> ВРег("УстановитьРежимАгрегатов") Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Операция невозможна в режиме итогов'"),
,
@@ -865,44 +824,28 @@
Продолжить;
КонецЕсли;
- Состояние(ПараметрыИтогов.ОбрабатыватьЗаголовок,
- Счетчик * ШагПроцесса,
- ВыбраннаяСтрока.Наименование);
+ Состояние(ПараметрыИтогов.ОбрабатыватьЗаголовок, Счетчик * ШагПроцесса, ВыбраннаяСтрока.Наименование);
- АдресФайлаВоВременномХранилище = "";
- Значение1 = ПараметрыИтогов.Значение1;
- Значение2 = ПараметрыИтогов.Значение2;
-
- Результат = УстановитьПараметрыАгрегатаНаСервере(
- ВыбраннаяСтрока.ИмяМетаданного,
- ПараметрыИтогов.Действие,
- Значение1,
- Значение2,
- ПолеСообщенияОбОшибке,
- ПараметрыИтогов.ТекстСообщенияОбОшибке,
- АдресФайлаВоВременномХранилище);
-
- Если Результат И ВРег(Действие) = ВРег("ПолучитьОптимальныеАгрегаты") Тогда
-
- СохранитьОптимальныеНастройкиАгрегатов(
- ВыбраннаяСтрока.ИмяМетаданного,
- АдресФайлаВоВременномХранилище,
- "АгрегатыПоРегистрам[" + Выбранные[Счетчик - 1] + "]." + ПараметрыИтогов.Поле);
-
- ВыбраннаяСтрока.ПостроениеОптимально = Значение1;
- КонецЕсли;
+ ПараметрыСервера = Новый Структура;
+ ПараметрыСервера.Вставить("ИмяРегистра", ВыбраннаяСтрока.ИмяМетаданного);
+ ПараметрыСервера.Вставить("Действие", ПараметрыИтогов.Действие);
+ ПараметрыСервера.Вставить("ЗначениеДействия1", ПараметрыИтогов.Значение1);
+ ПараметрыСервера.Вставить("ЗначениеДействия2", ПараметрыИтогов.Значение2);
+ ПараметрыСервера.Вставить("СообщениеОбОшибке", ПараметрыИтогов.ТекстСообщенияОбОшибке);
+ ПараметрыСервера.Вставить("ПолеФормы", ПолеСообщенияОбОшибке);
+ ПараметрыСервера.Вставить("ИдентификаторФормы", УникальныйИдентификатор);
+ Результат = ИзменитьАгрегатыСервер(ПараметрыСервера);
ОбработкаПрерыванияПользователя();
- Если НЕ Результат И ТребуетсяПрерватьПослеОшибки Тогда
+ Если Не Результат.Успешно И ТребуетсяПрерватьПослеОшибки Тогда
Прервать;
КонецЕсли;
КонецЦикла;
- Если ВРег(Действие) = ВРег("УстановитьРежимАгрегатов")
- ИЛИ ВРег(Действие) = ВРег("УстановитьИспользованиеАгрегатов") Тогда
-
+ Если ВРег(ПараметрыИтогов.Действие) = ВРег("УстановитьРежимАгрегатов")
+ Или ВРег(ПараметрыИтогов.Действие) = ВРег("УстановитьИспользованиеАгрегатов") Тогда
ОбновитьСписокИтоговНаСервере();
КонецЕсли;
@@ -933,36 +876,32 @@
ТребуетсяПрерватьПослеОшибки = ПрерыватьПриОшибке;
КонецЕсли;
- Для Счетчик=1 По Выбранные.Количество() Цикл
-
+ Для Счетчик = 1 По Выбранные.Количество() Цикл
Если ТипЗнч(Выбранные[Счетчик-1]) = Тип("Число") Тогда
-
ВыбраннаяСтрока = СписокИтогов.НайтиПоИдентификатору(Выбранные[Счетчик-1]);
Иначе
ВыбраннаяСтрока = Выбранные[Счетчик-1];
КонецЕсли;
- Состояние(ПараметрыИтогов.ОбрабатыватьЗаголовок,
- Счетчик * ШагПроцесса,
- ВыбраннаяСтрока.Наименование);
+ Состояние(ПараметрыИтогов.ОбрабатыватьЗаголовок, Счетчик * ШагПроцесса, ВыбраннаяСтрока.Наименование);
- Если ВРег(Действие) = ВРег("УстановитьИспользованиеИтогов") Тогда
+ Если ВРег(Действие) = ВРег("УстановитьИспользованиеИтогов") Тогда
Если ВыбраннаяСтрока.АгрегатыИтоги = 1 Тогда
Продолжить;
КонецЕсли;
ИначеЕсли ВРег(Действие) = ВРег("ИспользоватьТекущиеИтоги") Тогда
- Если ВыбраннаяСтрока.АгрегатыИтоги = 1 ИЛИ НЕ ВыбраннаяСтрока.ОстаткиИОбороты Тогда
+ Если ВыбраннаяСтрока.АгрегатыИтоги = 1 Или Не ВыбраннаяСтрока.ОстаткиИОбороты Тогда
Продолжить;
КонецЕсли;
ИначеЕсли ВРег(Действие) = ВРег("УстановитьПериодИтогов") Тогда
- Если ВыбраннаяСтрока.АгрегатыИтоги = 1 ИЛИ НЕ ВыбраннаяСтрока.ОстаткиИОбороты Тогда
+ Если ВыбраннаяСтрока.АгрегатыИтоги = 1 Или Не ВыбраннаяСтрока.ОстаткиИОбороты Тогда
Продолжить;
КонецЕсли;
ИначеЕсли ВРег(Действие) = ВРег("УстановитьРазделениеИтогов") Тогда
- Если НЕ ВыбраннаяСтрока.РазрешитьРазделениеИтогов Тогда
+ Если Не ВыбраннаяСтрока.РазрешитьРазделениеИтогов Тогда
Продолжить;
КонецЕсли;
@@ -972,34 +911,37 @@
КонецЕсли;
ИначеЕсли ВРег(Действие) = ВРег("ПересчитатьИтогиЗаПериод") Тогда
- Если ВыбраннаяСтрока.АгрегатыИтоги = 1 ИЛИ НЕ ВыбраннаяСтрока.ОстаткиИОбороты Тогда
+ Если ВыбраннаяСтрока.АгрегатыИтоги = 1 Или Не ВыбраннаяСтрока.ОстаткиИОбороты Тогда
Продолжить;
КонецЕсли;
ИначеЕсли ВРег(Действие) = ВРег("ПересчитатьТекущиеИтоги") Тогда
- Если НЕ ВыбраннаяСтрока.ОстаткиИОбороты Тогда
+ Если Не ВыбраннаяСтрока.ОстаткиИОбороты Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
+ ПолеСообщенияОбОшибке = "";
+ Если Не ПустаяСтрока(ПараметрыИтогов.Поле) Тогда
+ ПолеСообщенияОбОшибке = "СписокИтогов[" + Выбранные[Счетчик - 1] + "]." + ПараметрыИтогов.Поле;
+ КонецЕсли;
+
Результат = УстановитьПараметрыРегистраНаСервере(
ВыбраннаяСтрока.Тип,
ВыбраннаяСтрока.ИмяМетаданного,
ПараметрыИтогов.Действие,
ПараметрыИтогов.Значение1,
ПараметрыИтогов.Значение2,
- ?(ПустаяСтрока(ПараметрыИтогов.Поле),
- "",
- "СписокИтогов[" + Выбранные[Счетчик - 1] + "]." + ПараметрыИтогов.Поле),
+ ПолеСообщенияОбОшибке,
ПараметрыИтогов.ТекстСообщенияОбОшибке);
ОбработкаПрерыванияПользователя();
- Если НЕ Результат И ТребуетсяПрерватьПослеОшибки Тогда
+ Если Не Результат И ТребуетсяПрерватьПослеОшибки Тогда
Прервать;
КонецЕсли;
КонецЦикла;
-
+
ОбновитьСписокИтоговНаСервере();
Состояние(ПараметрыИтогов.ПослеПроцесса);
@@ -1007,58 +949,47 @@
КонецПроцедуры
&НаКлиенте
-Функция СохранитьОптимальныеНастройкиАгрегатов(Знач ИмяМетаданного, Знач АдресФайлаВоВременномХранилище, Знач Поле)
-
- Попытка
- Если ПутьКОптимальнымАгрегатам = "web" Тогда
- ПолноеИмяФайла = ИмяМетаданного + ".xml";
- Иначе
- ПолноеИмяФайла = ПутьКОптимальнымАгрегатам + "\" + ИмяМетаданного + ".xml";
- КонецЕсли;
-#Если ВебКлиент Тогда
- ПолучитьФайл(АдресФайлаВоВременномХранилище, ПолноеИмяФайла, Истина);
-#Иначе
- ПолучитьФайл(АдресФайлаВоВременномХранилище, ПолноеИмяФайла, Ложь);
-#КонецЕсли
- УдалитьИзВременногоХранилища(АдресФайлаВоВременномХранилище);
-
- Возврат Истина;
- Исключение
- ИнформацияОбОшибке = ИнформацияОбОшибке();
-
- ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
- СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
- НСтр("ru='Ошибка записи файла оптимальных агрегатов:
- |""%1"".'"),
- КраткоеПредставлениеОшибки(ИнформацияОбОшибке) ));
-
- УдалитьИзВременногоХранилища(АдресФайлаВоВременномХранилище);
- Возврат Ложь;
- КонецПопытки;
-
-КонецФункции
-
-&НаКлиенте
-Функция ВыборПутиККаталогу(Знач ТекущийКаталог)
-
- Каталог = "";
-
- Если ПодключитьРасширениеРаботыСФайлами() Тогда
-
- ВыборКаталога = Новый ДиалогВыбораФайла (РежимДиалогаВыбораФайла.ВыборКаталога);
- ВыборКаталога.Каталог = ТекущийКаталог;
- ВыборКаталога.Заголовок = НСтр("ru = 'Выберите каталог для размещения файлов с оптимальными агрегатами'");
-
- Если ВыборКаталога.Выбрать() Тогда
- Каталог = ВыборКаталога.Каталог;
+Процедура ПолучитьОптимальныеАгрегатКлиент()
+ Если ПолныеВозможности Тогда
+ Если Элементы.АгрегатыПоРегистрам.ВыделенныеСтроки.Количество() = 0 Тогда
+ Возврат;
КонецЕсли;
Иначе
- Каталог = "web";
+ Если АгрегатыПоРегистрам.Количество() = 0 Тогда
+ ПоказатьПредупреждение(, НСтр("ru='Отсутствуют регистры, для которых можно выполнить данную операцию.'"));
+ Возврат;
+ КонецЕсли;
КонецЕсли;
- Возврат Каталог;
+ Результат = ПолучитьОптимальныеАгрегатыСервер();
+ Обработчик = Новый ОписаниеОповещения("ПоказатьРезультатВыполнения", ЭтотОбъект, Результат);
+ Если Результат.МожноПолучить Тогда
+ #Если ВебКлиент Тогда
+ ПолучитьФайл(Результат.АдресФайла, Результат.ИмяФайла, Истина);
+ ВыполнитьОбработкуОповещения(Обработчик, Истина);
+ #Иначе
+ ПолучаемыеФайлы = Новый Массив;
+ ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(Результат.ИмяФайла, Результат.АдресФайла));
+ Расширение = НРег(Сред(Результат.ИмяФайла, Найти(Результат.ИмяФайла, ".") + 1));
+ Если Расширение = "zip" Тогда
+ Фильтр = НСтр("ru = 'Архив ZIP (*.%1)|*.%1'");
+ ИначеЕсли Расширение = "xml" Тогда
+ Фильтр = НСтр("ru = 'Документ XML (*.%1)|*.%1'");
+ Иначе
+ Фильтр = "";
+ КонецЕсли;
+ Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Фильтр, Расширение);
+ ДиалогСохраненияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
+ ДиалогСохраненияФайла.ПолноеИмяФайла = Результат.ИмяФайла;
+ ДиалогСохраненияФайла.Фильтр = Фильтр;
+ ДиалогСохраненияФайла.МножественныйВыбор = Ложь;
+ НачатьПолучениеФайлов(Обработчик, ПолучаемыеФайлы, ДиалогСохраненияФайла, Истина);
+ #КонецЕсли
+ Иначе
+ ВыполнитьОбработкуОповещения(Обработчик, Истина);
+ КонецЕсли;
-КонецФункции
+КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Клиент, Сервер
@@ -1080,6 +1011,145 @@
////////////////////////////////////////////////////////////////////////////////
// Вызов сервера, Сервер
+&НаСервере
+Функция ПолучитьОптимальныеАгрегатыСервер()
+ Результат = Новый Структура;
+ Результат.Вставить("МожноПолучить", Ложь);
+ Результат.Вставить("АдресФайла", "");
+ Результат.Вставить("ИмяФайла", "");
+
+ Если ПолныеВозможности Тогда
+ Коллекция = ВыделенныеСтроки("АгрегатыПоРегистрам");
+ МаксимальныйОтносительныйРазмер = ОптимальныйОтносительныйРазмер;
+ Иначе
+ Коллекция = АгрегатыПоРегистрам;
+ МаксимальныйОтносительныйРазмер = 0;
+ КонецЕсли;
+ Всего = Коллекция.Количество();
+ Успешно = 0;
+ ЕстьОшибки = Ложь;
+ ПодробныйТекстОшибок = "";
+
+ КаталогВременныхФайлов = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(
+ ПолучитьИмяВременногоФайла(".TAM")); // Totals & Aggregates Management.
+ СоздатьКаталог(КаталогВременныхФайлов);
+
+ ФайлыДляАрхивации = Новый СписокЗначений;
+
+ // Получение агрегатов.
+ Для НомерСтроки = 1 По Всего Цикл
+ ИмяРегистраНакопления = Коллекция[НомерСтроки - 1].ИмяМетаданного;
+
+ МенеджерРегистра = РегистрыНакопления[ИмяРегистраНакопления];
+ ИнформацияОбОшибке = Неопределено;
+ Попытка
+ ОптимальныеАгрегаты = МенеджерРегистра.ОпределитьОптимальныеАгрегаты(МаксимальныйОтносительныйРазмер);
+ Исключение
+ ИнформацияОбОшибке = ИнформацияОбОшибке();
+ КонецПопытки;
+ Если ИнформацияОбОшибке <> Неопределено Тогда
+ ЕстьОшибки = Истина;
+ ЗаголовокОшибки = НСтр("ru = 'Не удалось получить оптимальные агрегаты регистра ""%1"":'");
+ ПодробныйТекстОшибок = ПодробныйТекстОшибок
+ + ?(ПодробныйТекстОшибок = "", "", Символы.ПС + Символы.ПС)
+ + СтрЗаменить(ЗаголовокОшибки, "%1", ИмяРегистраНакопления)
+ + Символы.ПС
+ + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
+ Продолжить;
+ КонецЕсли;
+
+ ПолноеИмяФайла = КаталогВременныхФайлов + ИмяРегистраНакопления + ".xml";
+
+ ЗаписьXML = Новый ЗаписьXML();
+ ЗаписьXML.ОткрытьФайл(ПолноеИмяФайла);
+ ЗаписьXML.ЗаписатьОбъявлениеXML();
+ СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ОптимальныеАгрегаты);
+ ЗаписьXML.Закрыть();
+
+ ФайлыДляАрхивации.Добавить(ПолноеИмяФайла, ИмяРегистраНакопления);
+ Успешно = Успешно + 1;
+ КонецЦикла;
+
+ // Подготовка результата к передаче на клиент.
+ Если Успешно > 0 Тогда
+ Если Успешно = 1 Тогда
+ ЭлементСписка = ФайлыДляАрхивации[0];
+ ПолноеИмяФайла = ЭлементСписка.Значение;
+ КраткоеИмяФайла = ЭлементСписка.Представление + ".xml";
+ Иначе
+ КраткоеИмяФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Оптимальные агрегаты регистров накопления %1.zip'"),
+ Формат(ТекущаяДатаСеанса(), "ДФ=yyyy-MM-dd"));
+ ПолноеИмяФайла = КаталогВременныхФайлов + КраткоеИмяФайла;
+ РежимСохранения = РежимСохраненияПутейZIP.СохранятьОтносительныеПути;
+ РежимОбработки = РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно;
+ ЗаписьZipФайла = Новый ЗаписьZipФайла(ПолноеИмяФайла);
+ Для Каждого ЭлементСписка Из ФайлыДляАрхивации Цикл
+ ЗаписьZipФайла.Добавить(ЭлементСписка.Значение, РежимСохранения, РежимОбработки);
+ КонецЦикла;
+ ЗаписьZipФайла.Записать();
+ КонецЕсли;
+ ДвоичныеДанные = Новый ДвоичныеДанные(ПолноеИмяФайла);
+ Результат.МожноПолучить = Истина;
+ Результат.ИмяФайла = КраткоеИмяФайла;
+ Результат.АдресФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
+ КонецЕсли;
+
+ // Очистка мусора.
+ УдалитьФайлы(КаталогВременныхФайлов);
+
+ // Подготовка текстов сообщений.
+ Если Всего = 1 Тогда
+ // Когда 1 регистр.
+ ЭлементСписка = ФайлыДляАрхивации[0];
+ ИмяРегистра = ЭлементСписка.Представление;
+ Если ЕстьОшибки Тогда
+ СтандартныеПодсистемыКлиентСервер.ВывестиПредупреждение(
+ Результат,
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Не удалось получить оптимальные агрегаты регистра накопления ""%1"".'"),
+ ИмяРегистра),
+ ПодробныйТекстОшибок);
+ Иначе
+ СтандартныеПодсистемыКлиентСервер.ВывестиОповещение(
+ Результат,
+ НСтр("ru = 'Оптимальные агрегаты успешно получены.'"),
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = '%1 (регистр накопления)'"),
+ ИмяРегистра),
+ БиблиотекаКартинок.Успешно32);
+ КонецЕсли;
+ ИначеЕсли Успешно = 0 Тогда
+ // Ничего не получилось.
+ СтандартныеПодсистемыКлиентСервер.ВывестиПредупреждение(
+ Результат,
+ НСтр("ru = 'Не удалось получить оптимальные агрегаты регистров накопления.'"),
+ ПодробныйТекстОшибок);
+ ИначеЕсли ЕстьОшибки Тогда
+ // Частично успешно.
+ СтандартныеПодсистемыКлиентСервер.ВывестиПредупреждение(
+ Результат,
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Агрегаты успешно получены для %1 из %2 регистров.
+ |Не получены: %3.'"),
+ Успешно,
+ Всего,
+ Всего - Успешно),
+ ПодробныйТекстОшибок);
+ Иначе
+ // Полностью успешно.
+ СтандартныеПодсистемыКлиентСервер.ВывестиОповещение(
+ Результат,
+ НСтр("ru = 'Агрегаты успешно получены.'"),
+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Регистры накопления (%1)'"),
+ Успешно),
+ БиблиотекаКартинок.Успешно32);
+ КонецЕсли;
+
+ Возврат Результат;
+КонецФункции
+
&НаСервере
Процедура ОбновитьСписокИтоговНаСервере()
@@ -1189,7 +1259,7 @@
Попытка
- Если ВРег(Действие) = ВРег("УстановитьИспользованиеИтогов") Тогда
+ Если ВРег(Действие) = ВРег("УстановитьИспользованиеИтогов") Тогда
Менеджер.УстановитьИспользованиеИтогов(Значение1);
ИначеЕсли ВРег(Действие) = ВРег("ИспользоватьТекущиеИтоги") Тогда
@@ -1237,110 +1307,47 @@
КонецФункции
&НаСервереБезКонтекста
-Функция УстановитьПараметрыАгрегатаНаСервере(Знач ИмяРегистра,
- Знач Действие,
- ЗначениеДействия1, // Значение по умолчанию: Истина.
- Знач ЗначениеДействия2, // Значение по умолчанию: Неопределено.
- Знач ПолеФормы,
- Знач СообщениеОбОшибке = "",
- АдресФайлаВоВременномХранилище = "")
+Функция ИзменитьАгрегатыСервер(Знач ПараметрыСервера)
+ Результат = Новый Структура;
+ Результат.Вставить("Успешно", Истина);
+ Результат.Вставить("ЗначениеДействия1", ПараметрыСервера.ЗначениеДействия1);
+ Результат.Вставить("АдресФайлаВоВременномХранилище", "");
- МенеджерРегистра = РегистрыНакопления[ИмяРегистра];
- МетаданныеРегистра = Метаданные.РегистрыНакопления[ИмяРегистра];
- Действие = НРег(Действие);
- ОК = Истина;
+ МенеджерРегистра = РегистрыНакопления[ПараметрыСервера.ИмяРегистра];
+ МетаданныеРегистра = Метаданные.РегистрыНакопления[ПараметрыСервера.ИмяРегистра];
Попытка
- Если ВРег(Действие) = ВРег("УстановитьРежимАгрегатов") Тогда
- МенеджерРегистра.УстановитьРежимАгрегатов(ЗначениеДействия1);
+ Если ВРег(ПараметрыСервера.Действие) = ВРег("УстановитьРежимАгрегатов") Тогда
+ МенеджерРегистра.УстановитьРежимАгрегатов(ПараметрыСервера.ЗначениеДействия1);
- ИначеЕсли ВРег(Действие) = ВРег("УстановитьИспользованиеАгрегатов") Тогда
- МенеджерРегистра.УстановитьИспользованиеАгрегатов(ЗначениеДействия1);
+ ИначеЕсли ВРег(ПараметрыСервера.Действие) = ВРег("УстановитьИспользованиеАгрегатов") Тогда
+ МенеджерРегистра.УстановитьИспользованиеАгрегатов(ПараметрыСервера.ЗначениеДействия1);
- ИначеЕсли ВРег(Действие) = ВРег("ЗаполнитьАгрегаты") Тогда
+ ИначеЕсли ВРег(ПараметрыСервера.Действие) = ВРег("ЗаполнитьАгрегаты") Тогда
МенеджерРегистра.ОбновитьАгрегаты(Ложь);
- ИначеЕсли ВРег(Действие) = ВРег("ПерестроитьАгрегаты") Тогда
- МенеджерРегистра.ПерестроитьИспользованиеАгрегатов(ЗначениеДействия1, ЗначениеДействия2);
+ ИначеЕсли ВРег(ПараметрыСервера.Действие) = ВРег("ПерестроитьАгрегаты") Тогда
+ МенеджерРегистра.ПерестроитьИспользованиеАгрегатов(ПараметрыСервера.ЗначениеДействия1, ПараметрыСервера.ЗначениеДействия2);
- ИначеЕсли ВРег(Действие) = ВРег("ОчиститьАгрегаты") Тогда
+ ИначеЕсли ВРег(ПараметрыСервера.Действие) = ВРег("ОчиститьАгрегаты") Тогда
МенеджерРегистра.ОчиститьАгрегаты();
- ИначеЕсли ВРег(Действие) = ВРег("ПолучитьОптимальныеАгрегаты") Тогда
-
- ОптимальныеАгрегаты = МенеджерРегистра.ОпределитьОптимальныеАгрегаты(ЗначениеДействия1);
- ЗначениеДействия1 = Ложь;
- НайденныеАгрегаты = Новый Соответствие;
- МетаданныеАгрегаты = МетаданныеРегистра.Агрегаты;
-
- Для Индекс1=0 По ОптимальныеАгрегаты.Агрегаты.ВГраница() Цикл
-
- ЗначениеДействия1 = Ложь;
- Для Индекс2=0 По МетаданныеАгрегаты.Количество() - 1 Цикл
-
- Если ОптимальныеАгрегаты.Агрегаты[Индекс1].Периодичность
- = МетаданныеАгрегаты[Индекс2].Периодичность
- И НайденныеАгрегаты[Индекс2] = Неопределено
- И ИзмеренияАгрегатовРавны(ОптимальныеАгрегаты.Агрегаты[Индекс1],
- МетаданныеАгрегаты[Индекс2]) Тогда
-
- НайденныеАгрегаты.Вставить(Индекс2, Истина);
- ЗначениеДействия1 = Истина;
- Прервать;
- КонецЕсли;
- КонецЦикла;
-
- Если ЗначениеДействия1 Тогда
-
- Продолжить;
- КонецЕсли;
-
- Для Индекс2=0 По МетаданныеАгрегаты.Количество() - 1 Цикл
-
- Если ОптимальныеАгрегаты.Агрегаты[Индекс1].Периодичность
- = ПериодичностьАгрегатаРегистраНакопления.Авто
- И НайденныеАгрегаты[Индекс2] = Неопределено
- И ИзмеренияАгрегатовРавны(ОптимальныеАгрегаты.Агрегаты[Индекс1],
- МетаданныеАгрегаты[Индекс2]) Тогда
-
- НайденныеАгрегаты.Вставить(Индекс2, Истина);
- ЗначениеДействия1 = Истина;
- Прервать;
- КонецЕсли;
- КонецЦикла;
-
- Если НЕ ЗначениеДействия1 Тогда
-
- Прервать;
- КонецЕсли;
- КонецЦикла;
-
- ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
-
- ЗаписьXML = Новый ЗаписьXML();
- ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла);
- ЗаписьXML.ЗаписатьОбъявлениеXML();
- СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ОптимальныеАгрегаты);
- ЗаписьXML.Закрыть();
-
- АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(
- Новый ДвоичныеДанные(ИмяВременногоФайла));
-
- УдалитьФайлы(ИмяВременногоФайла);
Иначе
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Неправильное имя параметра: %1'"),
- Действие);
+ ПараметрыСервера.Действие);
КонецЕсли;
Исключение
- СообщениеОбОшибке = СообщениеОбОшибке + " (" + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + ")";
- ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СообщениеОбОшибке, , ПолеФормы);
- ОК = Ложь;
+
+ СообщениеОбОшибке = ПараметрыСервера.СообщениеОбОшибке + " (" + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + ")";
+ ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СообщениеОбОшибке, , ПараметрыСервера.ПолеФормы);
+ Результат.Успешно = Ложь;
+
КонецПопытки;
- Возврат ОК;
+ Возврат Результат;
КонецФункции
@@ -1366,6 +1373,17 @@
////////////////////////////////////////////////////////////////////////////////
// Сервер
+&НаСервере
+Функция ВыделенныеСтроки(ИмяТаблицы)
+ Результат = Новый Массив;
+ ВыделенныеСтроки = Элементы[ИмяТаблицы].ВыделенныеСтроки;
+ Таблица = ЭтотОбъект[ИмяТаблицы];
+ Для Каждого Идентификатор Из ВыделенныеСтроки Цикл
+ Результат.Добавить(Таблица.НайтиПоИдентификатору(Идентификатор));
+ КонецЦикла;
+ Возврат Результат;
+КонецФункции
+
&НаСервере
Процедура ПрочитатьИнформациюПоРегистрам()
@@ -1375,7 +1393,7 @@
Для Каждого Регистр Из Метаданные.РегистрыБухгалтерии Цикл
- Если НЕ ПравоДоступа("УправлениеИтогами", Регистр) Тогда
+ Если Не ПравоДоступа("УправлениеИтогами", Регистр) Тогда
Продолжить;
КонецЕсли;
@@ -1403,7 +1421,7 @@
Постфикс = НСтр("ru = 'регистр накопления'");
КонецЕсли;
- Если НЕ ПравоДоступа("УправлениеИтогами", Регистр) Тогда
+ Если Не ПравоДоступа("УправлениеИтогами", Регистр) Тогда
Продолжить;
КонецЕсли;
@@ -1426,7 +1444,7 @@
Продолжить;
КонецЕсли;
- Если НЕ ПравоДоступа("УправлениеИтогами", Регистр) Тогда
+ Если Не ПравоДоступа("УправлениеИтогами", Регистр) Тогда
Продолжить;
КонецЕсли;
@@ -1452,31 +1470,4 @@
КонецПроцедуры
-&НаСервереБезКонтекста
-Функция ИзмеренияАгрегатовРавны(Знач ОптимальныйАгрегат, Знач КонфАгрегат)
-
- Если ОптимальныйАгрегат.Измерения.ВГраница() <> КонфАгрегат.Измерения.ВГраница() Тогда
- Возврат Ложь;
- КонецЕсли;
-
- Для Индекс1 = 0 По ОптимальныйАгрегат.Измерения.ВГраница() Цикл
-
- Найдено = Ложь;
- Для Индекс2 = 0 По КонфАгрегат.Измерения.ВГраница() Цикл
-
- Если ОптимальныйАгрегат.Измерения[Индекс1] = КонфАгрегат.Измерения[Индекс2].Имя Тогда
- Найдено = Истина;
- Прервать;
- КонецЕсли;
- КонецЦикла;
-
- Если НЕ Найдено Тогда
- Возврат Ложь;
- КонецЕсли;
- КонецЦикла;
-
- Возврат Истина;
-
-КонецФункции
-
#КонецОбласти
diff --git a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаВыбораПериода/Help/ru.html b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаВыбораПериода/Help/ru.html
index 7a59f12c6..97791a2a0 100644
--- a/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаВыбораПериода/Help/ru.html
+++ b/SSL/src/DataProcessors/УправлениеИтогамиИАгрегатами/Forms/ФормаВыбораПериода/Help/ru.html
@@ -1,4 +1,4 @@
-
+
В данном диалоге можно ввести границы периода рассчитанных итогов для регистров накопления или бухгалтерии.
По умолчанию предлагаются следующие даты для установки границы рассчитанных итогов:
Предназначена для задания параметров перестроения использования агрегатов и получения списка оптимальных агрегатов.
Максимальный относительный размер - максимальная сумма размеров агрегатов в процентах от таблицы движений. Если параметр не указан или равен нулю, то нет ограничения размера агрегатов.
Предназначена для администрирования итогов регистров накопления и бухгалтерии, агрегатов оборотных регистров накопления.
Регистры программы предназначены для хранения и обработки информации, отражающей деятельность предприятия. В регистрах обычно хранится информация об изменении состояний объектов предметной области (документов, справочников) или другая информация, не отражающаяся непосредственно в этих объектах. Например, в регистрах может храниться информация о курсах валют.
Агрегаты - это специальный механизм, реализованный в оборотных регистрах накопления. Для любого регистра может быть создано несколько агрегатов. Каждый агрегат - это специализированное хранилище, содержащее агрегированные данные регистра в различных разрезах, удобных для формирования отчетов в конкретной информационной базе. Использование агрегатов позволяет значительно сократить время формирования отчетов, что важно для больших информационных баз.
Перед тем как начать работать с почтовыми сообщениями, в программе необходимо настроить работу с почтой. Для этого в списке взаимодействий выполните команду Еще- Персональные настройки.
Предназначен для работы с документами взаимодействий.
-
Бизнес-процессы помимо обычного делопроизводства в настоящее время включают и общение партнеров между собой, т.е. их взаимодействие: между партнерами проходят различные встречи, переговоры, электронная переписка. В процессе общения принимаются важные решения, заключаются различные договоры, составляются другие документы, поэтому необходимо это взаимодействие также задокументировать.
-
Программа позволяет планировать, регистрировать, упорядочивать и работать с результатами взаимодействия - общения пользователей программы с кем-либо по поводу предмета взаимодействия. Например, один сотрудник может взаимодействовать с другим сотрудником (контактом) по поводу заказа клиента (предмета).
-
Программа позволяет выстраивать различные взаимодействия, возникшие на основании одного и того же предмета, в цепочку. В цепочке взаимодействий в качестве предмета у всех взаимодействий указывается одно, как правило, первое по времени взаимодействие. При этом в любой момент времени в любом взаимодействии из цепочки можно указать другой предмет, не являющийся взаимодействием, например, один из документов программы, программа после этого в автоматическом режиме поменяет предмет у всей цепочки. Например, переговоры с потенциальным клиентом, состоявшие из встреч, телефонных звонков и переписки (цепочки взаимодействий) закончились заказом клиента. В этом случае программа позволяет изменить предмет во всех взаимодействиях, предшествовавших заказу, на итоговый заказ клиента.
-
Кроме этого, для удобства работы с контактами программа формирует единую адресную книгу на основании контактной информации.
-
Список взаимодействий состоит из двух частей: в левой части списка обычно отображается панель навигации, в правой части - документы взаимодействий.
Предназначен для работы с документами взаимодействий.
+
Бизнес-процессы помимо обычного делопроизводства в настоящее время включают и общение партнеров между собой, т.е. их взаимодействие: между партнерами проходят различные встречи, переговоры, электронная переписка. В процессе общения принимаются важные решения, заключаются различные договоры, составляются другие документы, поэтому необходимо это взаимодействие также задокументировать.
+
Программа позволяет планировать, регистрировать, упорядочивать и работать с результатами взаимодействия - общения пользователей программы с кем-либо по поводу предмета взаимодействия. Например, один сотрудник может взаимодействовать с другим сотрудником (контактом) по поводу заказа клиента (предмета).
+
Программа позволяет выстраивать различные взаимодействия, возникшие на основании одного и того же предмета, в цепочку. В цепочке взаимодействий в качестве предмета у всех взаимодействий указывается одно, как правило, первое по времени взаимодействие. При этом в любой момент времени в любом взаимодействии из цепочки можно указать другой предмет, не являющийся взаимодействием, например, один из документов программы, программа после этого в автоматическом режиме поменяет предмет у всей цепочки. Например, переговоры с потенциальным клиентом, состоявшие из встреч, телефонных звонков и переписки (цепочки взаимодействий) закончились заказом клиента. В этом случае программа позволяет изменить предмет во всех взаимодействиях, предшествовавших заказу, на итоговый заказ клиента.
+
Кроме этого, для удобства работы с контактами программа формирует единую адресную книгу на основании контактной информации.
+
Список взаимодействий состоит из двух частей: в левой части списка обычно отображается панель навигации, в правой части - документы взаимодействий.
Важность - признак необходимости акцентировать внимание на данном взаимодействии, или наоборот, признак несущественности. Может принимать значения: Низкая, Обычная (значение по умолчанию), Высокая. Отображается в списке взаимодействий специальными значками.
Важность - признак необходимости акцентировать внимание на данном взаимодействии, или наоборот, признак несущественности. Может принимать значения: Низкая, Обычная (значение по умолчанию), Высокая. Отображается в списке взаимодействий специальными значками.
+
+
Участники - контакты, с которыми были взаимодействия;
Тема - краткое содержание взаимодействия.
-
-
Дата - дата создания документа;
-
-
+
+
Дата - дата создания документа;
+
+
Наличие вложений - к письмам можно приложить различные файлы.
-
В нижней части списка (в зависимости от настроек) может отображаться описание, текст выделенного в списке взаимодействия или тело письма.
-
Жирным шрифтом в списке выделяются документы к рассмотрению, письма и сообщения SMS с установленным признаком На контроле. Программа ведет подсчет нерассмотренных документов и писем с флажком На контроле в каждой группе списка. Группы, которые содержат такие документы, выделяются жирным шрифтом.
В нижней части списка (в зависимости от настроек) может отображаться описание, текст выделенного в списке взаимодействия или тело письма.
+
Жирным шрифтом в списке выделяются документы к рассмотрению, письма и сообщения SMS с установленным признаком На контроле. Программа ведет подсчет нерассмотренных документов и писем с флажком На контроле в каждой группе списка. Группы, которые содержат такие документы, выделяются жирным шрифтом.
В левой части списка отображается панель, с помощью которой можно удобно группировать взаимодействия:
По предметам - панель навигации заполняется предметами взаимодействий. Все взаимодействия в списке группируются по предметам.
При позиционировании на предмете в списке отображаются взаимодействия по данному предмету.
В панели группировки можно открывать предметы, по которым сгруппированы взаимодействия (двойным щелчком мыши в панели группировки).
diff --git a/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Module.bsl b/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Module.bsl
index f20c184a4..b3a360e33 100644
--- a/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Module.bsl
+++ b/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Module.bsl
@@ -1881,11 +1881,11 @@
| Документ.ТелефонныйЗвонок КАК ДокументВзаимодействий
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий
| ПО ДокументВзаимодействий.Ссылка = ПредметыПапкиВзаимодействий.Взаимодействие
- | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ТелефонныйЗвонок.ДополнительныеРеквизиты КАК ДокументВзаимодействийДополнительныеРеквизиты
+ | ЛЕВОЕ СОЕДИНЕНИЕ Документ.СообщениеSMS.ДополнительныеРеквизиты КАК ДокументВзаимодействийДополнительныеРеквизиты
| ПО (ДокументВзаимодействийДополнительныеРеквизиты.Ссылка = ДокументВзаимодействий.Ссылка)
| И (ДокументВзаимодействийДополнительныеРеквизиты.Свойство = &Свойство)
| " + ТекстУсловия + "
- |
+ |
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
diff --git a/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСпискаПараметрическая/Help/ru.html b/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСпискаПараметрическая/Help/ru.html
index 754f37e48..7dfd605c9 100644
--- a/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСпискаПараметрическая/Help/ru.html
+++ b/SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСпискаПараметрическая/Help/ru.html
@@ -1,35 +1,35 @@
-
+
Предназначен для отражения взаимодействий по предмету или по контакту.
В панели навигации различных документов и элементов некоторых списков, например, списка пользователей, доступна команда Взаимодействия, которая открывает списки взаимодействий по предмету или контакту.
Например, если вызов произошел из карточки контактного лица партнера, то выводятся все взаимодействия с участием данного контактного лица. А если вызов произошел из какого-либо документа, то отображаются все взаимодействия по данному предмету.
Все Взаимодействия без исключения можно посмотреть в списке взаимодействий, который открывается по соответствующей команде раздела Органайзер.
Участники - контакты, с которыми были взаимодействия;
-
Дата - дата создания документа;
+
Дата - дата создания документа;
-
Тема - краткое содержание взаимодействия.
Жирным шрифтом в списке выделяются документы к рассмотрению, письма и сообщения SMS с установленным признаком На контроле. После установки флажка Рассмотрено выделение снимается.
+
Тема - краткое содержание взаимодействия.
Жирным шрифтом в списке выделяются документы к рассмотрению, письма и сообщения SMS с установленным признаком На контроле. После установки флажка Рассмотрено выделение снимается.
Сотрудник, ответственный за проведение опроса, имеет возможность в реальном времени отслеживать и контролировать ход анкетирования. Заполненные респондентами анкеты попадают в список.
Список открывается по команде Анкеты раздела Анкетирование.
Документ предназначен для регистрации информации о прошедших встречах, для планирования и отражения факта встреч - совещаний, семинаров и т.п. Например, в этом документе можно отразить результаты обсуждения с клиентом нового коммерческого предложения.
Предназначен для выбора документа Запланированное взаимодействие. Документ предназначен для планирования взаимодействия с одним или несколькими контактами. Документ вводится в том случае, если необходимо запланировать взаимодействие, однако как именно будет производиться взаимодействие (телефонный звонок, встреча, электронное письмо, сообщение SMS), еще не известно.
Открывается по кнопке после выбора типа данных Запланированное взаимодействие (например, при заполнении поля Предмет в каком-либо документе взаимодействий).
Документ предназначен для планирования взаимодействия с одним или несколькими контактами. Вводится в том случае, если необходимо запланировать взаимодействие, однако как именно будет производиться взаимодействие (телефонный звонок, встреча, электронное письмо, сообщение SMS), еще не известно.
Предмет - то, чему посвящено взаимодействие, например, претензии клиента. Предметом могут быть документы программы, а также документы взаимодействий. Если предмет взаимодействия не определен, то в качестве предмета выступает текущий документ (т.е. такой документ начинает цепочку взаимодействий).
Для заполнения поля нажмите Выбрать, выберите тип данных, затем из соответствующего списка выберите конкретный документ.
Тема - краткое описание того, чему будет посвящено запланированное взаимодействие.
diff --git a/SSL/src/Documents/ЗапланированноеВзаимодействие/Forms/ФормаДокумента/Module.bsl b/SSL/src/Documents/ЗапланированноеВзаимодействие/Forms/ФормаДокумента/Module.bsl
index 4fe711355..2cfdd67dd 100644
--- a/SSL/src/Documents/ЗапланированноеВзаимодействие/Forms/ФормаДокумента/Module.bsl
+++ b/SSL/src/Documents/ЗапланированноеВзаимодействие/Forms/ФормаДокумента/Module.bsl
@@ -21,7 +21,9 @@
Взаимодействия.ПодготовитьОповещения(ЭтотОбъект,Параметры);
// СтандартныеПодсистемы.Свойства
- УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, , "СтраницаДополнительныеРеквизиты");
+ ДополнительныеПараметры = Новый Структура;
+ ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "СтраницаДополнительныеРеквизиты");
+ УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
// Конец СтандартныеПодсистемы.Свойства
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда
diff --git a/SSL/src/Documents/ЗапланированноеВзаимодействие/Help/ru.html b/SSL/src/Documents/ЗапланированноеВзаимодействие/Help/ru.html
index 58d20ac63..3a42de587 100644
--- a/SSL/src/Documents/ЗапланированноеВзаимодействие/Help/ru.html
+++ b/SSL/src/Documents/ЗапланированноеВзаимодействие/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Запланированное взаимодействие
Документ предназначен для планирования взаимодействия с одним или несколькими контактами. Документ вводится в том случае, если необходимо запланировать взаимодействие, однако как именно будет производиться взаимодействие (телефонный звонок, встреча, электронное письмо, сообщение SMS), еще не известно.
Для того чтобы респондент приступил к заполнению анкеты по составленному шаблону, необходимо выполнить ряд подготовительных действий. Сначала необходимо организовать проведение опроса, в рамках которого определить сроки его проведения, состав респондентов и шаблон анкеты, на основании которого будут сформированы анкеты респондентов.
Назначение опроса
diff --git a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаДокумента/Module.bsl b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаДокумента/Module.bsl
index 033a74171..0626a8481 100644
--- a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаДокумента/Module.bsl
+++ b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаДокумента/Module.bsl
@@ -62,7 +62,7 @@
Для каждого ЭлементМассива Из Параметр.ОтобранныеРеспонденты Цикл
- Если Объект.Респонденты.НайтиСтроки(Новый Структура("Респондент",ЭлементМассива)).Количество() = 0 Тогда
+ Если Объект.Респонденты.НайтиСтроки(Новый Структура("Респондент", ЭлементМассива)).Количество() = 0 Тогда
НоваяСтрока = Объект.Респонденты.Добавить();
НоваяСтрока.Респондент = ЭлементМассива;
@@ -70,6 +70,7 @@
КонецЕсли;
КонецЦикла;
+ Модифицированность = Истина;
КонецЕсли;
diff --git a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Form.form b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Form.form
index ce4c05268..d75f7030e 100644
--- a/SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Form.form
+++ b/SSL/src/Documents/НазначениеОпросов/Forms/ФормаПодбораРеспондентов/Form.form
@@ -230,102 +230,6 @@
true
Для того чтобы респондент приступил к заполнению анкеты по составленному шаблону, необходимо выполнить ряд подготовительных действий. Сначала необходимо организовать проведение опроса, в рамках которого определить сроки его проведения, состав респондентов и шаблон анкеты, на основании которого будут сформированы анкеты респондентов.
Открывается по команде Назначения опросов раздела Анкетирование.
diff --git a/SSL/src/Documents/НазначениеОпросов/НазначениеОпросов.mdo b/SSL/src/Documents/НазначениеОпросов/НазначениеОпросов.mdo
index 09a1b9ec3..bea2bd886 100644
--- a/SSL/src/Documents/НазначениеОпросов/НазначениеОпросов.mdo
+++ b/SSL/src/Documents/НазначениеОпросов/НазначениеОпросов.mdo
@@ -10,7 +10,7 @@
НазначениеОпросовru
- Назначение опросов
+ Проведение опросовtrueDocument.НазначениеОпросов.StandardAttribute.Number
@@ -59,10 +59,10 @@
UseManagedUse
-
+ ru
- Назначения опросов
-
+ Проведение опроса
+
String11Variable
diff --git a/SSL/src/Documents/СообщениеSMS/Forms/ФормаДокумента/Help/ru.html b/SSL/src/Documents/СообщениеSMS/Forms/ФормаДокумента/Help/ru.html
index 981e9b11a..26b976e03 100644
--- a/SSL/src/Documents/СообщениеSMS/Forms/ФормаДокумента/Help/ru.html
+++ b/SSL/src/Documents/СообщениеSMS/Forms/ФормаДокумента/Help/ru.html
@@ -1,12 +1,12 @@
-
+
Документ предназначен для отправки сообщения SMS одному или нескольким адресатам, проведения SMS-рассылки и последующего отражения факта отправки сообщений.
Документ позволяет создавать, редактировать и отправлять сообщения SMS, помимо их документирования и хранения. Возможна отправка нескольких сообщений с одинаковым текстом разным адресатам посредством одного документа. При этом отслеживается как состояние документа в целом, так и состояния отдельного сообщения каждому из различных адресатов в рамках документа.
Предмет - то, чему посвящено взаимодействие, например, претензии клиента. Предметом могут быть документы программы, а также документы взаимодействий. Если предмет взаимодействия не определен, то в качестве предмета выступает текущий документ (т.е. такой документ начинает цепочку взаимодействий).
Для заполнения поля нажмите Выбрать, выберите тип данных, затем из соответствующего списка выберите конкретный документ.
diff --git a/SSL/src/Documents/СообщениеSMS/Forms/ФормаДокумента/Module.bsl b/SSL/src/Documents/СообщениеSMS/Forms/ФормаДокумента/Module.bsl
index bbbed3e91..795e724c4 100644
--- a/SSL/src/Documents/СообщениеSMS/Forms/ФормаДокумента/Module.bsl
+++ b/SSL/src/Documents/СообщениеSMS/Forms/ФормаДокумента/Module.bsl
@@ -33,7 +33,9 @@
Взаимодействия.ПодготовитьОповещения(ЭтотОбъект, Параметры);
// СтандартныеПодсистемы.Свойства
- УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, , "СтраницаДополнительныеРеквизиты");
+ ДополнительныеПараметры = Новый Структура;
+ ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "СтраницаДополнительныеРеквизиты");
+ УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
// Конец СтандартныеПодсистемы.Свойства
КонецПроцедуры
@@ -121,7 +123,10 @@
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
- ВзаимодействияКлиент.ПроверкаЗаполненностиРеквизитовОтложеннойОтправки(Объект, Отказ);
+ Если Объект.Состояние = ПредопределенноеЗначение("Перечисление.СостоянияДокументаСообщениеSMS.Черновик")
+ ИЛИ Объект.Состояние = ПредопределенноеЗначение("Перечисление.СостоянияДокументаСообщениеSMS.Исходящее") Тогда
+ ВзаимодействияКлиент.ПроверкаЗаполненностиРеквизитовОтложеннойОтправки(Объект, Отказ);
+ КонецЕсли;
КонецПроцедуры
diff --git a/SSL/src/Documents/СообщениеSMS/Help/ru.html b/SSL/src/Documents/СообщениеSMS/Help/ru.html
index 416a2324c..91e8f1697 100644
--- a/SSL/src/Documents/СообщениеSMS/Help/ru.html
+++ b/SSL/src/Documents/СообщениеSMS/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для выбора документа Сообщение SMS. Документ используется для отправки сообщения SMS одному или нескольким адресатам.
Открывается по кнопке после выбора типа данных Сообщение SMS (например, при заполнении поля Предмет в каком-либо документе взаимодействий).
В списке выводится:
diff --git a/SSL/src/Documents/СообщениеSMS/ObjectModule.bsl b/SSL/src/Documents/СообщениеSMS/ObjectModule.bsl
index 4d76aae1a..2dcc3aa08 100644
--- a/SSL/src/Documents/СообщениеSMS/ObjectModule.bsl
+++ b/SSL/src/Documents/СообщениеSMS/ObjectModule.bsl
@@ -13,6 +13,8 @@
КонецПроцедуры
+#КонецОбласти
+
#Область ОбработчикиСобытий
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
@@ -54,8 +56,6 @@
-#КонецОбласти
-
#КонецОбласти
#КонецЕсли
\ No newline at end of file
diff --git a/SSL/src/Documents/ТелефонныйЗвонок/Forms/ФормаДокумента/Help/ru.html b/SSL/src/Documents/ТелефонныйЗвонок/Forms/ФормаДокумента/Help/ru.html
index 3c558bb23..188dada0e 100644
--- a/SSL/src/Documents/ТелефонныйЗвонок/Forms/ФормаДокумента/Help/ru.html
+++ b/SSL/src/Documents/ТелефонныйЗвонок/Forms/ФормаДокумента/Help/ru.html
@@ -1,9 +1,9 @@
-
+
Документ предназначен для регистрации входящих и исходящих телефонных звонков.
Предмет - то, чему посвящен телефонный звонок, например, претензии клиента. Предметом могут быть документы программы и документы взаимодействий. Если предмет взаимодействия не определен, то в качестве предмета автоматически проставляется значение текущего документа, т.е. такой документ начинает цепочку взаимодействий. При выполнении команды Взаимодействия из документа предметом взаимодействия во вновь созданном документе будет предмет, указанный в исходном документе, при этом основные поля будут также скопированы.
Открывается по кнопке после выбора типа данных Телефонный звонок (например, при заполнении поля Предмет в каком-либо документе взаимодействий).
-
В списке выводится:
-
Дата регистрации - дата создания документа;
-
Номер - присваивается автоматически;
-
Описание - в поле указывается, какие действия необходимо выполнить в рамках взаимодействия;
-
Предмет - то, чему посвящен документ взаимодействий, например претензии клиента. Предметом могут быть документы программы и документы взаимодействий. Если предмет взаимодействия не определен, то в качестве предмета автоматически проставляется значение текущего документа, т.е. такой документ взаимодействия начинает цепочку взаимодействий;
-
Абонент - контакт, который указан в телефонном звонке.
Выбор документа
-
-
Выделите документ, нажмите Выбрать.
-
-
Также можно использовать двойной щелчок мыши.
Отбор по периоду
-
С помощью соответствующей команды меню Еще можно Установить интервал дат.
Ввод документа Телефонный звонок
-
Нажмите Создать. Заполните нужные поля.
Создание взаимодействий на основании телефонного звонка
-
-
Выделите нужный документ Телефонный звонок. Нажмите Взаимодействия, для того чтобы:
Предназначен для выбора документа Входящее электронное письмо. Этот документ можно только получить, ввести его невозможно.
Открывается по кнопке после выбора типа данных Входящее электронное письмо (например, при заполнении поля Предмет в каком-либо документе взаимодействий).
Открывается по кнопке после выбора типа данных Исходящее электронное письмо (например, при заполнении поля Предмет в каком-либо документе взаимодействий).
В адресном классификаторе хранятся адресные сведения, необходимые для работы в программе.
Для обеспечения единства структуры и состава адресной информации используется Федеральная информационная адресная система (ФИАС). В ФИАС содержатся почтовые адреса РФ. Использование ФИАС помогает заполнять адреса правильно и быстро. Без этого невозможна сдача отчетности. Например, при сдаче отчетности по работникам в налоговую инспекцию, в пенсионный фонд необходимо заполнить адреса по стандарту, иначе отчетность не будет принята. Кроме того, адреса могут меняться и не всегда можно уследить за этими изменениями самостоятельно. Программа позволяет управлять адресами и поддерживать их в актуальном состоянии с помощью ФИАС.
Для всех регионов РФ имеется возможность загрузки адресных сведений с сайта поддержки пользователей программы 1С:Предприятие фирмы "1С", а также из файлов, распространяемых ФНС РФ.
diff --git a/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ЗагрузкаАдресногоКлассификатора/Module.bsl b/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ЗагрузкаАдресногоКлассификатора/Module.bsl
index 560632e0c..ce4baa9d1 100644
--- a/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ЗагрузкаАдресногоКлассификатора/Module.bsl
+++ b/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ЗагрузкаАдресногоКлассификатора/Module.bsl
@@ -14,9 +14,6 @@
&НаКлиенте
Перем ПодтверждениеЗакрытияФормы;
-&НаКлиенте
-Перем Аутентификация;
-
// Параметры загрузки для передачи между клиентскими вызовами.
&НаКлиенте
Перем ПараметрыФоновойЗагрузкиКлассификатора;
@@ -31,11 +28,6 @@
Возврат;
КонецЕсли;
- Если ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() Тогда
- ПредупреждениеПриОткрытии = НСтр("ru='В веб-клиенте работа с адресным классификатором не поддерживается.'");
- Возврат;
- КонецЕсли;
-
ПараметрыДлительнойОперации = Новый Структура("Завершено, АдресРезультата, Идентификатор, Ошибка, ПодробноеПредставлениеОшибки");
ПараметрыДлительнойОперации.Вставить("ИнтервалОжидания", 5);
@@ -48,7 +40,6 @@
// Получаем уже загруженные регионы.
ТаблицаРегионов = АдресныйКлассификаторСлужебный.СведенияОЗагрузкеСубъектовРФ();
ТаблицаРегионов.Колонки.Добавить("Загружать", Новый ОписаниеТипов("Булево"));
- ТаблицаРегионов.Колонки.Добавить("ПутьКФайлам", Новый ОписаниеТипов("Строка"));
Для Каждого Регион Из ТаблицаРегионов Цикл
Регион.Представление = " " + Формат(Регион.КодСубъектаРФ, "ЧЦ=2; ЧН=; ЧВН=; ЧГ=") + ", " + Регион.Представление;
@@ -184,13 +175,16 @@
&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
- Если ПодтверждениеЗакрытияФормы <> Истина Тогда
- Оповещение = Новый ОписаниеОповещения("ЗакрытиеФормыЗавершение", ЭтотОбъект);
- Отказ = Истина;
-
- Текст = НСтр("ru = 'Прервать загрузку адресного классификатора?'");
- ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет);
- КонецЕсли;
+ Если Элементы.ШагиЗагрузки.ТекущаяСтраница <> Элементы.ОжиданиеЗагрузки
+ Или ПодтверждениеЗакрытияФормы = Истина Тогда
+ Возврат;
+ КонецЕсли;
+
+ Оповещение = Новый ОписаниеОповещения("ЗакрытиеФормыЗавершение", ЭтотОбъект);
+ Отказ = Истина;
+
+ Текст = НСтр("ru = 'Прервать загрузку адресного классификатора?'");
+ ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
@@ -281,10 +275,11 @@
ИначеЕсли КодИсточникаЗагрузки = "САЙТ" Тогда
ЗагрузитьКлассификаторССайта();
+
Иначе
ОбщегоНазначенияКлиентСервер.СообщитьПользователю( НСтр("ru = 'Не указан вариант загрузки классификатора.'") );
КонецЕсли;
-
+
КонецПроцедуры
&НаКлиенте
@@ -331,16 +326,9 @@
Если Результат <> Истина Тогда
Возврат;
-
- ИначеЕсли Не ПодключитьРасширениеРаботыСФайлами() Тогда
- ПоказатьПредупреждение(, НСтр("ru = 'Расширение для работы с файлами не подключено.'"));
- Возврат;
-
КонецЕсли;
- Если ДополнительныеПараметры.КодИсточникаЗагрузки = "КАТАЛОГ" Тогда
- ЗагрузитьКлассификаторИзКаталога(ДополнительныеПараметры.АдресЗагрузки);
- КонецЕсли;
+ ЗагрузитьКлассификаторИзКаталога(ДополнительныеПараметры.АдресЗагрузки);
КонецПроцедуры
@@ -421,7 +409,14 @@
// Проверка доступности и наличия файлов.
ПараметрыЗагрузки = Новый Структура("КодИсточникаЗагрузки, ПолеОшибки", КодИсточникаЗагрузки, "АдресЗагрузки");
- РезультатАнализа = АдресныйКлассификаторКлиентСервер.АнализДоступностиФайловКлассификатораВКаталоге(КодыРегионов, КаталогДанных, ПараметрыЗагрузки);
+ ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьКлассификаторИзКаталогаЗавершение", ЭтотОбъект);
+ АдресныйКлассификаторКлиент.АнализДоступностиФайловКлассификатораВКаталоге(ОписаниеОповещения, КодыРегионов, КаталогДанных, ПараметрыЗагрузки);
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗагрузитьКлассификаторИзКаталогаЗавершение(РезультатАнализа, ДополнительныеПараметры) Экспорт
+
Если РезультатАнализа.Ошибки <> Неопределено Тогда
// Не хватает файлов для загрузки по указанным режимам.
ОчиститьСообщения();
@@ -434,6 +429,7 @@
РезультатАнализа.Вставить("УдалитьПослеПередачиНаСервер", УдалитьПослеПередачиНаСервер);
ЗапуститьФоновуюЗагрузкуИзКаталогаКлиента(РезультатАнализа);
+
КонецПроцедуры
&НаКлиенте
@@ -496,72 +492,13 @@
&НаКлиенте
Процедура ЗагрузитьКлассификаторССайтаФИАС()
- ЗагрузитьСледующийРегион(-1);
-КонецПроцедуры
-
-&НаКлиенте
-Процедура ЗагрузитьСледующийРегион(КодПредыдущегоЗагруженногоРегиона)
+ КодыРегионов = ПараметрыФоновойЗагрузкиКлассификатора.КодыРегионов;
+ Аутентификация = ПараметрыФоновойЗагрузкиКлассификатора.Аутентификация;
+ ПараметрыФоновойЗагрузкиКлассификатора = Неопределено;
- Если КодПредыдущегоЗагруженногоРегиона > 0 Тогда
-
- Индекс = ПараметрыФоновойЗагрузкиКлассификатора.КодыРегионов.Найти(КодПредыдущегоЗагруженногоРегиона);
- Если Индекс <> Неопределено Тогда
- ПараметрыФоновойЗагрузкиКлассификатора.КодыРегионов.Удалить(Индекс);
- КонецЕсли;
- КонецЕсли;
-
- Если ПараметрыФоновойЗагрузкиКлассификатора.КодыРегионов.Количество() > 0 Тогда
- ПоказательПрогрессаЗагрузки = Элементы.ПоказательПрогрессаЗагрузки.МаксимальноеЗначение - ПараметрыФоновойЗагрузкиКлассификатора.КодыРегионов.Количество();
- КодыРегионов = Новый Массив;
- КодыРегионов.Добавить(ПараметрыФоновойЗагрузкиКлассификатора.КодыРегионов[0]);
- КодЗагружаемогоРегиона = ПараметрыФоновойЗагрузкиКлассификатора.КодыРегионов[0];
- Если КодИсточникаЗагрузки = "САЙТ" Тогда
- ЗапуститьФоновуюЗагрузкуССайтаНаСервере(КодыРегионов, ПараметрыФоновойЗагрузкиКлассификатора.Аутентификация);
- Иначе
- // Список передаваемых на сервер файлов.
- ПомещаемыеФайлы = Новый Массив;
- КлючЗначение = ПараметрыФоновойЗагрузкиКлассификатора.ФайлыПоРегионам.Получить(КодЗагружаемогоРегиона);
- Если ТипЗнч(КлючЗначение) = Тип("Массив") Тогда
- Для Каждого ИмяФайла Из КлючЗначение Цикл
- ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла));
- КонецЦикла;
- Иначе
- ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(КлючЗначение));
- КонецЕсли;
-
- ПомещенныеФайлы = Новый Массив;
- ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, УникальныйИдентификатор);
-
- // Сохраняем время изменения - версию.
- Для Позиция = 0 По ПомещенныеФайлы.ВГраница() Цикл
- Описание = ПомещенныеФайлы[Позиция];
-
- ДанныеФайла = Новый Структура("Имя, Хранение, КодРегиона");
- ЗаполнитьЗначенияСвойств(ДанныеФайла, Описание);
-
- Файл = Новый Файл(Описание.Имя);
- ДанныеФайла.Вставить("ВремяИзменения", Файл.ПолучитьУниверсальноеВремяИзменения());
-
- ПомещенныеФайлы[Позиция] = ДанныеФайла;
- КонецЦикла;
-
- ЗапуститьФоновуюЗагрузкуНаСервере(КодыРегионов, ПомещенныеФайлы, Неопределено);
- КонецЕсли;
- ПодключитьОбработчикОжидания("Подключаемый_ОжиданиеДлительнойОперации", 0.1, Истина);
- Иначе
- Элементы.ШагиЗагрузки.ТекущаяСтраница = Элементы.УспешноеЗавершение;
- ТекстОписанияЗагрузки = НСтр("ru = 'Адресный классификатор успешно загружен.'");
-
- Оповестить("ЗагруженАдресныйКлассификатор",, ЭтотОбъект);
-
- Элементы.Закрыть.КнопкаПоУмолчанию = Истина;
- ТекущийЭлемент = Элементы.Закрыть;
- ПодтверждениеЗакрытияФормы = Истина;
- // Для сброса признака АдресныйКлассификаторУстарел в параметрах работы клиента.
- ОбновитьПовторноИспользуемыеЗначения();
- КонецЕсли;
-
+ ЗапуститьФоновуюЗагрузкуССайтаНаСервере(КодыРегионов, Аутентификация);
+ ПодключитьОбработчикОжидания("Подключаемый_ОжиданиеДлительнойОперации", 0.1, Истина);
КонецПроцедуры
&НаСервере
@@ -605,6 +542,7 @@
ПараметрыДлительнойОперации.Ошибка = ТекстОшибки;
ПараметрыДлительнойОперации.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(Информация);
Элементы.АвторизацияНаСайтеПоддержкиПользователей.Видимость = Истина;
+
Возврат;
КонецПопытки;
@@ -629,20 +567,89 @@
&НаКлиенте
Процедура ЗапуститьФоновуюЗагрузкуИзКаталогаКлиентаПродолжение()
+ ПараметрыЗагрузки = ПараметрыФоновойЗагрузкиКлассификатора;
+ ПараметрыФоновойЗагрузкиКлассификатора = Неопределено;
- Если ПараметрыФоновойЗагрузкиКлассификатора = Неопределено Тогда
+ Если ПараметрыЗагрузки = Неопределено Тогда
// Возвращаемся на страницу выбора.
Элементы.ШагиЗагрузки.ТекущаяСтраница = Элементы.ВыборРегионовЗагрузки;
Возврат;
КонецЕсли;
- // Запуск фонового по загрузке из переданных файлов.
- Если ЭтоАдресВременногоХранилища(ПараметрыДлительнойОперации.АдресРезультата) Тогда
- УдалитьИзВременногоХранилища(ПараметрыДлительнойОперации.АдресРезультата);
- КонецЕсли;
- ПараметрыДлительнойОперации.АдресРезультата = Неопределено;
+ // Список передаваемых на сервер файлов.
+ ПомещаемыеФайлы = Новый Массив;
+ Для Каждого КлючЗначение Из ПараметрыЗагрузки.ФайлыПоРегионам Цикл
+ Если ТипЗнч(КлючЗначение.Значение) = Тип("Массив") Тогда
+ Для Каждого ИмяФайла Из КлючЗначение.Значение Цикл
+ ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла));
+ КонецЦикла;
+ Иначе
+ ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(КлючЗначение.Значение));
+ КонецЕсли;
+ КонецЦикла;
- ЗагрузитьСледующийРегион(-1);
+ ДополнительныеПараметры = Новый Структура;
+ ДополнительныеПараметры.Вставить("ПараметрыЗагрузки", ПараметрыЗагрузки);
+ ДополнительныеПараметры.Вставить("Позиция", 0);
+ ОписаниеОповещения = Новый ОписаниеОповещения("ЗапуститьФоновуюЗагрузкуИзКаталогаКлиентаПослеПомещенияФайлов",
+ ЭтотОбъект, ДополнительныеПараметры);
+ НачатьПомещениеФайлов(ОписаниеОповещения, ПомещаемыеФайлы,, Ложь, УникальныйИдентификатор);
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗапуститьФоновуюЗагрузкуИзКаталогаКлиентаПослеПомещенияФайлов(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт
+
+ Позиция = ДополнительныеПараметры.Позиция;
+ Если Позиция <= ПомещенныеФайлы.ВГраница() Тогда
+
+ // Сохраняем время изменения - версию.
+ Описание = ПомещенныеФайлы[Позиция];
+
+ ДанныеФайла = Новый Структура("Имя, Хранение");
+ ЗаполнитьЗначенияСвойств(ДанныеФайла, Описание);
+
+ ДополнительныеПараметры.Вставить("ДанныеФайла", ДанныеФайла);
+ ДополнительныеПараметры.Вставить("ПомещенныеФайлы", ПомещенныеФайлы);
+ ОписаниеОповещения = Новый ОписаниеОповещения("ЗапуститьФоновуюЗагрузкуИзКаталогаКлиентаПослеИнициализации", ЭтотОбъект, ДополнительныеПараметры);
+
+ Файл = Новый Файл();
+ Файл.НачатьИнициализацию(ОписаниеОповещения, Описание.Имя);
+
+ Иначе // выход из цикла
+
+ // Запуск фонового по загрузке из переданных файлов.
+ Если ЭтоАдресВременногоХранилища(ПараметрыДлительнойОперации.АдресРезультата) Тогда
+ УдалитьИзВременногоХранилища(ПараметрыДлительнойОперации.АдресРезультата);
+ КонецЕсли;
+ ПараметрыДлительнойОперации.АдресРезультата = Неопределено;
+
+ Режим = Неопределено;
+ ДополнительныеПараметры.ПараметрыЗагрузки.Свойство("Режим", Режим);
+
+ ЗапуститьФоновуюЗагрузкуНаСервере(ДополнительныеПараметры.ПараметрыЗагрузки.КодыРегионов, ПомещенныеФайлы, Режим);
+ ПодключитьОбработчикОжидания("Подключаемый_ОжиданиеДлительнойОперации", 0.1, Истина);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗапуститьФоновуюЗагрузкуИзКаталогаКлиентаПослеИнициализации(Файл, ДополнительныеПараметры) Экспорт
+
+ ОписаниеОповещения = Новый ОписаниеОповещения("ЗапуститьФоновуюЗагрузкуИзКаталогаКлиентаПослеПолученияВремениИзменения",
+ ЭтотОбъект, ДополнительныеПараметры);
+ Файл.НачатьПолучениеУниверсальногоВремениИзменения(ОписаниеОповещения);
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗапуститьФоновуюЗагрузкуИзКаталогаКлиентаПослеПолученияВремениИзменения(ВремяИзменения, ДополнительныеПараметры) Экспорт
+
+ ДополнительныеПараметры.ДанныеФайла.Вставить("ВремяИзменения", ВремяИзменения);
+ ДополнительныеПараметры.ПомещенныеФайлы[ДополнительныеПараметры.Позиция] = ДополнительныеПараметры.ДанныеФайла;
+ ДополнительныеПараметры.Позиция = ДополнительныеПараметры.Позиция + 1;
+ ЗапуститьФоновуюЗагрузкуИзКаталогаКлиентаПослеПомещенияФайлов(ДополнительныеПараметры.ПомещенныеФайлы, ДополнительныеПараметры);
КонецПроцедуры
@@ -679,18 +686,17 @@
);
Исключение
ТекстОшибки = НСтр("ru = 'Не удается загрузить адресные сведения из файлов.'");
- ТекстОшибки = ТекстОшибки + НСтр("ru = 'Необходимо сохранить файлы с сайта «1С» на диск, а затем загрузить в программу.'") + Символы.ПС;
+ ТекстОшибки = ТекстОшибки + НСтр("ru = 'Необходимо сохранить файлы с сайта «1С» http://its.1c.ru/download/fias на диск, а затем загрузить в программу.'") + Символы.ПС;
ТекстОшибки = ТекстОшибки + НСтр("ru = 'Техническая информация:'") + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
ПараметрыДлительнойОперации.Ошибка = ТекстОшибки;
Возврат;
-
КонецПопытки;
ПараметрыДлительнойОперации.Идентификатор = РезультатЗапуска.ИдентификаторЗадания;
ПараметрыДлительнойОперации.Завершено = РезультатЗапуска.ЗаданиеВыполнено;
ПараметрыДлительнойОперации.АдресРезультата = РезультатЗапуска.АдресХранилища;
- // Запущенное
+ // Запущенное
Элементы.ПрерватьЗагрузку.Доступность = Истина;
КонецПроцедуры
@@ -710,8 +716,8 @@
Результат.Прогресс = ДлительныеОперации.ПрочитатьПрогресс(ПараметрыДлительнойОперации.Идентификатор);
Исключение
Информация = ИнформацияОбОшибке();
- Результат.ПодробноеПредставлениеОшибки = ПараметрыДлительнойОперации.ПодробноеПредставлениеОшибки;
- Результат.Ошибка = ПараметрыДлительнойОперации.Ошибка;
+ Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(Информация);
+ Результат.Ошибка = КраткоеПредставлениеОшибки(Информация);
КонецПопытки
КонецЕсли;
@@ -742,14 +748,27 @@
Элементы.АвторизацияНаСайтеПоддержкиПользователей.Видимость = Истина;
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Состояние.Ошибка);
Возврат;
- ИначеЕсли Состояние.Завершено = Неопределено Тогда
- // Завершено с ошибкой, вернемся на первую страницу.
- Элементы.ШагиЗагрузки.ТекущаяСтраница = Элементы.ВыборРегионовЗагрузки;
- Элементы.АвторизацияНаСайтеПоддержкиПользователей.Видимость = Истина;
- Возврат;
+
ИначеЕсли Состояние.Завершено Тогда
- ЗагрузитьСледующийРегион(КодЗагружаемогоРегиона);
+ Элементы.ШагиЗагрузки.ТекущаяСтраница = Элементы.УспешноеЗавершение;
+ ТекстОписанияЗагрузки = НСтр("ru = 'Адресный классификатор успешно загружен.'");
+
+ Оповестить("ЗагруженАдресныйКлассификатор", , ЭтотОбъект);
+
+ Элементы.Закрыть.КнопкаПоУмолчанию = Истина;
+ ТекущийЭлемент = Элементы.Закрыть;
+ ПодтверждениеЗакрытияФормы = Истина;
+ // Для сброса признака АдресныйКлассификаторУстарел в параметрах работы клиента.
+ ОбновитьПовторноИспользуемыеЗначения();
+ Если ЕстьУстаревшиеАдресныеСведенияКЛАДРДляУдаления() Тогда
+ ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВопросаОбУдалениеКЛАДР", ЭтотОбъект);
+ ТекстВопроса = НСтр("ru = 'Найдены устаревшие сведения о регионах в формате КЛАДР, которые не используются в программе.'");
+ ТекстВопроса = ТекстВопроса + Символы.ПС + НСтр("ru = 'Если загруженных регионов много, то процесс очистки может занять продолжительное время.'");
+ ТекстВопроса = ТекстВопроса + Символы.ПС + НСтр("ru = 'Очистить?'");
+ ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
+ КонецЕсли;
Возврат;
+
КонецЕсли;
// Процесс продолжается
@@ -760,14 +779,20 @@
КонецПроцедуры
+&НаКлиенте
+Процедура ПослеВопросаОбУдалениеКЛАДР(Результат, Параметр) Экспорт
+ Если Результат = КодВозвратаДиалога.Да Тогда
+ ОчиститьУстаревшиеАдресныеСведенияКЛАДР();
+ КонецЕсли;
+КонецПроцедуры
+
&НаКлиенте
Функция КодыРегионовДляЗагрузки()
Результат = Новый Массив;
- Для Каждого Регион Из СубъектыРФ.НайтиСтроки(Новый Структура("Загружать", Истина)) Цикл
+ Для Каждого Регион Из СубъектыРФ.НайтиСтроки( Новый Структура("Загружать", Истина) ) Цикл
Результат.Добавить(Регион.КодСубъектаРФ);
КонецЦикла;
- Элементы.ПоказательПрогрессаЗагрузки.МаксимальноеЗначение = Результат.Количество();
Возврат Результат;
КонецФункции
@@ -801,5 +826,41 @@
КонецПроцедуры
+&НаСервереБезКонтекста
+Функция ЕстьУстаревшиеАдресныеСведенияКЛАДРДляУдаления()
+ Запрос = Новый Запрос;
+ Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
+ | УдалитьАдресныйКлассификатор.Код
+ |ИЗ
+ | РегистрСведений.УдалитьАдресныйКлассификатор КАК УдалитьАдресныйКлассификатор";
+
+ РезультатЗапроса = Запрос.Выполнить().Выбрать();
+ Если РезультатЗапроса .Следующий() Тогда
+ Возврат Истина;
+ КонецЕсли;
+ Возврат Ложь;
+КонецФункции
+
+// Удаляет устаревшие данные КЛАДР если они есть.
+//
+&НаСервере
+Процедура ОчиститьУстаревшиеАдресныеСведенияКЛАДР()
+
+ Попытка
+ ПараметрыМетода = Новый Структура();
+ РезультатЗапуска = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
+ УникальныйИдентификатор,
+ "АдресныйКлассификаторСлужебный.ОчиститьУстаревшиеАдресныеСведенияКЛАДР",
+ ПараметрыМетода, НСтр("ru = 'Очистка адресного классификатора в формате КЛАДР'"));
+ Исключение
+ Информация = ИнформацияОбОшибке();
+ КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Информация);
+ ТекстОшибки = НСтр("ru = 'Не удается загрузить адресные сведения.'");
+ ТекстОшибки = ТекстОшибки + НСтр("ru = 'Техническая информация:'") + " " + Символы.ПС;
+ ТекстОшибки = ТекстОшибки + КраткоеПредставлениеОшибки(Информация);
+ ЗаписьЖурналаРегистрации(НСтр("ru = 'Очистка адресного классификатора в формате КЛАДР'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Предупреждение,
+ Метаданные.РегистрыСведений.УдалитьАдресныйКлассификатор,, ТекстОшибки);
+ КонецПопытки;
+КонецПроцедуры
#КонецОбласти
diff --git a/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ОчисткаАдресногоКлассификатора/Form.form b/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ОчисткаАдресногоКлассификатора/Form.form
index 21df9e496..95327ba78 100644
--- a/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ОчисткаАдресногоКлассификатора/Form.form
+++ b/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ОчисткаАдресногоКлассификатора/Form.form
@@ -30,24 +30,96 @@
MoveDownMoveUpSelectAll
-
- СубъектыРФОчищать
- 20
+
+ СубъектыРФГруппа
+ 134
+
+ СубъектыРФОчищать
+ 20
+ true
+ true
+
+ true
+
+
+ СубъектыРФ.Очищать
+
+
+ OnChange
+ СубъектыРФОчищатьПриИзменении
+
+
+ СубъектыРФОчищатьРасширеннаяПодсказка
+ 22
+ Label
+ true
+ true
+
+ Left
+
+
+
+ СубъектыРФОчищатьКонтекстноеМеню
+ 21
+ true
+
+ CheckBoxField
+ Auto
+ true
+ Left
+ true
+
+
+
+ СубъектыРФПредставление
+ 17
+ true
+ true
+
+ true
+
+
+ СубъектыРФ.Представление
+
+
+ СубъектыРФПредставлениеРасширеннаяПодсказка
+ 19
+ Label
+ true
+ true
+
+ Left
+
+
+
+ СубъектыРФПредставлениеКонтекстноеМеню
+ 18
+ true
+
+ LabelField
+ Left
+ Auto
+ true
+ Left
+ true
+ Left
+
+ true
+ true
+
+ truetruetrue
-
- СубъектыРФ.Очищать
-
-
- OnChange
- СубъектыРФОчищатьПриИзменении
-
+
+ ru
+ Субъекты РФ
+
- СубъектыРФОчищатьРасширеннаяПодсказка
- 22
+ СубъектыРФГруппаРасширеннаяПодсказка
+ 135Labeltruetrue
@@ -55,54 +127,11 @@
Left
-
- СубъектыРФОчищатьКонтекстноеМеню
- 21
- true
-
- CheckBoxField
- Auto
- true
- Left
- true
-
-
-
- СубъектыРФПредставление
- 17
- true
- true
-
- true
-
-
- СубъектыРФ.Представление
-
-
- СубъектыРФПредставлениеРасширеннаяПодсказка
- 19
- Label
- true
- true
-
- Left
-
-
-
- СубъектыРФПредставлениеКонтекстноеМеню
- 18
- true
-
- LabelField
- Left
- Auto
- true
- Left
- true
- Left
-
- true
- true
+ ColumnGroup
+
+ InCell
+ auto
+ true
@@ -378,6 +407,13 @@
ruЧН=-
+
+ System.DefaultGUIFont
+ true
+ false
+ false
+ false
+
@@ -411,17 +447,47 @@
Left
-
- Очистить
- 10
+
+ ГруппаКомандЗагрузкиПанель
+ 128
+
+ Очистить
+ 10
+ true
+ true
+
+ true
+
+
+ ОчиститьРасширеннаяПодсказка
+ 11
+ Label
+ true
+ true
+
+ Left
+
+
+ Form.Command.Очистить
+ Auto
+ true
+ true
+ true
+ UserCmds
+ Auto
+ truetruetrue
+
+ ru
+ Группа команд загрузки панель
+
- ОчиститьРасширеннаяПодсказка
- 11
+ ГруппаКомандЗагрузкиПанельРасширеннаяПодсказка
+ 129Labeltruetrue
@@ -429,14 +495,10 @@
Left
- UsualButton
- Form.Command.Очистить
- Auto
- true
- true
- true
- UserCmds
- Auto
+ CommandBar
+
+ Right
+ truetrue
@@ -447,10 +509,6 @@
ruГруппа команд загрузки
-
- ru
- Группа команд загрузки
- trueГруппаКомандЗагрузкиРасширеннаяПодсказка
@@ -617,20 +675,88 @@
Auto
+
+ Декорация2
+ 80
+ true
+ true
+
+ true
+
+
+ Декорация2РасширеннаяПодсказка
+ 82
+ Label
+ true
+ true
+
+ Left
+
+
+
+ Декорация2КонтекстноеМеню
+ 81
+ true
+
+ Label
+ true
+ true
+ true
+
+ Left
+
+
+
+ ТекстСостоянияЗагрузки
+ 88
+ true
+ true
+
+ true
+
+
+ ТекстСостоянияОчистки
+
+ None
+
+ ТекстСостоянияЗагрузкиРасширеннаяПодсказка
+ 90
+ Label
+ true
+ true
+
+ Left
+
+
+
+ ТекстСостоянияЗагрузкиКонтекстноеМеню
+ 89
+ true
+
+ LabelField
+ Enter
+ true
+ Left
+ true
+
+ true
+ true
+
+ ГруппаКомандОтмены76
- Декорация2
- 80
+ Декорация3
+ 85truetruetrue
- Декорация2РасширеннаяПодсказка
- 82
+ Декорация3РасширеннаяПодсказка
+ 87Labeltruetrue
@@ -639,89 +765,21 @@
- Декорация2КонтекстноеМеню
- 81
+ Декорация3КонтекстноеМеню
+ 86trueLabeltruetrue
- true
+ trueLeft
-
- ТекстСостоянияЗагрузки
- 88
- true
- true
-
- true
-
-
- ТекстСостоянияОчистки
-
- None
-
- ТекстСостоянияЗагрузкиРасширеннаяПодсказка
- 90
- Label
- true
- true
-
- Left
-
-
-
- ТекстСостоянияЗагрузкиКонтекстноеМеню
- 89
- true
-
- LabelField
- Enter
- true
- Left
- true
-
- true
- true
-
-
- Группа1
- 83
-
- Декорация3
- 85
- true
- true
-
- true
-
-
- Декорация3РасширеннаяПодсказка
- 87
- Label
- true
- true
-
- Left
-
-
-
- Декорация3КонтекстноеМеню
- 86
- true
-
- Label
- true
- true
- true
-
- Left
-
-
+ ГруппаКомандОтменыПанель
+ 130ПрерватьОчистку78
@@ -740,7 +798,6 @@
Left
- UsualButtonForm.Command.ПрерватьОчисткуNormalAuto
@@ -754,9 +811,13 @@
true
+
+ ru
+ Группа команд отмены панель
+
- Группа1РасширеннаяПодсказка
- 84
+ ГруппаКомандОтменыПанельРасширеннаяПодсказка
+ 131Labeltruetrue
@@ -764,13 +825,9 @@
Left
- UsualGroup
-
- Auto
- true
- true
- Auto
- Auto
+ CommandBar
+
+ Righttrue
@@ -782,10 +839,6 @@
ruГруппа команд отмены
-
- ru
- Группа команд отмены
- truetrue
@@ -800,9 +853,7 @@
UsualGroup
- VerticalAuto
- NormalSeparationtruetrueAuto
@@ -954,20 +1005,51 @@
Auto
+
+ Декорация4
+ 103
+ true
+ true
+
+ true
+
+
+ Декорация4РасширеннаяПодсказка
+ 105
+ Label
+ true
+ true
+
+ Left
+
+
+
+ Декорация4КонтекстноеМеню
+ 104
+ true
+
+ Label
+ true
+ true
+ true
+
+ Left
+
+ ГруппаКомандЗавершения101
- Декорация4
- 103
+ Декорация5
+ 111truetruetrue
- Декорация4РасширеннаяПодсказка
- 105
+ Декорация5РасширеннаяПодсказка
+ 113Labeltruetrue
@@ -976,52 +1058,21 @@
- Декорация4КонтекстноеМеню
- 104
+ Декорация5КонтекстноеМеню
+ 112trueLabeltruetrue
- true
+ trueLeft
- Группа2
- 109
-
- Декорация5
- 111
- true
- true
-
- true
-
-
- Декорация5РасширеннаяПодсказка
- 113
- Label
- true
- true
-
- Left
-
-
-
- Декорация5КонтекстноеМеню
- 112
- true
-
- Label
- true
- true
- true
-
- Left
-
-
+ ГруппаКомандЗавершенияПанель
+ 132Закрыть114
@@ -1040,10 +1091,8 @@
Left
- UsualButtonForm.StandardCommand.CloseNormal
- AutotruetrueUserCmds
@@ -1054,9 +1103,13 @@
true
+
+ ru
+ Группа команд завершения панель
+
- Группа2РасширеннаяПодсказка
- 110
+ ГруппаКомандЗавершенияПанельРасширеннаяПодсказка
+ 133Labeltruetrue
@@ -1064,13 +1117,9 @@
Left
- UsualGroup
-
- Auto
- true
- true
- Auto
- Auto
+ CommandBar
+
+ Righttrue
@@ -1082,10 +1131,6 @@
ruГруппа команд завершения
-
- ru
- Группа команд отмены
- truetrue
@@ -1100,9 +1145,7 @@
UsualGroup
- VerticalAuto
- NormalSeparationtruetrueAuto
@@ -1187,7 +1230,7 @@
OnCloseПриЗакрытии
- 10
+ 15LockOwnerUseUseList
@@ -1359,12 +1402,12 @@
Очиститьru
- Очистить
+ Очистить адресные сведения2ru
- Очистить
+ Очистить адресные сведения для выбранных регионовtrue
diff --git a/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ОчисткаАдресногоКлассификатора/Help/ru.html b/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ОчисткаАдресногоКлассификатора/Help/ru.html
index db82090b1..75a00ef38 100644
--- a/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ОчисткаАдресногоКлассификатора/Help/ru.html
+++ b/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ОчисткаАдресногоКлассификатора/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для удаления адресных данных (например, ошибочно загруженных).
Открывается по команде Адресный классификатор - Очистить адресные сведения в разделе Администрирование - Поддержка и обслуживание.
Включите флажки рядом с наименованиями нужных регионов.
diff --git a/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ОчисткаАдресногоКлассификатора/Module.bsl b/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ОчисткаАдресногоКлассификатора/Module.bsl
index 201cd2700..4c3f9b997 100644
--- a/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ОчисткаАдресногоКлассификатора/Module.bsl
+++ b/SSL/src/InformationRegisters/АдресныеОбъекты/Forms/ОчисткаАдресногоКлассификатора/Module.bsl
@@ -42,14 +42,16 @@
&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
- // Проверяем клиентскую переменную.
- Если ПодтверждениеЗакрытияФормы<>Истина Тогда
- Оповещение = Новый ОписаниеОповещения("ЗакрытиеФормыЗавершение", ЭтотОбъект);
- Отказ = Истина;
-
- Текст = НСтр("ru = 'Прервать очистку адресного классификатора?'");
- ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет);
- КонецЕсли;
+ Если Элементы.ШагиОчистки.ТекущаяСтраница <> Элементы.ОжиданиеОчистки
+ Или ПодтверждениеЗакрытияФормы = Истина Тогда
+ Возврат;
+ КонецЕсли;
+
+ Оповещение = Новый ОписаниеОповещения("ЗакрытиеФормыЗавершение", ЭтотОбъект);
+ Отказ = Истина;
+
+ Текст = НСтр("ru = 'Прервать очистку адресного классификатора?'");
+ ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Help/ru.html b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Help/ru.html
index fffb5b525..4abad3216 100644
--- a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Help/ru.html
+++ b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для просмотра истории изменений объекта и выбора хранимых версий. История версий позволяет быстро ответить на вопросы: "Кто изменил объект?", "Когда произошли изменения?" и "Что было изменено в объекте?".
С помощью списка можно вести историю изменений документов и списков, просматривать любую версию объекта или сравнивать любые версии объекта между собой.
Для работы с историей изменений объектов необходимо выполнить предварительную настройку их версионирования. Настройку и просмотр истории версий выполняет администратор программы.
diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Module.bsl b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Module.bsl
index cd59409e2..de513cf06 100644
--- a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Module.bsl
+++ b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ВыборХранимыхВерсий/Module.bsl
@@ -23,6 +23,7 @@
ПереходНаВерсиюРазрешен = Пользователи.ЭтоПолноправныйПользователь();
Элементы.ПерейтиНаВерсию.Видимость = ПереходНаВерсиюРазрешен;
Элементы.СписокВерсийПерейтиНаВерсию.Видимость = ПереходНаВерсиюРазрешен;
+ Элементы.ТехническиеСведенияОбИзмененииОбъекта.Видимость = ПереходНаВерсиюРазрешен;
Реквизиты = НСтр("ru = 'Все'")
КонецПроцедуры
diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ОтчетПоВерсиямОбъекта/Module.bsl b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ОтчетПоВерсиямОбъекта/Module.bsl
index 5d673c608..cf069c157 100644
--- a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ОтчетПоВерсиямОбъекта/Module.bsl
+++ b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ОтчетПоВерсиямОбъекта/Module.bsl
@@ -658,7 +658,7 @@
ТабличныеЧасти_0 = РезультатРазбораВерсии_0.ТабличныеЧасти;
// Выполняем разбор последней версии.
- РезультатРазбораВерсии_1 = РазборВерсии(НомерВерсии, СсылкаНаОбъект);
+ РезультатРазбораВерсии_1 = ВерсионированиеОбъектов.РазборВерсии(СсылкаНаОбъект, НомерВерсии);
ДобавитьНомераСтрокВТабличныеЧасти(РезультатРазбораВерсии_1.ТабличныеЧасти);
Реквизиты_1 = РезультатРазбораВерсии_1.Реквизиты;
@@ -899,31 +899,6 @@
КонецФункции
-// Функция по номеру версии объекта и ссылке на него получает объект из
-// регистра сведений, записывает его на диск и вызывает функцию разбора.
-// XML представления объекта.
-// Параметры:
-// НомерВерсии - число - номер версии документа в регистре сведений.
-// Ссылка - СправочникСсылка/ДокументСсылка - ссылка на экземпляр
-// объекта метаданных.
-// Возвращаемое значение:
-// Структура:
-//
-&НаСервере
-Функция РазборВерсии(НомерВерсии, Ссылка)
-
- СведенияОВерсии = ВерсионированиеОбъектов.СведенияОВерсииОбъекта(Ссылка, НомерВерсии);
-
- Результат = ВерсионированиеОбъектов.РазборПредставленияОбъектаXML(СведенияОВерсии.ВерсияОбъекта, Ссылка);
- Результат.Вставить("ИмяОбъекта", Строка(Ссылка));
- Результат.Вставить("АвторИзменения", СокрЛП(Строка(СведенияОВерсии.АвторВерсии)));
- Результат.Вставить("ДатаИзменения", СведенияОВерсии.ДатаВерсии);
- Результат.Вставить("Комментарий", СведенияОВерсии.Комментарий);
-
- Возврат Результат;
-
-КонецФункции
-
// Функция считывает начальные значения реквизитов и табличных частей документа
// формат формируемой структуры данных для реквизитов:
// ТаблицаРеквизитов - ТаблицаЗначений
@@ -968,7 +943,7 @@
МладшаяВерсияОбъекта = МассивНомеровВерсий[0];
// Выполняем разбор первой версии.
- ВерсияОбъекта = РазборВерсии(МладшаяВерсияОбъекта, СсылкаНаОбъект);
+ ВерсияОбъекта = ВерсионированиеОбъектов.РазборВерсии(СсылкаНаОбъект, МладшаяВерсияОбъекта);
ДобавитьНомераСтрокВТабличныеЧасти(ВерсияОбъекта.ТабличныеЧасти);
Реквизиты = ВерсияОбъекта.Реквизиты;
diff --git a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаЗаписи/Help/ru.html b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаЗаписи/Help/ru.html
index 3e219a35c..d1844dbab 100644
--- a/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаЗаписи/Help/ru.html
+++ b/SSL/src/InformationRegisters/ВерсииОбъектов/Forms/ФормаЗаписи/Help/ru.html
@@ -1 +1 @@
-Форма записи
\ No newline at end of file
+Форма записи
\ No newline at end of file
diff --git a/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/ManagerModule.bsl b/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/ManagerModule.bsl
index 2ff87d3d3..8209b3d0b 100644
--- a/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/ManagerModule.bsl
+++ b/SSL/src/InformationRegisters/ГруппыЗначенийДоступа/ManagerModule.bsl
@@ -489,7 +489,16 @@
// Добавление групп значений.
Если СвойстваВидаДоступа.НесколькоГруппЗначений Тогда
- Для каждого Строка Из НовыеЗначения[ИмяТабличнойЧасти] Цикл
+ Если НовыеЗначения[ИмяТабличнойЧасти] = Неопределено Тогда
+ ГруппыЗначенийДоступа = Новый ТаблицаЗначений;
+ ГруппыЗначенийДоступа.Колонки.Добавить("ГруппаДоступа");
+ Иначе
+ ГруппыЗначенийДоступа = НовыеЗначения[ИмяТабличнойЧасти].Выгрузить();
+ КонецЕсли;
+ Если ГруппыЗначенийДоступа.Количество() = 0 Тогда
+ ГруппыЗначенийДоступа.Добавить();
+ КонецЕсли;
+ Для каждого Строка Из ГруппыЗначенийДоступа Цикл
Запись = НовыеЗаписи.Добавить();
Запись.ЗначениеДоступа = Ссылка;
Запись.ГруппаЗначенийДоступа = Строка[ИмяРеквизита];
diff --git a/SSL/src/InformationRegisters/ДанныеБизнесПроцессов/Help/ru.html b/SSL/src/InformationRegisters/ДанныеБизнесПроцессов/Help/ru.html
index 9cc16330a..22b9f2826 100644
--- a/SSL/src/InformationRegisters/ДанныеБизнесПроцессов/Help/ru.html
+++ b/SSL/src/InformationRegisters/ДанныеБизнесПроцессов/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Открывается по команде Мои бизнес-процессы в разделе Бизнес-процессы и задачи.
В списке выводится:
diff --git a/SSL/src/InformationRegisters/ДанныеОбъектовДляРегистрацииВОбменах/ManagerModule.bsl b/SSL/src/InformationRegisters/ДанныеОбъектовДляРегистрацииВОбменах/ManagerModule.bsl
new file mode 100644
index 000000000..0d7d90cff
--- /dev/null
+++ b/SSL/src/InformationRegisters/ДанныеОбъектовДляРегистрацииВОбменах/ManagerModule.bsl
@@ -0,0 +1,47 @@
+#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
+
+#Область СлужебныеПроцедурыИФункции
+
+Процедура ДобавитьОбъектВФильтрРазрешенныхОбъектов(Знач Объект, Знач Получатель) Экспорт
+
+ Если Не ОбъектЕстьВРегистре(Объект, Получатель) Тогда
+
+ СтруктураЗаписи = Новый Структура;
+ СтруктураЗаписи.Вставить("УзелИнформационнойБазы", Получатель);
+ СтруктураЗаписи.Вставить("Ссылка", Объект);
+
+ ДобавитьЗапись(СтруктураЗаписи, Истина);
+ КонецЕсли;
+
+КонецПроцедуры
+
+
+Функция ОбъектЕстьВРегистре(Объект, УзелИнформационнойБазы) Экспорт
+
+ ТекстЗапроса = "
+ |ВЫБРАТЬ 1
+ |ИЗ
+ | РегистрСведений.ДанныеОбъектовДляРегистрацииВОбменах КАК ДанныеОбъектовДляРегистрацииВОбменах
+ |ГДЕ
+ | ДанныеОбъектовДляРегистрацииВОбменах.УзелИнформационнойБазы = &УзелИнформационнойБазы
+ | И ДанныеОбъектовДляРегистрацииВОбменах.Ссылка = &Объект
+ |";
+
+ Запрос = Новый Запрос;
+ Запрос.УстановитьПараметр("УзелИнформационнойБазы", УзелИнформационнойБазы);
+ Запрос.УстановитьПараметр("Объект", Объект);
+ Запрос.Текст = ТекстЗапроса;
+
+ Возврат Не Запрос.Выполнить().Пустой();
+КонецФункции
+
+// Процедура добавляет запись в регистр по переданным значениям структуры.
+Процедура ДобавитьЗапись(СтруктураЗаписи, Загрузка = Ложь) Экспорт
+
+ ОбменДаннымиСервер.ДобавитьЗаписьВРегистрСведений(СтруктураЗаписи, "ДанныеОбъектовДляРегистрацииВОбменах", Загрузка);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецЕсли
\ No newline at end of file
diff --git a/SSL/src/InformationRegisters/ДанныеОбъектовДляРегистрацииВОбменах/ДанныеОбъектовДляРегистрацииВОбменах.mdo b/SSL/src/InformationRegisters/ДанныеОбъектовДляРегистрацииВОбменах/ДанныеОбъектовДляРегистрацииВОбменах.mdo
new file mode 100644
index 000000000..e005a31af
--- /dev/null
+++ b/SSL/src/InformationRegisters/ДанныеОбъектовДляРегистрацииВОбменах/ДанныеОбъектовДляРегистрацииВОбменах.mdo
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+ ДанныеОбъектовДляРегистрацииВОбменах
+
+ ru
+ Данные объектов для регистрации в обменах
+
+ InDialog
+
+ Use
+ Active
+
+ Use
+
+
+
+
+ Use
+ LineNumber
+
+ Use
+
+
+
+
+ Use
+ Recorder
+
+ Use
+
+
+
+
+ Use
+ Period
+
+ ShowError
+ Use
+
+
+
+ Managed
+
+ УзелИнформационнойБазы
+
+ ru
+ Узел информационной базы
+
+
+ ExchangePlanRef
+
+
+
+ true
+ Use
+ Use
+ true
+
+ true
+ true
+
+
+ Ссылка
+
+ ru
+ Ссылка
+
+
+ AnyRef
+
+
+
+ Use
+ Use
+
+ true
+
+
diff --git a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Module.bsl b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Module.bsl
index 8b52484bc..d2debfb36 100644
--- a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Module.bsl
+++ b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ДатыЗапретаИзменения/Module.bsl
@@ -3813,10 +3813,9 @@
Если НайденныйЭлемент <> Неопределено Тогда
Данные.ОписаниеДатыЗапрета = НайденныйЭлемент.Значение;
Если ЗначениеЗаполнено(Строка2) Тогда
- Попытка
- Данные.КоличествоДнейРазрешения = Число(Строка2);
- Исключение
- КонецПопытки;
+ ОписаниеТипаЧисло = Новый ОписаниеТипов("Число",,,
+ Новый КвалификаторыЧисла(2, 0, ДопустимыйЗнак.Неотрицательный));
+ Данные.КоличествоДнейРазрешения = ОписаниеТипаЧисло.ПривестиЗначение(Строка2);
КонецЕсли;
КонецЕсли;
КонецЕсли;
diff --git a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ФормаЗаписи/Form.form
index c33d071dc..3b22e8615 100644
--- a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ФормаЗаписи/Form.form
+++ b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Forms/ФормаЗаписи/Form.form
@@ -12,7 +12,7 @@
Запись.Раздел
- РазделExtendedTooltip
+ РазделРасширеннаяПодсказка14Labeltrue
@@ -53,7 +53,7 @@
Запись.Объект
- ОбъектExtendedTooltip
+ ОбъектРасширеннаяПодсказка15Labeltrue
@@ -94,7 +94,7 @@
Запись.Пользователь
- ПользовательExtendedTooltip
+ ПользовательРасширеннаяПодсказка16Labeltrue
@@ -140,7 +140,7 @@
Left
- ОписаниеДатыЗапретаExtendedTooltip
+ ОписаниеДатыЗапретаРасширеннаяПодсказка18Labeltrue
@@ -186,7 +186,7 @@
Запись.ДатаЗапрета
- ДатаЗапретаExtendedTooltip
+ ДатаЗапретаРасширеннаяПодсказка19Labeltrue
@@ -230,7 +230,7 @@
Горизонтальная группа
- ГоризонтальнаяГруппаExtendedTooltip
+ ГоризонтальнаяГруппаРасширеннаяПодсказка17Labeltrue
@@ -262,7 +262,7 @@
Запись.Комментарий
- КомментарийExtendedTooltip
+ КомментарийРасширеннаяПодсказка20Labeltrue
diff --git a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Help/ru.html b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Help/ru.html
index 2aea0b299..19450b1ae 100644
--- a/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Help/ru.html
+++ b/SSL/src/InformationRegisters/ДатыЗапретаИзменения/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для установки даты запрета изменения (загрузки) данных.
Запреты загрузки данных могут не использоваться. В этом случае доступно только окно настройки дат запрета изменения данных.
Установка даты запрета изменения данных и различные настройки, связанные с ней, выполняются по соответствующей команде в разделе Администрирование - Поддержка и обслуживание.
diff --git a/SSL/src/InformationRegisters/ДокументыСОшибкамиПроверкиКонтрагентов/ДокументыСОшибкамиПроверкиКонтрагентов.mdo b/SSL/src/InformationRegisters/ДокументыСОшибкамиПроверкиКонтрагентов/ДокументыСОшибкамиПроверкиКонтрагентов.mdo
new file mode 100644
index 000000000..ae6300809
--- /dev/null
+++ b/SSL/src/InformationRegisters/ДокументыСОшибкамиПроверкиКонтрагентов/ДокументыСОшибкамиПроверкиКонтрагентов.mdo
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+ ДокументыСОшибкамиПроверкиКонтрагентов
+
+ ru
+ Документы с ошибками проверки контрагентов
+
+ InDialog
+
+ Use
+ Active
+
+ Use
+
+
+
+
+ Use
+ LineNumber
+
+ Use
+
+
+
+
+ Use
+ Recorder
+
+ Use
+
+
+
+
+ Use
+ Period
+
+ ShowError
+ Use
+
+
+
+ Managed
+
+ Документ
+
+ ru
+ Документ
+
+
+ DocumentRef
+
+
+
+ true
+ Use
+ Use
+ true
+
+ true
+ true
+
+
diff --git a/SSL/src/InformationRegisters/ДомаЗданияСтроения/Forms/ФормаСписка/Form.form b/SSL/src/InformationRegisters/ДомаЗданияСтроения/Forms/ФормаСписка/Form.form
index 67684c0f7..8ac3169cb 100644
--- a/SSL/src/InformationRegisters/ДомаЗданияСтроения/Forms/ФормаСписка/Form.form
+++ b/SSL/src/InformationRegisters/ДомаЗданияСтроения/Forms/ФормаСписка/Form.form
@@ -271,6 +271,9 @@
Список.DefaultPicture
+ None
+ None
+ Nonetrue60
diff --git a/SSL/src/InformationRegisters/ДополнительныеСведения/Help/ru.html b/SSL/src/InformationRegisters/ДополнительныеСведения/Help/ru.html
index 57595e475..eb66df87d 100644
--- a/SSL/src/InformationRegisters/ДополнительныеСведения/Help/ru.html
+++ b/SSL/src/InformationRegisters/ДополнительныеСведения/Help/ru.html
@@ -1,3 +1,3 @@
-
+
Для некоторых объектов конфигурации можно указать дополнительные сведения, состав и тип которых настраивается администратором.
\ No newline at end of file
diff --git a/SSL/src/InformationRegisters/ЗамерыВремени/Help/ru.html b/SSL/src/InformationRegisters/ЗамерыВремени/Help/ru.html
index e7d5a5ad6..112916302 100644
--- a/SSL/src/InformationRegisters/ЗамерыВремени/Help/ru.html
+++ b/SSL/src/InformationRegisters/ЗамерыВремени/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для просмотра замеров времени, которые производятся для оценки производительности работы программы.
Открыть список можно по команде Замеры времени на панели навигации ключевой операции.
Перед началом работы с бизнес-процессами и задачами рекомендуется заполнить список.
Для того чтобы назначить исполнителей ролей, которые участвуют в бизнес-процессах без объектов адресации, выполните команду Роли и исполнители задач в разделе Администрирование - Органайзер.
В зависимости от специфики бизнес-процессов задачи могут быть адресованы исполнителю или группе исполнителей как персонально (персональная адресация), так и для некоторых бизнес процессов с использованием ролей бизнес-процесса (ролевая адресация). В случае ролевой адресации поручение выдается не персонально исполнителю, а некоторой роли бизнес-процесса (например, Старший по залу).
В зависимости от специфики бизнес-процессов задачи могут быть адресованы исполнителю или группе исполнителей как персонально (персональная адресация), так и для некоторых бизнес процессов с использованием ролей бизнес-процесса (ролевая адресация). В случае ролевой адресации поручение выдается не персонально исполнителю, а некоторой роли бизнес-процесса (например, Старший по залу).
Примеры заполнения списка ролевой адресации:
-
Роль исполнителя
+
Роль исполнителя
Пользователь
Пояснение
Старший по залу
Иванов И.
@@ -13,7 +13,7 @@
Петров А.
Поручения, выданные роли Руководителя, попадут в список поручений Петрова А.
В определенных случаях роли исполнителя бывает недостаточно, чтобы точно определить исполнителей. Тогда необходимо указывать основной и дополнительный объекты адресации. Например:
Система позволяет хранить графики работы, которые используются на предприятии.
\ No newline at end of file
diff --git a/SSL/src/InformationRegisters/КурсыВалют/Help/ru.html b/SSL/src/InformationRegisters/КурсыВалют/Help/ru.html
index 95a34f066..45dde7124 100644
--- a/SSL/src/InformationRegisters/КурсыВалют/Help/ru.html
+++ b/SSL/src/InformationRegisters/КурсыВалют/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для хранения и просмотра курсов валют.
Предназначен для работы со всеми напоминаниями, действующими в программе на текущий момент. При этом каждый пользователь видит только свои напоминания.
В списке выводится:
Срок напоминания - время срабатывания напоминания;
diff --git a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Help/ru.html b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Help/ru.html
index 3a6f17e30..2812454ca 100644
--- a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Help/ru.html
+++ b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/Напоминание/Help/ru.html
@@ -1,4 +1,4 @@
-
+
В программе можно вводить напоминания, указав время и предмет, по поводу которого в программе в указанное время будет выведен список напоминаний.
Предметом напоминаний могут быть различные справочники, документы и другие объекты программы. Например, напоминание можно ввести по конкретному партнеру, документу товародвижения и т.д., для того чтобы не забыть уточнить или дозаполнить какие-либо данные.
Открывается по команде Органайзер - Напомнить из различных объектов программы. При этом можно ввести только одно напоминание для одного объекта.
В указанное в напоминании время в программе открывается список Напоминания. В списке содержатся все вновь созданные и отложенные напоминания, у которых подошло время срабатывания. По каждому напоминанию выводится его текст и время, насколько оно было просрочено. Если напоминание связано с датой какого-либо предмета, например, со сроком по задаче, то в напоминании указывается, сколько времени осталось до этого события.
Из списка можно сразу перейти к элементу справочника или другому объекту программы, с которым связано напоминанме (по команде Открыть или двойному щелчку мыши). Если напоминание не связано с объектом программы (то открывается само напоминание).
diff --git a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/ФормаОповещения/Module.bsl b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/ФормаОповещения/Module.bsl
index 25b0f0ebf..62da3dca8 100644
--- a/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/ФормаОповещения/Module.bsl
+++ b/SSL/src/InformationRegisters/НапоминанияПользователя/Forms/ФормаОповещения/Module.bsl
@@ -6,6 +6,10 @@
Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа.
Возврат;
КонецЕсли;
+
+ Если ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() Тогда
+ РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
+ КонецЕсли;
КонецПроцедуры
&НаКлиенте
@@ -185,24 +189,14 @@
&НаКлиенте
Процедура ОбновитьВремяВТаблицеНапоминаний()
Для Каждого СтрокаТаблицы Из Напоминания Цикл
- ПредставлениеВремени = "";
-
- Время = ОбщегоНазначенияКлиент.ДатаСеанса() - СтрокаТаблицы.ВремяСобытия;
+ ПредставлениеВремени = НСтр("ru = 'срок не определен'");
Если ЗначениеЗаполнено(СтрокаТаблицы.ВремяСобытия) Тогда
- Если Время > -60 И Время < 60 Тогда
- ПредставлениеВремени = НСтр("ru = 'сейчас'");
- Иначе
- ПредставлениеВремени = НапоминанияПользователяКлиентСервер.ПредставлениеВремени(Время, Ложь, Ложь);
-
- Если Время > 0 Тогда
- ПредставлениеВремени = НСтр("ru = 'просрочено'") + " " + ПредставлениеВремени;
- Иначе
- ПредставлениеВремени = НСтр("ru = 'через'") + " " + ПредставлениеВремени;
- КонецЕсли;
+ Время = ОбщегоНазначенияКлиент.ДатаСеанса() - СтрокаТаблицы.ВремяСобытия;
+ Если Время > 60*60*24 Или Время < -60*60*24 Тогда
+ Время = НачалоДня(ОбщегоНазначенияКлиент.ДатаСеанса()) - НачалоДня(СтрокаТаблицы.ВремяСобытия);
КонецЕсли;
- Иначе
- ПредставлениеВремени = НСтр("ru = 'срок не определен'");
+ ПредставлениеВремени = ПредставлениеИнтервалаВремени(Время);
КонецЕсли;
Если СтрокаТаблицы.ВремяСобытияСтрока <> ПредставлениеВремени Тогда
@@ -277,4 +271,87 @@
КонецЕсли;
КонецПроцедуры
+&НаКлиенте
+Функция ПредставлениеИнтервалаВремени(Знач КоличествоВремени)
+ Результат = "";
+
+ ПредставлениеНедель = НСтр("ru = 'неделю'") + "," + НСтр("ru = 'недели'") + "," + НСтр("ru = 'недель'");
+ ПредставлениеДней = НСтр("ru = 'день'") + "," + НСтр("ru = 'дня'") + "," + НСтр("ru = 'дней'");
+ ПредставлениеЧасов = НСтр("ru = 'час'") + "," + НСтр("ru = 'часа'") + "," + НСтр("ru = 'часов'");
+ ПредставлениеМинут = НСтр("ru = 'минуту'") + "," + НСтр("ru = 'минуты'") + "," + НСтр("ru = 'минут'");
+
+ КоличествоВремени = Число(КоличествоВремени);
+
+ СобытиеНаступило = Истина;
+ ШаблонПредставления = НСтр("ru = '%1 назад'");
+ Если КоличествоВремени < 0 Тогда
+ ШаблонПредставления = НСтр("ru = 'через %1'");
+ КоличествоВремени = -КоличествоВремени;
+ СобытиеНаступило = Ложь;
+ КонецЕсли;
+
+ КоличествоНедель = Цел(КоличествоВремени / 60/60/24/7);
+ КоличествоДней = Цел(КоличествоВремени / 60/60/24);
+ КоличествоЧасов = Цел(КоличествоВремени / 60/60);
+ КоличествоМинут = Цел(КоличествоВремени / 60);
+ КоличествоСекунд = Цел(КоличествоВремени);
+
+ КоличествоСекунд = КоличествоСекунд - КоличествоМинут * 60;
+ КоличествоМинут = КоличествоМинут - КоличествоЧасов * 60;
+ КоличествоЧасов = КоличествоЧасов - КоличествоДней * 24;
+ КоличествоДней = КоличествоДней - КоличествоНедель * 7;
+
+ ТекущаяДата = ОбщегоНазначенияКлиент.ДатаСеанса();
+
+ Если КоличествоНедель > 4 Тогда
+ Если СобытиеНаступило Тогда
+ Возврат НСтр("ru = 'очень давно'");
+ Иначе
+ Возврат НСтр("ru = 'еще не скоро'");
+ КонецЕсли;
+
+ ИначеЕсли КоличествоНедель > 1 Тогда
+ Результат = СтроковыеФункцииКлиентСервер.ЧислоЦифрамиПредметИсчисленияПрописью(КоличествоНедель, ПредставлениеНедель);
+ ИначеЕсли КоличествоНедель > 0 Тогда
+ Результат = НСтр("ru = 'неделю'");
+
+ ИначеЕсли КоличествоДней > 1 Тогда
+ Если НачалоДня(ТекущаяДата) - НачалоДня(ТекущаяДата - КоличествоВремени) = 60*60*24 * 2 Тогда
+ Если СобытиеНаступило Тогда
+ Возврат НСтр("ru = 'позавчера'");
+ Иначе
+ Возврат НСтр("ru = 'послезавтра'");
+ КонецЕсли;
+ Иначе
+ Результат = СтроковыеФункцииКлиентСервер.ЧислоЦифрамиПредметИсчисленияПрописью(КоличествоДней, ПредставлениеДней);
+ КонецЕсли;
+ ИначеЕсли КоличествоЧасов + КоличествоДней * 24 > 12
+ И НачалоДня(ТекущаяДата) - НачалоДня(ТекущаяДата - КоличествоВремени) = 60*60*24 Тогда
+ Если СобытиеНаступило Тогда
+ Возврат НСтр("ru = 'вчера'");
+ Иначе
+ Возврат НСтр("ru = 'завтра'");
+ КонецЕсли;
+ ИначеЕсли КоличествоДней > 0 Тогда
+ Результат = НСтр("ru = 'день'");
+
+ ИначеЕсли КоличествоЧасов > 1 Тогда
+ Результат = СтроковыеФункцииКлиентСервер.ЧислоЦифрамиПредметИсчисленияПрописью(КоличествоЧасов, ПредставлениеЧасов);
+ ИначеЕсли КоличествоЧасов > 0 Тогда
+ Результат = НСтр("ru = 'час'");
+
+ ИначеЕсли КоличествоМинут > 1 Тогда
+ Результат = СтроковыеФункцииКлиентСервер.ЧислоЦифрамиПредметИсчисленияПрописью(КоличествоМинут, ПредставлениеМинут);
+ ИначеЕсли КоличествоМинут > 0 Тогда
+ Результат = НСтр("ru = 'минуту'");
+
+ Иначе
+ Возврат НСтр("ru = 'сейчас'");
+ КонецЕсли;
+
+ Результат = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонПредставления, Результат);
+
+ Возврат Результат;
+КонецФункции
+
#КонецОбласти
diff --git a/SSL/src/InformationRegisters/НапоминанияПользователя/Help/ru.html b/SSL/src/InformationRegisters/НапоминанияПользователя/Help/ru.html
index 513a23cd9..809bc7f0e 100644
--- a/SSL/src/InformationRegisters/НапоминанияПользователя/Help/ru.html
+++ b/SSL/src/InformationRegisters/НапоминанияПользователя/Help/ru.html
@@ -1,4 +1,4 @@
-
+
В программе можно вводить напоминания, указав время и предмет, по поводу которого в программе в указанное время будет выведен список напоминаний.
Предметом напоминаний могут быть различные справочники, документы и другие объекты программы. Например, напоминание можно ввести по конкретному партнеру, документу товародвижения и т.д., для того чтобы не забыть уточнить или дозаполнить какие-либо данные.
Открывается по команде Органайзер - Напомнить из различных объектов программы. При этом можно ввести только одно напоминание для одного объекта.
diff --git a/SSL/src/InformationRegisters/НастройкиВерсионированияОбъектов/Forms/ВерсионированиеОбъектов/Module.bsl b/SSL/src/InformationRegisters/НастройкиВерсионированияОбъектов/Forms/ВерсионированиеОбъектов/Module.bsl
index b299206d2..f449030e6 100644
--- a/SSL/src/InformationRegisters/НастройкиВерсионированияОбъектов/Forms/ВерсионированиеОбъектов/Module.bsl
+++ b/SSL/src/InformationRegisters/НастройкиВерсионированияОбъектов/Forms/ВерсионированиеОбъектов/Module.bsl
@@ -10,24 +10,15 @@
КонецЕсли;
ЗаполнитьТипыОбъектовВДеревеЗначений();
-
ЗаполнитьСпискиВыбора();
- ПоказыватьНастройкиОчисткиУстаревшихВерсий = Не ОбщегоНазначенияПовтИсп.РазделениеВключено();
- Элементы.КоличествоИОбъемХранимыхВерсийОбъектов.Видимость = ПоказыватьНастройкиОчисткиУстаревшихВерсий;
- Элементы.ОчисткаУстаревшихВерсий.Видимость = ПоказыватьНастройкиОчисткиУстаревшихВерсий;
- Элементы.УдалениеВерсийПоРасписанию.Видимость = ПоказыватьНастройкиОчисткиУстаревшихВерсий;
- Элементы.СрокХраненияВерсий.Видимость = ПоказыватьНастройкиОчисткиУстаревшихВерсий;
- Элементы.УстановитьСрокХраненияВерсий.Видимость = ПоказыватьНастройкиОчисткиУстаревшихВерсий;
Элементы.Очистить.Видимость = Ложь;
- Если ПоказыватьНастройкиОчисткиУстаревшихВерсий Тогда
- Элементы.Расписание.Заголовок = ТекущееРасписание();
- АвтоматическиУдалятьУстаревшиеВерсии = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов).Использование;
- Элементы.Расписание.Доступность = АвтоматическиУдалятьУстаревшиеВерсии;
- Элементы.НастроитьРасписание.Доступность = АвтоматическиУдалятьУстаревшиеВерсии;
- Элементы.ИнформацияОбУстаревшихВерсиях.Заголовок = ТекстСостоянияПодсчет();
- КонецЕсли;
-
+ Элементы.Расписание.Заголовок = ТекущееРасписание();
+ АвтоматическиУдалятьУстаревшиеВерсии = АвтоматическаяОчисткаВключена();
+ Элементы.Расписание.Доступность = АвтоматическиУдалятьУстаревшиеВерсии;
+ Элементы.НастроитьРасписание.Доступность = АвтоматическиУдалятьУстаревшиеВерсии;
+ Элементы.ИнформацияОбУстаревшихВерсиях.Заголовок = ТекстСостоянияПодсчет();
+
КонецПроцедуры
&НаКлиенте
@@ -360,11 +351,7 @@
&НаСервере
Процедура ЗаписатьТекущиеНастройкиПоОбъекту(ТипОбъекта, ВариантВерсионирования, СрокХраненияВерсий)
- Настройка = РегистрыСведений.НастройкиВерсионированияОбъектов.СоздатьМенеджерЗаписи();
- Настройка.ТипОбъекта = ТипОбъекта;
- Настройка.Вариант = ВариантВерсионирования;
- Настройка.СрокХраненияВерсий = СрокХраненияВерсий;
- Настройка.Записать();
+ ВерсионированиеОбъектов.ЗаписатьНастройкуВерсионированияПоОбъекту(ТипОбъекта, ВариантВерсионирования, СрокХраненияВерсий);
КонецПроцедуры
&НаСервере
@@ -394,28 +381,104 @@
&НаСервере
Процедура УстановитьРасписаниеРегламентногоЗадания(Расписание);
- РегламентноеЗадание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов);
- РегламентноеЗадание.Расписание = Расписание;
- РегламентноеЗадание.Записать();
+
+ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
+ ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса();
+ ИмяМетода = Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов.ИмяМетода;
+
+ ПараметрыЗадания = Новый Структура;
+ ПараметрыЗадания.Вставить("ИмяМетода", ИмяМетода);
+ ПараметрыЗадания.Вставить("ОбластьДанных", ОбластьДанных);
+
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда
+ МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий");
+
+ УстановитьПривилегированныйРежим(Истина);
+
+ СписокЗаданий = МодульОчередьЗаданий.ПолучитьЗадания(ПараметрыЗадания);
+ Если СписокЗаданий.Количество() = 0 Тогда
+ ПараметрыЗадания.Вставить("Расписание", Расписание);
+ МодульОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания);
+ Иначе
+ ПараметрыЗадания = Новый Структура("Расписание", Расписание);
+ Для Каждого Задание Из СписокЗаданий Цикл
+ МодульОчередьЗаданий.ИзменитьЗадание(Задание.Идентификатор, ПараметрыЗадания);
+ КонецЦикла;
+ КонецЕсли;
+ КонецЕсли;
+ Иначе
+ РегламентноеЗадание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов);
+ РегламентноеЗадание.Расписание = Расписание;
+ РегламентноеЗадание.Записать();
+ КонецЕсли;
+
КонецПроцедуры
&НаСервере
Функция ТекущееРасписание()
- Возврат РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов).Расписание;
+ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
+ ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса();
+ ИмяМетода = Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов.ИмяМетода;
+
+ ПараметрыЗадания = Новый Структура;
+ ПараметрыЗадания.Вставить("ИмяМетода", ИмяМетода);
+ ПараметрыЗадания.Вставить("ОбластьДанных", ОбластьДанных);
+
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда
+ МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий");
+
+ УстановитьПривилегированныйРежим(Истина);
+
+ СписокЗаданий = МодульОчередьЗаданий.ПолучитьЗадания(ПараметрыЗадания);
+ Для Каждого Задание Из СписокЗаданий Цикл
+ Возврат Задание.Расписание;
+ КонецЦикла;
+
+ Возврат Новый РасписаниеРегламентногоЗадания;
+ КонецЕсли;
+ Иначе
+ Возврат РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов).Расписание;
+ КонецЕсли;
КонецФункции
&НаКлиенте
Процедура АвтоматическиУдалятьУстаревшиеВерсииПриИзменении(Элемент)
- ВключитьОтключитьРегламентноеЗадание();
+ ВключитьОтключитьРегламентноеЗадание(АвтоматическиУдалятьУстаревшиеВерсии);
Элементы.Расписание.Доступность = АвтоматическиУдалятьУстаревшиеВерсии;
Элементы.НастроитьРасписание.Доступность = АвтоматическиУдалятьУстаревшиеВерсии;
КонецПроцедуры
&НаСервере
-Процедура ВключитьОтключитьРегламентноеЗадание()
- РегламентноеЗадание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов);
- РегламентноеЗадание.Использование = Не РегламентноеЗадание.Использование;
- РегламентноеЗадание.Записать();
+Процедура ВключитьОтключитьРегламентноеЗадание(Использование)
+ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
+ ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса();
+ ИмяМетода = Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов.ИмяМетода;
+
+ ПараметрыЗадания = Новый Структура;
+ ПараметрыЗадания.Вставить("ИмяМетода", ИмяМетода);
+ ПараметрыЗадания.Вставить("ОбластьДанных", ОбластьДанных);
+
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда
+ МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий");
+
+ УстановитьПривилегированныйРежим(Истина);
+
+ СписокЗаданий = МодульОчередьЗаданий.ПолучитьЗадания(ПараметрыЗадания);
+ Если СписокЗаданий.Количество() = 0 Тогда
+ ПараметрыЗадания.Вставить("Использование", Использование);
+ МодульОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания);
+ Иначе
+ ПараметрыЗадания = Новый Структура("Использование", Использование);
+ Для Каждого Задание Из СписокЗаданий Цикл
+ МодульОчередьЗаданий.ИзменитьЗадание(Задание.Идентификатор, ПараметрыЗадания);
+ КонецЦикла;
+ КонецЕсли;
+ КонецЕсли;
+ Иначе
+ РегламентноеЗадание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов);
+ РегламентноеЗадание.Использование = Не РегламентноеЗадание.Использование;
+ РегламентноеЗадание.Записать();
+ КонецЕсли;
КонецПроцедуры
&НаКлиенте
@@ -446,23 +509,19 @@
&НаСервере
Процедура ЗапуститьРегламентноеЗадание()
- РегламентноеЗадание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов);
+ РегламентноеЗаданиеМетаданные = Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов;
Отбор = Новый Структура;
- Отбор.Вставить("РегламентноеЗадание", РегламентноеЗадание);
+ ИмяМетода = РегламентноеЗаданиеМетаданные.ИмяМетода;
+ Отбор.Вставить("ИмяМетода", ИмяМетода);
+
Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно);
ФоновыеЗаданияОчистки = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
Если ФоновыеЗаданияОчистки.Количество() > 0 Тогда
ИдентификаторФоновогоЗадания = ФоновыеЗаданияОчистки[0].УникальныйИдентификатор;
Иначе
- НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Запуск вручную: %1'"), РегламентноеЗадание.Метаданные.Синоним);
-
- ФоновоеЗадание = ФоновыеЗадания.Выполнить(
- РегламентноеЗадание.Метаданные.ИмяМетода,
- РегламентноеЗадание.Параметры,
- Строка(РегламентноеЗадание.УникальныйИдентификатор),
- НаименованиеФоновогоЗадания);
-
+ НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Запуск вручную: %1'"), РегламентноеЗаданиеМетаданные.Синоним);
+ ФоновоеЗадание = ФоновыеЗадания.Выполнить(РегламентноеЗаданиеМетаданные.ИмяМетода, , , НаименованиеФоновогоЗадания);
ИдентификаторФоновогоЗадания = ФоновоеЗадание.УникальныйИдентификатор;
КонецЕсли;
@@ -570,4 +629,30 @@
КонецПроцедуры
+&НаСервере
+Функция АвтоматическаяОчисткаВключена()
+ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
+ ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса();
+ ИмяМетода = Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов.ИмяМетода;
+
+ ПараметрыЗадания = Новый Структура;
+ ПараметрыЗадания.Вставить("ИмяМетода", ИмяМетода);
+ ПараметрыЗадания.Вставить("ОбластьДанных", ОбластьДанных);
+
+ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда
+ МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий");
+
+ УстановитьПривилегированныйРежим(Истина);
+
+ СписокЗаданий = МодульОчередьЗаданий.ПолучитьЗадания(ПараметрыЗадания);
+ Для Каждого Задание Из СписокЗаданий Цикл
+ Возврат Задание.Использование;
+ КонецЦикла;
+ КонецЕсли;
+ Иначе
+ Возврат РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов).Использование;
+ КонецЕсли;
+
+ Возврат Ложь;
+КонецФункции
#КонецОбласти
diff --git a/SSL/src/InformationRegisters/НастройкиВерсионированияОбъектов/Help/ru.html b/SSL/src/InformationRegisters/НастройкиВерсионированияОбъектов/Help/ru.html
index f9f083e00..f7139eb51 100644
--- a/SSL/src/InformationRegisters/НастройкиВерсионированияОбъектов/Help/ru.html
+++ b/SSL/src/InformationRegisters/НастройкиВерсионированияОбъектов/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для настройки версионирования объектов.
С помощью версионирования документов и справочников можно отслеживать историю изменений.
Для ведения истории изменений объектов необходимо выбрать команду Поддержка и обслуживание раздела Администрирование, включить флажок Версионирование объектов (по умолчанию включен).
@@ -8,11 +8,11 @@
Вариант версионирования - выбранный вариант версионирования;
Срок хранения версий - выбранный срок хранения версий.
Выбор варианта версионирования
Выберите один или несколько объектов, затем выполните команду Установить вариант версионирования, из выпадающего списка выберите нужный вариант версионирования для каждого типа документов и справочников (также можно найти команду в меню Еще или в контекстном меню по правой кнопке мыши):
-
Не версионировать - история версий объекта не ведется;
-
Версионировать при записи - новая запись заносится в историю версий каждый раз при изменении (или создании нового) справочника или документа;
-
Версионировать при проведении - версии сохраняются только при проведении; применимо только для документов, для которых разрешено проведение;
-
Версионировать при старте - версии сохраняются только после запуска бизнес-процесса; применимо только для бизнес-процессов;
-
По умолчанию - установить рекомендуемые настройки (для справочников - не версионировать, для документов - версионировать при проведении).
+
Не версионировать - история версий объекта не ведется;
+
Версионировать при записи - новая запись заносится в историю версий каждый раз при изменении (или создании нового) справочника или документа;
+
Версионировать при проведении - версии сохраняются только при проведении; применимо только для документов, для которых разрешено проведение;
+
Версионировать при старте - версии сохраняются только после запуска бизнес-процесса; применимо только для бизнес-процессов;
+
По умолчанию - установить рекомендуемые настройки (для справочников - не версионировать, для документов - версионировать при проведении).
Также возможна настройка версионирования сразу для группы объектов программы, например, можно выбрать все документы или справочники.
Выбор срока хранения версий
Выполните команду Установить срок хранения версий, затем из выпадающего списка выберите нужный срок хранения версий для каждого типа документов и справочников: версии можно хранить За последнюю неделю, За последний месяц, За последние три месяца, За последние шесть месяцев, За последний год и Бессрочно.
Просмотр отчета "Количество и объем хранимых версий объектов"
Позволяет указать параметры подключения к другой программе для синхронизации данных, а также проверить правильность задания этих параметров. На закладках задаются параметры различных видов подключения.
Параметры подключения также указываются во время настройки синхронизации данных в Помощнике создания синхронизации данных. Эти настройки выводятся по умолчанию. Их можно изменить.
Перейти к настройке Параметров подключения можно по соответствующей команде из настройки синхронизации данных.
Настройки производятся на вкладке Основное с помощью переключателя Использование для встроенного почтового клиента:
Выберите значение Получать, сохранять и отправлять письма с этой учетной записи во встроенном почтовом клиенте, если с данной учетной записи электронной почты планируется переписка.
diff --git a/SSL/src/InformationRegisters/НомераОтсканированныхФайлов/Help/ru.html b/SSL/src/InformationRegisters/НомераОтсканированныхФайлов/Help/ru.html
index 6cc78e609..82829145b 100644
--- a/SSL/src/InformationRegisters/НомераОтсканированныхФайлов/Help/ru.html
+++ b/SSL/src/InformationRegisters/НомераОтсканированныхФайлов/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для просмотра нумерации отсканированных документов и их владельцев.
Список можно просмотреть по команде Настройка сканирования - Открыть номера отсканированных файлов на закладке Работа с файлами в персональных настройках программы.
Программа автоматически присваивает номер отсканированным файлам. В списке можно отследить движение файлов, увидеть, какие файлы были удалены.
- СписокSearchStringContextMenu
+ СписокСтрокаПоискаКонтекстноеМеню25true
@@ -374,10 +374,10 @@
- СписокViewStatus
+ СписокСостояниеПросмотра27
- СписокViewStatusExtendedTooltip
+ СписокСостояниеПросмотраРасширеннаяПодсказка29Labeltrue
@@ -387,7 +387,7 @@
- СписокViewStatusContextMenu
+ СписокСостояниеПросмотраКонтекстноеМеню28true
@@ -398,10 +398,10 @@
- СписокSearchControl
+ СписокУправлениеПоиском30
- СписокSearchControlExtendedTooltip
+ СписокУправлениеПоискомРасширеннаяПодсказка32Labeltrue
@@ -411,7 +411,7 @@
- СписокSearchControlContextMenu
+ СписокУправлениеПоискомКонтекстноеМеню31true
@@ -422,7 +422,7 @@
- СписокExtendedTooltip
+ СписокРасширеннаяПодсказка23Labeltrue
diff --git a/SSL/src/InformationRegisters/ПакетыИнформацииПриЗапуске/ПакетыИнформацииПриЗапуске.mdo b/SSL/src/InformationRegisters/ПакетыИнформацииПриЗапуске/ПакетыИнформацииПриЗапуске.mdo
new file mode 100644
index 000000000..c4117e811
--- /dev/null
+++ b/SSL/src/InformationRegisters/ПакетыИнформацииПриЗапуске/ПакетыИнформацииПриЗапуске.mdo
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+ ПакетыИнформацииПриЗапуске
+
+ ru
+ Пакеты информации при запуске
+
+ true
+ InDialog
+
+ Use
+ Active
+
+ Use
+
+
+
+
+ Use
+ LineNumber
+
+ Use
+
+
+
+
+ Use
+ Recorder
+
+ Use
+
+
+
+
+ Use
+ Period
+
+ ShowError
+ Use
+
+
+
+ Managed
+
+ Состав
+
+ ru
+ Состав
+
+
+ ValueStorage
+
+
+
+ Use
+ Use
+
+
+
+ Номер
+
+ ru
+ Номер
+
+
+ Number
+
+ 10
+
+
+
+
+ Use
+ Use
+
+ true
+
+
diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Help/ru.html b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Help/ru.html
index e422d6f63..5b65b9608 100644
--- a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Help/ru.html
+++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/ВыбораРежимаОткрытияМакета/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для выбора режима открытия макета.
Для открытия макета в списке Макеты печатных форм можно:
нажать клавишу Enter - необходимо выбрать режим открытия макета;
diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Form.form b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Form.form
index 9b02d5cdc..174b9564b 100644
--- a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Form.form
+++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Form.form
@@ -1198,7 +1198,7 @@
true
- CommonPicture.УдалитьПользовательскийМакет
+ CommonPicture.ПользовательскийМакетУдалить
diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Help/ru.html b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Help/ru.html
index 34c46a825..ca0d8e233 100644
--- a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Help/ru.html
+++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для управления макетами печати. В списке перечислены макеты (бланки) всех печатных форм, имеющихся в программе.
Открыть список можно с помощью команды Макеты печатных форм раздела Администрирование - Печатные формы, отчеты и обработки.
В списке выводится:
@@ -31,6 +31,6 @@
Использовать стандартный макет. При этом значок становится неактивным, показывая, что имеется и пользовательский макет.
Предупреждение
Некоторые изменения макета могут привести к тому, что печатная форма перестанет выводиться. Как правило, такую неполадку вызывает удаление, переименование областей и параметров макета.
Если печатная форма после изменения макета перестала формироваться, можно попытаться исправить макет, откатив ошибочные правки.
-
Если исправить макет не удается, необходимо Удалить измененный макет. Вместо такого макета будет вновь использоваться стандартный.
Действие при выборе печатной формы
+
Если исправить макет не удается, необходимо Удалить измененный макет. Вместо такого макета будет вновь использоваться стандартный.
Действие при выборе печатной формы
Для того чтобы указать, какое действие должно выполняться при двойном щелчке мыши по макету, нажмите Еще - Задать действие при выборе макета печатной формы. Укажите, как открыть макет. При необходимости нажмите соответствующий флажок, для того чтобы программа больше не выводила этот вопрос.
\ No newline at end of file
diff --git a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/РедактированиеМакета/Help/ru.html b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/РедактированиеМакета/Help/ru.html
index ef4566360..91cdb4154 100644
--- a/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/РедактированиеМакета/Help/ru.html
+++ b/SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/РедактированиеМакета/Help/ru.html
@@ -1,11 +1,11 @@
-
+
Макеты в виде табличного документа редактируются в самой программе, а для редактирования макетов в виде офисных документов в форматах Microsoft Word и OpenOffice.org Writer на компьютере должны быть установлены соответствующие офисные программы.
Как правило, никаких специальных действий для запуска нужной программы выполнять не требуется, достаточно кликнуть по файлу макета, и нужная программа запустится автоматически (при условии, что она установлена).
Многие документы, справочники и другие объекты программы имеют свои печатные формы. Печатные формы могут формироваться в виде табличных документов или офисных документов в форматах Microsoft Word, OpenOffice.org Writer, Adobe PDF, HTML, Microsoft Excel, а также в формате табличного документа 1С:Предприятие (.mxl). При этом не требуется, чтобы сами эти программы были установлены на компьютере.
В то же время, для формирования печатных форм, которые сразу выводятся в форматах Microsoft Word и OpenOffice.org Writer, необходимо, чтобы на компьютере были установлены соответствующие офисные программы.
Особенности формирования печатных форм в веб-клиенте
Правила регистрации объектов можно открыть из настройки синхронизации данных по команде Еще - Загрузить правила регистрации объектов.
@@ -38,7 +38,7 @@
Обратите внимание, что загружены корректные правила, подходящие для используемых версий конфигурации-источника и конфигурации-приемника. В поле Информация о правилах выводится дата создания правил и другая необходимая информация.
Нажмите Записать и закрыть. Загруженные правила будут применены немедленно.
-
Примечание: правила регистрации объектов используются для всех однотипных синхронизаций данных (которые основываются на одном плане обмена; например: на базе плана обмена Полная синхронизация настроено два обмена "Синхронизация с филиалом в Краснодаре" и "Синхронизация с представительством в Киеве"). Поэтому если в программе настроено несколько однотипных синхронизаций, то замену правил достаточно выполнить однократно (выбрав любую из настроенных синхронизаций данных).
+
Примечание: правила регистрации объектов используются для всех однотипных синхронизаций данных (которые основываются на одном плане обмена; например: на базе плана обмена Полная синхронизация настроено два обмена "Синхронизация с филиалом в Краснодаре" и "Синхронизация с представительством в Киеве"). Поэтому если в программе настроено несколько однотипных синхронизаций, то замену правил достаточно выполнить однократно (выбрав любую из настроенных синхронизаций данных).
\ No newline at end of file
diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Help/ru.html b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Help/ru.html
index 7a47dd4cf..533c350a7 100644
--- a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Help/ru.html
+++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Настройка синхронизации данных по умолчанию производится в соответствии с так называемыми Типовыми правилами обмена. Если эти правила устарели, то выполнение синхронизации данных приведет к очень серьезным ошибкам, порче информации. Поэтому при настройке новой синхронизации данных, а также при выходе очередного обновления любой из программ, участвующих в синхронизации данных, необходимо контролировать актуальность используемых типовых правил обмена.
Типовые правила обмена состоят из правил конвертации объектов и правил регистрации объектов. Правила конвертации данных используются при синхронизации данных двух программ. Правила регистрации предусмотрены для всех видов синхронизации данных. Комплект актуальных правил обмена публикуется на сайте технической поддержки http://users.v8.1c.ru. Исправительные версии правил обмена также публикуются на данном сайте.
Контроль актуальности правил синхронизации
diff --git a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ManagerModule.bsl b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ManagerModule.bsl
index 7a1817a53..f32e73ae0 100644
--- a/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ManagerModule.bsl
+++ b/SSL/src/InformationRegisters/ПравилаДляОбменаДанными/ManagerModule.bsl
@@ -1,3 +1,28 @@
+
+#Область ОбработчикиСобытий
+
+Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
+
+ Если ВидФормы = "ФормаЗаписи" Тогда
+
+ СтандартнаяОбработка = Ложь;
+
+ Если Параметры.Ключ.ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов Тогда
+
+ ВыбраннаяФорма = "РегистрСведений.ПравилаДляОбменаДанными.Форма.ПравилаКонвертацииОбъектов";
+
+ ИначеЕсли Параметры.Ключ.ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов Тогда
+
+ ВыбраннаяФорма = "РегистрСведений.ПравилаДляОбменаДанными.Форма.ПравилаРегистрацииОбъектов";
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
+
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область СлужебныеПроцедурыИФункции
@@ -1142,27 +1167,3 @@
#КонецОбласти
#КонецЕсли
-
-#Область ОбработчикиСобытий
-
-Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
-
- Если ВидФормы = "ФормаЗаписи" Тогда
-
- СтандартнаяОбработка = Ложь;
-
- Если Параметры.Ключ.ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаКонвертацииОбъектов Тогда
-
- ВыбраннаяФорма = "РегистрСведений.ПравилаДляОбменаДанными.Форма.ПравилаКонвертацииОбъектов";
-
- ИначеЕсли Параметры.Ключ.ВидПравил = Перечисления.ВидыПравилДляОбменаДанными.ПравилаРегистрацииОбъектов Тогда
-
- ВыбраннаяФорма = "РегистрСведений.ПравилаДляОбменаДанными.Форма.ПравилаРегистрацииОбъектов";
-
- КонецЕсли;
-
- КонецЕсли;
-
-КонецПроцедуры
-
-#КонецОбласти
diff --git a/SSL/src/InformationRegisters/ПубличныеИдентификаторыСинхронизируемыхОбъектов/Forms/ФормаЗаписи/Form.form b/SSL/src/InformationRegisters/ПубличныеИдентификаторыСинхронизируемыхОбъектов/Forms/ФормаЗаписи/Form.form
new file mode 100644
index 000000000..4739c77a1
--- /dev/null
+++ b/SSL/src/InformationRegisters/ПубличныеИдентификаторыСинхронизируемыхОбъектов/Forms/ФормаЗаписи/Form.form
@@ -0,0 +1,189 @@
+
+
+
+ УзелИнформационнойБазы
+ 1
+ true
+ true
+
+ true
+
+
+ Запись.УзелИнформационнойБазы
+
+
+ УзелИнформационнойБазыРасширеннаяПодсказка
+ 3
+ Label
+ true
+ true
+
+ Left
+
+
+
+ УзелИнформационнойБазыКонтекстноеМеню
+ 2
+ true
+
+ InputField
+ Enter
+ true
+ Left
+ true
+
+ true
+ true
+ true
+ true
+ true
+ true
+ Normal
+
+
+
+ Ссылка
+ 4
+ true
+ true
+
+ true
+
+
+ Запись.Ссылка
+
+
+ СсылкаРасширеннаяПодсказка
+ 6
+ Label
+ true
+ true
+
+ Left
+
+
+
+ СсылкаКонтекстноеМеню
+ 5
+ true
+
+ InputField
+ Enter
+ true
+ Left
+ true
+
+ true
+ true
+ true
+ true
+ true
+ true
+ Normal
+
+
+
+ Идентификатор
+ 7
+ true
+ true
+
+ true
+
+
+ ИдентификаторСтрокой
+
+
+ ИдентификаторРасширеннаяПодсказка
+ 9
+ Label
+ true
+ true
+
+ Left
+
+
+
+ ИдентификаторКонтекстноеМеню
+ 8
+ true
+
+ InputField
+ Enter
+ true
+ Left
+ true
+
+ true
+ true
+ true
+ true
+ true
+ true
+ Normal
+
+
+
+ ФормаКоманднаяПанель
+ -1
+ Left
+ true
+
+
+ OnOpen
+ ПриОткрытии
+
+ LockOwner
+ true
+ true
+ true
+ Vertical
+ true
+ true
+ true
+ auto
+ true
+
+ Запись
+ 1
+
+ InformationRegisterRecordManager.ПубличныеИдентификаторыСинхронизируемыхОбъектов
+
+
+ true
+
+
+ true
+
+ true
+ true
+
+
+ ИдентификаторСтрокой
+
+ ru
+ Идентификатор строкой
+
+ 2
+
+ String
+
+
+
+ true
+
+
+ true
+
+
+
+
+
+
+
+
+ BeforeWrite
+ ПередЗаписью
+
+
+
diff --git a/SSL/src/InformationRegisters/ПубличныеИдентификаторыСинхронизируемыхОбъектов/Forms/ФормаЗаписи/Module.bsl b/SSL/src/InformationRegisters/ПубличныеИдентификаторыСинхронизируемыхОбъектов/Forms/ФормаЗаписи/Module.bsl
new file mode 100644
index 000000000..fd84ffe0e
--- /dev/null
+++ b/SSL/src/InformationRegisters/ПубличныеИдентификаторыСинхронизируемыхОбъектов/Forms/ФормаЗаписи/Module.bsl
@@ -0,0 +1,20 @@
+#Область ОбработчикиСобытийФормы
+
+&НаКлиенте
+Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
+
+ НовыйУникальныйИдентификатор = Новый УникальныйИдентификатор(ИдентификаторСтрокой);
+ Если Запись.Идентификатор <> НовыйУникальныйИдентификатор Тогда
+ Запись.Идентификатор = НовыйУникальныйИдентификатор;
+ КонецЕсли;
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПриОткрытии(Отказ)
+
+ ИдентификаторСтрокой = Запись.Идентификатор;
+
+КонецПроцедуры
+
+#КонецОбласти
\ No newline at end of file
diff --git a/SSL/src/InformationRegisters/ПубличныеИдентификаторыСинхронизируемыхОбъектов/ManagerModule.bsl b/SSL/src/InformationRegisters/ПубличныеИдентификаторыСинхронизируемыхОбъектов/ManagerModule.bsl
new file mode 100644
index 000000000..a886083df
--- /dev/null
+++ b/SSL/src/InformationRegisters/ПубличныеИдентификаторыСинхронизируемыхОбъектов/ManagerModule.bsl
@@ -0,0 +1,74 @@
+#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
+
+#Область СлужебныеПроцедурыИФункции
+
+// Процедура добавляет запись в регистр по переданным значениям структуры.
+Процедура ДобавитьЗапись(СтруктураЗаписи, Загрузка = Ложь) Экспорт
+
+ ОбменДаннымиСервер.ДобавитьЗаписьВРегистрСведений(СтруктураЗаписи, "ПубличныеИдентификаторыСинхронизируемыхОбъектов", Загрузка);
+
+КонецПроцедуры
+
+Функция ЗаписьЕстьВРегистре(СтруктураЗаписи) Экспорт
+
+ НаборЗаписей = РегистрыСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов.СоздатьНаборЗаписей();
+
+ // Устанавливаем отбор по измерениям регистра.
+ Для Каждого Элемент Из СтруктураЗаписи Цикл
+ НаборЗаписей.Отбор[Элемент.Ключ].Установить(Элемент.Значение);
+ КонецЦикла;
+
+ НаборЗаписей.Прочитать();
+
+ Возврат НаборЗаписей.Количество() > 0;
+
+КонецФункции
+
+// Процедура удаляет набор записей в регистре по переданным значениям структуры.
+Процедура УдалитьЗапись(СтруктураЗаписи, Загрузка = Ложь) Экспорт
+
+ ОбменДаннымиСервер.УдалитьНаборЗаписейВРегистреСведений(СтруктураЗаписи, "ПубличныеИдентификаторыСинхронизируемыхОбъектов", Загрузка);
+
+КонецПроцедуры
+
+// Преобразует ссылку на объект текущей информационной базы в строковое представление УИД.
+// Если в регистре ПубличныеИдентификаторыСинхронизируемыхОбъектов есть такая ссылка, возвращается УИД из регистра.
+// В противном случае возвращается УИД переданной ссылки.
+//
+// Параметры:
+// УзелИнформационнойБазы - Ссылка на узел плана обмена, в который происходит выгрузка данных.
+// СсылкаНаОбъект - ссылка на объект информационной базы, для которого необходимо получить
+// уникальный идентификатор объекта XDTO.
+//
+// Возвращаемое значение:
+// Строка - Уникальный идентификатор объекта.
+Функция ПубличныйИдентификаторПоСсылкеОбъекта(УзелИнформационнойБазы, СсылкаНаОбъект) Экспорт
+ УстановитьПривилегированныйРежим(Истина);
+
+ // Определение публичной ссылки через ссылку на объект.
+ Запрос = Новый Запрос("
+ |ВЫБРАТЬ
+ | Идентификатор
+ |ИЗ РегистрСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов
+ |ГДЕ УзелИнформационнойБазы = &УзелИнформационнойБазы И
+ | Ссылка = &Ссылка");
+ Запрос.УстановитьПараметр("УзелИнформационнойБазы", УзелИнформационнойБазы);
+ Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект);
+ Выборка = Запрос.Выполнить().Выбрать();
+ Если Выборка.Количество() = 1 Тогда
+ Выборка.Следующий();
+ Возврат СокрЛП(Выборка.Идентификатор);
+ ИначеЕсли Выборка.Количество() > 1 Тогда
+ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
+ НСтр("ru = 'Для ссылки <%1> и узла <%2> назначено несколько уникальных идентификаторов.'"),
+ Строка(СсылкаНаОбъект), Строка(УзелИнформационнойБазы)
+ );
+ КонецЕсли;
+ // Получение УИД текущей ссылки.
+ Возврат СокрЛП(СсылкаНаОбъект.УникальныйИдентификатор());
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецЕсли
\ No newline at end of file
diff --git a/SSL/src/InformationRegisters/ПубличныеИдентификаторыСинхронизируемыхОбъектов/ПубличныеИдентификаторыСинхронизируемыхОбъектов.mdo b/SSL/src/InformationRegisters/ПубличныеИдентификаторыСинхронизируемыхОбъектов/ПубличныеИдентификаторыСинхронизируемыхОбъектов.mdo
new file mode 100644
index 000000000..fad54c9f6
--- /dev/null
+++ b/SSL/src/InformationRegisters/ПубличныеИдентификаторыСинхронизируемыхОбъектов/ПубличныеИдентификаторыСинхронизируемыхОбъектов.mdo
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+ ПубличныеИдентификаторыСинхронизируемыхОбъектов
+
+ ru
+ Публичные идентификаторы синхронизируемых объектов
+
+ InDialog
+ InformationRegister.ПубличныеИдентификаторыСинхронизируемыхОбъектов.Form.ФормаЗаписи
+
+ Use
+ Active
+
+ Use
+
+
+
+
+ Use
+ LineNumber
+
+ Use
+
+
+
+
+ Use
+ Recorder
+
+ Use
+
+
+
+
+ Use
+ Period
+
+ ShowError
+ Use
+
+
+
+ Managed
+
+ УзелИнформационнойБазы
+
+ ru
+ Узел информационной базы
+
+
+ ExchangePlanRef
+
+
+
+ Use
+ Use
+ true
+
+ true
+ true
+
+
+ Ссылка
+
+ ru
+ Ссылка
+
+
+ AnyRef
+
+
+
+ true
+ Use
+ Use
+ true
+
+ true
+ true
+
+
+ Идентификатор
+
+ ru
+ Идентификатор
+
+
+ String
+
+ 36
+
+
+
+
+ true
+ Index
+ Use
+
+ true
+
+
+ ФормаЗаписи
+
+ ru
+ Форма записи
+
+ PersonalComputer
+ MobileDevice
+
+
diff --git a/SSL/src/InformationRegisters/РабочиеКаталогиФайлов/РабочиеКаталогиФайлов.mdo b/SSL/src/InformationRegisters/РабочиеКаталогиФайлов/РабочиеКаталогиФайлов.mdo
index 6b4c3c59f..987b243ae 100644
--- a/SSL/src/InformationRegisters/РабочиеКаталогиФайлов/РабочиеКаталогиФайлов.mdo
+++ b/SSL/src/InformationRegisters/РабочиеКаталогиФайлов/РабочиеКаталогиФайлов.mdo
@@ -55,7 +55,6 @@
ruПуть
- Путь к каталогу на дискеString
@@ -76,13 +75,12 @@
ruПапка
- Папка в информационной базеCatalogRef.ПапкиФайловru
- Папка в информационной базе
+ Папка файлов, к которой указан путь в рабочем каталоге пользователя
@@ -99,13 +97,12 @@
ruПользователь
- Пользователь информационной базыCatalogRef.Пользователиru
- Пользователь информационной базы
+ Пользователь, которому принадлежит рабочий каталог
diff --git a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Help/ru.html b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Help/ru.html
index 1c1b537e4..82424bb50 100644
--- a/SSL/src/InformationRegisters/РезультатыОбменаДанными/Help/ru.html
+++ b/SSL/src/InformationRegisters/РезультатыОбменаДанными/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для просмотра статистики по результатам синхронизации данных.
Результаты синхронизации данных в виде ссылки можно увидеть в списке Синхронизации данных, например, на рабочем столе программы. В зависимости от результатов ссылка принимает значения Предупреждений нет (в случае успешной синхронизации данных) или Предупреждения (при этом в скобках указывается количество предупреждений). Для открытия списка результатов синхронизации данных пройдите по ссылке.
При выполнении синхронизации данных возможно возникновение проблемных ситуаций, требующих вмешательства пользователя. В колонках списка выводится необходимая информация о данных, по которым возникли проблемы и причина, по которой они не были приняты. Причина кратко указывается в специальной колонке, при этом по выделенной строке в нижней части списка выводится подробная формулировка, с указанием проблемных полей списков или документов.
diff --git a/SSL/src/InformationRegisters/СостоянияКонтрагентов/СостоянияКонтрагентов.mdo b/SSL/src/InformationRegisters/СостоянияКонтрагентов/СостоянияКонтрагентов.mdo
new file mode 100644
index 000000000..82a1d6a37
--- /dev/null
+++ b/SSL/src/InformationRegisters/СостоянияКонтрагентов/СостоянияКонтрагентов.mdo
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+ СостоянияКонтрагентов
+
+ ru
+ Состояния контрагентов
+
+ InDialog
+
+ Use
+ Active
+
+ Use
+
+
+
+
+ Use
+ LineNumber
+
+ Use
+
+
+
+
+ Use
+ Recorder
+
+ Use
+
+
+
+
+ Use
+ Period
+
+ ShowError
+ Use
+
+
+
+ Managed
+
+ Состояние
+
+ ru
+ Состояние
+
+
+ EnumRef.СостоянияСуществованияКонтрагента
+
+
+
+ Use
+ Use
+
+ Index
+
+
+ ИНН
+
+ ru
+ ИНН
+
+
+ String
+
+ 12
+
+
+
+
+ Index
+ Use
+ Use
+
+
+
+ КПП
+
+ ru
+ КПП
+
+
+ String
+
+ 9
+
+
+
+ ru
+ Код причины постановки на учет
+
+
+
+ Index
+ Use
+ Use
+
+
+
+ Контрагент
+
+ ru
+ Контрагент
+
+
+ DefinedType.Контрагент
+
+
+
+ true
+ Use
+ Use
+ true
+
+ true
+ true
+
+
diff --git a/SSL/src/InformationRegisters/УдалитьГруппыЗначенийДоступа/ManagerModule.bsl b/SSL/src/InformationRegisters/УдалитьГруппыЗначенийДоступа/ManagerModule.bsl
index 3baeb10fe..9562d6288 100644
--- a/SSL/src/InformationRegisters/УдалитьГруппыЗначенийДоступа/ManagerModule.bsl
+++ b/SSL/src/InformationRegisters/УдалитьГруппыЗначенийДоступа/ManagerModule.bsl
@@ -5,10 +5,20 @@
// Обработчик обновления информационной базы.
Процедура ПереместитьДанныеВНовыйРегистр() Экспорт
- ТипыВладельцев = УправлениеДоступомСлужебныйПовтИсп.Параметры().ВозможныеПраваДляНастройкиПравОбъектов.ТипыВладельцев;
-
Запрос = Новый Запрос;
- Запрос.УстановитьПараметр("ТипыВладельцев", ТипыВладельцев);
+ Запрос.Текст =
+ "ВЫБРАТЬ
+ | ИСТИНА КАК ЗначениеИстина
+ |ИЗ
+ | РегистрСведений.УдалитьГруппыЗначенийДоступа КАК УдалитьГруппыЗначенийДоступа";
+
+ Если Запрос.Выполнить().Пустой() Тогда
+ Возврат;
+ КонецЕсли;
+
+ Запрос.УстановитьПараметр("ТипыВладельцев",
+ УправлениеДоступомСлужебныйПовтИсп.Параметры().ВозможныеПраваДляНастройкиПравОбъектов.ТипыВладельцев);
+
Запрос.Текст =
"ВЫБРАТЬ
| УдалитьГруппыЗначенийДоступа.ЗначениеДоступа КАК Объект,
@@ -22,17 +32,15 @@
| И (ТИПЗНАЧЕНИЯ(УдалитьГруппыЗначенийДоступа.ЗначениеДоступа) = ТИПЗНАЧЕНИЯ(ИдентификаторыОбъектовМетаданных.ЗначениеПустойСсылки))
| И (ИдентификаторыОбъектовМетаданных.ЗначениеПустойСсылки В (&ТипыВладельцев))";
- РезультатЗапроса = Запрос.Выполнить();
-
- Если РезультатЗапроса.Пустой() Тогда
- Возврат;
- КонецЕсли;
-
НачатьТранзакцию();
Попытка
- НаборЗаписей = РегистрыСведений.НаследованиеНастроекПравОбъектов.СоздатьНаборЗаписей();
- НаборЗаписей.Загрузить(РезультатЗапроса.Выгрузить());
- НаборЗаписей.Записать();
+ РезультатЗапроса = Запрос.Выполнить();
+
+ Если Не РезультатЗапроса.Пустой() Тогда
+ НаборЗаписей = РегистрыСведений.НаследованиеНастроекПравОбъектов.СоздатьНаборЗаписей();
+ НаборЗаписей.Загрузить(РезультатЗапроса.Выгрузить());
+ НаборЗаписей.Записать();
+ КонецЕсли;
НаборЗаписей = РегистрыСведений.УдалитьГруппыЗначенийДоступа.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
@@ -45,6 +53,25 @@
КонецПроцедуры
+// Обработчик обновления информационной базы.
+Процедура ОчиститьРегистр() Экспорт
+
+ Запрос = Новый Запрос;
+ Запрос.Текст =
+ "ВЫБРАТЬ
+ | ИСТИНА КАК ЗначениеИстина
+ |ИЗ
+ | РегистрСведений.УдалитьГруппыЗначенийДоступа КАК УдалитьГруппыЗначенийДоступа";
+
+ Если Запрос.Выполнить().Пустой() Тогда
+ Возврат;
+ КонецЕсли;
+
+ НаборЗаписей = РегистрыСведений.УдалитьГруппыЗначенийДоступа.СоздатьНаборЗаписей();
+ НаборЗаписей.Записать();
+
+КонецПроцедуры
+
#КонецОбласти
#КонецЕсли
\ No newline at end of file
diff --git a/SSL/src/InformationRegisters/УдалитьНастройкиВерсионированияОбъектов/Help/ru.html b/SSL/src/InformationRegisters/УдалитьНастройкиВерсионированияОбъектов/Help/ru.html
index 8c4414fb7..07f8631d5 100644
--- a/SSL/src/InformationRegisters/УдалитьНастройкиВерсионированияОбъектов/Help/ru.html
+++ b/SSL/src/InformationRegisters/УдалитьНастройкиВерсионированияОбъектов/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для настройки версионирования объектов.
С помощью версионирования документов и справочников можно отслеживать историю изменений.
Для ведения истории изменений объектов необходимо выбрать команду Общие настройки раздела Администрирование, включить флажок Версионирование объектов (по умолчанию включен).
@@ -7,10 +7,10 @@
Объект - список объектов программы в виде дерева с группировкой по типам объектов.
Вариант версионирования - выбранный вариант версионирования.
Выбор варианта версионирования
Выберите один или несколько объектов, затем выполните команду Установить вариант версионирования, затем из выпадающего списка выберите нужный вариант версионирования для каждого типа документов и справочников. Также можно найти команду в меню Еще или в контекстном меню по правой кнопке мыши.
-
Не версионировать - история версий объекта не ведется;
-
Версионировать при записи - новая запись заносится в историю версий каждый раз при изменении (или создании нового) справочника или документа;
-
Версионировать при проведении - версии сохраняются только при проведении; применимо только для документов, для которых разрешено проведение.
-
По умолчанию - установить рекомендуемые настройки (для справочников - не версионировать, для документов - версионировать при проведении).
Также возможна настройка версионирования сразу для группы объектов программы, например, можно выбрать все документы или справочники.
+
Не версионировать - история версий объекта не ведется;
+
Версионировать при записи - новая запись заносится в историю версий каждый раз при изменении (или создании нового) справочника или документа;
+
Версионировать при проведении - версии сохраняются только при проведении; применимо только для документов, для которых разрешено проведение.
+
По умолчанию - установить рекомендуемые настройки (для справочников - не версионировать, для документов - версионировать при проведении).
Также возможна настройка версионирования сразу для группы объектов программы, например, можно выбрать все документы или справочники.
Применение версионирования
В начале внедрения программы, когда объемы информации еще небольшие, когда исполнители делают много ошибок в работе (например, вводят лишнюю информацию или нечаянно удаляют нужную), версионирование может помочь привести списки и документы в порядок, избавиться от допущенных ошибок, помочь исполнителям понять свои ошибочные действия и не допускать их в дальнейшей работе.
Если дисковое пространство, предназначенное для хранения данных программы, ограничено, с помощью отчета можно контролировать объем хранимых версий объектов в сравнении и принять решение о сокращении числа хранимых версий.
Предназначен для просмотра статистических данных по выбранному регламентному заданию.
Открывается с помощью двойного щелчка мыши по наименованию регламентного задания из отчета Анализ журнала регистрации - Продолжительность регламентных заданий.
Отчет предназначен для диагностики работы программы на основе данных журнала регистрации. Выводит различную статистическую информацию о работе программы, об ошибках и предупреждениях во время ее работы, о количестве активных пользователей в различные периоды времени и времени выполнения регламентных заданий.
Отчет открывается из раздела Администрирование - Поддержка и обслуживание по команде Отчеты администратора.
Необходимо помнить, что эта статистическая информация предназначена только для диагностики работы программы и загруженности сервера и не является средством для оценки эффективности работы сотрудников, расчета оплаты труда и т.д.
Предназначен для выдачи статистических данных по результатам анкетирования.
Открывается по команде Анализ опроса в разделе Анкетирование.
При помощи этого отчета по интересующему опросу (необходимо выбрать его из списка в поле Опрос) можно получить итоговую информацию по количеству ответов в различных разрезах.
Предназначен для анализа ответов респондентов на анкеты.
Открывается по команде Аналитический отчет по анкетированию в разделе Анкетирование.
Отчет позволяет просматривать результаты анкетирования в различных представлениях: ответы на простые вопросы и вопросы с агрегируемыми показателями, ответы на табличные вопросы; а также сравнивать ответы на одни и те же вопросы, заданные в разных опросах.
Если установлен отбор по Координатору, то в отчет будут выводиться только те задачи, которые назначены исполнителям в объектах адресации, за которые отвечает указанный координатор выполнения задач. Можно установить фильтр по Автору задачи. Также предусмотрен отбор по Периоду.
Открывается по команде Задачи, истекающие на дату в списке Отчеты по задачам раздела Бизнес-процессы.
Для контроля своих задач исполнитель может воспользоваться этим отчетом. По каждому исполнителю выводится сводка по количеству задач со сроками исполнения, истекающими на указанную в поле Крайний срок дату. Отчет позволяет выполнить расшифровку по Автору, Важности, Задаче и Сроку.
Отчет предназначен для просмотра сведений об использовании элементов списков в документах программы.
При работе в программе пользователи могут по ошибке допускать дублирование элементов, от которого необходимо избавляться, т.к. это мешает правильному учету в программе. При использовании этих дублирующихся элементов могут быть ссылки то на один, то на другой, в результате происходят ошибки, например, в бухгалтерском учете списание денежных средств проходит некорректно и т.п.
Для того чтобы была возможность удалить дубли из программы, сначала необходимо удалить ссылки на них в документах. Отчет показывает, в каких документах программы используются данные объекты.
Предназначен для мониторинга задач. По умолчанию в отчет попадут все задачи за текущий месяц с истекшим сроком исполнения.
Открывается по команде Задачи, выполненные с нарушением сроков в списке Отчеты по задачам раздела Бизнес-процессы и задачи.
В отчете задачи сгруппированы по исполнителям. В строки отчета выводится задача, важность, плановая и фактическая дата завершения задачи, указывается количество просроченных дней. Отчет формируется за период. Возможны отборы по Периоду и по Автору.
После того как настроен и сформирован отчет, его можно сохранить в новом варианте отчета. Для этого необходимо воспользоваться кнопкой Варианты отчетов - Сохранить вариант или командой Еще - Сохранить вариант.
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БазоваяФункциональность/БазоваяФункциональность.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БазоваяФункциональность/БазоваяФункциональность.mdo
index 5ba11a440..9b75e6d59 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БазоваяФункциональность/БазоваяФункциональность.mdo
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БазоваяФункциональность/БазоваяФункциональность.mdo
@@ -44,7 +44,6 @@
StyleItem.ПоясняющийОшибкуТекстCommonPicture.ВидыОперацийCommonPicture.ПиктограммыЭлементов
- CommonModule.РегламентированныеДанныеКлиентСерверCommonPicture.ПодсистемаCommonModule.СтандартныеПодсистемыСерверCommonModule.СтандартныеПодсистемыКлиент
@@ -207,5 +206,6 @@
CommonModule.НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервераCommonModule.РаботаВБезопасномРежимеКлиентПереопределяемыйCommonForm.АвторизацияНаСайтеПоддержкиПользователей
+ DataProcessor.РекомендацияПоПовышениюСкоростиРаботыSubsystem.СтандартныеПодсистемы
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БизнесПроцессыИЗадачи/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БизнесПроцессыИЗадачи/Help/ru.html
index 68746a6bf..c23ad51a1 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БизнесПроцессыИЗадачи/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/БизнесПроцессыИЗадачи/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Бизнес-процессы в конфигурации позволяют объединять отдельные операции в цепочки взаимосвязанных действий, приводящих к достижению определенных целей.
Ход выполнения бизнес-процесса может быть наглядно представлен в виде карты маршрута. Карта маршрута описывает логику бизнес-процесса и весь его жизненный цикл в виде схематического изображения последовательности прохождения точек маршрута. Точка маршрута отражает этап бизнес-процесса, связанный с выполнением, как правило, одной операции. При переходе бизнес-процесса в какую либо точку маршрута, предусматривающую действия конкретного исполнителя, формируется задача. После того как исполнитель отметит задачу как выполненную, бизнес-процес автоматически перейдет к следующей точке маршрута. Таким образом, с помощью задач бизнес-процес продвигается к точке своего завершения. При работе пользователя с системой предусмотрена возможность отображения актуальной карты маршрута для конкретного бизнес-процесса, с учетом пройденных и активных точек маршрута.
Задачи могут быть адресованы исполнителю или группе исполнителей как персонально — персональная адресация, так и для некоторых бизнес-процессов, с использованием ролей бизнес-процесса — ролевая адресация (необходимо различать роли бизнес-процесса и роли для организации прав доступа). В случае ролевой адресации задача выдается не персонально исполнителю, а некоторой роли бизнес-процесса (например, "Старший по залу"), а соответствие пользователей ролям задается в регистре сведений "Роли и исполнители" и используется системой для доставки поручений конкретным пользователям. Роли бизнес-процесса поставляются в составе конфигурации.
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Валюты/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Валюты/Help/ru.html
index b6ca9570b..e9b356a77 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Валюты/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Валюты/Help/ru.html
@@ -1,2 +1,2 @@
-
+
Программа поддерживает многовалютный учет, и позволяет вводить операции и просматривать отчеты в любой валюте, представленной в справочнике Валюты. Конфигурация поставляется с «Общероссийским классификатором валют» (ОКВ). Существует возможность загрузки курсов валют с сайта «РосБизнесКонсалтинг».
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВариантыОтчетов/ВариантыОтчетов.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВариантыОтчетов/ВариантыОтчетов.mdo
index f357c66e7..8780123a9 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВариантыОтчетов/ВариантыОтчетов.mdo
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВариантыОтчетов/ВариантыОтчетов.mdo
@@ -62,5 +62,6 @@
CommonPicture.ОбычныйДоступСФлажкомCommonPicture.ПредопределенныйЭлементCommonPicture.СкрытаяНастройкаОтчета
+ CommonPicture.ПиктограммыНастроекОтчетаSubsystem.СтандартныеПодсистемы
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВерсионированиеОбъектов/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВерсионированиеОбъектов/Help/ru.html
index d95da9901..d6ffdace2 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВерсионированиеОбъектов/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВерсионированиеОбъектов/Help/ru.html
@@ -1,3 +1,3 @@
-
+
Конфигурация позволяет вести историю изменений объектов информационной базы. Эта функция позволяет ответить на вопросы: "Кто изменил объект?", "Когда произошли изменения?" и "Что изменено в объекте?". Версионируемыми объектами могут быть справочники и документы. Конфигурация позволяет просматривать любую версию объекта или сравнивать любые версии объекта между собой.
Перед использованием возможности версионирования, необходимо установить флаг Использовать версионирование объектов, в форме настройки параметров системы (раздел Настройка и администрирование). После сохранения настроек на панели навигации появится команда Версионируемые объекты, которая открывает форму настройки версионирования.
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВерсионированиеОбъектов/ВерсионированиеОбъектов.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВерсионированиеОбъектов/ВерсионированиеОбъектов.mdo
index 9f6924a32..25fdc0792 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВерсионированиеОбъектов/ВерсионированиеОбъектов.mdo
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ВерсионированиеОбъектов/ВерсионированиеОбъектов.mdo
@@ -30,7 +30,7 @@
StyleItem.УдаленныйРеквизитФонEnum.ТипыВерсийОбъектаRole.ЧтениеИнформацииОВерсияхОбъектов
- EventSubscription.УдалитьИнформациюОбАвтореВерсии
+ EventSubscription.ОчиститьИнформациюОбАвтореВерсииEventSubscription.ЗаписатьВерсиюПриОбменеДаннымиReport.АнализВерсийОбъектовEnum.СрокиХраненияВерсий
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ГрупповоеИзменениеОбъектов/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ГрупповоеИзменениеОбъектов/Help/ru.html
index bacf62dc7..a8b6dbe1e 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ГрупповоеИзменениеОбъектов/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ГрупповоеИзменениеОбъектов/Help/ru.html
@@ -1 +1 @@
-С помощью группового изменения объектов пользователь может за одно действие изменить значения реквизитов, дополнительных реквизитов или дополнительных сведений (далее по тексту: реквизитов) у выбранных объектов определенного типа. Для работы с групповым изменением объектов пользователю не требуются дополнительные роли. Если пользователю доступно редактирование самого объекта, то ему доступно и групповое изменение объекта. Для перехода к помощнику группового изменения можно воспользоваться командой Изменить выделенные командной панели или контекстного меню списка, предварительно выбрав в списке набор объектов с помощью множественного выделения.
\ No newline at end of file
+С помощью группового изменения объектов пользователь может за одно действие изменить значения реквизитов, дополнительных реквизитов или дополнительных сведений (далее по тексту: реквизитов) у выбранных объектов определенного типа. Для работы с групповым изменением объектов пользователю не требуются дополнительные роли. Если пользователю доступно редактирование самого объекта, то ему доступно и групповое изменение объекта. Для перехода к помощнику группового изменения можно воспользоваться командой Изменить выделенные командной панели или контекстного меню списка, предварительно выбрав в списке набор объектов с помощью множественного выделения.
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ДополнительныеОтчетыИОбработки/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ДополнительныеОтчетыИОбработки/Help/ru.html
index 444bd9ed0..e22e1dfa7 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ДополнительныеОтчетыИОбработки/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ДополнительныеОтчетыИОбработки/Help/ru.html
@@ -1,19 +1,19 @@
-
+
Конфигурация позволяет подключать и использовать дополнительные (внешние) отчеты и обработки к ИБ в режиме «1С:Предприятия». Они позволяют расширять функциональность конфигурации, не внося в неё изменений.
-
С помощью дополнительных отчетов и обработок можно:
+
С помощью дополнительных отчетов и обработок можно:
-
Из форм объектов и списков объектов:
+
Из форм объектов и списков объектов:
-
формировать отчеты, связанные с объектом;
+
формировать отчеты, связанные с объектом;
-
формировать дополнительные печатные формы объекта;
+
формировать дополнительные печатные формы объекта;
-
на основании родительских объектов создавать и заполнять дочерние («связанные») объекты;
+
на основании родительских объектов создавать и заполнять дочерние («связанные») объекты;
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗавершениеРаботыПользователей/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗавершениеРаботыПользователей/Help/ru.html
index e4074a437..f59626bab 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗавершениеРаботыПользователей/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗавершениеРаботыПользователей/Help/ru.html
@@ -1,2 +1,2 @@
-
+
Конфигурация позволяет завершать существующие соединения с информационной базой и устанавливать блокировку новых соединений с информационной базой на определенный период времени. Подробнее см. раздел Блокировка соединений с информационной базой.
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗапретРедактированияРеквизитовОбъектов/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗапретРедактированияРеквизитовОбъектов/Help/ru.html
index 07cba705e..25b9540cd 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗапретРедактированияРеквизитовОбъектов/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЗапретРедактированияРеквизитовОбъектов/Help/ru.html
@@ -1,3 +1,3 @@
-
+
Конфигурация запрещает редактировать (после первоначального заполнения) некоторые реквизиты объектов, которые определяют характер данного объекта и которые условно можно назвать «ключевыми» реквизитами данного объекта. Как правило, ключевыми реквизитами являются реквизиты объекта, влияющие на поведение других объектов, например, на проведение документов. Необдуманное изменение таких реквизитов может привести к рассогласованию данных учета.
Примером может служить реквизит Валюта справочника Кассы, который определяет валюту остатков по данной кассе, или признак Является услугой справочника Номенклатура, который влияет на проведение документов с такой номенклатурой. Такие реквизиты нельзя изменять после появления остатков по данной кассе или после появления документов с данной номенклатурой соответственно.
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ИнформацияПриЗапуске/ИнформацияПриЗапуске.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ИнформацияПриЗапуске/ИнформацияПриЗапуске.mdo
index ca479855d..bb77937c4 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ИнформацияПриЗапуске/ИнформацияПриЗапуске.mdo
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ИнформацияПриЗапуске/ИнформацияПриЗапуске.mdo
@@ -9,5 +9,6 @@
CommonModule.ИнформацияПриЗапускеCommonModule.ИнформацияПриЗапускеКлиентCommonModule.ИнформацияПриЗапускеПереопределяемый
+ InformationRegister.ПакетыИнформацииПриЗапускеSubsystem.СтандартныеПодсистемы
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КалендарныеГрафики/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КалендарныеГрафики/Help/ru.html
index 46c1d170a..e40d9d690 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КалендарныеГрафики/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КалендарныеГрафики/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Система позволяет хранить графики работы, которые используются на предприятии. В графиках работы содержится информация о рабочем времени.
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КонтактнаяИнформация/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КонтактнаяИнформация/Help/ru.html
index 98ad22536..2f58e66e1 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КонтактнаяИнформация/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/КонтактнаяИнформация/Help/ru.html
@@ -1,3 +1,3 @@
-
+
Конфигурация позволяет единообразно хранить и обрабатывать контактную информацию для различных объектов. Например, справочники Физические лица, Организации и Пользователи предоставляют одинаковую возможность по работе с адресами или телефонами.
Ведение контактной информации предполагает предварительную настройка видов контактной информации, которую рекомендуется выполнить на этапе начального заполнения информационной базы. Настройка выполняется в разделе Администрирование, по команде Виды контактной информации на панели навигации.
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/НастройкаПорядкаЭлементов/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/НастройкаПорядкаЭлементов/Help/ru.html
index a6b667c98..5b19718a7 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/НастройкаПорядкаЭлементов/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/НастройкаПорядкаЭлементов/Help/ru.html
@@ -1,9 +1,9 @@
-
+
Для ряда объектов конфигурация позволяет настраивать порядок элементов в списках. Для расстановки элементов используются кнопкиВверх и Вниз форм списка, которые размещены в командной панели формы. Для иерархических и подчиненных списков элементы перемещаются в пределах своей группы.
-
В ряде случаев кнопкиВверх и Вниз не работают. Расстановка элементов невозможна:
+
В ряде случаев кнопкиВверх и Вниз не работают. Расстановка элементов невозможна:
-
если на список наложен отбор и, таким образом, в списке отображаются не все элементы;
+
если на список наложен отбор и, таким образом, в списке отображаются не все элементы;
-
если список упорядочен не по порядку элементов, а иначе – например, по наименованию элементов списка.
-
В таких случаях при выполнении командВверх и Вниз выдается предупреждение.
\ No newline at end of file
+
если список упорядочен не по порядку элементов, а иначе – например, по наименованию элементов списка.
+
В таких случаях при выполнении командВверх и Вниз выдается предупреждение.
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ОбменДанными/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ОбменДанными/Help/ru.html
index 216907f12..d9471e5e3 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ОбменДанными/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ОбменДанными/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Программа позволяет выполнять синхронизацию данных между различными информационными базами по правилам обмена.
Правила обмена создаются при помощи конфигурации «Конвертация данных, редакция 2.1».
Синхронизация данных может быть односторонней или двухсторонней и выполняться автоматически (по заданному расписанию) или вручную по требованию пользователя. Для синхронизации данных могут быть использованы различные каналы связи: сетевой каталог, электронная почта или FTP.
Конфигурация позволяет проводить обновление конфигурации инфорационной базы в режиме 1С:Предприятия «по требованию» или в указанное время (только для клиент-серверного режима). Имеется возможность получения обновлений через Интернет, с диска 1С:ИТС или явный выбор файла обновления из локального или сетевого каталога. Для перехода к обновлению конфигурации можно воспользоваться командой Обновление конфигурации раздела Настройка и администрирование.
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Печать/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Печать/Help/ru.html
index cfac46a72..80ee82369 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Печать/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Печать/Help/ru.html
@@ -1,8 +1,8 @@
-
+
Многие документы конфигурации имеют печатные формы. Все печатные формы используют единый механизм, позволяющий редактировать макеты печатных форм, не изменяя саму конфигурацию. Печатные формы объектов могут формироваться на основе табличных макетов (MXL) или макетов офисных документов в форматах Microsoft Word и OpenOffice.org Writer.
В формах документов с возможностью вывода печатных форм в командной панели имеется команда Печать, в которой располагаются команды печати конкретных печатных форм. Аналогичные команды есть в форме списка документа. В списке можно выделить сразу несколько документов и выполнить команду печати для выбранных документов.
-
В результате выполнения команды печатные формы будут сформированы и открыты для просмотра в специальной форме Печать документов. Для вывода сформированной печатной формы на принтер можно воспользоваться командой Печать.
+
В результате выполнения команды печатные формы будут сформированы и открыты для просмотра в специальной форме Печать документов. Для вывода сформированной печатной формы на принтер можно воспользоваться командой Печать.
-
Отправить по почте - сформированные табличные документы можно отправить в качестве вложения в электронном письме.
-
Перейти к документу - можно осуществить прокрутку окна печатной формы до печатной формы выбранного документа, если он не отражается в окне печатной формы.
Настройка печатных форм выполняется в разделе Настройка и администрирование по команде Макеты печатных форм.
\ No newline at end of file
+
Отправить по почте - сформированные табличные документы можно отправить в качестве вложения в электронном письме.
+
Перейти к документу - можно осуществить прокрутку окна печатной формы до печатной формы выбранного документа, если он не отражается в окне печатной формы.
Настройка печатных форм выполняется в разделе Настройка и администрирование по команде Макеты печатных форм.
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Печать/Печать.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Печать/Печать.mdo
index 5ac18d754..ca67c75b2 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Печать/Печать.mdo
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Печать/Печать.mdo
@@ -22,7 +22,7 @@
CommonPicture.РедактироватьМакетCommonPicture.ОтменитьРедактированиеМакетаCommonPicture.ЗавершитьРедактированиеМакета
- CommonPicture.УдалитьПользовательскийМакет
+ CommonPicture.ПользовательскийМакетУдалитьCommonPicture.ИспользоватьПользовательскийМакетCommonPicture.ИспользоватьПоставляемыйМакетCommonModule.УправлениеПечатьюПереопределяемый
@@ -35,5 +35,6 @@
CommonModule.УправлениеПечатьюКлиентПовтИспCommonModule.УправлениеПечатьюСлужебныйКлиентCommonTemplate.КомпонентаПечатиQRКода
+ CommonModule.УправлениеПечатьюПовтИспSubsystem.СтандартныеПодсистемы
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПолнотекстовыйПоиск/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПолнотекстовыйПоиск/Help/ru.html
index 6bca000a8..f75d97871 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПолнотекстовыйПоиск/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПолнотекстовыйПоиск/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Конфигурация позволяет производить полнотекстовый поиск в любых объектах конфигурации, отыскивая заданную строку во всех реквизитах объектов. При наличии присоединенных файлов, содержащих текстовую информацию, поиск осуществляется также и по ним.
Полнотекстовый поиск предоставляет такие возможности как: поддержка транслитерации (написание русских слов символами латиницы в соответствии с ГОСТ); поддержка замещения (написание части символов в русских словах одноклавишными латинскими символами); нечеткий поиск (буквы в найденных словах могут отличаться).
Для включения и настройки полнотекстового поиска необходимо воспользоваться формой настройки параметров системы в разделе Настройка и администрирование.
В отдельных случаях, конфигурации требуется доступ к сети Интернет, например, для загрузки адресного классификатора с сайта поддержки пользователей 1С:Предприятия фирмы «1С». При использования прокси‑сервера для доступа в сеть Интернет, необходимо указать его настройки.
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Пользователи/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Пользователи/Help/ru.html
index ad2d9506c..4bdc83803 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Пользователи/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Пользователи/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Система позволяет администрировать пользователей и внешних пользователей, синхронизируя их со списком пользователей информационной базы (который можно увидеть в Конфигураторе). Тем самым достигается возможность работы с расширенной информацией о пользователях, а также возможонсть сослаться на пользователей из других объектов ИБ.
Важно: рекомендуется вести список пользователей ИБ, а также настраивать им права доступа только в режиме «1С:Предприятие». В режиме «Конфигуратор» допускается создавать только пользователей с полными правами – администраторов системы. При входе таких пользователей в ИБ в режиме «1С:Предприятие», в справочнике «Пользователи» будут созданы соответствующие элементы автоматически.
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПрефиксацияОбъектов/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПрефиксацияОбъектов/Help/ru.html
index 5f2b3dd43..23f24947a 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПрефиксацияОбъектов/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ПрефиксацияОбъектов/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Система позволяет автоматически назначать префиксы объектам информационной базы. Префиксы назначаются всем справочникам и документам, которые имеют автоматически назначаемый код и номер. Префиксация объектов ведется как в разрезе организаций, так и в разрезе информационных баз. Префикс ИБ назначается всем объектам, а префикс организации — только объектам ИБ, связанным с конкретной организацией.
В общем виде, номер или код объекта складывается по следующей схеме: "ОР" + "ИБ" + "-" + номер/код, где:
Конфигурация позволяет отправлять и получать сообщения электронной почты. Для настройки параметров учетных записей электронной почты можно воспользоваться командой Учетные записи электронной почты в панели навигации раздела Настройка и администрирование.
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/РаботаСФайлами/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/РаботаСФайлами/Help/ru.html
index d0998a3df..bbd3e6621 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/РаботаСФайлами/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/РаботаСФайлами/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Система предоставляет возможность хранения файлов произвольного формата. В отличие от хранения файлов на дисках, файлы хранящиеся непосредственно в системе могут быть связаны с данными информационной базы. Например, в файле прикрепленном к справочнику "Номенклатура" можно хранить подробное описание товара.
Администрирование файлов осуществляется в форме настроек параметров системы раздела Настройка и администрирование. Персональные настройки пользователя для работы с файлами находятся в форме Мои настройки этого же раздела.
Ряд действий в конфигурации выполняется по заданному расписанию с помощью регламентных заданий. Для редактирования состава и расписания регламентных заданий, запуска фоновых заданий по их выполнению, просматра истории выполнения фоновых заданий и анализа ошибок, возникающих в процессе выполнения заданий, можно воспользоваться командой Регламентные и фоновые заданияраздела Настройка и администрирование.
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Свойства/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Свойства/Help/ru.html
index b6dd94e6e..2fda8f23e 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Свойства/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Свойства/Help/ru.html
@@ -1,3 +1,3 @@
-
+
Конфигурация позволяет создавать и редактировать в режиме «1С:Предприятие» дополнительные свойства произвольных документов и справочников. Имеется возможность назначать наборы дополнительных свойств как в целом для всех элементов справочника, так и для части его элементов по определенным критериям.
Администрирование наборов дополнительных свойств осуществляется по команде Наборы дополнительных реквизитов и сведений на панели навигации в разделе Настройка и администрирование.
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/УправлениеДоступом/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/УправлениеДоступом/Help/ru.html
index 0befd86d2..18fdda89c 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/УправлениеДоступом/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/УправлениеДоступом/Help/ru.html
@@ -1,2 +1,2 @@
-
+
Конфигурация позволяет настраивать права доступа к отдельным объектам информационной базы для пользователей и групп пользователей. Для этих целей предназначена команда Группы доступа в панели навигации раздела Настройка и администрирование.
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/УправлениеИтогамиИАгрегатами/Help/ru.html b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/УправлениеИтогамиИАгрегатами/Help/ru.html
index 8605455aa..0948cb2c5 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/УправлениеИтогамиИАгрегатами/Help/ru.html
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/УправлениеИтогамиИАгрегатами/Help/ru.html
@@ -1,2 +1,2 @@
-
+
Конфигурация предоставляет средства для администрирования итогов и агрегатов регистров информационной базы. Для этих целей следует воспользоваться командой Управление итогами и агрегатамираздела Настройка и администрирование.
\ No newline at end of file
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЭлектроннаяПодпись/ЭлектроннаяПодпись.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЭлектроннаяПодпись/ЭлектроннаяПодпись.mdo
index a1b3d271e..8eb1a2104 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЭлектроннаяПодпись/ЭлектроннаяПодпись.mdo
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ЭлектроннаяПодпись/ЭлектроннаяПодпись.mdo
@@ -45,6 +45,5 @@
Catalog.СертификатыКлючейЭлектроннойПодписиИШифрованияEnum.СостоянияЗаявленияНаВыпускСертификатаCommonPicture.ЗаявлениеНаВыпускСертификатаКлюча
- CommonPicture.ПустоеСостояниеSubsystem.СтандартныеПодсистемы
diff --git a/SSL/src/Subsystems/СтандартныеПодсистемы/СтандартныеПодсистемы.mdo b/SSL/src/Subsystems/СтандартныеПодсистемы/СтандартныеПодсистемы.mdo
index 970e3d47b..04a2c2d9e 100644
--- a/SSL/src/Subsystems/СтандартныеПодсистемы/СтандартныеПодсистемы.mdo
+++ b/SSL/src/Subsystems/СтандартныеПодсистемы/СтандартныеПодсистемы.mdo
@@ -46,6 +46,7 @@
ПрисоединенныеФайлыПроверкаЛегальностиПолученияОбновленияРаботаВМоделиСервиса
+ РаботаСКонтрагентамиРаботаСПочтовымиСообщениямиРаботаСФайламиРассылкаОтчетов
diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/Дополнительно/Help/ru.html b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/Дополнительно/Help/ru.html
index 01db21353..ddb18045c 100644
--- a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/Дополнительно/Help/ru.html
+++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/Дополнительно/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначена для просмотра основных сведений о задаче (редактирование недоступно).
Открывается из окна задачи по команде Еще- Дополнительно.
Открывается из бизнес-процесса (например, Задания) по команде Задачи панели навигации.
Красным цветом обозначаются просроченные задачи. Выполненные задачи становятся неактивными, выделяются серым цветом. Список задач нестартовавшего бизнес-процесса пустой.
Список Мои задачи является рабочим местом исполнителя задач. Находится на рабочем столе программы. В списке находятся задачи к выполнению, адресованные текущему пользователю программы.
Непринятые к исполнению задачи выделяются в списке жирным шрифтом. Просроченные задачи выделяются красным цветом.
Задача или группа задач может быть перенаправлена другому исполнителю с использованием персональной или ролевой адресации.
Выберите с помощью переключателя:
Исполнителю - при персональной адресации исполнитель указывается явно из списка пользователей программы.
diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаЗадачи/Help/ru.html b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаЗадачи/Help/ru.html
index dfa50b88f..2d2f7d34f 100644
--- a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаЗадачи/Help/ru.html
+++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаЗадачи/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Сведения о задаче.
Дата начала выполнения
В поле Дата начала проставьте дату и время начала выполнения задачи.
diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Form.form b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Form.form
index 658e42749..2aaf899f4 100644
--- a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Form.form
+++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Form.form
@@ -2268,8 +2268,8 @@
ИЗ
Задача.ЗадачаИсполнителя КАК ЗадачаЗадачаИсполнителя
ГДЕ
- (&Исполнитель ЕСТЬ NULL
- ИЛИ ЗадачаЗадачаИсполнителя.Исполнитель = &Исполнитель
+ (&ВыбранныйИсполнитель ЕСТЬ NULL
+ ИЛИ ЗадачаЗадачаИсполнителя.Исполнитель = &ВыбранныйИсполнитель
ИЛИ ИСТИНА В
(ВЫБРАТЬ
ИСТИНА
@@ -2279,7 +2279,7 @@
ЗадачаЗадачаИсполнителя.РольИсполнителя = ИсполнителиЗадач.РольИсполнителя
И ЗадачаЗадачаИсполнителя.ОсновнойОбъектАдресации = ИсполнителиЗадач.ОсновнойОбъектАдресации
И ЗадачаЗадачаИсполнителя.ДополнительныйОбъектАдресации = ИсполнителиЗадач.ДополнительныйОбъектАдресации
- И ИсполнителиЗадач.Исполнитель = &Исполнитель))
+ И ИсполнителиЗадач.Исполнитель = &ВыбранныйИсполнитель))
Task.ЗадачаИсполнителяtruetrue
diff --git a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Help/ru.html b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Help/ru.html
index 315a5e1c9..e2d411453 100644
--- a/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Help/ru.html
+++ b/SSL/src/Tasks/ЗадачаИсполнителя/Forms/ФормаСписка/Help/ru.html
@@ -1,4 +1,4 @@
-
+
Предназначен для работы с задачами. В списке находятся все задачи.
Открывается по команде Все задачи в разделе Бизнес-процессы и задачи.
Непринятые к исполнению задачи выделяются жирным шрифтом. Красным цветом выделяются просроченные задачи.