Опубликован: 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. Перечисления МетодыРасчета и КатегорииРасчета
Константин Павлов
Константин Павлов

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

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