Процедура СписокСотрудникПриИзменении(Элемент,Список) Запрос = Новый Запрос(" Выбрать Сотрудник.Наименование, Подразделение, Должность
Решение задачи
Из РегистрСведений.Сотрудники.СрезПоследних(парамДата, Сотрудник = парамСотрудник)
Где Состояние = парамСостояние
I");
Запрос.УстановитьПараметрС'парамДата", Дата); Запрос.УстановитьПараметрС'парамСотрудник", Элемент.Значение);
Запрос.УстановитьПараметр("парамСостояние", Перечисления.СостоянияФизлица.Работает);
МестаРаботы = Запрос.Выполнить().Выгрузить(); Если МестаРаботы.Количество()=0 Тогда
Предупреждение(""+Элемент.3начение+" не работает в организации "+Константы.НазваниеОрганизации);
ИначеЕсли МестаРаботы.Количество()=1 Тогда
Подразд = МестаРаботы[0] .Подразделение;
Список. ТекущиеДанные.Подразделение = Подразд;
Список.ТекущиеДанные.Должность = МестаРаботы[0] .Должность; Иначе
ВыбраннаяСтрока = МестаРаботы.ВыбратьСтрокуС'Выберите место работы");
Если ВыбраннаяСтрока о НЕОПРЕДЕЛЕНО Тогда Подразд = ВыбраннаяСтрока.Подразделение;
Список.ТекущиеДанные.Подразделение =
ВыбраннаяСтрока.Подразделение;
Список.ТекущиеДанные.Должность =
ВыбраннаяСтрока.Должность;
КонецЕсли; КонецЕсли;
КонецПроцедуры
Комментарии.
Процедура такая же, какую мы рассматривали в документе «НачислениеЗарплатыВсей».
Назначим обработчик события При изменении поля ввода ВидРасчета в табличном поле Начисления.
Процедура НачисленияВидРасчетаПриИзменении(Элемент)
Если Элемент.Значение=ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда Запрос = Новый Запрос(" Выбрать Сотрудник, Подразделение, Должность, Оклад, Регистратор
Из РегистрСведений.Сотрудники.СрезПоследних(парамДата,
(Сотрудник = парамСотрудвик) и (Подразделение = парамПодразделение) и (Должность = парамДолжность))
I");
Запрос.УстановитьПараметр("парамДата", Дата);
111
Запрос.УстановитьПараметрС'парамСотрудник", ЭлементыФормы.Начиспения.ТекущиеДанные.Сотрудник);
Запрос.УстановитьПараметр("парамПодразделение", ЭлементыФормы.Начисления.ТекущиеДанные.Подразделение);
Запрос.УстановитьПараметр("парамДолжность", ЭлементыФормы.Начисления.ТекущиеДанные.Должность);
ТЗОклад = Запрос.Выполнить().Выгрузить(); Если ТЗОклад.Количество()0 Тогда ОкладВСписок= ТЗОклад[0].Оклад;
Если ТипЗнч(ОкладВСписок)=Тип("Число") Тогда
ЭлементыФормы.Начисления.ТекущиеДанные.Размер =
ОкладВСписок;
ИначеЕсли ТипЗнч(ОкладВСписок)=Тип("СправочникСсылка.ЕТС") Тогда
ЭлементыФормы.Начисления.ТекущиеДанные.Размер = Число(ОкладВСписок.Наименование);
КонецЕсли;
КонецЕсли; КонецЕсли; КонецПроцедуры
Комментарии. Процедура такая же, какую мы рассматривали в документе «НачислениеЗарплатыВсей».
о ОсновныеНачисления, о Удержания
Одновременное создание записей в нескольких регистрах расчета
В ОбработкеПроведения документа реализуем одновременную запись в несколько регистров расчета.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
//начисления
Для Каждого Строка Из Начисления Цикл
Движение = Движения. ОсновныеНачисления.Добавить();
Движение.ПериодРегистрации = ПериодРегистрации;
Движение.ПериодДействияНачало = Строка.ДатаНачала;
Движение.ПериодДействияОкончание = Строка.ДатаОкончания;
Движение.Сотрудник = Строка.Сотрудник;
Двнжение.Подразделение = Строка.Подразделение;
Движение. Должность = Строка. Должность;
Движение.График = Строка.График;
112
Решение задачи
Движение.ВидРасчета = Строка.ВидРасчета; Движение.ПараметрРасчета = Строка.Размер;
Если Строка.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда
Движение.БазовыйПериодНачало =
ДобавитьМесяц(Движение.ПериодДействия, -3);
Движение.БазовыйПериодОкончание =
Движение.ПериодДействия-1;
КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.ЗаписатьО;
РегистрМенеджер=РегистрыРасчета.ОсновныеНачисления;
Отбор= Новый Структура("Регистратор",Ссылка);
Ресурсы = Новый Массив( 1);
Ресурсы[0] = "ОсновныеНачисления.Резудьтат,Премии.Результат";
Измерения= Новый Структура();
Измерения.Вставить("Подразделение","ОсновныеНачисления.Подразделение,Прем
ии.Подразделение");
Измерения.Вставить("Должность","ОсновныеНачисления.Должность,Премии.Долж ность");
Измерения.Вставить("Сотрудник","ОсновныеНачисления.Сотрудник,Премии.Сотру
дник");
ДанныеБазы = РегистрМенеджер.ПолучитьБазу(Отбор,Ресурсы,Измерения);
Отработано =
РегистрМенеджер.ПолучитьДанныеГрафика(Отбор,ВидПериодаРегистраРасчета.Фактическ
ийПериодДействия);
Норма =
РегистрМенеджер.ПолучитьДанныеГрафика(Отбор,ВидПериодаРегистраРасчета.ПериодРег
истрации);
ОтработаноПоБазе =
РегистрМенеджер.ПолучитьДанныеГрафика(Отбор,ВидПериодаРегистраРасчета.БазовыйП
ериод);
Для Каждого Движение Из Движения.ОсновныеНачисления Цикл
Движение.Результат = РассчитатьНачисленияУдержания(Движение, Движения.ОсновныеНачисления.Индекс(Движение), ДанныеБазы, Отработано, Норма, ОтработаноПоБазе);
КонецЦикла;
//удержания
Для Каждого Строка Из Удержания Цикл
Движение = Движения.Удержания.Добавить();
Движение.ПериодРегистрации = ПериодРегистрации;
Движение.Сотрудник = Строка. Сотрудник;
Движение.Подразделение = Строка.Подразделение;
Движение.Должность = Строка. Должность;
Движение.ВидРасчета = Строка.ВидРасчета;
Движение.ПараметрРасчета = Строка.Размер; КонецЦикла;
Движения.Удержания.Записать(); Для Каждого Движение Из Движения.Удержания Цикл
Движение.Результат = РассчитатьНачисленияУдержания(Движение, Движения.Удержания.Индекс(Движение), ,,,)'
КонецЦикла; КонецПроцедуры
Комментарии.
Процедура похожа на соответствующую процедуру в документе «Начис л ениеЗарпл атыВ сей».
Отличия в следующем:
сначала вводятся начисления, затем вводятся удержания.
При вводе начислений интересно использование метода ПолучитъБазу. В параметрах метода выполняется обращение не к одному, а к двум регистрам расчета, поскольку расчет «Отпуска» производится с использованием записей регистра расчета «ОсновныеНачисления» и регистра расчета «Премии».
РегистрМенеджер=РегистрыРасчета.ОсновныеНачисления;
Отбор= Новый СтруктураО;
Отбор. Вставить("Регистратор",Ссылка);
Ресурсы = Новый Массив(1);
Ресурсы[0] = "ОеновныеНачисления.Результат,Премии.Результат";
Измерения= Новый СтруктураО;
Измерения.Вставить("Подразделение","ОсновныеНачисления.Подразделение,Прем ии.Подразделение");
Измерения.Вставить(" Должность", "ОсновныеНачисления.Должность,Премии.Долж ность");
Измерения.Вставить("Сотрудник","ОсновныеНачисления.Сотрудник,Премии.Сотру
дник");
ДанныеБазы = РегистрМенеджер.ПолучитьБазу(Отбор,Ресурсы,Измерения);
Проверим работу программы в режиме «1С:Предприятие». Создадим ряд документов по вводу расчетов.
Замечание. Создаваемые документы пока не будем проводить (для корректного проведения нам потребуется поправить алгоритм в функции «РассчитатьНачисленияУдержания»). Документы требуется лишь записать, нажав на кнопку «Записать».
Расчеты за январь (Период регистрации - 1 января).
114
Решение задачи
Документ окладов:
"ВводОсновныхНачисленийИУдержаний" для ввода
Документ «ВводОсновныхНачисленийИУдержаний» для ввода штрафа:
Расчеты за февраль (Период регистрации - 1 февраля).
Документ «ВводОсновныхНачисленийИУдержаний» окладов и штрафа:
для ввода
115
Конфигурирование в системе "1С:Предприятие 8.0". Решение расчетных задач
Документ «НачислениеПремий»
Данный документ будет использоваться для ввода записей в регистр расчета «Премии» (будут вводиться премии).
Основные свойства:
Имя: «НачислениеПремий». Реквизиты:
о «ПериодРегистрации» тип Дата. Табличные части:
о Список
Формы:
о ФормаСписка, о ФормаДокумента.
116
Решение задачи
Назначим обработчик события При изменении поля ввода Сотрудник в табличном поле Список.
В модуле формы документа заполним процедуру-обработчик события.
Процедура СписокСотрудникПриИзменении(Элемент) Запрос = Новый Запрос(" Выбрать Сотрудник.Наименование, Подразделение, Должность
Из РегистрСведений.Сотрудники.СрезПоследних(парамДата, Сотрудник = парамСотрудник)
Где Состояние = парамСостояние
I");
Запрос.УстановитьПараметр("парамДата", Дата); Запрос.УетановитьПараметр("парамСотрудник", Элемент.Значение);
Запрос.УстановитьПараметр("парамСостояние", Перечисления.СостоянияФизлица.Работает);
МестаРаботы = Запрос.Выполнить().Выгрузить(); Если МестаРаботы.Количество()=0 Тогда
Предупреждение(""+Элемент.3начение+" не работает в организации "+Константы.НазваниеОрганизации);
ИначеЕсли МестаРаботы.Количество()=1 Тогда
Подразд = МестаРаботы [0] .Подразделение; ЭлементыФормы.Список.ТекущиеДанные.Подразделение = Подразд;
ЭлементыФормы.Список.ТекущиеДанные.Должность =
МестаРаботы[0] .Должность;
Иначе
ВыбраннаяСтрока = МестаРаботы.ВыбратьСтроку("Выберите место
работы");
Если ВыбраннаяСтрока о НЕОПРЕДЕЛЕНО Тогда Подразд = ВыбраннаяСтрока.Подразделение;
ЭлементыФормы. Список. ТекущиеДанные.Подразделение =
ВыбраннаяСтрока.Подразделение;
ЭлементыФормы.Список.ТекущиеДанные.Должность =
ВыбраннаяСтрока.Должность;
КонецЕсли;
117
8.0". Решение расчетных задач
КонецЕсди; КонецПро цедуры
Комментарии.
Процедура такая же, как и процедура в документе «НачислениеЗарплатыВсей».
В ОбработкеПроведения документа запишем следующее.
Процедура ОбработкаПроведения(Отказ, РежимПроведения) Для Каждого Строка Из Список Цикл
Движение = Движения.Премии.Добавить();
Движение.ПериодРегистрации = ПериодРегистрации;
Движение.БазовыйПериодНачало = Строка.ДатаНачала;
Движение.БазовыйПериодОкончание = Строка.ДатаОкончания;
Движение.Сотрудник = Строка.Сотрудник;
Движение.Подразделение = Строка.Подразделение;
Движение.Должность = Строка. Должность;
Движение.ВидРасчета = Строка.ВидРасчета;
Движение.ПараметрРасчета = Строка.Размер;
Движение. Сторно = Строка. Сторно; КонецЦикла; Движения.Премии.Записать();
РегистрМенеджер=РегистрыРасчета.Премии;
Отбор= Новый Структура("Регистратор",Ссылка);
Ресурсы = Новый Массив(1);
Ресурсы[0] = "ОсновныеНачисления.Результат";
Измерения= Новый Структура();
Измерения.Вставить("Подразделение","ОсновныеНачисления.Подразделение");
Измерения.Вставить(" Должность","ОсновныеНачисления.Должность");
Измерения.Вставить("Сотрудник","ОсновныеНачисления.Сотрудник");
ДанныеБазы = РегистрМенеджер .ПолучитьБазу(Отбор,Ресурсы,Измерения);
Для Каждого Движение Из Движения.Премии Цикл
Движение.Результат = РассчитатьНачисленияУдержания(Движение, Движения.Премии.Индекс(Движение), ДанныеБазы,,,);
КонецЦикла; КонецПроцедуры
Комментарии.
118
Решение задачи
Процедура похожа на соответствующую процедуру в документе «НачислениеЗарплатыВсей».
Отличия в следующем:
в данной процедуре используется только переменная
ДанныеБазы. Понятия ОтработанныеДни, НормаДней и
ОтработанныеПоБазеДни при расчете
«ПремииПроцентом» не используются.
В режиме «1С:Предприятие» создадим ряд документов по вводу премии.
Замечание. Создаваемые документы также пока не будем проводить, а лишь запишем, нажав на кнопку «Записать».
Расчеты за февраль (Период регистрации - 1 февраля).
Расчеты за январь (Период регистрации - 1 января).
Документ Выплаты
Данный документ будет обеспечивать ввод записей в регистр расчета «Выплаты» (будут вводиться выплаты зарплаты).
119
Конфигурирование в системе " 1 С:Предприятие8,0".
Основные свойства:
Имя: «Выплаты». Реквизиты:
о «ПериодРегистрации» тип Дата.
Табличные части:
тип
«СправочникСсылка.ФизическиеЛица»,
«Подразделение»: тип
«СправочникСсылка.Подразделения»,
«Должность»: тип
«СправочникСсылка.Должности»,
«ВидРасчета»: тип
«ПланВидовРасчетаСсылка.Выплаты», «Размер: тип Число длина 10 точность 2.
о Список
«Сотрудник»:
Формы:
о ФормаСписка, о ФормаДокумента.
Назначим обработчик события При изменении поля ввода Сотрудник в табличном поле Список.
В модуле формы документа заполним процедуру-обработчик события.
Процедура СписокСотрудникПриИзменении(Элемент)
// Вставить содержимое обработчика.
Запрос = Новый Запрос("
Выбрать Сотрудник.Наименование, Подразделение, Должность
Из РегистрСведений.Сотрудники.СрезПоследних(парамДата, Сотрудник = парамСотрудник)
Где Состояние = парамСостояние
120
Решение задачи
I");
Запрос. УстановитьПараметр("парамДата", Дата);
Запрос.УстановитьПараметр("парамСотрудник", Элемент.Значение);
Запрос.УстановитьПараметрС'парамСостояние", Перечисления.СостоянияФизлица.Работает);
МестаРаботы = Запрос.Выполнить().Выгрузить(); Если МестаРаботы.Количество()=0 Тогда
Предупреждение(""+Элемент.3начение+" не работает в организации "+Константы.НазваниеОрганизации);
ИначеЕсли МестаРаботы.Количество()=1 Тогда
Подразд = МестаРаботы [0] .Подразделение; ЭлементыФормы.Список.ТекущиеДанные.Подразделение = Подразд;
ЭлементыФормы.Список.ТекущиеДанные.Должность =
МестаРаботы [0] .Должность;
Иначе
ВыбраннаяСтрока = МестаРаботы.ВыбратьСтроку("Выберите место работы");
Если ВыбраннаяСтрока о НЕОПРЕДЕЛЕНО Тогда Подразд = ВыбраннаяСтрока.Подразделение;
ЭлементыФормы.Список.ТекущиеДанные.Подразделение =
ВыбраннаяСтрока.Подразделение;
ЭлементыФормы.Список. ТекущиеДанные.Должность =
ВыбраннаяСтрока.Должность;
КонецЕсли; КонецЕсли; КонецПроцедуры
Комментарии.
Процедура такая же, как и процедура в документе «НачислениеЗарплатыВсей».
В ОбработкеПроведения документа запишем следующее.
Процедура ОбработкаПроведения(Отказ, РежимПроведения) Для Каждого Строка Из Список Цикл
Движение = Движения.Выплаты.Добавить(); Движение.ПериодРегистрации = ПериодРегистрации; Движение.Сотрудник = Строка.Сотрудник; Движение.Подразделение = СтрокаЛодразделение; Движение.Должность = Строка. Должность; Движение.ВидРасчета = Строка.ВидРасчета;
121
Движение.ПараметрРасчета = Строка.Размер; КонецЦикла;
Движения.Выплаты.ЗаписатьО; Для Каждого Движение Из Движения.Выплаты Цикл
Движение.Результат = РассчитатьНачисленияУдержания(Движение, Движения.Выпплаты.Ивдекс(Движение),,,,);
Коне цЦикла; КонецПроцедуры
Комментарии.
Процедура похожа на соответствующую процедуру в документе «НачислениеЗарплатыВсей».
Отличия в следующем:
в данной процедуре переменные ДанныеБазы,
ОтработанныеДни, НормаДней и
ОтработанныеПоБазеДни не используются.
В режиме «1С:Предприятие» создадим ряд документов по вводу выплат.
Замечание. Создаваемые документы проводить не будем, но запишем их, нажав на кнопку «Записать».
Введем только выплаты за январь (Период регистрации - 1 января).
Расчет результатов начислений, удержаний, выплат по нескольким регистрам расчета
Для корректного расчета результатов в процедуру РассчитатъНачисленияУдержания необходимо внести изменения. А
именно, необходимо добавить в соответствующих местах названия
122
Решение задачи
новых регистров расчета (добавленные строки выделены жирным шрифтом).
Функция РассчитатьНачисленияУдержания(СтрокаДвижений, Индекс, ДанныеБазы, Отработано, Норма, ОтработаноПоБазе) Экспорт
Если (СтрокаДвижений.ВидРасчета = ПланыВидовРасчета.ВсеВидыРасчета.Оклад)
Или (СтрокаДвижений.ВидРасчета =
ПланыВидовРасчета.ОсновныеНачисления.Оклад) Тогда
НормаДней = Норма[Индекс].Значение; Если НормаДней = 0 Тогда
Сообщить("Расчет оплаты по окладу: Нет рабочих дней в заданном периоде", СтатусСообщения.Информация);
Возврат 0; Иначе
Если СтрокаДвижений.Сторно Тогда
Возврат -СтрокаДвижений.ПараметрРасчета; Иначе
Возврат СтрокаДвижений.ПараметрРасчета *
Отработано [Индекс] .Значение/НормаДней * ?(СтрокаДвижений. Сторно,-1,1);
КонецЕсли; КонецЕсли;
ИначеЕсли (СтрокаДвижений.ВидРасчета =
ПланыВидовРасчета.ВсеВидыРасчета.ПремияПроцентом) или
(СтрокаДвижений.ВидРасчета =
ПланыВидовРасчета.Премии.ПремияПроцентом)Тогда
Если СтрокаДвижений.Сторно Тогда
Возврат-СтрокаДвижений.ПараметрРасчета; Иначе
Возврат
ДанныеБазы[Индекс].Результат*СтрокаДвижений.ПараметрРасчета/100;
КонецЕсли;
ИначеЕсли (СтрокаДвижений.ВидРасчета =
ПланыВидовРасчета.ВсеВидыРасчета.Отпуск) или
(СтрокаДвижений.ВидРасчета =
ПланыВидовРасчета.ОсновныеНачисления.Отпуск) Тогда
Отработано Дней = ОтработаноПоБазе [Индекс] .Значение; Если ОтработаноДней = 0 Тогда
Сообщить("Расчет отпуска: Нет рабочих дней в базовом периоде", СтатусСообщения.Информация);
Возврат 0; Иначе
Возврат ДанныеБазы[Индекс].Результат/Отработано Дней * Отработано [Индекс]. Значение * ?(СтрокаДвижений.Сторно,-1,1);
КонецЕсли;
123
Конфигурирование в системе 1С:Предприятие 8.0 . Решение расчетных задач
ИначеЕсли (СтрокаДвижений.ВидРасчета
ПланыВидовРасчета.ВсеВидыРасчета.ШтрафСуммой) ИЛИ
(СтрокаДвижений.ВидРасчета ПланыВидовРасчета.ВсеВидыРасчета.Выплата) или
(СтрокаДвижений.ВидРасчета ПланыВидовРасчета.Удержания.ШтрафСуммой) ИЛИ
(СтрокаДвижений.ВидРасчета ПланыВидовРасчета.Выплаты.Вьшлата) Тогда
Возврат СтрокаДвижений.ПараметрРасчета; КонецЕсли; Возврат 0; КонецФункции
В режиме «1С:Предприятие» проведем ранее созданные и записанные документы.
Замечание. Для быстрого проведения документов можно воспользоваться возможностью пакетного проведения документов (меню «Операции» - «Проведение документов...»).
Посмотрите на результаты расчетов в регистрах расчета «ОсновныеНачисления», «Премии», «Удержания» и «Выплаты».
Вытеснение видов расчета из разных регистров расчета
Рассмотрим, как работает вытеснение видов расчета при использовании нескольких регистров расчета.
Проведем документ «ВводОсновныхНачисленийИУдержаний» для ввода «Отпуска».
Перепроведем документ, которым начислялся «Оклад» в феврале.
Внимание! Документ, который ввел в феврале премию (в регистре расчета «Премии») пока перепроводить не нужно!
124
Посмотрим, что получилось в регистре расчетов «ОсновныеНачисления» - результат «Оплаты по окладу» изменился.
Перерасчет записей регистра расчета. Взаимное влияние записей разных регистров расчета
Изменим несколько строк в обработке «Перерасчет зарплаты» (строки, которые нужно изменить выделены жирным курсивом).
Процедура ЗаполнитьДанныеО Экспорт Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ИСТИНА КАК Пометка,
| ОбъектПерерасчета КАК Документ
|ИЗ
| РегистрРасчета.РасчетыВсе.Перерасчет
| РегистрРасчета.Премии.Перерасчет
I");
ДокументыПерерасчета.Загрузить(Запрос.Выполнить().Выгрузить()); КонецПроцедуры
Процедура ОбновитьСписокПерерасчетов(Документ)
//НаборПерерасчета РегистрыРасчета.РасчетыВсе.Перерасчеты.Перерасчет.СоздатьНаборЗаписей();
НаборПерерасчета РегистрыРасчета.Премии.Перерасчеты.Перерасчет.СоздатьНаборЗаписей();
НаборПерерасчета.Отбор.ОбъектПерерасчета.Значение = Документ;
НаборПерерасчета.Прочитать();
СтрокиПерерасчета.Очистить();
Для Каждого Строка Из НаборПерерасчета Цикл
СтрокаТЗ=СтрокиПерерасчета.Добавить();
СтрокаТЗ.ВидРасчета=Строка,ВидРасчета;
СтрокаТЗ.Подразделение=Строка.Подразделение;
СтрокаТЗ.Должность=Строка.Должность;
СтрокаТЗ.Сотрудник=Строка.Сотрудник;
125
КонецЦикла; КонецПроцедуры
В модуль документа «Начисление премий» добавим процедуры Перерассчитать, ОбработкаЗаполнения и ВвестиПерерасчет:
Процедура Перерассчитать() Экспорт НачатьТранзакциюО;
НаборПерераечетов =
РегистрыРасчета.Премии.Перерасчеты.Перерасчет.СоздатьНаборЗаписей();
НаборПерераечетов.Отбор.ОбъектПерерасчета.Значение = Ссылка;
НаборПерерасчетов,Прочитать();
Отбор= Новый Структура();
Отбор.Вставить("Регистратор",Ссылка);
Ресурсы = Новый Массив( 1);
Ресурсы[0] = "ОсновныеНачисления.Результат";
Измерения= Новый Структура();
Измерения.Вставить("Подразделение","ОсновныеНачисления.Подразделение");
Измерения.Вставить(" Должность","ОсновныеНачисления.Должность");
Измерения.Вставить("Сотрудник","ОсновныеНачисления.Сотрудник");
ДанныеБазы = РегистрыРасчета.Премии.ПолучитьБазу(Отбор,Ресурсы,Измерения);
Движения.Премии.Прочитать();
Таблица = Движения.Премии.Выгрузить();
СтруктураПоиска = Новый Структура("Подразделение,Должность,Сотрудник");
Для Каждого СтрокаПерерасчета Из НаборПерераечетов Цикл
СтруктураПоиска.Подразделение = СтрокаПерерасчета.Подразделение;
СтруктураПоиска.Должность = СтрокаПерерасчета.Должность;
СтруктураПоиска. Сотрудник = СтрокаПерерасчета.Сотрудник;
Для Каждого СтрокаРегистра Из Таблица.НайтиСтроки(СтруктураПоиска) Цикл
СтрокаРегистра.Результат =
РассчитатьНачисленияУдержания(СтрокаРегистра, Таблица.Индекс(СтрокаРегистра),
ДанныеБазы,,,);
КонецЦикла; КонецЦикла;
Движения.Премии.Загрузить(Таблица); Движения.Премии.Записать(); НаборПерераечетов.Очистить(); НаборПерераечетов.Записать(); ЗафиксироватьТранзакцию(); КонецПроцедуры
Процедура ОбработкаЗаполнения(Основание)
126
Решение задачи
ПериодРегистрации = НачалоМесяца(ТекущаяДатаО); Дата = ТекущаяДата(); КонецПроцедуры
Процедура ВвестиПерерассчет() Экспорт Начать Транзакцию();
НаборПерерасчетов =
Регистр ыРасчета.Премии,Перерасчеты.Перерасчет.СоздатьНаборЗаписей();
НаборПерерасчетов.Отбор.ОбъектПерерасчета.Значение = Ссылка;
НаборПерерасчетов.Прочитать();
ДокументПерерасчета = Документы.НачислениеПремий.СоздатьДокумент();
ДокументПерерасчета.Заполнить(Ссылка);
Запрос = Новый Запрос(
"ВЫБРАТЬ
I*
|ИЗ
|РегистрРасчета.Премии
ГДЕ РегистрРасчета.Премии.Регистратор=парДокументОбъект
|");
Запрос.УстановитьПараметрС'парДокументОбъект", Ссылка); Таблица =Запрос.Выполнить().Выгрузить();
СтруктураПоиска = Новый Структура("Подразделение,Должность,Сотрудник"); Для Каждого СтрокаПерерасчета Из НаборПерерасчетов Цикл
СтруктураПоиска.Подразделение = СтрокаПерерасчета.Подразделение;
СтруктураПоиска. Должность = СтрокаПерерасчета. Должность;
СтруктураПоиска.Сотрудник = СтрокаПерерасчета. Сотрудник;
Для Каждого СтрокаРегистра Из Таблица.НайтиСтроки(СтруктураПоиска)
Цикл
НоваяСтрока = ДокументПерерасчета. Список. Добавить(); НоваяСтрока.Сотрудник = СтрокаРегистра. Сотрудник; НоваяСтрока.Подразделение = СтрокаРегистра.Подразделение; НоваяСтрока. Должность = СтрокаРегистра. Должность; НоваяСтрока.ВидРасчета = СтрокаРегистра.ВидРасчета;
НоваяСтрока.ДатаНачала =
СтрокаРегистра.БазовыйПериодНачало;
НоваяСтрока.ДатаОкончания =
СтрокаРегистра.БазовыйПериодОкончание;
НоваяСтрока.Размер = СтрокаРегистра.Результат; НоваяСтрока.Сторно = Истина;
НоваяСтрока = ДокументПерерасчета,Список.Добавить(); НоваяСтрока.Сотрудник = СтрокаРегистра.Сотрудник; НоваяСтрока.Подразделение = СтрокаРегистра.Подразделение;
127
Конфигурирование в системе "1С:Предприятие 8.0". Решение расчетных задач
НоваяСтрока.Должность = СтрокаРегистра.Должность; НоваяСтрока.ВидРасчета = СтрокаРегистра.ВидРасчета;
НоваяСтрока.ДатаНачала СтрокаРегистра.БазовыйПериодНачало;
НоваяСтрока.ДатаОкончания СтрокаРегистра.БазовыйПериодОкончание;
НоваяСтрока.Размер = СтрокаРегистра.ПараметрРасчета; КонецЦикла; КонецЦикла;
ДокументПерерасчета. Записать(); НаборПерерасчетов.Очистить(); НаборПерерасчетов.Записать(); ЗафиксироватьТранзакцию(); КонецПроцедуры
Комментарии.
Приведенные процедуры практически ничем не отличаются от процедур в документе «НачислениеЗарплатыВсей». Отличия - в именах регистров расчета.
В предыдущем разделе после ввода отпуска сотруднику Ивановой, был перерассчитан оклад. В соответствии с настройками свойства Ведущие виды расчетов плана видов расчета «Премии», должен быть выполнен перерасчет февральской «ПремииПроцентом».
Откроем обработку «Перерасчет зарплаты».
При открытии заполнится табличная часть. На этот раз сюда попадет документ, которым вводилась премия в регистр расчета Премии.
Нажмем кнопку «Выполнить перерасчет».
Если константа «ДатаЗапретаРедактирования» имеет значение большее, чем 01.01.2003 00.00.00 (дата проведения документа), тогда будет создан документ-перерасчет.
128
Решение задачи
После проведения которого в регистре расчета «Премии» появятся сторнирующая и корректирующая записи.
Если константа «ДатаЗапретаРедактирования» имеет значение меньше или равное дате проведения документа, тогда будет выполнен перерасчет документа (будут пересчитаны те записи, которые попали в перерасчет).
Отчет Расчеты сотрудников по нескольким регистрам расчета
Создадим отчет, который будет выдавать информацию о состоянии расчетов сотрудников (отчет по функционалу такой же, какой мы уже создавали), но теперь при создании отчета будем обращаться к нескольким регистрам расчета.
В результате работы отчета должно получиться примерно следующее.
129
Конфигурирование в системе "1С:Предприятие 8.0". Решение расчетных задач
Основные свойства отчета полностью совпадают со свойствами отчета
«РасчетыСотрудниковВсе». Поэтому создадим отчет
«РасчетыСотрудников» путем копирования отчета
«РасчетыСотрудниковВсе».
Имя: «РасчетыСотрудников». Реквизиты: ДатаОтчета тип Дата, Табличные части: Сотрудники. Реквизиты табличной части:
о «Сотрудник» тип
«СправочникСсылка.ФизическиеЛица».
Формы: РасчетыСотрудников. Макет: РасчетыСотрудников.
По сравнению с отчетом «РасчетыСотрудниковВсе» серьезно изменится лишь запрос к информационной базе (алгоритм обработки запроса не изменится).
Запрос к нескольким регистрам расчета
ТекстЗапроса = "ВЫБРАТЬ
|Расчеты.Подраздеяение КАК Подразделение,
|Расчеты.Должность КАК Должность,
|Расчеты,Сотрудник КАК Сотрудник,
|Расчеты.ВидРаечета КАК ВидРасчета,
|Расчеты.Начислено,
|Расчеты.Удержано,
|Расчеты.Выплачено
|ИЗ
|(ВЫБРАТЬ
130
Решение задачи
|НачисленияОсн.Подразделение КАК Подразделение, |НачисденияОсн.Должность КАК Должность, |НачисленияОсн. Сотрудник КАК Сотрудник, |НачисленияОсн.ВидРасчета КАК ВидРасчета, |ВЫБОР
|КОГДА
ТОГДА
ВидРасчета.Тип=Начисления
СУММА(НачисленияОсн.Результат)
|КОНЕЦ КАК Начислено, |0 КАК Удержано, |0 КАК Выплачено |ИЗ
|РегистрРасчета.ОсновныеНачисления КАК НачисленияОсн |ГДЕ
|НачисленияОсн.ПериодРегистрации = ДатаОтчета"; Условие=""; Если Сотрудники.Количество() о 0 Тогда
Условие = Условие + " И Сотрудник В Иерархии (СписокСотрудников)";
Запрос.УстановитьПараметр("СписокСотрудников", Сотрудники. ВыгрузитьКолонку("Сотрудник"));
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + Условие;
ТекстЗапроса = ТекстЗапроса +"
|СГРУППИРОВАТЬ ПО
|НачисленияОсн.Подразделение,
|НачисленияОсн.Должность,
|НачисленияОсн.Сотрудник,
|НачисленияОсн .В идРасчета
|ОБЪЕДИНИТЬВСЕ
|ВЫБРАТЬ
|Премии.Подразделение КАК Подразделение,
|Премии.Должность КАК Должность,
|Премии.Сотрудник КАК Сотрудник,
|Премии.ВидРасчета КАК ВидРасчета,
|ВЫБОР
|КОГДА ВидРасчета.Тип=Начисления ТОГДА СУММА(Премии.Результат)
|КОНЕЦ КАК Начислено, |0 КАК Удержано, |0 КАК Выплачено |ИЗ
|РегистрРасчета.Премии КАК Премии |ГДЕ
131
|Премии.ПернодРегистрации = ДатаОтчета";
Условие="";
Если Сотрудники.Количестве() 0 Тогда
Условие = Условие + " И Сотрудник В Иерархии (СписокСотрудников)";
Запрос.УстановитьПараметрС СписокСотрудников", Сотрудники.ВыгрузитьКолонкуС'Сотрудник"));
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + Условие;
ТекстЗапроса = ТекстЗапроса +"
|СГРУППИРОВАТЬ ПО
|Премии.Подразделение,
|Премии Должность,
|Премии.Сотрудник,
|Премии.ВидРасчета
|ОБЪЕДИНИТЬВСЕ
|ВЫБРАТЬ
|Удержаяия.Подразделение КАК Подразделение,
|Удержания.Должность КАК Должность,
|Удержания.Сотрудник КАК Сотрудник,
|Удержания.ВидРасчета КАК ВидРасчета,
|0 КАК Начислено,
|ВЫБОР
|КОГДА ВидРасчета.Тип=Удержания ТОГДА СУММА(Удержания.Результат)
|КОНЕЦ КАК Удержано, |0 КАЮ Выплачено |ИЗ
|РегистрРасчета.Удержания КАК Удержания |ГДЕ
|Удержания.ПериодРегистрации = ДатаОтчета"; Условие=""; Если Сотрудники.КоличествоО 0 Тогда
Условие = Условие + " И Сотрудник В Иерархии (СписокСотрудников)";
Запрос.УстановитьПараметр("СписокСотрудников",
Сотрудннкн.ВыгрузитьКолонку("Сотрудник"));
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + Условие; ТекстЗапроса = ТекстЗапроса +" |СГРУППИРОВАТЬ ПО
|Удержания. Подразделение,
|Удержания. Должность,
|Удержания. Сотрудник,
|Удержания.ВидРасчета
132
Решение задачи
|ОБЪЕДИНИТЬВСЕ |ВЫБРАТЬ
|Выплаты.Подразделение КАК Подразделение, |Выплаты.Должноеть КАК Должность, |Выплаты.Сотрудник КАК Сотрудник, |Выплаты.ВидРасчета КАК ВидРасчета, |0 КАК Начислено, |0 КАК Удержано, |ВЫБОР
|КОГДА ВидРаечета.Тип=Выплаты ТОГДА СУММА(Выплаты.Результат)
|КОНЕЦ КАК Выплачено |ИЗ
|РегистрРасчета.Выплаты КАК Выплаты |ГДЕ
|Выплаты.ПериодРегистрации = ДатаОтчета"; Условие=""; Если Сотрудники.Количество() о 0 Тогда
Условие = Условие + " И Сотрудник В Иерархии (СпиеокСотрудников)";
Запрос.УстановитьПараметр("СписокСотрудников", Сотрудники.ВыгрузитьКолонкуС'Сотрудник"));
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + Условие;
ТекстЗапроса = ТекстЗапроса +"
|СГРУППИРОВАТЬ ПО
|Выплаты.Подразделение,
|Выплаты.Должность,
|Bыплаты. Сотрудник,
|Выплаты.ВидРасчета)
|КАК Расчеты
|УПОРЯДОЧИТЬ ПО
|Подразделение,
|Должность,
|Сотрудник
|ИТОГИ СУММА(Начислено),СУММА(Удержано),СУММА(Выплачено) ПО
|Подразделение,
|Должность,
|Сотрудник
|";
Комментарии.
133
Конфигурирование в системе
В данном запросе последовательно производится обращение к каждому из регистров расчета «ОсновныеНачисления», «Премии», «Удержания», «Выплаты». В результате получается четыре «подзапроса», результаты которых собираются в одну таблицу с помощью оператора ОБЪЕДИНИТЬ ВСЕ (результирующая таблица используется для заполнения табличного документа).
Для того, чтобы лучше понять механизм такого объединения таблиц, проверим с помощью отчета «Знакомство с запросом» работу следующего достаточно простого запроса.
Текст запроса.
ВЫБРАТЬ
НачисленияОсн.Подразделение КАК Подразделение, НачисленияОсн. Должность КАК Должность, НачисленияОсн.Сотрудник КАК Сотрудник, НачисленияОсн.ВидРасчета КАК ВидРасчета ИЗ
РегиетрРасчета.ОсновныеНачисления КАК НачисленияОсн ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ
Премии.Подразделение КАК Подразделение, Премии.Допжность КАК Должность, Премии.Согрудник КАК Сотрудник, Премии.ВндРасчета КАК ВидРасчета ИЗ РегистрРасчета.Премии КАК Премии
Таблица результатов запроса.
Замечание. Для того, чтобы работал оператор ОБЪЕДИНИТЬ ВСЕ, необходимо, чтобы объединяемые таблицы имели одинаковое количество полей. Поля результата запроса будут называться так, как описано в списке полей выборки первого из объединяемых запросов. Поля выборки остальных запросов сопоставляются с полями результата в соответствии с порядком их следования в списке полей выборки. Если поля выборки объединяемых запросов имеют разный тип, то поля результата запроса будут иметь составной тип данных.
Процесс объединения результатов запроса удобно представить на
схеме.
134
Схема «Процесс объединения результатов запроса»
Решение задачи
135
Конфигурирование в системе " 1 С:Предприятие 8.0". Решение расчетных задач
Практикум №2
Налог на доходы физических лиц (НДФЛ)
Реализуйте возможность удержания с сотрудников НДФЛ. Для этого создайте следующие объекты:
План видов расчета «Налоги». Вид расчета «НДФЛ»
Создайте план видов расчета «Налоги». Создайте реквизит Тип, а также ФормуСписка и ФормуЭлемента. Определите свойство Зависимость от базы: Зависит по периоду регистрации. В качестве Базовых планов видов расчета определите планы видов расчета «Премии», «ОсновныеНачисления».
Создайте предопределенный вид расчета «НДФЛ». Определите базовые и ведущие виды расчета:
Регистр расчета «Налоги»
Создайте регистр расчета «Налоги». Определите свойство Вид
расчета: Налоги. Поставьте признак Базовый период,
периодичность: Месячный. Измерения: «Сотрудник»,
«Подразделение», «Должность». Ресурс: «Результат». Создайте ФормуСписка регистра.
Константа «СтавкаНалога»
Создайте константу «СтавкаНалога» типа Число длиной 5, точностью 2. В режиме исполнения определите ставку налога 13%.
Замечание. Мы сознательно упрощаем задачу, создавая константу, которая не может хранить историю значений. При этом подразумеваем, что в реальных конфигурациях «СтавкаНДФЛ» может изменяться во времени и для хранения истории значений ставки понадобилось бы создать периодический регистр сведений без измерений.
Документ «ВводНалогов»
Создайте документ «ВводНалогов». Определите свойство Движения: регистр расчета «Налоги».
Реквизиты документа: «ПериодРегистраци»и. Реквизиты табличной части Налоги: «Сотрудник», «Подразделение», «Должность», «ВидРасчета».
При проведении документа предусмотрите возможность получения налоговой базы по нескольким регистрам расчета методом
136
Решение задачи
ПолучитъБазу(). Доработайте процедуру
РассчитатъНачисленияУдержания() в общем модуле
ПроцедурыРасчета так, чтобы результат расчета считался по формуле: ДанныеБазы *СтавкаНалога/100.
Перерасчет подоходного налога
Создайте в регистре расчета «Налоги» перерасчет «ПерерасчетНДФЛ». НДФЛ должен пересчитыватъся при изменении оклада, отпуска или премии. Доработайте алгоритм перерасчета, реализованный в обработке «ПерерасчетЗарплаты» так, чтобы в список перерасчетов попадали перерасчеты еще и из регистра расчета «Налоги».
Отчет «РасчетыСотрудников»
Доработайте отчет «РасчетыСотрудников» так, чтобы в результат попадал и НДФЛ.
Введите в режиме исполнения удержание «НДФЛ» сотруднику Баранову (Бухгалтерия, Бухгалтер) и проверьте правильность работы программы.
137
чие расчетных задач
Некоторые особенности технологии реализации расчетных задач
Представленная выше технология решения простейшей расчетной задачи не отличается особой сложностью.
Рассмотрим некоторые технологические особенности и приемы конфигурирования, которые могут возникнуть при реализации реальных расчетных задач.
Долгосрочные начисления и удержания. Использование регистров сведений для хранения сведений о расчетах.
Для хранения данных о долгосрочных начислениях или удержаниях, когда-либо введенных сотруднику, можно использовать специальный регистр сведений, в котором регистрировать факт ввода сотруднику начисления или удержания, отображать сведения о некоторых характеристиках вводимых начислений и удержаний и о том, действует или прекратило действие введенное начисление или удержание.
При использовании такой схемы при инициализации нового расчетного периода для долгосрочных начислений и удержаний уже не надо будет создавать новые документы по вводу расчетов, достаточно будет проанализировать регистр сведений и на основании имеющихся сведений о действующих начислениях и удержаниях выполнить ввод расчетов на основании уже введенных ранее документов.
Уточнение разрезов учета. Распределение результатов расчета по нескольким разрезам учета
При ведении различных видов учета часто возникают задачи распределения результатов расчета, например, по нескольким счетам бухгалтерского учета, или по нескольким кодам налогового учета, или по нескольким источникам финансирования и т.д. Более того, очень часто подобное распределение не может быть выполнено в момент отражения в системе реальной расчетной хозяйственной операции (например, отражение в налоговом и бухгалтерском учете осуществляется по результатам определенного периода, а не в момент ввода расчета).
Для реализации подобных схем учета в системе «1С:Предприятие 8.0» достаточно создать несколько дополнительных регистров расчета, каждый из которых будет уточнять результат по тому или иному разрезу учета.
Регистры расчета, в которых будут распределяться результаты расчетов, должны повторять измерения основного регистра расчета и,
138
Решение задачи
возможно, дополнять их уточняющими измерениями (бухгалтерский счет, код налогового регистра и т.д.). Регистры расчета, в которых будут распределяться результаты расчетов, должны использовать тот же план видов расчета, что и основной регистр, должны поддерживать базовый период.
Приведем пример распределения результатов расчета по нескольким разрезам учета.
Реализуем механизм распределения результатов расчета начислений и удержаний по нескольким источникам финансирования.
Справочник «Источники финансирования»
Создадим справочник, в котором будем хранить перечень источников финансирования, используемых в организации.
Основные свойства:
Остальные свойства справочника оставим по умолчанию.
139
Справочник будет иметь один предопределенный элемент -Пропорционально. Данный элемент будет использоваться при необходимости распределения результатов расчета пропорционально расчетной базе вида расчета.
Конфигурщование в системе "1С:Предприятие 8.0". РешениЈЈасчетных задач
Регистр расчета «РасчетыВсеИФ»
Создадим регистр расчета «РасчетыВсеИФ».
В данном регистре расчета будем распределять результаты расчетов начислений и удержаний по источникам финансирования. Регистр будет повторять измерения регистра расчета «РасчетыВсе». Кроме того, регистр будет иметь уточняющее измерение Источник финансирования. Регистр расчета «РасчетыВсеИФ» будет использовать тот же план видов расчета, что и регистр «РасчетыВсе» (план видов расчета «ВидыРасчетаВсе»), будет иметь период действия и базовый период. Также регистр расчета «РасчетыВсеИФ» будет иметь дополнительный реквизит Пропорционально (тип Булево), который будет использоваться как признак необходимости распределения результата расчета пропорционально расчетной базе.
Замечание. Для простоты можно создать регистр расчета «РасчетыВсеИФ» путем копирования регистра расчета «РасчетыВсе», а затем уточнить недостающие характеристики.
Документ «РаспределениеПоИФ»
Создадим документ «РаспределениеПоИФ». Документ будет создаваться в каждом расчетном периоде для каждого сотрудника. В данном документе в табличную часть будут автоматически заполняться все начисления и удержания по сотруднику за выбранный период.
Реализуем возможность распределения начислений и удержаний сотрудника по различным источникам финансирования.
Основные свойства документа:
Имя: «РаспределениеПоИФ». Реквизиты:
Решение задачи
о Сотрудник: тип
СправочникСсылка. ФизическиеЛица,
о Подразделение: тип
СправочникСсылка.Подразделения,
о Должность: тип СправочникСсылка.Должности,
о ПериодРегистрации тип Дата.
Табличные части:
о ВидыРасчета
Формы:
о ФормаСписка, о ФормаДокумента.
В форме документа запретим пользователю добавлять вручную новые строки в табличную часть. Для этого назначим обработчик события ПередНачаломДобавления и в процедуре-обработчике события запишем следующее.
Процедура ВидыРасчетаПередНачаломДобавления(Элемент, Отказ, Копирование)
141
Конфигурирование в системе "1С:Предприятие^8.0"'. Решение расчетных задач
II Вставить содержимое обработчика. Отказ=Истина; КонецПроцедуры
Создадим на командной панели кнопку «Заполнить», назначим обработчтк события кнопки Нажатие и запишем содержимое обработчика.
Процедура ОсновныеДействияФормыЗаполнить(Кнопка)
// Вставить содержимое обработчика.
ЗаполнитьСписок(); КонецПроцедуры
Процедура ЗашолнитьСписок()
Если (Сотрудник.Пустая()=Ложь) и (Подразделение.Пустая()=Ложь) (Должность.Пустая()=Ложь) и (ПериодРегистрацииоДата("00010101000000")) Тогда
В идыРасчета.Очистить();
Запрос=Новый Запрос; ТекстЗапроса="ВЫБРАТЬ
| РасчетыВсе.ВидРасчета КАК ВидРасчета,
| РасчетыВсе.Результат КАК Результат,
| РасчетыВсе.График КАК График,
| РасчетыВсе.ПериодДействияНачало КАК ДатаНачала,
| РасчетыВсе.ПериодДействияОкончание КАК ДатаОкончания,
| РасчетыВсе.Сторно КАК Сторно
|ИЗ
| РегистрРасчета.РасчетыВсе КАК РасчетыВсе
|ГДЕ
| РасчетыВсе.Сотрудник = Сотрудник И
| РасчетыВсе.Подразделение = Подразделение И
| РасчетыВсе.Должность = Должность И
| РасчетыВсе.ПериодРегистрации = ПериодРегистрации И
| (РасчетыВсе.ВидРасчета.Тип = Начисление или
| РасчетыВсе.ВидРасчета.Тип = У держание)
|УПОРЯДОЧИТЬ ПО
| ВидРасчета";
Запрос.УстановитъПарметр(" Сотрудник", Сотрудник); Запрос.УстановитьПараметр("Подразделение",Подразделение); Запрос.УстановитьПараметр(" Должность" Должность); Запрос.УстановитьПараметр("ПериодРегистрации",ПериодРегистрации); Запрос.УстановитьПараметр("Начисление",Перечисления.ТипыВидовРасчета.Начислен
ие);
142
Решение задачи
Запрос.УстановитьПараметр("Удержание",Перечисления.ТипыВидовРасчета.Удержани
е);
Запрос.Текст=ТекстЗапроса; Выборка=Запрос.Вьшолнить().Выбрать(); Пока Выборка.СледующийО Цикл
Строка=ВидыРасчета.Добавить();
Строка.ВидРасчета=Выборка.ВидРасчета;
Строка.Результат=Выборка.Результат;
Строка.График=Выборка.График;
Строка.ДатаНачала=Выборка.ДатаНачала;
Строка.ДатаОкончания=Выборка.ДатаОкончания;
Строка.Сторно=Выборка.Сторно; КонецЦикла; КонецЕсли; КонецПроцедуры
Комментарии.
Выбираем запросом из регистра расчета «РасчетыВсе» записи начислений и удержаний за выбранный период для выбранного
сотрудника. Затем создаем в табличной части строки, соответствующие начислениям и удержаниям сотрудника.
В модуле документа создадим процедуру ОбработкаПроведения.
Процедура ОбработкаПроведения(Отказ, РежимПроведения) Для Каждого Строка Из ВидыРасчета Цикл
Если Не(Строка.ИсточникФинансирования=Справочники.ИсточникиФинансирования.Пропорци
овально) Тогда
Движение = Движения.РасчетыВсеИФ.Добавить(); Движение.ПериодРегистрации = ПериодРегистрации; Движение.ПериодДействияНачало = Строка.ДатаНачала; Движение.ПериодДействияОкончание = Строка.ДатаОкончания; Движение.Сотрудник = Сотрудник; Движение.Подразделение = Подразделение; Движение. Должность = Должность; Движение.График = Строка.График; Движение.ВидРасчета = Строка.ВидРасчета; Движение.Результат = Строка.Результат; Движение.Сторно = Строка.Сторно;
Движение.ИсточникФинансирования =
Строка.ИсточникФинансирования;
Иначе
ВыборкаИФ=Справочники.ИсточникиФинансирования.Выбрать();
Пока ВыборкаИФ.СледующийО Цикл
143
Конфигурирование в системе " 1С:Предприятие 8.0". Решение расчетных задач
Если ВыборкаИФ.СсьшкаоСправочники.ИсточникиФинансирования.Пропорционально Тогда
Движение = Движения.РасчетыВсеИФ.Добавить();
Движение.ПериодРегистрации = ПериодРегистрации;
Движение.ПериодДействияНачало = Строка.ДатаНачала;
Движение.ПериодДействияОкончание =
Строка.ДатаОкончания;
Движение.Сотрудник = Сотрудник; Движение.Подразделение = Подразделение; Движение.Должность = Должность; Движение.График = Строка.График; Движение. ВидРасчета = Строка.ВидРасчета; Движение.ПараметрРасчета = Строка.Результат;
Движение.Сторно = Строка.Сторно;
Движение.ИсточникФинансирования =
ВыборкаИФ.Сеылка;
Движение.Пропорционально = Истина; КонецЕсли; КонецЦикла;
КонецЕсли; КонецЦикла;
Движения.РасчетыВсеИФ.Записать(); РВсеМенеджер=РегистрыРасчета.РасчетыВсеИФ;
НаборЗаписей = РВсеМенеджер.СоздатьНаборЗаписей(); НаборЗапнсей.Отбор.Регистратор.Значение = Ссылка; Отбор= НаборЗаписей.Отбор; Ресурсы = Новый Массив( 1); Ресурсы[0] = "РасчетыВсеИФ.Результат"; Измерения= Новый Структура();
Измерения.Вставить("Подразделение","РасчетыВсеИФ.Подразделение"); Измерения.Вставить(" Должность","РасчетыВсеИФ.Должность"); Измерения.Вставить("Сотрудник","РасчетыВсеИФ.Сотрудник"); ИзмеренияИФ= Новый Структура();
ИзмереЕияИФ.Вставить("Подразделение","РасчетыВсеИФ.Подразделение"); ИзмеренияИФ .Встав ить(" Должность","РасчетыВсеИФ.Должность"); ИзмеренияИФ.Вставить("Сотрудник","РасчетыВсеИФ. Сотрудник");
ИзмеренияИФ .Вставить("ИсточникФинансирования","РасчетыВсеИФ.ИсточникФи нансирования");
Для Каждого Движение Из Движения.РасчетыВсеИФ Цикл Если Движение.Пропорционально =Истнна Тогда
ДанныеБазы = Движение.ПолучитьБазу(Ресурсы,Измерения);
144
Решение задачи
ДанныеБазыИФ
Движение.ПолучитьБазу(Ресурсы,ИзмеренияИФ);
Движение.Результат ДанныеБазыИФ[0].Результат/ДанныеБазы[0].Результат*Движение.ПараметрРасчета;
КонецЕсли;
КонецЦикла; КонецПроцедуры
Комментарии.
В алгоритме реализован механизм создания записей в регистре расчета РасчетыВсеИФ. Если в табличной части документа-распределения для начисления или удержания указан конкретный источник финансирования, то в регистре расчетов РасчетыВсеИФ создается одна запись. Если же для начисления или удержания указан источник финансирования Пропорциональное распределение, то в регистре расчетов РасчетыВсеИФ создается столько записей, сколько источников финансирования используется в организации.
Для каждой такой записи производится расчет результата с учетом источника финансирования. Для получения расчетной базы по конкретному источнику финансирования используется метод записи регистра расчета ПолучитъБазу(Ресурсы,ИзмеренияИФ). Причем в качестве второго параметра используется структура с дополнительным значением ИсточникФинансирования.
Для получения доли при пропорциональном распределении результат (из таблицы значений, возвращаемой методом ПолучитъБазу) по конкретному источнику финансирования делится на данные базы по всем источникам финансирования.
Замечание. В данной реализации с целью упрощения не учитывается округление результата.
Создадим в режиме исполнения документ РаспределениеПоИФ для сотрудника Ивановой со следующими характеристиками.
Шапка:
о ПериодРегистрации 01.01.2003; о Сотрудник: Иванова; о Подразделение: Дирекция; о Должность: Директор;
Табличная часть: заполним автоматически.
145
Конфигурирование в системе "1С:Предприятие 8.0". Решение расчетных задач
После автоматического заполнения табличной части уточним источники финансирования:
1 для Оплаты по окладу - Бюджет;
1 для Премии процентом - Пропорциональное
распределение.
Проведем документ. В результате в регистре расчета «РасчетыВсеИФ» появятся новые записи.
Практикум №3
Отчет Расчеты сотрудников по источникам финансирования
Доработтайте отчет «Расчеты сотрудников» так, чтобы можно было формировать отчет как по выбранному, так и по всем источникам финансирования.
146
Заключение
Итак, на этом курс завершен, что мы можем посоветовать дальше?
Во-первых, пройти эту методичку еще раз самостоятельно, но на этот раз в спокойном темпе, не пропуская ни одного практикума. Это будет уже намного проще, т.к. готовая база данных в результате прохождения курса у Вас уже имеется.
Во-вторых, имеет смысл продолжить изучение методов встроенного языка и типовых конфигураций на наших курсах.
В-третьих, решайте больше реальных практических задач! Ничто так не укрепляет знания, как реальная практика.
147
Желаем Вам успехов!