Аттестация "1С:Специалист" > Аттестация "1С:Специалист" ЗУП
ЗУП 3.0 Специалист Билет 2
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ОстаткиИОбороты.Период
ЛЕВОЕ СОЕДИНЕНИЕ Представления_СрезПоследних_КадроваяИсторияСотрудников КАК Представления_СрезПоследних_КадроваяИсторияСотрудников
ПО ВТДоплаты.Сотрудник = Представления_СрезПоследних_КадроваяИсторияСотрудников.Сотрудник
--- Конец кода ---
[вложение удалено администратором]
Навигация
Перейти к полной версии