gifts2017

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

Опубликовал maxdmt (maxdmt) в раздел Программирование - Сертификация

Пример решения 4-го билета для экзамена на специалиста по ЗУП 3.0. В публикации представлено собственное решение.

Готовиться к экзамену начал в апреле 2015-го и, к сожалению, не нашел в сети решений, которые бы полностью меня устроили.
Для публикации выбрал 4-й билет, т.к. в нем показана работа с собственными предопределенными показателями расчета ЗП, работа с представлениями в коде и использован типовой документ «Данные для расчета зарплаты».

Экзаменационные билеты можно скачать с сайта 1С.


          1. ОБЩИЕ ВЕДЕНИЯ

Итак. Возмещение квартплаты будет рассчитываться по формуле

   Мин(
   Макс(ФактическаяКвПлатаНарИт -ФактическиВозмещено, 0),
   Макс(ЗаработанныйЛимитНарИт - ФактическиВозмещено, 0))

(т.е. минимальное значение из остатка лимита и остатка невозмещенных расходов)

Где

    ФактическаяКвПлатаНарИт – фактический расход сотрудника с начала года

    ЗаработанныйЛимитНарИт – заработанный лимит с начала года

    ФактическиВозмещено – сумма возмещенная предприятием с начала года

 

Подробнее

а) ФактическаяКвПлатаНарИт – сумма показателей ФактическаяКвПлатаМес с начала года, ФактическаяКвПлатаМес – фактический расход сотрудника в текущем месяце, вводится в систему типовым документом «Данные для расчета зарплаты».

б) ЗаработанныйЛимитНарИт – сумма показателей ЗаработанныйЛимитМес с начала года, ЗаработанныйЛимитМес вводится в систему новым документом «Расчет лимитов».

в) ФактическиВозмещено  – сумма по регистру расчета «Начисления» с начала года по текущему виду расчета.

 

Объекты, добавленные в конфигурацию.

 

 


           2 ПОДГОТАВЛИВАЕМ СТРУКТУРУ

Снимаем конфигурацию с поддержки, и создаем подсистему "Экзамен" с дочерними.

 

Создаем перечисление «Категории должностей».

 

Далее нужно привязать категорию к должности. С предопределенной характеристикой больше возни и она отвлекает при обновлении конфигурации, так что регистр сведений в данном случае - меньшее зло.

 

Привязываем к категории должности норму возмещения окладов в год.

 

 

Добавляем документ.

 

И добавляем отчет «Возмещение расходов», не забываем сразу создать схему компоновки данных и указать хранилище вариантов в прочих.

 

 

          3. НАСТРАИВАЕМ ПРЕДПРИЯТИЕ


   3.1 Запускаем предприятие.

Наша панель.

 

Утверждаем штатное расписание на три должности, принимаем трех сотрудников на работу на оклад.

 

   3.2 В справочник «Показатели расчета зарплаты» добавляем новые показатели (для сотрудника,  разовое использование).

Показатели: ЗаработанныйЛимитМес, ЗаработанныйЛимитНарИт, ФактическаяКвПлатаМес, ФактическаяКвПлатаНарИт, ФактическиВозмещено.

 

 

   3.3 Далее Настройки/Шаблоны ввода исходных данных

Добавляем новый шаблон для ввода показателя ФактическаяКвПлатаМес по сотрудникам.

 

 

 

Далее Зарплата/Данные для расчета зарплаты.

Вводим документы фактических расходов за три месяца, пример:

 

 

   3.4 Создаем новый вид расчета «Возмещение кварт платы», указываем назначение использования «Компенсационные выплаты» и начисление выполняется «Только если введено значение показателя».

Формула расчета (описана выше):

   

Мин(
   Макс(ФактическаяКвПлатаНарИт -ФактическиВозмещено, 0),
   Макс(ЗаработанныйЛимитНарИт - ФактическиВозмещено, 0))
   //ЗаработанныйЛимитМес

Комментарий с показателем ЗаработанныйЛимитМес нужен для того, чтобы можно было указать его в реквизите «Начисление выполняется», т.к. все остальные показатели не вводятся в систему, а рассчитываются.

 

   3.5 Создаем документ отсутствия на работе (нужно по ТЗ).

 

 

   3.6 Заполняем РС «Категории должностей» и РС «Норма возмещения по категории».

 

 

 

 

          4. РАЗРАБОТКА


   4.1 Делаем наши показатели предопределенными.

Переключаемся в конфигуратор. Открываем предопределенные элементы справочника ПоказателиРасчетаЗарплаты. Добавляем ЗаработанныйЛимитМес, ЗаработанныйЛимитНарИт, ФактическаяКвПлатаМес, ФактическаяКвПлатаНарИт, ФактическиВозмещено.

Обратите внимание Имя = Наименование.

 

 

Создаем обработку с кодом

            

               об = Реквизит1.ПолучитьОбъект();
               об.ИмяПредопределенныхДанных = об.Наименование;
               об.Записать();

Где Реквизит1 – тип Справочник.ПоказателиРасчетаЗарплаты. Запускаем предприятие и обрабатываем наши показатели, теперь они предопределенные.

 

   4.2 Разработка документа «Расчет лимитов»

 

4.2.1. Создаем форму и переносим управление периодом регистрации (реквизиты формы и процедуры) из соседнего документа, например «Увольнение», также забираем и Дата/номер

Процедуры: МесяцНачисленияСтрокойПриИзменении, МесяцНачисленияСтрокойНачалоВыбора,.. в общем, все, что касается месяца. Также добавляем «ПриСозданииНаСервере»              

               Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
                   //это новый
                   Объект.ПериодРегистрации = НачалоМесяца(ТекущаяДата());
               КонецЕсли;
              
               МесяцНачисленияСтрокой = ЗарплатаКадрыКлиентСервер.ПолучитьПредставлениеМесяца(Объект.ПериодРегистрации);

 

Заполнять будем процедурой в форме. Внешняя обработка заполнения здесь не нужна, т.к. они используются, как правило, для типовых документов, чтоб не менять конфигурацию.

Итак, для заполнения нам нужно отобрать всех сотрудников организации с датами приема, увольнения, тарифной ставкой и должностью. В этом нам поможет Представления_КадровыеДанныеСотрудников, пример берем из макета отчета, где оно используется. Поиск по макетам

 

 

Далее нужно внутренним соединением отобрать только те должности, которые есть в РС «Категории должностей», также подключить норму к категории. Определить правильное количество календарных дней отработанных сотрудником, с учетом дат приема и увольнения, вычислить число дней отпуска за свой счет (данные берем из РС ДанныеСостоянийСотрудников).

Модуль формы

// Работа с месяцем начисления "строкой".
&НаКлиенте
Процедура МесяцНачисленияСтрокойПриИзменении(Элемент)
    
    ЗарплатаКадрыКлиент.ВводМесяцаПриИзменении(ЭтаФорма, "Объект.ПериодРегистрации", "МесяцНачисленияСтрокой", Модифицированность);
    
    ПриИзмененииМесяцаНачисления();
    
КонецПроцедуры

&НаКлиенте
Процедура МесяцНачисленияСтрокойНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    Оповещение = Новый ОписаниеОповещения("МесяцНачисленияСтрокойНачалоВыбораЗавершение", ЭтотОбъект);
    ЗарплатаКадрыКлиент.ВводМесяцаНачалоВыбора(ЭтаФорма, ЭтаФорма, "Объект.ПериодРегистрации", "МесяцНачисленияСтрокой", , Оповещение);
    
КонецПроцедуры

&НаКлиенте
Процедура МесяцНачисленияСтрокойНачалоВыбораЗавершение(ЗначениеВыбрано, ДополнительныеПараметры) Экспорт
    
    ПриИзмененииМесяцаНачисления();
    
КонецПроцедуры

&НаКлиенте
Процедура МесяцНачисленияСтрокойРегулирование(Элемент, Направление, СтандартнаяОбработка)
    
    ЗарплатаКадрыКлиент.ВводМесяцаРегулирование(ЭтаФорма, "Объект.ПериодРегистрации", "МесяцНачисленияСтрокой", Направление, Модифицированность);
    
    ПодключитьОбработчикОжидания("ОбработчикОжиданияМесяцНачисленияПриИзменении", 0.3, Истина);
    
КонецПроцедуры

&НаКлиенте
Процедура МесяцНачисленияСтрокойАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
    ЗарплатаКадрыКлиент.ВводМесяцаАвтоПодборТекста(Текст, ДанныеВыбора, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура МесяцНачисленияСтрокойОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка)
    ЗарплатаКадрыКлиент.ВводМесяцаОкончаниеВводаТекста(Текст, ДанныеВыбора, СтандартнаяОбработка);
КонецПроцедуры


&НаКлиенте
Процедура ПриИзмененииМесяцаНачисления()
    
    
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если Не ЗначениеЗаполнено(Объект.Ссылка) ТОгда
        //это новый
        Объект.ПериодРегистрации = НачалоМесяца(ТекущаяДата());
    КонецЕсли;
    
    МесяцНачисленияСтрокой = ЗарплатаКадрыКлиентСервер.ПолучитьПредставлениеМесяца(Объект.ПериодРегистрации);
    
КонецПроцедуры

&НаКлиенте
Процедура Заполнить(Команда)
    ЗаполнитьНаСервере();
КонецПроцедуры


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


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

 

Форма документа