#Область ОписаниеПеременных
&НаКлиенте
Перем КонтекстЭДОКлиент;
&НаКлиенте
Перем РежимПроверки;
&НаКлиенте
Перем ЗакрытиеФормы;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Организация = Параметры.Организация;
УчетнаяЗапись = Параметры.УчетнаяЗапись;
Логин = Параметры.Логин;
ЛогинПараметр = Параметры.Логин;
СерверОблачнойПодписи = Параметры.СерверОблачнойПодписи;
ПервичноеЗаявление = Параметры.ПервичноеЗаявление;
ТолькоПросмотр = Параметры.ТолькоПросмотр;
ИНН = Параметры.ИНН;
ИнициализацияДанныхФормы();
ЗаполнитьСписокУчетныхЗаписей();
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
РежимПроверки = Ложь;
ЗакрытиеФормы = Ложь;
ОписаниеОповещения = Новый ОписаниеОповещения("ПриОткрытии_ПослеПолученияКонтекста", ЭтотОбъект);
ДокументооборотСКОКлиент.ПолучитьКонтекстЭДО(ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если НЕ ЗакрытиеФормы Тогда
Отказ = Истина;
ЗакрытьФорму();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
Если ВариантДействия = 0 Тогда
ПроверяемыеРеквизиты.Добавить("Логин");
ПроверяемыеРеквизиты.Добавить("СерверОблачнойПодписи");
Если ПроверкаСодержимогоЛогина(Логин) Тогда
ОбщегоНазначения.СообщитьПользователю(
НСтр("ru = 'Логин содержит недопустимые символы.
|Разрешенные символы A-Z, 0-9, ""_"", ""@"", ""."".'"),
, "Логин", , Отказ);
КонецЕсли;
Иначе
ПроверяемыеРеквизиты.Добавить("УчетнаяЗапись");
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура ВариантДействияПриИзменении(Элемент)
УстановитьДоступностьЭлементов();
КонецПроцедуры
&НаКлиенте
Процедура ВариантДействияСоздатьПриИзменении(Элемент)
УстановитьДоступностьЭлементов();
КонецПроцедуры
&НаКлиенте
Процедура УчетнаяЗаписьСоздание(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ВосстановитьУчетнуюЗапись();
КонецПроцедуры
&НаКлиенте
Процедура УчетнаяЗаписьОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ПроверкаВыбораУчетнойЗаписи(ВыбранноеЗначение) Тогда
ВыборУчетнойЗаписи(ВыбранноеЗначение);
Иначе
ЗадатьВопросОбОграниченииВыбораУчетнойЗаписи(ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УчетнаяЗаписьНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ОповещениеСледующее = Новый ОписаниеОповещения("УчетнаяЗаписьПослеВыбора", ЭтотОбъект);
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("ТекущаяЗапись", УчетнаяЗапись);
ПараметрыОтбора = Новый Структура();
ПараметрыОтбора.Вставить("ПоставляемыйСервер", Истина);
Если ЗначениеЗаполнено(ИНН) Тогда
ПараметрыФормы.Вставить("ПредставлениеОтбора", НСтр("ru = 'Отобрать по'") + " " + ИНН);
ПараметрыОтбора.Вставить("Наименование", ИНН);
КонецЕсли;
КонтекстЭДОКлиент.ВыбратьУчетнуюЗаписьОблачнойПодписи(ОповещениеСледующее, ЭтотОбъект, ПараметрыФормы, ПараметрыОтбора);
КонецПроцедуры
&НаКлиенте
Процедура УчетнаяЗаписьОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент");
МодульСервисКриптографииDSSКлиент.ОткрытьСведенияУчетнойЗаписи(Неопределено, УчетнаяЗапись);
КонецПроцедуры
&НаКлиенте
Процедура СерверОблачнойПодписиОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура ОК(Команда)
ПодборУчетнойЗаписи();
КонецПроцедуры
&НаКлиенте
Процедура Восстановить(Команда)
ВосстановитьУчетнуюЗапись();
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
Процедура ПодборУчетнойЗаписи()
РезультатВыбора = ПодготовитьРезультат();
Если НЕ ПроверитьЗаполнение() Тогда
Возврат;
КонецЕсли;
Если ВариантДействия = 0 Тогда
ПроверитьУникальностьЛогина();
Иначе
ЗакрытьФорму(РезультатВыбора);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УчетнаяЗаписьПослеВыбора(РезультатВыбора, ДополнительныеПараметры) Экспорт
Если РезультатВыбора.Выполнено Тогда
ВыбранноеЗначение = РезультатВыбора.Результат;
Если ПроверкаВыбораУчетнойЗаписи(ВыбранноеЗначение) Тогда
ВыборУчетнойЗаписи(ВыбранноеЗначение);
Иначе
ЗадатьВопросОбОграниченииВыбораУчетнойЗаписи(ВыбранноеЗначение);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗакрытьФорму(РезультатВыбора = Неопределено)
ЗакрытиеФормы = Истина;
Если РезультатВыбора = Неопределено Тогда
ОписаниеОповещенияОЗакрытии = Неопределено;
КонецЕсли;
Закрыть(РезультатВыбора);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии_ПослеПолученияКонтекста(Результат, ДополнительныеПараметры) Экспорт
КонтекстЭДОКлиент = Результат.КонтекстЭДО;
УстановитьДоступностьЭлементов();
КонецПроцедуры
&НаКлиенте
Функция ПодготовитьРезультат()
Результат = Новый Структура();
Результат.Вставить("УчетнаяЗаписьОблачнойПодписи", УчетнаяЗапись);
Результат.Вставить("СерверОблачнойПодписи", СерверОблачнойПодписи);
Результат.Вставить("Логин", Логин);
Если ВариантДействия = 1 Тогда
Результат.Вставить("Логин", "");
Результат.Вставить("СерверОблачнойПодписи", "");
Иначе
Результат.Вставить("УчетнаяЗаписьОблачнойПодписи", Неопределено);
КонецЕсли;
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ПроверитьУникальностьЛогина()
РежимПроверки = Истина;
УстановитьДоступностьЭлементов();
ОповещениеСледущее = Новый ОписаниеОповещения("ПроверитьУникальностьЛогинаЗавершение", ЭтотОбъект);
КонтекстЭДОКлиент.ПроверитьУникальностьЛогинаОблачнойПодписи(ОповещениеСледущее, СерверОблачнойПодписи, Логин);
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьУникальностьЛогинаЗавершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
Если РезультатВыполнения.Статус = "Найден" Тогда
МассивВариантов = СтрРазделить(РезультатВыполнения.Варианты, ",", Ложь);
СписокВыбора = Элементы.Логин.СписокВыбора;
СписокВыбора.Очистить();
Для Каждого СтрокаМассива Из МассивВариантов Цикл
СписокВыбора.Добавить(СокрЛП(СтрокаМассива));
КонецЦикла;
Если ЛогинПараметр = Логин Тогда
ЛогинПараметр = "";
КонецЕсли;
Если ЗначениеЗаполнено(ЛогинПараметр)
И СписокВыбора.НайтиПоЗначению(ЛогинПараметр) = Неопределено Тогда
СписокВыбора.Добавить(СокрЛП(ЛогинПараметр));
КонецЕсли;
КонецЕсли;
РежимПроверки = Ложь;
УстановитьДоступностьЭлементов();
Если РезультатВыполнения.Статус = "Неопределено" Тогда
ЗадатьВопросПользователю();
ИначеЕсли РезультатВыполнения.Статус = "Дублирование" Тогда
ПоказатьСообщениеОДублированииПользователю();
ИначеЕсли РезультатВыполнения.Статус = "Успех" Тогда
ЗакрытьФорму(ПодготовитьРезультат());
Иначе
ПоказатьСообщениеПользователю();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗадатьВопросПользователю()
ТекстВопроса = НСтр("ru = 'Не удалось проверить уникальность логина. Оставить текущий вариант?'");
ОповещениеСледующее = Новый ОписаниеОповещения("ЗадатьВопросПользователюЗавершение", ЭтотОбъект);
ПоказатьВопрос(ОповещениеСледующее, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 30);
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьСообщениеПользователю()
ТекстСообщения = НСтр("ru = 'Выбранный логин уже существует. Выберите другой вариант логина.'");
ОповещениеСледующее = Новый ОписаниеОповещения("ПоказатьСообщениеПользователюЗавершение", ЭтотОбъект);
ПоказатьПредупреждение(ОповещениеСледующее, ТекстСообщения, 30);
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьСообщениеОДублированииПользователю()
ТекстСообщения = НСтр("ru = 'Выбранный логин зарегистрирован в справочнике учетных записей DSS.
|Переключитесь в режим ""Использовать существующую учетную запись"" и выберите нужную учетную запись.'");
ОповещениеСледующее = Новый ОписаниеОповещения("ПоказатьСообщениеПользователюЗавершение", ЭтотОбъект);
ПоказатьПредупреждение(ОповещениеСледующее, ТекстСообщения, 30);
КонецПроцедуры
&НаКлиенте
Процедура ЗадатьВопросПользователюЗавершение(РезультатВыбора, ДополнительныеПараметры) Экспорт
Если РезультатВыбора <> Неопределено И РезультатВыбора = КодВозвратаДиалога.Да Тогда
ЗакрытьФорму(ПодготовитьРезультат());
Иначе
ТекущийЭлемент = Элементы.Логин;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьСообщениеПользователюЗавершение(ДополнительныеПараметры) Экспорт
ТекущийЭлемент = Элементы.Логин;
КонецПроцедуры
&НаКлиенте
Процедура ЗадатьВопросОбОграниченииВыбораУчетнойЗаписи(ТекущаяСсылка)
ТекстСообщения = НСтр("ru = 'Выбранная учетная запись не обнаружена на сервере облачной подписи, связанный с 1С-Отчетностью.
|Продолжить?'");
ОповещениеСледующее = Новый ОписаниеОповещения("ЗадатьВопросОбОграниченииВыбораУчетнойЗаписиЗавершение", ЭтотОбъект, ТекущаяСсылка);
ПоказатьВопрос(ОповещениеСледующее, ТекстСообщения, РежимДиалогаВопрос.ДаНет, 30);
КонецПроцедуры
&НаКлиенте
Процедура ЗадатьВопросОбОграниченииВыбораУчетнойЗаписиЗавершение(РезультатВыбора, ДополнительныеПараметры) Экспорт
Если РезультатВыбора <> Неопределено И РезультатВыбора = КодВозвратаДиалога.Да Тогда
ВыборУчетнойЗаписи(ДополнительныеПараметры);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьДоступностьЭлементов()
Редактировать = НЕ ТолькоПросмотр;
Элементы.ВариантДействияСоздать.Доступность = ТаблицаСервисов.Количество() > 0 И НЕ РежимПроверки И Редактировать;
Элементы.ВариантДействияВыбрать.Доступность = НЕ РежимПроверки И Редактировать;
Элементы.ГруппаСоздать.Доступность = ВариантДействия = 0 И ТаблицаСервисов.Количество() > 0 И НЕ РежимПроверки И Редактировать;
Элементы.ГруппаВыбрать.Доступность = ВариантДействия = 1 И НЕ РежимПроверки И Редактировать;
Элементы.ОК.Доступность = НЕ РежимПроверки И Редактировать;
Элементы.Логин.КнопкаВыпадающегоСписка = Элементы.Логин.СписокВыбора.Количество() > 0;
КонецПроцедуры
&НаКлиенте
Процедура ВосстановитьУчетнуюЗапись()
СписокСерверов = Новый Массив;
Для Каждого СтрокаТаблицы Из ТаблицаСервисов Цикл
НоваяСтрока = Новый Структура;
НоваяСтрока.Вставить("ВнутреннийИдентификатор", СтрокаТаблицы.ВнутреннийИдентификатор);
НоваяСтрока.Вставить("Представление", СтрокаТаблицы.Представление);
НоваяСтрока.Вставить("ДанныеСервиса", СтрокаТаблицы.ДанныеСервиса);
НоваяСтрока.Вставить("Ссылка", СтрокаТаблицы.Ссылка);
СписокСерверов.Добавить(НоваяСтрока);
КонецЦикла;
ОповещениеСледующее = Новый ОписаниеОповещения("ПослеСозданияУчетнойЗаписи", ЭтотОбъект);
КонтекстЭДОКлиент.ОткрытьВосстановлениеОблачнойПодписи(ОповещениеСледующее, СписокСерверов, Логин, , ПервичноеЗаявление);
КонецПроцедуры
&НаКлиенте
Процедура ПослеСозданияУчетнойЗаписи(РезультатВыбора, ДополнительныеПараметры) Экспорт
Если ЗначениеЗаполнено(РезультатВыбора) Тогда
УчетнаяЗапись = РезультатВыбора;
УчетнаяЗаписьПредставление = ЛогинУчетнойЗаписи(УчетнаяЗапись);
ЗаполнитьСписокУчетныхЗаписей();
ПодборУчетнойЗаписи();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыборУчетнойЗаписи(ТекущаяСсылка)
УчетнаяЗапись = ТекущаяСсылка;
УчетнаяЗаписьПредставление = ЛогинУчетнойЗаписи(УчетнаяЗапись);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьСписокУчетныхЗаписей()
МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS");
ВесьСписок = МодульСервисКриптографииDSS.ПолучитьВсеУчетныеЗаписи();
СписокВыбора = Элементы.УчетнаяЗапись.СписокВыбора;
СписокВыбора.Очистить();
Для Счетчик = 1 По Мин(ВесьСписок.Количество(), 10) Цикл
СтрокаТаблицы = ВесьСписок[Счетчик - 1];
СписокВыбора.Добавить(СтрокаТаблицы.Ссылка, СтрокаТаблицы.Логин);
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция НайтиСерверОблачнойПодписи(ИдентификаторСервиса, Описание = "Идентификатор")
Результат = Неопределено;
НашлиСтроки = ТаблицаСервисов.НайтиСтроки(Новый Структура("ВнутреннийИдентификатор", ИдентификаторСервиса));
Если НашлиСтроки.Количество() <> 0 Тогда
Если Описание = "Идентификатор" Тогда
Результат = ?(ЗначениеЗаполнено(НашлиСтроки[0].Ссылка), НашлиСтроки[0].Ссылка, ИдентификаторСервиса);
ИначеЕсли Описание = "Адрес" Тогда
Если ЗначениеЗаполнено(НашлиСтроки[0].Ссылка) Тогда
Результат = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(НашлиСтроки[0].Ссылка, "АдресСервера");
Иначе
Результат = НашлиСтроки[0].ДанныеСервиса.АдресСервера;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервере
Процедура ИнициализацияДанныхФормы()
СписокВыбора = Элементы.СерверОблачнойПодписи.СписокВыбора;
СписокВыбора.Очистить();
Для Каждого СтрокаМассива Из Параметры.СписокСерверов Цикл
НоваяСтрока = ТаблицаСервисов.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаМассива);
СписокВыбора.Добавить(НоваяСтрока.ВнутреннийИдентификатор, НоваяСтрока.Представление);
КонецЦикла;
Если НайтиСерверОблачнойПодписи(СерверОблачнойПодписи) = Неопределено Тогда
СерверОблачнойПодписи = "";
КонецЕсли;
Если ТаблицаСервисов.Количество() = 1 И ПустаяСтрока(СерверОблачнойПодписи) Тогда
СерверОблачнойПодписи = ТаблицаСервисов[0].ВнутреннийИдентификатор;
КонецЕсли;
Если ЗначениеЗаполнено(ЛогинПараметр) Тогда
Элементы.Логин.СписокВыбора.Добавить(ЛогинПараметр);
КонецЕсли;
Если ЗначениеЗаполнено(УчетнаяЗапись) ИЛИ ТаблицаСервисов.Количество() = 0 Тогда
ВариантДействия = 1;
Иначе
ВариантДействия = 0;
КонецЕсли;
Если ПервичноеЗаявление Тогда
Элементы.ГруппаКоманды.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Лево;
КонецЕсли;
Элементы.ГруппаСоздатьСлужебная2.Видимость = ТаблицаСервисов.Количество() <> 1;
УчетнаяЗаписьПредставление = ЛогинУчетнойЗаписи(УчетнаяЗапись);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЛогинУчетнойЗаписи(ТекущаяСсылка)
Результат = "";
Если ЗначениеЗаполнено(ТекущаяСсылка) Тогда
Результат = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущаяСсылка, "Логин", Истина);
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервереБезКонтекста
Функция ПроверкаСодержимогоЛогина(Знач ТекущийЛогин)
Результат = Ложь;
ТекущийЛогин = ВРег(ТекущийЛогин);
РазрешенныеСимволы = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_@-.";
ВсегоСимволов = СтрДлина(ТекущийЛогин);
Для Счетчик = 1 По ВсегоСимволов Цикл
Если СтрНайти(РазрешенныеСимволы, Сред(ТекущийЛогин, Счетчик, 1)) = 0 Тогда
Результат = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Результат;
конецФункции
&НаСервере
Функция ПроверкаВыбораУчетнойЗаписи(ТекущаяСсылка)
Результат = Ложь;
МодульСервисКриптографииDSS = ОбщегоНазначения.ОбщийМодуль("СервисКриптографииDSS");
ДанныеУчетнойЗаписи = МодульСервисКриптографииDSS.ПолучитьВсеУчетныеЗаписи(ТекущаяСсылка);
Если ДанныеУчетнойЗаписи.Количество() = 1 Тогда
НашлиСервер = НайтиСерверОблачнойПодписи(ДанныеУчетнойЗаписи[0].ВнутреннийИдентификатор);
Результат = ЗначениеЗаполнено(НашлиСервер);
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти