1С8. Пример работы с COMConnector - загрузка из ЗиУП

Как загрузить сотрудников из Зарплаты и кадры:

Коннектимся к базе ЗиУП, заполняем запросом таблицу значений, обрабатываем таблицу значений - создаем пользователей, если они не уволены


// Таблицы значений
// Загруженные из ЗиУП 
перем мТЗ_Сотрудники; 		 // Документы. 

// ВЛогфайл("C:\temp\1234.log","Это строка лога");
Функция ВЛогфайл(строкаВЛог,имяФайлаПолное="") 
	
	// если имя файла пустое - сами придумаем имя
	Если имяФайлаПолное = "" или строкаВЛог  = "" тогда		
		имяФайлаПолное = 
		СтрЗаменить(ЭтотОбъект.ИспользуемоеИмяФайла,".epf",".log");    	
	КонецЕсли;
	
	// если указан файл без пути - назначим путь - каталог программы
	Если Найти(имяФайлаПолное, "\") = 0 тогда
    	имяФайлаПолное = КаталогПрограммы() + имяФайлаПолное;
		сообщить("Лог:" + имяФайлаПолное);
	КонецЕсли;
	
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	кодировка = "UTF8" ;
	разделительСтрок = Символы.ВК + Символы.ПС; //Значение по умолчанию: ВК+ПС 
	                          	
	МассивФайлов = НайтиФайлы(имяФайлаПолное);		
		
	// если файл еще не создан добавим строку с именем файла
	Если МассивФайлов.Количество() = 0 тогда		
		ТекстовыйДокумент.ДобавитьСтроку(имяФайлаПолное);	
	иначе 
		// если файл с таким именем уже создан прочитаем его
		ТекстовыйДокумент.Прочитать(имяФайлаПолное,кодировка);			
	КонецЕсли;
	
	// добавим время к строке
	строкаВЛог = "[" + ТекущаяДата() + "] " + строкаВЛог; 
	// добавим строку в объект ТекстовыйДокумент
	ТекстовыйДокумент.ДобавитьСтроку(строкаВЛог);
	// закрываем ТекстовыйДокумент файл
	ТекстовыйДокумент.Записать(имяФайлаПолное,кодировка);
    
КонецФункции		

Функция ПолучитьИБИсточник(массивСтрокСоединения)
	Состояние("Соединяемся через V82.COMConnector...");
	v8 = Новый COMОбъект("V82.COMConnector");
  			
	Для каждого стрСоединения Из массивСтрокСоединения  Цикл	
		Попытка
			мИБИсточник = v8.Connect(стрСоединения);
			Возврат мИБИсточник ; // COMОбъект	
		Исключение			
			Сообщить("Не удалось выполнить соединение - "
				+ " БазаДанных-Источник не открыта!!!");		
			Возврат -1;
			
		КонецПопытки;		
	КонецЦикла; 	
	
	
КонецФункции

// поместить пользователя в папку
Функция ПоместитьВПапку(ПользовательНаименование,ПапкаНаименование);
	
	Папка 	    = Справочники.Пользователи.НайтиПоНаименованию(СокрЛП(ПапкаНаименование));
	Пользователь = Справочники.Пользователи.НайтиПоНаименованию(СокрЛП(ПользовательНаименование));	
	
	Если Папка = Справочники.Пользователи.ПустаяСсылка() Тогда	 
		сообщить("Не найдена папка:" + ПапкаНаименование);
		возврат -1 ;   		
	КонецЕсли;  
	
	Если Пользователь = Справочники.Пользователи.ПустаяСсылка() Тогда	 
		сообщить("Не найден пользователь:" + ПользовательНаименование);		
		возврат -1 ;
	КонецЕсли;  		
	
	// папка пользователя
	былоПользовательРодитель=Пользователь.Родитель; 
	
	// если пользователь уже в папке - ничего не делаем
	Если былоПользовательРодитель.Код = Папка.Код Тогда	 		
		возврат -1 ;
	КонецЕсли;  		
	
	ПользовательОбъект=Пользователь.ПолучитьОбъект();
	ПользовательОбъект.Родитель = Папка;	
	ПользовательОбъект.Записать();
	сообщить("" 
		+ Пользователь  
		+ ":" + былоПользовательРодитель 
		+ "-->" + ПользовательОбъект.Родитель );
	Возврат 0;
	
КонецФункции

Функция ПолучитьСотрудников()
	 
	массивСтрокСоединения = новый массив;
	
	Пользователь="useradmin";
  	Пароль="password1c";
	
        // для рабочей базы
	массивСтрокСоединения.Добавить(""
		+ "Srvr=serv1c;"
		+ "Ref=1czup;"
		+ "Usr=" + Пользователь + ";"
		+ "Pwd=" + Пароль + ";"
		);
        // для тестовой   		
	массивСтрокСоединения.Добавить(""
		+ "File=j:\1c_bases8\testdb;"
		+ "Usr=" + Пользователь + ";"
		+ "Pwd=" + Пароль + ";"
		);	
	
	ЗиУП = ПолучитьИБИсточник(массивСтрокСоединения);		

	ошибка=?(Строка(Тип(ЗиУП)) = "COM Объект",Ложь,Истина);
	
	Если ошибка тогда 
		возврат ошибка; 
	КонецЕсли;
	
	ЗиУП_Запрос = ЗиУП.NewObject("Query"); 
	
        // Запрос к базе ЗиУП
        // Выбираем сотрудников и актуальное их состояние (уволен, принят, переведен)
        // функции ПРЕДСТАВЛЕНИЕ(ПРЕДСТАВЛЕНИЕССЫЛКИ()) позволяют представить данные как простые, а не COM-объекты
	ЗиУП_Запрос.Text = 
	"ВЫБРАТЬ
	| ПРЕДСТАВЛЕНИЕ(ПРЕДСТАВЛЕНИЕССЫЛКИ(ФизическиеЛица.Ссылка)) КАК Физлицо,
	| ПРЕДСТАВЛЕНИЕ(ПРЕДСТАВЛЕНИЕССЫЛКИ(ПоследнееСостояниеСотрудника.датаПоследнегоСобытия))КАК датаПоследнегоСобытия,	
	| ПРЕДСТАВЛЕНИЕ(ПРЕДСТАВЛЕНИЕССЫЛКИ(РаботникиОрганизаций.Регистратор))КАК Регистратор,		
	| ПРЕДСТАВЛЕНИЕ(ПРЕДСТАВЛЕНИЕССЫЛКИ(РаботникиОрганизаций.Сотрудник)) КАК Сотрудник,
	| ПРЕДСТАВЛЕНИЕ(ПРЕДСТАВЛЕНИЕССЫЛКИ(РаботникиОрганизаций.Организация)) КАК Организация,	
	| РаботникиОрганизаций.ЗанимаемыхСтавок,
	| ПРЕДСТАВЛЕНИЕ(ПРЕДСТАВЛЕНИЕССЫЛКИ(РаботникиОрганизаций.ОбособленноеПодразделение)) КАК ОбособленноеПодразделение,
	| ПРЕДСТАВЛЕНИЕ(ПРЕДСТАВЛЕНИЕССЫЛКИ(РаботникиОрганизаций.ПодразделениеОрганизации)) КАК ПодразделениеОрганизации,
	| ПРЕДСТАВЛЕНИЕ(ПРЕДСТАВЛЕНИЕССЫЛКИ(РаботникиОрганизаций.Должность)) КАК Должность,
	| ПРЕДСТАВЛЕНИЕ(ПРЕДСТАВЛЕНИЕССЫЛКИ(РаботникиОрганизаций.ГрафикРаботы)) КАК ГрафикРаботы,	
	| ПРЕДСТАВЛЕНИЕ(ПРЕДСТАВЛЕНИЕССЫЛКИ(РаботникиОрганизаций.ПричинаИзмененияСостояния)) КАК ПричинаИзмененияСостояния,	
	| ПРЕДСТАВЛЕНИЕ(ПРЕДСТАВЛЕНИЕССЫЛКИ(РаботникиОрганизаций.ПервичныйДокумент)) КАК ПервичныйДокумент
	|ИЗ
	|	Справочник.ФизическиеЛица КАК ФизическиеЛица
	|		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
	|			Работник.Сотрудник.Физлицо КАК Физлицо,
	|			МАКСИМУМ(Работник.Регистратор.Дата) КАК датаПоследнегоСобытия
	|		ИЗ
	|			РегистрСведений.РаботникиОрганизаций КАК Работник
	|		
	|		СГРУППИРОВАТЬ ПО
	|			Работник.Сотрудник.Физлицо) КАК ПоследнееСостояниеСотрудника
	|		ПО ФизическиеЛица.Ссылка = ПоследнееСостояниеСотрудника.Физлицо
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
	|		ПО ФизическиеЛица.Ссылка = РаботникиОрганизаций.Сотрудник.Физлицо
	|			И (ПоследнееСостояниеСотрудника.датаПоследнегоСобытия = РаботникиОрганизаций.Регистратор.Дата)
	|
	|УПОРЯДОЧИТЬ ПО
	|	ФизическиеЛица.Наименование";
	
	Результат = ЗиУП_Запрос.Выполнить();	
	мТЗ_Сотрудники = Результат.Выгрузить(); 
	
КонецФункции

// Обрабатываем 
Функция ОбработатьСотрудников()
	
	// через Метаданные Вычислим имя реквизита Физлицо 
	имяРеквизитаФизЛицо=?((Метаданные.Справочники.Пользователи.Реквизиты.Найти("ФизЛицо") = неопределено),
		"ФизическиеЛица",
		"Физлицо");
	
	для каждого строкаТаблицы из мТЗ_Сотрудники Цикл 
		ФизлицоИмя = строкаТаблицы["Физлицо"];
		СотрудникИмя = строкаТаблицы["Сотрудник"];
		датаПоследнегоСобытия = строкаТаблицы["датаПоследнегоСобытия"];
		ПричинаИзмененияСостояния = строкаТаблицы["ПричинаИзмененияСостояния"];
		Должность = строкаТаблицы["Должность"];
		ПодразделениеОрганизации = строкаТаблицы["ПодразделениеОрганизации"];
		Регистратор = строкаТаблицы["Регистратор"];
		
		стрКомментарий = ФизлицоИмя 
				+ "; " + ПричинаИзмененияСостояния 
				+ "; " + Должность
				+ "; " + ПодразделениеОрганизации	
				+ "; " + Регистратор	
				;
		
		// в этой базе не найдено - создаем
		Физлицо = Справочники.ФизическиеЛица.НайтиПоНаименованию(ФизлицоИмя);
		Если Физлицо = Справочники.ФизическиеЛица.ПустаяСсылка()	
			и ПричинаИзмененияСостояния <> "Увольнение"
			Тогда	 
			
			сообщить("Не найдено Физлицо:" + ФизлицоИмя + " - создаем..." );
			новоеФизлицо = Справочники.ФизическиеЛица.СоздатьЭлемент();
			новоеФизлицо.Наименование = ФизлицоИмя;
			новоеФизлицо.Комментарий = стрКомментарий;
			новоеФизлицо.Записать();
			Физлицо=новоеФизлицо.Ссылка;			
			сообщить("Создано новое Физлицо: " + Физлицо + " [-OK!]" );	
		КонецЕсли; 
		
		Пользователь = Справочники.Пользователи.НайтиПоНаименованию(ФизлицоИмя);
		Если Пользователь = Справочники.Пользователи.ПустаяСсылка()	
			и ПричинаИзмененияСостояния <> "Увольнение"
			Тогда	 
			
			сообщить("Не найден пользователь:" + Пользователь + " - создаем..." );
			новыйПользователь = Справочники.Пользователи.СоздатьЭлемент();
			новыйПользователь.Наименование = ФизлицоИмя;
			новыйПользователь.Код = ФизлицоИмя;              			
			новыйПользователь[имяРеквизитаФизЛицо] = Физлицо;			
			новыйПользователь.Записать();
			Пользователь=новыйПользователь.Ссылка;			
			сообщить("Создан новый пользователь: " + Пользователь + " [-OK!] " + стрКомментарий );	
		КонецЕсли; 		
		
		если ПричинаИзмененияСостояния = "Увольнение" тогда	
			//Поместить в папку уволенные
			ПапкаНаименование="Уволенные";
			ПоместитьВПапку(Пользователь.Наименование,ПапкаНаименование);
			
			стрс=" запись помещена в папку " 
				+ ПапкаНаименование 				
				+ " [-OK!]" 
				;				
			
		КонецЕсли; 
		ВЛогфайл(стрКомментарий + стрс);
		сообщить("" + Физлицо + " [-OK!]" );
		
		// Вставить обработку выборки ВыборкаДетальныеЗаписи
	КонецЦикла;

КонецФункции

// Основная логика
Функция ЗагрузитьПользователей()
	ОчиститьСообщения();
	мТЗ_Сотрудники = новый ТаблицаЗначений;
	ПолучитьСотрудников();			
	ОбработатьСотрудников();
КонецФункции	

ЗагрузитьПользователей();




Рекламный блок:

Предлагаем решение Ваших задач 1С.

Внедрение 1С:

Доработка и сопровождение 1С:

Ориентировочная стоимость работ программиста 1С : 500 р. за 1 час работы.

Пишите: j008@j008.ru

Звоните: 8 916 710 83 51 Ольга