Аттестация "1С:Специалист" > Аттестация "1С:Специалист" ЗУП
ЗУП 3.0 Специалист Билет 4
demos:
очень странная задача, даже в условии ошибка - Годовой лимит возмещения оплаты за квартиру, а потом в таблице - Годовой лимит медицинских расходов
судя по отчету, нужно заводить остаточный РН, актуальностью на год. Но кто его будет закрывать в конце года, тоже не понятно...
1. Создаем РН Лимиты, остатки, изм - Год (дата), Сотрудник, ресурс - Сумма.
2. Включаем в настроках - отпуска без оплаты и компенсационные выплаты.
3. Создаем начисление - "_КомпенсацияКвартплаты" назначение: Компенсационные выплаты, Начисление выполняется: Только если введено значение показателя, формула: РазмерКомпенсации_КомпенсацияКвартплаты, налог: пп.4, ст.255 НК РФ.
4. Создаем разряды в справочнике - РазрядыКатегорииДолжностей, потом создаем должность и привязываем ей разряды.
5. Создаем документ "ПодтверждениеРасходов", будет вводится в течении месяца. Также пусть закрывает прошлогодние лимиты)
модуль объекта:
КодПроцедура ОбработкаПроведения(Отказ, Режим)
Движения.Лимиты.Записывать = Истина;
// закрываем все предыдущие лимиты
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения,
| ДОБАВИТЬКДАТЕ(ЛимитыОстатки.Год, ГОД, 1) КАК Период,
| ЛимитыОстатки.Сотрудник,
| ЛимитыОстатки.Год,
| ЕСТЬNULL(ЛимитыОстатки.СуммаОстаток, 0) КАК Сумма
|ИЗ
| РегистрНакопления.Лимиты.Остатки(&КонецПериода, ) КАК ЛимитыОстатки";
Запрос.УстановитьПараметр("КонецПериода", НачалоГода(Дата) - 1 );
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Движения.Лимиты.Загрузить( РезультатЗапроса.Выгрузить() );
КонецЕсли;
// пишем новые записи
Для Каждого ТекСтрокаДанныеРасходов Из ДанныеРасходов Цикл
Движение = Движения.Лимиты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Сотрудник = ТекСтрокаДанныеРасходов.Сотрудник;
Движение.Год = НачалоГода(Дата);
Движение.Сумма = ТекСтрокаДанныеРасходов.Расход;
КонецЦикла;
КонецПроцедуры
6. Создаем документ "РасчетЛимитов" будет вводится в конце месяца до начисления зарплаты. Будет составлять табель, вычитать отпуска без оплаты, оклад берет из РС ПлановыеНачисления, разряд из РС РазрядыКатегорииСотрудников
форма:
Код&НаСервере
Процедура ЗаполнитьНаСервере()
ЗначениеФорма = РеквизитФормыВЗначение("Объект");
ЗначениеФорма.ДанныеЛимитов.Очистить();
ЗначенияПоУмолчанию = Новый Структура("Организация");
ЗарплатаКадры.ПолучитьЗначенияПоУмолчанию(ЗначенияПоУмолчанию, НачалоМесяца(ЗначениеФорма.Дата) );
ЗначениеФорма.ДатаНачалаПериода = НачалоМесяца(ЗначениеФорма.Дата);
ЗначениеФорма.ДатаОкончанияПериода = КонецМесяца(ЗначениеФорма.Дата);
ЗначениеФорма.ПериодРегистрации = ЗначениеФорма.Дата;
ЗначениеФорма.Организация = ЗначенияПоУмолчанию.Организация;
ВыборкаДанныхОВремени = Документы.ТабельУчетаРабочегоВремени.ДанныеОВремениСотрудников(ЗначениеФорма);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВыборкаДанныхОВремени.Дата,
| ВыборкаДанныхОВремени.Сотрудник,
| ВыборкаДанныхОВремени.ВидУчетаВремени КАК ВидУчетаВремени
|ПОМЕСТИТЬ ВТВыборкаДанныхОВремени
|ИЗ
| &ВыборкаДанныхОВремени КАК ВыборкаДанныхОВремени
|
|ИНДЕКСИРОВАТЬ ПО
| ВидУчетаВремени
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТВыборкаДанныхОВремени.Сотрудник КАК Сотрудник,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТВыборкаДанныхОВремени.Дата) КАК ДнейОтпуска
|ПОМЕСТИТЬ ВТВыборкаДнейОтпуска
|ИЗ
| ВТВыборкаДанныхОВремени КАК ВТВыборкаДанныхОВремени
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланВидовРасчета.Начисления КАК Начисления
| ПО ВТВыборкаДанныхОВремени.ВидУчетаВремени = Начисления.ОбозначениеВТабелеУчетаРабочегоВремени
| И (Начисления.ВидОтпуска.ОтпускБезОплаты = ИСТИНА)
|
|СГРУППИРОВАТЬ ПО
| ВТВыборкаДанныхОВремени.Сотрудник
|
|ИНДЕКСИРОВАТЬ ПО
| Сотрудник
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПлановыеНачисленияСрезПоследних.Сотрудник,
| ЕСТЬNULL(ПлановыеНачисленияСрезПоследних.Размер, 0) КАК РазмерОклада,
| ЕСТЬNULL(РазрядыКатегорииСотрудниковСрезПоследних.РазрядКатегория, ЗНАЧЕНИЕ(Справочник.РазрядыКатегорииДолжностей.ПустаяСсылка)) КАК КатегорияДолжности,
| ВЫБОР
| КОГДА РазрядыКатегорииСотрудниковСрезПоследних.РазрядКатегория = &ТопМенеджеры
| ТОГДА ЕСТЬNULL(ПлановыеНачисленияСрезПоследних.Размер, 0) * 3 / 12
| КОГДА РазрядыКатегорииСотрудниковСрезПоследних.РазрядКатегория = &Руководители
| ТОГДА ЕСТЬNULL(ПлановыеНачисленияСрезПоследних.Размер, 0) * 2 / 12
| КОГДА РазрядыКатегорииСотрудниковСрезПоследних.РазрядКатегория = &Специалисты
| ТОГДА ЕСТЬNULL(ПлановыеНачисленияСрезПоследних.Размер, 0) / 12
| КОНЕЦ КАК ПлановыйЛимит,
| (ДЕНЬ(&Период) - ЕСТЬNULL(ВТВыборкаДнейОтпуска.ДнейОтпуска, 0)) / ДЕНЬ(&Период) КАК КоэффициентВремени
|ПОМЕСТИТЬ ВТИтоговыеДанные
|ИЗ
| РегистрСведений.ПлановыеНачисления.СрезПоследних(
| &Период,
| Активность = ИСТИНА
| И Начисление = &Оклад) КАК ПлановыеНачисленияСрезПоследних
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РазрядыКатегорииСотрудников.СрезПоследних(&Период, Активность = ИСТИНА) КАК РазрядыКатегорииСотрудниковСрезПоследних
| ПО ПлановыеНачисленияСрезПоследних.Сотрудник = РазрядыКатегорииСотрудниковСрезПоследних.Сотрудник
| ЛЕВОЕ СОЕДИНЕНИЕ ВТВыборкаДнейОтпуска КАК ВТВыборкаДнейОтпуска
| ПО ПлановыеНачисленияСрезПоследних.Сотрудник = ВТВыборкаДнейОтпуска.Сотрудник
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТИтоговыеДанные.Сотрудник,
| ВТИтоговыеДанные.РазмерОклада,
| ВТИтоговыеДанные.КатегорияДолжности,
| ВТИтоговыеДанные.ПлановыйЛимит,
| ВТИтоговыеДанные.КоэффициентВремени,
| ВТИтоговыеДанные.ПлановыйЛимит * ВТИтоговыеДанные.КоэффициентВремени КАК ЗаработанныйЛимит
|ИЗ
| ВТИтоговыеДанные КАК ВТИтоговыеДанные";
Запрос.УстановитьПараметр("Оклад", ПланыВидовРасчета.Начисления.НайтиПоКоду("ОКЛ") );
Запрос.УстановитьПараметр("Период", КонецМесяца(ЗначениеФорма.Дата) );
Запрос.УстановитьПараметр("Руководители", Справочники.РазрядыКатегорииДолжностей.НайтиПоНаименованию("Руководители") );
Запрос.УстановитьПараметр("Специалисты", Справочники.РазрядыКатегорииДолжностей.НайтиПоНаименованию("Специалисты") );
Запрос.УстановитьПараметр("ТопМенеджеры", Справочники.РазрядыКатегорииДолжностей.НайтиПоНаименованию("Топ-менеджеры") );
Запрос.УстановитьПараметр("ВыборкаДанныхОВремени", ВыборкаДанныхОВремени.Владелец().Выгрузить() );
РезультатЗапроса = Запрос.Выполнить();
ЗначениеФорма.ДанныеЛимитов.Загрузить( РезультатЗапроса.Выгрузить() );
ЗначениеВРеквизитФормы( ЗначениеФорма, "Объект" );
КонецПроцедуры
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
КонецПроцедуры
при проведении берет данные из РН ЛимитыОстаткиИОбороты, рассчитывает лимит к начислению и кладет в РС ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников
модуль объекта:
КодПроцедура ОбработкаПроведения(Отказ, Режим)
Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников.Очистить();
Движения.Лимиты.Очистить();
Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников.Записать();
Движения.Лимиты.Записать();
НачалоГода = НачалоГода(Дата);
НачалоМесяца = НачалоМесяца( Дата );
КонецМесяца = КонецМесяца( Дата );
ЗначенияПоУмолчанию = Новый Структура("Организация");
ЗарплатаКадры.ПолучитьЗначенияПоУмолчанию(ЗначенияПоУмолчанию, НачалоМесяца );
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасчетЛимитовДанныеЛимитов.Сотрудник,
| СУММА(ЕСТЬNULL(РасчетЛимитовДанныеЛимитов.ЗаработанныйЛимит, 0)) КАК ЗаработанныйЛимит
|ПОМЕСТИТЬ ВТДанныеЛимитов
|ИЗ
| Документ.РасчетЛимитов.ДанныеЛимитов КАК РасчетЛимитовДанныеЛимитов
|ГДЕ
| РасчетЛимитовДанныеЛимитов.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РасчетЛимитовДанныеЛимитов.Сотрудник
|
|ИНДЕКСИРОВАТЬ ПО
| РасчетЛимитовДанныеЛимитов.Сотрудник
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТДанныеЛимитов.Сотрудник,
| ВЫБОР
| КОГДА ЕСТЬNULL(ЛимитыОстаткиИОбороты.СуммаКонечныйОстаток, 0) <= 0
| ТОГДА ЕСТЬNULL(ЛимитыОстаткиИОбороты.СуммаОборот, 0)
| КОГДА ЕСТЬNULL(ЛимитыОстаткиИОбороты.СуммаКонечныйОстаток, 0) <= ЕСТЬNULL(ВТДанныеЛимитов.ЗаработанныйЛимит, 0)
| ТОГДА ЕСТЬNULL(ЛимитыОстаткиИОбороты.СуммаКонечныйОстаток, 0)
| ИНАЧЕ ВЫБОР
| КОГДА ЕСТЬNULL(ЛимитыОстаткиИОбороты.СуммаНачальныйОстаток, 0) >= 0
| ТОГДА ЕСТЬNULL(ВТДанныеЛимитов.ЗаработанныйЛимит, 0)
| ИНАЧЕ ЕСТЬNULL(ВТДанныеЛимитов.ЗаработанныйЛимит, 0) - ЕСТЬNULL(ЛимитыОстаткиИОбороты.СуммаНачальныйОстаток, 0)
| КОНЕЦ
| КОНЕЦ КАК ЛимитКНачислению,
| ВТДанныеЛимитов.ЗаработанныйЛимит
|ИЗ
| ВТДанныеЛимитов КАК ВТДанныеЛимитов
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Лимиты.ОстаткиИОбороты(
| &НачалоПериода,
| &КонецПериода,
| Месяц,
| ,
| Год = &НачалоГода
| И Сотрудник В
| (ВЫБРАТЬ
| ВТДанныеЛимитов.Сотрудник
| ИЗ
| ВТДанныеЛимитов КАК ВТДанныеЛимитов)) КАК ЛимитыОстаткиИОбороты
| ПО ВТДанныеЛимитов.Сотрудник = ЛимитыОстаткиИОбороты.Сотрудник";
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца );
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца );
Запрос.УстановитьПараметр("НачалоГода", НачалоГода );
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников.Записывать = Истина;
Движения.Лимиты.Записывать = Истина;
Пока Выборка.Следующий() Цикл
Показатель = Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников.Добавить();
Показатель.ПериодДействия = НачалоМесяца;
Показатель.Сотрудник = Выборка.Сотрудник;
Показатель.Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоРеквизиту("Идентификатор", "РазмерКомпенсации_КомпенсацияКвартплаты");
Показатель.Организация = ЗначенияПоУмолчанию.Организация;
Показатель.Значение = Выборка.ЛимитКНачислению;
Движение = Движения.Лимиты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = КонецМесяца;
Движение.Сотрудник = Выборка.Сотрудник;
Движение.Год = НачалоГода;
Движение.Сумма = Выборка.ЗаработанныйЛимит;
КонецЦикла;
7. Отчет
КодВЫБРАТЬ
Начисления.ПериодДействия,
Начисления.Сотрудник,
ЛимитыОстаткиИОбороты.СуммаНачальныйОстаток КАК ОстатокЛимитаНаНачалоПериода,
ЛимитыОстаткиИОбороты.СуммаРасход КАК ЗаработаноЛимитаЗаПериод,
ЛимитыОстаткиИОбороты.СуммаПриход КАК ПодтвержденныеРасходы,
Начисления.Результат КАК ФактическиВозмещенныеРасходы,
ЛимитыОстаткиИОбороты.СуммаКонечныйОстаток КАК ОстатокЛимитаНаКонецПериода
ИЗ
РегистрРасчета.Начисления КАК Начисления
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Лимиты.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Месяц, , ) КАК ЛимитыОстаткиИОбороты
ПО Начисления.ПериодРегистрации = ЛимитыОстаткиИОбороты.Период
И Начисления.Сотрудник = ЛимитыОстаткиИОбороты.Сотрудник
ГДЕ
Начисления.ВидРасчета = &ВидРасчета
AHuk87:
Решал почти такую же задачу сегодня. Единственно что там компенсации давались на каждого ребёнка. В связи с этим вопрос как в ЗУП узнать сколько детей? В голову пришло только использование регистра сведений "СоставыСемейФизическихЛиц". Откуда я выбирал степени родства детей. Но для этого пришлось создать свой регистр сведений и внести туда все степени родства, которые являются детьми. Есть идеи как сделать это лучше?
И я создавал 2 оборотных регистра накопления "ФактическиеРасходы" и "Лимиты " куда писал подвержденные расходы из документа "ПодтверждениеРасходов" и рассчитанные плановые и фактически возмещенные расходы из документа "РасчетЛимитов" соответственно. Обороты при расчете фактически возмещенных расходов брал с начала года по конец месяца расчета.
svetlanagold:
На экзамене попался этот билет. Сделала с одним регистром накопления, но экзаменатор сказала, что с одним регистром накопления задачу решить невозможно. Надо делать два регистра Учет лимитов и Учет фактических расходов.
paxanb:
Кто-нить может объяснить, почему задачу надо решать на двух РН(об) вместо одного РН(остатки)?
+ можно обойтись без создания документа ПодтверждениеРасходов. Также категории должностей можно двумя способами сделать, без создания новых объектов, и при этом не зашивать лимиты внутрь кода (храня в РС).
mkanaev:
Мое решение:
Описание.
1. Завел показатель "Компенсация", показатель разовый по сотруднику и собирает все введенные данные за месяц. Вывел в константы для использования в документах.
2. Завел начисление "Компенсация", формула = Показатель "Компенсация". Вывел в константы для использования в отчете.
3. Создал константы "Показатель_Оклад", "Начисление_ОтпускЗаСвойСчет" для получения начисления в документе, при заполнении данных о лимитах. Т.к. начисление отпуска за свой счет может не существовать в базе, вывел в константы.
4. Создал регистр накопления "КомпенсацияКварПлаты" след. структуры:
Измерения:
- сотрудник
- год, для получения остатков только по тому году в котором проходим действие, согласно условиям задачи "Лимиты на след. год не переносятся".
Ресурсы:
- сумма
В модуле набора записей прописал алгоритм приведения измерения Год в один формат, год = НачалоГода(Год).
Принцип работы регистра:
Регистр хранит в себе остатки лимитов по компенсации. Если остаток положительный то по сотруднику есть лимит компенсации который он ещё не использовал, т.е. не подтвердил фактическими расходами. Если остаток отрицательный, то по сотруднику есть подтвержденные расходы на которые не хватило лимита.
Пример работы документов с регистром:
- Док. расчет лимитов 1: + 5000 р. Остаток 5000р.
- Док. Подтверждение расходов 1: - 6000. Остаток -1000р. (+5000 в регистр значения оперативных показателей по сотруднику, т.е. к начислению)
- Док. расчет лимитов 2: +5000 р. Остаток 4000р. (+1000 в регистр значения оперативных показателей по сотруднику, т.е. сотруднику выплачиваются расходы которые он подтвердил ранее но на которые не хватило лимита)
- Док. Подтверждение расходов 2: - 3000. Остаток 1000р. (+3000 в регистр значения оперативных показателей по сотруднику, т.е. к начислению)
При такой логике регистра выполняется требование что не израсходованные лимиты переносятся на следующий месяц и подтвержденные расходы на которые не хватило лимитов компенсируются в след. месяце.
В документах работающих с данным регистром есть проверка остатков за предыдущие года и списание, что бы не болтались остатки в регистре.
5. Создал регистр сведений "ЛимитыКомпенсации", для хранения количество окладом по категориям должностей.
Измерения: Категория, ресурс: Значение.
6. Разработал документ "РасчетЛимитов". Структура:
Шапка:
- Организация, для записи в регистр "ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников"
Табличная часть Данные:
- Сотрудник
- КатегорияДолжности
- РазмерОклада
- ПлановыйЛимит
- КоэффициентВремени
- ЗаработанныйЛимит.
В модуле формы разработал процедуру заполнения. Процедура работает по след. принципу:
- подбирает не уволенных сотрудников на конец месяца, по регистру сведений "СостоянияСотрудников"
- получает по ним должности из регистра сведений "КадроваяИсторияСотрудников" на конец месяца
- по должностям получает категорию, по категориям получает количество окладов из регистра сведений "ЛимитыКомпенсации",
- получает значение оклада из регистра сведений "ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников"
- считает плановый лимит
- собирает из регистра расчета "Начисления" периоды отпуска за свой счет и вычисляет количество дней отпуска
- считает коэффициент времени
(ВсегоКалендарыныхДней - ДнейОтпуска) / ВсегоКалендарыныхДней
- вычисляет ЗаработанныйЛимит.
При проведении документа списываются остатки лимитов за предыдущие года, согласно описанному алгоритму выше. Если по сотрудникам из документа есть отрицательные лимиты, то в регистр "ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников" пишется запись на сумму меньшую между "ЗаработанныйЛимит" и СуммаОстаток * -1.
Пример описан выше. Документ делает движения по регистру накопления " КомпенсацияКварПлаты " с видом "Приход".
7. Разработан документ "РасходыПоКварПлате". Структура документа:
Шапка:
- Организация, для записи в регистр "ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников"
Табличная часть Данные:
- Сотрудник
- Сумма
При проведении документа формируются проводки по регистру накопления " КомпенсацияКварПлаты " с видом "Расход". Если по сотруднику есть остатки по накопленным лимитам то сумма = минимальная из Сумма(документ) и СуммаОстаток, записывается в регистр накопления "ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников". Если сумма превышает сумму остатков то остаток после проведения этого документа будет отрицательный и может быть покрыт следующим документом "РасчетЛимитов".
8. Создал отчет: "ВозмещениеСоциальныхРасходов". Отчет формируется из регистра расчета "Начисления" по начислениям компенсация и регистра накопления " КомпенсацияКварПлаты"
9. Заполнил БД по двум сотрудникам за три месяца.
Навигация
Перейти к полной версии