Аттестация "1С:Специалист" > Аттестация "1С:Специалист" ЗУП

ЗУП 3.0 Специалист Билет 2

(1/9) > >>

demos:
1. Создадим Начисление: _Доплата за работу в кислотном цеху, Повременная оплата труда и надбавки, Только если введено значение показателя: ОтработаноЧасовВКислотномЦеху, Дополнительная оплата за уже оплаченное время, Вид времени: Явка, пп.3, ст.255 НК РФ, Формула: ТарифнаяСтавкаЧасовая * ОтработаноЧасовВКислотномЦеху * 50 / 100
 Показатель ОтработаноЧасовВКислотномЦеху числовой, точность 2, Вводится единовременно документом ввода данных для расчета зарплаты
 Показатель будем писать в РС ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников

 2. Создадим Начисление: _Оплата отгула, Повременная оплата труда и надбавки, Только если введен вид учета времени: _Отгул, Дополнительная оплата за уже оплаченное время, Вид времени: _Отгул, Формула: ТарифнаяСтавкаЧасовая * ВремяВЧасах
 Вид времени _Отгул имеет основное время - Выходные дни
 Отгул будем писать в РН РабочееВремяСотрудников

 3. Создадим РС Отгулы (остатки) и РС РаботаВЦеху (обороты)
 оба регистра имеют измерение: сотрудник, ресурс: время (в секундах). регистраторы документы: ДанныеПропускнойСистемы и Отгул
 наверно нужно было сделать на одном регистре...

 4. Документ ДанныеПропускнойСистемы
 4.1. Форма
 Код&НаКлиенте
 Процедура ЗагрузитьИзФайла(Команда)
          
       Режим = РежимДиалогаВыбораФайла.Открытие;
       ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);    
          
       Если ДиалогОткрытияФайла.Выбрать() Тогда
              
           Объект.ДанныеВремени.Очистить();
              
           ТекстФайла = Новый ТекстовыйДокумент;
           ТекстФайла.Прочитать( ДиалогОткрытияФайла.ВыбранныеФайлы[0] );
           ТекстФайла = ТекстФайла.ПолучитьТекст();           
           Для Счетчик = 1 По СтрЧислоСтрок( ТекстФайла ) Цикл
                  
               ТекСтрока = СтрПолучитьСтроку( ТекстФайла, Счетчик );
                        
               Строка = Объект.ДанныеВремени.Добавить();
                  
               Строка.Пропуск = Сред( ТекСтрока, 1, 4 );
                    
               ВходДень = Сред( ТекСтрока, 6, 2 );
               ВходМесяц = Сред( ТекСтрока, 9, 2 );
               ВходГод = Сред( ТекСтрока, 12, 4 );
               ВходЧас = Сред( ТекСтрока, 17, 2 );
               ВходМинута = Сред( ТекСтрока, 20, 2 );
                  
               ВыходДень = Сред( ТекСтрока, 23, 2 );
               ВыходМесяц = Сред( ТекСтрока, 26, 2 );
               ВыходГод = Сред( ТекСтрока, 29, 4 );
               ВыходЧас = Сред( ТекСтрока, 34, 2 );
               ВыходМинута = Сред( ТекСтрока, 37, 2 );
                  
               Строка.ВремяВхода = Дата( ВходГод + ВходМесяц + ВходДень + ВходЧас + ВходМинута + "00" );
               Строка.ВремяВыхода = Дата( ВыходГод + ВыходМесяц + ВыходДень + ВыходЧас + ВыходМинута + "00" )    
                  
           КонецЦикла;
              
       КонецЕсли;       
          
 КонецПроцедуры
 4.2. Модуль объекта
 КодПроцедура ОбработкаПроведения(Отказ, Режим)

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

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

 6. Отчет
 КодВЫБРАТЬ
       Начисления.ПериодДействия КАК ПериодДействия,
       Начисления.Сотрудник КАК Сотрудник,
       ЕСТЬNULL(Начисления.Результат, 0) КАК Результат
 ПОМЕСТИТЬ ВТЗаРаботуВЦеху
 ИЗ
       РегистрРасчета.Начисления КАК Начисления
 ГДЕ
       Начисления.ВидРасчета = &ВидРасчетаЗаРаботуВЦеху
       И Начисления.ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода
       И Начисления.Активность = ИСТИНА
       И Начисления.Сторно = ЛОЖЬ

 ИНДЕКСИРОВАТЬ ПО
       Сотрудник,
       ПериодДействия
 ;

 ////////////////////////////////////////////////////////////////////////////////
 ВЫБРАТЬ
       Начисления.ПериодДействия КАК ПериодДействия,
       Начисления.Сотрудник КАК Сотрудник,
       ЕСТЬNULL(Начисления.Результат, 0) КАК Результат
 ПОМЕСТИТЬ ВТЗаОтгулы
 ИЗ
       РегистрРасчета.Начисления КАК Начисления
 ГДЕ
       Начисления.ВидРасчета = &ЗаОтгулы
       И Начисления.ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода
       И Начисления.Активность = ИСТИНА
       И Начисления.Сторно = ЛОЖЬ

 ИНДЕКСИРОВАТЬ ПО
       ПериодДействия,
       Сотрудник
 ;

 ////////////////////////////////////////////////////////////////////////////////
 ВЫБРАТЬ
       ВТЗаРаботуВцеху.Сотрудник,
       ВТЗаРаботуВцеху.ПериодДействия КАК Период,
       ВЫРАЗИТЬ(ЕСТЬNULL(РаботаВЦехуОбороты.ВремяОборот, 0) / 3600 КАК ЧИСЛО(12, 2)) КАК ОтработаноЧасовВКислотномЦеху,
       ВТЗаРаботуВцеху.Результат КАК НачисленоДоплаты,
       ВЫРАЗИТЬ(ЕСТЬNULL(ОтгулыОстаткиИОбороты.ВремяНачальныйОстаток, 0) / (4 * 60 * 60) КАК ЧИСЛО(12, 2)) КАК ОстатокОтгуловНаНачалоПериода,
       ВЫБОР
           КОГДА ЕСТЬNULL(ОтгулыОстаткиИОбороты.ВремяРасход, 0) = 0
               ТОГДА 0
           ИНАЧЕ ВЫРАЗИТЬ(ЕСТЬNULL(ОтгулыОстаткиИОбороты.ВремяРасход, 0) / (4 * 60 * 60) - 0.5 КАК ЧИСЛО(12, 0))
       КОНЕЦ КАК ПредоставленоОтгулов,
       ВТЗаОтгулы.Результат КАК НачисленоЗаОтгулы,
       ВЫРАЗИТЬ(ЕСТЬNULL(ОтгулыОстаткиИОбороты.ВремяКонечныйОстаток, 0) / (4 * 60 * 60) КАК ЧИСЛО(12, 2)) КАК ОстатокОтгуловНаКонецПериода
 ИЗ
       ВТЗаРаботуВЦеху КАК ВТЗаРаботуВцеху
           ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РаботаВЦеху.Обороты(
                   &НачалоПериода,
                   &КонецПериода,
                   Месяц,
                   Сотрудник В
                       (ВЫБРАТЬ
                           ВТЗаРаботуВцеху.Сотрудник
                       ИЗ
                           ВТЗаРаботуВцеху КАК ВТЗаРаботуВцеху)) КАК РаботаВЦехуОбороты
           ПО ВТЗаРаботуВцеху.Сотрудник = РаботаВЦехуОбороты.Сотрудник
               И ВТЗаРаботуВцеху.ПериодДействия = РаботаВЦехуОбороты.Период
           ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Отгулы.ОстаткиИОбороты(
                   &НачалоПериода,
                   &КонецПериода,
                   Месяц,
                   ,
                   Сотрудник В
                       (ВЫБРАТЬ
                           ВТЗаРаботуВцеху.Сотрудник
                       ИЗ
                           ВТЗаРаботуВцеху КАК ВТЗаРаботуВцеху)) КАК ОтгулыОстаткиИОбороты
           ПО ВТЗаРаботуВцеху.Сотрудник = ОтгулыОстаткиИОбороты.Сотрудник
               И ВТЗаРаботуВцеху.ПериодДействия = ОтгулыОстаткиИОбороты.Период
           ЛЕВОЕ СОЕДИНЕНИЕ ВТЗаОтгулы КАК ВТЗаОтгулы
           ПО ВТЗаРаботуВцеху.ПериодДействия = ВТЗаОтгулы.ПериодДействия
               И ВТЗаРаботуВцеху.Сотрудник = ВТЗаОтгулы.Сотрудник

Tex:
Судя по всему выложено сырое надоделанное решение.

Во-первых сначала говорится о РС, хотя потом обращается  к РН.
Движения делаются по РН с оборотами, а запрос потом по РН с остатками.

Однако данный пост очень полезен как идея, а допиливаете решение сами.

Tex:
По отчету тоже косяк. Точнее по начислению зарплаты. Документ считает все хорошо, однако доплата за работу в цеху не попадает в РР, хотя отгул попадает. В связи с эти запросу нечего выдергивать.

Добавлено: Разобрался. РС ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников записываются начисления без периода действия, тоесть не протяженные во времени. А они а РР не записываются.

Karomag:
Скажите, в чем смысл создания отдельного регистра для РС РаботаВЦеху (и кстати, наверное имеется ввиду РН) , почему бы не писать сразу в  РС ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников?

IgorXml:

--- Цитата: Karomag от Август 27, 2015, 01:53:48 pm ---Скажите, в чем смысл создания отдельного регистра для РС РаботаВЦеху (и кстати, наверное имеется ввиду РН) , почему бы не писать сразу в  РС ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников?

--- Конец цитаты ---
Можно иначе сделать http://expert.chistov.pro/public/391341/. На экзамене от 18.09.2015 мне попался этот билет(на экзамене номер 3). Сдал на отлично. Сделал лишнюю работу когда ввел  свой показатель, который рассчитывал в общем модуле. А надо было "ВремяВЧасах" в формуле использовать и всё ок:
1. Делаем два начисления с двумя видами времени "_Доплата за работу в кислотном цеху"(Формула "ВремяВЧасах * 50 / 100 * ТарифнаяСтавкаЧасовая ") и ВР "_Оплата отгулов"....как demos
2. Регистр остатков "Отгулы".
3. Документ данные пропускной системы:
--- Код: ---
//МФ
&НаКлиенте
Процедура ЗагрузитьИзФайла()
 Режим = РежимДиалогаВыбораФайла.Открытие;
 ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);   
 
 Если ДиалогОткрытияФайла.Выбрать() Тогда
 
  Объект.ДанныеОВремени.Очистить();
 
  ТекстФайла = Новый ТекстовыйДокумент;
  ТекстФайла.Прочитать( ДиалогОткрытияФайла.ВыбранныеФайлы[0] );
  ТекстФайла = ТекстФайла.ПолучитьТекст();           
  Для Счетчик = 1 По СтрЧислоСтрок( ТекстФайла ) Цикл
   
   ТекСтрока = СтрПолучитьСтроку( ТекстФайла, Счетчик );
   МассивСтроки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ТекСтрока,";");
   Строка = Объект.ДанныеОВремени.Добавить();
   Строка.Сотрудник = УзнатьСотрудника(МассивСтроки[0]);
   Строка.Дата = Дата(МассивСтроки[1]+":00");
   Строка.ВремяВхода = Дата(МассивСтроки[1]+":00");
   Строка.ВремяВыхода = Дата(МассивСтроки[2]+":00");   
   
  КонецЦикла;
 
 КонецЕсли;       
КонецПроцедуры

&НаСервере
Функция УзнатьСотрудника(Строка)
 Возврат Справочники.Сотрудники.НайтиПоКоду(Строка);
КонецФункции

//МО
#Если Не ТолстыйКлиентУправляемоеПриложение Или Сервер Тогда
 
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
 ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект);
 ДанныеДляПроведения = ТаблицаДанныхОВремени();
 УчетРабочегоВремени.ЗарегистрироватьДанныеИндивидуальногоГрафика(Движения, ДанныеДляПроведения, НачалоМесяца(Месяц));
КонецПроцедуры

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

#КонецЕсли

 
--- Конец кода ---

4. Документ Отгул:
--- Код: ---//движения РН.Отгулы, РН.ДанныеТабельногоУчетаРабочегоВремениСотрудников одной строкой, МО:

#Если Не ТолстыйКлиентУправляемоеПриложение Или Сервер Тогда
    перем ТЗ;   
    Процедура ОбработкаПроведения(Отказ, РежимПроведения)
        ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект);
        ДанныеДляПроведения = ТаблицаДанныхОВремени();
       
        Если ТЗ.Количество() > 0 Тогда
            ТЗ.Свернуть("Сотрудник","ЧасовОстаток");
            Движения.Отгулы_2.Записывать = Истина;
            Для каждого ВыборкаДетальныеЗаписи Из ТЗ Цикл
                Движение = Движения.Отгулы_2.Добавить();
                Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                Движение.Период = ДеньОтгула;
                Движение.Сотрудник = ВыборкаДетальныеЗаписи.Сотрудник;
                Движение.Часов = 4;
            КонецЦикла;
        иначе
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "У сотрудника "+Сотрудник+" осталось не достаточно часов для отгула на "+ ДеньОтгула;
            Сообщение.Сообщить();
            Отказ = Истина;     
        КонецЕсли;
        УчетРабочегоВремени.ЗарегистрироватьДанныеТабеля(Движения, ДанныеДляПроведения, НачалоМесяца(ДеньОтгула));
    КонецПроцедуры
   
    Функция ТаблицаДанныхОВремени()
       
        ТаблицаДанныхОВремени = Новый ТаблицаЗначений;
        ТаблицаДанныхОВремени.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
        ТаблицаДанныхОВремени.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
        ТаблицаДанныхОВремени.Колонки.Добавить("ВидВремени", Новый ОписаниеТипов("СправочникСсылка.ВидыИспользованияРабочегоВремени"));
        ТаблицаДанныхОВремени.Колонки.Добавить("Дней", Новый ОписаниеТипов("Число"));
        ТаблицаДанныхОВремени.Колонки.Добавить("Часов", Новый ОписаниеТипов("Число"));
        ТаблицаДанныхОВремени.Колонки.Добавить("ВЦеломЗаПериод", Новый ОписаниеТипов("Булево"));
        ТаблицаДанныхОВремени.Колонки.Добавить("Территория", Новый ОписаниеТипов("СправочникСсылка.ТерриторииВыполненияРабот"));     
        ТаблицаДанныхОВремени.Колонки.Добавить("УсловияТруда", Новый ОписаниеТипов("СправочникСсылка.УсловияТруда"));
       
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    Отгулы_2Остатки.Сотрудник,
        |    Отгулы_2Остатки.ЧасовОстаток
        |ИЗ
        |    РегистрНакопления.Отгулы_2.Остатки(&ДеньОтгула, Сотрудник = &Сотрудник) КАК Отгулы_2Остатки
        |ГДЕ
        |    Отгулы_2Остатки.ЧасовОстаток >= 4";
       
        Запрос.УстановитьПараметр("ДеньОтгула", ДеньОтгула);
        Запрос.УстановитьПараметр("Сотрудник", Сотрудник);
       
        РезультатЗапроса =      Запрос.Выполнить();
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        Если ВыборкаДетальныеЗаписи.Следующий() Тогда
            ДанныеПоВидуВремениНаДату = ТаблицаДанныхОВремени.Добавить();
            ДанныеПоВидуВремениНаДату.Дата = ДеньОтгула;
            ДанныеПоВидуВремениНаДату.Сотрудник = ВыборкаДетальныеЗаписи.Сотрудник;
            ДанныеПоВидуВремениНаДату.ВидВремени = ВидВремени;
            ДанныеПоВидуВремениНаДату.Дней = 1;
            ДанныеПоВидуВремениНаДату.Часов = 12;
            ДанныеПоВидуВремениНаДату.ВЦеломЗаПериод = Ложь;
        КонецЕсли;
       
        ТЗ =   РезультатЗапроса.Выгрузить();
       
        Возврат ТаблицаДанныхОВремени;
    КонецФункции   
   
#КонецЕсли



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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 ВТДоплаты.Период,
 ВТДоплаты.Сотрудник
ПОМЕСТИТЬ ВТНачисления
ИЗ
 ВТДоплаты КАК ВТДоплаты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК Организация,
 ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,
 ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) КАК Подразделение,
 ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность
ПОМЕСТИТЬ Представления_СрезПоследних_КадроваяИсторияСотрудников
ИЗ
 ВТНачисления КАК ВТНачисления
ГДЕ
 "ТолькоРазрешенные" = ИСТИНА
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
 ВТДоплаты.Период КАК Месяц,
 ВТДоплаты.Сотрудник КАК Сотрудник,
 ВТДоплаты.ОсновноеЗначениеПериодДействияКАК ОтработаноЧасовВКислотномЦеху,
 ВТДоплаты.Результат КАК НачисленоДоплаты,
 ВТОтгулы.Результат КАК НачисленоЗаОтгулы,
 ВТОтгулы.ПредоставленоОтгулов,
 Отгулы_2ОстаткиИОбороты.ЧасовНачальныйОстаток / 4 КАК ОстатокОтгуловНаНачалоПериода,
 Отгулы_2ОстаткиИОбороты.ЧасовКонечныйОстаток / 4 КАК ОстатокОтгуловНаКонецПериода,
 Представления_СрезПоследних_КадроваяИсторияСотрудников.Должность
ИЗ
 ВТДоплаты КАК ВТДоплаты
  ЛЕВОЕ СОЕДИНЕНИЕ ВТОтгулы КАК ВТОтгулы
  ПО (ВТОтгулы.Сотрудник = ВТДоплаты.Сотрудник)
   И ВТДоплаты.Период = ВТОтгулы.Период
  ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Отгулы_2.ОстаткиИОбороты(&Дата1, &Дата2, Месяц, , ) КАК Отгулы_2ОстаткиИОбороты
  ПО ВТДоплаты.Сотрудник = Отгулы_2ОстаткиИОбороты.Сотрудник
   И ВТДоплаты.Период = Отгулы_2ОстаткиИОбороты.Период
  ЛЕВОЕ СОЕДИНЕНИЕ Представления_СрезПоследних_КадроваяИсторияСотрудников КАК Представления_СрезПоследних_КадроваяИсторияСотрудников
  ПО ВТДоплаты.Сотрудник = Представления_СрезПоследних_КадроваяИсторияСотрудников.Сотрудник


 

--- Конец кода ---

[вложение удалено администратором]

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии