Здравствуйте.
Мне потребовался такой показатель для начисления - средний заработок (за 12 месяцев), который используется, например, для расчета отпуска.
Как решалась данная задача:
1. Создаем новое начисление (или меняем существующее) - в моем случае это "Единовременная выплата к отпуску"
2. Создаем новый показатель - СреднийДоходДляОтпуска
и сохраняем
3. Далее, в созданном начислении прописываем необходимую формулу:
4. Создаем новый шаблон ввода исходных данных: Настройка - Шаблоны ввода исходных данных.
5. Теперь, используя Зарплата - Данные для расчета зарплаты, можно создать документы, заполнить...
Вторая часть:
Как обеспечить автоматическое создание и заполнение документов, шаблон для которых мы подготовили?
Идея была такая: получить средний заработок и, используя внешнюю обработку, создавать или перезаполнять документы Зарплата - Данные для расчета зарплаты 1 раз в месяц, используя механизм ЗУП Администрирование - Печатные формы, отчеты и обработки - Дополнительные отчеты и обработки.
Делаем...
1. В конфигураторе создаем новую внешнюю обработку
2. Создаем форму - она нам понадобится, чтобы иметь возможность запускать обработку вручную.
В модуле формы:
&НаКлиенте
Процедура КомандаВыполнить(Команда)
ВыполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьНаСервере()
ДокументОбъект = РеквизитФормыВЗначение("Объект");
ДокументОбъект.ЗаписатьВШаблон();
КонецПроцедуры
3. Теперь кодим в модуле объекта внешней обработки.
Первое, что необходимо сделать, это создать служебную функцию СведенияОВнешнейОбработке(), которая будет содержать, собственно, сведения о внешней обработке
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(СтандартныеПодсистемыВызовСервера.ВерсияБиблиотеки());
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.БезопасныйРежим = Ложь;
ПараметрыРегистрации.Наименование = "Средний доход для шаблона";
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
//представление команды в пользовательском режиме
НоваяКоманда.Представление = "Старт";
НоваяКоманда.Идентификатор = НоваяКоманда.Представление;
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Возврат ПараметрыРегистрации;
КонецФункции
Следующим шагом будет создание функции ВыполнитьКоманду(), которая будет запускать код получения среднего и записи в документ.
Функция ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыКоманды) Экспорт
Если ИдентификаторКоманды = "Старт" Тогда
ЗаписатьВШаблон();
КонецЕсли;
КонецФункции
Ну и самое главное - получение среднего:
&НаСервере
Функция ЗапросСреднегоРасширенный(Сотрудник, _ДатаНачалаСобытия, _НачалоПериода, _ОкончаниеПериода, _ПоЧасам = Ложь, _ПоСтатьямФинансирования = Ложь, _СпособРасчетаОтпуска)
ДополнительныеПараметрыРасчетаСреднегоЗаработка = УчетСреднегоЗаработкаКлиентСервер.ДополнительныеПараметрыРасчетаСреднегоЗаработка();
ДополнительныеПараметрыРасчетаСреднегоЗаработка.НачалоПериода = _НачалоПериода;
ДополнительныеПараметрыРасчетаСреднегоЗаработка.ОкончаниеПериода = _ОкончаниеПериода;
ДополнительныеПараметрыРасчетаСреднегоЗаработка.ПоЧасам = _ПоЧасам;
ДополнительныеПараметрыРасчетаСреднегоЗаработка.ПоСтатьямФинансирования = _ПоСтатьямФинансирования;
ДополнительныеПараметрыРасчетаСреднегоЗаработка.СпособРасчетаОтпуска = _СпособРасчетаОтпуска;
Возврат УчетСреднегоЗаработка.СреднийЗаработок(Сотрудник, _ДатаНачалаСобытия,ДополнительныеПараметрыРасчетаСреднегоЗаработка);
КонецФункции
Запись в документ/обновление документа:
&НаСервере
Процедура ЗаписатьВШаблон() Экспорт
// настройки
ВидыДокументовВводДанныхДляРасчетаЗарплаты = "НАДО ВВЕСТИ НАИМЕНОВАНИЕ";
ПоказательРасчетаЗарплаты = "НАДО ВВЕСТИ НАИМЕНОВАНИЕ";
НаименованиеОрганизации = "НАДО ВВЕСТИ НАИМЕНОВАНИЕ";
ВидДокументаВводаДанныхДляРасчетаЗарплаты = "НАДО ВВЕСТИ НАИМЕНОВАНИЕ";
// определить текущий месяц
//_ТекущийМесяц = НачалоМесяца(ТекущаяДата());
_ТекущийМесяц = НачалоМесяца(ТекущаяДата());
_ОкончаниеПериода = КонецМесяца(ДобавитьМесяц(_ТекущийМесяц, -1));
_НачалоПериода = НачалоМесяца(ДобавитьМесяц(_ОкончаниеПериода, -11));
// получить список сотрудников
СписокСотрудников = Новый ТаблицаЗначений;
СписокСотрудников.Колонки.Добавить("Объект",Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
СписокСотрудников.Колонки.Добавить("Значение",Новый ОписаниеТипов("Число"));
// Значения показателей
Значения = Новый ТаблицаЗначений;
Значения.Колонки.Добавить("Объект", Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
Значения.Колонки.Добавить("Показатель", Новый ОписаниеТипов("СправочникСсылка.ПоказателиРасчетаЗарплаты"));
Значения.Колонки.Добавить("Значение", Новый ОписаниеТипов("Число"));
Значения.Колонки.Добавить("Период", Новый ОписаниеТипов("Дата"));
Значения.Колонки.Добавить("ПериодОкончания", Новый ОписаниеТипов("Дата"));
Значения.Колонки.Добавить("ВремяВЧасах", Новый ОписаниеТипов("Булево"));
Значения.Колонки.Добавить("ФиксТарифнаяСтавка", Новый ОписаниеТипов("Булево"));
Значения.Колонки.Добавить("ФиксОтработанноеВремя", Новый ОписаниеТипов("Булево"));
Значения.Колонки.Добавить("ФиксЗначение", Новый ОписаниеТипов("Булево"));
// Физические лица
ФизическиеЛица = Новый ТаблицаЗначений;
ФизическиеЛица.Колонки.Добавить("ФизическоеЛицо", Новый ОписаниеТипов("СправочникСсылка.ФизическиеЛица"));
//
Запрос = Новый Запрос;
Запрос.Текст = "
| ВЫБРАТЬ
| Сотрудники.Ссылка КАК Ссылка
| ИЗ
| Справочник.Сотрудники КАК Сотрудники
| ГДЕ
| Сотрудники.ПометкаУдаления = Ложь И
| Не Сотрудники.Код Есть Null И Сотрудники.Код <> """" И
| Не Сотрудники.ФизическоеЛицо Есть Null
| УПОРЯДОЧИТЬ ПО
| Сотрудники.Наименование
|";
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат;
КонецЕсли;
// перебрать всех сотрудников и получить средний и заполнить таблицу
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
сотрудникСсылка = Выборка.Ссылка;
// средний
Если сотрудникСсылка <> Неопределено Тогда
// средний
средний = ЗапросСреднегоРасширенный(сотрудникСсылка, _ТекущийМесяц, _НачалоПериода, _ОкончаниеПериода, Ложь, Ложь, Перечисления.СпособыРасчетаНачислений.ОплатаОтпускаПоКалендарнымДням);
// список сотрудников
НоваяСтрока = СписокСотрудников.Добавить();
НоваяСтрока.Объект = сотрудникСсылка;
Новаястрока.Значение = средний;
// таблица физические лица
НоваяСтрокаФЛ = ФизическиеЛица.Добавить();
НоваяСтрокаФЛ.ФизическоеЛицо = сотрудникСсылка.ФизическоеЛицо;
// таблица значения показателей
НоваяСтрокаЗП = Значения.Добавить();
НоваяСтрокаЗП.Объект = сотрудникСсылка;
НоваяСтрокаЗП.Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию(ПоказательРасчетаЗарплаты, Истина);
НоваяСтрокаЗП.Значение = средний;
НоваяСтрокаЗП.Период = НачалоМесяца(_ТекущийМесяц);
НоваяСтрокаЗП.ПериодОкончания = КонецМесяца(_ТекущийМесяц);
НоваяСтрокаЗП.ВремяВЧасах = Ложь;
НоваяСтрокаЗП.ФиксТарифнаяСтавка = Ложь;
НоваяСтрокаЗП.ФиксОтработанноеВремя = Ложь;
НоваяСтрокаЗП.ФиксЗначение = Ложь;
//прервать;
Иначе
Возврат;
КонецЕсли;
КонецЦикла;
// работа с документами ДанныеДляРасчетаЗарплаты
// есть документ за текущий месяц?
Запрос = Новый Запрос;
Запрос.Текст = "
| ВЫБРАТЬ ПЕРВЫЕ 1
| *
| ИЗ
| Документ.ДанныеДляРасчетаЗарплаты КАК ДанныеДляРасчетаЗарплаты
| ГДЕ
| ДанныеДляРасчетаЗарплаты.Период = &Период И
| ДанныеДляРасчетаЗарплаты.ВидДокумента = &ВидыДокументовВводДанныхДляРасчетаЗарплаты
|";
Запрос.УстановитьПараметр("Период",_ТекущийМесяц);
Запрос.УстановитьПараметр("ВидыДокументовВводДанныхДляРасчетаЗарплаты",Справочники.ВидыДокументовВводДанныхДляРасчетаЗарплаты.НайтиПоНаименованию(ВидыДокументовВводДанныхДляРасчетаЗарплаты,Истина));
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
// создать документ
док = Документы.ДанныеДляРасчетаЗарплаты.СоздатьДокумент();
докСсылка = док.ПолучитьСсылкуНового();
док.Дата = ТекущаяДата();
док.Период = НачалоМесяца(ТекущаяДата());
док.ВидДокумента = Справочники.ВидыДокументовВводДанныхДляРасчетаЗарплаты.НайтиПоНаименованию(ВидДокументаВводаДанныхДляРасчетаЗарплаты,Истина);
док.Организация = Справочники.Организации.НайтиПоНаименованию(НаименованиеОрганизации,Истина);
док.ПериодОкончания = КонецМесяца(ТекущаяДата());
// заполнить таблицы
док.ЗначенияПоказателей.Загрузить(Значения);
// записать документ
док.Записать(РежимЗаписиДокумента.Проведение);
Иначе
// изменить документ, переписать показатели. состав сотрудников не меняется
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
док = Выборка.Ссылка.ПолучитьОбъект();
ЗначенияПоказателей = док.ЗначенияПоказателей.Выгрузить();
Для Каждого Зн Из ЗначенияПоказателей Цикл
Для Каждого Зн2 Из СписокСотрудников Цикл
Если Зн.Объект = Зн2.Объект Тогда
Зн.Значение = Зн2.Значение;
КонецЕсли;
КонецЦикла;
КонецЦикла;
док.ЗначенияПоказателей.Загрузить(ЗначенияПоказателей);;
док.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Обратите внимание на начало процедуры ЗаписатьВШаблон - требуется указать наименование организации, документов и.т.д
В завершение необходимо добавить данную обработку и настроить автозапуск.
Идем в Администрирование - Печатные формы, отчеты и обработки - Дополнительные отчеты и обработки.
С помощью кнопки Добавить из файла добавляем нашу обработку и настраиваем периодичность работы.