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

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

Создадим форму обработки. Добавим в состав ее реквизитов следующие:

Период, Тип: СтандартныйПериод

График, Тип: СправочникСсылка.ГрафикиРаботы

Добавим семь логических реквизитов (тип данныхБулево) с именами Пн, Вт, Ср, Чт, Пт, Сб, Вс.

Добавим команду с именем Заполнить, создадим обработчик для нее и перетащим все созданные реквизиты и команду в область Элементы, реквизиты с наименованиями дней недели поместим в группу с именем УкажитеРабочиеДни, свойство группы Группировка установим в значение Горизонтальная, рис. 4.5.

Форма обработки ЗаполнениеГрафиков

увеличить изображение
Рис. 4.5. Форма обработки ЗаполнениеГрафиков

Заполнение выбранного графика с учетом указания рабочих дней можно реализовать с помощью следующего кода

&НаКлиенте
Процедура Заполнить(Команда)
  ЗаполнитьНаСервере();
  Предупреждение("График заполнен");
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьНаСервере()
  СекундВСутках=60*60*24;
  МассивРабочихДней=Новый Массив(7);
  МассивРабочихДней[0]=Пн;
  МассивРабочихДней[1]=Вт;
  МассивРабочихДней[2]=Ср;
  МассивРабочихДней[3]=Чт;
  МассивРабочихДней[4]=Пт;
  МассивРабочихДней[5]=Сб;
  МассивРабочихДней[6]=Вс;
  КоличествоДней = (НачалоДня(Период.ДатаОкончания) 
      - НачалоДня(Период.ДатаНачала)) / СекундВСутках;
  Для НомерДня=0 По КоличествоДней Цикл
    ТекущаяДата=Период.ДатаНачала+СекундВСутках*НомерДня;
    Запись=РегистрыСведений.РабочиеДниПоГрафику.СоздатьМенеджерЗаписи();
    Запись.График=График;
    Запись.Дата=ТекущаяДата;
    Запись.РабочийДень=?(МассивРабочихДней[ДеньНедели(ТекущаяДата)-1],1,0);
    Запись.Записать();
  КонецЦикла;
КонецПроцедуры

Процедура команды – это клиентская процедура, а нам нужно работать на сервере, так как мы собираемся выполнять операции с регистром сведений, а именно – создавать его элементы.

Мы вызываем из клиентской процедуры Заполнить() процедуру ЗаполнитьНаСервере().

В серверной процедуре мы сначала записываем в переменную СекундВСутках количество секунд в сутках – это значение пригодится нам в дальнейших вычислениях – при работе со значениями, представляющими собой дату, приходится оперировать именно секундами.

Далее, мы создаем новый массив, который называем МассивРабочихДней – этот массив будет содержать значения, установленные в логических реквизитах, размещенных на форме, то есть – либо значение Ложь, либо – значение Истина. В массиве семь элементов, по числу дней недели, нумерация элементов начинается с нуля.

Мы, в переменную КоличествоРабочихДней вносим количество дней, за которое нужно заполнить график. Получаем мы его, вычитая значение свойства ДатаНачала из значения ДатаОкончания – эти стандартные свойства получило поле Период, когда мы установили его тип как СтандартныйПериод. Полученное значение будет выражено в секундах, поэтому мы делим его на ранее найденное количество секунд в сутках.

Цикл Для оперирует счетчиком цикла НомерДня, который начинается с 0, что будет представлять дату начала и изменяется с шагом 1 до ранее найденного количества дней.

В цикле мы находим текущую дату, прибавляя к начальной дате произведение номера дня и количества секунд в сутках, после чего создаем новый менеджер записи для регистра сведений РабочиеДниПоГрафику, заполняем данные записи регистра.

При заполнении ресурса Рабочий день мы используем следующую конструкцию:

Запись.РабочийДень=?(МассивРабочихДней[ДеньНедели(ТекущаяДата)-1],1,0);

В ней мы сначала получаем значение массива МассивРабочихДней, индекс которого соответствует номеру дня в неделе. Метод ДеньНедели, вызванный для некоторой даты, возвращает номер дня в неделе для этой даты. Для понедельника он возвратит 1, для вторника – 2 и так далее. Наш массив имеет нумерацию, начинающуюся с 0, поэтому мы, получив номер дня в неделе, вычитаем из него 1, таким образом оказывается, что если ДеньНедели возвратит 1, что соответствует понедельнику, мы вычтем из этого числа 1, получим 0 и сможем получить значение, хранящееся в элементе массива с индексом 0, то есть – узнать, рабочий ли день в понедельник был выставлен при заполнении пользователем реквизитов формы.

Когда мы получили значение, хранящееся в массиве, мы, если оно истинно (то есть – день рабочий), устанавливаем его в 1, иначе – в 0.

Полученная нами обработка универсальна – она позволяет заполнять графики для любых сочетаний рабочих и нерабочих дней в неделе. На рис. 4.6 показан результат заполнения графика Пятидневка с помощью обработки.

Результат заполнения графика с помощью обработки ЗаполнениеГрафиков

увеличить изображение
Рис. 4.6. Результат заполнения графика с помощью обработки ЗаполнениеГрафиков

Создадим новое перечисление. Назовем его МетодыРасчета, включим в состав подсистемы РасчетЗаработнойПлаты, введем следующие предопределенные элементы:

  • ФиксированнаяСумма
  • Процент
  • ПоДням
  • ПоСреднему
  • ПоОтработанномуВремени

Создадим еще одно перечисление. Назовем его КатегорииРасчета, включим в состав подсистемы РасчетЗаработнойПлаты, зададим следующие предопределенные элементы

  • Первичное
  • ЗависимоеПервогоУровня
  • ЗависимоеВторогоУровня

На рис. 4.7 вы можете видеть созданные перечисления

Перечисления МетодыРасчета и КатегорииРасчета

увеличить изображение
Рис. 4.7. Перечисления МетодыРасчета и КатегорииРасчета
Константин Павлов
Константин Павлов
Почему информация по Плану счетов не полная?
Надежда Федулкина
Надежда Федулкина
где находиться выгрузка базы?
Эварист Аминев
Эварист Аминев
Россия
Илья Калиничев
Илья Калиничев
Россия, Самара