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

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

Готовиться к экзамену начал в апреле 2024-го и, к сожалению, не нашел в сети решений, которые бы полностью меня устроили.
Для публикации выбрал 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;
СтрокаЛ.КоэффициентВремени = СтрокаТ.Дней / ДнейМес;
СтрокаЛ.ЗаработанныйЛимит  = СтрокаЛ.КоэффициентВремени * СтрокаЛ.ПлановыйЛимит;
КонецЦикла;


КонецПроцедуры

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

 

4.2.2 Проведение документа «Расчет лимитов»

Пишем заработанный лимит по сотрудникам в РС ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников

Модуль объекта

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
//Все проверяет платформа
ДвиженияПоРег();
КонецПроцедуры

Процедура ДвиженияПоРег()
РегЗн = Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников;

для каждого СтрокаЛ из Лимиты Цикл
СтрокаД = РегЗн.Добавить();
СтрокаД.Активность = Истина;
СтрокаД.ПериодДействия = ПериодРегистрации;
СтрокаД.Сотрудник = СтрокаЛ.Сотрудник;
СтрокаД.Показатель = Справочники.ПоказателиРасчетаЗарплаты.ЗаработанныйЛимитМес;
СтрокаД.Организация = Организация;
СтрокаД.Значение  = СтрокаЛ.ЗаработанныйЛимит;
КонецЦикла;

РегЗн.Записать();

КонецПроцедуры

Создаем в предприятии три документа расчета лимитов.

   4.3 Начисление Зарплаты

В параметрах устанавливаем РежимОтладки.

 

И для просмотра внутренних таблиц создаем новый общий модуль с функцией

Функция ПросмотрВТ(Зап, ИмяВТ) Экспорт
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Зап.МенеджерВременныхТаблиц;
Запрос.Текст = "Выбрать * из " + ИмяВТ;
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции

Видео отладки.

Поиском по модулям находим функцию «ЗначенияПоказателейНачислений».

Находим в ней последний большой запрос. Нам нужно сделать вставку перед финальной выборкой.

//вставка начало
|
|
|////////////////////////////////////////////////////////////////////////////////
//создаем ВТ с нашим видом расчета по текущему месяцу
|ВЫБРАТЬ Различные
|             Интервалы.Сотрудник,
|             НачалоПериода(Интервалы.ДатаНачала,Месяц) как Период,
|             Интервалы.Организация,
|             Интервалы.Подразделение
|ПОМЕСТИТЬ ВТИнтервалы
| из ВТИнтервалыИДатыСрезов как Интервалы
| Где Интервалы.Начисление в (Выбрать Ссылка из ПланВидовРасчета.Начисления.Показатели Где показатель = Значение(Справочник.ПоказателиРасчетаЗарплаты.ЗаработанныйЛимитНарИт))
|;
|
|
//ВТ с новыми показателями
|Выбрать
| ВТИнтервалы.Период как ПериодДействия,
| Рег.Сотрудник,
| Рег.Организация,
//заработанный лимит нарастающим итогом = сумма показателя ЗаработанныйЛимитМес с начала года
| Значение(Справочник.ПоказателиРасчетаЗарплаты.ЗаработанныйЛимитНарИт) как Показатель,
| Сумма(Рег.Значение) как Значение
| Поместить ВТПоказНИ
|из РегистрСведений.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников как Рег
| Внутреннее Соединение ВТИнтервалы
| по ВТИнтервалы.Сотрудник = Рег.Сотрудник
| и ВТИнтервалы.Организация = Рег.Организация
| и  ВТИнтервалы.Период >= Рег.ПериодДействия
| и НачалоПериода(ВТИнтервалы.Период, Год) = НачалоПериода(Рег.ПериодДействия, Год)
| Где
|  Рег.Показатель = Значение(Справочник.ПоказателиРасчетаЗарплаты.ЗаработанныйЛимитМес)
|
|Сгруппировать по
|
| ВТИнтервалы.Период,
| Рег.Сотрудник,
| Рег.Организация
|
| Объединить Все
|
|Выбрать
| ВТИнтервалы.Период как ПериодДействия,
| Рег.Сотрудник,
| Рег.Организация,
//фактическая кварт плата нарастающим итогом = сумма  показателя ФактическаяКвПлатаМес с начала года
| Значение(Справочник.ПоказателиРасчетаЗарплаты.ФактическаяКвПлатаНарИт) как Показатель,
| Сумма(Рег.Значение) как Значение
|из РегистрСведений.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников как Рег
| Внутреннее Соединение ВТИнтервалы
| по ВТИнтервалы.Сотрудник = Рег.Сотрудник
| и ВТИнтервалы.Организация = Рег.Организация
| и  ВТИнтервалы.Период >= Рег.ПериодДействия
| и НачалоПериода(ВТИнтервалы.Период, Год) = НачалоПериода(Рег.ПериодДействия, Год)
| Где
|  Рег.Показатель = Значение(Справочник.ПоказателиРасчетаЗарплаты.ФактическаяКвПлатаМес)
|
|Сгруппировать по
|
| ВТИнтервалы.Период,
| Рег.Сотрудник,
| Рег.Организация
|
| Объединить Все
|
|Выбрать
| ВТИнтервалы.Период,
| Рег.Сотрудник,
| Рег.Организация,
//фактически возмещено = сумма по регистру расчета по новому виду расчета (обратите внимание, как определяется вид расчета)
| Значение(Справочник.ПоказателиРасчетаЗарплаты.ФактическиВозмещено) как Показатель,
| Сумма(Рег.Результат) как Значение
|из РегистрРасчета.Начисления как Рег
| Внутреннее Соединение ВТИнтервалы
| по ВТИнтервалы.Сотрудник = Рег.Сотрудник
| и ВТИнтервалы.Организация = Рег.Организация
| и  ВТИнтервалы.Период >= Рег.ПериодРегистрации
| и НачалоПериода(ВТИнтервалы.Период, Год) = НачалоПериода(Рег.ПериодРегистрации, Год)
| Где
|  Рег.ВидРасчета в (Выбрать Ссылка из ПланВидовРасчета.Начисления.Показатели Где показатель = Значение(Справочник.ПоказателиРасчетаЗарплаты.ЗаработанныйЛимитНарИт))
|
|Сгруппировать по
|
| ВТИнтервалы.Период,
| Рег.Сотрудник,
| Рег.Организация
|;
//вставка окончание

В финальную выборку подключаем нашу ВТПоказНИ          

//вставка начало
| Левое Соединение ВТПоказНИ
| по ВТПоказНИ.Сотрудник = Интервалы.Сотрудник
| и  ВТПоказНИ.Организация = Интервалы.Организация
| и  ВТПоказНИ.Показатель = Интервалы.Показатель
| и  ВТПоказНИ.ПериодДействия = НачалоПериода(Интервалы.ДатаНачала, Месяц)
//вставка окончание

Добавляем показатель в группировку           

|СГРУППИРОВАТЬ ПО
//вставка начало
|ВТПоказНИ.Значение,
|
//вставка окончание
|             Интервалы.Сотрудник,

и в выборку              

| КОНЕЦ КАК ВремяВЧасах,
| Начисления.ВидВремени,
| ВЫБОР
//вставка начало
|  КОГДА НЕ ВТПоказНИ.Значение ЕСТЬ NULL
|  Тогда ВТПоказНИ.Значение
//вставка окончание

|                            КОГДА НЕ ЗначенияПериодическихПоказателейСотрудников.Значение ЕСТЬ NULL

При заполнении документа начисления зарплаты просматриваем значения своих внутренних таблиц так

 

В документе кнопка «показать подробности расчета» вам в помощь.

 

В итоге создаем три документа, проверяем математику и приступаем к разработке отчета.

4.4 Отчет

Переносим в модуль отчета процедуры ПриКомпоновкеРезультата и ИнициализироватьОтчет из другого отчета, например из АнализВзносовВФонды. В «ПриКомпоновкеРезультата» оставляем только вызов инициализации

Модуль отчета

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

ИнициализироватьОтчет();

КонецПроцедуры

Процедура ИнициализироватьОтчет() Экспорт

ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ЭтотОбъект);

КонецПроцедуры

Текст запроса отчета

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

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

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

СГРУППИРОВАТЬ ПО
Рег.ПериодДействия,
Рег.Сотрудник,
Рег.Организация

ОБЪЕДИНИТЬ ВСЕ

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

СГРУППИРОВАТЬ ПО
Рег.ПериодДействия,
Рег.Сотрудник,
Рег.Организация

ОБЪЕДИНИТЬ ВСЕ

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

СГРУППИРОВАТЬ ПО
Рег.ПериодРегистрации,
Рег.Сотрудник,
Рег.Организация) КАК ит

СГРУППИРОВАТЬ ПО
ит.ПериодДействия,
ит.Сотрудник,
ит.Организация
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТНачисл.ПериодДействия,
ВТНачисл.Сотрудник,
ВТНачисл.Организация,
ЕСТЬNULL(СУММА(ВТНачисл2.ЗаработаноЛимитаЗаПериод - ВТНачисл2.ФактическиВозмещенныеРасходы), 0) КАК ОстатокЛимитаНаНачалоПериода,
ВТНачисл.ЗаработаноЛимитаЗаПериод,
ВТНачисл.ПодтвержденныеРасходы,
ВТНачисл.ФактическиВозмещенныеРасходы,
ЕСТЬNULL(СУММА(ВТНачисл2.ЗаработаноЛимитаЗаПериод - ВТНачисл2.ФактическиВозмещенныеРасходы), 0) + ВТНачисл.ЗаработаноЛимитаЗаПериод - ВТНачисл.ФактическиВозмещенныеРасходы КАК ОстатокЛимитаНаКонецПериода
ПОМЕСТИТЬ ВТИТ
ИЗ
ВТНачисл КАК ВТНачисл
ЛЕВОЕ СОЕДИНЕНИЕ ВТНачисл КАК ВТНачисл2
ПО ВТНачисл.Сотрудник = ВТНачисл2.Сотрудник
И ВТНачисл.Организация = ВТНачисл2.Организация
И ВТНачисл.ПериодДействия > ВТНачисл2.ПериодДействия

СГРУППИРОВАТЬ ПО
ВТНачисл.ПериодДействия,
ВТНачисл.Сотрудник,
ВТНачисл.Организация,
ВТНачисл.ЗаработаноЛимитаЗаПериод,
ВТНачисл.ПодтвержденныеРасходы,
ВТНачисл.ФактическиВозмещенныеРасходы
;

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

Обратите внимание, как определяется бегущее сальдо начальное и конечное.

При настройке не забываем указать в выражении ПериодДействия текст «ПредставлениеПериода(НачалоПериода(ПериодДействия, «Месяц»), КонецПериода(ПериодДействия, «Месяц»), «ФП=Истина»)» для отражения месяца.

В параметры добавляем свой с типом «СтандартныйПериод».

 

Настраиваем структуру.

 

И проверяем

 

          5. Дополнительно

Если вы создаете новые объекты конфигурации после первого запуска в режиме предприятия — то нужно обновить справочник идентификаторов.

Запустите код

Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника();
ВариантыОтчетов.Обновить();

 Научитесь отлаживать внешние обработки заполнения. Это нужно для первого билета: регистрация погодных условий пишется типовым документом «Данные для расчета зарплаты».

 Кратко: в DemoSSL из доп обработок сохраняем на диск элемент «Обработка заполнения». Оставляем в ней «вызов клиентского метода», создаем в конфигурации новую обработку, а во внешней создаем ее вызов. После отладки переносим код во внешнюю.

Подробнее:

//В обработку в выполнить команду
//добавляем текст

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


//пример

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

//В конфу вставляем нашу обработку без текста внутри блока отладка
&НаКлиенте
Процедура ВыполнитьКоманду(ИмяКоманды, ОбъектыНазначения) Экспорт
Если ИмяКоманды = "ЗагрузкаТекстФайла" Тогда
ЗагрузкаТекстФайла(ОбъектыНазначения[0]);
КонецЕсли;
КонецПроцедуры

 В билетах указаны документы которые нужно создать в конфигураторе, их достаточно, не нужно создавать новые.

 На экзамене нельзя пользоваться даже телефоном, поэтому запоминаем:

1) Имя функции ЗначенияПоказателейНачислений, для собственных показателей.

2) Имена представлений Представления_КадровыеДанныеСотрудников, Представления_ПлановоеВремя (плановое время в коде и в СКД обрабатывается по разному, посмотрите модуль типового отчета СостоянияСотрудников)

3) Для записи отклонений рабочего времени используйте УчетРабочегоВремени.ЗарегистрироватьРабочееВремяСотрудников и ЗарегистрироватьВнутрисменныеОтклонения (пример в РаботаВВыходныеИПраздничныеДни и в командировке соответственно). Это актуально для 5-го билета, где нужно при проведении персональных тренировок в рабочий день по графику регистрировать отклонение, а в выходной просто рабочее время.

4) При необходимости создавайте предопределенные элементы справочника «ВидыИспользованияРабочегоВремени«.

P.S. Нужно отработать все билеты так, чтобы успевать их сделать за 3.5 часа.
+ на экзамене нужно сделать файл с описанием решения (какие документы, что двигают, почему они, а не типовые и вообще как все работает).
также вам не дается готовая база для разработки, нужно развернуть новую и настроить ее
+ нужно регулярно сохраняться в «моих документах», ознакомление с задачей также занимает некоторое время. В общем все это займет не менее 20 минут.

9 Comments

  1. dgolovanov

    Я не понял, вы сдали экзамен?

    Reply
  2. maxdmt

    (1) dgolovanov, сдал на 4 по билету 6.

    Reply
  3. Craig

    (0) Не хватает условий билета, не понятно что решали. Хотя общее описание какая цель была у данного решения.

    и отладка ОбщийМодуль1.просмотрВт(запрос,»») как работает ?

    Reply
  4. maxdmt

    Добавил ссылку на страницу с билетами, видео с отладкой, пункт «5. Дополнительно».

    Reply
  5. mitia.mackarevich
    Reply
  6. maxdmt

    мда… в 3.1 уже так просто показатели не добавляются

    Reply
  7. Stref75

    Вот снова сталкиваюсь с Представлениями, но так и не могу понять что к чему. Суть механизма ясна, но вот как это все заставить работать?

    Собственные ковыряния в конфигурации продвигаются крайне медленно и не эффективно.

    Может найдутся добрые люди, кто подскажет где можно подробно почитать по этому механизму?

    гуглить не предлагать 🙂 — уже испробовано. Предлагает опять же Представления в запросах. ЗУП и Введение в механизм представлений в ЗУП ред. 3

    а это, я бы сказал, не для слабонервных.

    Reply
  8. user620235_m_ginger

    Всем доброго дня.

    У меня ЗУП 3.1.5.99.

    Документы «Расчет лимитов» и «Данные для расчета зарплаты» вносят данные в РС «ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников». Почему же в начислении зарплаты данные «Данных…» док видит, а мои из «Расчета лимитов» — нет? Это я что-то не так делаю, или программа в принципе не воспринимает данные в этого РС, веденные не «Данными…»? Как вы решили этот момент?

    Кстати, функции «ЗначенияПоказателейНачислений» тут нет.

    Спасибо.

    Reply
  9. user620235_m_ginger

    Вопрос снят ))) Запись в РС была не на начало месяца.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *