Создание внешней обработки выгрузки данных

1. Pers2071 29.05.20 13:16 Сейчас в теме
Всем привет!
Образовалось такая задача , есть внешняя обработка которая считывает проход людей каждый день и куда то это сохраняет , надо было создать еще одну обработку и создать там кнопку выгрузить дато начало и дата конец и выбрать проход что бы это обработка выгрузила данные за один выбранный день , потом после как создали всю внешнюю обработку, надо будет создать регламентное задание и что бы каждый день грузила файл автоматические , мне только надо код придумать в свою обработку и от куда что брать и что как создать не знаю я новичок в этой сфере , на скрине видно от куда он берет данные прохода все коды есть не могу понять как структурировать запрос и у меня создано уже моя внешняя обработка с другими сотрудниками из основной базы, там просто надо менят коды и ставить сови коды я это как пример создал понят как работает запрос, там добавил я кнопку и выгрузку отправляю вам скрины
ПОМОГИТЕ ПОЖАЛУЙСТА СОСТАВИТЬ КОД
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
3. alex-l19041 8 29.05.20 14:08 Сейчас в теме
(1)
куда то это сохраняет
- для начала выясните КУДА сохраняет
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. alex-l19041 8 29.05.20 14:08 Сейчас в теме
(1)
куда то это сохраняет
- для начала выясните КУДА сохраняет
4. Pers2071 29.05.20 14:52 Сейчас в теме
(3)
(3)
Сохраняет он все это в Базе 1с
Вот это основная страница внешней обработки , еще раз объясняю , есть внешняя обработка для турникетов , надо придумать еще одну внешнюю обработку с кнопки выгрузки проходов что бы каждый день или определенный день можно было выгрузить эти данные в ХМЛ формате в основную базу , вот коды внешной обработки
Функции зависящие от конфигурации 1C ************************** //
// ************************************************************************************************** //

// Описание: возвращает тип конфигурации в зависимости от названия и версии конфигурации.
// Параметры: Конфигурация_Имя - имя конфигурации, Конфигурация_Версия - версия конфигурации, 
//   Конфигурация_ПодВерсия - подверсия конфигурации, Конфигурация_Релиз - релиз конфигурации. 
// Возвращаемое значение: тип конфигурации. 
&НаСервереБезКонтекста
Функция ПолучитьТипКонфигурации(Конфигурация_Имя, Конфигурация_Версия, Конфигурация_ПодВерсия, Конфигурация_Релиз)
	
	Если (Найти(Конфигурация_Имя, "ЗарплатаИУправлениеПерсоналом") > 0 И Конфигурация_Версия = 3) ИЛИ 
		 (Найти(Конфигурация_Имя, "ЗарплатаИКадрыГосударственногоУчреждения") > 0 И Конфигурация_Версия = 3) ИЛИ 
		 (Найти(Конфигурация_Имя, "КомплекснаяАвтоматизация") > 0 И Конфигурация_Версия >= 2) ИЛИ
		 (Найти(Конфигурация_Имя, "УправлениеПредприятием") > 0 И Конфигурация_Версия >= 2) Тогда
	    ТипКонфигурации = 1; // ЗУП 3.0-3.1, ЗИК 3.0-3.1, КА 2.0, УП 2.4 
	ИначеЕсли (Найти(Конфигурация_Имя, "БухгалтерияПредприятия") > 0 И Конфигурация_Версия = 3) Тогда
		ТипКонфигурации = 2; // БП 3.0
	ИначеЕсли (Найти(Конфигурация_Имя, "БухгалтерияГосударственногоУчреждения") > 0 И Конфигурация_Версия = 1) Тогда
		ТипКонфигурации = 3; // БГУ 1.0	
	Иначе  
		ТипКонфигурации = 0; // ЗУП 2.5, УПП 1.2, ЗИК 1.0, КА 1.0
	КонецЕсли;	
	
	Возврат ТипКонфигурации;
		
КонецФункции

// Описание: возвращает тип двоичных данных в зависимости от названия и версии конфигурации.
// Параметры: Конфигурация_Имя - имя конфигурации, Конфигурация_Версия - версия конфигурации, 
//   Конфигурация_ПодВерсия - подверсия конфигурации, Конфигурация_Релиз - релиз конфигурации. 
// Возвращаемое значение: тип двоичных данных. 
&НаСервереБезКонтекста
Функция ПолучитьТипДвоичныхДанных(Конфигурация_Имя, Конфигурация_Версия, Конфигурация_ПодВерсия, Конфигурация_Релиз)
		
	Если (Найти(Конфигурация_Имя, "ЗарплатаИУправлениеПерсоналом") > 0 И Конфигурация_Версия = 3 И Конфигурация_ПодВерсия = 0) ИЛИ
		 (Найти(Конфигурация_Имя, "ЗарплатаИУправлениеПерсоналом") > 0 И Конфигурация_Версия = 3 И Конфигурация_ПодВерсия = 1 И Конфигурация_Релиз <= 2) ИЛИ
		 (Найти(Конфигурация_Имя, "ЗарплатаИКадрыГосударственногоУчреждения") > 0 И Конфигурация_Версия = 3 И Конфигурация_ПодВерсия = 0) Тогда
		ТипДвоичныхДанных = 1; // ЗУП 3.0.x-3.1.2, ЗИК 3.0.x
	ИначеЕсли (Найти(Конфигурация_Имя, "ЗарплатаИУправлениеПерсоналом") > 0 И Конфигурация_Версия = 3) ИЛИ 
		      (Найти(Конфигурация_Имя, "ЗарплатаИКадрыГосударственногоУчреждения") > 0 И Конфигурация_Версия = 3) ИЛИ 
			  (Найти(Конфигурация_Имя, "КомплекснаяАвтоматизация") > 0 И Конфигурация_Версия >= 2) ИЛИ
			  (Найти(Конфигурация_Имя, "БухгалтерияПредприятия") > 0 И Конфигурация_Версия = 3) ИЛИ
			  (Найти(Конфигурация_Имя, "УправлениеПредприятием") > 0 И Конфигурация_Версия >= 2) Тогда	
		ТипДвоичныхДанных = 2; // ЗУП 3.1.3 - 3.1.7, ЗИК 3.1.3 - 3.1.7, КА 2.0, БП 3.0 		
	Иначе
		ТипДвоичныхДанных = 0; // ЗУП 2.5, УПП 1.2, ЗИК 1.0, КА 1.0, БГУ 1.0, УП 2.4 
	КонецЕсли;
	
	Возврат ТипДвоичныхДанных;
		
КонецФункции

// Описание: возвращает тип фотографии сотрудника в зависимости от названия и версии конфигурации.
// Параметры: Конфигурация_Имя - имя конфигурации, Конфигурация_Версия - версия конфигурации, 
//   Конфигурация_ПодВерсия - подверсия конфигурации, Конфигурация_Релиз - релиз конфигурации. 
// Возвращаемое значение: тип фотографии. 
&НаСервереБезКонтекста
Функция ПолучитьТипФотографииСотрудника(Конфигурация_Имя, Конфигурация_Версия, Конфигурация_ПодВерсия, Конфигурация_Релиз)
	
	Если (Найти(Конфигурация_Имя, "ЗарплатаИУправлениеПерсоналом") > 0 ИЛИ Найти(Конфигурация_Имя, "ЗарплатаИКадрыГосударственногоУчреждения") > 0) 
		  И Конфигурация_Версия = 3 И Конфигурация_ПодВерсия = 0 Тогда
	    ТипФотографии = 1; // ЗУП 3.0, ЗИК 3.0	
	ИначеЕсли (Найти(Конфигурация_Имя, "ЗарплатаИУправлениеПерсоналом") > 0 ИЛИ Найти(Конфигурация_Имя, "ЗарплатаИКадрыГосударственногоУчреждения") > 0) И 
			   Конфигурация_Версия = 3 И Конфигурация_ПодВерсия = 1 Тогда			
		ТипФотографии = 2; // ЗУП 3.1, ЗИК 3.1
	ИначеЕсли (Найти(Конфигурация_Имя, "КомплекснаяАвтоматизация") > 0 И Конфигурация_Версия >= 2) ИЛИ 
		(Найти(Конфигурация_Имя, "БухгалтерияПредприятия") > 0 И Конфигурация_Версия = 3) Тогда
		ТипФотографии = 2; // КА 2.0, БП 3.0
	ИначеЕсли (Найти(Конфигурация_Имя, "УправлениеПредприятием") > 0 И Конфигурация_Версия >= 2) Тогда
		ТипФотографии = 2; // УП 2.4
	ИначеЕсли (Найти(Конфигурация_Имя, "БухгалтерияГосударственногоУчреждения") > 0 И Конфигурация_Версия = 1) Тогда
		ТипФотографии = 3; // БГУ 1.0 (нет фото)			
	Иначе  
		ТипФотографии = 0; // ЗУП 2.5, УПП 1.2, ЗИК 1.0, КА 1.0
	КонецЕсли;	
	
	Возврат ТипФотографии;
	
КонецФункции

// Описание: выполняет запрос сотрудников из базы 1С. 
// Параметры: НачалоПериода - начало периода, Сотрудник - ссылка на сотрудника (не обязательный параметр), 
//   ТипКонфигурации - тип конфигурации (число).
// Возвращаемое значение: таблица значений сотрудников.
&НаСервереБезКонтекста
Функция ПолучитьТаблицуСотрудников(НачалоПериода, Сотрудник, ТипКонфигурации)
	
	// пустая ссылка на сотрудника
	ПустыеСсылки = ПолучитьПустыеСсылки(ТипКонфигурации);
	ПустаяСсылка_Сотрудник = ПустыеСсылки.ПустаяСсылка_Сотрудник;
		
	Запрос = Новый Запрос;
	
	// в зависимости от типа конфигурации формируем запрос сотрудников из базы 1С,
	// каждому сотруднику присоединяем его актуальные данные: организация, подразделение организации, должность и т.д.  
	ТекстЗапроса = 				
		"ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	Сотрудники.Ссылка КАК Ссылка,
		|	Сотрудники.Ссылка КАК Сотрудник,
		|	Сотрудники.Код КАК Код,	
		|   Сотрудники.Код КАК ТабельныйНомер,
		|	Сотрудники.Наименование КАК Наименование,";	
	
	// присоединить актуальные данные по сотруднику			
	Если ТипКонфигурации = 1 Тогда // ЗУП 3.0-3.1, ЗИК 3.0-3.1, КА 2.0, УП 2.4 								 			  
		ТекстЗапроса = ТекстЗапроса +	 
		"	КадроваяИсторияСотрудников.Организация КАК Организация,
		|	КадроваяИсторияСотрудников.Подразделение КАК ПодразделениеОрганизации,
		|	КадроваяИсторияСотрудников.Должность КАК Должность,							
		|   ВТ_СрезГрафикРаботы.ГрафикРаботы КАК ГрафикРаботы,
		|   ТекущиеКадровыеДанныеСотрудников.ДатаУвольнения,
		|   ВЫБОР				
		|       КОГДА ТекущиеКадровыеДанныеСотрудников.ДатаУвольнения ЕСТЬ NULL ИЛИ ТекущиеКадровыеДанныеСотрудников.ДатаУвольнения = ДАТАВРЕМЯ(1,1,1,0,0,0) 
		|       ТОГДА Ложь 
		|       ИНАЧЕ Истина 
		|   КОНЕЦ КАК Уволен,
		|   Ложь КАК ФлагВыбора";			
	ИначеЕсли ТипКонфигурации = 2 Тогда	// БП 3.0				
		ТекстЗапроса = ТекстЗапроса + Символы.ПС +
		"	КадроваяИсторияСотрудников.Организация КАК Организация,
		|	КадроваяИсторияСотрудников.Подразделение КАК ПодразделениеОрганизации,
		|	КадроваяИсторияСотрудников.Должность КАК Должность,			
		|   ТекущиеКадровыеДанныеСотрудников.ДатаУвольнения,
		|	NULL КАК ГрафикРаботы,
		|   ТекущиеКадровыеДанныеСотрудников.ДатаУвольнения,
		|   ВЫБОР				
		|       КОГДА ТекущиеКадровыеДанныеСотрудников.ДатаУвольнения ЕСТЬ NULL ИЛИ ТекущиеКадровыеДанныеСотрудников.ДатаУвольнения = ДАТАВРЕМЯ(1,1,1,0,0,0)
		|       ТОГДА Ложь 
		|       ИНАЧЕ Истина 
		|   КОНЕЦ КАК Уволен,
		|   Ложь КАК ФлагВыбора";		
	ИначеЕсли ТипКонфигурации = 3 Тогда	// БГУ 1.0
		ТекстЗапроса = ТекстЗапроса + Символы.ПС +
		"   NULL КАК Организация,
		|	ДанныеСотрудников.Подразделение КАК Подразделение,
		|	ДанныеСотрудников.Должность КАК Должность,
		|	NULL КАК ГрафикРаботы,
		|   ДАТА(1,1,1) КАК ДатаУвольнения,
		|   Ложь КАК Уволен,
		|   Ложь КАК ФлагВыбора";		
	ИначеЕсли ТипКонфигурации = 0 Тогда // ЗУП 2.5, ЗИК 1.0, УПП 1.2-1.3, КА 1.0
		ТекстЗапроса = ТекстЗапроса + Символы.ПС +
		"	РаботникиОрганизацийСрезПоследних.Организация КАК Организация,
		|	РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
		|	РаботникиОрганизацийСрезПоследних.Должность КАК Должность,
		|	РаботникиОрганизацийСрезПоследних.ГрафикРаботы КАК ГрафикРаботы,
		|   Сотрудники.Ссылка.ДатаУвольнения КАК ДатаУвольнения,
		|   ВЫБОР				
		|       КОГДА Сотрудники.Ссылка.ДатаУвольнения ЕСТЬ NULL ИЛИ Сотрудники.Ссылка.ДатаУвольнения = ДАТАВРЕМЯ(1,1,1,0,0,0)
		|       ТОГДА Ложь 
		|       ИНАЧЕ Истина 
		|   КОНЕЦ КАК Уволен,
		|   Ложь КАК ФлагВыбора";		
	КонецЕсли;			
	
	// название таблицы сотрудников зависит от конфигурации
	Если ТипКонфигурации = 1 ИЛИ ТипКонфигурации = 2 ИЛИ ТипКонфигурации = 3 Тогда	
		ТекстЗапроса = ТекстЗапроса + Символы.ПС +
		"ИЗ Справочник.Сотрудники КАК Сотрудники";		 
	ИначеЕсли ТипКонфигурации = 0 Тогда	
		ТекстЗапроса = ТекстЗапроса + Символы.ПС +					
		"ИЗ Справочник.СотрудникиОрганизаций КАК Сотрудники";
	КонецЕсли;
	
	// откуда брать актуальные данные				
	Если ТипКонфигурации = 1 Тогда // ЗУП 3.0-3.1, ЗИК 3.0-3.1, КА 2.0, УП 2.4					 																
		ТекстЗапроса = ТекстЗапроса + Символы.ПС +					
		"ЛЕВОЕ СОЕДИНЕНИЕ 
		|    РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&НачалоМесяца, ) КАК КадроваяИсторияСотрудников ПО КадроваяИсторияСотрудников.Сотрудник = Сотрудники.Ссылка			
		|СОЕДИНЕНИЕ 
		|    РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТекущиеКадровыеДанныеСотрудников ПО ТекущиеКадровыеДанныеСотрудников.Сотрудник = Сотрудники.Ссылка";						
		ТекстЗапроса = ТекстЗапроса + Символы.ПС + 
		"ЛЕВОЕ СОЕДИНЕНИЕ				 	
		|    РегистрСведений.ГрафикРаботыСотрудников.СрезПоследних(&НачалоМесяца, ) КАК ВТ_СрезГрафикРаботы ПО ВТ_СрезГрафикРаботы.Сотрудник = Сотрудники.Ссылка";			
	ИначеЕсли ТипКонфигурации = 2 Тогда	// БП 3.0	
		ТекстЗапроса = ТекстЗапроса + Символы.ПС + 
		"ЛЕВОЕ СОЕДИНЕНИЕ 
		|    РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&НачалоМесяца, ) КАК КадроваяИсторияСотрудников ПО КадроваяИсторияСотрудников.Сотрудник = Сотрудники.Ссылка					
		|СОЕДИНЕНИЕ
		|	 РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТекущиеКадровыеДанныеСотрудников ПО ТекущиеКадровыеДанныеСотрудников.Сотрудник = Сотрудники.Ссылка";						
	ИначеЕсли ТипКонфигурации = 3 Тогда	// БГУ 1.0			
		ТекстЗапроса = ТекстЗапроса + Символы.ПС +					
		"ЛЕВОЕ СОЕДИНЕНИЕ 
		|	РегистрСведений.ДанныеСотрудников КАК ДанныеСотрудников = Сотрудники.Ссылка";																
	ИначеЕсли ТипКонфигурации = 0 Тогда // старые конфигурации: ЗУП 2.5, УПП 1.2, ЗИК 1.0, КА 1.0		
		ТекстЗапроса = ТекстЗапроса + Символы.ПС +	
		"ЛЕВОЕ СОЕДИНЕНИЕ
		|	РегистрСведений.РаботникиОрганизаций.СрезПоследних(&НачалоПериода, ПричинаИзмененияСостояния <> &ПричинаИзмененияСостояния) КАК РаботникиОрганизацийСрезПоследних ПО РаботникиОрганизацийСрезПоследних.Сотрудник = Сотрудники.Ссылка";			
	КонецЕсли;
		
	// если один сотрудник
	Если Сотрудник <> Неопределено Тогда
		ТекстЗапроса = ТекстЗапроса + Символы.ПС +
		"ГДЕ
		|    Сотрудники.Ссылка = &Сотрудник";	
	КонецЕсли;	
	
	// сортировать сотрудников по наименованию
	ТекстЗапроса = ТекстЗапроса + Символы.ПС +		
	   "УПОРЯДОЧИТЬ ПО Сотрудники.Наименование";
	
	Запрос.Текст = ТекстЗапроса;
	
    // задать параметры запроса		
	Если ТипКонфигурации = 1 Тогда // ЗУП 3.0-3.1, ЗИК 3.0-3.1, КА 2.0, УП 2.4
		Запрос.УстановитьПараметр("НачалоМесяца", НачалоПериода);				
	ИначеЕсли ТипКонфигурации = 2 Тогда	// БП 3.0	
		Запрос.УстановитьПараметр("НачалоМесяца", НачалоПериода);
	ИначеЕсли ТипКонфигурации = 3 Тогда	// БГУ 1.0		
	ИначеЕсли ТипКонфигурации = 0 Тогда // старые конфигурации: ЗУП 2.5, УПП 1.2, ЗИК 1.0, КА 1.0	
		Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
		Запрос.УстановитьПараметр("ПричинаИзмененияСостояния", Перечисления.ПричиныИзмененияСостояния.Увольнение);						
	КонецЕсли;			
	Если Сотрудник <> Неопределено Тогда // если один сотрудник
		Запрос.УстановитьПараметр("Сотрудник", Сотрудник);
	КонецЕсли;	
	
	// выполнить запрос
	ТЗ = Запрос.Выполнить().Выгрузить();
	
	// заполнить реквизиты: Организация, ПодразделениеОрганизации, Должность, ГрафикРаботы  
	Если ТипКонфигурации = 0 Тогда	// только для конфигураций: ЗУП 2.5, УПП 1.2, ЗИК 1.0, КА 1.0
		Для каждого СтрокаСотрудник Из ТЗ Цикл
			Если СтрокаСотрудник.Ссылка <> ПустаяСсылка_Сотрудник И СтрокаСотрудник.Ссылка <> Неопределено Тогда
				Попытка
					Если СтрокаСотрудник.Организация = Null Тогда
						СтрокаСотрудник.Организация = СтрокаСотрудник.Ссылка.Организация; 
					КонецЕсли;					
					Если СтрокаСотрудник.ПодразделениеОрганизации = Null Тогда
						СтрокаСотрудник.ПодразделениеОрганизации = СтрокаСотрудник.Ссылка.ПодразделениеОрганизации; 
					КонецЕсли;										
					Если СтрокаСотрудник.Должность = Null Тогда
						СтрокаСотрудник.Должность = СтрокаСотрудник.Ссылка.Должность; 
					КонецЕсли;				
					Если СтрокаСотрудник.ГрафикРаботы = Null Тогда
						СтрокаСотрудник.ГрафикРаботы = СтрокаСотрудник.Ссылка.ГрафикРаботы; 
					КонецЕсли;								
				Исключение
				КонецПопытки;								
			КонецЕсли;
		КонецЦикла;			
	КонецЕсли;	
		
	Возврат ТЗ;
	
КонецФункции

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

// Описание: формирует график работы на каждый день отчётного периода. Возвращает таблицу значений "ТЗГрафик".
// Параметры: 
//     ГрафикРаботыСотрудника - график работы сотрудника;  
//     НачалоПериода          - начало периода;
//     КонецПериода           - конец периода;
//     ТипКонфигурации        - тип конфигурации (число).
//     ТЗГрафик               - таблица интервалов графика работы;
// Возвращаемое значение:
&НаСервереБезКонтекста
Процедура СформироватьГрафикЗаОтчётныйПериод_1С(ГрафикРаботыСотрудника, НачалоПериода, КонецПериода, ТипКонфигурации, ТЗГрафик)	
	
	// проверить наличие ссылки
	Попытка
		СсылкаНаГрафикРаботыСотрудника = ГрафикРаботыСотрудника.Ссылка;
	Исключение
		Возврат;  
	КонецПопытки;	
	
	// проверить, нужно ди добавлять график	
	НайденнаяСтрока = НайтиСтроку_НаСервере(ТЗГрафик, ГрафикРаботыСотрудника.Ссылка, "Ссылка");		
	Если НайденнаяСтрока <> Неопределено Тогда // график найден, формировать его не нужно
		Возврат;  
	КонецЕсли;		
		
	// создать временную таблицу интервалов сменного графика	
    ТЗДниГрафика = Новый ТаблицаЗначений;
	ТЗДниГрафика.Колонки.Добавить("Ссылка");
	ТЗДниГрафика.Колонки.Добавить("НомерДня");
	ТЗДниГрафика.Колонки.Добавить("ДеньНедели");
	ТЗДниГрафика.Колонки.Добавить("ВремяНачала");
	ТЗДниГрафика.Колонки.Добавить("ВремяОкончания");
	
	
    Если ТипКонфигурации = 1 ИЛИ ТипКонфигурации = 2 ИЛИ ТипКонфигурации = 3 Тогда						 
		 
		 // в данных конфигурациях нет интервалов графика работы
	     // поэтому график работы не заполняется
		 
	ИначеЕсли ТипКонфигурации = 0 Тогда
		
		Если ГрафикРаботыСотрудника.ВидГрафика = Перечисления.ВидыРабочихГрафиков.Сменный Тогда // сменный график		
			
			// получить интервалы сменного графика работы,
			// где "НомерДня" это смещение по времени, начиная от "ДатаОтсчета" сменного графика
			Запрос = Новый Запрос;
			Запрос.Текст = 
				"ВЫБРАТЬ
				|	СменыГрафикаРаботы.НомерДня,
				|	СменыПериодыСмены.ВремяНачала,
				|	СменыПериодыСмены.ВремяОкончания	
				|ИЗ
				|	Справочник.ГрафикиРаботы.Смены КАК СменыГрафикаРаботы	
				|ЛЕВОЕ СОЕДИНЕНИЕ 
				|  Справочник.Смены КАК СменыСправочника ПО СменыГрафикаРаботы.Смена = СменыСправочника.Ссылка		
				|ЛЕВОЕ СОЕДИНЕНИЕ 
				|  Справочник.Смены.ПериодыСмены КАК СменыПериодыСмены ПО СменыСправочника.Ссылка = СменыПериодыСмены.Ссылка				
				|ГДЕ
				|   СменыГрафикаРаботы.Ссылка = &Ссылка
				|УПОРЯДОЧИТЬ ПО СменыГрафикаРаботы.НомерДня, СменыПериодыСмены.ВремяНачала";						
			Запрос.Параметры.Вставить("Ссылка", ГрафикРаботыСотрудника.Ссылка);
			Выборка = Запрос.Выполнить().Выбрать();
			
			Пока Выборка.Следующий() Цикл	
				НоваяСтрока = ТЗДниГрафика.Добавить();     
				НоваяСтрока.Ссылка = ГрафикРаботыСотрудника.Ссылка;
				НоваяСтрока.НомерДня = Выборка.НомерДня;
				НоваяСтрока.ВремяНачала = Выборка.ВремяНачала; 
				НоваяСтрока.ВремяОкончания = Выборка.ВремяОкончания;
			КонецЦикла;		
			
			// сформировать сменный график на отчётный период.
			// в результате, ТЗГрафик заполняется на каждый день отчётного периода	
			Если ГрафикРаботыСотрудника.ДатаОтсчета < КонецПериода Тогда
				
				ТекДата = ГрафикРаботыСотрудника.ДатаОтсчета;
				Пока ТекДата <= КонецПериода + (60*60*24) Цикл	
					
					РасчетныйДень = ТекДата;			
					Для Каждого ДеньСменногоГрафика Из ТЗДниГрафика Цикл
						
						Если ДеньСменногоГрафика.НомерДня > 0 Тогда
							РасчетныйДень = ТекДата + (ДеньСменногоГрафика.НомерДня - 1) * (60*60*24);	
							Если РасчетныйДень > КонецПериода + (60*60*24) Тогда
								Прервать;
							КонецЕсли;
						КонецЕсли;
						
						Если НЕ ЗначениеЗаполнено(ДеньСменногоГрафика.ВремяНачала) Тогда
							ДеньСменногоГрафика.ВремяНачала = Дата(1,1,1);						
						КонецЕсли;			
						Если НЕ ЗначениеЗаполнено(ДеньСменногоГрафика.ВремяОкончания) Тогда
							ДеньСменногоГрафика.ВремяОкончания = Дата(1,1,1);						
						КонецЕсли;					
						
						Если РасчетныйДень >= НачалоПериода И РасчетныйДень <= КонецПериода Тогда		
							НоваяСтрока = ТЗГрафик.Добавить(); 
							НоваяСтрока.Ссылка = ГрафикРаботыСотрудника.Ссылка;
							НоваяСтрока.РасчетныйДень = Дата(Год(РасчетныйДень), Месяц(РасчетныйДень), День(РасчетныйДень));
							
							Если ДеньСменногоГрафика.ВремяОкончания > ДеньСменногоГрафика.ВремяНачала Тогда	
								СледДень = РасчетныйДень;		 
							Иначе
								СледДень = РасчетныйДень + (60*60*24);
							КонецЕсли;
							
							НоваяСтрока.ВремяНачала = Дата(Год(РасчетныйДень), Месяц(РасчетныйДень), День(РасчетныйДень), 
							Час(ДеньСменногоГрафика.ВремяНачала), Минута(ДеньСменногоГрафика.ВремяНачала), Секунда(ДеньСменногоГрафика.ВремяНачала));
							
							НоваяСтрока.ВремяОкончания = Дата(Год(СледДень), Месяц(СледДень), День(СледДень),
							Час(ДеньСменногоГрафика.ВремяОкончания), Минута(ДеньСменногоГрафика.ВремяОкончания), Секунда(ДеньСменногоГрафика.ВремяОкончания));	
						КонецЕсли;
						
					КонецЦикла;				
					ТекДата = РасчетныйДень;
					
					// Увеличение ровно на одни сутки
					ТекДата = ТекДата + (60*60*24); 	
				КонецЦикла;		
				
			КонецЕсли;					
			
		Иначе // недельный график
			
			Запрос = Новый Запрос;
			Запрос.Текст = 
				"ВЫБРАТЬ
				|	ПериодыСмены.ДеньНедели,
				|	ПериодыСмены.ВремяНачала,
				|	ПериодыСмены.ВремяОкончания	
				|ИЗ
				|	Справочник.ГрафикиРаботы.ПериодыСмены КАК ПериодыСмены					
				|ГДЕ
				|   ПериодыСмены.Ссылка = &Ссылка
				|УПОРЯДОЧИТЬ ПО ПериодыСмены.ДеньНедели, ПериодыСмены.ВремяНачала";			
			Запрос.Параметры.Вставить("Ссылка", ГрафикРаботыСотрудника.Ссылка);
			Выборка = Запрос.Выполнить().Выбрать();							
			Пока Выборка.Следующий() Цикл	
				НоваяСтрока = ТЗДниГрафика.Добавить();     
				НоваяСтрока.Ссылка = ГрафикРаботыСотрудника.Ссылка;
				НоваяСтрока.ДеньНедели = Выборка.ДеньНедели;
				НоваяСтрока.ВремяНачала = Выборка.ВремяНачала;
				НоваяСтрока.ВремяОкончания = Выборка.ВремяОкончания;
			КонецЦикла;		
			
			// сформировать график работы на отчётный период.
			// в результате, ТЗГрафик заполняется на каждый день отчётного периода	
			ТекДата = НачалоПериода;
			Пока ТекДата <= КонецПериода + (60*60*24) Цикл	
				
				Для Каждого ДеньНедельногоГрафика Из ТЗДниГрафика Цикл								
					Если НЕ ЗначениеЗаполнено(ДеньНедельногоГрафика.ВремяНачала) Тогда
						ДеньНедельногоГрафика.ВремяНачала = Дата(1,1,1);						
					КонецЕсли;				
					Если НЕ ЗначениеЗаполнено(ДеньНедельногоГрафика.ВремяОкончания) Тогда
						ДеньНедельногоГрафика.ВремяОкончания = Дата(1,1,1);						
					КонецЕсли;											
					ЗначениеПеречисления = ДеньНедельногоГрафика.ДеньНедели;
					ИмяПеречисления = ЗначениеПеречисления.Метаданные().Имя;
					ИндексЗначенияПеречисления = Перечисления[ИмяПеречисления].Индекс(ЗначениеПеречисления);			
					Если  ИндексЗначенияПеречисления + 1 = ДеньНедели(ТекДата) И ТекДата <= КонецПериода Тогда							
						НоваяСтрока = ТЗГрафик.Добавить(); 
						НоваяСтрока.Ссылка = ГрафикРаботыСотрудника.Ссылка;
						НоваяСтрока.РасчетныйДень = Дата(Год(ТекДата), Месяц(ТекДата), День(ТекДата));
						НоваяСтрока.ВремяНачала = Дата(Год(ТекДата), Месяц(ТекДата), День(ТекДата), Час(ДеньНедельногоГрафика.ВремяНачала), Минута(ДеньНедельногоГрафика.ВремяНачала), Секунда(ДеньНедельногоГрафика.ВремяНачала)); 
						НоваяСтрока.ВремяОкончания = Дата(Год(ТекДата), Месяц(ТекДата), День(ТекДата), Час(ДеньНедельногоГрафика.ВремяОкончания), Минута(ДеньНедельногоГрафика.ВремяОкончания), Секунда(ДеньНедельногоГрафика.ВремяОкончания)); 					
					КонецЕсли;
					
				КонецЦикла;
				
				// Увеличение ровно на одни сутки
				ТекДата = ТекДата + (60*60*24); 	
			КонецЦикла;							
			
		КонецЕсли;
	КонецЕсли;			
	
КонецПроцедуры

// Процедура с рекурсивным вызовом добавляет ветку дерева подразделений под организацию.
&НаСервереБезКонтекста 
Процедура ЗагрузитьДеревоПодразделений(ТипКонфигурации, УзелДерева, ОрганизацияСсылка, Родитель = Неопределено) 
	
	// пустая ссылка на подразделение	
	ПустыеСсылки = ПолучитьПустыеСсылки(ТипКонфигурации);
	ПустаяСсылка_Подразделение = ПустыеСсылки.ПустаяСсылка_Подразделение;
			
	// если родительское подразделение не указано, то присвоить пустую ссылку
	Если Родитель = Неопределено Тогда
		Родитель = ПустаяСсылка_Подразделение;      
	КонецЕсли;	
	
	Запрос = Новый Запрос;
	
	Если ТипКонфигурации = 3 Тогда // БГУ 1.0	
		Запрос.Текст = "ВЫБРАТЬ		
		|	Подразделения.Ссылка КАК Ссылка,
		|	Подразделения.Наименование КАК Наименование,
		|	Подразделения.Владелец КАК Владелец,
		|	Подразделения.Родитель КАК Родитель
		|ИЗ
		|	Справочник.Подразделения КАК Подразделения	
		|
		|ГДЕ  
		|   Подразделения.Владелец = &Организация		
		|
		|УПОРЯДОЧИТЬ ПО
		|	Ссылка ИЕРАРХИЯ";
	Иначе
		Запрос.Текст = "ВЫБРАТЬ		
		|	ПодразделенияОрганизаций.Ссылка КАК Ссылка,
		|	ПодразделенияОрганизаций.Наименование КАК Наименование,
		|	ПодразделенияОрганизаций.Владелец КАК Владелец,
		|	ПодразделенияОрганизаций.Родитель КАК Родитель
		|ИЗ
		|	Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций	
		|
		|ГДЕ  
		|   ПодразделенияОрганизаций.Владелец = &Организация И ПодразделенияОрганизаций.Родитель = &Родитель		
		|
		|УПОРЯДОЧИТЬ ПО
		|	Ссылка ИЕРАРХИЯ";		
	КонецЕсли;
	
    Запрос.УстановитьПараметр("Организация", ОрганизацияСсылка);
	Запрос.УстановитьПараметр("Родитель", Родитель);
	Выборка = Запрос.Выполнить().Выбрать();
		
	Пока Выборка.Следующий() Цикл
		
		ПодУзелДерева = УзелДерева.Строки.Добавить(); 
		ПодУзелДерева.Название = Выборка.Наименование;
		ПодУзелДерева.Ссылка = Выборка.Ссылка; 
		
		ЗагрузитьДеревоПодразделений(ТипКонфигурации, ПодУзелДерева, ОрганизацияСсылка, Выборка.Ссылка); // вызов функции с рекурсией 	
				
	КонецЦикла;	
		
КонецПроцедуры

// Описание: получает структуру родительских подразделений.
// Параметры: ТипКонфигурации - тип конфигурации (число), ПодразделениеСсылка - ссылка на подразделение организации, 
//   Результат - строковое значение.
// Возвращаемое значение: Строка - структура подразделений.
&НаСервереБезКонтекста
Функция ПолучитьРодительскиеПодразделения(ТипКонфигурации, ПодразделениеСсылка, Результат)
	
	// пустая ссылка на подразделение	
	ПустыеСсылки = ПолучитьПустыеСсылки(ТипКонфигурации);
	ПустаяСсылка_Подразделение = ПустыеСсылки.ПустаяСсылка_Подразделение;	
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ		
	|	ПодразделенияОрганизаций.Ссылка КАК Ссылка,
	|	ПодразделенияОрганизаций.Наименование КАК Наименование,
	|	ПодразделенияОрганизаций.Владелец КАК Владелец,
	|	ПодразделенияОрганизаций.Родитель КАК Родитель
	|ИЗ
	|	Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций	
	|
	|ГДЕ  
	|   ПодразделенияОрганизаций.Ссылка = &Подразделение		
	|
	|УПОРЯДОЧИТЬ ПО
	|	Ссылка ИЕРАРХИЯ";	
    Запрос.УстановитьПараметр("Подразделение", ПодразделениеСсылка);
	Выборка = Запрос.Выполнить().Выбрать();
	
	Пока Выборка.Следующий() Цикл							
		Если Выборка.Родитель <> ПустаяСсылка_Подразделение Тогда
		    Результат = Строка(Выборка.Родитель) + "\" + Результат;  	
			ПолучитьРодительскиеПодразделения(ТипКонфигурации, Выборка.Родитель, Результат); // вызов функции с рекурсией	
		КонецЕсли;		
	КонецЦикла;	
	
	Возврат Результат;
		
КонецФункции

// Описание: сохраняет строку в протокол на дату события.
// Параметры: СтрокаПрохода - строка прохода, СтрокаДень - текстовое значение даты, ТипДвоичныхДанных - тип двоичных данных (число).
// Возвращаемое значение:
&НаСервереБезКонтекста
Процедура СохранитьПроходНаДатуСобытия(СтрокаПрохода, СтрокаДень, ТипДвоичныхДанных)
				
	НаименованиеДанных = "БолидУРВ: " + СтрокаДень;
		
	Если ТипДвоичныхДанных = 1 Тогда		
		// найти протокол на данный день		
		ТекущееХранилище = Справочники.Файлы.НайтиПоНаименованию(НаименованиеДанных, Истина);
		Если ТекущееХранилище = Справочники.Файлы.ПустаяСсылка() Тогда
			НовыйЭлемент = Справочники.Файлы.СоздатьЭлемент();
			НовыйЭлемент.Наименование = НаименованиеДанных;
			Попытка
			    НовыйЭлемент.ПолноеНаименование = НаименованиеДанных;
		    Исключение
			КонецПопытки;
			НовыйЭлемент.ВладелецФайла = Справочники.ПапкиФайлов.НайтиПоНаименованию("Шаблоны файлов", Истина);
			НовыйЭлемент.ИндексКартинки = 10;
			НовыйЭлемент.ДатаСоздания = ТекущаяДата();
			НовыйЭлемент.Записать();
			ТекущееХранилище = НовыйЭлемент.Ссылка;		
		КонецЕсли;						
		
		// получить протокол
		ТЗ = ТекущееХранилище.ТекстХранилище.Получить();
		
		Если ТЗ = Неопределено Тогда	
		    ТЗ = СоздатьТаблицуПротокола();
		КонецЕсли;
		// добавить новую запись
		НоваяЗапись = ТЗ.Добавить();
		// заполнить новую запись значениями
		ЗаполнитьЗначенияСвойств(НоваяЗапись, СтрокаПрохода);		
		
		// сохранить протокол на данный день
		ОбъектХранилище = ТекущееХранилище.ПолучитьОбъект();
		ОбъектХранилище.ТекстХранилище = Новый ХранилищеЗначения(ТЗ);
		ОбъектХранилище.Записать();			
	ИначеЕсли ТипДвоичныхДанных = 2 Тогда	
		// найти протокол на данный день		
		ТекущееХранилище = Справочники.Файлы.НайтиПоНаименованию(НаименованиеДанных, Истина);
		Если ТекущееХранилище = Справочники.Файлы.ПустаяСсылка() Тогда
			НовыйЭлемент = Справочники.Файлы.СоздатьЭлемент();
			НовыйЭлемент.Наименование = НаименованиеДанных;
			Попытка
			    НовыйЭлемент.ПолноеНаименование = НаименованиеДанных;
		    Исключение
			КонецПопытки;			
			НовыйЭлемент.ВладелецФайла = Справочники.ПапкиФайлов.НайтиПоНаименованию("Шаблоны файлов", Истина);
			НовыйЭлемент.ИндексКартинки = 10;
			НовыйЭлемент.ДатаСоздания = ТекущаяДата();
			НовыйЭлемент.Записать();
			ТекущееХранилище = НовыйЭлемент.Ссылка;		
		КонецЕсли;						
		
		// получить протокол
		ТЗ = ТекущееХранилище.ФайлХранилище.Получить();
		Если ТЗ = Неопределено Тогда
		    ТЗ = СоздатьТаблицуПротокола();
		КонецЕсли;
		// добавить новую запись
		НоваяЗапись = ТЗ.Добавить();
		// заполнить новую запись значениями
		ЗаполнитьЗначенияСвойств(НоваяЗапись, СтрокаПрохода);		
		
		// сохранить протокол на данный день
		ОбъектХранилище = ТекущееХранилище.ПолучитьОбъект();
		ОбъектХранилище.ФайлХранилище = Новый ХранилищеЗначения(ТЗ);
		ОбъектХранилище.Записать();						
	Иначе	
		// найти протокол на данный день
		ТекущееХранилище = Справочники.ХранилищеДополнительнойИнформации.НайтиПоНаименованию(НаименованиеДанных, Истина);
		Если ТекущееХранилище = Справочники.ХранилищеДополнительнойИнформации.ПустаяСсылка() Тогда
			НовыйЭлемент = Справочники.ХранилищеДополнительнойИнформации.СоздатьЭлемент();
			НовыйЭлемент.Наименование = НаименованиеДанных;
			Попытка
			    НовыйЭлемент.ПолноеНаименование = НаименованиеДанных;
		    Исключение
			КонецПопытки;			
			НовыйЭлемент.ВидДанных = Перечисления.ВидыДополнительнойИнформацииОбъектов.Файл;
			НовыйЭлемент.Записать();
			ТекущееХранилище = НовыйЭлемент.Ссылка;		
		КонецЕсли;						
		
		// получить протокол
		ТЗ = ТекущееХранилище.Хранилище.Получить();
		Если ТЗ = Неопределено Тогда
		    ТЗ = СоздатьТаблицуПротокола();
		КонецЕсли;
		// добавить новую запись
		НоваяЗапись = ТЗ.Добавить();
		// заполнить новую запись значениями
		ЗаполнитьЗначенияСвойств(НоваяЗапись, СтрокаПрохода);		
		
		// сохранить протокол на данный день
		ОбъектХранилище = ТекущееХранилище.ПолучитьОбъект();
		ОбъектХранилище.Хранилище = Новый ХранилищеЗначения(ТЗ);
		ОбъектХранилище.Записать();		
    КонецЕсли;	
	
КонецПроцедуры

// Описание: загружает проходы из базы 1С в табличную часть "ТЗПротокол". 
// Параметры:
//     ТЗПротокол           - таблица протокола (содержит проходы);
//     аДатаНачала          - дата начала выборки;
//     аДатаОкончания       - дата окончания выборки;
//     аОрганизация         - организация;
//     аПодразделение       - подразделение организации;
//	   СписокСотрудников    - таблица сотрудников; 
//	   ПроходыПоКнопке      - признак загрузки проходов по кнопке;
//	   ПроходыЗапретДоступа - признак загрузки проходов "Запрет доступа";
//	   ТЗФотоверификация    - таблица рабочих мест с фотоверификацией;
//	   ВыводитьСообщения    - признак вывода сообщений в окно служебных сообщений;
// Возвращаемое значение:
&НаСервере
Процедура ПолучитьПротоколИзБазы1С(ТЗПротокол, аДатаНачала, аДатаОкончания, аОрганизация, аПодразделение,
	СписокСотрудников, ПроходыПоКнопке, ПроходыЗапретДоступа, ТЗФотоверификация = Неопределено, ПоказыватьФормуПрогрессора)
			
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");	
	
	Если ЗначениеЗаполнено(аДатаНачала) Тогда	
		ДатаНачала = НачалоДня(аДатаНачала); 
	Иначе
		ДатаНачала = аДатаНачала;
	КонецЕсли;		
	
	Если ЗначениеЗаполнено(аДатаОкончания) Тогда	
		ДатаОкончания = КонецДня(аДатаОкончания); 
	Иначе
		ДатаОкончания = аДатаОкончания;
	КонецЕсли;	
			
	КоличествоЗаписей = 0;
	НачалоЗапросаПротокола = ТекущаяДата(); // запомнить время начала 
			
	Если ПоказыватьФормуПрогрессора Тогда
		СсылкаНаФормуПрогрессора = ОткрытьФормуПрогрессора("Запрос событий вход/выход...");	
		ФормаПрогрессора = ПолучитьИзВременногоХранилища(СсылкаНаФормуПрогрессора); 
		Если ФормаПрогрессора <> Неопределено Тогда
			ЗадержкаНа(0.1);
		КонецЕсли;		
	Иначе
		ФормаПрогрессора = Неопределено; 
	КонецЕсли;
	
	ТЗПротокол.Очистить();
				
	Запрос = Новый Запрос;
			
	Если ТипДвоичныхДанных = 1 Тогда
		Запрос.Текст = "ВЫБРАТЬ
		|	ДополнительнаяИнформация.Ссылка,
		|	ДополнительнаяИнформация.Наименование,
		|   ДополнительнаяИнформация.ТекстХранилище
		|ИЗ
		|	Справочник.Файлы КАК ДополнительнаяИнформация
		|ГДЕ ПОДСТРОКА(ДополнительнаяИнформация.Наименование, 1, 8) = &Болид И
		|    ПОДСТРОКА(ДополнительнаяИнформация.Наименование, 13, 1) = &Разделитель И
		|    ПОДСТРОКА(ДополнительнаяИнформация.Наименование, 16, 1) = &Разделитель";
	ИначеЕсли ТипДвоичныхДанных = 2 Тогда
		Запрос.Текст = "ВЫБРАТЬ
		|	ДополнительнаяИнформация.Ссылка,
		|	ДополнительнаяИнформация.Наименование,
		|   ДополнительнаяИнформация.ФайлХранилище
		|ИЗ
		|	Справочник.Файлы КАК ДополнительнаяИнформация
		|ГДЕ ПОДСТРОКА(ДополнительнаяИнформация.Наименование, 1, 8) = &Болид И
		|    ПОДСТРОКА(ДополнительнаяИнформация.Наименование, 13, 1) = &Разделитель И
		|    ПОДСТРОКА(ДополнительнаяИнформация.Наименование, 16, 1) = &Разделитель";		
    Иначе	
		Запрос.Текст = "ВЫБРАТЬ
		|	ДополнительнаяИнформация.Ссылка,
		|	ДополнительнаяИнформация.Наименование,
		|   ДополнительнаяИнформация.Хранилище
		|ИЗ
		|	Справочник.ХранилищеДополнительнойИнформации КАК ДополнительнаяИнформация
		|ГДЕ ПОДСТРОКА(ДополнительнаяИнформация.Наименование, 1, 8) = &Болид И
		|    ПОДСТРОКА(ДополнительнаяИнформация.Наименование, 13, 1) = &Разделитель И
		|    ПОДСТРОКА(ДополнительнаяИнформация.Наименование, 16, 1) = &Разделитель";		
	КонецЕсли;	
		
	Запрос.Параметры.Вставить("Болид", "БолидУРВ");
	Запрос.Параметры.Вставить("Разделитель", "_");
    Выборка = Запрос.Выполнить().Выбрать();	
		
	Если ФормаПрогрессора <> Неопределено Тогда	
		ФормаПрогрессора.Значение = 0;
		ФормаПрогрессора.УстановитьМаксимальноеЗначение(Выборка.Количество());
	КонецЕсли;	
		
	Пока Выборка.Следующий() Цикл
			
		ОдинДень = Сред(Выборка.Наименование, 11, 10);	
		СтрДень = СтрЗаменить(ОдинДень, "_", ".");
		ДатаПротокола = ПолучитьДатуИзСтроки_НаСервере(СтрДень);
		
		Если ДатаПротокола >= ДатаНачала И ДатаПротокола <= ДатаОкончания Тогда
			
			ФлагВыборки = Ложь;
			Если ТипДвоичныхДанных = 1 ИЛИ ТипДвоичныхДанных = 2 Тогда
				// чтение данных из справочника "Файлы"	
				ТекущееХранилище = Справочники.Файлы.НайтиПоНаименованию("БолидУРВ: " + ОдинДень, Истина);
				Если ТекущееХранилище <> Справочники.Файлы.ПустаяСсылка() Тогда
					ФлагВыборки = Истина;
				КонецЕсли;				
			Иначе
				// чтение данных из справочника "Дополнительная информация"	
				ТекущееХранилище = Справочники.ХранилищеДополнительнойИнформации.НайтиПоНаименованию("БолидУРВ: " + ОдинДень, Истина);
				Если ТекущееХранилище <> Справочники.ХранилищеДополнительнойИнформации.ПустаяСсылка() Тогда
					ФлагВыборки = Истина;
				КонецЕсли;
			КонецЕсли;			
					
			Если ФлагВыборки Тогда
			
				Попытка		
					// получить табличные данные
	               Если ТипДвоичныхДанных = 1 Тогда
						ТЗ = ТекущееХранилище.ТекстХранилище.Получить();
					ИначеЕсли ТипДвоичныхДанных = 2 Тогда
						ТЗ = ТекущееХранилище.ФайлХранилище.Получить();
					Иначе
					    ТЗ = ТекущееХранилище.Хранилище.Получить();
					КонецЕсли;					
									
					// копировать загруженные данные
					Для Каждого табСтрока Из ТЗ Цикл
												
						Если ТЗ.Колонки.Найти("Доступ") = Неопределено Тогда
							Доступ = 1; // для совместимости со старыми данными
						Иначе
							Доступ = табСтрока.Доступ;
							Если НЕ ПроходыЗапретДоступа И Доступ = 0 Тогда
								Продолжить; // не брать события "Запрет доступа"
							КонецЕсли;								
						КонецЕсли;
										
						// отбор по времени события							
						Если (НЕ ЗначениеЗаполнено(ДатаНачала) ИЛИ (табСтрока.ВремяСобытия >= ДатаНачала)) Тогда	
						Иначе
							Продолжить;
						КонецЕсли;
						
						Если (НЕ ЗначениеЗаполнено(ДатаОкончания) ИЛИ (табСтрока.ВремяСобытия <= ДатаОкончания)) Тогда	
						Иначе
							Продолжить;
						КонецЕсли;
												
                        // не существующий сотрудник
						Если Лев(табСтрока.Сотрудник, 18) = "<Объект не найден>" Тогда
							Продолжить;
						КонецЕсли;
						
						// нужно ли учитывать проход 
			            ФлагУчитыватьПроход = ПоказыватьПроход_НаСервере(табСтрока.МАС, табСтрока.СетевойАдрес, табСтрока.Адрес, ТЗФотоверификация <> Неопределено);
						Если НЕ ФлагУчитыватьПроход Тогда
							Продолжить;  
					    КонецЕсли;						
						
						Сотрудник = табСтрока.Сотрудник;
						ФлагДобавитьЗапись = Истина;	
																		
						Если Сотрудник <> Неопределено И Сотрудник <> ПустаяСсылка_Сотрудник Тогда
							// отбор по организации
							Если (аОрганизация <> Неопределено) И (аОрганизация <> ПустаяСсылка_Организация) Тогда
								Если Сотрудник.Организация <> аОрганизация Тогда
									ФлагДобавитьЗапись = Ложь;
								КонецЕсли;
							КонецЕсли;	
							// отбор по подразделению организации
							Если (аПодразделение <> Неопределено) И (аПодразделение <> ПустаяСсылка_Подразделение) Тогда
								Если (Сотрудник.ПодразделениеОрганизации <> аПодразделение) Тогда
									ФлагДобавитьЗапись = Ложь;
								КонецЕсли;						
							КонецЕсли;   
							// отбор по сотруднику
							Если (СписокСотрудников <> Неопределено) И (СписокСотрудников.Количество() > 0) Тогда					
								ФлагДобавитьЗапись = Ложь;
								Для Каждого ЗаписьСотрудник Из СписокСотрудников Цикл					
									Если Сотрудник = ЗаписьСотрудник.Сотрудник Тогда
										ФлагДобавитьЗапись = Истина;
										Прервать;
									КонецЕсли;														
								КонецЦикла;											  
							КонецЕсли;
						Иначе																
							Если НЕ ПроходыПоКнопке Тогда       
								Продолжить; // не брать события прохода по кнопке
							КонецЕсли;																				
						КонецЕсли;
																		
						Если ФлагДобавитьЗапись Тогда							
							НовСтрока = ТЗПротокол.Добавить();
							ЗаполнитьЗначенияСвойств(НовСтрока, табСтрока);
							Если Элементы.ТФПротоколТочкаДоступа.Видимость Тогда
							    НовСтрока.НазваниеТочкиДоступа = ПолучитьНазваниеТочкиДоступа_НаСервере(НовСтрока.СетевойАдрес, НовСтрока.МАС, НовСтрока.Адрес);
							Иначе
								НовСтрока.НазваниеТочкиДоступа = ""; 
							КонецЕсли;
							НовСтрока.Доступ = Доступ; // для совместимости со старыми данными
							КоличествоЗаписей = КоличествоЗаписей + 1;
						КонецЕсли;							
												
					КонецЦикла;
				Исключение
					СообщитьНаСервере(Формат(ТекущаяДата(), "ДЛФ=ДВ") + " " + "Данные из справочника дополнительной информации не считываются: "+СтрДень+".", СтатусСообщения.ОченьВажное);				
				КонецПопытки;
				
			КонецЕсли;
		КонецЕсли;		
		
		Если ФормаПрогрессора <> Неопределено Тогда
			ФормаПрогрессора.Значение = ФормаПрогрессора.Значение + 1;
			ФормаПрогрессора.ОбновитьОтображениеДанных();
		КонецЕсли;			
		
	КонецЦикла;
		
	ТЗПротокол.Сортировать("ВремяСобытия");
	
	Если ФормаПрогрессора <> Неопределено Тогда
		СсылкаНаФормуПрогрессора = ПоместитьВоВременноеХранилище(ФормаПрогрессора);
		ЗакрытьФормуПрогрессора(СсылкаНаФормуПрогрессора);	
	КонецЕсли;		
	
КонецПроцедуры

// Описание: сохраняет протокол "ТЗПротокол" в базу 1С на данную дату.
// Параметры:
//     ТипДвоичныхДанных    - тип двоичных данных (число);
//     ТЗПротокол           - таблица протокола (содержит проходы);
//     ДатаПротокола        - дата протокола;
//     Перезаписывать       - признак перезаписи протокола;
// Возвращаемое значение: признак выполнения функции (истина или ложь).
&НаСервереБезКонтекста
Функция СохранитьПротоколВБазу1С(ТипДвоичныхДанных, ТЗПротокол, ДатаПротокола, Перезаписывать = Истина)
	
    НаименованиеДанных = "БолидУРВ: " + ДатаПротокола;	
		
	Если ТипДвоичныхДанных = 1 Тогда
		
		// найти протокол на данный день		
		ТекущееХранилище = Справочники.Файлы.НайтиПоНаименованию(НаименованиеДанных);
		Если ТекущееХранилище = Справочники.Файлы.ПустаяСсылка() Тогда
			НовыйЭлемент = Справочники.Файлы.СоздатьЭлемент();
			НовыйЭлемент.Наименование = НаименованиеДанных;
			НовыйЭлемент.ВладелецФайла = Справочники.ПапкиФайлов.НайтиПоНаименованию("Шаблоны файлов");
			НовыйЭлемент.ИндексКартинки = 10;
			НовыйЭлемент.ДатаСоздания = ТекущаяДата();
			НовыйЭлемент.Записать();
			ТекущееХранилище = НовыйЭлемент.Ссылка;		
		КонецЕсли;						
							
		Если Перезаписывать Тогда // перезаписать протокол на данный день	
			 ОбъектХранилище = ТекущееХранилище.ПолучитьОбъект();
			 ОбъектХранилище.ТекстХранилище = Новый ХранилищеЗначения(ТЗПротокол);
			 ОбъектХранилище.Записать();			 
		 Иначе // добавлять записи в протокол
			 ТЗ = ТекущееХранилище.ТекстХранилище.Получить();
			 Для Каждого ТекЗапись Из ТЗПротокол Цикл
				 НоваяЗапись = ТЗ.Добавить();
				 ЗаполнитьЗначенияСвойств(НоваяЗапись, ТекЗапись);
			 КонецЦикла;
			 ОбъектХранилище = ТекущееХранилище.ПолучитьОбъект();
			 ОбъектХранилище.ТекстХранилище = Новый ХранилищеЗначения(ТЗ);
			 ОбъектХранилище.Записать();				 	 
		 КонецЕсли;	 
			
	ИначеЕсли ТипДвоичныхДанных = 2 Тогда
		
		// найти протокол на данный день		
		ТекущееХранилище = Справочники.Файлы.НайтиПоНаименованию(НаименованиеДанных);
		Если ТекущееХранилище = Справочники.Файлы.ПустаяСсылка() Тогда
			НовыйЭлемент = Справочники.Файлы.СоздатьЭлемент();
			НовыйЭлемент.Наименование = НаименованиеДанных;
			НовыйЭлемент.ВладелецФайла = Справочники.ПапкиФайлов.НайтиПоНаименованию("Шаблоны файлов");
			НовыйЭлемент.ИндексКартинки = 10;
			НовыйЭлемент.ДатаСоздания = ТекущаяДата();
			НовыйЭлемент.Записать();
			ТекущееХранилище = НовыйЭлемент.Ссылка;		
		КонецЕсли;						
							
		Если Перезаписывать Тогда // перезаписать протокол на данный день	
			 ОбъектХранилище = ТекущееХранилище.ПолучитьОбъект();
			 ОбъектХранилище.ФайлХранилище = Новый ХранилищеЗначения(ТЗПротокол);
			 ОбъектХранилище.Записать();			 
		 Иначе // добавлять записи в протокол
			 ТЗ = ТекущееХранилище.ФайлХранилище.Получить();
			 Для Каждого ТекЗапись Из ТЗПротокол Цикл
				 НоваяЗапись = ТЗ.Добавить();
				 ЗаполнитьЗначенияСвойств(НоваяЗапись, ТекЗапись);
			 КонецЦикла;
			 ОбъектХранилище = ТекущееХранилище.ПолучитьОбъект();
			 ОбъектХранилище.ФайлХранилище = Новый ХранилищеЗначения(ТЗ);
			 ОбъектХранилище.Записать();				 	 
		 КонецЕсли;			
		
	Иначе	
		// найти протокол на данный день
		ТекущееХранилище = Справочники.ХранилищеДополнительнойИнформации.НайтиПоНаименованию(НаименованиеДанных);
		Если ТекущееХранилище = Справочники.ХранилищеДополнительнойИнформации.ПустаяСсылка() Тогда		
			НовыйЭлемент = Справочники.ХранилищеДополнительнойИнформации.СоздатьЭлемент();
			НовыйЭлемент.Наименование = НаименованиеДанных;
			НовыйЭлемент.ВидДанных = Перечисления.ВидыДополнительнойИнформацииОбъектов.Файл;
			НовыйЭлемент.Записать();
			ТекущееХранилище = НовыйЭлемент.Ссылка;		
		КонецЕсли;
		
		Если Перезаписывать Тогда // перезаписать протокол на данный день	
			ОбъектХранилище = ТекущееХранилище.ПолучитьОбъект();
			ОбъектХранилище.Хранилище = Новый ХранилищеЗначения(ТЗПротокол);
			ОбъектХранилище.Записать();
		Иначе // добавлять записи в протокол
			ТЗ = ТекущееХранилище.Хранилище.Получить();
			Для Каждого ТекЗапись Из ТЗПротокол Цикл
				НоваяЗапись = ТЗ.Добавить();
				ЗаполнитьЗначенияСвойств(НоваяЗапись, ТекЗапись);
			КонецЦикла;
			ОбъектХранилище = ТекущееХранилище.ПолучитьОбъект();
			ОбъектХранилище.Хранилище = Новый ХранилищеЗначения(ТЗ);
			ОбъектХранилище.Записать();		
		КонецЕсли;
	КонецЕсли;
	
	Возврат Истина;
	
КонецФункции

// Описание: загружает ключи.
// Параметры: Ссылка - ссылка на организацию или подразделение организации. 
// Возвращаемое значение:
&НаСервере
Процедура КлючиОбновитьКлючиНаСервере(Ссылка)
	
	ТЗКлючиВыборка.Очистить();		
	
	// получить таблицу сотрудников
    ТЗСотрудники = ПолучитьТаблицуСотрудников(ТекущаяДата(), Неопределено, ТипКонфигурации);		
	
	// заполнить табличное поле ключей						
	Для каждого Ключ Из Объект.Ключи Цикл			
		
		ФлагДобавить = Ложь;
		АктуальныеДанные = ПолучитьАктуальныеДанныеСотрудника(ТипКонфигурации, Ключ.Сотрудник, ТекущаяДата(), ТЗСотрудники); 
		
		// отбор по критерию "Организация" и "ПодразделениеОрганизации"
		Если ТипКонфигурации = 1 ИЛИ ТипКонфигурации = 2 Тогда	// ЗУП 3.0-3.1, ЗИК 3.0-3.1, КА 2.0
			// БП 3.0
			Если Ссылка = Неопределено Тогда
				ФлагДобавить = Истина;
			ИначеЕсли Ключ.Сотрудник <> Неопределено Тогда					
				Если Ключ.Сотрудник.ГоловнаяОрганизация = Ссылка Тогда
					ФлагДобавить = Истина;
				Иначе	
					ФлагДобавить = Ложь;
					Если Ключ.Сотрудник.ГоловнаяОрганизация <> ПустаяСсылка_Организация Тогда	
						Если Ключ.Сотрудник.ГоловнаяОрганизация = Ссылка.ГоловнаяОрганизация Тогда														
							Если АктуальныеДанные.ПодразделениеОрганизации = Ссылка Тогда
								ФлагДобавить = Истина;
							КонецЕсли;
						КонецЕсли;
					КонецЕсли;	
				КонецЕсли;			
			КонецЕсли;	
			
		ИначеЕсли ТипКонфигурации = 3 Тогда	// БГУ 1.0
			
			Если Ссылка = Неопределено Тогда
				ФлагДобавить = Истина;
			ИначеЕсли Ключ.Сотрудник <> Неопределено Тогда					
				Если Ключ.Сотрудник.Владелец = Ссылка Тогда
					ФлагДобавить = Истина;
				Иначе	
					ФлагДобавить = Ложь;
					Если Ключ.Сотрудник.Владелец <> ПустаяСсылка_Организация Тогда	
						Если Ключ.Сотрудник.Владелец = Ссылка.Владелец Тогда														
							Если АктуальныеДанные.ПодразделениеОрганизации = Ссылка Тогда
								ФлагДобавить = Истина;
							КонецЕсли;
						КонецЕсли;
					КонецЕсли;	
				КонецЕсли;			
			КонецЕсли;	
			
		ИначеЕсли ТипКонфигурации = 0 Тогда // ЗУП 2.5, УПП 1.2, ЗИК 1.0, КА 1.0
			
			Если Ссылка = Неопределено Тогда
				ФлагДобавить = Истина;
			Иначе
				ФлагДобавить = (Ключ.Сотрудник.Организация = Ссылка) ИЛИ (Ключ.Сотрудник.ПодразделениеОрганизации = Ссылка);
			КонецЕсли;	
			
		КонецЕсли;
		
		// отбор по критерию "уволен"						
		Если Элементы.КлючиНеУволенные.Пометка Тогда			
			Если АктуальныеДанные = Неопределено Тогда
				АктуальныеДанные = ПолучитьАктуальныеДанныеСотрудника(ТипКонфигурации, Ключ.Сотрудник, ТекущаяДата(), Неопределено);
			КонецЕсли;			
			Если АктуальныеДанные.Уволен Тогда
				ФлагДобавить = Ложь;
			КонецЕсли;			
		КонецЕсли;				
		
		Если ФлагДобавить Тогда
			НоваяЗапись = ТЗКлючиВыборка.Добавить();
			НоваяЗапись.НомерСтроки = Ключ.НомерСтроки;
			НоваяЗапись.Сотрудник = Ключ.Сотрудник;
			НоваяЗапись.ТабельныйНомер = Ключ.Сотрудник.Код;
			НоваяЗапись.КодКлюча = Ключ.КодКлюча;
			НоваяЗапись.ДатаНачала = Ключ.ДатаНачала;
			НоваяЗапись.ДатаОкончания = Ключ.ДатаОкончания;
			
			// найти группу доступа								
			НайденнаяГруппаДоступа = НайтиСтроку_НаСервере(Объект.ГруппыДоступа, Ключ.ГруппаДоступа, "ИД");		
			Если НайденнаяГруппаДоступа <> Неопределено Тогда		 
				НоваяЗапись.ГруппаДоступаНазвание = НайденнаяГруппаДоступа.Название;
				НоваяЗапись.ГруппаДоступаИД = НайденнаяГруппаДоступа.ИД;
			Иначе
				НоваяЗапись.ГруппаДоступаНазвание = "";	
				НоваяЗапись.ГруппаДоступаИД = "";
			КонецЕсли;	
			
			НоваяЗапись.Записывать = Ключ.Записывать;
			НоваяЗапись.Доступ = Ключ.Доступ;
			
			НоваяЗапись.Комментарий = Ключ.Комментарий;
			НоваяЗапись.ИД = Ключ.ИД;	
			НоваяЗапись.Уволен = АктуальныеДанные.Уволен;
		КонецЕсли;
		
	КонецЦикла;				
	
	ТЗКлючиВыборка.Сортировать("Сотрудник");
	
КонецПроцедуры

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

// Описание: ищет сотрудника по наименованию.
// Параметры: Наименование - наименование сотрудника, ТипКонфигурации - тип конфигурации (число).
// Возвращаемое значение: Истина - сотрудник найден, Ложь - сотрудник не найден.
&НаСервереБезКонтекста
Функция НайтиСотрудникаПоНаименованию(Наименование, ТипКонфигурации)
	
	Если ТипКонфигурации <> 0 Тогда
		НайденныйСотрудник = Справочники.Сотрудники.НайтиПоНаименованию(Наименование, Истина);
	Иначе
		НайденныйСотрудник = Справочники.СотрудникиОрганизаций.НайтиПоНаименованию(Наименование, Истина);
	КонецЕсли;	
	
	Возврат НайденныйСотрудник;
	
КонецФункции

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

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

// Описание: выполняет запрос табелей из базы 1С.
// Параметры:  
// Возвращаемое значение:
&НаСервере
Функция ТабелиУРВОбновитьНаСервере()
	
	ТЗТабелиУРВ.Очистить();				
	Запрос = Новый Запрос;
	Если ТипКонфигурации <> 0 Тогда 		
	    Запрос.Текст = "ВЫБРАТЬ
		|	Табель.*
		|ИЗ
		|	Документ.ТабельУчетаРабочегоВремени КАК Табель
		|   УПОРЯДОЧИТЬ ПО Табель.ДатаНачалаПериода, Табель.ДатаОкончанияПериода";
	Иначе
		Запрос.Текст = "ВЫБРАТЬ
		|	Табель.*
		|ИЗ
		|	Документ.ТабельУчетаРабочегоВремениОрганизации КАК Табель
		|   УПОРЯДОЧИТЬ ПО Табель.ДатаНачалаПериода, Табель.ДатаОкончанияПериода";	
		
	КонецЕсли;
	ТЗТабелиУРВ.Загрузить(Запрос.Выполнить().Выгрузить());
	
	Возврат Истина;
		
КонецФункции

// Описание: создаёт новый документ "Табель УРВ".
// Параметры: ТипКонфигурации - тип конфигурации (число). 
// Возвращаемое значение: ссылка на добавленный документ.
&НаСервереБезКонтекста
Функция СоздатьНовыйДокументТабельУРВ(ТипКонфигурации)
		
	Если ТипКонфигурации <> 0 Тогда		
		НовыйДокумент = Документы.ТабельУчетаРабочегоВремени.СоздатьДокумент();	
	Иначе		
		НовыйДокумент = Документы.ТабельУчетаРабочегоВремениОрганизации.СоздатьДокумент();	
	КонецЕсли;	
	
	НовыйДокумент.Дата = ТекущаяДата();
			
	Возврат НовыйДокумент.Ссылка;	
	
КонецФункции

// Описание: получает пустые ссылки.
// Параметры: ТипКонфигурации - тип конфигурации (число). 
// Возвращаемое значение: струкрура пустых ссылок.
&НаСервереБезКонтекста
Функция ПолучитьПустыеСсылки(ТипКонфигурации);
	
	ПустаяСсылка_Организация   = Неопределено;
	ПустаяСсылка_Подразделение = Неопределено;
    ПустаяСсылка_Должность     = Неопределено;
    ПустаяСсылка_Сотрудник     = Неопределено;	
    ПустаяСсылка_ГрафикРаботы  = Неопределено;	
	
	Если ТипКонфигурации = 1 ИЛИ ТипКонфигурации = 2 Тогда
		
		ПустаяСсылка_Организация   = Справочники.Организации.ПустаяСсылка();
		ПустаяСсылка_Подразделение = Справочники.ПодразделенияОрганизаций.ПустаяСсылка();
		ПустаяСсылка_Должность     = Справочники.Должности.ПустаяСсылка();
		ПустаяСсылка_Сотрудник     = Справочники.Сотрудники.ПустаяСсылка();	
		Попытка
		    ПустаяСсылка_ГрафикРаботы = Справочники.ГрафикиРаботыСотрудников.ПустаяСсылка();
		Исключение
			ПустаяСсылка_ГрафикРаботы = Неопределено;
		КонецПопытки;
				
	ИначеЕсли ТипКонфигурации = 3 Тогда
		
		ПустаяСсылка_Организация   = Справочники.Организации.ПустаяСсылка();
		ПустаяСсылка_Подразделение = Справочники.Подразделения.ПустаяСсылка();
		ПустаяСсылка_Должность     = Справочники.Должности.ПустаяСсылка();
		ПустаяСсылка_Сотрудник     = Справочники.Сотрудники.ПустаяСсылка();	
		Попытка
		    ПустаяСсылка_ГрафикРаботы = Справочники.ГрафикиРаботыСотрудников.ПустаяСсылка();
		Исключение
			ПустаяСсылка_ГрафикРаботы = Неопределено;
		КонецПопытки;
				
	ИначеЕсли ТипКонфигурации = 0 Тогда
		
		ПустаяСсылка_Организация   = Справочники.Организации.ПустаяСсылка();
		ПустаяСсылка_Подразделение = Справочники.ПодразделенияОрганизаций.ПустаяСсылка();
		ПустаяСсылка_Должность     = Справочники.ДолжностиОрганизаций.ПустаяСсылка();
		ПустаяСсылка_Сотрудник     = Справочники.СотрудникиОрганизаций.ПустаяСсылка();
		Попытка
		    ПустаяСсылка_ГрафикРаботы  = Справочники.ГрафикиРаботы.ПустаяСсылка();
		Исключение
			ПустаяСсылка_ГрафикРаботы = Неопределено;
		КонецПопытки;		
				
	КонецЕсли;	
	
	// формирование структуры возвращаемых данных
	Результат = Новый Структура;
	Результат.Вставить("ПустаяСсылка_Организация", ПустаяСсылка_Организация); 
	Результат.Вставить("ПустаяСсылка_Подразделение", ПустаяСсылка_Подразделение);
    Результат.Вставить("ПустаяСсылка_Должность", ПустаяСсылка_Должность);
    Результат.Вставить("ПустаяСсылка_Сотрудник", ПустаяСсылка_Сотрудник);	
	Результат.Вставить("ПустаяСсылка_ГрафикРаботы", ПустаяСсылка_ГрафикРаботы);
	
	Возврат Результат;		
			
КонецФункции

// Описание: выполняет приведение типов формы в соответствии с типом конфигурации.
// Параметры: 
// Возвращаемое значение:
&НаСервере
Процедура ВыполнитьПриведениеТипов()
Показать
Прикрепленные файлы:
2. VmvLer 29.05.20 13:23 Сейчас в теме
Великолепно.

Возьмите лист бумаги и нарисуйте схему потоков данных
Когда картинка станет логичной и понятной приступайте к коду.

Пока нет картинки на столе и в голове - можем поговорить о том когда закончатся дожни, когда девушки перестанут есть дома и выйдут на пляжи в бикини.
Последнюю картинку, кстати, также легко представить как и вашу задачу.
alex-l19041; +1 Ответить
5. alex-l19041 8 29.05.20 14:57 Сейчас в теме
разберитесь с
Функция СохранитьПротоколВБазу1С(...
6. Pers2071 29.05.20 15:04 Сейчас в теме
(5)
а это вообще сложно создать , можете просто пример какой нибудь привести , как из внешней обработке получить е данные в другой внешней обработке , как это сделать и как запрос составить (
7. VictorRGB2 13 29.05.20 18:12 Сейчас в теме
(6) зачем лезть в эту обработку?

у вас уже все есть
Процедура ПолучитьПротоколИзБазы1С(), смотрите что она делает, все что вам нужно она получает, разбирает и в ТЗ помещает

пишите свою обработку, переносите туда эту процедуру, получайте ТЗ и перекладывайте ее в xml, в xls, в txt... да куда угодно.
8. Pers2071 01.06.20 08:10 Сейчас в теме
(7)
я новичок в этом сфере ,составляю код ошибку дает может не правильно подбираю код или е знаю(
9. Pers2071 01.06.20 11:26 Сейчас в теме
(7)
(7)
Помогите составить код пожалуйста (
10. VictorRGB2 13 01.06.20 12:53 Сейчас в теме
(9) берете процедуру, в нее у вас передаются входящие параметры - дата, сотрудник... и т.д.

создаете новую обработку, все входящие параметры добавляете в виде реквизитов обработки, результирующую ТЗ можно внести как объект обработки. а можно и в процедуре объявить

переносите процедуру
1 вариант - вызов процедуры сразу по кнопке Выполнить, входящих параметров у нее уже не будет, они все будут реквизитами обработки, определяете их уже внутри процедуры

Процедура Выполнить()
  ПолучитьПротоколИзБазы1С();
КонецПроцедуры

Процедура ПолучитьПротоколИзБазы1С()
  // объявление параметров
  ТЗПротокол = Новый ТаблицаЗначений;
  // объявление таблица
  ТЗПротокол.Колонки.Добавтиь(<ИмяКолонки>);
  аДатаНачала = <Дата начала>
  аДатаОкончания = <Дата окончания>;

  ... и т.д.
  
КонецПроцедуры 
Показать


2 вариант - вызов процедуры с параметрами, тогда по кнопке Выполнить сначала определение параметров, потом вызов процедуры с ними

Процедура Выполнить()
  // объявление параметров
  ТЗПротокол = Новый ТаблицаЗначений;
  // объявление таблица
  ТЗПротокол.Колонки.Добавтиь(<ИмяКолонки>);
  аДатаНачала = <Дата начала>
  аДатаОкончания = <Дата окончания>;

  ... и т.д.

  ПолучитьПротоколИзБазы1С(ТЗПротокол, аДатаНачала, аДатаОкончания .. и т.д.);
КонецПроцедуры

Процедура ПолучитьПротоколИзБазы1С(ТЗПротокол, аДатаНачала, аДатаОкончания .. и т.д.)
  
КонецПроцедуры
Показать


и так и эдак будет правильно, делайте как вам проще

процедура вам вернет ТЗ (таблицу значений), а уж куда и как ее переложить, смотрите по ТЗ (техническое задание)
11. rpashkovsky 23 01.06.20 21:51 Сейчас в теме
Наверное, в данном случае, будет иметь смысл разбить свои вопросы на связные части со смысловой нагрузкой. Далее задавать более обобщенные вопросы поисковику, по типу: "Как сохранить то-то туда-то". Готовый код здесь вряд ли кто-то предоставит...
12. Pers2071 03.06.20 10:18 Сейчас в теме
(11)
вам приходилось когда нибудь такое создавать ?
13. rpashkovsky 23 03.06.20 11:02 Сейчас в теме
(12) Через день. Поэтому и советую перво - наперво научиться задавать вопросы. Ответы на них уже вероятнее всего есть.
14. Pers2071 03.06.20 14:30 Сейчас в теме
(13)
вроде пишу я вопросы как вы и сказали но не вижу там примеры такой внешней обработки, я так понимаю вы поняли о чем идет речь ?
15. rpashkovsky 23 03.06.20 15:26 Сейчас в теме
(14) в (10) есть ответ на Ваш вопрос.
16. Pers2071 03.06.20 15:32 Сейчас в теме
(15)
да я понял спасибо , я пока осваиваю программу 1с , не знаю что да как , образовалась такая вот не простоя задача уже почти что 2 недели делаю нет результата (
18. nomad_irk 72 03.06.20 15:35 Сейчас в теме
(16) Возьмите задачу по-проще, к этой либо вернетесь потом, либо выполнит более квалифицированный программист.
19. Pers2071 03.06.20 15:48 Сейчас в теме
(18)

(18)
я устроился на работу программистом 1с в одной производственной фирме , ма проходили 1с в вузе 2 семестра и там сами знаете нас чему учили , (в первую очередь мы сами виноваты тоже что не хорошо учились ) и дали мне на испытательном сроке эту задачу , по моему уровню я должен составить код , но мы такое не проходили в вузе , мы создавали там максимум кнопки еще пару запросов и все ( короче постепенно учусь , многое узнал , но мне надо сдавать уже эту обработку (
20. nomad_irk 72 03.06.20 15:52 Сейчас в теме
(19) В таком случае вам придется сначала разобраться, как работает существующая обработка, текст модуля которой вы привели выше.
После того, как вы поймете, что происходит внутри этой обработки, вы можете попробовать написать что-то свое.
Начните с самых простых решений, вроде записать файл на диск, сохранить табличный документ в файл и прочее.
21. Pers2071 03.06.20 16:03 Сейчас в теме
(20)
хорошо спасибо вам большое за ценный совет )
17. Pers2071 03.06.20 15:34 Сейчас в теме
(15)
Это внешняя обработка так как он береть данные из главной базы ЗУП и создает тз таблицу и запросы , мне надо в свою внешнюю обработку писать код который берет эти данные из тз таблицы главной базы , а в справочнике его нет и регистре сведений тоже нет его (
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот