Базовый курс. Домашнее задание №13
Первое задание по 4-му блоку.
Для выполнения рекомендуется изучить следующие главы 4-го блока.
Глава 1. Основные понятия расчета.
Глава 2. Постановка задачи.
Глава 3. План видов расчета.
Глава 4. Проектирование планов видов расчета.
Глава 5. Кадровый учет.
Глава 6. Графики работы.
Глава 7. Документы.
Глава 8. Регистры расчета.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
задание выполнил. хорошо, что задание включает в себя не все, что показано в лекции
Задание сделал. Видимо ошибки выполенния вылезут в следущем )))
Задание выполнено. Затруднений не возникло.
Задание выполнено.
Созданы все требуемые объекты для расчета зарплаты.
Задание выполнено. Сложностей не возникло.
Порадовала обработка (лбюлю обработки) “Заполнение графиков”, которая заполняет регистр сведений “Графики работ”.
Сложностей не возникло.
Здравствуйте:-) ДЗ №13 выполнила.
Решение реализовано “по мотивам” уроков (а где грабли?..).
От себя добавила вот что: для последовательного заполнения графиков за 2009 и 2010 год после запроса типа графика следует запрос на год, который передается вторым параметром в процедуру ЗаполнитьГрафик.
Чтобы данные предыдущего года не затирались использую метод Прочитать().
Задание выполнено.
Все сделал как в видеоуроках.
Возник вопрос по отбору набора записей из регистра сведений Графики работы. В свойствах элементов отбора присутствуют понятия ЗначениеС и ЗначениеПо. В синтакс-помощнике написано, что они имеют смысл при ВидеСравнения равном Интервалу. Однако при попытке поменять вид сравнения в отборе с “Равно” на “Интервал” происходит ошибка. Интервал при отборе из регистра сведений использовать нельзя?
Смотри описание свойства “Отбор” набора записей регистра сведений.
Цитата из СП:
“Важно! Отбор может устанавливаться только на равенство.”
Для чего тогда нужны ЗначениеС и ЗначениеПО? Дело в том что отбор может настраиваться интерактивно, именно в этом режиме можно применять различные виды сравнений.
Видимо надо прерваться и пойти поспать… как я не заметила в задании создание обработки “Заполнение графика” – ума не приложу:-)
Сделала уже как в эталонном решении.
Задание выполнил.
Создал справочник “Типы графиков” с единственным реквизитом ВидГрафика – перечисление ВидыГрфиков со значениями Пятидневка, Шестидневка.
Создал РС “ГрафикиРаботы” с измерениями Год (тип Строка(4)), (т.к. графики нужно хранить в разрезе лет), ТипГрафика и Дата, и ресурсом РабочийДень (тип Число(1,0)).
Создал форму списка регистра и на панели две кнопки Заполнить и Очистить, которые вызывают процедуру <code>&НаСервереБезКонтекста
Процедура ЗаполнитьОчиститьГрафик(ТипГрафика, Очистить = Ложь)
Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
ТекущийГод = Формат(ТекущаяДата(), “ДФ=yyyy”);
Набор.Отбор.Год.Установить(ТекущийГод);
Набор.Отбор.ТипГрафика.Установить(ТипГрафика);
Если Очистить = Истина Тогда
Набор.Записать();
Возврат;
КонецЕсли;
НачалоГода = НачалоГода(ТекущаяДата());
КонецГода = КонецГода(ТекущаяДата());
ТекущаяДата = НачалоГода;
Пока ТекущаяДата <= КонецГода Цикл
Запись = Набор.Добавить();
Запись.Год = ТекущийГод;
Запись.ТипГрафика = ТипГрафика;
Запись.Дата = ТекущаяДата;
КоличествоРабочихДнейПоГрафику = ?(ТипГрафика.ВидГрафика = Перечисления.ВидыГрафиков.Шестидневка, 6, 5);
Если ДеньНедели(ТекущаяДата) <= КоличествоРабочихДнейПоГрафику Тогда
Запись.РабочийДень = 1;
КонецЕсли;
ТекущаяДата = ТекущаяДата + 24 * 3600;
КонецЦикла;
Набор.Записать();
КонецПроцедуры</code>
В остальном вопросов не возникло, все как в видеоуроках.
Задание выполнил.
Создал справочник “Типы графиков” с единственным реквизитом ВидГрафика – перечисление ВидыГрфиков со значениями Пятидневка, Шестидневка.Создал РС “ГрафикиРаботы” с измерениями Год (тип Строка(4)), (т.к. графики нужно хранить в разрезе лет), ТипГрафика и Дата, и ресурсом РабочийДень (тип Число(1,0)).Создал форму списка регистра и на панели две кнопки Заполнить и Очистить, которые вызывают процедуру <code>&НаСервереБезКонтекстаПроцедура ЗаполнитьОчиститьГрафик(ТипГрафика, Очистить = Ложь) Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей(); ТекущийГод = Формат(ТекущаяДата(), “ДФ=yyyy”); Набор.Отбор.Год.Установить(ТекущийГод); Набор.Отбор.ТипГрафика.Установить(ТипГрафика); Если Очистить = Истина Тогда Набор.Записать(); Возврат; КонецЕсли; НачалоГода = НачалоГода(ТекущаяДата()); КонецГода = КонецГода(ТекущаяДата()); ТекущаяДата = НачалоГода; Пока ТекущаяДата <= КонецГода Цикл Запись = Набор.Добавить(); Запись.Год = ТекущийГод; Запись.ТипГрафика = ТипГрафика; Запись.Дата = ТекущаяДата; КоличествоРабочихДнейПоГрафику = ?(ТипГрафика.ВидГрафика = Перечисления.ВидыГрафиков.Шестидневка, 6, 5); Если ДеньНедели(ТекущаяДата) <= КоличествоРабочихДнейПоГрафику Тогда Запись.РабочийДень = 1; КонецЕсли; ТекущаяДата = ТекущаяДата + 24 * 3600; КонецЦикла; Набор.Записать();
КонецПроцедуры</code>
В остальном вопросов не возникло, все как в видеоуроках.
Задание выполнил. Находясь под впечатлением от лекций, где был реализован кадровый учёт и начисление ЗП, был приятно удивлён тем, что задание было не очень большим.
Был создан непериодический регистр сведений “Графики работы”. Измерения:
* График (Тип: СправочникСсылка.ТипыГрафиков)
* Дата (Тип: Дата)
Ресурс: РабочийДень (Тип: Число 1, 0)
Была создана обработка “ЗаполнениеГрафика”.
Реквизиты формы:
* Год (Число 4,0)
* График (СправочникСсылка.ТипыГрафиков)
В группу “Выходные” были включены 7 реквизитов типа “Булево”: Понедельник, Вторник, Среда, Четверг, Пятница, Суббота, Воскресение.
Т.е. если день должен быть выходным, пользователь ставит галочку.
В клиентской части команды Заполнить() создавался МассивВыходных = Новый Массив(8);
МассивВыходных[1] = Понедельник; …
МассивВыходных[7] = Воскресение;
На сервер передавался Год, График и МассивВыходных. Регистр сведений заполнялся с помощью объекта РегистрСведенийМенеджерЗаписи.
<code>&НаСервереБезКонтекста
Процедура ЗаполнитьНаСервере(Год, График, МассивВыходных)
НачалоГода = Дата(Год, 1, 1);
КонецГода = КонецГода(НачалоГода);
ТекДата = НачалоГода;
НачатьТранзакцию();
Пока ТекДата <= КонецГода Цикл
Менеджер = РегистрыСведений.ГрафикиРаботы.СоздатьМенеджерЗаписи();
Менеджер.График = График;
Менеджер.Дата = ТекДата;
Менеджер.РабочийДень = НЕ МассивВыходных[ДеньНедели(ТекДата)];
Менеджер.Записать();
ТекДата = ТекДата + 24*3600;
КонецЦикла;
ЗафиксироватьТранзакцию();
КонецПроцедуры // ЗаполнитьНаСервере()
</code>
Был создан ПВР “ОсновныеНачисления”
Галочка “Использует период действия”
Зависимость от базы: * Зависит по периоду действия”
Базовые ПВР: ОсновныеНачисления, ДополнительныеНачисления
Предопределенные элементы:
ОКЛАД ПО ДНЯМ.Базовых нет. Вытесняющие: отпуск, прогул. Ведущие: Оклад по дням, отпуск, прогул, премия квартальная
ОТПУСК. Базовые: Оклад по дням, Премия квартальная. Вытесняющих нет. Ведущие: Оклад по дням, отпуск, прогул, премия квартальная
ПРОГУЛ. Базовых, вытесняющих, ведущих нет.
Был создан ПВР “ДополнительныеНачисления”.
Галочка “Использует период действия” НЕ стоит.
Зависимость от базы: * Зависит по периоду действия”
Базовые ПВР: ОсновныеНачисления, ДополнительныеНачисления
Предопределенные элементы:
ПРЕМИЯ КВАРТАЛЬНАЯ. Базовые: Оклад по дням, отпуск, премия квартальная. Ведущие: оклад по дням, отпуск, прогул, премия квартальная.
Для каждого ПВР был создан соответствующий РР.
РР “ОсновныеНачисления”
Измерения: Сотрудник, Подразделение
Ресурс: Результат
Реквизиты: График, ИсходнаяВеличина
Галочка “Период действия”
Связан с РС “ГрафикиРаботы”
Галочка “БазовыйПериод”
Периодичность: месяц
РР “ДополнительныеНачисления”
Измерения: Сотрудник, Подразделение
Ресурс: Результат
Реквизиты: ИсходнаяВеличина
Галочка “Период действия” НЕ стоит
Галочка “БазовыйПериод”
Периодичность: месяц
Был создан док “Начисление ЗП”.
Реквизит шапки: ПериодРегистрации (Тип: Дата)
Реквизиты ТЧ “ОсновныеНачисления”:
*Сотрудник
*Подразделение
*НачалоПериода
*КонецПериода
*ВидРасчета
*График
*Начислено
*ПлановыйРазмер
Реквизиты ТЧ “ДополнительныеНачисления”
*Сотрудник
*Подразделение
*ВидРасчета
*Начислено
*Показатель
Задание выполнил. Находясь под впечатлением от лекций, где был реализован кадровый учёт и начисление ЗП, был приятно удивлён тем, что задание было не очень большим.
Был создан непериодический регистр сведений “Графики работы”. Измерения:
* График (Тип: СправочникСсылка.ТипыГрафиков)* Дата (Тип: Дата)
Ресурс: РабочийДень (Тип: Число 1, 0)
Была создана обработка “ЗаполнениеГрафика”. Реквизиты формы: * Год (Число 4,0)* График (СправочникСсылка.ТипыГрафиков)
В группу “Выходные” были включены 7 реквизитов типа “Булево”: Понедельник, Вторник, Среда, Четверг, Пятница, Суббота, Воскресение.
Т.е. если день должен быть выходным, пользователь ставит галочку.
В клиентской части команды Заполнить() создавался МассивВыходных = Новый Массив(8);МассивВыходных[1] = Понедельник; …МассивВыходных[7] = Воскресение;
На сервер передавался Год, График и МассивВыходных. Регистр сведений заполнялся с помощью объекта РегистрСведенийМенеджерЗаписи.
<code>&НаСервереБезКонтекста
Процедура ЗаполнитьНаСервере(Год, График, МассивВыходных)
НачалоГода = Дата(Год, 1, 1);
КонецГода = КонецГода(НачалоГода);
ТекДата = НачалоГода;
НачатьТранзакцию();
Пока ТекДата <= КонецГода Цикл
Менеджер = РегистрыСведений.ГрафикиРаботы.СоздатьМенеджерЗаписи();
Менеджер.График = График;
Менеджер.Дата = ТекДата;
Менеджер.РабочийДень = НЕ МассивВыходных[ДеньНедели(ТекДата)];
Менеджер.Записать();
ТекДата = ТекДата + 24*3600;
КонецЦикла;
ЗафиксироватьТранзакцию();
КонецПроцедуры // ЗаполнитьНаСервере()
</code>
Был создан ПВР “ОсновныеНачисления”Галочка “Использует период действия”Зависимость от базы: * Зависит по периоду действия”Базовые ПВР: ОсновныеНачисления, ДополнительныеНачисленияПредопределенные элементы:ОКЛАД ПО ДНЯМ.Базовых нет. Вытесняющие: отпуск, прогул. Ведущие: Оклад по дням, отпуск, прогул, премия квартальнаяОТПУСК. Базовые: Оклад по дням, Премия квартальная. Вытесняющих нет. Ведущие: Оклад по дням, отпуск, прогул, премия квартальнаяПРОГУЛ. Базовых, вытесняющих, ведущих нет.
Был создан ПВР “ДополнительныеНачисления”.Галочка “Использует период действия” НЕ стоит.Зависимость от базы: * Зависит по периоду действия”Базовые ПВР: ОсновныеНачисления, ДополнительныеНачисленияПредопределенные элементы:ПРЕМИЯ КВАРТАЛЬНАЯ. Базовые: Оклад по дням, отпуск, премия квартальная. Ведущие: оклад по дням, отпуск, прогул, премия квартальная.
Для каждого ПВР был создан соответствующий РР.РР “ОсновныеНачисления”Измерения: Сотрудник, ПодразделениеРесурс: РезультатРеквизиты: График, ИсходнаяВеличинаГалочка “Период действия”Связан с РС “ГрафикиРаботы”Галочка “БазовыйПериод”Периодичность: месяц
РР “ДополнительныеНачисления”Измерения: Сотрудник, ПодразделениеРесурс: РезультатРеквизиты: ИсходнаяВеличинаГалочка “Период действия” НЕ стоитГалочка “БазовыйПериод”Периодичность: месяц
Был создан док “Начисление ЗП”.Реквизит шапки: ПериодРегистрации (Тип: Дата)Реквизиты ТЧ “ОсновныеНачисления”:*Сотрудник*Подразделение*НачалоПериода*КонецПериода*ВидРасчета*График*Начислено*ПлановыйРазмер
Реквизиты ТЧ “ДополнительныеНачисления”*Сотрудник*Подразделение*ВидРасчета*Начислено*Показатель
Задание выполнила.
Создала регистр сведений “Графики работы” с измерениями Дата, ВидГрафика(справочник ВидыГрафиков) и ресурсом Рабочий.
Регистр непериодический и независимый.
Создала обработку “Заполнение графиков” :
НаборЗаписей = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ВидГрафика.Установить(Объект.ВидГрафика);
НаборЗаписей.Прочитать();
Дата = НачалоДня(Объект.ДатаНач);
Пока Дата <= Объект.ДатаКон Цикл
Номер = 0;
Нашли = ложь;
Пока Номер <= НаборЗаписей.Количество()-1 Цикл
Если НаборЗаписей[Номер].Дата = Дата Тогда
Нашли = Истина;
Прервать;
КонецЕсли;
Номер = Номер + 1;
КонецЦикла;
Если Нашли Тогда
// найдем запись набора записей
Запись = НаборЗаписей[Номер];
Иначе
//добавлять
Запись = НаборЗаписей.Добавить();
Запись.Дата = Дата;
КонецЕсли;
Запись.Рабочий = ?(Объект.ВыходныеДни.НайтиСтроки(Новый Структура(“ДеньНедели”, ДеньНедели(Дата))).Количество()>0,0,1);
Запись.ВидГрафика = Объект.ВидГрафика;
Дата = Дата + 24*3600;
КонецЦикла;
НаборЗаписей.Записать();
НаборЗаписей = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ВидГрафика.Установить(Объект.ВидГрафика); НаборЗаписей.Прочитать();
Дата = НачалоДня(Объект.ДатаНач);
Пока Дата <= Объект.ДатаКон Цикл Номер = 0; Нашли = ложь; Пока Номер <= НаборЗаписей.Количество()-1 Цикл
Если НаборЗаписей[Номер].Дата = Дата Тогда Нашли = Истина; Прервать;
КонецЕсли;
Номер = Номер + 1;
КонецЦикла;
Если Нашли Тогда
// найдем запись набора записей
Запись = НаборЗаписей[Номер];
Иначе //добавлять
Запись = НаборЗаписей.Добавить(); Запись.Дата = Дата;
КонецЕсли;
Запись.Рабочий = ?(Объект.ВыходныеДни.НайтиСтроки(Новый Структура(“ДеньНедели”, ДеньНедели(Дата))).Количество()>0,0,1);
Запись.ВидГрафика = Объект.ВидГрафика;
Дата = Дата + 24*3600;
КонецЦикла;
НаборЗаписей.Записать();
Создала план видов расчета “Основные начисления“, использующий период действия и зависящий по периоду действия от ОсновныхНачислений.
Предопределенные эл-ты:
Оклад – его вытесняют Отпуск и Прогул, ведущие – Отпуск и Прогул.
Отпуск – для него базовый Оклад, ведущее Оклад.
Прогул – его вытесняет Отпуск, ведущее Отпуск.
“Дополнительные начисления” не используют период действия, зависит по периоду действия.
Премия – базовые Оклад, Отпуск, ведущие – Оклад, Отпуск и Прогул.
Создала регистры расчета “Основные начисления”с измерениями Сотрудник, Подразделение, ресурсом Результат, реквизитами ТипГрафика и Размер.
“Дополнительные начисления” – то же, но без ТипГрафика.
Создала документ “Начисление зарплаты”
Реквизит – ПериодРегистрации,
в табличной части Начисления: Сотрудник, Подразделение, ТипГрафика, ВидРасчета, Размер, ДатаНач, ДатаКон.
Домашнее задание №13 выполнено.
Для заполнения графика используется следующая процедура обработки:
&НаСервере
Процедура ЗаполнитьГрафикСервер()
ПоследнийРабочийДень = ?(НЕ Объект.Шестидневка, 5, 6);
Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
Набор.Отбор.ТипГрафика.Установить(Объект.ТипГрафика);
Набор.Прочитать();
НачГода = Дата(Объект.ГодЗаполнения+”0101″);
КонецГода = КонецГода(НачГода);
флЕстьЗаписиДанногоГода = Ложь;
Если Набор.Количество() <> 0 Тогда //еще нет записей по данному типу графика
Для каждого Запись Из Набор Цикл
Если Запись.Дата >= НачГода И Запись.Дата <= КонецГода Тогда
флЕстьЗаписиДанногоГода = Истина;
ТекДата = Запись.Дата;
Если Объект.ВыходныеДни.НайтиСтроки(Новый Структура(“ДатаВыходного”,ТекДата)).Количество() > 0 Тогда
Запись.Значение = 0;
Иначе
Запись.Значение = ?(ДеньНедели(ТекДата) <= ПоследнийРабочийДень, 1, 0);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если НЕ флЕстьЗаписиДанногоГода Тогда //нет записей по данному году, нужно их добавить
ТекДата = НачГода;
Пока ТекДата <= КонецГода Цикл
Запись = Набор.Добавить();
Запись.ТипГрафика = Объект.ТипГрафика;
Запись.Дата = ТекДата;
Если Объект.ВыходныеДни.НайтиСтроки(Новый Структура(“ДатаВыходного”,ТекДата)).Количество() > 0 Тогда
Запись.Значение = 0;
Иначе
Запись.Значение = ?(ДеньНедели(ТекДата) <= ПоследнийРабочийДень, 1, 0);
КонецЕсли;
ТекДата = ТекДата + 24*3600;
КонецЦикла;
КонецЕсли;
Набор.Записать();
КонецПроцедуры // ЗаполнитьГрафикСервер()
В остальной части выполнения задания следовал материалу 4-го блока.
Задание выполнил. В обработке по добавлению записей в Регистр Сведений. В начале запросом получал все записи из регистра по Типу графика. Выгружал их в таблицу. Чтобы получить первыю и последнею дату сортировал таблицу по Дате возрастанию и убыванию. А дальше Цикл условиями когда новую запись надо добавить а когда заменить. Остальную часть выполнил как в уроках с подсказками из решения ДЗ.
Задание выполнил
Задание выполнил.Создал аналогично видео регистр сведений ГрафикиРаботы с измерениями графикРаботы (справочник ГрафикиРаботы) и Дата (тип дата), и ресурсом значаение (число длиной 1). Для заполнения данного регистра создал на форме 7 флагов на основании которых формируется массив выходных дней. Код обработки получился следующий <code>
&НаКлиенте
Процедура ЗаполнитьГрафик(Команда)
МассивВыходных = Новый Массив;
если НЕ Реквизит1 Тогда
МассивВыходных.Добавить(1);
КонецЕсли;
если НЕ Реквизит2 Тогда
МассивВыходных.Добавить(2);
КонецЕсли;
если НЕ Реквизит3 Тогда
МассивВыходных.Добавить(3);
КонецЕсли;
если НЕ Реквизит4 Тогда
МассивВыходных.Добавить(4);
КонецЕсли;
если НЕ Реквизит5 Тогда
МассивВыходных.Добавить(5);
КонецЕсли;
если НЕ Реквизит6 Тогда
МассивВыходных.Добавить(6);
КонецЕсли;
если НЕ Реквизит7 Тогда
МассивВыходных.Добавить(7);
КонецЕсли;
ЗаполнитьГрафикСервер(ДатаНачала,ДатаОкончания,ГрафиРаботы,МассивВыходных);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьГрафикСервер(ДатаНачала,ДатаОкончания,ГрафиРаботы,МассивВыходных)
Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
Набор.Отбор.ГрафикРаботы.Значение = ГрафиРаботы;
Набор.Отбор.ГрафикРаботы.Использование = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ГрафикиРаботы.ГрафикРаботы,
| ГрафикиРаботы.Дата,
| ГрафикиРаботы.Значение
|ИЗ
| РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
|ГДЕ
| ГрафикиРаботы.ГрафикРаботы = &ГрафикРаботы
| И (ГрафикиРаботы.Дата < &ДатаНачала
| ИЛИ ГрафикиРаботы.Дата > &ДатаОкончания)”;
Запрос.УстановитьПараметр(“ГрафикРаботы”, ГрафиРаботы);
Запрос.УстановитьПараметр(“ДатаНачала”, ДатаНачала);
Запрос.УстановитьПараметр(“ДатаОкончания”, ДатаОкончания);
Результат = Запрос.Выполнить();
если НЕ Результат.Пустой() Тогда
Таблица = Результат.Выгрузить();
Набор.Загрузить(Таблица);
КонецЕсли;
текДата=ДатаНачала;
пока текДата<=ДатаОкончания Цикл
текДеньНедели = ДеньНедели(текДата);
НоваяЗапись = Набор.Добавить();
НоваяЗапись.ГрафикРаботы = ГрафиРаботы;
НоваяЗапись.Дата = текДата;
если МассивВыходных.Найти(текДеньНедели)=Неопределено Тогда
НоваяЗапись.Значение = 1;
иначе
НоваяЗапись.Значение = 0;
КонецЕсли;
текДата = текДата + 24*60*60;
КонецЦикла;
Набор.Записать(Истина);
КонецПроцедуры // ЗаполнитьГрафикСервер()
</code> Проверил вроде работает, данные не перетерает, если надо перезаписывает. Создал в соответствии с заданием предопределенные виды расчета ОсновныеНачисления и ДополнительныеНачисления. И тут просьба проверить правильно ли сделал: ОкладПоДням (Базовых нет; Вытесняющие Отпуск,Прогул; Ведущие Отпуск,Прогул), Прогул (Базовые нет; Вытесняющие Отпуск;Ведущие Отпуск),Отпуск (Базовые ОкладПоДням;Вытесняющие Нет; Ведущие ОкладПоДням). Тут встал вопрос у меня у Отпуска ведущий расчет ОкладПоДням а у ОкладаПоДням – Отпуск. Чего то я не пойму как правильно. С одной стороны при изменении отпуска допустим по датам я должен пересчитать оклад. Все правильно. Это в свою очень приводит к необходимости пересчета отпуска. Как я думаю это должно привести опять к пересчету оклада и т.д. Т.е получается какое то зацикливание. Может правильнее у Отпуск убрать Ведущее – оклад по дням? Заранее спасибо за ответ
Ведущие виды расчета у вас настроены правильно.
Но зацикливания здесь не будет, поскольку:
– изменение отпуска в текущем периоде может повлиять на оклад текущего периода (вытеснить его);
– изменение оклада текущего периода влияет на отпуск будущих (не текущего!) периода.
Задание сделал. Обработку “ЗаполнениеГрафика” после просмотра решения ДЗ пришлось переделать – как то не подумал что график может несколько раз заполняться.
Догоняю всех! Праздники немного выбыли из колеи :) Сразу, говорю ,что решения еще не смотрела, так что все честно! :)
Итак :
1. Создала РегистрСведений “ГрафикРаботы” (непереодический и независимый):
– Измерения – ТипГрафика (Справочник.ТипГрафика), Дата
– Ресурс – Значение(Число)
В справочнике “ТипГрафика” добавила еще один реквизит “РабочиеДни”, куда прописываю кол-во рабочих дней в неделе (5 – для пятидневки и 6 – для шестидневки)
2. В форму РегистраСведений “ГрафикРаботы” добавила два реквизита “ДатаНач” и “ДатаКон” (начало и конец периода, по которому будет заполняться регистр), добавила кнопку “Заполнить” , где обращаюсь к процедуре ЗаполнитьСервер(ТипГрафика,ДатаНач,ДатаКон,Очистить)
текст процедуры привожу ниже :
<code>
Набор = РегистрыСведений.ГрафикРаботы.СоздатьНаборЗаписей();
Набор.Отбор.типГрафика.Установить(ТипГрафика);
Если Очистить Тогда
Набор.Записать();
Возврат;
Иначе
Набор.Прочитать();
КонецЕсли;
ТекДата = ДатаНач;
Пока ТекДата<= ДатаКон Цикл
Запись = Набор.Добавить();
Если ДеньНедели(ТекДата)<=ТипГрафика.РабочиеДни Тогда
Запись.Значение = 1;
КонецЕсли;
Запись.ТипГрафика = ТипГрафика;
Запись.Дата = ТекДата;
ТекДата = ТекДата+24*3600;
КонецЦикла;
Набор.Записать();
</code>
3. Создала ПланВидовРасчета “ОсновныеНачисления”, с признаком “Использует период действия” + “Записит от периода действия”;
Создала ПланВидовРасчета “ДополнительныеНачисления”, только с признаком “Записит от периода действия”.
4. Создала предопределенные виды расчета:
-в ПВР “ОсновныеНачисления”” – Оклад, Отпуск, Прогул
-в ПВР “ДополнительныеНачисления” – Премия
Настроила их свойства, согласно задания.
5. Создала РегистрыРасчета “ОсновныеНачисления”, с признаком “ПериодДействия” :
– Измерения – Сотрудник, Подразделение
-Ресурс – Результат
– Реквизит – ТипГрафика, Размер
Создала РегистрРасчета “ДополнительныеНачисления”, с признаком “БазовыйПериод” :
– Измерения – Сотрудник, Подразделение
-Ресурс – Результат
– Реквизит – Размер
6. Создала документ “НачислениЗП”, со всеми необходимыми реквизитами.
Задание выполнил, были трудности с обработкой “ЗаполнениеГрафика” .
Все пункты делал опираясь на уроки. Решение преподавателя еще не смотрел, чем сейчас и займусь.
Задание выполнил.
Создал справочник «Типы графиков» с предопределнными элементами «Пятидневка» и «Шестидневка». Создал регистр сведений «ГрафикиРаботы» с измерениями ТипГрафика (тип СправочникСсылка.ТипыГрафиков), Дата (тип Дата) и ресурсом Значение (тип Число 1,0).
В обработке «Заполнение графиков» созданы реквизиты ДатаНачала, ДатаОкончания, ТипГрафика. В форме обработки добавил команду и кнопку Заполнить. Модуль формы обработки:
<code>
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
ТипГрафика = Объект.ТипГрафика;
Если (ТипГрафика = Справочники.ТипыГрафиков.Пятидневка) Тогда
КоличествоРабочихДнейВНеделе = 5;
ИначеЕсли (ТипГрафика = Справочники.ТипыГрафиков.Шестидневка) Тогда
КоличествоРабочихДнейВНеделе = 6;
КонецЕсли;
ТекущаяДата = Объект.ДатаНачала;
Пока ТекущаяДата <= Объект.ДатаОкончания Цикл
Запись = РегистрыСведений.ГрафикиРаботы.СоздатьМенеджерЗаписи();
Запись.Дата = ТекущаяДата;
Запись.ТипГрафика = ТипГрафика;
Если (ДеньНедели(ТекущаяДата) <= КоличествоРабочихДнейВНеделе) Тогда
Запись.Значение = 1;
КонецЕсли;
ТекущаяДата = ТекущаяДата + 24 * 3600;
Запись.Записать();
КонецЦикла;
КонецПроцедуры // ЗаполнитьНаСервере()
</code>
В плане видов расчетов «Основные начисления» создал предопределенные виды расчета:
– Оклад: базовые – нет; вытесняющие – Отпуск, Прогул; ведущие – Отпуск, Прогул
– Отпуск: базовые – Оклад, ПремияКвартальная; вытесняющие – нет; ведущие – Оклад, ПремияКвартальная
– Прогул: базовые – нет; вытесняющие – нет; ведущие – нет
– ПремияКвартальная: базовые – Оклад; ведущие – Оклад, Отпуск, Прогул.
Созданы регистры расчета «Основные начисления», «Дополнительные начисления» и документ «Начисление зарплаты».
Задание выполнила, основные моменты:
– обработка “Заполнение графика”. Для выходных дней добавила на форму список значений с пометками, который заполнила днями недели, чтобы пользователь галочками отметил выходные дни. Заполнение регистра почти как в уроках, чтобы не затирались данные предыдущего года после установки отбора по графику делаю запрос, который выгружаю в таблицу значений и загружаю потом в набор
Запрос = Новый Запрос;
Запрос.Текст = ” ВЫБРАТЬ
| ГрафикРаботы.ТипГрафика,
| ГрафикРаботы.Дата,
| ГрафикРаботы.Значение
|ИЗ
| РегистрСведений.ГрафикРаботы КАК ГрафикРаботы
|ГДЕ
| ГрафикРаботы.ТипГрафика = &ТипГрафика
| И (ГрафикРаботы.Дата < &ДатаНачала ИЛИ ГрафикРаботы.Дата > &ДатаОкончания)”;
Запрос.УстановитьПараметр(“ТипГрафика”, ТипГрафика);
Запрос.УстановитьПараметр(“ДатаНачала”, ДатаНачала);
Запрос.УстановитьПараметр(“ДатаОкончания”, ДатаОкончания);
ТаблЗначений = Новый ТаблицаЗначений;
ТаблЗначений = Запрос.Выполнить().Выгрузить();
Набор.Загрузить(ТаблЗначений);
Значение заполняю по условию
Если ДниНедели[ДеньНедели(ТекДата)-1].Пометка <> 1 Тогда
Запись.Значение = 1;
КонецЕсли;
Если ДниНедели[ДеньНедели(ТекДата)-1].Пометка <> 1 Тогда Запись.Значение = 1; КонецЕсли;
– план видов расчета “Основные начисления” : ОкладПоДням(выт:отпуск,прогул; вед:отпуск, прогул), Отпуск(база:оклад, премия), Прогул; ПВР “Дополнительные начисления”: Премия(база:оклад, отпукс; вед:оклад,отпуск,прогул).
– создала РегистрыСведений – РаботникиОрганизации, ПлановыеНачисления; регистры расчета – ОсновныеНачисления, ДополнительныеНачисления; документ – “Начисление заработной платы”.
Скажите, а регистры сведений “Работники организаций”, “Плановые начисления”, “Плановые удержания” создавать нужно?
Нет, не нужно.
Ура :)
Тогда задание выполнил.
Завел новое перечисление, где храню дни недали, чтобы пользовательнль мог выбрать их в табличной части обработки по заполнению графика. Добавил реквизит год в график, для упрощения процесса очистки записей за нужный год.
Планы видов расчета и регистры расчета создал, опираясь на уроки.
Задание выполнил.
Для праздничных дней создал регистр сведений.
Обработка загрузки имеет следующий код:
Набор=РегистрыСведений.ГрафикРаботы.СоздатьНаборЗаписей();
Набор.Прочитать();
//Читаем празники
Нач=НачалоГода(Дата(Год,1,1));
Кон=КонецГода(Нач);
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ПраздничныеДни.Значение КАК Праздник
|ИЗ
| РегистрСведений.ПраздничныеДни КАК ПраздничныеДни
|ГДЕ
| ПраздничныеДни.Значение <= &Кон
| И ПраздничныеДни.Значение >= &Нач”;
Запрос.УстановитьПараметр(“Нач”, Нач);
Запрос.УстановитьПараметр(“Кон”, Кон);
Результат = Запрос.Выполнить();
Таб=Результат.Выгрузить();
ГР5 = Справочники.ТипыГрафиков.НайтиПоНаименованию(“Пятидневка”);
ГР6 = Справочники.ТипыГрафиков.НайтиПоНаименованию(“Шестидневка”);
Датт=Нач;
//Стандарт
Пока Датт<=Кон Цикл
Запись = Набор.Добавить();
Запись.Дата = Датт;
Запись.ТипГрафика = ТипГрафика;
Запись.Значение=0;
Если ((ТипГрафика.Код=ГР5 И ДеньНедели(Датт)<=5) Или ((ТипГрафика=ГР6 И ДеньНедели(Датт)<=6))) Тогда
Если Таб.Найти(Датт) = Неопределено Тогда
Запись.Значение=1;
КонецЕсли;
КонецЕсли;
Датт=Датт+24*3600;
КонецЦикла;
Набор.Записать();
остальное как видеокурсе.
По обработке есть вопрос: для того что-бы перезаполнять графики есть способ кроме как выгрузить в таблицу, обработать, очистить регистр и загрузить из таблицы?
И ещё вопросы:
1.А есть где-то сводная таблица горячих клавиш (ну например: Ctrl+P, Shift+Ctrl+Z и др.)?
2.Образцы решения ДЗ больше не будут публиковаться?
> есть способ кроме как выгрузить в таблицу, обработать, очистить регистр и загрузить из таблицы
Есть несколько способов решения это задачи.
1. С таблицей значений, ваш способ.
2. Обход записей с отбором по типу графика. Все значения, которые не попадают в требуемый интервал дат мы оставляем. А те что внутри интервала заменяем.
3. Все одним запросом. Такой пример мы рассматриваем в продвинутом.
>1.А есть где-то сводная таблица горячих клавиш
Да, конечно. В конфигураторе. Справка – содержание справки – сочетания клавиш (могу в пути немного ошибаться, сейчас нет под рукой ключа).
>2.Образцы решения ДЗ больше не будут публиковаться?
Будут. Как раз на новогодних каникулах.
В свете второго варианта, запросы в 1С8 никак нельзя приспособить для выполнения update и delete?
DML-запросы не поддерживаются платформой. Более того, использование сторонних средств для update/delete считается нарушением лицензионного соглашения.
Спасибо за информацию… ну нельзя – значит нельзя, ничего страшного – есть другие варианты манипуляции данными!
Задание сделал.
Из особенностей выполнения отмечу реализацию процедуры заполнения графика.
Для этого на форму обработки вынес реквизиты ТипГрафика (СправочникСсылка), ДатаНачалаЗаполнения,ДатаОкончанияЗаполнения,
динамический список (РС.ГрафикиРаботы) и семь чекбоксов по дням недели.
По команде ЗаполнитьГрафик выполняется метод Набор.Отбор.ТипГрафика.Установить(ТипГрафика).
Далее делается запрос из РС по условию
ГДЕ ГрафикиРаботы.ТипГрафика = &ТипГрафика И (ГрафикиРаботы.Дата < &ДатаНачала ИЛИ ГрафикиРаботы.Дата > &ДатаОкончания).
Результат запроса выгружается в таблицу и, если она не пустая, то Набор.Загрузить(Таблица), иначе Набор.Очистить().
Из отмеченных чекбоксов формируется массив ВыходныеДни. Далее в цикле по дате добавляются записи в набор:
Запись.Значение = ?(ВыходныеДни.Найти(ДеньНедели(ТекДата))=Неопределено,1,0).
Создал справочник ТипыГрафиков с двумя предопределенными элементами Пятидневка и Шестидневка, а также не периодический, независимый регистр сведений «Графики работы» с измерениями ТипГрафика, Дата и ресурсом «Значение».
Создал обработку «Заполнения графика» помимо реквизитов «Дата начала», «Дата окончания» и «Тип графика» добавил два реквизита булевского типа для выходных дней («Выходной суббота» и «Выходной воскресенье»). При заполнении графика, необходимо устанавливать отбор не только по типу графика, но и по второму измерению «Дата», причем второй отбор необходимо проверять на вхождение в диапазон дат, от даты начала до даты окончания. Для этого вначале использовал вид сравнения «ИнтервалВключаяГраницы», но получил ошибку «Не допустимый тип сравнения», далее попробовал добавить отбор по дате на меньше или равно – то же самое. Залез в справку по отбору регистра сведений и прочитал с пометкой «Важно», что отбор по измерению регистра сведений возможен только на равенство. Пришлось добавлять установку отбора по дате в цикл, при этом после установке отбора пришлось выполнять команду Набор.Очистить(), иначе после записи первого значения для последующих получал сообщение об ошибке «Значение поля не соответствует установленному отбору» со ссылкой на поле дата. Это не понятно поскольку и отбор и Запись.Дата имели одно и то же значение при записи набора, но запись проходила только при первом проходе цикла.
Создал ПВР «Основные начисления» установил флаг «Использует период действия», зависимость от базы «Зависит по периоду действия». Базовые ПВР «Основные начисления». В него добавил вид расчета «Оклад по дням», «Отпуск» и «Прогул». Для ВР «Оклад по дням» вытесняющие ВР «Отпуск» и «Прогул», ведущие – «Отпуск» и «Прогул». Для ВР «Отпуск» вытесняющие и ведущих ВР нет. Для ВР «Прогул», ведущий и вытесняющий ВР «Отпуск». Если вдруг по ошибке прогул ввели во время отпуска.
Создал ПВР «Дополнительные начисления» флаг «Использует период действия» не устанавливал, зависимость от базы «Зависит по периоду действия». Базовые ПВР «Основные начисления». Добавил ВР «Премия квартальная» базовый ВР «Оклад по дням», ведущие все основные ВР (поскольку все могут вытеснять «Оклад по дням»).
Создал документ «Начисление заработной платы», здесь все просто. Единственно, что стоит отметить тип значения реквизита табл. части указал не конкретный ПВР, а общий «ПланВидовРасчетаСсылка».
Создал регистр расчета «Основные начисления», указал одноименный ПВР, установил флаг «Период действия» связал с РС ГрафикиРаботы, установил флаг «Базовый период», добавил два измерения «Сотрудник» и «Подразделение», ресурс «Результат» и реквизиты «Размер» и «Тип графика» (связан с графиком). И второй РР «Дополнительные начисления» с аналогичной структурой, только без периода действия и реквизита «Тип графика», но с поддержкой базового периода.
>Это не понятно поскольку и отбор и Запись.Дата имели одно и то же значение при записи набора
Скорее всего набор создается до цикла. И получается, что на втором проходе цикла в коллекции действительно 2 значения. Поэтому нужно делать очистку, либо создавать набор в цикле.
Задание выполнено.
Создал справочник ТипыГрафиков.
Создал независимый непериодический регистр сведений ГрафикиРаботы. Измерения: График (ссылка на справочник ТипыГрафиков), Дата. Ресурс: Значение (число).
Создал обработку “Заполнение графика”. На форму поместил реквизиты для указания типа графика и периода заполнения. Создал две команды: Очистить и Заполнить. Первая команда очищает РС для указанного типа графика (сделал для экспериметнов). Вторая заполняет дни работы по данному типу графика за указанный период. Для выбора выходных дней создал список значений ВыходныеДни. Для каждого элемента списка задал значение, соответствующее дню недели и представление в виде названия дня (“понедельник”,”вторник” и т.д.). При нажатии на кнопку Заполнить, используя ОтметитьЭлементы() можно указать дни, которые будут выходными. Далее создается набор записей РС, устанавливается отбор по типу графика, выполняется Набор.Прочитать(). Затем цикл, пока проверяемая дата <= даты окончания интервала, который задается в форме. В цикле в набор добавляются записи, используя функцию ДеньНедели() выполняется проверка, является ли день выходным. В зависимости от этого заполняется Значение. После выполнения цикла набор записывается.
Создал план видов расчета ОсновныеНачисления. На закладке Расчет отметил “Использует период действия”, зависимость от базы установил в “Зависит по периоду действия”, в базовые планы видов расчета включил основные и дополнительные начисления (т.к. вид расчета Отпуск использует в расчете все начисления). В данном плане видов расчета создал виды расчетов “Оклад по дням”, “Отпуск” и “Прогул”. Настроил их
свойства (базовые виды расчетов, вытеснение и т.д.)
Создал план видов расчета ДополнительныеНачисления. На закладке Расчет установил зависимость от базы в “Зависит по периоду действия”, в базовые планы видов расчета включил основные и дополнительные начисления (т.к. вид расчета “Премия квартальная” рассчитывается как процент от всех начислений за
прошлый квартал). В данном плане видов расчета создал вид расчета “Премия квартальная”. Настроил свойства вида расчета (базовые виды расчетов, вытеснение и т.д.)
Создал регистр расчета “Основные начисления”. На закладке “Основные” указал план видов расчета –
ОсновныеНачисления, отметил флажок “Период действия”, заполнил поле График выбрав регистр сведений ГрафикиРаботы. Значение графика – ресурс Значение. Дата графика – измерение Дата. Отметил флажок “Базовый период”, периодичность установил равной месяцу. Измерения РР: Сотрудник, Подразделение. Ресурс: Результат. Реквизиты: Размер (для плановых данных) и ТипГрафика (для связи с графиком работы).
Аналогично создал РР Дополнительные начисление, только не указывал период действия и связь с графиком. Измерения РР: Сотрудник, Подразделение. Ресурс: Результат. Реквизит: Размер.
Создал документ “Расчет заработной платы”, установил его регистратором для регистров расчета. Единственная особенность – реквизит ПериодРегистрации программным путем всегда устанавливается равным началу месяца для указанного периода.
Посмотрел ДЗ №14, судя по всему проведение по РР нужно будет делать там, а в ДЗ №13 просто создать документ начисления зп. Верно?
Верно.
Поскольку в задании требуется создать регистр расчета, думаю в список глав целесообразно включить и главу 8.
Готово.