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

08.08.13

Учетные задачи - Зарплата

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Бесплатно
PaySlips3.epf
.epf 28,45Kb
273
273 Скачать бесплатно
PaySlips2.epf
.epf 28,59Kb
92
92 Скачать бесплатно
PaySlips.epf
.epf 21,69Kb
91
91 Скачать бесплатно

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

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

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

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

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

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

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

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

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

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

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

Расчетные листки формируются с использованием алгоритмов отчета «Расчетные листки организации» типовой конфигурации 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С ЗУП (в типовой конфигурации были изменены некоторые общие модули, которые использует обработка).

См. также

Зарплата Регламентированный учет и отчетность Кадровый учет Обновление 1С Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Зарплата и Управление Персоналом 2.5 Бухгалтерский учет Налоговый учет Управленческий учет Акцизы ЕНВД ЕСН Земельный налог ИП, ПБОЮЛ, КФХ Налог на имущество Налог на прибыль НДС НДФЛ ФОМС, ЕФС Транспортный налог УСН ПСН (патентная система налогообложения) Платные (руб)

Обновления для конфигураций: КА 1.1; ЗУП 2.5; БУХ 2.0; КА 1.1 Комплексная автоматизация торговли алкогольной продукцией; КА 1.1 Комплексный учет сельскохозяйственного предприятия

27900 руб.

01.04.2020    147188    649    360    

235

Внешние источники данных Зарплата Бюджетный учет Программист Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

48000 руб.

24.04.2017    51094    101    165    

89

Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    25078    23    1    

25

Зарплата Производство готовой продукции (работ, услуг) Учет рабочего времени Рабочее место Бизнес-аналитик Пользователь Руководитель проекта Платформа 1С v8.3 1С:Управление торговлей 10 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Торговля и склад 7.7 Бытовые услуги, сервис Оптовая торговля, дистрибуция, логистика Электротехника и микроэлектроника Управленческий учет Платные (руб)

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

14800 руб.

01.11.2012    94210    114    1    

118

SALE! 20%

Зарплата Роли и права Системный администратор Бухгалтер Платформа 1С v8.3 Бухгалтерский учет Управление правами 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Комплексная автоматизация 2.х Молдова Россия Казахстан Бухгалтерский учет Платные (руб)

Расширение позволяет максимально полно ограничить доступ пользователей к данным по заработной плате, а именно закрывает доступ к документам начисления и выплаты заработной платы, не позволяет просматривать бухгалтерские отчеты по счету учета зарплаты а также убирает зарплатные проводки из журнала проводок. Расширение запрещает просматривать платежные документы на выплату зарплаты, так же не доступны регламентные отчеты в ПФР и ИФНС. Расширение предлагает готовые настроенные профили "Бухгалтер без зарплаты", "Только просмотр без зарплаты".

5940 4752 руб.

27.05.2021    37673    265    95    

205

Взаиморасчеты Email рассылки Акт сверки Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бухгалтерский учет Платные (руб)

Внешняя обработка для Бухгалтерии 3.0 - позволяет автоматически формировать документы «Акт сверки расчетов» с контрагентами за выбранный период с последующей фоновой отправкой на почту контрагента.

3000 руб.

25.11.2020    24504    238    8    

205

Перенос данных 1C Зарплата Бюджетный учет Программист Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Обработки для быстрого перехода с конфигураций «КАМИН:Расчет зарплаты для бюджетных учреждений 3.5» и «КАМИН:Зарплата для бюджетных учреждений 5.5» на конфигурацию «Зарплата и кадры государственного учреждения».

12000 руб.

28.07.2016    60751    153    141    

129
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. djek88 1 13.09.12 10:30 Сейчас в теме
А в каком формате к получателю приходит расчЛисток?
2. Nicholas 902 13.09.12 12:20 Сейчас в теме
3. djek88 1 13.09.12 12:29 Сейчас в теме
т.е. перед отправкой получателю, копия расчЛистка остается на локальном диске?
4. Nicholas 902 13.09.12 13:53 Сейчас в теме
Совершенно верно. В случае отправки расчеток руководителю, во временной папке создаются файлы в формате Excel на каждого сотрудника, затем эти файлы архивируются и одним архивом отправляются. После отправки файлы удаляются.
5. djek88 1 13.09.12 14:30 Сейчас в теме
Как я понял из ответа, при отправке руководителю Ecxel файлы удаляются, а если просто сотруднику, то не удаляются. Так?
И еще вопросы:
1) Архив тоже удаляется после отправки?
2) Есть ли возможность запаролить архив?
6. Nicholas 902 13.09.12 14:57 Сейчас в теме
(5) djek88, сколько много вопросов :)
1. Архив удаляется. Теоретически, перед закрытием, 1С должна подчищать за собой временные папки. На практике - не проверял.
2. Данная обработка это не предусматривает, но доработать не сложно. Из синтаксис-помощника:
Новый ЗаписьZipФайла(<ИмяФайла>, <Пароль>,...)
Только для чего это нужно?
7. Mx00 249 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 Ответить
9. Nicholas 902 22.11.12 07:37 Сейчас в теме
(7), (8) Спасибо за отзывы. Обязательно сделаю то, о чем вы пишите. К сожалению, сейчас практически нет свободного времени. Поэтому, чуть позже.
13. v.vik 21.02.13 10:43 Сейчас в теме
(7) Mx00,
Подскажите, пожалуйста, как вы исправили эту ошибку:

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

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

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

Простите, для меня наверное это сложно.....как это "закомментировал эту строку".
Что должно быть написано, чтобы исправить эту ошибку?
16. Mx00 249 21.02.13 12:50 Сейчас в теме
(15) это относится к программированию, нужно открыть конфигуратор и там уже разбираться с модулями. т.к. обработка не моя, то более конкретно не отвечу, вспоминать лень, а обучение программированию не мой конёк
21. Nicholas 902 21.02.13 18:32 Сейчас в теме
(7), (8), (10), (13) Если ничего не помешает, то завтра выложу новую версию обработки. Большую часть уже сделал, остались небольшие штрихи и тестирование.
(12) Обещаю подумать по поводу Английского языка, но с трудом представляю как это возможно. Вы вообще пробовали работать в английском интерфейсе? Если да, то поделитесь опытом.
8. RakovskiyK 21.11.12 22:42 Сейчас в теме
прикольная обработка, но так же думаю, что получать в виде Excel 2007|2010 не всем удобно :)
Nicholas; +1 Ответить
10. RakovskiyK 27.11.12 11:36 Сейчас в теме
Еще одно добавление: было бы не плохо добавить возможность выбора вида расчетного листка (подробный, краткий, для сотрудника), а по умолчанию "рассылать для сотрудника".

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

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

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

Что показывает ваша практика?
Прикрепленные файлы:
26. Nicholas 902 28.08.13 12:45 Сейчас в теме
(25) К сожалению, у меня нет опыта использования обработки совместно с внешними почтовыми сервисами, такими как mail.ru, yandex.ru и пр. С внутрекорпоративными почтовыми серверами, а также с облачными решениями типа Office365 работает отлично.
27. homer_ 79 12.09.13 09:09 Сейчас в теме
Воспользовался вашей обработкой, но пришлось переписать концепцию заполнения данных т.к. запросы не оптимальные (Запросы в цикле), из за чего все тормозит. + добавил возможность загрузки из AD.
В целом неплохое решение, но не оптимизированное.
З.Ы зачем при отправки письма считывать снова адрес если он уже есть в таблице?
28. Nicholas 902 12.09.13 10:40 Сейчас в теме
(27) homer_, спасибо за отзыв.
Буду благодарен, если поделитесь отпимизированными запросами.
Для загрузки данных из AD я пользуюсь другими механизмами.
Изначально адреса в таблице не было, позже, по просьбам пользователй, была сделана эта доработка, но, видимо, не во всех местах это учел.
29. homer_ 79 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 Цикл ТелоПисьма = ТелоПисьма + "
  • " + вхФизлица.Получить(СчетчикЦикла).Значение + ""; ТекИмяФайла = СоздатьРасчеткуПоСотруднику(вхФизлица.Получить(СчетчикЦикла).Значение, вхПериод, ТипРасчеткиРуководителю); СписокФайловНаУдаление.Добавить(ТекИмяФайла); АрхивФайлов.Добавить(ТекИмяФайла, РежимСохраненияПутей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); Сообщение.Вложения.Добавить(ИмяАрихиваПолное); Почта = Новый ИнтернетПочта; Попытка Почта.Подключиться(Профиль); Исключение Успех = "Не удалось подключить профиль электронной почты по причине: " + ОписаниеОшибки(); КонецПопытки; Попытка Почта.Послать(Сообщение); ЗаписьЖурналаРегистрации("Письма.Отправленные",УровеньЖурналаРегистрации.Информация, , ,"Отправленно на " + СокрЛП(Строка(вхЕмаил)) + " по сотрудникам: " + СокрЛП(ТелоПисьма)); Исключение Успех = "Не удалось отправить сообщение электронной почты по причине: " + ОписаниеОшибки(); ЗаписьЖурналаРегистрации("Письма.Ошибка",УровеньЖурналаРегистрации.Ошибка, , ,"Ошибка отправления на " + СокрЛП(Строка(вхЕмаил)) + " по сотрудникам: " + СокрЛП(ТелоПисьма)); КонецПопытки; Попытка Почта.Отключиться(); Исключение Успех = "Не удалось отключиться от электронной почты по причине: " + ОписаниеОшибки(); КонецПопытки; Сообщение.Вложения.Очистить(); Для Каждого ФайлНаУдаление Из СписокФайловНаУдаление Цикл Попытка УдалитьФайлы(ФайлНаУдаление); Исключение Успех = "Не удалось удалить файл " + ФайлНаУдаление + " по причине: " + ОписаниеОшибки(); КонецПопытки; КонецЦикла; Попытка УдалитьФайлы(ИмяАрихиваПолное); Исключение Успех = "Не удалось удалить файл " + ТекИмяФайла + " по причине: " + ОписаниеОшибки(); КонецПопытки; Возврат Успех; КонецФункции // ВыполнитьОтправку()
Показать
30. b-dm 174 29.07.14 10:39 Сейчас в теме
А зачем постоянно в зипе отправлять даже если указан Excel ?
31. Nicholas 902 30.07.14 09:13 Сейчас в теме
(30) Для снижения траффика и нагрузки на почтовые сервера. При необходимости можно легко доработать это и сделать архивирование опцией.
32. AlexGS 28.11.14 14:17 Сейчас в теме
Под ЗКБУ работать будет?
33. Nicholas 902 28.11.14 16:12 Сейчас в теме
34. b-dm 174 18.12.15 13:20 Сейчас в теме
Планируется ли поддерживать, дорабатывать публикацию ?))
35. Nicholas 902 19.12.15 17:47 Сейчас в теме
Готов доработать под ваши требования и любую конфигурацию. Стоимость и сроки обсуждаемы.
36. b-dm 174 24.12.15 11:32 Сейчас в теме
Пишет ошибку, но отсылает :)
37. Swetlana 26 13.11.17 12:52 Сейчас в теме
Обработка еще работоспособна?)
38. Nicholas 902 13.11.17 17:14 Сейчас в теме
(37) Да, у меня в одной базе до сих пор работает.
39. ninch 51 31.03.18 10:57 Сейчас в теме
Спасибо. Все работает. Версию 3 пользую
40. гаврюша 3 24.05.19 15:01 Сейчас в теме
Спасибо за обработку. Очень классная, выручила. Работает на УПП релиз 1.3.121.2
Может кто подскажет как в zip добавить пароль, чтобы прочитать мог только получатель, который знает пароль архива?
Оставьте свое сообщение