Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 17:45

Табель учета рабочего времени

Автор Люсёк, 18 мар 2011, 12:43

0 Пользователей и 1 гость просматривают эту тему.

Люсёк

Делаю отчет Табель учета рабочего времени. Вроде почти сделала, но вот беда, если у сотрудника отработан не полный месяц, вместо пустых клеточек выводится предыдущая строка. Подскажите, как справится с этой бедой?)

В табличный документ данные вывожу следующим образом:

ВыборкаПоСотруднику = ЗапросТабель.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "СотрудникНаименование");
Пока ВыборкаПоСотруднику.Следующий() Цикл
НомерПП=НомерПП+1;
ОбластьСтрока.Параметры.НомерПП = НомерПП;
ОбластьСтрока.Параметры.СотрудникНаименование = ВыборкаПоСотруднику.СотрудникНаименование;
     ВыборкаПоТабельномуНомеру = ВыборкаПоСотруднику.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "ТабельныйНомер");
Пока ВыборкаПоТабельномуНомеру.Следующий() Цикл
  ОбластьСтрока.Параметры.ТабельныйНомер = ВыборкаПоТабельномуНомеру.ТабельныйНомер;
      ВыборкаПоДолжности = ВыборкаПоТабельномуНомеру.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Должность");
  Пока ВыборкаПоДолжности.Следующий() Цикл
   ОбластьСтрока.Параметры.Должность = ВыборкаПоДолжности.Должность;
           ДетальныеЗаписи = ВыборкаПоДолжности.Выбрать();
   Пока ДетальныеЗаписи.Следующий() Цикл    

            НомерДня=Строка(День(ДетальныеЗаписи.ДатаТабеля));

    Если ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.Работа Тогда
 
                 ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.Часов;
 
                 ЧасыЗаМесяц = ЧасыЗаМесяц + ДетальныеЗаписи.Часов;
                 ДниЗаМесяц = ДниЗаМесяц + 1;

ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.ВыходныеДни Тогда
      ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
  Выходные = Выходные+1;
 
ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.Праздники Тогда  
  ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;

                                      ЧасыПраздничные = ЧасыПраздничные + ДетальныеЗаписи.Часов;
  ДниПраздничные = ДниПраздничные + 1;
     
ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.ОсновнойОтпуск
ИЛИ  ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.ДополнительныйОтпуск Тогда  
      ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
  Отпуск = Отпуск+1;

ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.Болезнь Тогда
      ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
  Больничный = Больничный+1;
 
ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.ГосударственныеОбязанности Тогда    
      ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
  ГосудОбяз = ГосудОбяз+1;
 
ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.НеоплачиваемыйОтпускПоРазрешениюРаботодателя Тогда    
      ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
  ОтпускНеоплачДО = ОтпускНеоплачДО+1;
 
ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.Командировка Тогда    
      ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
  Командировка = командировка+1;
 
ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.ОтпускНаОбучение Тогда  
      ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
                                      УчебныйОтпуск = УчебныйОтпуск+1;


ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.Прогулы Тогда    
      ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
                                      Прогул = Прогул+1;

 
ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.НеявкиПоНевыясненнымПричинам Тогда    
      ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
  Невыход = Невыход+1;


Иначе  
     ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
КонецЕсли;

КонецЦикла;


ОбластьСтрока.Параметры.ЧасыЗаМесяц = ЧасыЗаМесяц;
ОбластьСтрока.Параметры.ДниЗаМесяц = ДниЗаМесяц;
ОбластьСтрока.Параметры.ЧасыПраздничные = ЧасыПраздничные;
ОбластьСтрока.Параметры.ДниПраздничные = ДниПраздничные;
ОбластьСтрока.Параметры.Выходные = Выходные;
ОбластьСтрока.Параметры.Отпуск = Отпуск;
ОбластьСтрока.Параметры.Больничный = Больничный;
ОбластьСтрока.Параметры.ГосудОбяз = ГосудОбяз;
ОбластьСтрока.Параметры.ОтпускНеоплачДО = ОтпускНеоплачДО;
ОбластьСтрока.Параметры.Командировки = Командировка;
ОбластьСтрока.Параметры.УчебОтпуск = УчебныйОтпуск;
ОбластьСтрока.Параметры.Прогул = Прогул;
ОбластьСтрока.Параметры.Невыход = Невыход;
ОбластьСтрока.Параметры.Всего = ДниЗаМесяц+Выходные+Отпуск+Больничный+ГосудОбяз+ОтпускНеоплачДО+Командировка+УчебныйОтпуск+Прогул+Невыход+ДниПраздничные;
ТабДокумент.Вывести(ОбластьСтрока);

ЧасыЗаМесяц=0;
ДниЗаМесяц=0;
ЧасыПраздничные=0;
ДниПраздничные=0;
Выходные=0;
Отпуск=0;
Больничный=0;
ГосудОбяз=0;
ОтпускНеоплачДО=0;
Командировка=0;
УчебныйОтпуск=0;
Прогул=0;
Невыход=0;
Всего=0;

КонецЦикла;
КонецЦикла;
КонецЦикла;




Люсёк

Как то криво код отправился)


ВыборкаПоСотруднику = ЗапросТабель.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "СотрудникНаименование");
      Пока ВыборкаПоСотруднику.Следующий() Цикл
          НомерПП=НомерПП+1;
          ОбластьСтрока.Параметры.НомерПП = НомерПП;
          ОбластьСтрока.Параметры.СотрудникНаименование = ВыборкаПоСотруднику.СотрудникНаименование;
           ВыборкаПоТабельномуНомеру = ВыборкаПоСотруднику.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "ТабельныйНомер");      
          Пока ВыборкаПоТабельномуНомеру.Следующий() Цикл
              ОбластьСтрока.Параметры.ТабельныйНомер = ВыборкаПоТабельномуНомеру.ТабельныйНомер;
               ВыборкаПоДолжности = ВыборкаПоТабельномуНомеру.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Должность");
              Пока ВыборкаПоДолжности.Следующий() Цикл
                  ОбластьСтрока.Параметры.Должность = ВыборкаПоДолжности.Должность;
                    ДетальныеЗаписи = ВыборкаПоДолжности.Выбрать();         
                  Пока ДетальныеЗаписи.Следующий() Цикл                      
                      
                        НомерДня=Строка(День(ДетальныеЗаписи.ДатаТабеля));                     
                     
                      Если ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.Работа Тогда                        
                         
                             ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.Часов;
                          
                             ЧасыЗаМесяц = ЧасыЗаМесяц + ДетальныеЗаписи.Часов;
                             ДниЗаМесяц = ДниЗаМесяц + 1;
                                                                         
                     ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.ВыходныеДни Тогда
                              ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
                             Выходные = Выходные+1;
                            
                     ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.Праздники Тогда                            
                             ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
                                 
                                      ЧасыПраздничные = ЧасыПраздничные + ДетальныеЗаписи.Часов;
                             ДниПраздничные = ДниПраздничные + 1;
                                                           
                     ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.ОсновнойОтпуск
                         ИЛИ  ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.ДополнительныйОтпуск Тогда                            
                              ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
                             Отпуск = Отпуск+1;
                                                             
                     ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.Болезнь Тогда                           
                              ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
                             Больничный = Больничный+1;
                                                                    
                     ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.ГосударственныеОбязанности Тогда                              
                              ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
                             ГосудОбяз = ГосудОбяз+1;
                                                                       
                     ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.НеоплачиваемыйОтпускПоРазрешениюРаботодателя Тогда                              
                              ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
                             ОтпускНеоплачДО = ОтпускНеоплачДО+1;
                                                                             
                     ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.Командировка Тогда                              
                              ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
                             Командировка = командировка+1;
                                                                                
                     ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.ОтпускНаОбучение Тогда                            
                              ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
                                      УчебныйОтпуск = УчебныйОтпуск+1;
                           
                                                         
                     ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.Прогулы Тогда                              
                              ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
                                      Прогул = Прогул+1;
                           
                                                             
                     ИначеЕсли ДетальныеЗаписи.ВидВремени = Справочники.КлассификаторИспользованияРабочегоВремени.НеявкиПоНевыясненнымПричинам Тогда                              
                              ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;
                             Невыход = Невыход+1;
                           
                                                                  
                        Иначе                            
                             ОбластьСтрока.Параметры["Символ"+НомерДня] = ДетальныеЗаписи.БуквенныйКод;   
                      КонецЕсли;                
                        
                  КонецЦикла;
                     
                  
                  ОбластьСтрока.Параметры.ЧасыЗаМесяц = ЧасыЗаМесяц;
                  ОбластьСтрока.Параметры.ДниЗаМесяц = ДниЗаМесяц;
                  ОбластьСтрока.Параметры.ЧасыПраздничные = ЧасыПраздничные;
                  ОбластьСтрока.Параметры.ДниПраздничные = ДниПраздничные;
                  ОбластьСтрока.Параметры.Выходные = Выходные;
                  ОбластьСтрока.Параметры.Отпуск = Отпуск;
                  ОбластьСтрока.Параметры.Больничный = Больничный;
                  ОбластьСтрока.Параметры.ГосудОбяз = ГосудОбяз;
                  ОбластьСтрока.Параметры.ОтпускНеоплачДО = ОтпускНеоплачДО;
                  ОбластьСтрока.Параметры.Командировки = Командировка;
                  ОбластьСтрока.Параметры.УчебОтпуск = УчебныйОтпуск;
                  ОбластьСтрока.Параметры.Прогул = Прогул;
                  ОбластьСтрока.Параметры.Невыход = Невыход;
                  ОбластьСтрока.Параметры.Всего = ДниЗаМесяц+Выходные+Отпуск+Больничный+ГосудОбяз+ОтпускНеоплачДО+Командировка+УчебныйОтпуск+Прогул+Невыход+ДниПраздничные;                  
                  ТабДокумент.Вывести(ОбластьСтрока);
                  
                  ЧасыЗаМесяц=0;
                  ДниЗаМесяц=0;
                  ЧасыПраздничные=0;
                  ДниПраздничные=0;
                  Выходные=0;
                  Отпуск=0;
                  Больничный=0;
                  ГосудОбяз=0;
                  ОтпускНеоплачДО=0;
                  Командировка=0;
                  УчебныйОтпуск=0;
                  Прогул=0;
                  Невыход=0;
                  Всего=0;                  

               КонецЦикла;                   
          КонецЦикла;
       КонецЦикла;

Klyacksa

Скорее всего, проблема в том, что Вы не очищаете Параметры каждой новой строки. То есть, у Вас получается такая схема:
1. Определили область макета
2. Взяли первую строку, заполнили данные по ней
3. Вывели область
<<но область-то осталась заполненной!..>>
4. Берем вторую строку (пусть данных в ней нет, должна вывестись пустая), заполняем нашу область имеющимися данными (сотрудник, например).
<<а остальные данные-то остались от прошлой строки!..>>
5. Вывели область - частично по первой строке, частично по второй.

К сожалению, у параметров макета метода Очистить нет, поэтому придется делать например так:
Если ДетальныеЗаписи.Количество()=0 тогда
     ОбластьСтрока.Параметр1="";
     // и т.д. очищаем все подряд параметры нулевыми значениями
     // либо такой вариант очистки:
     ОбластьСтрока=Макет.ПолучитьОбласть("Строка"); // получаем здесь область так же, как Вы ее изначально получали.
     // далее заполняем данные по сотруднику:
     ОбластьСтрока.Параметры.НомерПП = НомерПП;
     ОбластьСтрока.Параметры.СотрудникНаименование = ВыборкаПоСотруднику.СотрудникНаименование;
     ОбластьСтрока.Параметры.ТабельныйНомер = ВыборкаПоТабельномуНомеру.ТабельныйНомер;
     ОбластьСтрока.Параметры.Должность = ВыборкаПоДолжности.Должность;
     Продолжить();
КонецЕсли;  
// придется заполнение этих параметров перенести еще вот сюда (и убрать эти строки из остального Вашего кода)
ОбластьСтрока.Параметры.НомерПП = НомерПП;
ОбластьСтрока.Параметры.СотрудникНаименование = ВыборкаПоСотруднику.СотрудникНаименование;
ОбластьСтрока.Параметры.ТабельныйНомер = ВыборкаПоТабельномуНомеру.ТабельныйНомер;
ОбластьСтрока.Параметры.Должность = ВыборкаПоДолжности.Должность;

// ну и дальше Ваш цикл
Пока ДетальныеЗаписи.Следующий() Цикл    
...
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Люсёк

Спасибо))) Суть проблемы то я понимала, а вы подсказали ее решение)))

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск