Поделюсь опытом, как было автоматизировано создание сотрудников и пользователей в Документооборот 3 при помощи бизнес-событий и без доработки конфигурации. Реализовано в Документооборот КОРП, редакция 3.0 (3.0.13.30).
Необходимо, чтобы были настроены правила бесшовной интеграции для кадровых документов (прием, перевод, увольнение)
Все настройки производятся на стороне ДО
1. Вид документа "Прием на работу" с набором дополнительных реквизитов
2. Настраиваем правила интеграции
3. Добавляем дополнительный обработчик бизнес-события (весь код будет в конце статьи)
Добавляем подписку для вида события "Документы: изменение документа"
Собственно всё. При попадании кадрового документа в документооборот будет срабатывать дополнительный обработчик.
Дополнительные обработчики бизнес-событий:
Попытка
Документ = Событие.Источник.Ссылка;
РеквизитыДокумента = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Документ, "ДатаНачалаДействия,ДатаОкончанияДействия,ВидДокумента");
Если РеквизитыДокумента.ВидДокумента = Справочники.ВидыДокументов.НайтиПоНаименованию("Приказ о приеме на работу") Тогда
ПараметрыАлгоритма = Новый Структура("Документ", Документ);
ПараметрыСозданияСотрудника = Справочники.Алгоритмы.Вызвать("ПараметрыСозданияСотрудникаПоКадровомуДокументу", ПараметрыАлгоритма);
// Найти или создать сотрудника, Заполнить контактуню информацию, создать пользователя
ПараметрыАлгоритма = Новый Структура("ПараметрыЗаполнения", ПараметрыСозданияСотрудника);
Сотрудник = Справочники.Алгоритмы.Вызвать("НайтиСоздатьСотрудникаПоКадровомуДокументу", ПараметрыАлгоритма);
// Дополнительные обработчики
// Внешняя обработка используется из-за того, что она же используется для выполнения регламентных заданий
ОбработкаСсылка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоРеквизиту("ИмяОбъекта", "РегламентныеЗаданияДокументооборот3");
Если НЕ ОбработкаСсылка.Пустая() Тогда
// Заполнить контактуню информацию по данным из AD и кадровой базы
ПараметрыКоманды = Новый Структура;
ПараметрыКоманды.Вставить("ДополнительнаяОбработкаСсылка", ОбработкаСсылка);
ПараметрыКоманды.Вставить("Сотрудник", Сотрудник);
ПараметрыКоманды.Вставить("ИдентификаторКоманды", "ОбновлениеКонтактнойИнформацииСотрудников");
ДополнительныеОтчетыИОбработки.ВыполнитьКоманду(ПараметрыКоманды);
// Если сотрудник имеет ученую запись в AD, тогда создать пользователя
ПараметрыКоманды.Вставить("ИдентификаторКоманды", "СоздатьПользователей");
ДополнительныеОтчетыИОбработки.ВыполнитьКоманду(ПараметрыКоманды);
КонецЕсли;
КонецЕсли;
Исключение
ИнфОбОшибке = ИнформацияОбОшибке();
ТекстСообщения = "Событие: " + ТипЗнч(Событие) + " - " + Событие + Символы.ПС;
ТекстСообщения = ТекстСообщения + "Источник: " + ТипЗнч(Событие.Источник) + " - " + Событие.Источник + Символы.ПС;
ТекстСообщения = ТекстСообщения + "Ссылка: " + ТипЗнч(Событие.Источник.Ссылка) + " - " + Событие.Источник.Ссылка + Символы.ПС;
ТекстСообщения = ТекстСообщения + "Ошибка: " + ИнфОбОшибке.Описание;
ЗаписьЖурналаРегистрации("Дополнительные обработчики бизес-событий. Обработка приема на работу", УровеньЖурналаРегистрации.Ошибка,,, ТекстСообщения);
КонецПопытки;
Попытка
Документ = Событие.Источник.Ссылка;
РеквизитыДокумента = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Документ, "ДатаНачалаДействия,ДатаОкончанияДействия,ВидДокумента");
Если РеквизитыДокумента.ВидДокумента = Справочники.ВидыДокументов.НайтиПоНаименованию("Приказ о переводе") Тогда
ПараметрыАлгоритма = Новый Структура("Документ", Документ);
ПараметрыСозданияСотрудника = Справочники.Алгоритмы.Вызвать("ПараметрыСозданияСотрудникаПоКадровомуДокументу", ПараметрыАлгоритма);
// Сотрудник с предыдущей должности/подразделения завершает работу. Устанавливается дата окончания действия
ПараметрыСотрудникаПредыдущий = Новый Структура();
ПараметрыСотрудникаПредыдущий.Вставить("Владелец" , ПараметрыСозданияСотрудника.Владелец);
ПараметрыСотрудникаПредыдущий.Вставить("Должность" , ПараметрыСозданияСотрудника.ДолжностьПрошлая);
ПараметрыСотрудникаПредыдущий.Вставить("Подразделение" , ПараметрыСозданияСотрудника.ПодразделениеПрошлое);
ПараметрыАлгоритма = Новый Структура("ПараметрыЗаполнения", ПараметрыСотрудникаПредыдущий);
Сотрудник = Справочники.Алгоритмы.Вызвать("НайтиСоздатьСотрудникаПоКадровомуДокументу", ПараметрыАлгоритма);
Если НЕ Сотрудник.Пустая() Тогда
СотрудникОбъект = Сотрудник.ПолучитьОбъект();
СотрудникОбъект.ДатаОкончанияДействия = НачалоДня(ПараметрыСозданияСотрудника.ДатаНачалаДействия) - 1;
СотрудникОбъект.Записать();
КонецЕсли;
// Найти или создать сотрудника, Заполнить контактуню информацию, создать пользователя
ПараметрыАлгоритма = Новый Структура("ПараметрыЗаполнения", ПараметрыСозданияСотрудника);
Сотрудник = Справочники.Алгоритмы.Вызвать("НайтиСоздатьСотрудникаПоКадровомуДокументу", ПараметрыАлгоритма);
// Дополнительные обработчики
// Внешняя обработка используется из-за того, что она же используется для выполнения регламентных заданий
ОбработкаСсылка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоРеквизиту("ИмяОбъекта", "РегламентныеЗаданияДокументооборот3");
Если НЕ ОбработкаСсылка.Пустая() Тогда
// Заполнить контактуню информацию по данным из AD и кадровой базы
ПараметрыКоманды = Новый Структура;
ПараметрыКоманды.Вставить("ДополнительнаяОбработкаСсылка", ОбработкаСсылка);
ПараметрыКоманды.Вставить("Сотрудник", Сотрудник);
ПараметрыКоманды.Вставить("ИдентификаторКоманды", "ОбновлениеКонтактнойИнформацииСотрудников");
ДополнительныеОтчетыИОбработки.ВыполнитьКоманду(ПараметрыКоманды);
// Если сотрудник имеет ученую запись в AD, тогда создать пользователя
ПараметрыКоманды.Вставить("ИдентификаторКоманды", "СоздатьПользователей");
ДополнительныеОтчетыИОбработки.ВыполнитьКоманду(ПараметрыКоманды);
КонецЕсли;
КонецЕсли;
Исключение
ИнфОбОшибке = ИнформацияОбОшибке();
ТекстСообщения = "Событие: " + ТипЗнч(Событие) + " - " + Событие + Символы.ПС;
ТекстСообщения = ТекстСообщения + "Источник: " + ТипЗнч(Событие.Источник) + " - " + Событие.Источник + Символы.ПС;
ТекстСообщения = ТекстСообщения + "Ссылка: " + ТипЗнч(Событие.Источник.Ссылка) + " - " + Событие.Источник.Ссылка + Символы.ПС;
ТекстСообщения = ТекстСообщения + "Ошибка: " + ПодробноеПредставлениеОшибки(ИнфОбОшибке);
ЗаписьЖурналаРегистрации("Дополнительные обработчики бизес-событий. Обработка приказа о переводе", УровеньЖурналаРегистрации.Ошибка,,, ТекстСообщения);
КонецПопытки;
Попытка
Документ = Событие.Источник.Ссылка;
РеквизитыДокумента = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Документ, "ДатаНачалаДействия,ДатаОкончанияДействия,ВидДокумента");
Если РеквизитыДокумента.ВидДокумента = Справочники.ВидыДокументов.НайтиПоНаименованию("Приказ на увольнение") Тогда
ПараметрыАлгоритма = Новый Структура("Документ", Документ);
ПараметрыСозданияСотрудника = Справочники.Алгоритмы.Вызвать("ПараметрыСозданияСотрудникаПоКадровомуДокументу", ПараметрыАлгоритма);
// Сотрудник увольняется. Устанавливается дата окончания действия
ПараметрыАлгоритма = Новый Структура("ПараметрыЗаполнения", ПараметрыСозданияСотрудника);
Сотрудник = Справочники.Алгоритмы.Вызвать("НайтиСоздатьСотрудникаПоКадровомуДокументу", ПараметрыАлгоритма);
Если НЕ Сотрудник.Пустая() Тогда
СотрудникОбъект = Сотрудник.ПолучитьОбъект();
СотрудникОбъект.ДатаОкончанияДействия = НачалоДня(ПараметрыСозданияСотрудника.ДатаОкончанияДействия);
СотрудникОбъект.Записать();
КонецЕсли;
КонецЕсли;
Исключение
ИнфОбОшибке = ИнформацияОбОшибке();
ТекстСообщения = "Событие: " + ТипЗнч(Событие) + " - " + Событие + Символы.ПС;
ТекстСообщения = ТекстСообщения + "Источник: " + ТипЗнч(Событие.Источник) + " - " + Событие.Источник + Символы.ПС;
ТекстСообщения = ТекстСообщения + "Ссылка: " + ТипЗнч(Событие.Источник.Ссылка) + " - " + Событие.Источник.Ссылка + Символы.ПС;
ТекстСообщения = ТекстСообщения + "Ошибка: " + ИнфОбОшибке.Описание;
ЗаписьЖурналаРегистрации("Дополнительные обработчики бизес-событий. Обработка увольнения", УровеньЖурналаРегистрации.Ошибка,,, ТекстСообщения);
КонецПопытки;
Если ТипЗнч(Параметры) <> Тип("Структура") Тогда
ВызватьИсключение(СтрШаблон(
НСтр("ru = 'Неверный тип ""%1"" переменной ""Параметры"". Ожидается Структура.'"),
ТипЗнч(Параметры)));
КонецЕсли;
Если Не Параметры.Свойство("Документ") Тогда
ВызватьИсключение(
НСтр("ru = 'В параметрах алгоритма отсутствует обязательное свойство ""Документ""'"));
КонецЕсли;
ДокументПредприятия = Параметры.Документ;
РеквизитыДокумента = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДокументПредприятия, "ВидДокумента,ДатаНачалаДействия,ДатаОкончанияДействия");
// и кадровых документов может отличаться набор дополнительных реквизитов
// Общие реквизиты для всех кадровых документов
ФизическоеЛицо = УправлениеСвойствами.ЗначениеСвойства(ДокументПредприятия, ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Сотрудник_ФизЛицо"));
// Прием
Должность = УправлениеСвойствами.ЗначениеСвойства(ДокументПредприятия, ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Сотрудник_Должность"));
Подразделение = УправлениеСвойствами.ЗначениеСвойства(ДокументПредприятия, ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Сотрудник_Подразделение"));
// Перевод
ДолжностьПрошлая = УправлениеСвойствами.ЗначениеСвойства(ДокументПредприятия, ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "ДолжностьСотрудникаПредыдущая"));
ПодразделениеПрошлое = УправлениеСвойствами.ЗначениеСвойства(ДокументПредприятия, ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "ПодразделениеСотрудникаПредыдущее"));
// Увольнение
ПараметрыЗаполнения = Новый Структура("Владелец,Должность,Подразделение,ДатаНачалаДействия,ДатаОкончанияДействия,Действует,ПредставлениеВДокументах,ПредставлениеВПереписке");
// Параметры будут зависеть от вида документа
Если РеквизитыДокумента.ВидДокумента = Справочники.ВидыДокументов.НайтиПоНаименованию("Приказ о приеме на работу") Тогда
ПараметрыЗаполнения.Владелец = ФизическоеЛицо;
ПараметрыЗаполнения.Должность = Должность;
ПараметрыЗаполнения.Подразделение = Подразделение;
ПараметрыЗаполнения.ДатаНачалаДействия = РеквизитыДокумента.ДатаНачалаДействия;
ПараметрыЗаполнения.ДатаОкончанияДействия = РеквизитыДокумента.ДатаОкончанияДействия;
ПараметрыЗаполнения.ПредставлениеВДокументах = "1";
ПараметрыЗаполнения.ПредставлениеВПереписке = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ФизическоеЛицо, "Наименование");
ИначеЕсли РеквизитыДокумента.ВидДокумента = Справочники.ВидыДокументов.НайтиПоНаименованию("Приказ о переводе") Тогда
ПараметрыЗаполнения.Владелец = ФизическоеЛицо;
ПараметрыЗаполнения.Должность = Должность;
ПараметрыЗаполнения.Подразделение = Подразделение;
ПараметрыЗаполнения.ДатаНачалаДействия = РеквизитыДокумента.ДатаНачалаДействия;
ПараметрыЗаполнения.ДатаОкончанияДействия = РеквизитыДокумента.ДатаОкончанияДействия;
ПараметрыЗаполнения.ПредставлениеВДокументах = "1";
ПараметрыЗаполнения.ПредставлениеВПереписке = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ФизическоеЛицо, "Наименование");
ПараметрыЗаполнения.Вставить("ДолжностьПрошлая", ДолжностьПрошлая);
ПараметрыЗаполнения.Вставить("ПодразделениеПрошлое", ПодразделениеПрошлое);
ИначеЕсли РеквизитыДокумента.ВидДокумента = Справочники.ВидыДокументов.НайтиПоНаименованию("Приказ на увольнение") Тогда
ПараметрыЗаполнения.Владелец = ФизическоеЛицо;
ПараметрыЗаполнения.Должность = Должность;
ПараметрыЗаполнения.Подразделение = Подразделение;
ПараметрыЗаполнения.ДатаНачалаДействия = РеквизитыДокумента.ДатаНачалаДействия;
ПараметрыЗаполнения.ДатаОкончанияДействия = РеквизитыДокумента.ДатаОкончанияДействия;
Иначе
ВызватьИсключение(СтрШаблон(
НСтр("ru = 'Не найден вид документа ""%1"".'"),
РеквизитыДокумента.ВидДокумента));
КонецЕсли;
Результат = ПараметрыЗаполнения;
ПараметрыЗаполнения = Параметры.ПараметрыЗаполнения;
Ссылка = Справочники.Сотрудники.ПустаяСсылка();
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Подразделение", ПараметрыЗаполнения.Подразделение);
Запрос.УстановитьПараметр("Должность", ПараметрыЗаполнения.Должность);
Запрос.УстановитьПараметр("Владелец", ПараметрыЗаполнения.Владелец);
Запрос.Текст = "ВЫБРАТЬ
| Сотрудники.Ссылка КАК Ссылка
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.Владелец = &Владелец
| И Сотрудники.Должность = &Должность
| И Сотрудники.Подразделение = &Подразделение";
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
СотрудникОбъект = Справочники.Сотрудники.СоздатьЭлемент();
СотрудникОбъект.Заполнить(ПараметрыЗаполнения);
СотрудникОбъект.ДополнительныеСвойства.Вставить("ЭтоНовый", Истина);
СотрудникОбъект.ДополнительныеСвойства.Вставить("ЗначениеИзменено", Истина);
СтарыеКонтейнеры = РегистрыСведений.СотрудникиВКонтейнерах.КонтейнерыСотрудников(СотрудникОбъект.Ссылка);
СотрудникОбъект.ДополнительныеСвойства.Вставить("СтарыеКонтейнеры", СтарыеКонтейнеры);
СотрудникОбъект.Записать();
РегистрыСведений.СотрудникиВКонтейнерах.ОбновитьДанныеПолностью();
Ссылка = СотрудникОбъект.Ссылка;
Иначе
ВыборкаСотрудник = РезультатЗапроса.Выбрать();
Если ВыборкаСотрудник.Следующий() Тогда
СотрудникОбъект = ВыборкаСотрудник.Ссылка.ПолучитьОбъект();
СотрудникОбъект.ДополнительныеСвойства.Вставить("ЭтоНовый", Ложь);
СотрудникОбъект.ДополнительныеСвойства.Вставить("ЗначениеИзменено", Истина);
СтарыеКонтейнеры = РегистрыСведений.СотрудникиВКонтейнерах.КонтейнерыСотрудников(СотрудникОбъект.Ссылка);
СотрудникОбъект.ДополнительныеСвойства.Вставить("СтарыеКонтейнеры", СтарыеКонтейнеры);
СотрудникОбъект.Записать();
Ссылка = СотрудникОбъект.Ссылка;
КонецЕсли;
КонецЕсли;
Результат = Ссылка;
Не подойдет для всех, так как используется самописная конфигурация с опубликованным веб-сервисом, код для примера
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения = Неопределено) Экспорт
Если ИдентификаторКоманды = "ОбновлениеКонтактнойИнформацииСотрудников" Тогда
Выполнить_ОбновлениеКонтактнойИнформацииСотрудников(ПараметрыВыполнения);
КонецЕсли;
Если ИдентификаторКоманды = "СоздатьПользователей" Тогда
Выполнить_СозданиеПользователей(ПараметрыВыполнения);
КонецЕсли;
КонецПроцедуры
Процедура Выполнить_ОбновлениеКонтактнойИнформацииСотрудников(ПараметрыВыполнения)
// Обновляемая контактная информация:
// - Электронная почта
// - Телефон
// - Мобильный телефон - служебный выданный
// - Мобильный телефон - лично-рабочий (например, у водителей)
ТипыКИ = Новый Массив;
ТипыКИ.Добавить(Перечисления.ТипыКонтактнойИнформации.Телефон);
ТипыКИ.Добавить(Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
ВидыКИ = Новый Массив;
ВидыКИ.Добавить(Справочники.ВидыКонтактнойИнформации.ТелефонСотрудника);
ВидыКИ.Добавить(Справочники.ВидыКонтактнойИнформации.EmailСотрудника);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВидыКонтактнойИнформации.Ссылка КАК Ссылка
|ИЗ
| Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
|ГДЕ
| ВидыКонтактнойИнформации.ИдентификаторДляФормул ПОДОБНО &ИдентификаторДляФормул";
Запрос.УстановитьПараметр("ИдентификаторДляФормул", "МобильныйТелефонСлужебный");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
ВидКИ_МобильныйТелефонСлужебный = ВыборкаДетальныеЗаписи.Ссылка;
ВидыКИ.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Сотрудник,
| Сотрудники.Владелец КАК ФизическоеЛицо,
| УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Сотрудники.Владелец) КАК ФизЛицо_УникальныйИдентификатор,
| ЕСТЬNULL(СотрудникиДополнительныеРеквизиты.Значение, ЛОЖЬ) КАК Значение
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники.ДополнительныеРеквизиты КАК СотрудникиДополнительныеРеквизиты
| ПО Сотрудники.Ссылка = СотрудникиДополнительныеРеквизиты.Ссылка
| И (СотрудникиДополнительныеРеквизиты.Свойство.Имя = ""СлужебныйПользовательСотрудник"")
|ГДЕ
| НЕ ЕСТЬNULL(СотрудникиДополнительныеРеквизиты.Значение, ЛОЖЬ) = ИСТИНА";
Если ТипЗнч(ПараметрыВыполнения) = Тип("Структура") И ПараметрыВыполнения.Свойство("Сотрудник") Тогда
Запрос.УстановитьПараметр("Сотрудник", ПараметрыВыполнения.Сотрудник);
Запрос.Текст = Запрос.Текст + "
| И Сотрудники.Ссылка = &Сотрудник";
КонецЕсли;
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ОтборКИ = УправлениеКонтактнойИнформацией.ОтборКонтактнойИнформации();
ОтборКИ.ТипыКонтактнойИнформации = ТипыКИ;
ОтборКИ.ВидыКонтактнойИнформации = ВидыКИ;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КонтактнаяИнформацияСотрудника = УправлениеКонтактнойИнформацией.КонтактнаяИнформация(ВыборкаДетальныеЗаписи.Сотрудник, ОтборКИ);
КонтактнаяИнформацияКУдалению = Новый Массив;
Попытка
// Имеется самописная конфигурация для хранения обобщенной информации о сотрудниках
ДанныеСотрудника = ПолучитьДанныеСотрудника_ВебСервис(ВыборкаДетальныеЗаписи.ФизическоеЛицо);
Если ДанныеСотрудника = Неопределено Тогда
Продолжить;
КонецЕсли;
#Область ЭлектроннаяПочта
ТипКИ = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
ВидКИ = Справочники.ВидыКонтактнойИнформации.EmailСотрудника;
СтрокаКИ = КонтактнаяИнформацияСотрудника.Найти(ВидКИ);
ОбновитьКонтактнуюИнформациюСотрудника(ВыборкаДетальныеЗаписи.Сотрудник, ДанныеСотрудника.Email, СтрокаКИ, ТипКИ, ВидКИ,
КонтактнаяИнформацияКУдалению);
#КонецОбласти
#Область Телефоны
ТипКИ = Перечисления.ТипыКонтактнойИнформации.Телефон;
ВидКИ = Справочники.ВидыКонтактнойИнформации.ТелефонСотрудника;
СтрокаКИ = КонтактнаяИнформацияСотрудника.Найти(ВидКИ);
ОбновитьКонтактнуюИнформациюСотрудника(ВыборкаДетальныеЗаписи.Сотрудник, ДанныеСотрудника.Телефон, СтрокаКИ, ТипКИ, ВидКИ,
КонтактнаяИнформацияКУдалению);
Если Не ВидКИ_МобильныйТелефонСлужебный = Неопределено Тогда
ТипКИ = Перечисления.ТипыКонтактнойИнформации.Телефон;
ВидКИ = ВидКИ_МобильныйТелефонСлужебный;
СтрокаКИ = КонтактнаяИнформацияСотрудника.Найти(ВидКИ);
ОбновитьКонтактнуюИнформациюСотрудника(ВыборкаДетальныеЗаписи.Сотрудник, ДанныеСотрудника.ТелефонМ, СтрокаКИ, ТипКИ, ВидКИ,
КонтактнаяИнформацияКУдалению);
КонецЕсли;
#КонецОбласти
Исключение
// Не загружаем, если ошибка, чтобы не пришлось потом удалять лишних пользователей
ТекстОшибки = ОписаниеОшибки();
ЗаписьЖурналаРегистрации("Регламентные задания. Получение данных сотрудника из веб-сервиса", УровеньЖурналаРегистрации.Ошибка, , ,
ТекстОшибки);
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Процедура ОбновитьКонтактнуюИнформациюСотрудника(Знач Сотрудник, ТекущееЗначение, Знач СтрокаКИ, ТипКонтактнойИнформации, ВидКонтактнойИнформации,
КонтактнаяИнформацияКУдалению)
Перем Структура;
Если СтрокаКИ = Неопределено Тогда
Структура = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеНовойКонтактнойИнформации(ТипКонтактнойИнформации);
Структура.value = ТекущееЗначение;
УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию(Сотрудник, Структура, ВидКонтактнойИнформации);
Иначе
Если Не ТекущееЗначение = СтрокаКИ.Представление Тогда
Структура = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеНовойКонтактнойИнформации(ТипКонтактнойИнформации);
Структура.value = ТекущееЗначение;
УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию(Сотрудник, Структура, ВидКонтактнойИнформации);
КонтактнаяИнформацияКУдалению.Добавить(СтрокаКИ);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Аналогично, данные физического лица берутся из самописной конфигурации через веб-сервис
Процедура Выполнить_СозданиеПользователей(ПараметрыВыполнения)
АктуализироватьПользователейСотрудников(ПараметрыВыполнения);
ОтправлятьУведомления = РегистрыСведений.ГУОВ_ЗначенияНастроекПрограммы.ЗначениеНастройки(
Справочники.ГУОВ_НастройкиПрограммы.ОтправлятьУведомлениямПользователям);
Если ОтправлятьУведомления = Неопределено Тогда
ОтправлятьУведомления = Ложь;
КонецЕсли;
// 1. Отбор сотрудников, у которых не создан пользователь
// 2. Создать пользователя
// 3. Оповестить пользователя о созданной учетной записи и сообщить пароль
// 4. Оповестить администраторов о созданной учетной записи пользователя
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Сотрудник,
| Сотрудники.Наименование КАК Наименование,
| Сотрудники.Владелец КАК ФизическоеЛицо,
| ЕСТЬNULL(Пользователи.Ссылка, ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)) КАК Пользователь
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи
| ПО Сотрудники.Владелец = Пользователи.ФизЛицо
|ГДЕ
| НЕ Сотрудники.ДатаНачалаДействия = ДАТАВРЕМЯ(1, 1, 1)
| И Сотрудники.ДатаОкончанияДействия = ДАТАВРЕМЯ(1, 1, 1)
| И ЕСТЬNULL(Пользователи.Ссылка, ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)";
// ОТЛАДКА
Если ТипЗнч(ПараметрыВыполнения) = Тип("Структура") И ПараметрыВыполнения.Свойство("Сотрудник") Тогда
Запрос.УстановитьПараметр("Сотрудник", ПараметрыВыполнения.Сотрудник);
Запрос.Текст = Запрос.Текст + "
| И Сотрудники.Ссылка = &Сотрудник";
КонецЕсли;
// ------
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ФизическоеЛицо = ВыборкаДетальныеЗаписи.ФизическоеЛицо;
//Если Ложь Тогда ФизическоеЛицо = Справочники.ФизическиеЛица.ПустаяСсылка(); КонецЕсли;
ДанныеСотрудника = ПолучитьДанныеСотрудникаИзВебСервиса(ФизическоеЛицо);
Если Не ЗначениеЗаполнено(ДанныеСотрудника.Email) Тогда
Продолжить;
КонецЕсли;
ОписаниеПользователяИБ = НачальноеОписаниеПользователяИБ();
ОписаниеПользователяИБ.Имя = ПользователиСлужебныйКлиентСервер.ПолучитьКраткоеИмяПользователяИБ(ВыборкаДетальныеЗаписи.Наименование);
ОписаниеПользователяИБ.ПолноеИмя = ВыборкаДетальныеЗаписи.Наименование;
Попытка
ДанныеФизЛица = ПолучитьДанныеСотрудника_ВебСервис(ВыборкаДетальныеЗаписи.ФизическоеЛицо);
ОписаниеПользователяИБ.Вставить("ПользовательОС", ДанныеФизЛица.AD);
Исключение
ЗаписьЖурналаРегистрации("Регламентные задания. Создание пользователей", УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось получить данные физ.лица из веб-сервиса. " + ОписаниеОшибки());
КонецПопытки;
ОписаниеПользователяИБ.Вставить("Действие", "Записать");
НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент();
НовыйПользователь.Наименование = ВыборкаДетальныеЗаписи.Наименование;
НовыйПользователь.ФизЛицо = ФизическоеЛицо;
НовыйПользователь.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ);
НачатьТранзакцию();
Попытка
НовыйПользователь.Записать();
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(НовыйПользователь.ИдентификаторПользователяИБ);
ПользовательИБ.АутентификацияТокеномДоступа = Истина;
ПользовательИБ.Записать();
// Копирование настроек от образцового пользователя (Portal)
СкопироватьНастройкиПользователю(НовыйПользователь.Ссылка, ФизическоеЛицо);
// Заполнение служебных регистров
РегистрыСведений.СотрудникиПользователей.ДобавитьЗапись(НовыйПользователь.Ссылка, ВыборкаДетальныеЗаписи.Сотрудник);
РегистрыСведений.ОсновныеСотрудники.УстановитьОсновногоСотрудника(ВыборкаДетальныеЗаписи.ФизическоеЛицо, ВыборкаДетальныеЗаписи.Сотрудник);
УстановитьТребованиеУстановкиПароля(НовыйПользователь.Ссылка);
Если ОтправлятьУведомления И ЗначениеЗаполнено(ДанныеФизЛица.Email) Тогда
// У сотрудника уже должна быть заполнена контактная информация
ОтправитьУведомление(ДанныеФизЛица.Email, ОписаниеПользователяИБ.Имя);
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ЗаписьЖурналаРегистрации("Регламентные задания. Создание пользователей", УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось записать пользователя. " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
// Для обновления прав доступа
РегистрыСведений.СотрудникиВКонтейнерах.ОбновитьДанныеПолностью();
КонецПроцедуры
В алгоритмах и обработчиках используется вызов внешней обработки, так как она появилась сильно раньше, чем удалось разобраться в алгоритмах и, так как код внешней обработки уже был проверен и отлажен, то проще вызывать её, чем копировать код