вторник, 17 июля 2012 г.

Внимательность при заполнении периода отчета


Иногда можно по невнимательности наступить на следующие грабли.
В СКД при заполнении параметров человеку кажется, что первая дата- это дата начала, а вторая -это дата окончания.
Но в СКД может быть наоборот.





воскресенье, 8 июля 2012 г.

Как в СКД отформатировать дату

Часто вместо стандартной даты в шапке отчета уместнее вывести название периода как на рисунке


Делается это просто

В СКД на закладке "наборы данных" есть поле "оформление", там есть поле "формат" где нужно ввести форматную строку

Решение задачи 3.8 к экзамену "1с специалист"

При решении задачи 3.8 есть интересный момент:
Сотрудники предприятия получают оплату по часовому тарифу. Сумма начисления по тарифу определяется как тарифная ставка, умноженная на количество фактически отработанных часов. В течение расчетного периода тарифная ставка может быть один раз изменена. Расчет должен производиться исхода из действующей на рассчитываемую дату тарифной ставки. Например, если эта ставка изменилась 10 августа, то до 10 августа при расчете берется старое значение, а начиная с 10 августа - новое.

Значит нужно разбить записи для начислений по тарифу на 2 части , но только в том случае если
1) Тарифная ставка менялась в течении расчетного период
2) Дата изменения тарифной ставки лежит внутри периода действия вида расчета.

В решаемой задаче сотрудникам были изменены часовые тарифы 16 числа.

Документ "Начисление ЗП"


Результат проведения должен быть следующий.



Привожу алгоритм формирования записей регистра расчета и из расчета











Процедура ОбработкаПроведения(Отказ, Режим)

Запрос =Новый("Запрос");

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


Запрос.Параметры.Вставить("Ссылка",Ссылка);
Запрос.Параметры.Вставить("НачДата",ПериодРегистрации);
Запрос.Параметры.Вставить("КонДата",КонецМесяца(ПериодРегистрации));


ТЗ =Запрос.Выполнить().Выгрузить();



выборка =Запрос.Выполнить().Выбрать();

пока выборка.Следующий() цикл

если выборка.ТарифКонец<>выборка.ТарифНачало 
и 
выборка.ПериодКонец>Выборка.периодДействияНачало и  выборка.ПериодКонец<Выборка.периодДействияКонец тогда
// 2 записи


Движение = Движения.Начисления.Добавить();
ЗаполнитьЗначенияСвойств(Движение,выборка);
Движение.ПериодРегистрации =ПериодРегистрации;
Движение.ПериодДействияНачало =Выборка.периодДействияНачало;
Движение.ПериодДействияКонец =НачалоДня(Выборка.периодКонец)-1;
Движение.БазовыйПериодНачало = Выборка.периодДействияНачало;
Движение.БазовыйПериодКонец = НачалоДня(Выборка.периодКонец)-1;
Движение.ИсходныеДанные =выборка.ТарифНачало;



Движение = Движения.Начисления.Добавить();
ЗаполнитьЗначенияСвойств(Движение,выборка);
Движение.ПериодРегистрации =ПериодРегистрации;
Движение.ПериодДействияНачало =Выборка.периодКонец;
Движение.ПериодДействияКонец =Выборка.периодДействияКонец;
Движение.БазовыйПериодНачало = Выборка.периодКонец;
Движение.БазовыйПериодКонец = Выборка.периодДействияКонец;
Движение.ИсходныеДанные =выборка.тарифКонец;



иначе

Движение = Движения.Начисления.Добавить();
ЗаполнитьЗначенияСвойств(Движение,выборка);
Движение.БазовыйПериодНачало = Выборка.периодДействияНачало;
Движение.БазовыйПериодКонец = Выборка.периодДействияКонец;
Движение.ИсходныеДанные =выборка.ТарифНачало;
Движение.ПериодРегистрации =ПериодРегистрации;

КонецЕсли;





КонецЦикла;


// регистр Начисления
Движения.Начисления.Записывать = Истина;

Запрос =Новый("Запрос");
Запрос.Текст ="ВЫБРАТЬ РАЗЛИЧНЫЕ
| НачислениеЗарплатыОсновныеНачисления.Сотрудник
|ИЗ
| Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления
|ГДЕ
| НачислениеЗарплатыОсновныеНачисления.Ссылка = &ссылка";

Запрос.Параметры.Вставить("Ссылка",Ссылка);

тз=Запрос.Выполнить().Выгрузить();

МассивСотрудников=Тз.ВыгрузитьКолонку("Сотрудник");


Движения.Начисления.Записать();


Расчет.РассчитатьНачисления(Движения.Начисления,ПланыВидовРасчета.ОсновныеНачисления.Простой,МассивСотрудников);
Движения.Начисления.Записать(,Истина);

Расчет.РассчитатьНачисления(Движения.Начисления,ПланыВидовРасчета.ОсновныеНачисления.Оклад,МассивСотрудников);
Движения.Начисления.Записать(,Истина);

Расчет.РассчитатьНачисления(Движения.Начисления,ПланыВидовРасчета.ОсновныеНачисления.Премия,МассивСотрудников) ;
Движения.Начисления.Записать(,Истина);


//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
ПериодРегистрации =НачалоМесяца(ПериодРегистрации);
КонецПроцедуры



и сам алгоритм расчета



Процедура РассчитатьНачисления(НаборЗаписей,ТребуемыйВидРасчета,МассивСотрудников) Экспорт
Регистратор =НаборЗаписей.отбор.Регистратор.Значение;
Измер =Новый("Массив");
Измер.Добавить("Сотрудник");
Запрос =Новый("Запрос");
Запрос.Текст ="ВЫБРАТЬ
| НачисленияДанныеГрафика.НомерСтроки,
| ЕСТЬNULL(НачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК Факт,
| НачисленияДанныеГрафика.Сотрудник,
| НачисленияДанныеГрафика.ИсходныеДанные,
| СведенияОСотрудникахСрезПоследних.Премия
|ИЗ
| РегистрРасчета.Начисления.ДанныеГрафика(
| ВидРасчета = &ВидРасчета
| И Сотрудник В (&МассивСотрудников)
| И Регистратор = &Регистратор) КАК НачисленияДанныеГрафика
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках.СрезПоследних(&Период, Сотрудник В (&МассивСотрудников)) КАК СведенияОСотрудникахСрезПоследних
| ПО НачисленияДанныеГрафика.Сотрудник = СведенияОСотрудникахСрезПоследних.Сотрудник";
Запрос.Параметры.Вставить("Регистратор",Регистратор);
Запрос.Параметры.Вставить("ВидРасчета",ТребуемыйВидРасчета);
Запрос.Параметры.Вставить("МассивСотрудников",МассивСотрудников);
Запрос.Параметры.Вставить("Период",Регистратор.ПериодРегистрации);
Выборка =Запрос.Выполнить().Выбрать();
Для каждого Запись из НаборЗаписей цикл
Структура =Новый("Структура");
Структура.Вставить("НомерСтроки",Запись.НомерСтроки);
выборка.Сбросить();
если выборка.НайтиСледующий(Структура) тогда
Отработано  =выборка.Факт;
если   ТребуемыйВидРасчета= ПланыВидовРасчета.ОсновныеНачисления.Оклад тогда
Запись.Результат =Отработано *выборка.исходныеДанные; 
иначеесли ТребуемыйВидРасчета= ПланыВидовРасчета.ОсновныеНачисления.Простой тогда
Запись.Результат =Отработано *выборка.исходныеДанные*2/3; 
иначеесли ТребуемыйВидРасчета= ПланыВидовРасчета.ОсновныеНачисления.Премия тогда
СтруктураОтбора =Новый("Структура");
СтруктураОтбора.Вставить("Сотрудник",выборка.сотрудник);
ПроцентПремии=выборка.Премия;
Запись.Результат =Отработано *выборка.исходныеДанные*ПроцентПремии/100; 
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры









Привидение формы отчета согласно условия задачи


Согласно условия задачи отчет должен быть в следующем виде


Подразделение
Сотрудник
Вид
расчета 1
Вид
расчета 2
...
Итого:






Итого:







Система по умолчанию создает группировку по подразделению как на рисунке ниже. 
Я не знаю считается ли это на экзамене за недочет, но лучше перестраховаться и сделать в точности как требуется
Как вариант, для этого на закладке "настройки " нужно сделать как на рисунке


Как убрать заголовок в шапке отчета построенного на СКД







При решении задачи 3.8 при подготовке к экзамену1с специалист столкнулся со следующей проблемой




Как видно на рисунке в шапке отчета под каждым видом расчета выводится название ресурса (Результат).

Частично проблема решается установкой пустого заголовка в СКД (не совсем пустой, а нужно внести хотя бы один пробел)


Теперь результат выглядит следующим образом.




По-моему получше, но для того чтобы вообще убрать пустые ячейки потребуется создавать собственный макет.