Всем привет! Нужна Ваша подсказка. В ЗИК 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.1 (код и сумма; вычеты отдельно и общей суммой)
- Начисления сотрудников организации в разрезе месяцев начисления (ЗУП 2.5, КА 1.1, УПП 1.3)
- Начисления сотрудников организации за период (ЗУП 2.5, КА 1.1, УПП 1.3)
- Отчеты ЗУП. Решения всех отчетов из сборника задач для подготовки к Специалист-консультант ЗУП с картинками
- Универсальный отчет как инструмент создания новых отчетов на основании данных системы 1С
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Полгода назад я здесь просил помочь сделать похожий отчет со сравнением наименований, с вашей помощью все заработало только сравнивались имена автомобилей вот он:
Процедура МаршрутнаяВедомость()
ИННОрг= Лев(Константа.ИНН,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);
Таб.Показать("Маршрутная ведомость");
КонецПроцедуры
Прошу прощения я не умею выкладывать теги кода
А сейчас что-то не идет
Процедура МаршрутнаяВедомость()
ИННОрг= Лев(Константа.ИНН,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);
Таб.Показать("Маршрутная ведомость");
КонецПроцедуры
Прошу прощения я не умею выкладывать теги кода
А сейчас что-то не идет
(11) VLADELETC,
Попробую ещё раз "намекнуть"...
1. В указанном вами примере будет выводиться информация об автомобилях, которые указаны в путевых листах за указанный период. То есть в отчет не попадут автомобили, информации о которых в путевых листах за указанный период нет.
2. Вам сейчас нужно собрать всех штатных водителей и убрать тех кто работал.
Попробую ещё раз "намекнуть"...
1. В указанном вами примере будет выводиться информация об автомобилях, которые указаны в путевых листах за указанный период. То есть в отчет не попадут автомобили, информации о которых в путевых листах за указанный период нет.
2. Вам сейчас нужно собрать всех штатных водителей и убрать тех кто работал.
Во-первых, зачем сравнивать наименование, если можно сравнивать сами элементы справочника Сотрудники?
Во-вторых, не понимаю, как вы собираетесь "вычислить сотрудников, не выходивших в течение месяца и не попавших в табель", если перебираете путевые листы и в результате получаете сотрудников, как раз выходивших на работу?
Во-вторых, не понимаю, как вы собираетесь "вычислить сотрудников, не выходивших в течение месяца и не попавших в табель", если перебираете путевые листы и в результате получаете сотрудников, как раз выходивших на работу?
(7) Или я не понимаю постановку вашей задачи, или вы не понимаете, что решаете ее совсем с того боку.
По-моему, если нужен отчет по невыходившим сотрудникам (а выходившие - в путевых листах), то я бы сделал запрос по путевым листам с группировкой только по сотрудникам, выгрузил бы результаты запроса в ТЗ, а потом в цикле перебрал бы справочник сотрудников и тех, кого нет в ТЗ, выводил бы в отчет.
Разумеется проверив - работает ли сотрудник, в том ли подразделении и (или) должности и т.д.
По-моему, если нужен отчет по невыходившим сотрудникам (а выходившие - в путевых листах), то я бы сделал запрос по путевым листам с группировкой только по сотрудникам, выгрузил бы результаты запроса в ТЗ, а потом в цикле перебрал бы справочник сотрудников и тех, кого нет в ТЗ, выводил бы в отчет.
Разумеется проверив - работает ли сотрудник, в том ли подразделении и (или) должности и т.д.
(8) VLADELETC,
Что-то я вообще перестал понимать: если внимательно смотреть ваш запрос, то там должен быть список сотрудников, которые указаны в документах "ПутевойЛист" за выбранный период, и которые являются штатными сотрудниками. То есть только указанные в путевых листах.
Cooler вам об этом же пишет.
Что-то я вообще перестал понимать: если внимательно смотреть ваш запрос, то там должен быть список сотрудников, которые указаны в документах "ПутевойЛист" за выбранный период, и которые являются штатными сотрудниками. То есть только указанные в путевых листах.
Cooler вам об этом же пишет.
1_user Да я сам понимаю что захожу не с того боку но предыдущий отчет работает по этому принципу а по не выходам нет. Не пойму почему. А с таблицей значений я не в ладах. Понимаю, что она как раз и нужна, только не хватает мозгов построить такой код. Очень уж он громоздкий получается.
1_user Мне уже не до хорошего, пусть был бы список всех работающих водителей, а в третье колонке выходил или не выходил, хотя бы так, короче нужна сортировка по признаку есть на него хотя бы один путевой лист или вообще нет.
(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);
Таб.Показать("Невыход сотрудников");
КонецПроцедуры
Показать
l_user Спасибо огромное за помощь, только не сработало. Из-за этой строки (|Условие(глПриказПоСотруднику(Сотрудник,НачМесяца(ДатаДок),Докум.Вид())=Докум);)
пишет что переменная докум не обнаружена, а если я ее удаляю или добавляю в текст запроса (|Докум = Документ.ПутевойЛист.ТекущийДокумент;) тогда пишет (Если ТЗ_ПутевыеЛисты.НайтиЗначение(Запрос.Сотрудник)=0 Тогда) Недостаточное число параметров передано при вызове функции/процедуры объекта.
Ну это не беда дальше разберусь, образец ТЗ есть, теперь самому интересно понять. Сделаю, отпишусь.
пишет что переменная докум не обнаружена, а если я ее удаляю или добавляю в текст запроса (|Докум = Документ.ПутевойЛист.ТекущийДокумент;) тогда пишет (Если ТЗ_ПутевыеЛисты.НайтиЗначение(Запрос.Сотрудник)=0 Тогда) Недостаточное число параметров передано при вызове функции/процедуры объекта.
Ну это не беда дальше разберусь, образец ТЗ есть, теперь самому интересно понять. Сделаю, отпишусь.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот