Автор Тема: ЗУП 3.0 Специалист Билет 2  (Прочитано 27235 раз)

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

demos

  • Новичок
  • *
  • Сообщений: 4
  • ФИО: demos
ЗУП 3.0 Специалист Билет 2
« : Октябрь 08, 2014, 09:49:54 pm »
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)) КАК ОстатокОтгуловНаКонецПериода
 ИЗ
       ВТЗаРаботуВЦеху КАК ВТЗаРаботуВцеху
           ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РаботаВЦеху.Обороты(
                   &НачалоПериода,
                   &КонецПериода,
                   Месяц,
                   Сотрудник В
                       (ВЫБРАТЬ
                           ВТЗаРаботуВцеху.Сотрудник
                       ИЗ
                           ВТЗаРаботуВцеху КАК ВТЗаРаботуВцеху)) КАК РаботаВЦехуОбороты
           ПО ВТЗаРаботуВцеху.Сотрудник = РаботаВЦехуОбороты.Сотрудник
               И ВТЗаРаботуВцеху.ПериодДействия = РаботаВЦехуОбороты.Период
           ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Отгулы.ОстаткиИОбороты(
                   &НачалоПериода,
                   &КонецПериода,
                   Месяц,
                   ,
                   Сотрудник В
                       (ВЫБРАТЬ
                           ВТЗаРаботуВцеху.Сотрудник
                       ИЗ
                           ВТЗаРаботуВцеху КАК ВТЗаРаботуВцеху)) КАК ОтгулыОстаткиИОбороты
           ПО ВТЗаРаботуВцеху.Сотрудник = ОтгулыОстаткиИОбороты.Сотрудник
               И ВТЗаРаботуВцеху.ПериодДействия = ОтгулыОстаткиИОбороты.Период
           ЛЕВОЕ СОЕДИНЕНИЕ ВТЗаОтгулы КАК ВТЗаОтгулы
           ПО ВТЗаРаботуВцеху.ПериодДействия = ВТЗаОтгулы.ПериодДействия
               И ВТЗаРаботуВцеху.Сотрудник = ВТЗаОтгулы.Сотрудник
« Последнее редактирование: Октябрь 08, 2014, 09:55:38 pm от Дмитрий »

Tex

  • Пользователь
  • **
  • Сообщений: 11
  • ФИО: Андрей
Re: ЗУП 3.0 Специалист Билет 2
« Ответ #1 : Январь 08, 2015, 01:40:22 pm »
Судя по всему выложено сырое надоделанное решение.

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

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


Tex

  • Пользователь
  • **
  • Сообщений: 11
  • ФИО: Андрей
Re: ЗУП 3.0 Специалист Билет 2
« Ответ #2 : Январь 09, 2015, 11:05:29 am »
По отчету тоже косяк. Точнее по начислению зарплаты. Документ считает все хорошо, однако доплата за работу в цеху не попадает в РР, хотя отгул попадает. В связи с эти запросу нечего выдергивать.

Добавлено: Разобрался. РС ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников записываются начисления без периода действия, тоесть не протяженные во времени. А они а РР не записываются.
« Последнее редактирование: Январь 09, 2015, 12:38:26 pm от Tex »

Karomag

  • Новичок
  • *
  • Сообщений: 3
  • ФИО: Karomag
Re: ЗУП 3.0 Специалист Билет 2
« Ответ #3 : Август 27, 2015, 01:53:48 pm »
Скажите, в чем смысл создания отдельного регистра для РС РаботаВЦеху (и кстати, наверное имеется ввиду РН) , почему бы не писать сразу в  РС ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников?
« Последнее редактирование: Август 27, 2015, 01:55:30 pm от Karomag »

IgorXml

  • Пользователь
  • **
  • Сообщений: 42
  • IgorXml
  • ФИО: Игорь
Re: ЗУП 3.0 Специалист Билет 2
« Ответ #4 : Август 27, 2015, 08:17: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ОстаткиИОбороты.Период
  ЛЕВОЕ СОЕДИНЕНИЕ Представления_СрезПоследних_КадроваяИсторияСотрудников КАК Представления_СрезПоследних_КадроваяИсторияСотрудников
  ПО ВТДоплаты.Сотрудник = Представления_СрезПоследних_КадроваяИсторияСотрудников.Сотрудник


 

[вложение удалено администратором]
« Последнее редактирование: Октябрь 11, 2015, 06:38:22 pm от IgorXml »

Retributor1387

  • Новичок
  • *
  • Сообщений: 4
Re: ЗУП 3.0 Специалист Билет 2
« Ответ #5 : Октябрь 11, 2015, 04:17:57 pm »
Цитировать
УчетРабочегоВремени.ЗарегистрироватьДанныеИндивидуальногоГрафика(Движения, ДанныеДляПроведения, НачалоМесяца(Месяц));
Все бы ничего, но такая механика по каким-то причинам не работает (((
Добавил документ, прописал такую механику проведения, сделал все так, как было нарисовано. Но начисление зарплаты не видит данные, внесенные документом. Если вношу тоже самое табелем или индивидуальным графиком - все ок, видит, считает. Данные самопального документа система игнорирует. Добавил в критерий отбора, подобавлял в регистры сведений как основание/регистратор (рядом с табелем). Пробовал данные подстраивать и под индивидуальный график (тогда данные вносятся плановые), и под табель. Эффекта ноль, хотя в регистре данных табельного учета записи имеются.
Подскажите пожалуйста!
« Последнее редактирование: Октябрь 11, 2015, 04:19:54 pm от Retributor1387 »

IgorXml

  • Пользователь
  • **
  • Сообщений: 42
  • IgorXml
  • ФИО: Игорь
Re: ЗУП 3.0 Специалист Билет 2
« Ответ #6 : Октябрь 11, 2015, 06:42:01 pm »
Цитировать
УчетРабочегоВремени.ЗарегистрироватьДанныеИндивидуальногоГрафика(Движения, ДанныеДляПроведения, НачалоМесяца(Месяц));
Все бы ничего, но такая механика по каким-то причинам не работает (((
...
Сори, забыл изменить здесь. Было не правильно. В первом документе д.б. .ЗарегистрироватьДанныеИндивидуальногоГрафика(, но в документе отгул .ЗарегистрироватьДанныеТабеля(.
« Последнее редактирование: Октябрь 11, 2015, 06:44:59 pm от IgorXml »

Retributor1387

  • Новичок
  • *
  • Сообщений: 4
Re: ЗУП 3.0 Специалист Билет 2
« Ответ #7 : Октябрь 11, 2015, 06:49:38 pm »
Цитировать
УчетРабочегоВремени.ЗарегистрироватьДанныеИндивидуальногоГрафика(Движения, ДанныеДляПроведения, НачалоМесяца(Месяц));
Все бы ничего, но такая механика по каким-то причинам не работает (((
...
Сори, забыл изменить здесь. Было не правильно. В первом документе д.б. .ЗарегистрироватьДанныеИндивидуальногоГрафика(, но в документе отгул .ЗарегистрироватьДанныеТабеля(.

Это не столь важно для расчета ))) система посчитает и так, и так. Но это если внести через индивидуальный график или табель. А через свой документ ни так ни так система записей не видит. Такое ощущение, что она режет записи по регистратору. Куда надо внести свой документ, чтоб его записи тоже учитывались?

IgorXml

  • Пользователь
  • **
  • Сообщений: 42
  • IgorXml
  • ФИО: Игорь
Re: ЗУП 3.0 Специалист Билет 2
« Ответ #8 : Октябрь 11, 2015, 07:09:31 pm »
... Куда надо внести свой документ, чтоб его записи тоже учитывались?
. Не понимаю. Два "самопальных" документа и один типовой и больше ничего, если не считать кадрового. Ну и настроить два начисления.

Retributor1387

  • Новичок
  • *
  • Сообщений: 4
Re: ЗУП 3.0 Специалист Билет 2
« Ответ #9 : Октябрь 11, 2015, 07:32:46 pm »
... Куда надо внести свой документ, чтоб его записи тоже учитывались?
. Не понимаю. Два "самопальных" документа и один типовой и больше ничего, если не считать кадрового. Ну и настроить два начисления.
А данные этих самопальных как попадают в расчет зарплаты?
Я сделал в точности документ регистрации пропускной системы, вношу данные графика, как написано, кодом. Начисления настроены так же в точности, при заполнении начисления зарплаты система новое начисление не видит. Включаю начисление в ежемесячном режиме, добавляю в кадровом документе - появляется в списке при заполнении с нулевым результатом.
Возвращаем начисление только по вводу вида времени, убираем строчку из кадрового документа, вбиваем несколько дат в табеле с нашим видом времени, пытаемся заполнить начисление зарплаты - все считается замечательно. Я перекопал большую часть кода, при расчете движения расчета пишутся временно, потом оттуда получаются данные графика и на их основании делается расчет.
Вопрос, почему движения самопального документа не попадают в эти временные движения расчета и, соответственно, в периоде действия у нас там 0? Может документ надо внести в какой-то критерий отбора или добавить в составной тип где-то, чтобы его движения не отсеивались?
« Последнее редактирование: Октябрь 11, 2015, 07:35:12 pm от Retributor1387 »

IgorXml

  • Пользователь
  • **
  • Сообщений: 42
  • IgorXml
  • ФИО: Игорь
Re: ЗУП 3.0 Специалист Билет 2
« Ответ #10 : Октябрь 11, 2015, 07:41:13 pm »
...
Вопрос, почему движения самопального документа не попадают в эти временные движения расчета и, соответственно, в периоде действия у нас там 0? Может документ надо внести в какой-то критерий отбора или добавить в составной тип где-то, чтобы его движения не отсеивались?
Нет.
Начисление так настроено? И в регистр должно попадать две строки для первого документа и одна для отгула.
« Последнее редактирование: Октябрь 11, 2015, 07:56:00 pm от IgorXml »

Retributor1387

  • Новичок
  • *
  • Сообщений: 4
Re: ЗУП 3.0 Специалист Билет 2
« Ответ #11 : Октябрь 11, 2015, 07:58:45 pm »
Начисление так настроено? И в регистр должно попадать две строки для первого документа и одна для отгула.
Все именно так. И в регистр пишу по две записи (на свой вид времени и на явку). Отгул пока не трогал.

Вообще, я сглупил. Я не то писал в период регистрации. Не сразу бросилось в глаза. Поправил - все появилось. Фух. И спасибо за помощь )))


NeskilF

  • Новичок
  • *
  • Сообщений: 2
  • ФИО: NeskilF
Re: ЗУП 3.0 Специалист Билет 2
« Ответ #12 : Декабрь 17, 2015, 03:22:27 pm »
Прорешала билет, делала по примеру IgorXml
Все начисляется и правильно считается, но в отчете из регистра расчета не берутся значения по отработанным часам - ОсновноеЗначениеПериодДействия, по новому виду начисления эта колонка пустая.
Не подскажете в чем может быть дело?

svetlanagold

  • Новичок
  • *
  • Сообщений: 9
  • ФИО: Светлана
Re: ЗУП 3.0 Специалист Билет 2
« Ответ #13 : Декабрь 21, 2015, 04:43:00 pm »
IgorXml, скажите пожалуйста,почему в 1-ом документе вы используете ЗарегистрироватьДанныеИндивидуальногоГрафика, а в документе Отгул ЗарегистрироватьДанныеТабеля?

arthur2003

  • Новичок
  • *
  • Сообщений: 6
  • ФИО: Артур
Re: ЗУП 3.0 Специалист Билет 2
« Ответ #14 : Февраль 13, 2016, 03:24:02 pm »
IgorXml, скажите пожалуйста,почему в 1-ом документе вы используете ЗарегистрироватьДанныеИндивидуальногоГрафика, а в документе Отгул ЗарегистрироватьДанныеТабеля?

Та же проблема, раньше, в релизе 3.0.23.143 было ОК, а в релизе 3.0.25.65 в Общем модуле УчетРабочегоВремени удалили часть кода функцуии ЗаполнитьОчереднойНабор, добавляющий записиси с ВремяВЧасах=Истина и теперь непонятно как этот ресурс должен заполнятся

« Последнее редактирование: Февраль 13, 2016, 05:30:54 pm от arthur2003 »