Перем мГоловнаяОрганизация; // Хранит ссылку на головную организацию
Перем ФормаИндикатора;
Перем мРуководителю; // Хранит количество расчетных листков, подготовленных для рассылки руководителю
Перем мСотруднику; // Хранит количество расчетных листков, подготовленных для рассылки сотруднику
Перем мКонфигурация; // Хранит краткое имя конфигурации
Перем мКолЗаписей;
///////////////////////////////////////////////////////////////////////////////
// ОБЩЕГО НАЗНАЧЕНИЯ //
///////////////////////////////////////////////////////////////////////////////
Перем мТабЕмейла,мСписок;
Процедура ДобавитьСотрудниковПодразделения(вхПодразделение)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СотрудникиОрганизаций.Ссылка КАК Сотрудник,
| СотрудникиОрганизаций.Физлицо.СтраховойНомерПФР КАК СотрудникПФР,
| СотрудникиОрганизаций.ТекущееПодразделениеОрганизации КАК Подразделение,
| ЕСТЬNULL(ОтветственныеЛицаОрганизацийСрезПоследних.ФизическоеЛицо.СтраховойНомерПФР, """") КАК РуководительПФР,
| ЕСТЬNULL(ОтветственныеЛицаОрганизацийСрезПоследних.ФизическоеЛицо, """") КАК Руководитель
|ИЗ
| Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОтветственныеЛицаОрганизаций.СрезПоследних(КОНЕЦПЕРИОДА(&Период, МЕСЯЦ), ОтветственноеЛицо = ЗНАЧЕНИЕ(Перечисление.ОтветственныеЛицаОрганизаций.Руководитель)) КАК ОтветственныеЛицаОрганизацийСрезПоследних
| ПО СотрудникиОрганизаций.ТекущееПодразделениеОрганизации = ОтветственныеЛицаОрганизацийСрезПоследних.СтруктурнаяЕдиница
|ГДЕ
| СотрудникиОрганизаций.ПометкаУдаления = ЛОЖЬ
| И СотрудникиОрганизаций.ТекущееПодразделениеОрганизации В(&ТекущееПодразделениеОрганизации)
| И СотрудникиОрганизаций.Актуальность = ИСТИНА
| И НАЧАЛОПЕРИОДА(СотрудникиОрганизаций.ДатаПриемаНаРаботу, МЕСЯЦ) <= НАЧАЛОПЕРИОДА(&Период, МЕСЯЦ)
| И (КОНЕЦПЕРИОДА(СотрудникиОрганизаций.ДатаУвольнения, МЕСЯЦ) >= КОНЕЦПЕРИОДА(&Период, МЕСЯЦ)
| ИЛИ СотрудникиОрганизаций.ДатаУвольнения = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0))
|
|УПОРЯДОЧИТЬ ПО
| СотрудникиОрганизаций.Наименование";
Запрос.УстановитьПараметр("Период", ПериодРегистрации);
Запрос.УстановитьПараметр("ТекущееПодразделениеОрганизации", вхПодразделение);
Результат = Запрос.Выполнить();
ПоискВADЕмайла(Результат);
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
СтрокаСпискаРассылки = СписокРассылки.Добавить();
СтрокаСпискаРассылки.Сотрудник = ВыборкаДетальныеЗаписи.Сотрудник;
СтрокаСпискаРассылки.Подразделение = ВыборкаДетальныеЗаписи.Подразделение;
СтрокаСпискаРассылки.Руководитель = ВыборкаДетальныеЗаписи.Руководитель;
Состояние("Обработанно "+ СписокРассылки.Количество() + " из "+ мКолЗаписей + " записей");
ТекЕмаилСотрудника = ПолучитьЕмаилФизлицаИзAD(ВыборкаДетальныеЗаписи.Сотрудник.Физлицо);
ТекЕмаилРуководителя = ПолучитьЕмаилФизлицаИзAD(ВыборкаДетальныеЗаписи.Руководитель);
Если ТекЕмаилСотрудника <> Неопределено Тогда
СтрокаСпискаРассылки.ЕмаилСотрудника = ТекЕмаилСотрудника;
СтрокаСпискаРассылки.ЕстьЕмаилСотрудника = Истина;
Если ВыборкаДетальныеЗаписи.Сотрудник.Физлицо = ВыборкаДетальныеЗаписи.Руководитель Тогда
СтрокаСпискаРассылки.ОтправитьСотруднику = Ложь;
Иначе
СтрокаСпискаРассылки.ОтправитьСотруднику = Истина;
КонецЕсли;
Иначе
СтрокаСпискаРассылки.ЕстьЕмаилСотрудника = Ложь;
СтрокаСпискаРассылки.ОтправитьСотруднику = Ложь;
КонецЕсли;
Если ТекЕмаилРуководителя <> Неопределено Тогда
СтрокаСпискаРассылки.ЕмаилРуководителя = ТекЕмаилРуководителя;
СтрокаСпискаРассылки.ЕстьЕмаилРуководителя = Истина;
СтрокаСпискаРассылки.ОтправитьРуководителю = Истина;
Иначе
СтрокаСпискаРассылки.ЕстьЕмаилРуководителя = Ложь;
СтрокаСпискаРассылки.ОтправитьРуководителю = Ложь;
КонецЕсли;
Если СтрокаСпискаРассылки.ОтправитьРуководителю Тогда
мРуководителю = мРуководителю + 1;
КонецЕсли;
Если СтрокаСпискаРассылки.ОтправитьСотруднику Тогда
мСотруднику = мСотруднику + 1;
КонецЕсли;
КонецЦикла;
КоманднаяПанельСпискаРассылкиСнятьФлажкиСотрудник(Истина);
ОбработатьСотрудниковБезДанныхВAD();
КонецПроцедуры // ДобавитьСотрудниковПодразделения()
Процедура ОбработатьСотрудниковБезДанныхВAD()
Состояние("Поиск электронной почты в справочники Контактная информация");
мТаб = ПолучитьЕмаилФизлица(СписокРассылки.ВыгрузитьКолонку("Сотрудник"));
Для Каждого Строки из СписокРассылки Цикл
Если Строки.ЕстьЕмаилСотрудника = Ложь Тогда
мОтбор = мТаб.НайтиСтроки(Новый Структура("Объект",Строки.Сотрудник.Физлицо));
Если мОтбор.Количество() > 0 Тогда
Строки.ЕмаилСотрудника = мОтбор[0].Представление;
Строки.ЕстьЕмаилСотрудника = Истина;
Строки.ОтправитьСотруднику = НЕ ЕмаилТолькоРуководителям;
КонецЕсли;
КонецЕсли;
КонецЦикла;
мТаб = ПолучитьЕмаилФизлица(СписокРассылки.ВыгрузитьКолонку("Руководитель"));
Для Каждого Строки из СписокРассылки Цикл
Если Строки.ЕстьЕмаилРуководителя = Ложь Тогда
мОтбор = мТаб.НайтиСтроки(Новый Структура("Объект",Строки.Руководитель));
Если мОтбор.Количество() > 0 Тогда
Строки.ЕмаилРуководителя = мОтбор[0].Представление;
Строки.ЕстьЕмаилРуководителя = Истина;
Строки.ОтправитьРуководителю = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Состояние("");
КонецПроцедуры
Процедура ОбойтиУровеньДерева(Строки, ВидОбхода)
Для каждого Строка из Строки Цикл
Если ВидОбхода = "ДобавитьСотрудниковПодразделения" Тогда
Если Строка.ФлагВыбора Тогда
мСписок.Добавить(Строка.Подразделение);
КонецЕсли;
ИначеЕсли ВидОбхода = "УстановитьФлажки" Тогда
Строка.ФлагВыбора = Истина;
ИначеЕсли ВидОбхода = "СнятьФлажки" Тогда
Строка.ФлагВыбора = Ложь;
ИначеЕсли ВидОбхода = "ИнвертироватьФлажки" Тогда
Если Строка.ФлагВыбора Тогда
Строка.ФлагВыбора = Ложь;
Иначе
Строка.ФлагВыбора = Истина;
КонецЕсли;
ИначеЕсли ВидОбхода = "СвернутьВсе" Тогда
ЭлементыФормы.Подразделения.Свернуть(Строка);
ИначеЕсли ВидОбхода = "РазвернутьВсе" Тогда
ЭлементыФормы.Подразделения.Развернуть(Строка, Истина);
КонецЕсли;
ОбойтиУровеньДерева(Строка.Строки, ВидОбхода);
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьДеревоПодразделений()
Запрос = Новый Запрос;
Если мКонфигурация = "ЗарплатаИУправлениеПерсоналомКОРП" Тогда
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ПодразделенияОрганизаций.Ссылка КАК Подразделение,
| ЛОЖЬ КАК ФлагВыбора
|ИЗ
| Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
|ГДЕ
| ПодразделенияОрганизаций.Владелец = &Владелец
| И ПодразделенияОрганизаций.ПометкаУдаления = ЛОЖЬ
| И ПодразделенияОрганизаций.Актуальность = ИСТИНА
|
|УПОРЯДОЧИТЬ ПО
| ПодразделенияОрганизаций.Наименование ИЕРАРХИЯ";
Иначе
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ПодразделенияОрганизаций.Ссылка КАК Подразделение,
| ЛОЖЬ КАК ФлагВыбора
|ИЗ
| Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
|ГДЕ
| ПодразделенияОрганизаций.Владелец = &Владелец
| И ПодразделенияОрганизаций.ПометкаУдаления = ЛОЖЬ
|
|УПОРЯДОЧИТЬ ПО
| ПодразделенияОрганизаций.Наименование ИЕРАРХИЯ";
КонецЕсли;
Запрос.УстановитьПараметр("Владелец", Организация);
Подразделения = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
ЭлементыФормы.Подразделения.СоздатьКолонки();
ЭлементыФормы.Подразделения.Колонки.ФлагВыбора.Видимость = ЛОЖЬ;
ЭлементыФормы.Подразделения.Колонки.Подразделение.ДанныеФлажка = "ФлагВыбора";
ЭлементыФормы.Подразделения.Колонки.Подразделение.РежимРедактирования = РежимРедактированияКолонки.Непосредственно;
КонецПроцедуры // ЗаполнитьДеревоПодразделений()
Процедура ЗаполнитьТаблицуРассылки()
СписокРассылки.Очистить();
мРуководителю = 0;
мСотруднику = 0;
ОбойтиУровеньДерева(Подразделения.Строки, "ДобавитьСотрудниковПодразделения");
Если НЕ мСписок.Количество() = 0 Тогда
ДобавитьСотрудниковПодразделения(мСписок);
мСписок.Очистить();
КонецЕсли;
СписокРассылки.Сортировать("Подразделение,Сотрудник");
КонецПроцедуры // ЗаполнитьТаблицуРассылки()
Функция ПолучитьЕмаилФизлица(вхФизлицо)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| СотрудникиОрганизаций.Физлицо
|ПОМЕСТИТЬ мТабФизЛиц
|ИЗ
| Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
|ГДЕ
| (СотрудникиОрганизаций.Ссылка В (&Объект)
| ИЛИ СотрудникиОрганизаций.Физлицо В (&Объект))
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| КонтактнаяИнформация.Представление,
| ВЫБОР
| КОГДА КонтактнаяИнформация.ЗначениеПоУмолчанию
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ КАК Приоритет,
| КонтактнаяИнформация.Объект
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ мТабФизЛиц КАК мТабФизЛиц
| ПО КонтактнаяИнформация.Объект = мТабФизЛиц.Физлицо
|ГДЕ
| КонтактнаяИнформация.Тип = &Тип
|
|УПОРЯДОЧИТЬ ПО
| Приоритет УБЫВ";
Запрос.УстановитьПараметр("Объект", вхФизлицо);
Запрос.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
Результат = Запрос.Выполнить().Выгрузить();
Возврат Результат;
КонецФункции // ПолучитьЕмаилФизлица()
Функция ПолучитьЕмаилФизлицаИзAD(вхФизлицо)
Если НЕ ЗначениеЗаполнено(вхФизлицо) Тогда
Возврат Неопределено
КонецЕсли;
Если мТабЕмейла.Количество() = 0 Тогда
Возврат Неопределено
КонецЕсли;
мРез = мТабЕмейла.НайтиСтроки(Новый Структура("ПФР",вхФизлицо.СтраховойНомерПФР));
ЕСли мРез.Количество() = 0 Тогда
Возврат Неопределено
ИначеЕсли мРез.Количество() = 1 Тогда
Возврат мРез.Получить(0).Почта;
ИначеЕсли мРез.Количество() > 1 Тогда
Возврат мРез.Получить(0).Почта;
КонецЕсли;
КонецФункции // ПолучитьЕмаилФизлица()
Процедура ПоискВADЕмайла(Результат)
Состояние("Поиск электронной почты в AD");
мТабЕмейла.Очистить();
мТабЕмейла = Результат.Выгрузить().ВыгрузитьКолонку("СотрудникПФР");
мКолЗаписей = мТабЕмейла.Количество();
Для Каждого Строки из Результат.Выгрузить().ВыгрузитьКолонку("РуководительПФР") Цикл
мТабЕмейла.Добавить(Строки);
КонецЦикла;
мТабЕмейла = ИТОбщийМодуль.ПоискПочтыПОЮзерувАД(мТабЕмейла);
мТабЕмейла.Свернуть("ПФР, Почта");
Состояние("");
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////
// ФОРМА //
///////////////////////////////////////////////////////////////////////////////
Процедура ОрганизацияПриИзменении(Элемент)
ЗаполнениеДокументов.ПриИзмененииЗначенияОрганизации(ЭтотОбъект);
мГоловнаяОрганизация = ОбщегоНазначенияЗК.ГоловнаяОрганизация(Организация);
ЗаполнитьДеревоПодразделений();
КонецПроцедуры
Процедура ПериодРегистрацииРегулирование(Элемент, Направление, СтандартнаяОбработка)
ПериодРегистрации = ДобавитьМесяц(ПериодРегистрации, Направление);
Элемент.Значение = РаботаСДиалогами.ДатаКакМесяцПредставление(ПериодРегистрации);
ЗаполнитьТаблицуРассылки();
КонецПроцедуры
Процедура ПериодРегистрацииНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
РаботаСДиалогами.НачалоВыбораИзСпискаПредставленияПериодаРегистрации(Элемент, СтандартнаяОбработка, ПериодРегистрации, ЭтаФорма);
ЗаполнитьТаблицуРассылки();
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////
// ДЕРЕВО ЗНАЧЕНИЙ "ПОДРАЗДЕЛЕНИЯ" //
///////////////////////////////////////////////////////////////////////////////
Процедура ПодразделенияПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
ЗаполнитьТаблицуРассылки();
КонецПроцедуры
Процедура ПодразделенияПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Если ДанныеСтроки.Родитель = Неопределено Тогда
ОформлениеСтроки.Шрифт = Новый Шрифт(ОформлениеСтроки.Шрифт , , , Истина, Ложь);
Иначе
ОформлениеСтроки.Шрифт = Новый Шрифт(ОформлениеСтроки.Шрифт , , , Ложь, Ложь);
КонецЕсли;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////
// ТАБЛИЦА ЗНАЧЕНИЙ "СПИСОК РАССЫЛКИ" //
///////////////////////////////////////////////////////////////////////////////
Процедура СписокРассылкиПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Если ДанныеСтроки.ЕстьЕмаилРуководителя = Ложь И ДанныеСтроки.ЕстьЕмаилСотрудника = Ложь Тогда
ОформлениеСтроки.ЦветФона = Новый Цвет(255, 200, 200);
ИначеЕсли ДанныеСтроки.ОтправитьРуководителю = Ложь И ДанныеСтроки.ОтправитьСотруднику = Ложь Тогда
ОформлениеСтроки.ЦветФона = Новый Цвет(255, 255, 153);
КонецЕсли;
Если ДанныеСтроки.Руководитель = ДанныеСтроки.Сотрудник.Физлицо Тогда
ОформлениеСтроки.Шрифт = Новый Шрифт(ОформлениеСтроки.Шрифт , , , Истина, Ложь);
Иначе
ОформлениеСтроки.Шрифт = Новый Шрифт(ОформлениеСтроки.Шрифт , , , Ложь, Ложь);
КонецЕсли;
Если ДанныеСтроки.ЕстьЕмаилРуководителя = Ложь Тогда
ОформлениеСтроки.Ячейки.ОтправитьРуководителю.ТолькоПросмотр = Истина;
КонецЕсли;
Если ДанныеСтроки.ЕстьЕмаилСотрудника = Ложь Тогда
ОформлениеСтроки.Ячейки.ОтправитьСотруднику.ТолькоПросмотр = Истина;
КонецЕсли;
КонецПроцедуры
Процедура СписокРассылкиПриИзмененииФлажка(Элемент, Колонка)
Если Колонка.Имя = "ОтправитьРуководителю" Тогда
Если Элемент.ТекущаяСтрока.ОтправитьРуководителю Тогда
мРуководителю = мРуководителю + 1;
Иначе
мРуководителю = мРуководителю - 1;
КонецЕсли;
КонецЕсли;
Если Колонка.Имя = "ОтправитьСотруднику" Тогда
Если Элемент.ТекущаяСтрока.ОтправитьСотруднику Тогда
мСотруднику = мСотруднику + 1;
Иначе
мСотруднику = мСотруднику - 1;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура СписокРассылкиВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
ИмяКолонки = Элемент.ТекущаяКолонка.Имя;
Если ИмяКолонки = "Сотрудник" ИЛИ ИмяКолонки = "Подразделение" ИЛИ ИмяКолонки = "Руководитель" Тогда
Элемент = Элемент.ТекущиеДанные[Элемент.ТекущаяКолонка.Имя];
Если ЗначениеЗаполнено(Элемент) Тогда
ФормаЭлемента = Элемент.ПолучитьФорму();
ФормаЭлемента.Открыть();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////
// КОМАНДНАЯ ПАНЕЛЬ ПОДРАЗДЕЛЕНИЯ //
///////////////////////////////////////////////////////////////////////////////
Процедура КоманднаяПанельПодразделенияУстановитьФлажки(Кнопка)
СписокРассылки.Очистить();
мРуководителю = 0;
мСотруднику = 0;
ОбойтиУровеньДерева(Подразделения.Строки, "УстановитьФлажки");
ОбойтиУровеньДерева(Подразделения.Строки, "ДобавитьСотрудниковПодразделения");
Если НЕ мСписок.Количество() = 0 Тогда
ДобавитьСотрудниковПодразделения(мСписок);
мСписок.Очистить();
КонецЕсли;
СписокРассылки.Сортировать("Подразделение");
КонецПроцедуры
Процедура КоманднаяПанельПодразделенияСнятьФлажки(Кнопка)
СписокРассылки.Очистить();
мРуководителю = 0;
мСотруднику = 0;
ОбойтиУровеньДерева(Подразделения.Строки, "СнятьФлажки");
ОбойтиУровеньДерева(Подразделения.Строки, "ДобавитьСотрудниковПодразделения");
Если НЕ мСписок.Количество() = 0 Тогда
ДобавитьСотрудниковПодразделения(мСписок);
мСписок.Очистить();
КонецЕсли;
СписокРассылки.Сортировать("Подразделение");
КонецПроцедуры
Процедура КоманднаяПанельПодразделенияИнвертироватьФлажки(Кнопка)
СписокРассылки.Очистить();
мРуководителю = 0;
мСотруднику = 0;
ОбойтиУровеньДерева(Подразделения.Строки, "ИнвертироватьФлажки");
ОбойтиУровеньДерева(Подразделения.Строки, "ДобавитьСотрудниковПодразделения");
Если НЕ мСписок.Количество() = 0 Тогда
ДобавитьСотрудниковПодразделения(мСписок);
мСписок.Очистить();
КонецЕсли;
СписокРассылки.Сортировать("Подразделение");
КонецПроцедуры
Процедура КоманднаяПанельПодразделенияУстановитьФлажкиПапка(Кнопка)
СписокРассылки.Очистить();
мРуководителю = 0;
мСотруднику = 0;
ЭлементыФормы.Подразделения.ТекущаяСтрока.ФлагВыбора = Истина;
ОбойтиУровеньДерева(ЭлементыФормы.Подразделения.ТекущаяСтрока.Строки, "УстановитьФлажки");
ОбойтиУровеньДерева(Подразделения.Строки, "ДобавитьСотрудниковПодразделения");
Если НЕ мСписок.Количество() = 0 Тогда
ДобавитьСотрудниковПодразделения(мСписок);
мСписок.Очистить();
КонецЕсли;
СписокРассылки.Сортировать("Подразделение");
КонецПроцедуры
Процедура КоманднаяПанельПодразделенияСнятьФлажкиПапка(Кнопка)
СписокРассылки.Очистить();
мРуководителю = 0;
мСотруднику = 0;
ЭлементыФормы.Подразделения.ТекущаяСтрока.ФлагВыбора = Ложь;
ОбойтиУровеньДерева(ЭлементыФормы.Подразделения.ТекущаяСтрока.Строки, "СнятьФлажки");
ОбойтиУровеньДерева(Подразделения.Строки, "ДобавитьСотрудниковПодразделения");
СписокРассылки.Сортировать("Подразделение");
КонецПроцедуры
Процедура КоманднаяПанельПодразделенияСвернутьВсе(Кнопка)
ОбойтиУровеньДерева(Подразделения.Строки, "СвернутьВсе");
КонецПроцедуры
Процедура КоманднаяПанельПодразделенияРазвернутьВсе(Кнопка)
ОбойтиУровеньДерева(Подразделения.Строки, "РазвернутьВсе");
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////
// КОМАНДНАЯ ПАНЕЛЬ СПИСКА РАССЫЛКИ //
///////////////////////////////////////////////////////////////////////////////
Процедура КоманднаяПанельСпискаРассылкиУстановитьФлажкиРуководитель(Кнопка)
мРуководителю = 0;
Для Каждого СтрокаСписка Из СписокРассылки Цикл
Если СтрокаСписка.ЕстьЕмаилРуководителя Тогда
СтрокаСписка.ОтправитьРуководителю = Истина;
мРуководителю = мРуководителю + 1;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура КоманднаяПанельСпискаРассылкиСнятьФлажкиРуководитель(Кнопка)
мРуководителю = 0;
Для Каждого СтрокаСписка Из СписокРассылки Цикл
СтрокаСписка.ОтправитьРуководителю = Ложь;
КонецЦикла;
КонецПроцедуры
Процедура КоманднаяПанельСпискаРассылкиИнвертироватьФлажкиРуководитель(Кнопка)
мРуководителю = 0;
Для Каждого СтрокаСписка Из СписокРассылки Цикл
Если СтрокаСписка.ЕстьЕмаилРуководителя Тогда
Если СтрокаСписка.ОтправитьРуководителю = Истина Тогда
СтрокаСписка.ОтправитьРуководителю = Ложь;
Иначе
СтрокаСписка.ОтправитьРуководителю = Истина;
мРуководителю = мРуководителю + 1;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура КоманднаяПанельСпискаРассылкиУстановитьФлажкиСотрудник(Кнопка)
мСотруднику = 0;
Для Каждого СтрокаСписка Из СписокРассылки Цикл
Если СтрокаСписка.ЕстьЕмаилСотрудника Тогда
СтрокаСписка.ОтправитьСотруднику = Истина;
мСотруднику = мСотруднику + 1;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура КоманднаяПанельСпискаРассылкиСнятьФлажкиСотрудник(Кнопка)
Если ЕмаилТолькоРуководителям = Ложь Тогда
Возврат
КонецЕсли;
мСотруднику = 0;
Для Каждого СтрокаСписка Из СписокРассылки Цикл
СтрокаСписка.ОтправитьСотруднику = Ложь;
КонецЦикла;
КонецПроцедуры
Процедура КоманднаяПанельСпискаРассылкиИнвертироватьФлажкиСотрудник(Кнопка)
мСотруднику = 0;
Для Каждого СтрокаСписка Из СписокРассылки Цикл
Если СтрокаСписка.ЕстьЕмаилСотрудника Тогда
Если СтрокаСписка.ОтправитьСотруднику = Истина Тогда
СтрокаСписка.ОтправитьСотруднику = Ложь;
Иначе
СтрокаСписка.ОтправитьСотруднику = Истина;
мСотруднику = мСотруднику + 1;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////
// КОМАНДНАЯ ПАНЕЛЬ СНИЗУ //
///////////////////////////////////////////////////////////////////////////////
Процедура КнопкаВыполнитьНажатие(Кнопка)
Если (мСотруднику + мРуководителю) = 0 Тогда
Сообщить("Нет данных для отправки.", СтатусСообщения.Внимание);
Предупреждение("Нет данных для отправки.", 60);
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(Ответственный) Тогда
Сообщить("Не заполнен обязательный реквизит ""Ответственный"".", СтатусСообщения.Внимание);
Предупреждение("Не заполнен обязательный реквизит ""Ответственный"".", 60);
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(Организация) Тогда
Сообщить("Не заполнен обязательный реквизит ""Организация"".", СтатусСообщения.Внимание);
Предупреждение("Не заполнен обязательный реквизит ""Организация"".", 60);
Возврат;
КонецЕсли;
ОсновнаяУчетнаяЗапись = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(Ответственный, "ОсновнаяУчетнаяЗапись");
Если Лев(СокрЛП(ОсновнаяУчетнаяЗапись),18) = "<Объект не найден>" или Не ЗначениеЗаполнено(ОсновнаяУчетнаяЗапись) Тогда
Сообщить("Нет доступа к учетной записи электронной почты.", СтатусСообщения.Внимание);
Предупреждение("Нет доступа к учетной записи электронной почты.", 60);
Возврат;
КонецЕсли;
ФормаИндикатора = ПолучитьОбщуюФорму("ХодВыполненияОбработкиДанных");
ФормаИндикатора.НаименованиеОбработкиДанных = ЭтаФорма.Заголовок;
ФормаИндикатора.КомментарийОбработкиДанных = "Ход выполнения отправки расчетных листков";
ФормаИндикатора.Открыть();
СписокФизлиц = Новый ТаблицаЗначений;
СписокФизлиц.Колонки.Добавить("Подразделение");
СписокФизлиц.Колонки.Добавить("Руководитель");
СписокФизлиц.Колонки.Добавить("ЕмаилРуководителя");
СписокФизлиц.Колонки.Добавить("Сотрудник");
СписокРуководителей = Новый ТаблицаЗначений;
ФизлицаРуководителя = Новый СписокЗначений;
ФормаИндикатора.КомментарийЗначения = "Этап 1 из 2: Отправка расчетных листков сотрудникам";
ОбщийСчетчик = 0;
ФормаИндикатора.Значение = 0;
Для Каждого СтрокаОтправки Из СписокРассылки Цикл
Если Не ЗначениеЗаполнено(СтрокаОтправки.Сотрудник) Тогда
Продолжить;
КонецЕсли;
Если СтрокаОтправки.ОтправитьСотруднику Тогда
РезультатОтправки = ВыполнитьОтправку(СтрокаОтправки.Сотрудник.Физлицо, СтрокаОтправки.ЕмаилСотрудника, ?(ОтправлятьКопиюСотрудникаОтветственному, "", ""), ПериодРегистрации, ОсновнаяУчетнаяЗапись, "", ФормаИндикатора, ОбщийСчетчик, (мСотруднику + мРуководителю));
Если РезультатОтправки = Истина Тогда
Сообщить("Отправлено сотруднику """ + СтрокаОтправки.Сотрудник + """", СтатусСообщения.Информация);
Иначе
Сообщить("Не удалось отправить сотруднику """ + СтрокаОтправки.Сотрудник + """ по причине """ + РезультатОтправки + """", СтатусСообщения.Внимание);
КонецЕсли;
КонецЕсли;
Если СтрокаОтправки.ОтправитьРуководителю И ЗначениеЗаполнено(СтрокаОтправки.Руководитель) Тогда
НовасСтрока = СписокФизлиц.Добавить();
НовасСтрока["Подразделение"] = СтрокаОтправки.Подразделение;
НовасСтрока["Руководитель"] = СтрокаОтправки.Руководитель;
НовасСтрока["ЕмаилРуководителя"] = СтрокаОтправки.ЕмаилРуководителя;
НовасСтрока["Сотрудник"] = СтрокаОтправки.Сотрудник.Физлицо;
КонецЕсли;
ОбработкаПрерыванияПользователя();
КонецЦикла;
ФормаИндикатора.КомментарийЗначения = "Этап 2 из 2: Отправка расчетных листков руководителям";
СписокРуководителей = СписокФизлиц.Скопировать();
СписокРуководителей.Свернуть("Подразделение,Руководитель,ЕмаилРуководителя");
Для Каждого СтрокаРуководителя Из СписокРуководителей Цикл
ФизлицаРуководителя.Очистить();
Для Каждого СтрокаФизлиц Из СписокФизлиц Цикл
Если СтрокаФизлиц.Руководитель = СтрокаРуководителя.Руководитель Тогда
ФизлицаРуководителя.Добавить(СтрокаФизлиц.Сотрудник);
КонецЕсли;
КонецЦикла;
Если ФизлицаРуководителя.Количество() <> 0 Тогда
РезультатОтправки = ВыполнитьОтправку(ФизлицаРуководителя, СтрокаРуководителя.ЕмаилРуководителя, ?(ОтправлятьКопиюРуководителяОтветственному, "", ""), ПериодРегистрации, ОсновнаяУчетнаяЗапись, СтрокаРуководителя.Подразделение, ФормаИндикатора, ОбщийСчетчик, (мСотруднику + мРуководителю));
Если РезультатОтправки = Истина Тогда
Сообщить("Отправлено руководителю подразделения """ + СтрокаРуководителя.Подразделение + """ """ + СтрокаРуководителя.Руководитель + """", СтатусСообщения.Информация);
Иначе
Сообщить("Не удалось отправить руководителю подразделения """ + СтрокаРуководителя.Подразделение + """ """ + СтрокаРуководителя.Руководитель + """ по причине """ + РезультатОтправки + """", СтатусСообщения.Внимание);
КонецЕсли;
Иначе
Сообщить("Нет данных для отправки руководителю подразделения """ + СтрокаРуководителя.Подразделение + """ """ + СтрокаРуководителя.Руководитель + """", СтатусСообщения.Внимание);
КонецЕсли;
ОбработкаПрерыванияПользователя();
КонецЦикла;
ФормаИндикатора.Закрыть();
КонецПроцедуры
Процедура ОсновныеДействияФормыНастройки(Кнопка)
ФормаНастройки = ПолучитьФорму("ФормаНастройки", ЭтаФорма);
ФормаНастройки.Открыть();
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////
// ПРЕДОПРЕДЕЛЕННЫЕ ПРОЦЕДУРЫ //
///////////////////////////////////////////////////////////////////////////////
Процедура ПриОткрытии()
ЗаполнениеДокументовПереопределяемый.ЗаполнитьШапкуДокумента(ЭтотОбъект, глЗначениеПеременной("глТекущийПользователь"));
ПериодРегистрации = ДобавитьМесяц(ПериодРегистрации, -1);
МесяцСтрока = РаботаСДиалогами.ДатаКакМесяцПредставление(ПериодРегистрации);
мГоловнаяОрганизация = ОбщегоНазначенияЗК.ГоловнаяОрганизация(Организация);
ЗаполнитьДеревоПодразделений();
ТипРасчеткиРуководителю = "Подробно";
ТипРасчеткиСотруднику = "Рабочий";
ТипФайла = "PDF";
ЕмаилТолькоРуководителям = Истина;
КонецПроцедуры
Процедура СписокРассылкиЕмаилРуководителяПриИзменении(Элемент)
ЭлементыФормы.СписокРассылки.ТекущаяСтрока.ЕстьЕмаилРуководителя = ЗначениеЗаполнено(Элемент.значение);
ЭлементыФормы.СписокРассылки.ТекущаяСтрока.ОтправитьРуководителю = ЗначениеЗаполнено(Элемент.значение);
КонецПроцедуры
Процедура СписокРассылкиЕмаилСотрудникаПриИзменении(Элемент)
ЭлементыФормы.СписокРассылки.ТекущаяСтрока.ЕстьЕмаилСотрудника = ЗначениеЗаполнено(Элемент.значение);
ЭлементыФормы.СписокРассылки.ТекущаяСтрока.ОтправитьСотруднику = ЗначениеЗаполнено(Элемент.значение);
КонецПроцедуры
мТабЕмейла = Новый Массив;
мСписок = Новый Массив
Показать
Функция СоздатьРасчеткуПоСотруднику(вхФизлицо, вхПериод, ВидРасчетки = "Подробно")
ОтчетРасчетныеЛисткиОрганизаций = Отчеты.РасчетныеЛисткиОрганизаций.Создать();
ТиповыеОтчеты.УстановитьПараметр(ОтчетРасчетныеЛисткиОрганизаций.КомпоновщикНастроек, "НачалоПериода", НачалоМесяца(вхПериод));
ТиповыеОтчеты.УстановитьПараметр(ОтчетРасчетныеЛисткиОрганизаций.КомпоновщикНастроек, "КонецПериода", КонецМесяца(вхПериод));
ТиповыеОтчеты.УстановитьПараметр(ОтчетРасчетныеЛисткиОрганизаций.КомпоновщикНастроек, "Группировать", Ложь);
ТиповыеОтчеты.УстановитьПараметр(ОтчетРасчетныеЛисткиОрганизаций.КомпоновщикНастроек, "ВидРасчетногоЛистка", ВидРасчетки);
ТиповыеОтчеты.ДобавитьОтбор(ОтчетРасчетныеЛисткиОрганизаций.КомпоновщикНастроек, "ФизЛицо", вхФизлицо);
ТабличныйДокументРасчетныйЛисток = Новый ТабличныйДокумент;
ТабличныйДокументРасчетныйЛисток.АвтоМасштаб = Истина;
ТабличныйДокументРасчетныйЛисток.Защита = Истина;
ТабличныйДокументРасчетныйЛисток.ТолькоПросмотр = Истина;
//ТабличныйДокументРасчетныйЛисток.КодЯзыкаМакета = "En";
ОтчетРасчетныеЛисткиОрганизаций.СформироватьОтчет(ТабличныйДокументРасчетныйЛисток);
ИмяФайла = СокрЛП(вхФизлицо.Наименование);
КаталогФайла = КаталогВременныхФайлов();
ТекИмяФайла = КаталогФайла + ИмяФайла + "." + НРег(ТипФайла);
ТабличныйДокументРасчетныйЛисток.Записать(ТекИмяФайла, ТипФайлаТабличногоДокумента[ТипФайла]);
Возврат ТекИмяФайла;
КонецФункции // СоздатьРасчеткуПоСотруднику()
Функция ВыполнитьОтправку(вхФизлица, вхЕмаил, вхКопия, вхПериод, вхУчетнаяЗаписьПочты, вхПодразделение, ФормаИндикатора, ОбщийСчетчик, ВсегоРесчеток) Экспорт
Успех = Истина;
СписокФайловНаУдаление = Новый СписокЗначений;
ИмяАрихива = СтрЗаменить(СтрЗаменить(СтрЗаменить(Строка(Формат(ТекущаяДата(), "ДФ='dd.MM.yy hh:mm:ss'")), ".", ""), ":", ""), " ", "") + ".zip";
ИмяАрихиваПолное = КаталогВременныхФайлов() + ИмяАрихива;
АрхивФайлов = Новый ЗаписьZipФайла(ИмяАрихиваПолное, , , МетодСжатияZIP.Сжатие, УровеньСжатияZIP.Оптимальный, МетодШифрованияZIP.AES128);
ТелоПисьма = "";
Если ТипЗнч(вхФизлица) = Тип("СписокЗначений") Тогда
ТемаПисьма = "Расчетные листки" + ?(вхПодразделение = "", "", " по подразделению " + вхПодразделение) + " за " + РаботаСДиалогами.ДатаКакМесяцПредставление(вхПериод);
ТелоПисьма = ТелоПисьма + "<p>Во вложении расчетные листки сотрудников:
";
Для СчетчикЦикла = 0 По вхФизлица.Количество() - 1 Цикл
ТелоПисьма = ТелоПисьма + "- " + вхФизлица.Получить(СчетчикЦикла).Значение + "";
ТекИмяФайла = СоздатьРасчеткуПоСотруднику(вхФизлица.Получить(СчетчикЦикла).Значение, вхПериод, ТипРасчеткиРуководителю);
СписокФайловНаУдаление.Добавить(ТекИмяФайла);
АрхивФайлов.Добавить(ТекИмяФайла, РежимСохраненияПутейZIP.НеСохранятьПути, РежимОбработкиПодкаталоговZIP.НеОбрабатывать);
ОбщийСчетчик = ОбщийСчетчик + 1;
ФормаИндикатора.Значение = ОбщийСчетчик / ВсегоРесчеток * 100;
КонецЦикла;
ТелоПисьма = ТелоПисьма + "
</p>"
ИначеЕсли ТипЗнч(вхФизлица) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
ТемаПисьма = "Расчетный листок сотрудника " + вхФизлица + " за " + РаботаСДиалогами.ДатаКакМесяцПредставление(вхПериод);
ТелоПисьма = ТелоПисьма + "<p>Во вложении расчетный листок сотрудника:
</p>";
ТекИмяФайла = СоздатьРасчеткуПоСотруднику(вхФизлица, вхПериод, ТипРасчеткиСотруднику);
СписокФайловНаУдаление.Добавить(ТекИмяФайла);
АрхивФайлов.Добавить(ТекИмяФайла, РежимСохраненияПутейZIP.НеСохранятьПути, РежимОбработкиПодкаталоговZIP.НеОбрабатывать);
ОбщийСчетчик = ОбщийСчетчик + 1;
ФормаИндикатора.Значение = ОбщийСчетчик / ВсегоРесчеток * 100;
КонецЕсли;
ТелоПисьма = ТелоПисьма + "<p>Ответственный: " + Ответственный + " </p>";
АрхивФайлов.Записать();
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = вхУчетнаяЗаписьПочты.SMTPСервер;
Профиль.ВремяОжидания = вхУчетнаяЗаписьПочты.ВремяОжиданияСервера;
Профиль.Пароль = вхУчетнаяЗаписьПочты.Пароль;
Профиль.ПарольSMTP = вхУчетнаяЗаписьПочты.ПарольSMTP;
Профиль.Пользователь = вхУчетнаяЗаписьПочты.Логин;
Профиль.ПользовательSMTP = вхУчетнаяЗаписьПочты.ЛогинSMTP;
Профиль.ПортSMTP = вхУчетнаяЗаписьПочты.ПортSMTP;
//Профиль = УправлениеЭлектроннойПочтой.ПолучитьИнтернетПочтовыйПрофиль(вхУчетнаяЗаписьПочты);
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель = вхУчетнаяЗаписьПочты.АдресЭлектроннойПочты;
Сообщение.ИмяОтправителя = "ZUP";
Сообщение.Получатели.Добавить(вхЕмаил);
Если вхКопия <> "" Тогда
Сообщение.Копии.Добавить(вхКопия);
КонецЕсли;
Сообщение.Тема = ТемаПисьма;
Сообщение.Тексты.Добавить(ТелоПисьма + "<p>При сотрудничестве с 1С</p>", ТипТекстаПочтовогоСообщения.HTML);
Сообщение.Вложения.Добавить(ИмяАрихиваПолное);
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Исключение
Успех = "Не удалось подключить профиль электронной почты по причине: " + ОписаниеОшибки();
КонецПопытки;
Попытка
Почта.Послать(Сообщение);
ЗаписьЖурналаРегистрации("Письма.Отправленные",УровеньЖурналаРегистрации.Информация, , ,"Отправленно на " + СокрЛП(Строка(вхЕмаил)) + " по сотрудникам: " + СокрЛП(ТелоПисьма));
Исключение
Успех = "Не удалось отправить сообщение электронной почты по причине: " + ОписаниеОшибки();
ЗаписьЖурналаРегистрации("Письма.Ошибка",УровеньЖурналаРегистрации.Ошибка, , ,"Ошибка отправления на " + СокрЛП(Строка(вхЕмаил)) + " по сотрудникам: " + СокрЛП(ТелоПисьма));
КонецПопытки;
Попытка
Почта.Отключиться();
Исключение
Успех = "Не удалось отключиться от электронной почты по причине: " + ОписаниеОшибки();
КонецПопытки;
Сообщение.Вложения.Очистить();
Для Каждого ФайлНаУдаление Из СписокФайловНаУдаление Цикл
Попытка
УдалитьФайлы(ФайлНаУдаление);
Исключение
Успех = "Не удалось удалить файл " + ФайлНаУдаление + " по причине: " + ОписаниеОшибки();
КонецПопытки;
КонецЦикла;
Попытка
УдалитьФайлы(ИмяАрихиваПолное);
Исключение
Успех = "Не удалось удалить файл " + ТекИмяФайла + " по причине: " + ОписаниеОшибки();
КонецПопытки;
Возврат Успех;
КонецФункции // ВыполнитьОтправку()
Показать