Допустим что перед нами стоит задача выгрузить фотографии сотрудников из 1с в ActiveDirectory.
Начнем с создания подключения к AD.
// Подключимся к AD
Попытка
oConnect = ПолучитьCOMОбъект("","ADODB.Connection");
oConnect.Provider = "ADSDSOObject";
oConnect.Properties("User ID").Value = "ВашАдминскийЮзер";
oConnect.Properties("Password").Value = "ЕгоПароль";
oConnect.Properties("Encrypt Password").Value = True;
oConnect.Open("Active Directory Provider");
Исключение
Возврат;
КонецПопытки;
Попытка
oConnect = ПолучитьCOMОбъект("","ADODB.Connection");
oConnect.Provider = "ADSDSOObject";
oConnect.Properties("User ID").Value = "ВашАдминскийЮзер";
oConnect.Properties("Password").Value = "ЕгоПароль";
oConnect.Properties("Encrypt Password").Value = True;
oConnect.Open("Active Directory Provider");
Исключение
Возврат;
КонецПопытки;
Затем необходимо прочитать фото в 1с. Для этого я пользовалась своим РегистромСведений ИзменениеФотоФизЛица, который заполняется каждый раз при изменении фото у физ лица. Вы можете напрямую смотреть в карточке физ лица
// Список записанных фото
СписокФотоФизЛиц = Новый СписокЗначений;
// Прочитаем регистр изменений фотографий физ. лиц
ИзменениеФотоФизЛица = РегистрыСведений.ИзменениеФотоФизЛица.СоздатьНаборЗаписей();
ИзменениеФотоФизЛица.Прочитать();
Для каждого ФотоФизЛица Из ИзменениеФотоФизЛица Цикл
Записали = Ложь;
// Получить имя временного файла
ИмяФайла = ПолучитьИмяВременногоФайла();
мТекущееИзображение = ФотоФизЛица.Фото.Хранилище.Получить();
// Страховой номер ПФР является поисковым реквизитом
НомерПФР = ФотоФизЛица.Физлицо.СтраховойНомерПФР;
Если Не ПустаяСтрока(НомерПФР) И мТекущееИзображение <> Неопределено Тогда
мТекущееИзображение.Записать(ИмяФайла);
СписокФотоФизЛиц = Новый СписокЗначений;
// Прочитаем регистр изменений фотографий физ. лиц
ИзменениеФотоФизЛица = РегистрыСведений.ИзменениеФотоФизЛица.СоздатьНаборЗаписей();
ИзменениеФотоФизЛица.Прочитать();
Для каждого ФотоФизЛица Из ИзменениеФотоФизЛица Цикл
Записали = Ложь;
// Получить имя временного файла
ИмяФайла = ПолучитьИмяВременногоФайла();
мТекущееИзображение = ФотоФизЛица.Фото.Хранилище.Получить();
// Страховой номер ПФР является поисковым реквизитом
НомерПФР = ФотоФизЛица.Физлицо.СтраховойНомерПФР;
Если Не ПустаяСтрока(НомерПФР) И мТекущееИзображение <> Неопределено Тогда
мТекущееИзображение.Записать(ИмяФайла);
Как вы заметили Страховой номер у меня это уникальный идентификатор, т.е. в AD в EmployeeID должно быть равно номеру ПФР.
Для помещения картинки в AD она должна соответствовать размеру (не более 10 К и ширина, высота - 96). Для изменения размера картинки воспользуемся стандартной библиотекой Windows Image Acquisition Automation Library (в Windows 7 входит в состав дистрибутива). Библиотеку wiaaut.dll придется зарегистрировать командой regsvr32.
Попытка
Фото = Новый COMОбъект("WIA.ImageFile");
Процессор = Новый COMОбъект("WIA.ImageProcess");
Фото.LoadFile(ИмяФайла);
Если Окр(Фото.FileData.Count / 1024, 2) > 10 Тогда //Сравниваем размер файла
Процессор.Filters.Add(Процессор.FilterInfos("Scale").FilterID);
Процессор1 = Процессор.Filters(1);
Для К = 1 По Процессор1.Properties.Count Цикл
Если Процессор1.Properties(К).Name = "MaximumWidth" Тогда
Процессор1.Properties(К).Value = 96; //Задаем ширину
КонецЕсли;
Если Процессор1.Properties(К).Name = "MaximumHeight" Тогда
Процессор1.Properties(К).Value = 96; //Задаем высоту
КонецЕсли;
КонецЦикла;
Фото = Процессор.Apply(Фото);
КонецЕсли;
ИмяФайла = Лев(ИмяФайла, СтрДлина(ИмяФайла) - 4) + ".jpg";
Фото.SaveFile(ИмяФайла);
Фото = Новый COMОбъект("ADODB.Stream");
Фото.Type = 1;
Фото.Open();
Фото.LoadFromFile(ИмяФайла);
Исключение
Сообщить("Возникла проблема " + ОписаниеОшибки());
КонецПопытки;
Фото = Новый COMОбъект("WIA.ImageFile");
Процессор = Новый COMОбъект("WIA.ImageProcess");
Фото.LoadFile(ИмяФайла);
Если Окр(Фото.FileData.Count / 1024, 2) > 10 Тогда //Сравниваем размер файла
Процессор.Filters.Add(Процессор.FilterInfos("Scale").FilterID);
Процессор1 = Процессор.Filters(1);
Для К = 1 По Процессор1.Properties.Count Цикл
Если Процессор1.Properties(К).Name = "MaximumWidth" Тогда
Процессор1.Properties(К).Value = 96; //Задаем ширину
КонецЕсли;
Если Процессор1.Properties(К).Name = "MaximumHeight" Тогда
Процессор1.Properties(К).Value = 96; //Задаем высоту
КонецЕсли;
КонецЦикла;
Фото = Процессор.Apply(Фото);
КонецЕсли;
ИмяФайла = Лев(ИмяФайла, СтрДлина(ИмяФайла) - 4) + ".jpg";
Фото.SaveFile(ИмяФайла);
Фото = Новый COMОбъект("ADODB.Stream");
Фото.Type = 1;
Фото.Open();
Фото.LoadFromFile(ИмяФайла);
Исключение
Сообщить("Возникла проблема " + ОписаниеОшибки());
КонецПопытки;
Ну а теперь находим пользователя в AD и записываем ему фото:
Query = "SELECT Name, sAMAccountName, ADsPath FROM 'LDAP://Домен/DC=ВашСервер,DC=ru' WHERE objectCategory='User' And employeeID='"+НомерПФР+"'";
Records = oConnect.Execute(query);
Если НЕ Records.EOF Тогда
ADsPath = Records.Fields("ADsPath").Value;
CN = ПолучитьCOMОбъект(Records.Fields("ADsPath").Value).Name;
ADsPath = СтрЗаменить(ADsPath, CN+",", "");
PreObj = ПолучитьCOMОбъект("LDAP:");
objContainer = PreObj.OpenDSObject(ADsPath, "ВашАдминскийЮзер", "ЕгоПароль", 1);
UpdateObject = objContainer.GetObject("User", CN);
UpdateObject.Put("thumbnailPhoto", Фото.Read());
UpdateObject.SetInfo();
КонецЕсли;
Записали = Истина;
Исключение
КонецПопытки;
Records = oConnect.Execute(query);
Если НЕ Records.EOF Тогда
ADsPath = Records.Fields("ADsPath").Value;
CN = ПолучитьCOMОбъект(Records.Fields("ADsPath").Value).Name;
ADsPath = СтрЗаменить(ADsPath, CN+",", "");
PreObj = ПолучитьCOMОбъект("LDAP:");
objContainer = PreObj.OpenDSObject(ADsPath, "ВашАдминскийЮзер", "ЕгоПароль", 1);
UpdateObject = objContainer.GetObject("User", CN);
UpdateObject.Put("thumbnailPhoto", Фото.Read());
UpdateObject.SetInfo();
КонецЕсли;
Записали = Истина;
Исключение
КонецПопытки;
Закрываем подключение. Прибираемся. Уходим. Вот и всё!!!
// Удалим фото из регистра
СписокФотоФизЛиц.Добавить(ФотоФизЛица);
// Удалим временный файл
УдалитьФайлы(ИмяФайла);
КонецЕсли;
КонецЦикла;// Закроем ADoConnect.Close();// Запишим изменения в регистр изменений фотографий физ. лицДля каждого ФотоФизЛица Из СписокФотоФизЛиц Цикл
ИзменениеФотоФизЛица.Удалить(ФотоФизЛица.Значение);
КонецЦикла;ИзменениеФотоФизЛица.Записать(Истина);
СписокФотоФизЛиц.Добавить(ФотоФизЛица);
// Удалим временный файл
УдалитьФайлы(ИмяФайла);
КонецЕсли;
КонецЦикла;// Закроем ADoConnect.Close();// Запишим изменения в регистр изменений фотографий физ. лицДля каждого ФотоФизЛица Из СписокФотоФизЛиц Цикл
ИзменениеФотоФизЛица.Удалить(ФотоФизЛица.Значение);
КонецЦикла;ИзменениеФотоФизЛица.Записать(Истина);
Источник: http://infostart.ru/public/153939/
Комментариев нет:
Отправить комментарий