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