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

08.08.13

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

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

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

Наименование Файл Версия Размер
PaySlips3.epf
.epf 28,45Kb
271
.epf 28,45Kb 271 Скачать бесплатно
PaySlips2.epf
.epf 28,59Kb
91
.epf 28,59Kb 91 Скачать бесплатно
PaySlips.epf
.epf 21,69Kb
90
.epf 21,69Kb 90 Скачать бесплатно

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

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

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

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

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

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

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

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

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

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

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

Расчетные листки формируются с использованием алгоритмов отчета «Расчетные листки организации» типовой конфигурации 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, ЗУП 2.5, БУХ 2.0: НДС, ЕФС-1, Расчет страховых взносов, Мобилизация, Статистика, Электронные трудовые книжки, 2-НДФЛ, Регламентированная отчетность, Кадровый учет, Прослеживаемость импортных товаров

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

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

19900 руб.

01.04.2020    140622    678    352    

232

Перенос данных из Парус 8 в ЗГУ 3

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

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

84000 руб.

19.08.2020    22447    19    1    

22

SALE! 20%

Перенос данных из Камин 3.5 (5.5) в ЗиКГУ 3.х

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

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

12000 9600 руб.

28.07.2016    57079    140    139    

116

Запрет доступа к данным по зарплате для БП 3.0 и КА 2.5

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

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

5700 руб.

27.05.2021    32730    204    89    

165

Исправление в 1С:ЗУП/ЗКГУ ошибок по НДФЛ и взаиморасчетам с сотрудниками на начало расчетного года.

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

Обработка исправляет технические ошибки по НДФЛ, взаиморасчетам с сотрудниками в 1С:ЗУП (1С:ЗКГУ) на начало года. Фактически все ошибки, которые проявляются в ведомостях на выплату, расчетных листках, при заполнении ведомостей на выплату и отчетах 6-НДФЛ и т.д. нужно начинать исправлять с начала расчетного года. Это позволит быть уверенными, что после завершения расчетов предыдущего года, начали работать с «чистого листа» без ошибочных остатков.

4800 руб.

06.10.2023    2320    29    15    

33

"Акты сверки +" Групповая подготовка и рассылка актов сверки для Бухгалтерии 3.0.

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

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

3000 руб.

25.11.2020    22071    162    4    

148

Устранение сальдо прошлых периодов в ведомостях ЗУП 3.1, КА, ЗиКГУ 3.1

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

При заполнении ведомости на выплату зарплаты вылазят задолженности прошлых периодов, которых быть не должно? Наша обработка позволяется убрать эти доходы прошлых периодов за пару секунд. Больше не нужно тратить часы на анализ каждого такого случая.

15600 руб.

14.09.2022    12591    60    22    

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

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

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

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

Простите, для меня наверное это сложно.....как это "закомментировал эту строку".
Что должно быть написано, чтобы исправить эту ошибку?
16. Mx00 247 21.02.13 12:50 Сейчас в теме
(15) это относится к программированию, нужно открыть конфигуратор и там уже разбираться с модулями. т.к. обработка не моя, то более конкретно не отвечу, вспоминать лень, а обучение программированию не мой конёк
21. Nicholas 887 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 887 27.11.12 12:58 Сейчас в теме
(10) Спасибо. Тоже была мысль сделать такую настройку. Обязательно реализую это позже.
12. RakovskiyK 24.12.12 16:52 Сейчас в теме
(11) приветствую вопрос: появились ли какие нибудь обновления в сей прекрасной обработке?

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

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