ОТЧЕТ ПО СОРТИРОВКЕ СОТРУДНИКОВ

1. VLADELETC 22.05.14 08:20 Сейчас в теме
Всем привет! Нужна Ваша подсказка. В ЗИК 7 создал документ Путевой лист (автотранспортное предприятие). Табель автоматом собирает вышедших на работу, но потом приходится сравнивать вручную списки, чтобы вычислить сотрудников, не выходивших в течение месяца и не попавших в табель. (их все равно надо внести в табель). Сделал вот такой отчет:

Процедура Сформировать()
 
	
	Таб = СоздатьОбъект("Таблица");
	Таб.ИсходнаяТаблица("Невыход");
	Таб.ВывестиСекцию("Заголовок");
	Таб.ВывестиСекцию("Шапка");

	Запрос = СоздатьОбъект("Запрос");
	ТекстЗапроса = 
	"//{{ЗАПРОС(сформировать)  
	|с (НачМесяца(ДатаДок)) по ДатаДок;
	|ОбрабатыватьДокументы Проведенные;   
	|Докум = Документ.ПутевойЛист.ТекущийДокумент; 
	|Сотрудник = Документ.ПутевойЛист.Сотрудник;      
	|Имя = Документ.ПутевойЛист.Сотрудник.Наименование;      
 	|Условие(ПустоеЗначение(Сотрудник.СостояниеФизлица.Получить(НачМесяца(ДатаДок)))=0);
	|Условие(глПриказПоСотруднику(Сотрудник,НачМесяца(ДатаДок),Докум.Вид())=Докум); 
    |Группировка Сотрудник без групп Все;
    |Группировка Докум;


	|"//}}Запрос
	;              
	
	
	Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
	Возврат;
	КонецЕсли;
    
	Ном=0;
	
	Пока Запрос.Группировка(1)=1 Цикл
    
	Сотр1=Запрос.Сотрудник.Наименование;	
		
	Должность = Запрос.Сотрудник.Должность.Получить(ДатаДок);    

		
	Если Должность.Код <>"00001" Тогда
	Продолжить;  
	КонецЕсли;	


	Пока Запрос.Группировка(2)=1 Цикл
    Сотр2=Запрос.Имя;
	
	Если (Сотр2=Сотр1)  Тогда  
	
		Продолжить;
	КонецЕсли;	


    Ном=Ном+1;

	Таб.ВывестиСекцию("Строка"); 

	КонецЦикла; 
    КонецЦикла; 
	
	Таб.Опции(0,0,0,0);
	Таб.ТолькоПросмотр(0);  
	Таб.ПараметрыСтраницы(1,,,10,10,10,10,10,10,1);
	Таб.Показать("Невыход сотрудников");	
	
	КонецПроцедуры 
Показать


В таблице только две колонки номер и ФИО сотрудника.

Но что-то у меня не работает этот отчет, не хочет сравнивать наименование. Помогите, чем можете. Заранее благодарен. Влад
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. l_user 22.05.14 10:45 Сейчас в теме
(1) VLADELETC,
Как вы определили, что "не хочет сравнивать наименование"?
11. VLADELETC 22.05.14 11:08 Сейчас в теме
Полгода назад я здесь просил помочь сделать похожий отчет со сравнением наименований, с вашей помощью все заработало только сравнивались имена автомобилей вот он:

Процедура МаршрутнаяВедомость()

ИННОрг= Лев(Константа.ИНН,10);

НомерДняСубботы = 6;
НомерДняВоскресения = 7;
Если (НомерДняНедели(ДатаДок) = НомерДняСубботы) или (НомерДняНедели(ДатаДок) = НомерДняВоскресения) тогда
ДН="(вых. день)";
Иначе
ДН="(раб. день)";
КонецЕсли;


Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("МаршрутнаяВедомость");
Таб.ВывестиСекцию("Заголовок");
Таб.ВывестиСекцию("Шапка");

Ном=0;
Все=0;
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(сформировать)
|с ДатаДок по ДатаДок;
|ОбрабатыватьДокументы Проведенные;
|Док = Документ.ПутевойЛист.ТекущийДокумент;
|Авто = Документ.ПутевойЛист.Автомобиль;
|Функция Итог = Счётчик(Сдано);
|Группировка Авто без групп Все;
|Группировка Док;
|"//}}Запрос
;

Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Возврат;
КонецЕсли;

Пока Запрос.Группировка(1)=1 Цикл

Если Запрос.Авто.ПометкаУдаления()=1 Тогда
Продолжить;
КонецЕсли;

Ном=Ном+1;
ГН=Запрос.Авто.Наименование;

Пока Запрос.Группировка(2)=1 Цикл
ГН1=Запрос.Док.Автомобиль.Наименование;

Если (ГН1=ГН) Тогда

НМ=Запрос.Док.Маршрут.Код;
Сотр=Запрос.Док.Сотрудник;

Если НМ="513м" Тогда
Сдано=План513;
КонецЕсли;
Если НМ="514м" Тогда
Сдано=План514;
КонецЕсли;
Если НМ="515м" Тогда
Сдано=План515;
КонецЕсли;
Если НМ="517м" Тогда
Сдано=План517;
КонецЕсли;
Если НМ="522м" Тогда
Сдано=План522;
КонецЕсли;
Если НМ="528м" Тогда
Сдано=План528;
КонецЕсли;
Если НМ="530м" Тогда
Сдано=План530;
КонецЕсли;
Если НМ="531м" Тогда
Сдано=План531;
КонецЕсли;


Примечание="";

Иначе

НМ="";
Сотр="";
Сдано="";
Примечание="без выезда";

КонецЕсли;

КонецЦикла;

Таб.ВывестиСекцию("Выезд");
Все=Все+Сдано;
КонецЦикла;
Таб.ВывестиСекцию("Подвал");

Таб.Опции(0,0,0,0);
Таб.ТолькоПросмотр(1);
Таб.ПараметрыСтраницы(1,,,10,10,10,10,10,10,1);
Таб.Показать("Маршрутная ведомость");

КонецПроцедуры


Прошу прощения я не умею выкладывать теги кода
А сейчас что-то не идет
12. Cooler 22 22.05.14 11:11 Сейчас в теме
(11) Все понятно, вспоминаем басню Крылова "Мартышка и очки".
14. l_user 22.05.14 11:16 Сейчас в теме
(11) VLADELETC,
Попробую ещё раз "намекнуть"...
1. В указанном вами примере будет выводиться информация об автомобилях, которые указаны в путевых листах за указанный период. То есть в отчет не попадут автомобили, информации о которых в путевых листах за указанный период нет.
2. Вам сейчас нужно собрать всех штатных водителей и убрать тех кто работал.
2. VLADELETC 22.05.14 10:21 Сейчас в теме
4. VLADELETC 22.05.14 10:50 Сейчас в теме
Выдает список всех сотрудников, если ставишь не равно -то никого вообще не выдает...
6. l_user 22.05.14 10:55 Сейчас в теме
(4) VLADELETC,
> "Выдает список всех сотрудников"
Выдает вообще всех сотрудников из справочника "Сотрудники" или всё же всех сотрудников, которые есть в документах "Путевой лист" за указанный период?
5. Cooler 22 22.05.14 10:53 Сейчас в теме
Во-первых, зачем сравнивать наименование, если можно сравнивать сами элементы справочника Сотрудники?

Во-вторых, не понимаю, как вы собираетесь "вычислить сотрудников, не выходивших в течение месяца и не попавших в табель", если перебираете путевые листы и в результате получаете сотрудников, как раз выходивших на работу?
7. VLADELETC 22.05.14 10:58 Сейчас в теме
Cooler Ну во-первых если не сравнивать имена то вообще пусто, во-вторых не вышедших сотрудников тоже надо ставить в табель с пустыми днями и обозначить как Н (невыход)так требует бухгалтерия
9. Cooler 22 22.05.14 11:04 Сейчас в теме
(7) Или я не понимаю постановку вашей задачи, или вы не понимаете, что решаете ее совсем с того боку.

По-моему, если нужен отчет по невыходившим сотрудникам (а выходившие - в путевых листах), то я бы сделал запрос по путевым листам с группировкой только по сотрудникам, выгрузил бы результаты запроса в ТЗ, а потом в цикле перебрал бы справочник сотрудников и тех, кого нет в ТЗ, выводил бы в отчет.

Разумеется проверив - работает ли сотрудник, в том ли подразделении и (или) должности и т.д.
8. VLADELETC 22.05.14 11:00 Сейчас в теме
l_user выдает сотрудников которые в данный месяц числятся штатными сотрудниками т.е. принятыми на работу
10. l_user 22.05.14 11:05 Сейчас в теме
(8) VLADELETC,
Что-то я вообще перестал понимать: если внимательно смотреть ваш запрос, то там должен быть список сотрудников, которые указаны в документах "ПутевойЛист" за выбранный период, и которые являются штатными сотрудниками. То есть только указанные в путевых листах.
Cooler вам об этом же пишет.
13. VLADELETC 22.05.14 11:15 Сейчас в теме
1_user Да я сам понимаю что захожу не с того боку но предыдущий отчет работает по этому принципу а по не выходам нет. Не пойму почему. А с таблицей значений я не в ладах. Понимаю, что она как раз и нужна, только не хватает мозгов построить такой код. Очень уж он громоздкий получается.
15. VLADELETC 22.05.14 11:18 Сейчас в теме
Cooler, я не претендую на звание программиста, я не волшебник, только учусь, но попросил бы без оскорблений. Не желаете помочь, не пишите ничего. И не читайте. Извините если что не так.
16. VLADELETC 22.05.14 11:21 Сейчас в теме
1_user Мне уже не до хорошего, пусть был бы список всех работающих водителей, а в третье колонке выходил или не выходил, хотя бы так, короче нужна сортировка по признаку есть на него хотя бы один путевой лист или вообще нет.
17. VLADELETC 22.05.14 11:24 Сейчас в теме
1_user 2. Вам сейчас нужно собрать всех штатных водителей и убрать тех кто работал.

Да именно так
18. l_user 22.05.14 11:53 Сейчас в теме
(17) VLADELETC,
Посмотрите...


Процедура Сформировать()
	
	
	Запрос = СоздатьОбъект("Запрос");
	ТекстЗапроса = 
	"//{{ЗАПРОС(сформировать)  
	|с (НачМесяца(ДатаДок)) по ДатаДок;
	|ОбрабатыватьДокументы Проведенные;   
	|Сотрудник = Документ.ПутевойЛист.Сотрудник;      
	|Группировка Сотрудник без групп Все;
	|"//}}Запрос
	;              
	
	
	Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
		Возврат;
	КонецЕсли;
	
	ТЗ_ПутевыеЛисты = СоздатьОбъект("ТаблицаЗначений");
	ТЗ_ПутевыеЛисты.НоваяКолонка("Сотрудник");
	ТЗ_ПутевыеЛисты.ВыбратьСтроки();
	Пока запрос.Группировка(1)=1 Цикл
		ТЗ_ПутевыеЛисты.НоваяСтрока();
		ТЗ_ПутевыеЛисты.Сотрудник = Запрос.Сотрудник;
	КонецЦикла;
	
	ТекстЗапроса = 
	"//{{ЗАПРОС(сформировать)  
	|Сотрудник = Справочник.Сотрудники.ТекущийЭлемент;
	|Группировка Сотрудник без групп;
	|Условие(ПустоеЗначение(Сотрудник.СостояниеФизлица.Получить(НачМесяца(ДатаДок)))=0);
	|Условие(глПриказПоСотруднику(Сотрудник,НачМесяца(ДатаДок),Докум.Вид())=Докум); 
	|"//}}Запрос
	;              
	
	Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
		Возврат;
	КонецЕсли;
	
	Таб = СоздатьОбъект("Таблица");
	Таб.ИсходнаяТаблица("Невыход");
	Таб.ВывестиСекцию("Заголовок");
	Таб.ВывестиСекцию("Шапка");
	
	Ном=0;
	
	Пока Запрос.Группировка(1)=1 Цикл
		
		Должность = Запрос.Сотрудник.Должность.Получить(ДатаДок);    
		
		Если Должность.Код <>"00001" Тогда
			Продолжить;  
		КонецЕсли;    
		
		Если ТЗ_ПутевыеЛисты.НайтиЗначение(Запрос.Сотрудник)=0 Тогда
			Ном=Ном+1;
			Таб.ВывестиСекцию("Строка"); 
		КонецЕсли; 
	КонецЦикла; 
	
	Таб.Опции(0,0,0,0);
	Таб.ТолькоПросмотр(0);  
	Таб.ПараметрыСтраницы(1,,,10,10,10,10,10,10,1);
	Таб.Показать("Невыход сотрудников");    
	
КонецПроцедуры 
Показать
VLADELETC; +1 Ответить
19. VLADELETC 22.05.14 13:09 Сейчас в теме
l_user Спасибо огромное за помощь, только не сработало. Из-за этой строки (|Условие(глПриказПоСотруднику(Сотрудник,НачМесяца(ДатаДок),Докум.Вид())=Докум);)
пишет что переменная докум не обнаружена, а если я ее удаляю или добавляю в текст запроса (|Докум = Документ.ПутевойЛист.ТекущийДокумент;) тогда пишет (Если ТЗ_ПутевыеЛисты.НайтиЗначение(Запрос.Сотрудник)=0 Тогда) Недостаточное число параметров передано при вызове функции/процедуры объекта.
Ну это не беда дальше разберусь, образец ТЗ есть, теперь самому интересно понять. Сделаю, отпишусь.
Оставьте свое сообщение

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