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