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