Опубликован: 06.12.2011 | Уровень: специалист | Доступ: платный
Лекция 5:

Разработка расчетной подсистемы: расчет показателей, перерасчеты

< Лекция 4 || Лекция 5: 12345 || Лекция 6 >
Аннотация: В этой лекции рассматривается разработка механизмов расчета данных регистров расчета, работа с перерасчетами, разработка справочной системы прикладного решения, построение отчета для визуализации механизмов вытеснения и сторнирования

Цель лекции: научиться программно рассчитывать результаты начислений в регистре расчета, работать с перерасчетами

Расчет в регистрах расчета

Предыдущая лекция завершилась на том, что мы сформировали движения по регистрам накопления и вызвали процедуру общего модуля РассчитатьЗарплату. Эта процедура находится в модуле РасчетЗарплаты, ниже приведен ее код:

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

Процедура РассчитатьДополнительныеНачисления
(Регистратор, НаборЗаписейДоп, Категория)
        Измерения=Новый Структура;
    Измерения.Вставить("Сотрудник", "ОсновныеНачисления.Сотрудник,
         ДополнительныеНачисления.Сотрудник");
    Ресурсы=Новый Массив(1);
    Ресурсы[0]="ОсновныеНачисления.Сумма, ДополнительныеНачисления.Сумма";
    ОтборРегистратор = Новый Структура;
    ОтборРегистратор.Вставить("Регистратор", Регистратор);
        База=РегистрыРасчета.ДополнительныеНачисления.ПолучитьБазу
            (ОтборРегистратор, Ресурсы, Измерения);
    Для Каждого Запись из НаборЗаписейДоп Цикл
      Если Запись.ВидРасчета.КатегорияРасчета=Категория Тогда
        Индекс=НаборЗаписейДоп.Индекс(Запись);
        БазаЗаписи=База[Индекс].Сумма;
        МетодРасчета=Запись.ВидРасчета.МетодРасчета;
        ИсходныеДанные=Запись.ИсходныеДанные;
        Если МетодРасчета=Перечисления.МетодыРасчета.ФиксированнаяСумма Тогда
          Запись.Сумма=ИсходныеДанные;
        ИначеЕсли МетодРасчета=Перечисления.МетодыРасчета.Процент Тогда
          Запись.Сумма=БазаЗаписи*ИсходныеДанные/100;
        КонецЕсли;
      КонецЕсли;
    КонецЦикла;
  НаборЗаписейДоп.Записать();  
КонецПроцедуры
< Лекция 4 || Лекция 5: 12345 || Лекция 6 >
Константин Павлов
Константин Павлов

Почему в лекции 1 "Основы организации бухгалтерской подсистемы" курса "Разработка прикладных решений для платформы 1С:Предприятие 8.2 в режиме "Управляемое приложение"" совершенно нет информации о том что нужно на вкладке данные в табличной части создать табличную часть "ВидыСубконто" и также нет информации о том какие нужно добавить реквизиты и какие у этих реквизитов должен быть тип? Считаю лекцию 1 в данном вопросе недоработанной.

Надежда Федулкина
Надежда Федулкина
Олег Некрасов
Олег Некрасов
Россия
Алексей Васильев
Алексей Васильев
Россия, Новосибирск