gifts2017

Рассылка расчетных листков по электронной почте для 1С:Зарплата и управление персоналом 8.2. Версия 3.

Опубликовал Nicholas Mikuslas (Nicholas) в раздел Отчеты - Бухгалтерские

Инструмент позволяет сформировать Расчетные листки сотрудников организаций за произвольный период времени и отправить их на адреса электронной почты сотрудников и/или руководителей.
В версии 3 добавлена совместимость с последними релизами 1С ЗУП (в типовой конфигурации были изменены некоторые общие модули, которые использует обработка).

Инструмент позволяет сформировать Расчетные листки сотрудников организаций за произвольный период времени и отправить их на адреса электронной почты сотрудников и/или руководителей.

Для сотрудников формируются краткие расчетные листки, а для руководителя - подробные листки для проведения анализа результатов расчетов, в которых помимо сумм начислений и оплаченного времени выводятся периоды действия начислений и исходные показатели для расчета (тарифные ставки, проценты оплаты и т.п.).

В шапке обработки необходимо выбрать Организацию и Период, за который будут формироваться расчетные листки.

Рассылка расчетных листков

После этого в дереве подразделений флажками помечаются нужные, при этом, автоматически заполняется список рассылки, сотрудниками из выбранных подразделений. В список не попадают увольенные, помещенные в архив или помеченные на удаление сотрудники. Руководители подразделений выделяются жирным шрифтом.

Руководителя подразделения можно задать в справочнике «Подразделения организаций».

Руководитель подразделения

Сотрудники, для которых не задан адрес электронной почты, и не удалось определить адрес электронной почты руководителя, выделяются красным цветом.

Адрес электронной почты сотрудника указывается в справочнике «Сотрудники».

Задание электронного адресе сотрудника

Желтым цветом выделяются сотрудики, которым можно отправить расчетные листки, но которые не отмечены соответствующими флажками.

Расчетные листки формируются с использованием алгоритмов отчета «Расчетные листки организации» типовой конфигурации 1С:Зарплата и управление персоналом 8.2 и отправляются через стандартный сервис электронной почты конфигурации.

Использования отчета не требует внесение никаких изменений в типовую конфигурацию и никак не влияет на ее обновление.

Использовать инструмент достаточно просто. Существует по крайней мере два способа.

1. Можно каждый раз открывать файл внешней обработки (у пользователя должны быть соответствующие права) через меню «Файл - Открыть».

2. Можно зарегистрировать внешнюю обработку в справочнике «Дополнительные внешние обработки» через меню «Сервис - Дополнительные отчеты и обработки». Пользователь может подключить обработку к конфигурации самостоятельно.

Чтобы подключить новую внешнюю обработку, нужно зарегистрировать ее в указанном справочнике. Для этого из формы списка справочника следует открыть форму регистрации, нажав на кнопку «Добавить». В открывшемся окне нужно указать файл внешней обработки с расширением .epf (кнопка «Заменить файл внешней обработки»). В поле Наименование автоматически отобразится название подключенной внешней обработки, которое можно изменить вручную. В поле Вид нужно выбрать вид обработки «Обработка».

Регистрация внешней обработки

Сведения о подключенных обработках отображаются в форме списка справочника. Для использования подключенной внешней обработки по назначению следует открыть форму списка справочника внешних обработок и дважды щелкнуть мышью по нужной записи.

Дополнительные внешние обработки


Новое в версии 2:

 

  1. Теперь обработка совместима как с конфигурацией 1С:Зарплата и управление персоналом КОРП, так и с 1С:Зарплата и управление персоналом.
  2. Добавлена обработка прерывания. Ход формирования и отправки расчетных листков можно прервать нажатием комбинации клавиш Ctrl + Break.
  3. Добавлена возможность произвольной сортировки списка отправки.
  4. В список отправки добавлены колонки «Емаил сотрудника» и «Емаил руководителя». По умолчанию эти колонки скрыты. При нажатии на список отправки правой клавишей мыши, можно вызвать контекстное меню, которое позволяет настроить сортировку списка, видимость колонок и вывести список на печать.
  5. Если сделать двойное нажатие левой клавишей мыши по подразделению, сотруднику или руководителю в списке отправки, то будет открыта форма соответствующего элемента справочника.
  6. Доработан индикатор прогресса отправки расчетных листков. Теперь он отображает общий процент выполнения (ранее отдельно отображался ход отправки сотрудникам и отдельно - руководителям).
  7. Реализована возможность выбирать тип расчетного листка для сотрудника и тип расчетного листка для руководителя. По умолчанию, для сотрудников формируются краткие расчетные листки, а для руководителя - подробные листки для проведения анализа результатов расчетов, в которых помимо сумм начислений и оплаченного времени выводятся периоды действия начислений и исходные показатели для расчета (тарифные ставки, проценты оплаты и т.п.). Тип расчетных листков можно изменить в настройках.
  8. В настройках можно указать формат файла, в который будет записываться сформированный расчетный листок и далее отправляться сотрудникам и/или руководителям. По умолчанию, в качестве формата файла выбран Документ PDF (*.pdf).
  9. В теме письма теперь отображается ФИО сотрудника или наименование подразделения, в случае отправки руководителю.
  10. Прочие мелкие доработки.

 Настройки программы

Настройка списка

Настройка списка

Вывод данных табличной части

 

В версии 3 добавлена совместимость с последними релизами 1С ЗУП (в типовой конфигурации были изменены некоторые общие модули, которые использует обработка).

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
PaySlips3.epf
.epf 28,45Kb
08.08.13
160
.epf 28,45Kb 160 Скачать
PaySlips2.epf
.epf 28,59Kb
08.08.13
79
.epf 28,59Kb 79 Скачать
PaySlips.epf
.epf 21,69Kb
08.08.13
82
.epf 21,69Kb 82 Скачать

См. также

Вознаграждение за ответ
Сумма: 0 $m
Добавили:
Максим Анпилов (Mx00) (10.00 $m)
Подписаться Добавить вознаграждение

Комментарии

1. djek djek (djek88) 13.09.12 10:30
А в каком формате к получателю приходит расчЛисток?
2. Nicholas Mikuslas (Nicholas) 13.09.12 12:20
3. djek djek (djek88) 13.09.12 12:29
т.е. перед отправкой получателю, копия расчЛистка остается на локальном диске?
4. Nicholas Mikuslas (Nicholas) 13.09.12 13:53
Совершенно верно. В случае отправки расчеток руководителю, во временной папке создаются файлы в формате Excel на каждого сотрудника, затем эти файлы архивируются и одним архивом отправляются. После отправки файлы удаляются.
5. djek djek (djek88) 13.09.12 14:30
Как я понял из ответа, при отправке руководителю Ecxel файлы удаляются, а если просто сотруднику, то не удаляются. Так?
И еще вопросы:
1) Архив тоже удаляется после отправки?
2) Есть ли возможность запаролить архив?
6. Nicholas Mikuslas (Nicholas) 13.09.12 14:57
(5) djek88, сколько много вопросов :)
1. Архив удаляется. Теоретически, перед закрытием, 1С должна подчищать за собой временные папки. На практике - не проверял.
2. Данная обработка это не предусматривает, но доработать не сложно. Из синтаксис-помощника:
Новый ЗаписьZipФайла(<ИмяФайла>, <Пароль>,...)
Только для чего это нужно?
7. Максим Анпилов (Mx00) 12.11.12 03:23
Спасибо за полезную игрушку, только вот играть в неё не удобно :-(
1. при открытии вываливается ошибка "ПодразделенияОрганизаций.Актуальность = ИСТИНА"
если уж выкладываешь, то либо тестируй на типовой конфигурации, либо сразу пиши проверку на наличие дополнительных реквизитов
2. При отправке нет обработки прерывания
3. Добавить в описание необходимость заполнения реквизита ответственный, (или текущий пользователь), а то при входе без учетной записи обработка что-то пытается отправить, но выдает ошибку.
4. список сотрудников нужно отсортировать по фамилиям по возрастанию вот так: СписокРассылки.Сортировать("Подразделение,Сотрудник");
5. если о сотруднику расчетный листок пустой, то его не нужно отправлять (например отпуск без содержания или новый сотрудник)
6. не корректная фраза "Желтым цветом выделяются сотрудики, которым можно отправить расчетные листки, но которые не отмечены соответствующими флажками"
если у сотрудника НЕТ e-mail, то ему нельзя отправить расчетный листок, но он будет желтым если снять флажок отправки руководителю

это были важные замечания (по моему мнению)
теперь НЕ важные :-) (просто хотелки)
1. Добавить в таблицу адреса сотрудников
в табличную часть добавить реквизит e_mail а в процедуру ДобавитьСотрудниковПодразделения добавить строку
СтрокаСпискаРассылки.e_mail = ПолучитьЕмаилФизлица(ВыборкаДетальныеЗаписи.Сотрудник.Физлицо);

2. открывать сотрудника (или физ.лицо) при клике в таблице
3. Индикатор процесса не адекватен :-) желательно сделать движение индикатора при каждом формировании расчетного листка
4. дать возможность указанию пользователю формата файла расчетного листка (тот xlsx который сейчас не везде открывается, варианты xlsx, xls, pdf)
5. Тема письма "Расчетные листки" добавить "по отделу ..."
6. Очепятки:
Этам 2 из 2
ИмяАрихива

З.Ы. а в целом очень обработка мне понравилась и уже используется, спасибо!
Vida; Nicholas; +2 1 Ответить 3
8. Кирилл Раковский (RakovskiyK) 21.11.12 22:42
прикольная обработка, но так же думаю, что получать в виде Excel 2007|2010 не всем удобно :)
9. Nicholas Mikuslas (Nicholas) 22.11.12 07:37
(7), (8) Спасибо за отзывы. Обязательно сделаю то, о чем вы пишите. К сожалению, сейчас практически нет свободного времени. Поэтому, чуть позже.
10. Кирилл Раковский (RakovskiyK) 27.11.12 11:36
Еще одно добавление: было бы не плохо добавить возможность выбора вида расчетного листка (подробный, краткий, для сотрудника), а по умолчанию "рассылать для сотрудника".

P.S. реально бесподобная обработка! до сих пор не могу нарадоваться! Еще раз спасибо!
11. Nicholas Mikuslas (Nicholas) 27.11.12 12:58
(10) Спасибо. Тоже была мысль сделать такую настройку. Обязательно реализую это позже.
12. Кирилл Раковский (RakovskiyK) 24.12.12 16:52
(11) Nicholas, приветствую вопрос: появились ли какие нибудь обновления в сей прекрасной обработке?

И еще один каприз, хотя быть может и не по адресу, а если сделать еще ее на английском языке? понимаю, что много геморроя, т.к. понимаю откуда берется информация (отчет то, грубо говоря, дефолтный), но тем не менее, быть может будет интересно решить и этот вопрос.

Заранее извиняюсь за возможную наглость и не сдержанность в просьбе :)
13. Виктория В (v.vik) 21.02.13 10:43
(7) Mx00,
Подскажите, пожалуйста, как вы исправили эту ошибку:

{Форма.Форма.Форма(139)}: Ошибка при вызове метода контекста (Выполнить)
Подразделения = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
по причине:

по причине:
{(9, 29)}: Поле не найдено "ПодразделенияОрганизаций.Актуальность"
И ПодразделенияОрганизаций.<<?>>Актуальность = ИСТИНА

Заранее благодарю.
14. Максим Анпилов (Mx00) 21.02.13 11:59
(13) Просто закомментировал эту строку и всё
15. Гость 21.02.13 12:20
(14) Mx00,

Простите, для меня наверное это сложно.....как это "закомментировал эту строку".
Что должно быть написано, чтобы исправить эту ошибку?
16. Максим Анпилов (Mx00) 21.02.13 12:50
(15) это относится к программированию, нужно открыть конфигуратор и там уже разбираться с модулями. т.к. обработка не моя, то более конкретно не отвечу, вспоминать лень, а обучение программированию не мой конёк
17. Nicholas Mikuslas (Nicholas) 21.02.13 14:04
Mx00, Виктория, подскажите, пожалуйста, а какая у вас конфигурация?
Потому как в типовой ЗУП КОРП этот реквизит имеется.
18. Максим Анпилов (Mx00) 21.02.13 14:25
(17)не сложно догадаться, что Конфигурация: 1С:Зарплата и Управление Персоналом 8
НЕ КОРП :-)
19. Nicholas Mikuslas (Nicholas) 21.02.13 14:36
(18) Поделитесь, пожалуйста, конфигурацией, чтобы можно было провести полноценное тестирование. Краткое наименование конфигурации у вас "ЗарплатаИУправлениеПерсоналом"?
20. Виктория В (v.vik) 21.02.13 15:40
(19) Nicholas,
Добрый день, у меня конфигурация Зарплата и Управление Персоналом, редакция 2.5 (2.5.60.1)
21. Nicholas Mikuslas (Nicholas) 21.02.13 18:32
(7), (8), (10), (13) Если ничего не помешает, то завтра выложу новую версию обработки. Большую часть уже сделал, остались небольшие штрихи и тестирование.
(12) Обещаю подумать по поводу Английского языка, но с трудом представляю как это возможно. Вы вообще пробовали работать в английском интерфейсе? Если да, то поделитесь опытом.
22. MiB (MiB) 07.03.13 12:16
пишет вот такую хрень
{Форма.Форма.Форма(68)}: Метод объекта не обнаружен (ФамилияИнициалыФизЛица)
ИмяФайлаТ = "Расчетный листок_" + ОбщегоНазначения.ФамилияИнициалыФизЛица(Выборка.ФизЛицо) + "_" + ПредставлениеПериода(НачалоМесяца(Период), КонецМесяца(Период));
23. Nicholas Mikuslas (Nicholas) 11.03.13 07:05
(22) Уточните, пожалуйста, какая у вас конфигурация? Дело в том, что в моей обработке нет такой строки. Более того, я не нашел ничего подобного в типовой конфигурации 1С:Зарплата и управление персоналом КОРП.
24. MasterSVS (MasterSVS) 28.03.13 15:20
Плюс...
На заметку : При выборе реквизита "Организация", таблица не обновляется...
Nicholas; +1 Ответить
25. Денис Попов (d_control) 28.08.13 12:20
Добрый день.
Тоже хотим воспользоваться вашей обработкой.
Есть вопрос.
Бывали ли случаи блокировки адреса электронной почты, с которого отправляются листки?
Ведь это массовая рассылка, которая может не приветствоваться mail.ru, yandex.ru...

Что показывает ваша практика?
Прикрепленные файлы:
26. Nicholas Mikuslas (Nicholas) 28.08.13 12:45
(25) К сожалению, у меня нет опыта использования обработки совместно с внешними почтовыми сервисами, такими как mail.ru, yandex.ru и пр. С внутрекорпоративными почтовыми серверами, а также с облачными решениями типа Office365 работает отлично.
27. Homer_ (homer_) 12.09.13 09:09
Воспользовался вашей обработкой, но пришлось переписать концепцию заполнения данных т.к. запросы не оптимальные (Запросы в цикле), из за чего все тормозит. + добавил возможность загрузки из AD.
В целом неплохое решение, но не оптимизированное.
З.Ы зачем при отправки письма считывать снова адрес если он уже есть в таблице?
28. Nicholas Mikuslas (Nicholas) 12.09.13 10:40
(27) homer_, спасибо за отзыв.
Буду благодарен, если поделитесь отпимизированными запросами.
Для загрузки данных из AD я пользуюсь другими механизмами.
Изначально адреса в таблице не было, позже, по просьбам пользователй, была сделана эта доработка, но, видимо, не во всех местах это учел.
29. Homer_ (homer_) 12.09.13 12:24
Новый реквизит добавил "ЕмаилТолькоРуководителям"
ИТОбщийМодуль.ПоискПочтыПОЮзерувАД(мТабЕмейла);-тут сам должен уже разработать
Это модуль
Перем мГоловнаяОрганизация; // Хранит ссылку на головную организацию
Перем ФормаИндикатора;
Перем мРуководителю; // Хранит количество расчетных листков, подготовленных для рассылки руководителю
Перем мСотруднику; // Хранит количество расчетных листков, подготовленных для рассылки сотруднику
Перем мКонфигурация; // Хранит краткое имя конфигурации
Перем мКолЗаписей;
////////////////////////////////////////////////////////////­///////////////////
// ОБЩЕГО НАЗНАЧЕНИЯ                                                         //
////////////////////////////////////////////////////////////­///////////////////
 Перем мТабЕмейла,мСписок;

Процедура ДобавитьСотрудниковПодразделения(вхПодразделение)
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	СотрудникиОрганизаций.Ссылка КАК Сотрудник,
	|	СотрудникиОрганизаций.Физлицо.СтраховойНомерПФР КАК СотрудникПФР,
	|	СотрудникиОрганизаций.ТекущееПодразделениеОрганизации КАК Подразделение,
	|	ЕСТЬ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 Цикл ТелоПисьма = ТелоПисьма + "
  • " + вхФизлица.Получить(СчетчикЦикла).Значение + "</li>"; ТекИмяФайла = СоздатьРасчеткуПоСотруднику(вхФизлица.Получить(СчетчикЦикла).Значение, вхПериод, ТипРасчеткиРуководителю); СписокФайловНаУдаление.Добавить(ТекИмяФайла); АрхивФайлов.Добавить(ТекИмяФайла, РежимСохраненияПутейZIP.НеСохранятьПути, РежимОбработкиПодкаталоговZIP.НеОбрабатывать); ОбщийСчетчик = ОбщийСчетчик + 1; ФормаИндикатора.Значение = ОбщийСчетчик / ВсегоРесчеток * 100; КонецЦикла; ТелоПисьма = ТелоПисьма + "
</p>" ИначеЕсли ТипЗнч(вхФизлица) = Тип("СправочникСсылка.ФизическиеЛица") Тогда ТемаПисьма = "Расчетный листок сотрудника " + вхФизлица + " за " + РаботаСДиалогами.ДатаКакМесяцПредставление(вхПериод); ТелоПисьма = ТелоПисьма + "<p>Во вложении расчетный листок сотрудника:
  • " + вхФизлица + "</li>
</p>"; ТекИмяФайла = СоздатьРасчеткуПоСотруднику(вхФизлица, вхПериод, ТипРасчеткиСотруднику); СписокФайловНаУдаление.Добавить(ТекИмяФайла); АрхивФайлов.Добавить(ТекИмяФайла, РежимСохраненияПутейZIP.НеСохранятьПути, РежимОбработкиПодкаталоговZIP.НеОбрабатывать); ОбщийСчетчик = ОбщийСчетчик + 1; ФормаИндикатора.Значение = ОбщийСчетчик / ВсегоРесчеток * 100; КонецЕсли; ТелоПисьма = ТелоПисьма + "<p>Ответственный: " + Ответственный + " </p>"; АрхивФайлов.Записать(); Профиль = Новый ИнтернетПочтовыйПрофиль; Профиль.АдресСервераSMTP = вхУчетнаяЗаписьПочты.SMTPСервер; Профиль.ВремяОжидания = вхУчетнаяЗаписьПочты.ВремяОжиданияСервера; Профиль.Пароль = вхУчетнаяЗаписьПочты.Пароль; Профиль.ПарольSMTP = вхУчетнаяЗаписьПочты.ПарольSMTP; Профиль.Пользователь = вхУчетнаяЗаписьПочты.Логин; Профиль.ПользовательSMTP = вхУчетнаяЗаписьПочты.ЛогинSMTP; Профиль.ПортSMTP = вхУчетнаяЗаписьПочты.ПортSMTP; //Профиль = УправлениеЭлектроннойПочтой.ПолучитьИнтернетПочтовыйПрофиль(вхУчетнаяЗаписьПочты); Сообщение = Новый ИнтернетПочтовоеСообщение; Сообщение.Отправитель = вхУчетнаяЗаписьПочты.АдресЭлектроннойПочты; Сообщение.ИмяОтправителя = "ZUP"; Сообщение.Получатели.Добавить(вхЕмаил); Если вхКопия <> "" Тогда Сообщение.Копии.Добавить(вхКопия); КонецЕсли; Сообщение.Тема = ТемаПисьма; Сообщение.Тексты.Добавить(ТелоПисьма + "<p>При сотрудничестве с 1С</p>", ТипТекстаПочтовогоСообщения.HTML); Сообщение.Вложения.Добавить(ИмяАрихиваПолное); Почта = Новый ИнтернетПочта; Попытка Почта.Подключиться(Профиль); Исключение Успех = "Не удалось подключить профиль электронной почты по причине: " + ОписаниеОшибки(); КонецПопытки; Попытка Почта.Послать(Сообщение); ЗаписьЖурналаРегистрации("Письма.Отправленные",УровеньЖурналаРегистрации.Информация, , ,"Отправленно на " + СокрЛП(Строка(вхЕмаил)) + " по сотрудникам: " + СокрЛП(ТелоПисьма)); Исключение Успех = "Не удалось отправить сообщение электронной почты по причине: " + ОписаниеОшибки(); ЗаписьЖурналаРегистрации("Письма.Ошибка",УровеньЖурналаРегистрации.Ошибка, , ,"Ошибка отправления на " + СокрЛП(Строка(вхЕмаил)) + " по сотрудникам: " + СокрЛП(ТелоПисьма)); КонецПопытки; Попытка Почта.Отключиться(); Исключение Успех = "Не удалось отключиться от электронной почты по причине: " + ОписаниеОшибки(); КонецПопытки; Сообщение.Вложения.Очистить(); Для Каждого ФайлНаУдаление Из СписокФайловНаУдаление Цикл Попытка УдалитьФайлы(ФайлНаУдаление); Исключение Успех = "Не удалось удалить файл " + ФайлНаУдаление + " по причине: " + ОписаниеОшибки(); КонецПопытки; КонецЦикла; Попытка УдалитьФайлы(ИмяАрихиваПолное); Исключение Успех = "Не удалось удалить файл " + ТекИмяФайла + " по причине: " + ОписаниеОшибки(); КонецПопытки; Возврат Успех; КонецФункции // ВыполнитьОтправку()
...Показать Скрыть
30. Dmitry Bas (b-dm) 29.07.14 10:39
А зачем постоянно в зипе отправлять даже если указан Excel ?
31. Nicholas Mikuslas (Nicholas) 30.07.14 09:13
(30) Для снижения траффика и нагрузки на почтовые сервера. При необходимости можно легко доработать это и сделать архивирование опцией.
32. Алексей (AlexGS) 28.11.14 14:17
Под ЗКБУ работать будет?
33. Nicholas Mikuslas (Nicholas) 28.11.14 16:12
34. Dmitry Bas (b-dm) 18.12.15 13:20
Планируется ли поддерживать, дорабатывать публикацию ?))
35. Nicholas Mikuslas (Nicholas) 19.12.15 17:47
Готов доработать под ваши требования и любую конфигурацию. Стоимость и сроки обсуждаемы.
36. Dmitry Bas (b-dm) 24.12.15 11:32
Пишет ошибку, но отсылает :)
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа