Базовый курс. Занятие №14

Второе занятие заключительного блока.

Необходимо изучить следующие главы.
Глава 9. Свойства записи регистра расчета.
Глава 10. Программная работа с регистром расчета.
Глава 11. Получение данных из регистров расчета.
Глава 12. Расчет ресурсов регистра расчета.

Также нужно выполнить домашнее задание, текст которого доступен на странице.

Задание необходимо выполнять в ИБ после предыдущего ДЗ.

В этой же теме необходимо написать отчет о выполнении задания.

ps. Участники курса без доступа в мастер-группу отчитываться по домашним заданиям не могут.

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
залогиньтесь.

Если не активировали токен — посмотрите видео-инструкцию (видео N5)

Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —
напишите нам на e-mail поддержки.

комментария 53 на “Базовый курс. Занятие №14”

  1. Оклад,отпуск, прогул в основных начислениях, премия в дополнительных.
    Оклад вытесняется отпуском и прогулом, прогул отпуском. базовые для отпуска оклад, премия, отпуск, для премии – оклад, отпуск, премия.
    док НачислениеЗарплаты – основные начисления
    Док ВводРазовыхНачислений – премия.
    НачислениЗарплаты

    Процедура ОбработкаПроведения(Отказ, Режим)
        //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
        // Данный фрагмент построен конструктором.
        // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

        // регистр ОсновныеНачисления
        Движения.ОсновныеНачисления.Записывать = Истина;
        Для Каждого ТекСтрокаНачисления Из Начисления Цикл
            Движение = Движения.ОсновныеНачисления.Добавить();
            Движение.Сторно = ТекСтрокаНачисления.Сторно;
            Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
            Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
            Движение.ПериодДействияКонец = ТекСтрокаНачисления.ДатаОкончания;
            Движение.ПериодРегистрации = ПериодРегистрации;
            Движение.БазовыйПериодНачало = ТекСтрокаНачисления.БазовйПериодНачало;
            Движение.БазовыйПериодКонец = ТекСтрокаНачисления.БазовйПериодКонец;
            Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
            Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
            Движение.ТипГрафика = ТекСтрокаНачисления.ТипГрафика;
            Движение.Размер = ТекСтрокаНачисления.Размер;
        КонецЦикла;
      Движения.Записать();
      РасчетНачислений(Отказ);
        //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    КонецПроцедуры

    Процедура РасчетНачислений(Отказ)
            //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
        // Данный фрагмент построен конструктором.
        // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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

        Измерения = Новый Массив;
        Измерения.Добавить("Сотрудник");
        Измерения.Добавить("Подразделение");
        Запрос.УстановитьПараметр("Измерения", Измерения);   
        Запрос.УстановитьПараметр("Ссылка", Ссылка);
        Запрос.УстановитьПараметр("Отпуск",ПланыВидовРасчета.ОсновныеНачисления.Отпуск);
        Выборка = Запрос.Выполнить().Выбрать();
        Набор = Движения.ОсновныеНачисления;
        Поиск = Новый Структура("НомерСтроки");
        Для каждого Запись Из Набор Цикл
            Поиск.НомерСтроки = Запись.НомерСтроки;
            Выборка.Сбросить();
           
            Если Выборка.НайтиСледующий(Поиск) Тогда
               
                Если Запись.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.ОкладПоДням Тогда
                   
                    Запись.Результат = Запись.Размер*Выборка.Факт/Выборка.План*?(Запись.Сторно,-1,1);
                ИначеЕсли Запись.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Прогул Тогда
                   
                    Результат = 0;
                ИначеЕсли Запись.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда
                    Запись.Результат = Выборка.База/Выборка.БазаДни*Выборка.Факт;
                КонецЕсли;
               
            КонецЕсли;
           
       
        КонецЦикла;

    Набор.Записать(,Истина);
       
    КонецПроцедуры

    ВводРазовыхНачислений

    Процедура ОбработкаПроведения(Отказ, Режим)
        //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
        // Данный фрагмент построен конструктором.
        // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

        // регистр ДополнительныеНачисления
        Движения.ДополнительныеНачисления.Записывать = Истина;
        Движение = Движения.ДополнительныеНачисления.Добавить();
        Движение.Сторно = Ложь;
        Движение.ВидРасчета = ВидРасчета;
        Движение.ПериодРегистрации = НачалоМесяца(Дата);
        Движение.БазовыйПериодНачало = БазовыйПериодНачало;
        Движение.БазовыйПериодКонец = БазовыйПериодОкончание;
        Движение.Сотрудник = Сотрудник;
        Движение.Подразделение = Подразделение;
        Движение.Размер = Размер;
       Движения.Записать();
       Расчитать(отказ);
        //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    КонецПроцедуры

    Процедура Расчитать(Отказ)

        //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
        // Данный фрагмент построен конструктором.
        // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |   ДополнительныеНачисления.НомерСтроки,
            |   ДополнительныеНачисления.Размер,
            |   ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК База
            |ИЗ
            |   РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления
            |       ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаДополнительныеНачисления
            |       ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки
            |       ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления
            |       ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки";

         Измерения = Новый Массив;
         Измерения.Добавить("Сотрудник");
         Измерения.Добавить("Подразделение");
        Запрос.УстановитьПараметр("Измерения", Измерения);
        Запрос.УстановитьПараметр("Ссылка", Ссылка);
        Выборка = Запрос.Выполнить().Выбрать();
        Набор = Движения.ДополнительныеНачисления;
       
        Выборка.Следующий();
        Набор[0].Результат = Набор[0].Размер * Выборка.База/100;
        Набор.Записать(,Истина);

        //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
       

    КонецПроцедуры
    • Dobrenko Oleg 18.09.2012 в 15:39

      Не совсем согласен с вашими запросами. Внимательно изучите эталонное решение.

  2. Задание выполнил. 
    Использовал алгоритм, рассмотренный в видео-уроках. Ниже код:
     <code>
    Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    Движения.ОсновныеНачисления.Записывать = Истина;
    Движения.ДополнительныеНачисления.Записывать = Истина;
    Для Каждого ТекСтрокаНачисления Из Начисления Цикл
    Если ТипЗнч(ТекСтрокаНачисления.ВидРасчета) = Тип(“ПланВидовРасчетаСсылка.ОсновныеНачисления”) Тогда
    Движение = Движения.ОсновныеНачисления.Добавить();
    Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачалаНачисления;
    Движение.ПериодДействияКонец = ТекСтрокаНачисления.ДатаОкончанияНачисления;
    Если ТекСтрокаНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда
    Движение.ТипГрафика = Константы.Шестидневка.Получить();
    Иначе
    Движение.ТипГрафика = ТекСтрокаНачисления.ГрафикРаботы;
    КонецЕсли;
    ИначеЕсли ТипЗнч(ТекСтрокаНачисления.ВидРасчета) = Тип(“ПланВидовРасчетаСсылка.ДополнительныеНачисления”) Тогда
    Движение = Движения.ДополнительныеНачисления.Добавить();
    Иначе
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Неверный вид расчета”;
    Сообщение.Сообщить();
    Отказ = Истина;
    Продолжить;
    КонецЕсли;

    Движение.Сторно = Ложь;
    Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
    Движение.ПериодРегистрации = ПериодРегистрации;
    Движение.БазовыйПериодНачало = ТекСтрокаНачисления.НачалоБазовогоПериода;
    Движение.БазовыйПериодКонец = ТекСтрокаНачисления.ОкончаниеБазовогоПериода;
    Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
    Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
    Движение.Размер = ТекСтрокаНачисления.Размер;
    КонецЦикла;
    Движения.Записать();
    РасчетНачислений();

    КонецПроцедуры

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

    Измерения = Новый Массив;
    Измерения.Добавить(“Сотрудник”);
    Измерения.Добавить(“Подразделение”);
    Запрос.УстановитьПараметр(“Измерения”, Измерения);
    Запрос.УстановитьПараметр(“Регистратор”, Ссылка);

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

    ВыборкаДетальныхЗаписей = Результат.Выбрать();
    Отбор = Новый Структура(“НомерСтроки”);

    Для каждого Запись Из Движения.ОсновныеНачисления Цикл
    Отбор.НомерСтроки = Запись.НомерСтроки;
    ВыборкаДетальныхЗаписей.Сбросить();
    Если ВыборкаДетальныхЗаписей.НайтиСледующий(Отбор) Тогда
    ВидРасчета = Запись.ВидРасчета;
    Если ВидРасчета = Оклад Тогда
    Запись.Результат = ?(ВыборкаДетальныхЗаписей.ПланПериод = 0, 0, Запись.Размер * ВыборкаДетальныхЗаписей.ФактПериод / ВыборкаДетальныхЗаписей.ПланПериод * ?(Запись.Сторно, -1,1));
    ИначеЕсли ВидРасчета = Отпуск Тогда
    Запись.Результат = ?(ВыборкаДетальныхЗаписей.ПланПериод = 0, 0, ВыборкаДетальныхЗаписей.ФактПериод * ВыборкаДетальныхЗаписей.ЗначениеБаза / ВыборкаДетальныхЗаписей.БазаПериод * ?(Запись.Сторно, -1,1));
    ИначеЕсли ВидРасчета = Прогул Тогда
    Запись.Результат = 0;
    КонецЕсли;
    КонецЕсли;

    КонецЦикла;
    Движения.ОсновныеНачисления.Записать(,Истина);

    Запрос.Текст = “ВЫБРАТЬ
    | ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК ЗначениеБаза,
    | ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки, ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки) КАК НомерСтроки
    |ИЗ
    | РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Регистратор) КАК ДополнительныеНачисленияБазаДополнительныеНачисления
    | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Регистратор) КАК ДополнительныеНачисленияБазаОсновныеНачисления
    | ПО ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки”;

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

    ВыборкаДетальныхЗаписей = Результат.Выбрать();
    Отбор = Новый Структура(“НомерСтроки”);

    Для каждого Запись Из Движения.ДополнительныеНачисления Цикл
    Отбор.НомерСтроки = Запись.НомерСтроки;
    ВыборкаДетальныхЗаписей.Сбросить();
    Если ВыборкаДетальныхЗаписей.НайтиСледующий(Отбор) Тогда
    ВидРасчета = Запись.ВидРасчета;
    Если ВидРасчета = Премия Тогда
    Запись.Результат = Запись.Размер * ВыборкаДетальныхЗаписей.ЗначениеБаза / 100 * ?(Запись.Сторно, -1,1);
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    Движения.ОсновныеНачисления.Записать(,Истина);
    КонецПроцедуры</code>

    Долго ломал мозг, почему у меня при проведении результат не считался. Оказалось все бонально и просто: я документы начисления формировал за 2011 год, а графики за этот период заполнены не были.

    После выполнения задания просмотрел решение, упростил свой код, но так и не понял, почему у меня строка кода “Движения.Записать();” сработала, а в решении пришлось переписывать в “Движения.ОсновныеНачисления.Записать(); Движения.ДополнительныеНачисления.Записать();”. Дело в платформе? (8.2.13.219) 

     

    • Нет, дело не в платформе.

      Движения.Записать() выполняет запись наборов, так как это будет сделано в конце транзакции.
      То есть записываются те наборы записей, у которых свойство Записывать имеет значение Истина.
      При этом после выполнения данного действия флаг Записывать сбрасывается.

  3. Евгений, здравствуйте. Застопорился на выполнении 14 задания. Пишу уже две недели на support@spec8.ru. Мне перерегистрировать видео нужно. Проверьте, пожалуйста, дошли ли мои данные, а то я не могу курс лекций досмотреть.
    Спасибо заранее. 

  4. Задание выполнено
    http://www.imagepost.ru/?v=dz14_screen.png

  5. Добрые день.
    Проведение по регистру : для каждого вида расчета создана своя ветка алгоритма.  Необходимые значения фактических дней, всего количество дней, суммы начисленного за период реализованы запросом. С последующей обработкой результат запроса.
    начисленноПоОкладу = РазмерНачисления * фактическиеДни / колДнейПоПлану
    начисленноОтпуск = фактическиеДни * БазовоеНачислени / БазовоеКоличествоДней
    прогул соответственно = 0
    премия = вычисляется Величина % от базовогоНачисления
    Создал 3 документа с 01.01.2011 по 31.03.2011 с начислением по окладу.
    4-й документ начисление по окладу, отпуск, прогул и премия. оклад и прогу были вытеснены отпуском в соответсии с настройками ПлановВидовРасчётов.
    выгрузка ИБ

  6. Догоняю группу!
    Модуль “НачислитьЗП”: <code>
    Процедура ОбработкаПроведения(Отказ, РежимПроведения)

    Движения.ОсновныеНачисления.Записывать = Истина;
    Движения.ДополнительныеНачисления.Записывать = Истина;
    Для Каждого ТекСтрокаНачисления Из Начисления Цикл
    Если ТипЗНЧ(ТекСтрокаНачисления.ВидРасчета) = Тип(“ПланВидовРасчетаСсылка.ОсновныеНачисления”) Тогда

    Движение = Движения.ОсновныеНачисления.Добавить();
    Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
    Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
    Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
    Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
    Движение.ПериодДействияКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания);
    Движение.ПериодРегистрации = ПериодРегистрации;
    Движение.ТипГрафика = ?(ТекСтрокаНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск,Справочники.ТипыГрафиков.НайтиПоНаименованию(“Шестидневка”),ТекСтрокаНачисления.ГрафикРаботы);
    Движение.Размер = ТекСтрокаНачисления.ПлановыйРазмер;
    Движение.Сторно = ТекСтрокаНачисления.Сторно;
    Движение.БазовыйПериодНачало = ?(ТекСтрокаНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск,НачалоМесяца(ДобавитьМесяц(ТекСтрокаНачисления.ДатаНачала,-12)),0);
    Движение.БазовыйПериодКонец = ?(ТекСтрокаНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск,КонецМесяца(ДобавитьМесяц(ТекСтрокаНачисления.ДатаОкончания,-1)),0);
    Иначе
    Движение = Движения.ДополнительныеНачисления.Добавить();
    Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
    Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
    Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
    Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
    Движение.ПериодДействияКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания);
    Движение.ПериодРегистрации = ПериодРегистрации;
    Движение.БазовыйПериодНачало =НачалоМесяца(ДобавитьМесяц(ТекСтрокаНачисления.ДатаНачала,-3));
    Движение.БазовыйПериодКонец =КонецМесяца(ДобавитьМесяц(ТекСтрокаНачисления.ДатаОкончания,-1));
    Движение.Размер = ТекСтрокаНачисления.ПлановыйРазмер;
    Движение.Сторно = ТекСтрокаНачисления.Сторно;
    КонецЕсли;
    КонецЦикла;

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

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

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

    Поиск = Новый Структура(“НомерСтроки”);
    Набор = Движения.ОсновныеНачисления;
    НаборДоп = Движения.ДополнительныеНачисления;
    Оклад = ПланыВидовРасчета.ОсновныеНачисления.ОкладПоДням;
    Отпуск= ПланыВидовРасчета.ОсновныеНачисления.Отпуск;
    Премия= ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная;

    Для каждого Запись Из Набор Цикл

    Поиск.НомерСтроки = Запись.НомерСтроки;
    Выборка.Сбросить();
    Если Выборка.НайтиСледующий(Поиск) Тогда

    Если Выборка.ВидРасчета = Оклад Тогда
    Если Выборка.План=0 Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Нет данных графика”;
    Сообщение.Сообщить();
    Отказ = Истина;
    Иначе
    Запись.Результат = Выборка.Факт*Запись.Размер/Выборка.План*?(Запись.Сторно, -1, 1);
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;

    Набор.Записать(,Истина);

    Запрос.Текст = “ВЫБРАТЬ
    | ОсновныеНачисления.НомерСтроки,
    | ОсновныеНачисления.ВидРасчета,
    | ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК База
    |ИЗ
    | РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления
    | ПО ОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаДополнительныеНачисления
    | ПО ОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки
    |ГДЕ
    | ОсновныеНачисления.Регистратор = &Ссылка
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    | ДополнительныеНачисления.НомерСтроки,
    | ДополнительныеНачисления.ВидРасчета,
    | ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0)
    |ИЗ
    | РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаДополнительныеНачисления
    | ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления
    | ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки
    |ГДЕ
    | ДополнительныеНачисления.Регистратор = &Ссылка”;
    Измерения = Новый Массив;
    Измерения.Добавить(“Сотрудник”);
    Измерения.Добавить(“Подразделение”);
    Запрос.УстановитьПараметр(“Измерения”, Измерения);
    Выборка = Запрос.Выполнить().Выбрать();

    Для каждого Запись Из Набор Цикл

    Поиск.НомерСтроки = Запись.НомерСтроки;
    Выборка.Сбросить();
    Если Выборка.НайтиСледующий(Поиск) Тогда

    Если Выборка.ВидРасчета = Отпуск Тогда

    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | СУММА(ГрафикиРабот.Значение) КАК РабочиеДни
    |ИЗ
    | РегистрСведений.ГрафикиРабот КАК ГрафикиРабот
    |ГДЕ
    | ГрафикиРабот.ТипГрафика = &ТипГрафика
    | И ГрафикиРабот.Дата МЕЖДУ &ДатаНач И &ДатаКон”;

    Запрос.УстановитьПараметр(“ДатаКон”, Запись.БазовыйПериодКонец);
    Запрос.УстановитьПараметр(“ДатаНач”, Запись.БазовыйПериодНачало);
    Запрос.УстановитьПараметр(“ТипГрафика”, Запись.ТипГрафика);

    Результат = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = Результат.Выбрать();
    ВыборкаДетальныеЗаписи.Следующий();
    ДниОтпуска = ОпределитьКоличествоДнейОтпуска(Запись.ПериодДействияНачало,Запись.ПериодДействияКонец);
    Запись.Результат = Выборка.База*ДниОтпуска/ВыборкаДетальныеЗаписи.РабочиеДни*?(Запись.Сторно, -1, 1)
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    Поиск2 = Новый Структура(“ВидРасчета”);
    Для каждого ЗаписьДоп Из НаборДоп Цикл
    Поиск2.ВидРасчета = ЗаписьДоп.ВидРасчета;
    Выборка.Сбросить();
    Если Выборка.НайтиСледующий(Поиск2) Тогда

    Если Выборка.ВидРасчета = Премия Тогда
    ЗаписьДоп.Результат = Выборка.База*ЗаписьДоп.Размер/100*?(ЗаписьДоп.Сторно, -1, 1)
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;

    Набор.Записать(,Истина);
    НаборДоп.Записать(,Истина);
    КонецПроцедуры
    Функция ОпределитьКоличествоДнейОтпуска(ПериодДействияНачало,ПериодДействияКонец)
    Количество = 0;
    Счетчик = 24*3600;
    НачалоПериода = ПериодДействияНачало;
    КонецПериода = ПериодДействияКонец;
    Пока НачалоПериода < КонецПериода Цикл
    НачалоПериода = НачалоПериода + Счетчик;
    Количество = Количество +1;
    КонецЦикла;
    Возврат Количество-1;
    КонецФункции // ОпределитьКоличествоДнейОтпуска()

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

    Измерения = Новый Массив; Измерения.Добавить(“Сотрудник”); Измерения.Добавить(“Подразделение”); Запрос.УстановитьПараметр(“Измерения”, Измерения);
    Выборка = Запрос.Выполнить().Выбрать(); Для каждого Запись Из Набор Цикл Поиск.НомерСтроки = Запись.НомерСтроки; Выборка.Сбросить(); Если Выборка.НайтиСледующий(Поиск) Тогда Если Выборка.ВидРасчета = Отпуск Тогда Запрос = Новый Запрос; Запрос.Текст =  “ВЫБРАТЬ | СУММА(ГрафикиРабот.Значение) КАК РабочиеДни |ИЗ | РегистрСведений.ГрафикиРабот КАК ГрафикиРабот |ГДЕ | ГрафикиРабот.ТипГрафика = &ТипГрафика | И ГрафикиРабот.Дата МЕЖДУ &ДатаНач И &ДатаКон”; Запрос.УстановитьПараметр(“ДатаКон”, Запись.БазовыйПериодКонец); Запрос.УстановитьПараметр(“ДатаНач”, Запись.БазовыйПериодНачало); Запрос.УстановитьПараметр(“ТипГрафика”, Запись.ТипГрафика); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); ВыборкаДетальныеЗаписи.Следующий();  ДниОтпуска = ОпределитьКоличествоДнейОтпуска(Запись.ПериодДействияНачало,Запись.ПериодДействияКонец); Запись.Результат = Выборка.База*ДниОтпуска/ВыборкаДетальныеЗаписи.РабочиеДни*?(Запись.Сторно, -1, 1) КонецЕсли;  КонецЕсли;  КонецЦикла;  Поиск2 = Новый Структура(“ВидРасчета”); Для каждого ЗаписьДоп Из НаборДоп Цикл Поиск2.ВидРасчета = ЗаписьДоп.ВидРасчета; Выборка.Сбросить(); Если Выборка.НайтиСледующий(Поиск2) Тогда Если Выборка.ВидРасчета = Премия Тогда ЗаписьДоп.Результат = Выборка.База*ЗаписьДоп.Размер/100*?(ЗаписьДоп.Сторно, -1, 1) КонецЕсли;  КонецЕсли; КонецЦикла; Набор.Записать(,Истина); НаборДоп.Записать(,Истина);КонецПроцедуры
    Функция ОпределитьКоличествоДнейОтпуска(ПериодДействияНачало,ПериодДействияКонец) Количество = 0; Счетчик = 24*3600; НачалоПериода = ПериодДействияНачало; КонецПериода = ПериодДействияКонец; Пока НачалоПериода < КонецПериода Цикл НачалоПериода = НачалоПериода + Счетчик; Количество = Количество +1; КонецЦикла; Возврат Количество-1;КонецФункции // ОпределитьКоличествоДнейОтпуска()
    </code>
    Скажу честно, решение очень не оптимальное и некрасивое, но просто нет времени… Постараюсь зафиналится в срок.

  7.  
    1) .Опредилился с данными. В условии задачи «по всем начислениям ЗА 12 мес», значит в плане видов расчетов для отпуска необходима зависимость от базы по периоду действия. И далее все тоже по урокам. Расчет за апрель — оклад=2857,14; премия квартальная=3000; отпуск=633,80(база за 12 равна 30000, а плановое значение рабочих дней = 284)
    <code>
    Процедура ОбработкаПроведения(Отказ, Режим) // регистр ОсновныеНачисления Движения.ОсновныеНачисления.Записывать = Истина; Для Каждого ТекСтрокаНачисления Из Начисления Цикл Движение = Движения.ОсновныеНачисления.Добавить(); Движение.Сторно = ТекСтрокаНачисления.Сторно; Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета; Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник; Движение.Подразделение = ТекСтрокаНачисления.Подразделение; Движение.ТипГрафика = ТекСтрокаНачисления.ТипГрафика; Если ТекСтрокаНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.ОтпускОН Тогда Движение.БазовыйПериодНачало = НачалоДня(НачалоМесяца(ДобавитьМесяц(НачалоМесяца(ТекСтрокаНачисления.ДатаНачала), -13))); Движение.БазовыйПериодКонец = КонецДня(КонецМесяца(ДобавитьМесяц(НачалоМесяца(ТекСтрокаНачисления.ДатаОкончания), -1))); Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала; Движение.ПериодДействияКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания); Движение.ПериодРегистрации = ПериодРегистрации; ИначеЕсли ТекСтрокаНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Прогул Тогда Движение.БазовыйПериодНачало = НачалоДня(ТекСтрокаНачисления.ДатаНачала); Движение.БазовыйПериодКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания);
    Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала; Движение.ПериодДействияКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания); Движение.ПериодРегистрации = ПериодРегистрации; ИначеЕсли ТекСтрокаНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.ОкладПоДням Тогда Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала; Движение.ПериодДействияКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания); Движение.ПериодРегистрации = ПериодРегистрации; Иначе Сообщение = Новый СообщениеПользователю; Сообщение.Текст = “Неизвестный вид расчета “+ТекСтрокаНачисления.ВидРасчета; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Движение.Размер = ТекСтрокаНачисления.Размер; //временно //Движение.Результат = ТекСтрокаНачисления.Размер; КонецЦикла;
    // регистр Удержания Движения.Удержания.Записывать = Истина; Для Каждого ТекСтрокаУдержания Из Удержания Цикл Движение = Движения.Удержания.Добавить(); Движение.Сторно = ТекСтрокаУдержания.Сторно; Движение.ВидРасчета = ТекСтрокаУдержания.ВидРасчета; Движение.ПериодРегистрации = ПериодРегистрации; Движение.БазовыйПериодНачало = НачалоМесяца(ПериодРегистрации); Движение.БазовыйПериодКонец = КонецМесяца(ПериодРегистрации); Движение.Сотрудник = ТекСтрокаУдержания.Сотрудник; Движение.Подразделение = ТекСтрокаУдержания.Подразделение; Движение.Размер = ТекСтрокаУдержания.Размер; КонецЦикла;
    Движения.Записать();
    РасчитатьНачисления(Отказ); РасчитатьУдержания(Отказ);
    КонецПроцедуры
    Процедура РасчитатьНачисления(Отказ) ////// Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ОсновныеНачисленияДанныеГрафика.РаботатьИлиНетПериодДействия КАК План, | ОсновныеНачисленияДанныеГрафика.РаботатьИлиНетФактическийПериодДействия КАК Факт |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика”; //ТипГрафика еще у этом отчете необходимоуказывать?!?!?! Запрос.УстановитьПараметр(“Ссылка”, Ссылка); ВыборкаВремя = Запрос.Выполнить().Выбрать(); //база расчета Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ | ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки, ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК База |ИЗ | РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаДополнительныеНачисления | ПО ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки”; Измерения = Новый Массив; Измерения.Добавить(“Сотрудник”); Измерения.Добавить(“Подразделение”); Запрос.УстановитьПараметр(“Измерения”, Измерения); Запрос.УстановитьПараметр(“Ссылка”, Ссылка); Результат = Запрос.Выполнить(); ФлагОтсБазы = Ложь; Если Результат.Пустой() Тогда ФлагОтсБазы = Истина; КонецЕсли; //посмотрю что запрос вернул ТЧстроки = Результат.Выгрузить(); ВыборкаБаза = Результат.Выбрать(); ////// Поиск = Новый Структура(“НомерСтроки”); ДвиженияОН = Движения.ОсновныеНачисления; ОкладПоДням = ПланыВидовРасчета.ОсновныеНачисления.ОкладПоДням; Прогул = ПланыВидовРасчета.ОсновныеНачисления.Прогул; Отпуск = ПланыВидовРасчета.ОсновныеНачисления.ОтпускОН; Для каждого Запись Из ДвиженияОН Цикл Поиск.НомерСтроки = Запись.НомерСтроки; ВыборкаВремя.Сбросить(); Если ВыборкаВремя.НайтиСледующий(Поиск) Тогда Если Запись.ВидРасчета = ОкладПоДням Тогда Если НЕ ЗначениеЗаполнено(ВыборкаВремя.План) ИЛИ ВыборкаВремя.План=0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = “Нет плана по графику “+Запись.Сотрудник+” “+Запись.ВидРасчета; Сообщение.Сообщить(); Отказ = Истина; Иначе Запись.Результат = ВыборкаВремя.Факт*Запись.Размер/ВыборкаВремя.План*?(Запись.Сторно,-1,1); КонецЕсли; ИначеЕсли Запись.ВидРасчета = Прогул Тогда //прогул не оплачивается ИначеЕсли Запись.ВидРасчета = Отпуск Тогда //проверка базы Если ФлагОтсБазы Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = “Нет базы для расчета “+Запись.ВидРасчета;; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; //отработанное время факт надо вытягивать ПланЧасы = КоличествоПланЧасов(Запись.БазовыйПериодНачало, Запись.БазовыйПериодКонец, Справочники.ТипыГрафиковРаботы.НайтиПоНаименованию(“6 дней в неделю”)); Если ПланЧасы=0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = “Нет плана по графику “+Запись.Сотрудник+” “+Запись.ВидРасчета; Сообщение.Сообщить(); Отказ = Истина; Иначе ВыборкаБаза.Сбросить(); Если ВыборкаБаза.НайтиСледующий(Поиск) Тогда //а вот здесь база не удвояится?!?! – а если Отпуск в ДопНач удвояится //Запись.Результат = ВыборкаБаза.База*ВыборкаВремя.Факт/(2*ПланЧасы)*?(Запись.Сторно,-1,1); Запись.Результат = ВыборкаБаза.База*ВыборкаВремя.Факт/ПланЧасы*?(Запись.Сторно,-1,1); Иначе Сообщение = Новый СообщениеПользователю; Сообщение.Текст = “Нет базы для расчета “+Запись.ВидРасчета;; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли КонецЕсли; Иначе Сообщение = Новый СообщениеПользователю; Сообщение.Текст = “Неизвестный вид расчета “+Запись.ВидРасчета; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли;
    КонецЕсли; КонецЦикла; ДвиженияОН.Записать(,Истина); КонецПроцедуры
    Процедура РасчитатьУдержания(Отказ) Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ | ЕСТЬNULL(УдержанияБазаДополнительныеНачисления.НомерСтроки, УдержанияБазаОсновныеНачисления.НомерСтроки) КАК НомерСтроки, | ЕСТЬNULL(УдержанияБазаДополнительныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(УдержанияБазаОсновныеНачисления.РезультатБаза, 0) КАК База |ИЗ | РегистрРасчета.Удержания.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК УдержанияБазаОсновныеНачисления | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.Удержания.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК УдержанияБазаДополнительныеНачисления | ПО УдержанияБазаОсновныеНачисления.НомерСтроки = УдержанияБазаДополнительныеНачисления.НомерСтроки”;
    Измерения = Новый Массив; Измерения.Добавить(“Сотрудник”); Измерения.Добавить(“Подразделение”); Запрос.УстановитьПараметр(“Измерения”, Измерения); Запрос.УстановитьПараметр(“Ссылка”, Ссылка); Выборка = Запрос.Выполнить().Выбрать();
    Поиск = Новый Структура(“НомерСтроки”); ДвиженияУ = Движения.Удержания; Подоходный = ПланыВидовРасчета.ОсновныеУдержания.Подоходный; Для каждого Запись Из ДвиженияУ Цикл Поиск.НомерСтроки = Запись.НомерСтроки; Выборка.Сбросить(); Если Выборка.НайтиСледующий(Поиск) Тогда Если Запись.ВидРасчета = Подоходный Тогда Если ЗначениеЗаполнено(Выборка.База) Тогда Запись.Результат = Выборка.База*Запись.Размер/100*?(Запись.Сторно,-1,1); КонецЕсли; Иначе Сообщение = Новый СообщениеПользователю; Сообщение.Текст = “Неизвестный вид расчета “+Запись.ВидРасчета; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли;
    КонецЕсли; КонецЦикла; ДвиженияУ.Записать(,Истина); КонецПроцедуры
    Функция КоличествоПланЧасов(ДатаНачало, ДатаОконч, График) Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ | СУММА(ЕСТЬNULL(ГрафикиРаботы.РаботатьИлиНет, 0)) КАК План, | Количество(ГрафикиРаботы.ТипГрафика) КАК ДнейПоПлану, | ГрафикиРаботы.ТипГрафика КАК ТипГрафика |ИЗ | РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы |ГДЕ | ГрафикиРаботы.Активность | И ГрафикиРаботы.ТипГрафика = &ТипГрафика | И ГрафикиРаботы.Дата >= &ДатаНач | И ГрафикиРаботы.Дата <= &ДатаКон | |СГРУППИРОВАТЬ ПО | ГрафикиРаботы.ТипГрафика”; Запрос.УстановитьПараметр(“Активность”, Истина); Запрос.УстановитьПараметр(“ДатаНач”, ДатаНачало); Запрос.УстановитьПараметр(“ДатаКон”, ДатаОконч); Запрос.УстановитьПараметр(“ТипГрафика”, График); Результат = Запрос.Выполнить(); Если НЕ Результат.Пустой() Тогда //посмотрю что запрос вернул ТЧстроки = Результат.Выгрузить(); КонецЕсли; ПланЧасы = 0; Если НЕ Результат.Пустой() Тогда ВыборкаДетальныеЗаписи = Результат.Выбрать(); ВыборкаДетальныеЗаписи.Следующий(); Если ЗначениеЗаполнено(ВыборкаДетальныеЗаписи.План) И ЗначениеЗаполнено(ВыборкаДетальныеЗаписи.ДнейПоПлану) И ВыборкаДетальныеЗаписи.ДнейПоПлану=(ДатаОконч+1-датаначало)/(3600*24)Тогда //еще за прошлые 12 месяцев могло не быть записей о плановых днях графика ПланЧасы = ВыборкаДетальныеЗаписи.План; КонецЕсли; Иначе //нет плана по графику КонецЕсли; Возврат ПланЧасы; КонецФункции </code>
     

     

  8. Продолжаю догонять (
    Вследствие того, что тема расчета ЗП для меня вообще новая, уроки смотрел по два, а некоторые по три раза + делал конспект. Из-за этого двигаюсь еще медленнее, чем рассчитывал, но и при выполнении затруднений не возникло. Для разовых начислений я не стал делать отдельный документ, но из-за привязки движений регистра к строкам и привязанного к этому алгоритма, разовое начисление (премия) делал вторым документом за апрель.
    По итогам 2011 года за апрель:
    – оклад: 2857.14
    – отпуск: 1730.77
    – премия: 3000.00
    По итогам 2010 года за апрель:
    – оклад: 3181.82
    – отпуск: 1736.33
    – премия: 3000.00

  9. Задание выполнила.
    Основные проблемы возникли при получении базы для отпуска,  пыталась задавать базовый период в запросе, пересмотрев видео сделала выводы.
    Код документа “Начисление ЗП”
    <code> 
    Процедура ОбработкаПроведения(Отказ, Режим)
    Движения.ОсновныеНачисления.Записывать = Истина;
    Движения.ДополнительныеНачисления.Записывать = Истина;

    Для Каждого ТекСтрокаНачисления Из Начисления Цикл
    Если ТекСтрокаНачисления.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная  Тогда
    Движение = Движения.ДополнительныеНачисления.Добавить();
    Движение.Сторно = Ложь;
    Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
    Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
    Движение.ПериодДействияКонец = ТекСтрокаНачисления.ДатаОкончания;
    Движение.ПериодРегистрации = ПериодРегистрации;
    Движение.БазовыйПериодНачало = ДобавитьМесяц(ПериодРегистрации,-3);
    Движение.БазовыйПериодКонец  = КонецМесяца(ДобавитьМесяц(ПериодРегистрации,-1));
    Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
    Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
    Движение.Размер = ТекСтрокаНачисления.Размер;            
    Иначе
    Движение = Движения.ОсновныеНачисления.Добавить();
    Движение.Сторно = Ложь;
    Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
    Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
    Движение.ПериодДействияКонец = ТекСтрокаНачисления.ДатаОкончания;
    Движение.ПериодРегистрации = ПериодРегистрации;
    Если ТекСтрокаНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда
    Движение.БазовыйПериодНачало = ДобавитьМесяц(ТекСтрокаНачисления.ДатаНачала,-13);
    Движение.БазовыйПериодКонец  = ДобавитьМесяц(ТекСтрокаНачисления.ДатаНачала,-1);
    Иначе                    
    Движение.БазовыйПериодНачало = ТекСтрокаНачисления.ДатаНачала;
    Движение.БазовыйПериодКонец = ТекСтрокаНачисления.ДатаОкончания;
    КонецЕсли;

    Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
    Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
    Движение.Размер = ТекСтрокаНачисления.Размер;
    Движение.ТипГрафика = ТекСтрокаНачисления.ТипГрафика;

    КонецЕсли;
    КонецЦикла;

    Движения.Записать();    
    РассчитатьОсновныеНачисления(Отказ);
    РассчитатьДополнительныеНачисления(Отказ);
    КонецПроцедуры

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

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

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

    Пока РезЗапроса.НайтиСледующий(СтруктураОтбора) Цикл
    Если СтрокаНабора.ВидРасчета = ОкладПоДням Тогда
    Если Не ЗначениеЗаполнено(РезЗапроса.План) Тогда
    Сообщить(“Ошибка в графике расчета”);
    Отказ = Истина;
    КонецЕсли;

    СтрокаНабора.Результат = РезЗапроса.Факт*СтрокаНабора.Размер/РезЗапроса.План;
    ИначеЕсли СтрокаНабора.ВидРасчета = Прогул Тогда    
    СтрокаНабора.Результат = 0;
    ИначеЕсли СтрокаНабора.ВидРасчета = Отпуск Тогда
    СтрокаНабора.Результат = РезЗапроса.План*РезЗапроса.РезультатБаза/РезЗапроса.База;
    КонецЕсли;         
    КонецЦикла;
    КонецЦикла;

    ОсновныеНачисления.Записать(,Истина);

    КонецПроцедуры    

    Процедура РассчитатьДополнительныеНачисления(Отказ)

    Премия = ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная;    
    Запрос = Новый Запрос;
    Запрос.Текст = “ВЫБРАТЬ
    |    ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза,
    |    ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки, ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки
    |ИЗ
    |    РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(
    |            &Измерения,
    |            &Измерения,
    |            ,
    |            Регистратор = &Ссылка
    |                И ВидРасчета = &Премия) КАК ОсновныеНачисленияБазаДополнительныеНачисления
    |        ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(
    |                &Измерения,
    |                &Измерения,
    |                ,
    |                Регистратор = &Ссылка
    |                    И ВидРасчета = &Премия) КАК ОсновныеНачисленияБазаОсновныеНачисления
    |        ПО ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки”;
    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
    Запрос.УстановитьПараметр(“Премия”,Премия);
    Измерения = Новый Массив;
    Измерения.Добавить(“Подразделение”);
    Измерения.Добавить(“Сотрудник”);
    Запрос.УстановитьПараметр(“Измерения”,Измерения);

    РезЗапроса = Запрос.Выполнить().Выбрать();
    ДополнительныеНачисления = Движения.ДополнительныеНачисления;
    СтруктураОтбора = Новый Структура;

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

    Пока РезЗапроса.НайтиСледующий(СтруктураОтбора) Цикл
    Если СтрокаНабора.ВидРасчета = Премия Тогда
    СтрокаНабора.Результат = РезЗапроса.РезультатБаза*СтрокаНабора.Размер/100;
    КонецЕсли;         
    КонецЦикла;
    КонецЦикла;

    ДополнительныеНачисления.Записать(,Истина);

    КонецПроцедуры    

    </code>

  10. Задание выполнил, проблем не возникло.
    Только когда делал делал универсально: вид премии сразу сделал перечислением, потом когда делал 15 пригодилось :)

  11. Задание выполнено.
    Для того, чтобы, при начислении отпуска, согласно условию задания, гарантированно расчет проходил для графика шестидневка, в модуле формы документа «НачислениеЗаработнойПлаты» написан код: http://paste.org.ru/?2b8n8f
    Долго соображал, какой из регистров расчета двигать в документе «НачислениеЗаработнойПлаты» – «ОсновныеНачисления» или «ДополнительныеНачисления». После того, как с этим вопросом разобрался – дальше все пошло легче.
    Все расчеты вел в модуле объекта документа «НачислениеЗаработнойПлаты»: http://paste.org.ru/?kn54n5

  12. Задание выполнено. Записал рабочие наборы записей. Далее для основных начислений делаю запрос по данным графика, обхожу выборку в цикле. Прогул рассчитывается всегда как начисление с нулевой суммой. Оклад – пропорционально отработанному времени с учетом вытеснений. Поскольку особых требований к реализации алгоритмов нет, поэтому для расчета отпусков сделал еще один запрос – обращение к базе. Предварительно в рабочий набор записей добавляется для отпуска значения базового периода. Если обход осн. начислений попадает на отпуск, то через НайтиСледующий из второго запроса выбирается значение базы, в отдельной функции рассчитывается норма по шестидневке базового периода. Производится расчет как: База * ФактическоеВремяОтпуска / ПлановоеВремяБазовогоПериода.Для дополнительных начислений также формируется обход выборки запроса по базе. Предварительно в рабочий набор записей для премии заполняется значения базового периода. Т.е. расчет аналогичен расчету отпуска. В формуле расчета вместо ФактическогоВремениОтпуска берется ЗначениеПроцента(Размер)/100. Все виды расчета учитывают признак Сторно.

  13. Надежда 20.06.2011 в 01:58

    Задание сделано. результаты расчетов в апреле: оклад – 3076,92 ; простой – 0 ; премия – 3000, отпуск – 1785,89.  Пришлось потрудиться для расчета отпуска: не сразу получилось догадаться, как объединять данные таблиц по базам  с ДаннымиГрафика. Последовательность расчетов после предварительного заполнения движений регистра: сначала расчет оклада (с учетом вытеснений), затем расчет КвартальнойПремии, затем расчет Отпускных (базовый период для расчета отпуска взят с 03.04.2010 по 04.04.2011)
    Вопрос: каким образом можно получать данные вирт. таблиц по базам, пользуясь консолью (сложность с выставлением обязательных параметров по измерениям: как передать через консоль массив?)
     

  14. Лучше поздно, чем никогда.
    Задание выполнил. Полученные данные за апрель 2011:
    Оклад – 3 076,92
    Отпуск – 1 725,24
    Премия – 3000
    Прогул – 0.
    При записи первичных движений указывал базовый период расчета:
    Если ТекСтрокаОсновныеНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда
    Движение.БазовыйПериодНачало = НачалоМесяца(ДобавитьМесяц(ТекСтрокаОсновныеНачисления.ПериодНачисленияНачало,-12));
    Движение.БазовыйПериодКонец = КонецМесяца(ДобавитьМесяц(ТекСтрокаОсновныеНачисления.ПериодНачисленияНачало,-1))
    КонецЕсли;
    Если ТекСтрокаДополнительныеНачисления.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная Тогда
    Движение.БазовыйПериодНачало = НачалоКвартала(ДобавитьМесяц(ТекСтрокаДополнительныеНачисления.ПериодНачисленияНачало,-3));
    Движение.БазовыйПериодКонец = КонецКвартала(ДобавитьМесяц(ТекСтрокаДополнительныеНачисления.ПериодНачисленияНачало,-3));
    КонецЕсли;    

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

    Оклад = ПланыВидовРасчета.ОсновныеНачисления.ОкладПоДням;
    Отпуск = ПланыВидовРасчета.ОсновныеНачисления.Отпуск;
    Прогул = ПланыВидовРасчета.ОсновныеНачисления.Прогул;

    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
    Запрос.УстановитьПараметр(“Отпуск”, Отпуск);
    Измерения = Новый Массив;
    Измерения.Добавить(“Сотрудник”);
    Измерения.Добавить(“Подразделение”);
    Запрос.УстановитьПараметр(“Измерения”,Измерения);

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

    Поиск = Новый Структура(“НомерСтроки”);
    Для каждого Запись Из Движения.РегистрОсновныхНачислений Цикл
    Сторно = ?(Запись.Сторно, -1, 1);
    Таблица.Сбросить();
    Поиск.НомерСТроки = Запись.НомерСтроки;
    Если Таблица.НайтиСледующий(Поиск) Тогда
    План = Таблица.План;
    Если Запись.ВидРасчета = Оклад Тогда
    Если План <> 0 Тогда
    Запись.Результат = Таблица.Факт*Запись.ПлановыйРазмер/План*Сторно;
    КонецЕсли;
    ИначеЕсли Запись.ВидРасчета = Отпуск Тогда
    Если Таблица.РабочийДеньБазовыйПериод <> 0 Тогда
    Запись.Результат = Таблица.Факт*Таблица.База/Таблица.РабочийДеньБазовыйПериод*Сторно;
    КонецЕсли;

    ИначеЕсли Запись.ВидРасчета = Прогул Тогда
    Иначе
    Сообщение = Новый СообщениеПользователю();
    Сообщение.Текст = “Неизвестный вид расчета”;
    Сообщение.Поле = “ОсновныеНачисления.ВидРасчета”;
    Сообщение.УстановитьДанные(Запись.ВидРасчета);
    Сообщение.Сообщить();
    КонецЕсли;    
    КонецЕсли;    

    Движения.РегистрОсновныхНачислений.Записать(,Истина);
    КонецЦикла;

    КонецПроцедуры    

    Долго мучился с распределением видов расчетов на ведущие, вытесняющие.. Что-то получилось, но вопросы остались. Надеюсь – решение ДЗ даст на них ответы…

  15. Задание выполнил. Мои тестовые данные:
    оклад  – 2857.14, отпуск – 2012.78, прогул -0, премия 3000.
    Рабочие дни для расчета отпуска брал по полю ЗначениеБазовыйПериод для записи Отпуск.

  16. Дмитрий 19.06.2011 в 02:50

    Задание выполнил.

    //Модуль документа НачислениеЗаработнойПлаты
    <code>
    Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    НаборЗаписейОсновныеНачисления = Движения.ОсновныеНачисления;
    НаборЗаписейДополнительныеНачисления = Движения.ДополнительныеНачисления;
     
    НаборЗаписейОсновныеНачисления.Записывать = Истина;
    НаборЗаписейДополнительныеНачисления.Записывать = Истина;
     
    Для Каждого ТекСтрока Из Начисления Цикл
    Если ТипЗнч(ТекСтрока.ВидРасчета) = Тип(“ПланВидовРасчетаСсылка.ДополнительныеНачисления”) Тогда
    Запись = НаборЗаписейДополнительныеНачисления.Добавить();
    Иначе
    Запись = НаборЗаписейОсновныеНачисления.Добавить();
    Запись.ПериодДействияНачало = НачалоДня(ТекСтрока.ДатаНачала);
    Запись.ПериодДействияКонец = КонецДня(ТекСтрока.ДатаОкончания);
    Запись.ТипГрафика = ТекСтрока.ТипГрафика;
    КонецЕсли;
     
    Запись.ВидРасчета = ТекСтрока.ВидРасчета;
    Запись.ПериодРегистрации = ПериодРегистрации;
    Запись.БазовыйПериодНачало = НачалоМесяца(ТекСтрока.ДатаНачалаБазовогоПериода);
    Запись.БазовыйПериодКонец = ?(ЗначениеЗаполнено(ТекСтрока.ДатаОкончанияБазовогоПериода), КонецМесяца(ТекСтрока.ДатаОкончанияБазовогоПериода), ТекСтрока.ДатаОкончанияБазовогоПериода);
    Запись.Сотрудник = ТекСтрока.Сотрудник;
    Запись.Подразделение = ТекСтрока.Подразделение;
    Запись.ПлановыйРазмер = ТекСтрока.ПлановыйРазмер;
    КонецЦикла;
     
    Движения.Записать();
     
    РасcчитатьОсновныеНачисления(Отказ);
    РасcчитатьДополнительныеНачисления(Отказ);
     
    КонецПроцедуры
    Процедура ОбработкаПроведения(Отказ, РежимПроведения)  НаборЗаписейОсновныеНачисления = Движения.ОсновныеНачисления; НаборЗаписейДополнительныеНачисления = Движения.ДополнительныеНачисления;  НаборЗаписейОсновныеНачисления.Записывать = Истина; НаборЗаписейДополнительныеНачисления.Записывать = Истина;  Для Каждого ТекСтрока Из Начисления Цикл Если ТипЗнч(ТекСтрока.ВидРасчета) = Тип(“ПланВидовРасчетаСсылка.ДополнительныеНачисления”) Тогда Запись = НаборЗаписейДополнительныеНачисления.Добавить(); Иначе Запись = НаборЗаписейОсновныеНачисления.Добавить(); Запись.ПериодДействияНачало = НачалоДня(ТекСтрока.ДатаНачала); Запись.ПериодДействияКонец = КонецДня(ТекСтрока.ДатаОкончания); Запись.ТипГрафика = ТекСтрока.ТипГрафика; КонецЕсли;  Запись.ВидРасчета = ТекСтрока.ВидРасчета; Запись.ПериодРегистрации = ПериодРегистрации; Запись.БазовыйПериодНачало = НачалоМесяца(ТекСтрока.ДатаНачалаБазовогоПериода); Запись.БазовыйПериодКонец = ?(ЗначениеЗаполнено(ТекСтрока.ДатаОкончанияБазовогоПериода), КонецМесяца(ТекСтрока.ДатаОкончанияБазовогоПериода), ТекСтрока.ДатаОкончанияБазовогоПериода); Запись.Сотрудник = ТекСтрока.Сотрудник; Запись.Подразделение = ТекСтрока.Подразделение; Запись.ПлановыйРазмер = ТекСтрока.ПлановыйРазмер; КонецЦикла;  Движения.Записать();  РасcчитатьОсновныеНачисления(Отказ); РасcчитатьДополнительныеНачисления(Отказ); КонецПроцедуры
    Процедура РасcчитатьОсновныеНачисления(Отказ)
     
    НаборЗаписейОсновныеНачисления = Движения.ОсновныеНачисления;
     
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | ОсновныеНачисления.ВидРасчета,
    | ОсновныеНачисления.ПериодДействия,
    | ОсновныеНачисления.НомерСтроки
    |        ПОМЕСТИТЬ ТаблицаДвижений    |ИЗ    |         РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления    |ГДЕ |         ОсновныеНачисления.Регистратор = &Регистратор          |;        |///////////////////////////////////////////////////////////////////////   |ВЫБРАТЬ |   ТаблицаДвижений.НомерСтроки,    |         СУММА(ЕСТЬNULL(ГрафикиРасчета.Значение,0)*8) КАК КоличествоРабЧасов     |         ПОМЕСТИТЬ ТаблицаРабВремениЗаПредыдущийГод         |ИЗ    |         ТаблицаДвижений КАК ТаблицаДвижений       |   ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРасчета КАК ГрафикиРасчета      |                  ПО ТаблицаДвижений.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Отпуск)     |                           И НАЧАЛОПЕРИОДА(ГрафикиРасчета.Дата, МЕСЯЦ) < ТаблицаДвижений.ПериодДействия          |                           И НАЧАЛОПЕРИОДА(ГрафикиРасчета.Дата, МЕСЯЦ) >= ДОБАВИТЬКДАТЕ(ТаблицаДвижений.ПериодДействия, МЕСЯЦ, -12) |ГДЕ |         ТаблицаДвижений.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Отпуск)     |СГРУППИРОВАТЬ ПО          |         ТаблицаДвижений.НомерСтроки     |;          |///////////////////////////////////////////////////////////////////////   |ВЫБРАТЬ
    |        ТаблицаДвижений.НомерСтроки,
    |        ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия, 0) КАК План,          |         ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК Факт,       |   ЕСТЬNULL(БазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(БазаДополнительныеНачисления.РезультатБаза, 0) КАК База,      |   ЕСТЬNULL(ТаблицаРабВремениЗаПредыдущийГод.КоличествоРабЧасов, 0) КАК КоличествоРабЧасовЗаПредыдущийГод   |ИЗ    |         ТаблицаДвижений КАК ТаблицаДвижений        |         ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Регистратор) КАК ОсновныеНачисленияДанныеГрафика      |         ПО ТаблицаДвижений.НомерСтроки = ОсновныеНачисленияДанныеГрафика.НомерСтроки   |                           И ТаблицаДвижений.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.ОкладПоДням)   |         ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(    |            &Измерения,        |            &Измерения,    |            ,     |            Регистратор = &Регистратор          |                                     И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Отпуск)) КАК БазаОсновныеНачисления      |                  ПО ТаблицаДвижений.НомерСтроки = БазаОсновныеНачисления.НомерСтроки  |         ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(         |            &Измерения,        |            &Измерения,    |            ,     |            Регистратор = &Регистратор          |                                     И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Отпуск)) КАК БазаДополнительныеНачисления     |                  ПО ТаблицаДвижений.НомерСтроки = БазаДополнительныеНачисления.НомерСтроки           |   ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаРабВремениЗаПредыдущийГод КАК ТаблицаРабВремениЗаПредыдущийГод        |            ПО ТаблицаДвижений.НомерСтроки = ТаблицаРабВремениЗаПредыдущийГод.НомерСтроки          |”;      МассивИзмерений = Новый Массив;      МассивИзмерений.Добавить(“Сотрудник”);          МассивИзмерений.Добавить(“Подразделение”);          Запрос.УстановитьПараметр(“Измерения”, МассивИзмерений);               Запрос.УстановитьПараметр(“Регистратор”, Ссылка);          ТаблицаДвижений = Запрос.Выполнить().Выгрузить();             Для Каждого Запись Из НаборЗаписейОсновныеНачисления Цикл                                      НайденнаяСтрока = ТаблицаДвижений.Найти(Запись.НомерСтроки, “НомерСтроки”);                    Если НЕ ЗначениеЗаполнено(НайденнаяСтрока) тогда                        Возврат;               КонецЕсли;                                       Если Запись.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.ОкладПоДням Тогда                                                  Если НайденнаяСтрока.План = 0 Тогда                                 Сообщение = Новый СообщениеПользователю;                                  Сообщение.Текст = “Не заполнен график.”;                                       Сообщение.Сообщить();                                                                          Отказ = Истина;                      Иначе                                     Запись.Результат = НайденнаяСтрока.Факт*Запись.ПлановыйРазмер/НайденнаяСтрока.План;                         КонецЕсли;                                                ИначеЕсли Запись.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Прогул Тогда                                                   Запись.Результат = 0;                                          ИначеЕсли Запись.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда                       Если НайденнаяСтрока.КоличествоРабЧасовЗаПредыдущийГод = 0 Тогда                                  Сообщение = Новый СообщениеПользователю;                                      Сообщение.Текст = “Не заполнен график за предыдущие 12 месяцев.”;                              Сообщение.Сообщить();                                                                           Отказ = Истина;                             Иначе                                     Запись.Результат = НайденнаяСтрока.База/НайденнаяСтрока.КоличествоРабЧасовЗаПредыдущийГод;                              КонецЕсли;                   Иначе                                    Сообщение = Новый СообщениеПользователю;                         Сообщение.Текст = “Неизветный вид расчета – ” + Строка(Запись.ВидРасчета);                      Сообщение.Сообщить();                                                        Отказ = Истина;            КонецЕсли;                            КонецЦикла;
    НаборЗаписейОсновныеНачисления.Записать(, Истина);      КонецПроцедуры

    Процедура РасcчитатьДополнительныеНачисления(Отказ)             НаборЗаписейДополнительныеНачисления = Движения.ДополнительныеНачисления;                                    Запрос = Новый Запрос;         Запрос.Текст =     “ВЫБРАТЬ          |   ДополнительныеНачисления.НомерСтроки,       |   ЕСТЬNULL(БазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(БазаДополнительныеНачисления.РезультатБаза, 0) КАК База       |ИЗ    |         РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления       |         ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(         |            &Измерения,        |            &Измерения,    |            ,     |            Регистратор = &Регистратор          |                                     И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.ПремияКвартальная)) КАК БазаОсновныеНачисления      |                  ПО ДополнительныеНачисления.НомерСтроки = БазаОсновныеНачисления.НомерСтроки  |         ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(        |            &Измерения,        |            &Измерения,    |            ,     |            Регистратор = &Регистратор          |                                     И ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ДополнительныеНачисления.ПремияКвартальная)) КАК БазаДополнительныеНачисления     |                  ПО ДополнительныеНачисления.НомерСтроки = БазаДополнительныеНачисления.НомерСтроки        |”;      МассивИзмерений = Новый Массив;      МассивИзмерений.Добавить(“Сотрудник”);          МассивИзмерений.Добавить(“Подразделение”);          Запрос.УстановитьПараметр(“Измерения”, МассивИзмерений);               Запрос.УстановитьПараметр(“Регистратор”, Ссылка);          ТаблицаДвижений = Запрос.Выполнить().Выгрузить();    Для Каждого Запись Из НаборЗаписейДополнительныеНачисления Цикл                                     НайденнаяСтрока = ТаблицаДвижений.Найти(Запись.НомерСтроки, “НомерСтроки”);                    Если НЕ ЗначениеЗаполнено(НайденнаяСтрока) тогда                        Возврат;               КонецЕсли;                                       Если Запись.ВидРасчета = ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная Тогда                     Запись.Результат = Запись.ПлановыйРазмер*НайденнаяСтрока.База/100;                          Иначе                                    Сообщение = Новый СообщениеПользователю;                             Сообщение.Текст = “Неизветный вид расчета – ” + Строка(Запись.ВидРасчета);                             Сообщение.Сообщить();                                                        Отказ = Истина;                    КонецЕсли;                            КонецЦикла;                  НаборЗаписейДополнительныеНачисления.Записать(, Истина);      КонецПроцедуры
    </code>

    • Дмитрий 19.06.2011 в 02:51

      Помучился со следующими вещами:

      Долго искал ошибку, связанную с получением данных графика для основных начислений. При получении данных, получалось, что график не заполнен. Оказалось, что измерение Дата в регистре сведений имело тип “Строка”. Если бы при указании этого измерения в качестве “ДатаГрафика” для регистра “ОсновныеНачисления” платформа отслеживала соответствие типов было бы конечно легче.

      При выполнении расчета для регистра “ОсновныеНачисления” решил схитрить и получить в результате запроса не только данные графика и базы но и сделанные на первом этапе движения по регистру. Потом выгрузить в таблицу, рассчитать результат для всех записей и загрузить в набор. Но при попытке записи движений с параметром ТолькоЗапись = Истина ругнулось и сообщило, что необходимо рассчитать фактический период. Не совсем понятно почему, но больше так делать не буду. :0)

      • >Не совсем понятно почему, но больше так делать не буду.
        Потому что при добавлении новых записей в набор необходимо выполнить расчет фактического периода действия.
        Вы заполняете набор записей из таблицы значений (полученной из запроса). То есть по сути удаляете из набора старые записи и добавляете новые.

        • Дмитрий 19.06.2011 в 10:18

          Понятно. Думал, если записи идентичны, то пройдет. Спасибо.

  17. Задание выполнено.
    Запись плановых наборов записей сделана в одном цикле, разница в базовых периодах. Далее процедуры для расчета Основных начислений и Дополнительных начислений. Для расчета Отпуска сделала отдельную функцию с запросом к виртуальным таблицам ОсновныеНачисления.ДанныеГрафика    ЛЕВОЕ СОЕДИНЕНИЕ ОсновныеНачисления.БазаОсновныеНачисления.
    Для расчета премии сделала запрос к виртульным таблицам ДополнительныеНачисленияБазаОсновныеНачисления
    ПОЛНОЕ СОЕДИНЕНИЕ ДополнительныеНачисления.БазаДополнительныеНачисления.
    Результат : премия – 3000;
    оклад – 3076,92;
    отпуск – 1588,24.
     

  18. Светлана 18.06.2011 в 11:02

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

  19. kuznetsovimail 17.06.2011 в 23:48

    За апрель 2010
    Оклад 3076.92
    Отпуск 1725.24
    Премия 3000
    совершенно не нравится что два запроса в одной процедуре, но лучше ничего не придумал :(((
    <code>

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

    ИначеЕсли ТипЗнч(ТекСтрока.ВидРасчета)=Тип(“ПланВидовРасчетаСсылка.ДополнительныеНачисления”) тогда
    Движение=Движения.ДополнительныеНачисления.Добавить();
    Движение.ВидРасчета=ТекСтрока.ВидРасчета;
    Движение.ПериодРегистрации=ПериодРегистрации;
    Движение.Сотрудник=ТекСтрока.Сотрудник;
    Движение.Подразделение=ТекСтрока.Подразделение;
    Движение.Размер=ТекСтрока.Размер;
    КонецЕсли;

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

    Если Выборка.НайтиСледующий(Поиск) Тогда
    Если Выборка.План=0 тогда
    Сообщить(“Нет данных графика.”);
    Отказ=Истина;
    Иначе
    Если Запись.ВидРасчета=ПланыВидовРасчета.ОсновныеНачисления.ОкладПоДням Тогда
    Запись.Результат=Выборка.Факт*Запись.Размер/Выборка.План;
    ИначеЕсли Запись.ВидРасчета=ПланыВидовРасчета.ОсновныеНачисления.Прогул Тогда
    Запись.Результат=0;
    ИначеЕсли Запись.ВидРасчета=ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда
    Запрос=Новый Запрос;
    Запрос.Текст= “ВЫБРАТЬ
    | СУММА(ОсновныеНачисления.Результат) КАК Результат,
    | NULL КАК Значение
    |ИЗ
    | РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления
    |ГДЕ
    | ОсновныеНачисления.Сотрудник = &Сотрудник
    | И ОсновныеНачисления.Подразделение = &Подразделение
    | И ОсновныеНачисления.ПериодДействияКонец <= &ПериодДействияКонец
    | И ОсновныеНачисления.ПериодДействияНачало >= &ПериодДействияНачало
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    | NULL,
    | СУММА(ГрафикиРаботы.Значение)
    |ИЗ
    | РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
    |ГДЕ
    | ГрафикиРаботы.ТипГрафика = &ТипГрафика
    | И ГрафикиРаботы.Дата <= &ПериодДействияКонец
    | И ГрафикиРаботы.Дата >= &ПериодДействияНачало” ;
    КонецПер=НачалоМесяца(Запись.ПериодДействияНачало)-1;
    Запрос.УстановитьПараметр(“ПериодДействияНачало”,ДобавитьМесяц(КонецПер,-12)+1);
    Запрос.УстановитьПараметр(“ПериодДействияКонец”,КонецПер);
    Запрос.УстановитьПараметр(“Сотрудник”,Запись.Сотрудник);
    Запрос.УстановитьПараметр(“Подразделение”,Запись.Подразделение);
    Запрос.УстановитьПараметр(“ТипГрафика”,Справочники.ТипыГрафиков.НайтиПоНаименованию(“Шестидневка”));
    Таб=Запрос.Выполнить().Выгрузить();
    СуммаНачислений=Таб[0].Результат;
    КоличествоРабочихДней=Таб[1].Значение;
    Запись.Результат=Выборка.Факт*СуммаНачислений/КоличествоРабочихДней;
    Иначе Сообщение=Новый СообщениеПользователю;
    Сообщение.Текст=”Не верный вид расчета”;
    Сообщение.Сообщить();
    Отказ=Истина;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    Движения.ОсновныеНачисления.Записать(,Истина);

    КонецПроцедуры // РассчитатьНачисления()
    Процедура РассчитатьДополнительныеНачисления(Отказ)
    Запрос = Новый Запрос;
    Запрос.Текст = “ВЫБРАТЬ
    |        ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки,
    |        ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК База
    |ИЗ
    |        РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления
    |                    ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаДополнительныеНачисления
    |                    ПО ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки”;
    Измерения = Новый Массив;
    Измерения.Добавить(“Сотрудник”);
    Измерения.Добавить(“Подразделение”);

    Запрос.УстановитьПараметр(“Измерения”, Измерения);
    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
    Выборка = Запрос.Выполнить().Выбрать();
    Таблица=Запрос.Выполнить().Выгрузить();
    Поиск = Новый Структура(“НомерСтроки”);
    Набор = Движения.ДополнительныеНачисления;
    ПремияКвартальная = ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная;
    Для каждого Запись Из Набор Цикл
    Поиск.НомерСтроки = Запись.НомерСтроки;
    Выборка.Сбросить();
    Если Выборка.НайтиСледующий(Поиск) Тогда
    Если Запись.ВидРасчета = ПремияКвартальная Тогда
    Запись.Результат = Выборка.База*10/100;
    Иначе
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Неизвестный вид расчета ” + Запись.ВидРасчета;
    Сообщение.Сообщить();
    Отказ = Истина;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    Набор.Записать( , Истина);
    КонецПроцедуры
    Процедура ОбработкаПроведения(Отказ, РежимПроведения) Движения.ОсновныеНачисления.Записывать=Истина; Движения.ДополнительныеНачисления.Записывать=Истина; Для Каждого ТекСтрока Из Начисления Цикл Если ТипЗнч(ТекСтрока.ВидРасчета)=Тип(“ПланВидовРасчетаСсылка.ОсновныеНачисления”) тогда
    Движение=Движения.ОсновныеНачисления.Добавить(); Движение.ВидРасчета=ТекСтрока.ВидРасчета; Движение.ПериодРегистрации=ПериодРегистрации; Движение.ПериодДействияНачало=ТекСтрока.ДатаНачала; Движение.ПериодДействияКонец=КонецДня(ТекСтрока.ДатаОкончания); Движение.Сотрудник=ТекСтрока.Сотрудник; Движение.Подразделение=ТекСтрока.Подразделение; Движение.ТипГрафика=ТекСтрока.ТипГрафика; Движение.Размер=ТекСтрока.Размер; Движение.БазовыйПериодНачало=ТекСтрока.ДатаНачала; Движение.БазовыйПериодКонец=КонецДня(ТекСтрока.ДатаОкончания); ИначеЕсли ТипЗнч(ТекСтрока.ВидРасчета)=Тип(“ПланВидовРасчетаСсылка.ДополнительныеНачисления”) тогда  Движение=Движения.ДополнительныеНачисления.Добавить(); Движение.ВидРасчета=ТекСтрока.ВидРасчета; Движение.ПериодРегистрации=ПериодРегистрации; Движение.Сотрудник=ТекСтрока.Сотрудник; Движение.Подразделение=ТекСтрока.Подразделение; Движение.Размер=ТекСтрока.Размер; КонецЕсли; КонецЦикла; Движения.Записать(); РассчитатьОсновныеНачисления(Отказ); РассчитатьДополнительныеНачисления(Отказ);КонецПроцедуры
    Процедура РассчитатьОсновныеНачисления(Отказ)
    Запрос=Новый Запрос; Запрос.Текст= “ВЫБРАТЬ | ОсновныеНачисленияДанныеГрафика.НомерСтроки, | ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК Факт, | ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК План, | ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод |ИЗ | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика”;    Запрос.УстановитьПараметр(“Ссылка”,ссылка); Выборка=Запрос.Выполнить().Выбрать(); Поиск= Новый Структура (“НомерСтроки”); Для Каждого Запись Из Движения.ОсновныеНачисления Цикл       Поиск.НомерСтроки=Запись.НомерСтроки; Выборка.Сбросить(); Если Выборка.НайтиСледующий(Поиск) Тогда Если Выборка.План=0 тогда Сообщить(“Нет данных графика.”); Отказ=Истина; Иначе  Если Запись.ВидРасчета=ПланыВидовРасчета.ОсновныеНачисления.ОкладПоДням Тогда Запись.Результат=Выборка.Факт*Запись.Размер/Выборка.План; ИначеЕсли Запись.ВидРасчета=ПланыВидовРасчета.ОсновныеНачисления.Прогул Тогда Запись.Результат=0; ИначеЕсли Запись.ВидРасчета=ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда Запрос=Новый Запрос; Запрос.Текст= “ВЫБРАТЬ | СУММА(ОсновныеНачисления.Результат) КАК Результат, | NULL КАК Значение |ИЗ | РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления |ГДЕ | ОсновныеНачисления.Сотрудник = &Сотрудник | И ОсновныеНачисления.Подразделение = &Подразделение | И ОсновныеНачисления.ПериодДействияКонец <= &ПериодДействияКонец | И ОсновныеНачисления.ПериодДействияНачало >= &ПериодДействияНачало | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | NULL, | СУММА(ГрафикиРаботы.Значение) |ИЗ | РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы |ГДЕ | ГрафикиРаботы.ТипГрафика = &ТипГрафика | И ГрафикиРаботы.Дата <= &ПериодДействияКонец | И ГрафикиРаботы.Дата >= &ПериодДействияНачало” ;                          КонецПер=НачалоМесяца(Запись.ПериодДействияНачало)-1; Запрос.УстановитьПараметр(“ПериодДействияНачало”,ДобавитьМесяц(КонецПер,-12)+1); Запрос.УстановитьПараметр(“ПериодДействияКонец”,КонецПер); Запрос.УстановитьПараметр(“Сотрудник”,Запись.Сотрудник); Запрос.УстановитьПараметр(“Подразделение”,Запись.Подразделение); Запрос.УстановитьПараметр(“ТипГрафика”,Справочники.ТипыГрафиков.НайтиПоНаименованию(“Шестидневка”)); Таб=Запрос.Выполнить().Выгрузить(); СуммаНачислений=Таб[0].Результат; КоличествоРабочихДней=Таб[1].Значение; Запись.Результат=Выборка.Факт*СуммаНачислений/КоличествоРабочихДней;  Иначе Сообщение=Новый СообщениеПользователю; Сообщение.Текст=”Не верный вид расчета”; Сообщение.Сообщить(); Отказ=Истина; КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; Движения.ОсновныеНачисления.Записать(,Истина); КонецПроцедуры // РассчитатьНачисления()

    Процедура РассчитатьДополнительныеНачисления(Отказ)            Запрос = Новый Запрос;            Запрос.Текст = “ВЫБРАТЬ                           |        ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки,                           |        ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК База                           |ИЗ                           |        РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления                           |                    ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаДополнительныеНачисления                           |                    ПО ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки”;            Измерения = Новый Массив;            Измерения.Добавить(“Сотрудник”);            Измерения.Добавить(“Подразделение”); Запрос.УстановитьПараметр(“Измерения”, Измерения);            Запрос.УстановитьПараметр(“Ссылка”, Ссылка);    Выборка = Запрос.Выполнить().Выбрать(); Таблица=Запрос.Выполнить().Выгрузить();            Поиск = Новый Структура(“НомерСтроки”);            Набор = Движения.ДополнительныеНачисления;            ПремияКвартальная = ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная;            Для каждого Запись Из Набор Цикл                        Поиск.НомерСтроки = Запись.НомерСтроки;                        Выборка.Сбросить();                        Если Выборка.НайтиСледующий(Поиск) Тогда                                   Если Запись.ВидРасчета = ПремияКвартальная Тогда                                               Запись.Результат = Выборка.База*10/100;                                   Иначе                                               Сообщение = Новый СообщениеПользователю;                                               Сообщение.Текст = “Неизвестный вид расчета ” + Запись.ВидРасчета;                                               Сообщение.Сообщить();                                               Отказ = Истина;                                   КонецЕсли;                        КонецЕсли;            КонецЦикла;            Набор.Записать( , Истина); КонецПроцедуры
    </code>

  20. S. Bashutin 17.06.2011 в 23:27

    Задание выполнил. Сложностей не возникло.
    Результаты следующие:
    Оклад за апрель – 3 181.82
    Отпуск с 5-го по 25-е апреля – 1 725,24
    Премия квартальная – 3 000
    1) В модуле объекта документа начисления заработной платы в процедуре “ОбработкаПроведения” добавил следующие строки:
    <code>
    Для каждого Строка ИЗ ЭтотОбъект.Начисления Цикл
    Если Строка.ВидРасчета=ПланыВидовРасчета.ОсновныеНачисления.ОкладПоДням ИЛИ СТрока.ВИдРасчета=ПланыВидовРасчета.ОсновныеНачисления.Прогул Тогда
    Движение=Движения.ОсновныеНачисления.Добавить();
    Движение.ВидРасчета=СТрока.ВидРасчета;
    Движение.ПериодРегистрации=ЭтотОбъект.ПериодРегистрации;
    Движение.ПериодДействияНачало=Строка.ДатаНачала;
    Движение.ПериодДействияКонец=КонецДня(Строка.ДатаОкончания);
    Движение.Подразделение=Строка.Подразделение;
    Движение.Сотрудник=Строка.Сотрудник;
    Движение.ТипГрафика=Строка.ТипГрафика;
    Движение.Размер=Строка.Размер;
    Движение.БазовыйПериодНачало=Строка.ДатаНачала;
    Движение.БазовыйПериодКонец=КонецДня(Строка.ДатаОкончания);
    ИначеЕсли СТрока.ВидРасчета=ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда
    Движение=Движения.ОсновныеНачисления.Добавить();
    Движение.ВидРасчета=СТрока.ВидРасчета;
    Движение.ПериодРегистрации=ЭтотОбъект.ПериодРегистрации;
    Движение.ПериодДействияНачало=Строка.ДатаНачала;
    Движение.ПериодДействияКонец=КонецДня(Строка.ДатаОкончания);
    Движение.Подразделение=Строка.Подразделение;
    Движение.Сотрудник=Строка.Сотрудник;
    Движение.ТипГрафика=Строка.ТипГрафика;
    Движение.БазовыйПериодНачало=ДобавитьМесяц(НачалоМесяца(СТрока.ДатаНачала), -12);
    Движение.БазовыйПериодКонец=КонецМесяца(ДобавитьМесяц(Строка.ДатаОкончания, -1);
    ИначеЕсли СТрока.ВидРасчета=ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная Тогда
    Движение=Движения.ДополнительныеНачисления.Добавить();
    Движение.ВидРасчета=СТрока.ВидРасчета;
    Движение.ПериодРегистрации=ЭтотОбъект.ПериодРегистрации;
    Движение.ПериодДействияНачало=Строка.ДатаНачала;
    Движение.ПериодДействияКонец=КонецДня(Строка.ДатаОкончания);
    Движение.Подразделение=Строка.Подразделение;
    Движение.Сотрудник=Строка.Сотрудник;
    Движение.Размер=Строка.Размер;
    Движение.БазовыйПериодНачало=НачалоМесяца(ДобавитьМесяц(СТрока.ДатаНачала, -3));
    Движение.БазовыйПериодКонец=КонецМесяца(ДобавитьМесяц(Строка.ДатаОкончания, -1));
    КонецЕсли;
    КонецЦикла;
    Движения.ОсновныеНачисления.Записать();
    Движения.ДополнительныеНачисления.Записать();
    РассчитатьОсновныеНачиления(Отказ);
    РассчитатьДополнительныеНачисления(Отказ);
    </code>
    2) Процедура “РассчитатьОсновныеНачисления”:
    <code>          
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    |           ОсновныеНачисленияДанныеГрафика.НомерСтроки,
    |           ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК План,
    |           ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК Факт,
    |           ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод КАК БазовыйПериод
    |ИЗ
    |           РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика”;
    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    Поиск=Новый Структура(“НомерСтроки”);
    Набор=Движения.ОсновныеНачисления;
    Оклад=ПланыВидовРасчета.ОсновныеНачисления.ОкладПоДням;
    Отпуск=ПланыВидовРасчета.ОсновныеНачисления.Отпуск;
    Премия=ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная;
    Для каждого Запись из Набор Цикл
    Поиск.НомерСтроки=Запись.НомерСтроки;
    Выборка.Сбросить();
    Если Выборка.НайтиСледующий(Поиск) Тогда
    Если Запись.ВидРасчета=Оклад Тогда
    Если Выборка.План=0 Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Не данных по графику!”;
    Сообщение.Сообщить();
    Отказ=Истина;
    Иначе
     Запись.Результат=Выборка.Факт*Запись.Размер/Выборка.План;
    КонецЕсли;
    ИначеЕсли Запись.ВидРасчета=Отпуск Тогда
    Если Выборка.План=0 Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Не данных по графику!”;
    Сообщение.Сообщить();
    Отказ=Истина;
    Иначе
    Запись.Результат=РассчитатьБазу(Отпуск, Запись.НомерСтроки)*Выборка.Факт/Выборка.БазовыйПериод;
    КонецЕсли;
    ИначеЕсли Запись.ВидРасчета=ПланыВидовРасчета.ОсновныеНачисления.Прогул Тогда
    Если Выборка.План=0 Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Не данных по графику!”;
    Сообщение.Сообщить();
    Отказ=Истина;
    Иначе
    Запись.Результат=0;
    КонецЕсли;
    Иначе
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Не верно указан вид расчета!”;
    Сообщение.Сообщить();
    Отказ=Истина;
    КонецЕсли;  
    КонецЕсли;
    КонецЦикла;
    Движения.ОсновныеНачисления.Записать(, Истина); 
    </code>
    3) Функция РассчитатьБазу():
     <code>
     НовыйЗапрос=Новый Запрос;      
    НовыйЗапрос.Текст=”ВЫБРАТЬ
    ОсновныеНачисления.НомерСтроки,
    |     ОсновныеНачисления.Размер,
    |            ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК База
    |ИЗ
    |     РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления
    |                 ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(
    |                                        &Измерения,
    |                                        &Измерения,
    |                                        ,
    |                                        Регистратор = &Ссылка
    |                                                    И ВидРасчета = &Отпуск) КАК ОсновныеНачисленияБазаОсновныеНачисления
    |                 ПО ОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки
    |                 ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(
    |                                        &Измерения,
    |                                        &Измерения,
    |                                        ,
    |                                        Регистратор = &Ссылка
    |                                                    И ВидРасчета = &Отпуск) КАК ДополнительныеНачисленияБазаДополнительныеНачисления
    |                 ПО ОсновныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки
    |ГДЕ
    |     ОсновныеНачисления.Регистратор = &Ссылка
    |     И ОсновныеНачисления.НомерСтроки = &НомерСтроки”;
    Измерения=Новый Массив;
    Измерения.Добавить(“Сотрудник”);
    Измерения.Добавить(“Подразделение”);
    НовыйЗапрос.УстановитьПараметр(“НомерСтроки”, НомерСтроки);
    НовыйЗапрос.УстановитьПараметр(“Ссылка”, Ссылка);
    НовыйЗапрос.УстановитьПараметр(“Отпуск”, ВидРасчета);
    НовыйЗапрос.УстановитьПараметр(“Измерения”,Измерения);
    НоваяВыборка=НовыйЗапрос.Выполнить().Выбрать();
    НоваяВыборка.Следующий();
    Возврат НоваяВыборка.База;
    </code>
    4) Процедура  РассчитатьДополнительныеНачисления():
     <code>            Набор=Движения.ДополнительныеНачисления;
    Премия=ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная;
    Для каждого Запись из Набор Цикл
    Если Запись.ВидРасчета=Премия Тогда
    Запись.Результат=Запись.Размер*0.01*РассчитатьБазуДоп(Премия, Запись.НомерСтроки);
    Иначе
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Не правильный вид расчета!”;
    Сообщение.Сообщить();
    КонецЕсли;
    КонецЦикла;
    Движения.ДополнительныеНачисления.Записать(, Истина);
    </code>
    5) Функция РассчитатьБазуДоп():
    <code>
    НовыйЗапрос=Новый Запрос;      
    НовыйЗапрос.Текст=”ВЫБРАТЬ
    |     ДополнительныеНачисления.НомерСтроки,
    |     ДополнительныеНачисления.Размер,
    |            ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК База
    |ИЗ
    |     РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления
    |                 ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(
    |                                        &Измерения,
    |                                        &Измерения,
    |                                        ,
    |                                        Регистратор = &Ссылка
    |                                                    И ВидРасчета = &Отпуск) КАК ДополнительныеНачисленияБазаОсновныеНачисления
    |                 ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки
    |                 ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(
    |                                        &Измерения,
    |                                        &Измерения,
    |                                        ,
    |                                        Регистратор = &Ссылка
    |                                                    И ВидРасчета = &Отпуск) КАК ДополнительныеНачисленияБазаДополнительныеНачисления
    |                 ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки
    |ГДЕ
    |     ДополнительныеНачисления.Регистратор = &Ссылка
    |     И ДополнительныеНачисления.НомерСтроки = &НомерСтроки”;
    Измерения=Новый Массив;
    Измерения.Добавить(“Сотрудник”);
    Измерения.Добавить(“Подразделение”);
    НовыйЗапрос.УстановитьПараметр(“НомерСтроки”, НомерСтроки);
    НовыйЗапрос.УстановитьПараметр(“Ссылка”, Ссылка);
    НовыйЗапрос.УстановитьПараметр(“Отпуск”, ВидРасчета);
    НовыйЗапрос.УстановитьПараметр(“Измерения”,Измерения);
    НоваяВыборка=НовыйЗапрос.Выполнить().Выбрать();
    НоваяВыборка.Следующий();
    Возврат НоваяВыборка.База;
    </code> 
     Вот и всё;)
     

  21. Юрий Торговцев 17.06.2011 в 23:10

    Задание выполнил.

    Создаю рабочий набор.
    Здесь устанавливаю БазовыеПериоды для расчетов Отпуск и ПремияКвартальная, а так же ТипГрафика для Отпуск.
    <code>
    Для Каждого ТекСтрокаНачисления Из Начисления Цикл
    Если ТипЗнч(ТекСтрокаНачисления.ВидРасчета) = Тип(“ПланВидовРасчетаСсылка.ОсновныеНачисления”) Тогда
    Движение = Движения.ОсновныеНачисления.Добавить();
    Движение.Сторно = Ложь;
    Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
    Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
    Движение.ПериодДействияКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания);
    Движение.ТипГрафика = ТекСтрокаНачисления.ТипГрафика;
    Если ТекСтрокаНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда
    Движение.БазовыйПериодНачало = ДобавитьМесяц(Движение.ПериодДействия,-12);
    Движение.БазовыйПериодКонец = КонецДня(Движение.ПериодДействия -1);
    Движение.ТипГрафика = Справочники.ТипыГрафиков.НайтиПоНаименованию(“Шестидневка”).Ссылка;
    КонецЕсли;
    Движение.ПериодРегистрации = ПериодРегистрации;
    Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
    Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
    Движение.Размер = ТекСтрокаНачисления.Размер;
    ИначеЕсли ТипЗнч(ТекСтрокаНачисления.ВидРасчета) = Тип(“ПланВидовРасчетаСсылка.ДополнительныеНачисления”) Тогда
    Движение = Движения.ДополнительныеНачисления.Добавить();
    Движение.Сторно = Ложь;
    Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
    Движение.БазовыйПериодНачало = НачалоКвартала(НачалоКвартала(ПериодРегистрации)-1);
    Движение.БазовыйПериодКонец = КонецКвартала(НачалоКвартала(ПериодРегистрации)-1);
    Движение.ПериодРегистрации = ПериодРегистрации;
    Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
    Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
    Движение.Размер = ТекСтрокаНачисления.Размер;
    КонецЕсли;
    КонецЦикла
    </code>

    Вызываю РассчитатьОсновныеНачисления.
    С помощью запроса получаю все необходимые данные.
    <code>
    ВЫБРАТЬ
    ОсновныеНачисленияДанныеГрафика.НомерСтроки,
    ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия, 0) КАК План,
    ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК Факт,
    ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод, 0) КАК БазаГрафик,
    ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) КАК БазаСумма
    ИЗ
    РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаДополнительныеНачисления
    ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления
    ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки
    </code>
    Рассчитывю результаты.

    Аналогично с РассчитатьДополнительныеНачисления.

    Апрель 2011
    ОкладПоДням 3076,92= 8дней
    Отпуск 7012=(3 месяца)/1725=(12 месяцев) 18дней
    ПремияКвартальная 3000=

  22. Мария 17.06.2011 в 15:46

    Задание выполнила. В модуле документа в обработке проведения в зависимости от типа значения ВидРасчета записываются движения в основной и дополнительный регистры расчета. Затем переходим к процедурам расчета результата отдельно для основных начислений и отдельно для дополнительных. Для основных в запросе выбирается виртуальная таблица ДанныеГрафика и БазаОсновные ,Дополнительные по номеру строки левое соединение. В процедуре расчета допНачислений в запросе физическая таблица допНачисления и БазаОсновные ,Дополнительные номер строки левое соединение.
    В результате у меня получилось
    Оклад 3181,75
    Прогул не оплачивается
    Отпуск 1719,75
    Премия 3000

  23. Задание выполнил.
    Для расчета базового периода для оклада и отпуска  сделал реквизит ДатаПриема у справочника Сотрудники.
    Расчитываю сначала Оклад, потом Отпуск, потом Премию,  Прогул не рассчитываю.
    Запроса для расчета отпуска сделал такой:
    <code>
    ВЫБРАТЬ
    |    Базовые.НомерСтроки,
    |    ЕСТЬNULL(Базовые.База, 0) КАК БазаСумма,
    |    ЕСТЬNULL(График.ЗначениеБазовыйПериод, 0) КАК БазаДни,
    |    ЕСТЬNULL(График.ЗначениеФактическийПериодДействия, 0) КАК ФактДни
    |ИЗ
    |    (ВЫБРАТЬ
    |        ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки, ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки,
    |        ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК База
    |    ИЗ
    |        РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(
    |                &Измерения,
    |                &Измерения,
    |                ,
    |                ВидРасчета В (&ВидыРасчета)
    |                    И Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления
    |            ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(
    |                    &Измерения,
    |                    &Измерения,
    |                    ,
    |                    ВидРасчета В (&ВидыРасчета)
    |                        И Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаДополнительныеНачисления
    |            ПО ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК Базовые
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(
    |                Регистратор = &Ссылка
    |                    И ВидРасчета В (&ВидыРасчета)) КАК График
    |        ПО Базовые.НомерСтроки = График.НомерСтроки
    </code>
     
     

  24. Yuri Golovko 17.06.2011 в 13:39

    Добавил в табличную часть документа «НачислениеЗаработнойПлаты» реквизиты для учета данных по базе – БазовыйПериодНачало и БазовыйПериодКонец (тип Дата). Также добавил реквизит Сторно (тип Булево).
    Расчет заработной платы содержится полностью в модуле документа:
    <code>
    Процедура ОбработкаПроведения(Отказ, РежимПроведения)
                Движения.ОсновныеНачисления.Записывать = Истина;
                Движения.ДополнительныеНачисления.Записывать = Истина;
                Для Каждого ТекСтрокаНачисления Из Начисления Цикл
                            Если ТипЗнч(ТекСтрокаНачисления.ВидРасчета) = Тип(“ПланВидовРасчетаСсылка.ОсновныеНачисления”) Тогда
                                       // регистр ОсновныеНачисления
                                       Движение = Движения.ОсновныеНачисления.Добавить();
                                       Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
                                       Движение.ПериодДействияКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания);
                                       Движение.ТипГрафика = ТекСтрокаНачисления.ТипГрафика;
                            ИначеЕсли ТипЗнч(ТекСтрокаНачисления.ВидРасчета) = Тип(“ПланВидовРасчетаСсылка.ДополнительныеНачисления”) Тогда
                                       // регистр ДополнительныеНачисления
                                       Движение = Движения.ДополнительныеНачисления.Добавить();
                            Иначе
                                       Сообщение = Новый СообщениеПользователю;
                                       Сообщение.Текст = “Неизвестный план видов расчета”;
                                       Сообщение.Сообщить();
                                       Отказ = Истина;
                                       Возврат;
                            КонецЕсли;
                            Движение.Сторно = ТекСтрокаНачисления.Сторно;
                            Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
                            Движение.ПериодРегистрации = ПериодРегистрации;
                            Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
                            Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
                            Движение.Размер = ТекСтрокаНачисления.Размер;
                            Если ЗначениеЗаполнено(ТекСтрокаНачисления.БазовыйПериодНачало) И ЗначениеЗаполнено(ТекСтрокаНачисления.БазовыйПериодКонец) Тогда
                                       Движение.БазовыйПериодНачало = ТекСтрокаНачисления.БазовыйПериодНачало;
                                       Движение.БазовыйПериодКонец = КонецДня(ТекСтрокаНачисления.БазовыйПериодКонец);
                            КонецЕсли;
                КонецЦикла;
                Движения.Записать();
                РассчитатьОсновныеНачисления(Отказ);
                РассчитатьДополнительныеНачисления(Отказ);
    КонецПроцедуры
    Процедура РассчитатьОсновныеНачисления(Отказ)
                Запрос = Новый Запрос;
                Запрос.Текст =
                            “ВЫБРАТЬ
                            |           ОсновныеНачисленияДанныеГрафика.НомерСтроки,
                            |           ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия, 0) КАК План,
                            |            ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК Факт,
                            |           ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод, 0) КАК БазаКоличествоДней,
                            |           ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК База
                            |ИЗ
                            |           РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика
                            |                       ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(
                            |                                              &Измерения,
                            |                                               &Измерения,
                            |                                              ,
                            |                                              Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаОсновныеНачисления
                            |                       ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки
                            |                       ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(
                            |                                              &Измерения,
                            |                                              &Измерения,
                            |                                              ,
                            |                                              Регистратор = &Ссылка) КАК ОсновныеНачисленияБазаДополнительныеНачисления
                            |                       ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки”;
                Измерения = Новый Массив;
                Измерения.Добавить(“Сотрудник”);
                Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
                Запрос.УстановитьПараметр(“Измерения”, Измерения);
        Выборка = Запрос.Выполнить().Выбрать();
                Поиск = Новый Структура(“НомерСтроки”);
                Набор = Движения.ОсновныеНачисления;
                Оклад = ПланыВидовРасчета.ОсновныеНачисления.ОкладПоДням;
                Отпуск = ПланыВидовРасчета.ОсновныеНачисления.Отпуск;
                Прогул = ПланыВидовРасчета.ОсновныеНачисления.Прогул;
                Для каждого Запись Из Набор Цикл
                            Поиск.НомерСтроки = Запись.НомерСтроки;
                            Выборка.Сбросить();
                            Если Выборка.НайтиСледующий(Поиск) Тогда
                                       Если Запись.ВидРасчета = Оклад Тогда
                                                   Если Выборка.План = 0  Тогда
                                                               Сообщение = Новый СообщениеПользователю;
                                                               Сообщение.Текст = “Нет данных графика”;
                                                               Сообщение.Сообщить();
                                                               Отказ = Истина;
                                                   Иначе
                                                               Запись.Результат = Запись.Размер*Выборка.Факт/Выборка.План*?(Запись.Сторно, -1, 1);
                                                   КонецЕсли;
                                       ИначеЕсли Запись.ВидРасчета = Отпуск Тогда
                                                    Запись.Результат = Выборка.База*Выборка.Факт/Выборка.БазаКоличествоДней*?(Запись.Сторно, -1, 1);
                                       ИначеЕсли Запись.ВидРасчета = Прогул Тогда
                                                   Запись.Результат = 0;
                                       Иначе
                                                   Сообщение = Новый СообщениеПользователю;
                                                   Сообщение.Текст = “Неизвестный вид расчета ” + Запись.ВидРасчета;
                                                   Сообщение.Сообщить();
                                                   Отказ = Истина;
                                       КонецЕсли;
                            КонецЕсли;
                КонецЦикла;
                Набор.Записать( , Истина);
    КонецПроцедуры
    Процедура РассчитатьДополнительныеНачисления(Отказ)
                Запрос = Новый Запрос;
                Запрос.Текст = “ВЫБРАТЬ
                               |        ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки,
                               |        ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК База
                               |ИЗ
                               |        РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления
                               |                    ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаДополнительныеНачисления
                               |                    ПО ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки”;
                Измерения = Новый Массив;
                Измерения.Добавить(“Сотрудник”);
                Запрос.УстановитьПараметр(“Измерения”, Измерения);
                Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
        Выборка = Запрос.Выполнить().Выбрать();
                Поиск = Новый Структура(“НомерСтроки”);
                Набор = Движения.ДополнительныеНачисления;
                ПремияКвартальная = ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная;
                Для каждого Запись Из Набор Цикл
                            Поиск.НомерСтроки = Запись.НомерСтроки;
                            Выборка.Сбросить();
                            Если Выборка.НайтиСледующий(Поиск) Тогда
                                       Если Запись.ВидРасчета = ПремияКвартальная Тогда
                                                   Запись.Результат = Выборка.База*Запись.Размер/100*?(Запись.Сторно, -1, 1);
                                       Иначе
                                                   Сообщение = Новый СообщениеПользователю;
                                                   Сообщение.Текст = “Неизвестный вид расчета ” + Запись.ВидРасчета;
                                                   Сообщение.Сообщить();
                                                   Отказ = Истина;
                                       КонецЕсли;
                            КонецЕсли;
                КонецЦикла;
                Набор.Записать( , Истина);
    КонецПроцедуры
    </code>

  25. СдалаНО, причудлива объектная модель для расчета ЗП! Мои результаты таковы: зп у Иванова в апреле 2011 рассчитана  в 2 857.14, а отпуск в 95.93(потому что раб.дней много, а денег мы ему бедняге не платили).
    Долго, вообще, не мог понять эту 1С’модель. Пересматривал уроки, пытался читать документацию(это отдельная песня), забежал вперед(по плану), что бы сложилась хоть какая-то картина. И вот результат(возможно, я что-то использовал из будущих уроков – до сих пор в голове каша):
    На мой взгляд, в объектной модели для ВидовРасчета нет места для описания алгоритмов заполнения различных периодов, а главное  расчета результат.  Поэтому создал общий серверный модуль в котором разместил на каждый введенный вид расчета одноименную процедуру. Она принимает в качестве параметра структуру, в которой задаются исх.значения, результат и команда, которая и определяет, что нужно получить от вида расчета. Например:
    Процедура Оклад(Параметры) Экспорт
    Результат=Неопределено;
    Режим=Параметры.Режим;
    Если Режим=”НачалоБазовогоПериода” Тогда
    Результат=НачалоМесяца(Параметры.ДатаНачала);
    ИначеЕсли Режим=”КонецБазовогоПериода” Тогда
    Результат=КонецМесяца(Параметры.ДатаНачала);
    ИначеЕсли Режим=”Расчитать” Тогда
    ИсхДанные=Параметры.ДанныеДляРасчета;
    Результат=ИсхДанные.Размер*ИсхДанные.Факт/ИсхДанные.План;
    Иначе
    Сообщить(“ОкладПолучить: ЗапросНеизвестногоПараметра:”+Режим);
    КонецЕсли;
    Параметры.Вставить(“Результат”,Результат);
    КонецПроцедуры    //Оклад

    Кроме того, понятие Категории я понял как группу видов расчета, которые можно рассчитывать “параллельно” и одновременно записывать в регистр.  Таким образом получилась “почти” универсальная схема проведения, которая выглядит следующим образом.
    Циклами “как учили” заполняем “плановые”  значения регистров. Для заполнения специфических(по ВидамРасчетов) значений используем вызов одноименных процедур серверного модуля таким образом:
    Результат=Неопределено;
    Параметры=Новый Структура;
    Параметры.Вставить(“ДатаНачала”,ТекСтрока.ДатаНачала);
    Параметры.Вставить(“ДатаКонца”,ТекСтрока.ДатаОкончания);
    Параметры.Вставить(“Результат”,Результат);
    Параметры.Вставить(“Режим”,”НачалоБазовогоПериода”);
    Выполнить(“серверЗиК.”+ТекСтрока.ВидРасчета.Наименование+”(Параметры);”);
    После записи “плановых” значений, делаем РасчетНачислений, который Состоит из следующих лог.кусков:
    Запросом получаю “таблицу(регистр,категория)” всех используемых категорий в наших ВидахРасчета и  упорядоченную по регистрам и категориям.
    В цикле перебираю результат запроса. На каждый новый(в выборке) регистр формирую таблицуСсылок (индексНабора, НомерСтроки) так:
    Для каждого Запись Из Набор Цикл
    строка=тСсылкиНЗ.Добавить();
    строка.Индекс=Набор.Индекс(Запись);
    строка.Строка=Запись.НомерСтроки;
    КонецЦикла;

    На каждую новую(тоже в выборке) категорию выполняю:
    тКатегория=Выборка.Категория;
    ВыполнитьНачисления(тГруппа,тКатегория,Набор,тСсылкиНЗ);
    Набор.Записать();

    Таким образом категории обрабатываются по мере возрастания их значения, и результат расчета записываются в регистр, создавая возможную базу для последующих расчетов.
    В  процедуре ВполнитьНачисления на основании регистра, категории и данных документа формируем (полу программно) текст запроса и задаем нужные параметры для получения из БД записей набора регистра расчета по данной категории. Результат запроса это таблица из колонок НомерСтроки, ВидРасчета, Размер, План, Факт, ГрафикБазы, База
    Колонки по смыслу такие же как и в уроках. ГрафикБазы потребовался, что бы посчитать количество раб.дней для отпуска.
    И выполнив запрос простым циклом(с использованием процедур видовРасчета серверного модуля):
    Пока Выборка.Следующий() Цикл
    Параметры=Новый Структура;
    Результат=Неопределено;
    Параметры.Вставить(“ДанныеДляРасчета”,Выборка);
    Параметры.Вставить(“Результат”,Результат);
    Параметры.Вставить(“Режим”,”Расчитать”);
    Выполнить(“серверЗиК.”+Выборка.ВидРасчетаНаименование+”(Параметры);”);
    ъ=тСсылкиНЗ.Найти(Выборка.НомерСтроки,”Строка”);
    Набор[ъ.Индекс].Результат=Параметры.Результат;
    КонецЦикла;

    Рассчитываем результаты, которые помещаем в  Записи набора движений регистра с использованием созданной ранее “таблицы ссылок”.
    ВСЕ.

    • Как интересно, доделал обработку Сторно. И расчет сломался. Виртуальная таблица Данныеграфика в колонке Факт возвращает NULL. Хочется воскликнуть как в школе: А мы такого не проходили! Что не так я сделал.

      • Похоже для корректной работы загадочного атрибута Сторно необходим “первоисточник”. те в регистре должна быть запись КОТОРУЮ сторнируют.  И еще одно предположение, эта запись помимо “ключевых” атрибутов расчета(Вид, ИзмеренияРегистра) должна еще и покрывать по периоду действия сторниРУЮЩУЮ запись.

      • Сергей, просьба прислать конфигурацию с ошибочным поведением на ящик мастер-группы. Также опишите пример воспроизведения ошибки.

        • А что Вы считаете ошибкой? На мой взгляд все “объяснимо”. Вы имеете ввиду поведение “сторно”?

        • Отправил, жду диагноз.

  26. Отчет ДЗ №14.
     
    Результат расчета за апрель 2011 года (проверочные данные):

    ОкладПоДням – 2 857,14
    Отпуск – 1 725,24
    Премия – 3 000.

     
    Реализовал расчет в МО документ «НачислениеЗаработнойПлаты», для этого добавил вторую табличную часть “ДополнительныеНачисления» в отличие от т.ч. «Начисления» отсутствует поле «ТипГрафика».
                    Код МО документа «НачислениеЗаработнойПлаты»
    <code>Процедура ОбработкаПроведения(Отказ, Режим)
     
                    //1-ый проход – рабочие записи
                    Движения.ОсновныеНачисления.Записывать = Истина;
                    Для Каждого ТекСтрокаНачисления Из Начисления Цикл
                                   Движение = Движения.ОсновныеНачисления.Добавить();
                                   Движение.Сторно = ТекСтрокаНачисления.Сторно;
                                   Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
                                   Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
                                   Движение.ПериодДействияКонец = ТекСтрокаНачисления.ДатаОкончания;
                                   Движение.ПериодРегистрации = ПериодРегистрации;
                                   Если ТекСтрокаНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда
                                                   Движение.БазовыйПериодНачало = НачалоМесяца(ДобавитьМесяц(ПериодРегистрации,-12));
                                                   Движение.БазовыйПериодКонец = КонецМесяца(ДобавитьМесяц(ПериодРегистрации, -1));
                                   Иначе
                                                   Движение.БазовыйПериодНачало = НачалоМесяца(ПериодРегистрации);
                                                   Движение.БазовыйПериодКонец = КонецМесяца(ПериодРегистрации);
                                   КонецЕсли;
                                   Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
                                   Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
                                   Движение.ТипГрафика = ТекСтрокаНачисления.ТипГрафика;
                                   Движение.Размер = ТекСтрокаНачисления.Размер;
                    КонецЦикла;
     
                    Движения.ДополнительныеНачисления.Записывать = Истина;
                    Для Каждого ТекСтрокаДополнительныеНачисления Из ДополнительныеНачисления Цикл
                                   Движение = Движения.ДополнительныеНачисления.Добавить();
                                   Движение.Сторно = ТекСтрокаДополнительныеНачисления.Сторно;
                                   Движение.ВидРасчета = ТекСтрокаДополнительныеНачисления.ВидРасчета;
                                   Движение.ПериодРегистрации = ПериодРегистрации;
                                   Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоКвартала(ТекСтрокаДополнительныеНачисления.ДатаНачала),-3);
                                   Движение.БазовыйПериодКонец = КонецКвартала(Движение.БазовыйПериодНачало);
                                   Движение.Сотрудник = ТекСтрокаДополнительныеНачисления.Сотрудник;
                                   Движение.Подразделение = ТекСтрокаДополнительныеНачисления.Подразделение;
                                   Движение.Размер = ТекСтрокаДополнительныеНачисления.Размер;
                    КонецЦикла;
     
                    Движения.Записать();
                   
                    //2-ой проход – расчет ресурсов регистров расчета
                    РасчитатьОсновныеНачисления(Отказ);
                   
                    РасчитатьДополнительныеНачисления(Отказ);
                   
    КонецПроцедуры
     
    Процедура РасчитатьОсновныеНачисления(Отказ)
                   
                    Набор  = Движения.ОсновныеНачисления;
                    Тариф   = ПланыВидовРасчета.ОсновныеНачисления.ОкладПоДням;
                    Отпуск = ПланыВидовРасчета.ОсновныеНачисления.Отпуск;
                    Прогул = ПланыВидовРасчета.ОсновныеНачисления.Прогул;
     
                    Запрос = Новый Запрос;
                    Запрос.Текст = “ВЫБРАТЬ
                                   |              ОсновныеНачисленияДанныеГрафика.НомерСтроки,
                                   |              ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия КАК План,
                                   |              ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК Факт,
                                   |              ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод КАК ГрафикБаза,
                                   |              ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК База
                                   |ИЗ
                                   |              РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика
                                   |                              ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(
                                   |                                                             &Измерения,
                                   |                                                             &Измерения,
                                   |                                                             ,
                                   |                                                             Регистратор = &Ссылка
                                   |                                                                             И ВидРасчета = &Отпуск) КАК ОсновныеНачисленияБазаОсновныеНачисления
                                   |                              ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки
                                   |                              ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(
                                   |                                                             &Измерения,
                                   |                                                             &Измерения,
                                   |                                                             ,
                                   |                                                             Регистратор = &Ссылка
                                   |                                                                             И ВидРасчета = &Отпуск) КАК ОсновныеНачисленияБазаДополнительныеНачисления
                                   |                              ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки”;
                                                                     
                    Измерения = Новый Массив;
                    Измерения.Добавить(“Сотрудник”);
                    Измерения.Добавить(“Подразделение”);
                                                                     
                    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
                    Запрос.УстановитьПараметр(“Отпуск”, Отпуск);
                    Запрос.УстановитьПараметр(“Измерения”, Измерения);
                   
                    Выборка = Запрос.Выполнить().Выбрать();
                   
                    Поиск   = Новый Структура(“НомерСтроки”);
                   
                    //связываем строку набора с выборкой, через номер строки
                    Для каждого Запись Из Набор Цикл
                                  
                                   //для прогула выборка ненужна
                                   Если Запись.ВидРасчета = Прогул Тогда
                                                   Запись.Результат = Запись.Размер*?(Запись.Сторно, -1, 1);
                                                   Продолжить;
                                   КонецЕсли;
                                                  
                                   Поиск.НомерСтроки = Запись.НомерСтроки;
                                   Выборка.Сбросить();
                                   Если Выборка.НайтиСледующий(Поиск) Тогда
                                                  
                                                   Если Запись.ВидРасчета = Тариф Тогда
                                                                   Если Выборка.План = 0 Тогда
                                                                                  Сообщение = Новый СообщениеПользователю;
                                                                                  Сообщение.Текст = “Нет граффика”;
                                                                                  Сообщение.Сообщить();         
                                                                                  Отказ = Истина;
                                                                   КонецЕсли;
                                                                  
                                                                   Запись.Результат = Выборка.Факт*Запись.Размер/Выборка.План*?(Запись.Сторно, -1, 1);
                                  
                                                   ИначеЕсли Запись.ВидРасчета = Отпуск Тогда
                                                                  
                                                                   Если Выборка.ГрафикБаза = 0 Тогда
                                                                                  Сообщение = Новый СообщениеПользователю;
                                                                                  Сообщение.Текст = “Нет граффика”;
                                                                                  Сообщение.Сообщить();         
                                                                                  Отказ = Истина;
                                                                   КонецЕсли;
                                                                  
                                                                   Запись.Результат = Выборка.База*Выборка.Факт/Выборка.ГрафикБаза*?(Запись.Сторно, -1, 1);
                                                                  
                                                   Иначе
                                                       Сообщение = Новый СообщениеПользователю;
                                                                   Сообщение.Текст = “Неизвесный вид расчета “+Запись.ВидРасчета;
                                                                   Сообщение.Сообщить();
                                                                   Отказ = Истина;                             
                                                   КонецЕсли;
                                  
                                   КонецЕсли;
                   
                    КонецЦикла;
     
                    Набор.Записать(,Истина);
                   
    КонецПроцедуры
     
    Процедура РасчитатьДополнительныеНачисления(Отказ)
                   
                    Набор  = Движения.ДополнительныеНачисления;
                    Премия               = ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная;
     
                    Запрос = Новый Запрос;
                    Запрос.Текст = “ВЫБРАТЬ
                                   |              ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки, ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки) КАК НомерСтроки,
                                   |              ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК База
                                   |ИЗ
                                   |              РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(
                                   |                                             &Измерения,
                                   |                                             &Измерения,
                                   |                                             ,
                                   |                                             Регистратор = &Ссылка
                                   |                                                             И ВидРасчета = &Премия) КАК ДополнительныеНачисленияБазаОсновныеНачисления
                                   |                              ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(
                                   |                                                             &Измерения,
                                   |                                                             &Измерения,
                                   |                                                             ,
                                   |                                                             Регистратор = &Ссылка
                                   |                                                                             И ВидРасчета = &Премия) КАК ДополнительныеНачисленияБазаДополнительныеНачисления
                                   |                              ПО ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки”;
                                                                     
                    Измерения = Новый Массив;
                    Измерения.Добавить(“Сотрудник”);
                    Измерения.Добавить(“Подразделение”);
                                                                     
                    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
                    Запрос.УстановитьПараметр(“Премия”, Премия);
                    Запрос.УстановитьПараметр(“Измерения”, Измерения);
                   
                    Выборка = Запрос.Выполнить().Выбрать();
                   
                    Поиск   = Новый Структура(“НомерСтроки”);
                   
                    //связываем строку набора с выборкой, через номер строки
                    Для каждого Запись Из Набор Цикл
                                  
                                   Поиск.НомерСтроки = Запись.НомерСтроки;
                                   Выборка.Сбросить();
                                   Если Выборка.НайтиСледующий(Поиск) Тогда
                                                  
                                                   Если Запись.ВидРасчета = Премия Тогда
                                                                  
                                                                   Запись.Результат = Выборка.База*Запись.Размер/100*?(Запись.Сторно, -1, 1);
                                  
                                                   Иначе
                                                       Сообщение = Новый СообщениеПользователю;
                                                                   Сообщение.Текст = “Неизвесный вид расчета “+Запись.ВидРасчета;
                                                                   Сообщение.Сообщить();
                                                                   Отказ = Истина;                             
                                                   КонецЕсли;
                                  
                                   КонецЕсли;
                   
                    КонецЦикла;
     
                    Набор.Записать(,Истина);
                   
    КонецПроцедуры</code>

  27. Готово. Оклад, Прогул и премия без затруднений.
    Для расчета отпуска создала константу ГрафикДляРасчетаСреднего. В документе НачислениеЗП создала табличную часть РасчетСреднего для стабильности проведения, заполняется по кнопке Заполнить. Если есть начисления с расчетом среднего, а таблица не заполнена, проведения не происходит.
    Плановое значение рабочих дней получается запросом к регистру сведений Графики.
    По 2010 году получилось за апрель Оклад 3181,82, премия 3000, отпуск 2012,78 (из расчета базовый период 01.04.2009 – 31.03.2009 -313 дней по шестидневке, 15 календарных дней в отпуске, СуммаБаза 30000

  28. Задание выполнил. Небольшие сложности были с отпуском. Для близкого к жизни учета отпуска и премии не хватает кадровых данных (прием, увольнение).
    <code>
    Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    Движения.ОсновныеНачисления.Записывать = Истина;
    Движения.ДополнительныеНачисления.Записывать = Истина;
    ТипВР_ОН=Тип(“ПланВидовРасчетаСсылка.ОсновныеНачисления”);
    ТипВР_ДН=Тип(“ПланВидовРасчетаСсылка.ДополнительныеНачисления”);
    Для Каждого ТекСтрокаНачисления Из Начисления Цикл
    ТипВР=ТипЗнч(ТекСтрокаНачисления.ВидРасчета);
    Если ТипВР=ТипВР_ОН Тогда
    Движение = Движения.ОсновныеНачисления.Добавить();
    Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
    Движение.ПериодДействияКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания);
    Движение.ТипГрафика = ТекСтрокаНачисления.ТипГрафика;
    Если ТекСтрокаНачисления.ВидРасчета=ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда
    Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(ТекСтрокаНачисления.ДатаНачала),-12);
    Движение.БазовыйПериодКонец = НачалоМесяца(ТекСтрокаНачисления.ДатаНачала)-1;
    КонецЕсли;
    ИначеЕсли ТипВР=ТипВР_ДН Тогда
    Движение = Движения.ДополнительныеНачисления.Добавить();
    Если ТекСтрокаНачисления.ВидРасчета=ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная Тогда
    Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(ТекСтрокаНачисления.ДатаНачала),-3);
    Движение.БазовыйПериодКонец = НачалоМесяца(ТекСтрокаНачисления.ДатаНачала)-1;
    КонецЕсли;
    Иначе
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Неизвестный план видов расчета!”;
    Сообщение.Сообщить();
    Отказ=Истина;
    КонецЕсли;
    Движение.Сторно = Ложь;
    Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
    Движение.ПериодРегистрации = ПериодРегистрации;
    Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
    Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
    Движение.Результат = 0;
    Движение.Размер = ТекСтрокаНачисления.Размер;
    КонецЦикла;
    Движения.Записать();

    РассчитатьОсновныеНачисления(Отказ);
    РассчитатьДополнительныеНачисления(Отказ);
    КонецПроцедуры

    Процедура РассчитатьОсновныеНачисления(Отказ)
    ДвОсновныеНачисления=Движения.ОсновныеНачисления;

    //Оклад
    ВидРасчетаОклад=ПланыВидовРасчета.ОсновныеНачисления.ОкладПоДням;
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | ОсновныеНачисленияДанныеГрафика.НомерСтроки,
    | ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия Факт,
    | ОсновныеНачисленияДанныеГрафика.Размер,
    | ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия План
    |ИЗ
    | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(
    | Активность
    | И Регистратор = &Ссылка
    | И ВидРасчета = &ВидРасчетаОклад) КАК ОсновныеНачисленияДанныеГрафика”;

    Запрос.УстановитьПараметр(“ВидРасчетаОклад”, ВидРасчетаОклад);
    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);

    Результат = Запрос.Выполнить();
    Если НЕ Результат.Пустой() Тогда
    Выборка = Результат.Выбрать();
    Поиск=Новый Структура(“НомерСтроки”);
    Для каждого Запись Из ДвОсновныеНачисления Цикл
    Поиск.НомерСтроки=Запись.НомерСтроки;
    Выборка.Сбросить();
    Если Выборка.НайтиСледующий(Поиск) Тогда
    Запись.Результат=?(Выборка.План=0,0,Выборка.Факт*Выборка.Размер/Выборка.План);
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;

    //Отпуск
    ВидРасчетаОтпуск=ПланыВидовРасчета.ОсновныеНачисления.Отпуск;
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | СУММА(ЕСТЬNULL(ГрафикиРаботы.Значение, 0)) КАК ДнейВГрафике,
    | ВложенныйЗапрос.НомерСтроки,
    | ВложенныйЗапрос.Размер,
    | ВложенныйЗапрос.База,
    | ВложенныйЗапрос.Факт КАК ДнейОтпуска
    |ИЗ
    | (ВЫБРАТЬ
    | ОсновныеНачисления.НомерСтроки КАК НомерСтроки,
    | ОсновныеНачисления.Размер КАК Размер,
    | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК База,
    | ОсновныеНачисления.БазовыйПериодНачало КАК БазовыйПериодНачало,
    | ОсновныеНачисления.БазовыйПериодКонец КАК БазовыйПериодКонец,
    | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК Факт
    | ИЗ
    | РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(
    | &Измерения,
    | &Измерения,
    | ,
    | Регистратор = &Ссылка
    | И ВидРасчета = &Отпуск) КАК ОсновныеНачисленияБазаОсновныеНачисления
    | ПО ОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(
    | &Измерения,
    | &Измерения,
    | ,
    | Регистратор = &Ссылка
    | И ВидРасчета = &Отпуск) КАК ОсновныеНачисленияБазаДополнительныеНачисления
    | ПО ОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(
    | Активность
    | И Регистратор = &Ссылка
    | И ВидРасчета = &Отпуск) КАК ОсновныеНачисленияДанныеГрафика
    | ПО ОсновныеНачисления.НомерСтроки = ОсновныеНачисленияДанныеГрафика.НомерСтроки
    | ГДЕ
    | ОсновныеНачисления.Регистратор = &Ссылка
    | И ОсновныеНачисления.ВидРасчета = &Отпуск) КАК ВложенныйЗапрос
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
    | ПО ВложенныйЗапрос.БазовыйПериодНачало <= ГрафикиРаботы.Дата
    | И ВложенныйЗапрос.БазовыйПериодКонец >= ГрафикиРаботы.Дата
    |ГДЕ
    | ГрафикиРаботы.ТипГрафика = ЗНАЧЕНИЕ(Справочник.ТипыГрафиковРаботы.Шестидневка)
    |
    |СГРУППИРОВАТЬ ПО
    | ВложенныйЗапрос.НомерСтроки,
    | ВложенныйЗапрос.Размер,
    | ВложенныйЗапрос.База,
    | ВложенныйЗапрос.Факт”;

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

    Результат = Запрос.Выполнить();
    Если НЕ Результат.Пустой() Тогда
    Выборка = Результат.Выбрать();
    Поиск=Новый Структура(“НомерСтроки”);
    Для каждого Запись Из ДвОсновныеНачисления Цикл
    Поиск.НомерСтроки=Запись.НомерСтроки;
    Выборка.Сбросить();
    Если Выборка.НайтиСледующий(Поиск) Тогда
    Запись.Результат=?(Выборка.ДнейВГрафике=0,0,Выборка.ДнейОтпуска*Выборка.База/Выборка.ДнейВГрафике);
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;

    ДвОсновныеНачисления.Записать(,Истина);
    КонецПроцедуры

    Процедура РассчитатьДополнительныеНачисления(Отказ)
    ДвДополнительныеНачисления=Движения.ДополнительныеНачисления;

    //Премия
    ВидРасчетаПремияКвартальная=ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная;
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | ДополнительныеНачисления.НомерСтроки КАК НомерСтроки,
    | ДополнительныеНачисления.Размер КАК Размер,
    | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК База
    |ИЗ
    | РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(
    | &Измерения,
    | &Измерения,
    | ,
    | Регистратор = &Ссылка
    | И ВидРасчета = &ПремияКвартальная) КАК ДополнительныеНачисленияБазаОсновныеНачисления
    | ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(
    | &Измерения,
    | &Измерения,
    | ,
    | Регистратор = &Ссылка
    | И ВидРасчета = &ПремияКвартальная) КАК ДополнительныеНачисленияБазаДополнительныеНачисления
    | ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки
    |ГДЕ
    | ДополнительныеНачисления.Регистратор = &Ссылка
    | И ДополнительныеНачисления.ВидРасчета = &ПремияКвартальная”;

    Измерения=Новый Массив;
    Измерения.Добавить(“Сотрудник”);
    Измерения.Добавить(“Подразделение”);
    Запрос.УстановитьПараметр(“Измерения”, Измерения);
    Запрос.УстановитьПараметр(“ПремияКвартальная”, ВидРасчетаПремияКвартальная);
    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);

    Результат = Запрос.Выполнить();
    Если НЕ Результат.Пустой() Тогда
    Выборка = Результат.Выбрать();
    Поиск=Новый Структура(“НомерСтроки”);
    Для каждого Запись Из ДвДополнительныеНачисления Цикл
    Поиск.НомерСтроки=Запись.НомерСтроки;
    Выборка.Сбросить();
    Если Выборка.НайтиСледующий(Поиск) Тогда
    Запись.Результат=Выборка.Размер*Выборка.База/100;
    КонецЕсли;
    КонецЦикла;
    ДвДополнительныеНачисления.Записать(,Истина);
    КонецЕсли;
    КонецПроцедуры 
    </code>

  29. Вопросы по заданию:
    Вопрос  по  квартальной премии.  Если начисляем квартальную премию за  1 квартал 2011, берем для расчета все начисления за  4 квартал 2010?  В том числе и премию за 4 квартал?
     

    • Да, в том числе и квартальную премию.

  30. Майор 16.06.2011 в 13:47

    Всем доброго времени суток.

    Представляю отчёт по четырнадцатому домашнему заданию.
    Основную часть отчёта займёт код, в предисловии просто расскажу, какой результат получился.
    В связи с недостаточно чёткими условиями задачи привожу решения для 2010/2011 годов и пяти/шестидневной рабочей недели, итак:

    апрель 2010 года
    Оклад при пятидневной рабочей неделе –  3 181,82 руб. (при шестидневной – 3 076,92 руб.)
    Отпуск – 1 725,24 руб.

    апрель 2011 года
    Оклад при пятидневной рабочей неделе –  2 857,14 руб. (при шестидневной – 3 076,92 руб.)
    Отпуск – 1 725,24 руб. (это если без учёта данных за 2010 год)

    Премия в обоих случаях составила, естественно, 3 000 руб.

    Привожу листинг модуля объекта документа НачислениеЗП (не знаю – на сколько правильное решение, но запихал всё в один запрос. больше всего настораживает, что для физтаблицы ДополнительныеНачисления нет условия на Регистратор):
    <code>
    Перем Оклад;
    Перем Отпуск;
    Перем Прогул;
    Перем ПремияКвартальная;

    Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    ПериодРегистрации = НачалоМесяца(ПериодРегистрации);
    Для каждого Строчка Из Начисление Цикл
    Если Строчка.НачалоПериода = ‘00010101’ И
    НЕ Строчка.ОкончаниеПериода = ‘00010101’ Тогда
    Строчка.НачалоПериода = НачалоМесяца(Строчка.ОкончаниеПериода);
    ИначеЕсли НЕ Строчка.НачалоПериода = ‘00010101’ И
    Строчка.ОкончаниеПериода = ‘00010101’ Тогда
    Строчка.ОкончаниеПериода = КонецМесяца(Строчка.НачалоПериода);
    ИначеЕсли Строчка.НачалоПериода = ‘00010101’ И
    Строчка.ОкончаниеПериода = ‘00010101’ Тогда
    Строчка.НачалоПериода = ПериодРегистрации;                      
    Строчка.ОкончаниеПериода = КонецМесяца(Строчка.НачалоПериода);
    КонецЕсли;            
    КонецЦикла;
    КонецПроцедуры

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

    ПлановоеПроведение(Отказ);
    РасчетНачислений(Отказ);

    КонецПроцедуры

    Процедура ПлановоеПроведение(Отказ)
    // регистр ОсновныеНачисления
    Движения.ОсновныеНачисления.Записывать = Истина;     
    Для Каждого ТекСтрокаНачисление Из Начисление Цикл
    Если ТекСтрокаНачисление.ВидРасчета = Оклад
    ИЛИ ТекСтрокаНачисление.ВидРасчета = Отпуск
    ИЛИ ТекСтрокаНачисление.ВидРасчета = Прогул Тогда
    Движение = Движения.ОсновныеНачисления.Добавить();
    Движение.Сторно = Ложь;
    Движение.ВидРасчета = ТекСтрокаНачисление.ВидРасчета;
    Движение.ПериодДействияНачало = ТекСтрокаНачисление.НачалоПериода;
    Движение.ПериодДействияКонец = ТекСтрокаНачисление.ОкончаниеПериода;
    Движение.ПериодРегистрации = ПериодРегистрации;
    Движение.Сотрудник = ТекСтрокаНачисление.Сотрудник;
    Движение.Подразделение = ТекСтрокаНачисление.Подразделение;
    Движение.ПлановыйРазмерОклада = ТекСтрокаНачисление.ПлановыйРазмер;
    Движение.ТипГрафика = ТекСтрокаНачисление.ГрафикРаботы;
    Движение.БазовыйПериодНачало = ДобавитьМесяц(ПериодРегистрации, -12);
    Движение.БазовыйПериодКонец = ПериодРегистрации – 1;            
    ИначеЕсли ТекСтрокаНачисление.ВидРасчета = ПремияКвартальная Тогда
    Иначе
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Не известный вид расчёта!”;
    Сообщение.Поле = “Начисление.ВидРасчета”;
    Сообщение.УстановитьДанные(ЭтотОбъект);
    Сообщение.Сообщить();
    Отказ = Истина;
    КонецЕсли;
    КонецЦикла;

    // регистр ДополнительныеНачисления
    Движения.ДополнительныеНачисления.Записывать = Истина;
    Для Каждого ТекСтрокаНачисление Из Начисление Цикл
    Если ТекСтрокаНачисление.ВидРасчета = ПремияКвартальная Тогда
    Движение = Движения.ДополнительныеНачисления.Добавить();
    Движение.Сторно = Ложь;
    Движение.ВидРасчета = ТекСтрокаНачисление.ВидРасчета;
    Движение.ПериодРегистрации = ПериодРегистрации;
    Движение.Сотрудник = ТекСтрокаНачисление.Сотрудник;
    Движение.Подразделение = ТекСтрокаНачисление.Подразделение;
    Движение.ПроцентКвартальнойПремии = ТекСтрокаНачисление.ПлановыйРазмер;
    Движение.БазовыйПериодНачало = ДобавитьМесяц(ПериодРегистрации, -3);
    Движение.БазовыйПериодКонец = ПериодРегистрации – 1;        
    ИначеЕсли ТекСтрокаНачисление.ВидРасчета = Оклад
    ИЛИ ТекСтрокаНачисление.ВидРасчета = Отпуск
    ИЛИ ТекСтрокаНачисление.ВидРасчета = Прогул Тогда
    Иначе
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Неизвестный вид расчёта!”;
    Сообщение.Поле = “Начисление[” + (ТекСтрокаНачисление.НомерСтроки-1) + “].ВидРасчета”;
    Сообщение.УстановитьДанные(ЭтотОбъект);
    Сообщение.Сообщить();
    Отказ = Истина;
    КонецЕсли;
    КонецЦикла;

    Движения.Записать();
    КонецПроцедуры

    Процедура РасчетНачислений(Отказ)

    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    |    ОсновныеНачисленияДанныеГрафика.НомерСтроки,
    |    ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия, 0) КАК ПланПД,
    |    ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод, 0) КАК ПланБП,
    |    ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактПД,
    |    ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РазмерБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РазмерБаза, 0) КАК БазаОсновная,
    |    ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РазмерБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РазмерБаза, 0) КАК БазаДополнительная
    |ИЗ
    |    РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(Регистратор = &Ссылка) КАК ОсновныеНачисленияДанныеГрафика
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(
    |                &Измерения,
    |                &Измерения,
    |                ,
    |                Регистратор = &Ссылка
    |                    И ВидРасчета = &Отпуск) КАК ОсновныеНачисленияБазаДополнительныеНачисления
    |        ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(
    |                &Измерения,
    |                &Измерения,
    |                ,
    |                Регистратор = &Ссылка
    |                    И ВидРасчета = &Отпуск) КАК ОсновныеНачисленияБазаОсновныеНачисления
    |        ПО ОсновныеНачисленияДанныеГрафика.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки
    |        ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления
    |            ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(
    |                    &Измерения,
    |                    &Измерения,
    |                    ,
    |                    ВидРасчета = &ПремияКвартальная
    |                        И Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления
    |            ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки
    |            ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(
    |                    &Измерения,
    |                    &Измерения,
    |                    ,
    |                    ВидРасчета = &ПремияКвартальная
    |                        И Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаДополнительныеНачисления
    |            ПО ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки
    |        ПО ОсновныеНачисленияДанныеГрафика.Регистратор = ДополнительныеНачисления.Регистратор”;

    Измерения = Новый Массив();
    Измерения.Добавить(“Сотрудник”);
    Измерения.Добавить(“Подразделение”);

    Запрос.УстановитьПараметр(“Измерения”, Измерения);
    Запрос.УстановитьПараметр(“Отпуск”, Отпуск);
    Запрос.УстановитьПараметр(“ПремияКвартальная”, ПремияКвартальная);
    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);

    Выборка = Запрос.Выполнить().Выбрать();
    НаборОсновных = Движения.ОсновныеНачисления;
    НаборДополнительных = Движения.ДополнительныеНачисления;
    Поиск = Новый Структура(“НомерСтроки”);

    // ОсновныеНачисления
    Для каждого Запись Из НаборОсновных Цикл
    Поиск.НомерСтроки = Запись.НомерСтроки;
    Выборка.Сбросить();

    Если Выборка.НайтиСледующий(Поиск) Тогда
    Если Запись.ВидРасчета = Оклад Тогда
    Если Выборка.ПланПД = 0 Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Не заполнены значения для графика работы!”;
    Сообщение.Поле = “Начисление[” + (Выборка.НомерСтроки-1) + “].ГрафикРаботы”;
    Сообщение.УстановитьДанные(ЭтотОбъект);
    Сообщение.Сообщить();
    Отказ = Истина;
    Иначе
    Запись.Размер = Выборка.ФактПД * Запись.ПлановыйРазмерОклада / Выборка.ПланПД;
    КонецЕсли;
    ИначеЕсли Запись.ВидРасчета = Отпуск Тогда
    Если Выборка.ПланБП = 0 Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Не заполнены значения для графика работы!”;
    Сообщение.Поле = “Начисление[” + (Выборка.НомерСтроки-1) + “].ГрафикРаботы”;
    Сообщение.УстановитьДанные(ЭтотОбъект);
    Сообщение.Сообщить();
    Отказ = Истина;
    Иначе
    Запись.Размер = Выборка.ФактПД * Выборка.БазаОсновная / Выборка.ПланБП;
    КонецЕсли;
    ИначеЕсли Запись.ВидРасчета = Прогул Тогда
    Иначе
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Не задан алгоритм для данного вида расчёта!”;
    Сообщение.Поле = “Начисление[” + (Выборка.НомерСтроки-1) + “].ВидРасчета”;
    Сообщение.УстановитьДанные(ЭтотОбъект);
    Сообщение.Сообщить();
    Отказ = Истина;    
    КонецЕсли;        
    КонецЕсли;                            
    КонецЦикла;

    Поиск.Очистить();
    Поиск.Вставить(“НомерСтроки”);
    // ДополнительныеНачисления
    Для каждого Запись Из НаборДополнительных Цикл
    Поиск.НомерСтроки = Запись.НомерСтроки;
    Выборка.Сбросить();

    Если Выборка.НайтиСледующий(Поиск) Тогда
    Если Запись.ВидРасчета = ПремияКвартальная Тогда
    Запись.Размер = Выборка.БазаДополнительная * Запись.ПроцентКвартальнойПремии / 100;
    Иначе
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Не задан алгоритм для данного вида расчёта!”;
    Сообщение.Поле = “Начисление[” + (Выборка.НомерСтроки-1) + “].ВидРасчета”;
    Сообщение.УстановитьДанные(ЭтотОбъект);
    Сообщение.Сообщить();
    Отказ = Истина;    
    КонецЕсли;        
    КонецЕсли;                            
    КонецЦикла;

    НаборОсновных.Записать(,Истина);
    НаборДополнительных.Записать(,Истина);
    КонецПроцедуры

    Оклад = ПланыВидовРасчета.ОсновныеНачисления.Оклад;
    Отпуск = ПланыВидовРасчета.ОсновныеНачисления.Отпуск;
    Прогул = ПланыВидовРасчета.ОсновныеНачисления.Прогул;
    ПремияКвартальная = ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная;
    </code>

    • Майор 16.06.2011 в 14:07

      Вопросы буду отдельно задавать, а то их обычно в общем тексте не заметно.
      1)  Если для установки условия в конструкторе запроса использовать оператор ВЫБОР, то каким образом лучше указывать условие после ИНАЧЕ, чтоб для запроса оно было пустым? т.е. если условие ВЫБОР выполняется, то  условие на запрос накладывается, если не выполняется, то условия нет. Или такое сделать нельзя?
       
      2) Я правильно понимаю, что если в одном плане видов расчёта будут присутствовать виды расчёта с различными базовыми периодами, то в процессе формирования “плановых” записей в регистры расчёта для заполнения БазовыйПериодНачало и БазовыйПериодКонец, придётся проверять ВидРасчета на условие равенства предопределённым элементам и в соответствии с результатом – заполнять?

      • 1. Если я правильно понял вопрос, то конструкция может быть такой:

        Выбрать

        ГДЕ
        Выбор
        Когда НекотороеУсловие Тогда Истина;
        Иначе Ложь
        Конец

        2. Речь идет о том, что могут быть разные правила определения базового периода для разных видов расчета?
        И при это пользователь не должен определять сам базовый период.
        В этом случае можно создавать реквизиты в плане видов расчета и при проведении базовый период задавать анализируя значения реквизитов.

  31. Андрей Кусанов 16.06.2011 в 12:20

    Выполнено. По примеру – в апреле получилось:
    оклад по дням: 2 857,14
    отпуск: 2 012,78 (умножал на календарные дни отпуска)
    прогул: 0,00
    премия кв.: 3 000,00

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

    Отпуск = ПланыВидовРасчета.ОсновныеНачисления.Отпуск;
    ОкладПоДням = ПланыВидовРасчета.ОсновныеНачисления.ОкладПоДням;
    Прогул = ПланыВидовРасчета.ОсновныеНачисления.Прогул;
    ПремияКвартальная = ПланыВидовРасчета.ДополнительныеНачисления.ПремияКвартальная;

    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | НачислениеЗаработнойПлатыНачисления.Сотрудник,
    | НачислениеЗаработнойПлатыНачисления.Подразделение,
    | НАЧАЛОПЕРИОДА(НачислениеЗаработнойПлатыНачисления.ДатаНачала, МЕСЯЦ) КАК ПериодДействия,
    | НАЧАЛОПЕРИОДА(НачислениеЗаработнойПлатыНачисления.ДатаНачала, ДЕНЬ) КАК ПериодДействияНачало,
    | КОНЕЦПЕРИОДА(НачислениеЗаработнойПлатыНачисления.ДатаОкончания, ДЕНЬ) КАК ПериодДействияКонец,
    | ВЫБОР
    | КОГДА НачислениеЗаработнойПлатыНачисления.ВидРасчета = &Отпуск
    | ТОГДА &Шестидневка
    | ИНАЧЕ НачислениеЗаработнойПлатыНачисления.ТипГрафика
    | КОНЕЦ КАК ТипГрафика,
    | НачислениеЗаработнойПлатыНачисления.Размер,
    | НачислениеЗаработнойПлатыНачисления.ВидРасчета,
    | НачислениеЗаработнойПлатыНачисления.Сторно,
    | НачислениеЗаработнойПлатыНачисления.Ссылка.ПериодРегистрации КАК ПериодРегистрации,
    | ВЫБОР
    | КОГДА НачислениеЗаработнойПлатыНачисления.ВидРасчета = &Отпуск
    | ТОГДА ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(НачислениеЗаработнойПлатыНачисления.ДатаНачала, МЕСЯЦ), МЕСЯЦ, -12)
    | КОГДА НачислениеЗаработнойПлатыНачисления.ВидРасчета = &ПремияКвартальная
    | ТОГДА ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(НачислениеЗаработнойПлатыНачисления.ДатаНачала, МЕСЯЦ), МЕСЯЦ, -3)
    | ИНАЧЕ NULL
    | КОНЕЦ КАК БазовыйПериодНачало,
    | ВЫБОР
    | КОГДА НачислениеЗаработнойПлатыНачисления.ВидРасчета = &Отпуск
    | ИЛИ НачислениеЗаработнойПлатыНачисления.ВидРасчета = &ПремияКвартальная
    | ТОГДА ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(НачислениеЗаработнойПлатыНачисления.ДатаНачала, МЕСЯЦ), СЕКУНДА, -1)
    | ИНАЧЕ NULL
    | КОНЕЦ КАК БазовыйПериодКонец,
    | ВЫБОР
    | КОГДА НачислениеЗаработнойПлатыНачисления.ВидРасчета ССЫЛКА ПланВидовРасчета.ОсновныеНачисления
    | ТОГДА ИСТИНА
    | ИНАЧЕ ЛОЖЬ
    | КОНЕЦ КАК ЭтоОсновныеНачисления
    |ИЗ
    | Документ.НачислениеЗаработнойПлаты.Начисления КАК НачислениеЗаработнойПлатыНачисления
    |ГДЕ
    | НачислениеЗаработнойПлатыНачисления.Ссылка = &Ссылка”;

    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
    Запрос.УстановитьПараметр(“Отпуск”, Отпуск);
    Запрос.УстановитьПараметр(“ПремияКвартальная”, ПремияКвартальная);
    Запрос.УстановитьПараметр(“Шестидневка”, Справочники.ТипыГрафиков.Шестидневка);
    Результат = Запрос.Выполнить();

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

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

    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
    Если Выборка.ЭтоОсновныеНачисления Тогда
    Запись = НаборОсновныеНачисления.Добавить();
    ЗаполнитьЗначенияСвойств(Запись, Выборка);
    Иначе //Доп
    Запись = НаборДопНачисления.Добавить();
    ЗаполнитьЗначенияСвойств(Запись, Выборка);
    КонецЕсли;
    КонецЦикла;

    //формирование рабочего набора
    НаборОсновныеНачисления.Записать();
    НаборДопНачисления.Записать();

    //расчет 1
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | ОсновныеНачисленияДанныеГрафика.НомерСтроки,
    | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеФактическийПериодДействия, 0) КАК ФактическийПериод,
    | ЕСТЬNULL(ОсновныеНачисленияДанныеГрафика.ЗначениеПериодДействия, 0) КАК ПлановыйПериод
    |ИЗ
    | РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(
    | Активность
    | И Регистратор = &Регистратор
    | И ВидРасчета = &ОкладПоДням) КАК ОсновныеНачисленияДанныеГрафика”;

    Запрос.УстановитьПараметр(“Регистратор”, Ссылка);
    Запрос.УстановитьПараметр(“ОкладПоДням”, ОкладПоДням);

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

    Выборка = Результат.Выбрать();

    //обходим набор
    Для каждого Запись Из НаборОсновныеНачисления Цикл
    Если Запись.ВидРасчета = ОкладПоДням Тогда
    Выборка.Сбросить();
    Если Выборка.НайтиСледующий(Новый Структура(“НомерСтроки”, Запись.НомерСтроки)) Тогда
    //расчет
    Если Выборка.ПлановыйПериод = 0 Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Не обнаружено плановых дней в периоде рассчета оклада!”;
    Сообщение.Сообщить();
    Запись.Результат = 0;
    Иначе
    Запись.Результат = Выборка.ФактическийПериод*Запись.Размер/Выборка.ПлановыйПериод*?(Запись.Сторно, -1, 1);
    КонецЕсли;
    Иначе
    Запись.Результат = 0;
    КонецЕсли;
    ИначеЕсли Запись.ВидРасчета = Прогул Тогда
    Запись.Результат = 0;
    КонецЕсли;
    КонецЦикла;
    НаборОсновныеНачисления.Записать(,Истина);

    //расчет 2 – зависимые от оклада
    //считаем, что оклад могли ввести за предыдущий период
    //и эти записи нужно учесть при расчете отпуска и премии
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | База.НомерСтроки,
    | База.РезультатБаза,
    | ОсновныеНачисленияДанныеГрафика.ЗначениеБазовыйПериод КАК ДнейПоШестидневке,
    | РАЗНОСТЬДАТ(ОсновныеНачисленияДанныеГрафика.ПериодДействияНачало, ОсновныеНачисленияДанныеГрафика.ПериодДействияКонец, ДЕНЬ) + 1 КАК КалендарныхДнейОтпуска
    |ИЗ
    | (ВЫБРАТЬ
    | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки, ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки,
    | ЕСТЬNULL(ОсновныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ОсновныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза
    | ИЗ
    | РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(
    | &Измерения,
    | &Измерения,
    | ,
    | Активность
    | И ВидРасчета = &Отпуск
    | И Регистратор = &Регистратор) КАК ОсновныеНачисленияБазаОсновныеНачисления
    | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(
    | &Измерения,
    | &Измерения,
    | ,
    | Активность
    | И ВидРасчета = &Отпуск
    | И Регистратор = &Регистратор) КАК ОсновныеНачисленияБазаДополнительныеНачисления
    | ПО ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК База
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(
    | Активность
    | И Регистратор = &Регистратор
    | И ВидРасчета = &Отпуск) КАК ОсновныеНачисленияДанныеГрафика
    | ПО База.НомерСтроки = ОсновныеНачисленияДанныеГрафика.НомерСтроки”;

    Измерения = Новый Массив;
    Измерения.Добавить(“Сотрудник”);
    Измерения.Добавить(“Подразделение”);
    Запрос.УстановитьПараметр(“Измерения”, Измерения);
    Запрос.УстановитьПараметр(“Отпуск”, Отпуск);
    Запрос.УстановитьПараметр(“Регистратор”, Ссылка);

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

    //обходим набор
    Для каждого Запись Из НаборОсновныеНачисления Цикл
    Если Запись.ВидРасчета = Отпуск Тогда
    Запись.Результат = 0;
    Выборка.Сбросить();
    Если Выборка.НайтиСледующий(Новый Структура(“НомерСтроки”, Запись.НомерСтроки)) Тогда
    //расчет отпуска
    Если Выборка.ДнейПоШестидневке = 0 Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Не обнаружено плановых дней по шестидневке в периоде рассчета отпуска!”;
    Сообщение.Сообщить();
    Иначе
    Запись.Результат = Выборка.РезультатБаза*Выборка.КалендарныхДнейОтпуска/Выборка.ДнейПоШестидневке*?(Запись.Сторно, -1, 1);
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;

    НаборОсновныеНачисления.Записать(,Истина);

    //расчет 3 – нужно премию посчитать, как зависимую от всех начислений
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки, ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки) КАК НомерСтроки,
    | ЕСТЬNULL(ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза, 0) + ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.РезультатБаза, 0) КАК РезультатБаза,
    | ЕСТЬNULL(ДополнительныеНачисленияБазаДополнительныеНачисления.Размер, ДополнительныеНачисленияБазаОсновныеНачисления.Размер) КАК Размер
    |ИЗ
    | РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(
    | &Измерения,
    | &Измерения,
    | ,
    | Активность
    | И ВидРасчета = &ПремияКвартальная
    | И Регистратор = &Регистратор) КАК ДополнительныеНачисленияБазаОсновныеНачисления
    | ПОЛНОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаДополнительныеНачисления(
    | &Измерения,
    | &Измерения,
    | ,
    | Активность
    | И ВидРасчета = &ПремияКвартальная
    | И Регистратор = &Регистратор) КАК ДополнительныеНачисленияБазаДополнительныеНачисления
    | ПО ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаДополнительныеНачисления.НомерСтроки”;

    Измерения = Новый Массив;
    Измерения.Добавить(“Сотрудник”);
    Измерения.Добавить(“Подразделение”);
    Запрос.УстановитьПараметр(“Измерения”, Измерения);
    Запрос.УстановитьПараметр(“ПремияКвартальная”, ПремияКвартальная);
    Запрос.УстановитьПараметр(“Регистратор”, Ссылка);

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

    Выборка = Результат.Выбрать();

    //обходим набор
    Для каждого Запись Из НаборДопНачисления Цикл
    Если Запись.ВидРасчета = ПремияКвартальная Тогда
    Запись.Результат = 0;
    Выборка.Сбросить();
    Если Выборка.НайтиСледующий(Новый Структура(“НомерСтроки”, Запись.НомерСтроки)) Тогда
    //расчет премии квартальной
    Запись.Результат = Выборка.РезультатБаза*Выборка.Размер/100*?(Запись.Сторно, -1, 1);
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;

    НаборДопНачисления.Записать(,Истина);

    КонецПроцедуры
    </code>

  32. Выполнено. Все делалось по аналогии с видео-уроками.
    Останавлюсь на основных моментах.

    Первый этап расчета: при записи наборов регистров расчетов из данных табличной части документа Начисление ЗП конечные даты надо приводить к КОНЦУ ДНЯ.
    В противном случае, в виртуальной таблице ФАКТИЧЕСКОГО периода действия может происходить НАЛОЖЕНИЕ граничных дат.

    ……………
    Движение.ТипГрафика = ТекСтрокаНачисления.ГрафикРаботы;
    Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачало;
    Движение.ПериодДействияКонец     = КОНЕЦДНЯ(ТекСтрокаНачисления.ДатаОкончание); //!!! Чтобы учитывались секунды при вытеснении!!
    ……………

    Второй этап расчета: основная сложность – расчет отпуска.
    Для основных начислений выбран запрос:

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

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

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

    ……………

    ИначеЕсли Запись.ВидРасчета = Отпуск Тогда

    Парам = РегистрыСведений.ГрафикРаботы.ВернутьДниПоГрафику(Справочники.ТипыГрафиков.Шестидневка, Запись.БазовыйПериодНачало, Запись.БазовыйПериодКонец);
    БазаДней             =  Парам.ЗначениеДней;
    СредЗаработок         = ?(БазаДней = 0, 0, Выборка.БазаСумма / БазаДней);  

    Запись.Результат     = СредЗаработок * Выборка.КалендарныеДниОтпуска * ?(Запись.Сторно,-1,1) ;
    ……………
    Получилось: Базовых дней для отпуска (с 01.03.2010 по 31.03.2011 по шестидневке) = 340, Базовая сумма = 30 000 (вошли данные только оклада за квартал). Средний заработок = 30000/340 = 88.235

    Отпуск берется в календарных днях. Поэтому пришлось делать левое соединение с ВТ фактического периода действия, где подсчитывалась РАЗНИЦА ДАТ по периоду действия (поскольку отпуск теоретически может также разбиваться на несколько периодов при вытеснении)

    …СУММА(РАЗНОСТЬДАТ(ОсновныеНачисленияФактическийПериодДействия.ПериодДействияНачало, ОсновныеНачисленияФактическийПериодДействия.ПериодДействияКонец, ДЕНЬ) + 1)…

    Календарных дней = 21 день (с 05 по 25)

    Специально для подсчета времени по графику шестидневка в модуле менеджера регистра расчета сделал экспортную функцию

    Функция ВернутьДниПоГрафику(ТипГрафика, НачДата, КонДата) Экспорт

    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    |    СУММА(ВЫБОР
    |            КОГДА ГрафикРаботы.Значение > 0
    |                ТОГДА 1
    |            ИНАЧЕ 0
    |        КОНЕЦ) КАК Дней,
    |    СУММА(ГрафикРаботы.Значение) КАК ЗначениеДней
    |ИЗ
    |    РегистрСведений.ГрафикРаботы КАК ГрафикРаботы
    |ГДЕ
    |    ГрафикРаботы.ТипГрафика = &ТипГрафика
    |    И ГрафикРаботы.Дата МЕЖДУ &НачДата И &КонДата”;

    Запрос.УстановитьПараметр(“ТипГрафика”,ТипГрафика);
    Запрос.УстановитьПараметр(“НачДата”,НачДата);
    Запрос.УстановитьПараметр(“КонДата”,КонДата);

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

    Выборка = Результат.Выбрать();

    Парам = Новый Структура(“КоличествоДней, ЗначениеДней”,0,0);
    //универсальные значения: количество дней с ненулевыми значениями и сумма всех значений дней
    Если Выборка.Следующий() Тогда
    Парам.КоличествоДней     = Выборка.Дней;
    Парам.ЗначениеДней     = Выборка.ЗначениеДней;
    КонецЕсли;

    Возврат Парам;

    КонецФункции // ВернутьДниПоГрафику()

  33. Задание выполнила
    http://fotoifolder.ru/view_full_size/2fwg0one9b6s
    http://fotoifolder.ru/view_full_size/-qwdvst2ow18
    С расчетом отпуска возникли проблемы. Сначала хотела соединить запрос по базе с данными графика, но не получилось.
    http://fotoifolder.ru/view_full_size/-qwdvst2ow18