1C шаблоны и готовые решения

Ноябрь 22, 2017

Импорт файлов сотрудников из 1С ЗУП 2.5 КОРП в 1С ЗУП 3.1 КОРП.

Filed under: — admin @ 5:59 дп

В процессе миграции в ЗУП 3.1. КОРП, была поставлена задача по переносу прикрепленных файлов и фотографий из ЗУП 2.5. КОРП. Для этого разработаем обработку по перекачке файлов. Алгоритм такой: подключаемся через com соединение к базе ЗУП 2.5., отбираем данные по файлам физ. лиц и загружаем в справочник ЗУП 3.1. КОРП «ФизическиеЛицаПрисоединенныеФайлы». Далее код реализующий данный механизм:

// Функция УстановитьCOMСоединение устанавливает COM соединение с внешней базой
Функция УстановитьCOMСоединение()
		
	СтрокаПодключения = "Srvr=""serverName""; Ref=""BaseName""; Usr=""UserName""; Pwd=""Passowrd"";";
	
	Попытка
		Коннектор = Новый COMObject("V83.COMConnector");
		Соединение = Коннектор.Connect(СтрокаПодключения);
		Возврат Соединение;
	Исключение
		ТекстСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ВызватьИсключение ТекстСообщенияОбОшибке;
	КонецПопытки;
	
КонецФункции

// Функция ПолучитьТаблицуЗначенийФизЛица получает таблицу значений физ. лиц из ЗУП 3.1. КОРП
функция ПолучитьТаблицуЗначенийФизЛица()
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	о.Ссылка КАК ФизическоеЛицо,
		|	о.Наименование КАК ФизическоеЛицоНаименование,
		|	о.Код КАК ФизическоеЛицоКод
		|ИЗ
		|	Справочник.ФизическиеЛица КАК о";		
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Если Не РезультатЗапроса.Пустой() Тогда
		Возврат РезультатЗапроса.Выгрузить();
	КонецЕсли;
	
	Возврат Неопределено;
	
КонецФункции

// Процедура ПеренестиФайлыВФизическиеЛицаПрисоединенныеФайлы добавляет файл физ. лица в  справочник 
// ЗУП3.1. КОРП ФизическиеЛицаПрисоединенныеФайлы
// Параметры:
//                 ДвоичныеДанные- данные файла
//                 ПараметрыФайла - структура с параметрами файла
Процедура ПеренестиФайлыВФизическиеЛицаПрисоединенныеФайлы(ДвоичныеДанные, ПараметрыФайла) 
	
	Если ДвоичныеДанные = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, Новый УникальныйИдентификатор());
		
	Попытка
		ПрисоединенныйФайлСсылка = РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресФайлаВоВременномХранилище,, ПараметрыФайла.Описание);
	Исключение
		ТекстСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщенияОбОшибке);
	КонецПопытки;

	УдалитьИзВременногоХранилища(АдресФайлаВоВременномХранилище);
	
КонецПроцедуры

// Процедура КомандаВыполнитьНаСервере Выполняет алгоритм по переносу файлов сотрудников из ЗУП 2.5. 
//КОРП в ЗУП 3.1. КОРП
&НаСервере
Процедура КомандаВыполнитьНаСервере()
	
	Соединение = УстановитьCOMСоединение(); 
	
	ТЗФизЛица = ПолучитьТаблицуЗначенийФизЛица();
	МассивНаименованийФизЛиц = Соединение.NewObject("Массив");
	
	Если ТЗФизЛица <> Неопределено и ТЗФизЛица.Количество() > 0 Тогда
		
		Для каждого о из ТЗФизЛица Цикл
			МассивНаименованийФизЛиц.Добавить(о.ФизическоеЛицоНаименование);
		КонецЦикла;	
		
	Иначе
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Нет данных по физ. лицам!");
		Возврат;
	КонецЕсли;	
	
	Запрос = Соединение.NewObject("Запрос");
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ХранилищеДополнительнойИнформации.ИмяФайла,
	|	ХранилищеДополнительнойИнформации.Объект.Наименование как ФизическоеЛицоНаименование,
	|	ХранилищеДополнительнойИнформации.Объект.Код как ФизическоеЛицоКод,
	|	ХранилищеДополнительнойИнформации.Хранилище
	|ИЗ
	|	Справочник.ХранилищеДополнительнойИнформации КАК ХранилищеДополнительнойИнформации
	|	где ХранилищеДополнительнойИнформации.Объект Ссылка Справочник.ФизическиеЛица
	|	и ХранилищеДополнительнойИнформации.Объект.Наименование в (&МассивНаименованийФизЛиц) 
	| упорядочить по ХранилищеДополнительнойИнформации.Объект";
	Запрос.УстановитьПараметр("МассивНаименованийФизЛиц", МассивНаименованийФизЛиц);
	Результат = Запрос.Выполнить();
	о = Результат.Выбрать();
	
	Пока о.Следующий() Цикл
		
		Отбор = Новый Структура("ФизическоеЛицоНаименование, ФизическоеЛицоКод", о.ФизическоеЛицоНаименование, о.ФизическоеЛицоКод);
		НайденныеСтроки = ТЗФизЛица.НайтиСтроки(Отбор);
		
		Если НайденныеСтроки.Количество() > 0 Тогда
		
			ФизЛицоСсылка = НайденныеСтроки[0].ФизическоеЛицо;
			КаталогВременныхФайлов = КаталогВременныхФайлов();
			ПутьКФайлу = КаталогВременныхФайлов +  о.ИмяФайла;
			Данные = о.Хранилище.Получить();
			
			Попытка
				Данные.Записать(ПутьКФайлу);
			Исключение
				ТекстСообщенияОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
				ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщенияОбОшибке);
				Прервать;
			КонецПопытки;
			
			Файл = Новый Файл(ПутьКФайлу);
			Если Файл.Существует() Тогда

				ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
				
				ПараметрыФайла = Новый Структура();
				ПараметрыФайла.Вставить("Автор", Пользователи.ТекущийПользователь());
				ПараметрыФайла.Вставить("ВладелецФайлов", ФизЛицоСсылка);
				ПараметрыФайла.Вставить("ИмяБезРасширения", СтрЗаменить(Файл.Имя,Файл.Расширение,""));
				ПараметрыФайла.Вставить("РасширениеБезТочки", СтрЗаменить(Файл.Расширение,".",""));
				ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", Файл.ПолучитьУниверсальноеВремяИзменения());
				ПараметрыФайла.Вставить("Описание",?(Найти(нрег(Файл.Расширение),"jpg") > 0, "фото",""));

				ПеренестиФайлыВФизическиеЛицаПрисоединенныеФайлы(ДвоичныеДанные, ПараметрыФайла);
				
				Сообщить("" + ПутьКФайлу + " => " + ФизЛицоСсылка);
				УдалитьФайлы(ПутьКФайлу);
			КонецЕсли;	
		Иначе
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Физ. лицо не найдено: '" + о.ФизЛицоНаименование + "' [" + о.ФизЛицоКод +"]");
		КонецЕсли;	
		
	КонецЦикла;	
	
КонецПроцедуры
// Процедура КомандаВыполнить запускает механизм по импорту файлов в обработке по переносу.
&НаКлиенте
Процедура КомандаВыполнить(Команда)	
	КомандаВыполнитьНаСервере();	
КонецПроцедуры

Результатом обработки будет заполненный справочник с файлами сотрудников и их фотокарточками.
Выглядеть это будет примерно вот так, как на картинках ниже.
Файлы сотрудника:
Guid1C
Карточка сотрудника:
Guid1C

Powered by WordPress

Яндекс.Метрика nikol_dn@list.ru