Главная » 1С Предприятие » АТРИБУТЫ И МЕТОДЫ ПРАВИЛ  ПЕРЕРАСЧЕТА

0

7.16.1.  АТРИБУТЫ ПРАВИЛ ПЕРЕРАСЧЕТА

Правило перерасчета, как  отмечено в  разд.  7.7, при  вводе ведущего расчета  обнуляет  значение  атрибута Рассчитана  у зависимых расчетов.

Каждое  правило имеет 4 атрибута: Код, Наименование,  Тип и  КоличествоПериодов. Их описание дано  в табл.  7.20.

Атрибуты  правил  перерасчета

Таблица 7.20

Атрибут

Описание

Код

Строка,  содержащая  идентификатор  правила перерасчета (разд.  7.7)

Наименование

Строка,  содержащая  комментарий правила перерасчета

Тип

Зависимые расчеты должны  быть перерассчитаны:

•   если Тип = 0 в текущем расчетном  периоде ЖР;

•   если Тип = 1 в том же расчетном периоде, к которому принадлежит вводимый  ведущий  расчет;

•   если Тип = 2 в нескольких периодах, следующих за периодом, к которому принадлежит  вводимый  ведущий расчет  (разд.  7.7).

Число периодов, Охватываемых  правилом, заносится  в атрибут КоличествоПериодов  правила перерасчета

КоличествоПериодов

Число  периодов,  охватываемых  правилом перерасчета.  Может быть больше единицы, только когда Тип = 2

Пример.  Выводятся  атрибуты правила перерасчета  КвартальнаяПремия.

процедура Выполнить()                     //              Связана с кнопкой Пуск обработки Проба перем ПП;

ОчиститьОкноСообщений();               //         Очищаем окно сообщений

ПП = ПравилоПерерасчета.КвартальнаяПремия; Сообщить("Код (идентификатор): " + ПП.Код); Сообщить("Наименование (комментарий):" + ПП.Наименование); Сообщить("Тип = " + ПравилоПерерасчета.КвартальнаяПремия.Тип); Сообщить("КоЛичествоПериодов = " + ПП.КоличествоПериодов);

конецПроцедуры // Выполнить

Результат:

Код (идентификатор): КвартальнаяПремия Наименование (комментарий): Для  квартальной премии Тип = 2

КоличествоПериодов = 3

7.16.2.  МЕТОДЫ ПРАВИЛ ПЕРЕРАСЧЕТА

Находятся в табл.   7.21.

Методы правил перерасчета

Таблица 7.21

Метод

Описание

колВед  = ПП.КоличествоВедущих();

Возвращает количество ведущих  ВР в правиле  перерасчета ПП

флаг = ПП.ИмеетВедущий(ВР);

Вернет  1, если  вид расчета ВР  входит в правило  перерасчета ПП  как  ведущий

ВР = ПП.ПолучитьВедущий(ном);

Возвращает вид расчета ВР, входящий в правило  перерасчета ПП  как  ведущий под  номером ном

ПП.ДобавитьКакВедущий(ВР);

Добавляет в  правило перерасчета ПП  вид расчета ВР в  качестве  ведущего

Метод

Описание

ПП.УдалитьВсеВедущие();

Удаляет из правила  перерасчета  ПП  все ведущие ВР

колПод =  ПП.КоличествоПодчиненных();

Возвращает количество подчиненных (зависимых) ВР в правиле  перерасчета ПП

флаг = ПП.ИмеетПодчиненный();

Вернет  1, если вид расчета ВР входит  в правило перерасчета ПП как подчиненный

ВР = ПП.ПолучитьПодчиненный(ном);

Возвращает вид расчета ВР, входящий в правило перерасчета ПП как подчиненный под номером ном

ПП.ДобавитьКакПодчиненный();

Добавляет  в правило перерасчета ПП вид расчета ВР в качестве подчиненного

ПП.УдалитьВсеПодчиненные();

Удаляет из правила перерасчета ПП все зависимые ВР

флагТек =

ПравилоПерерасчета.Применять  ‘

([флагНов]);

При вводе ведущих ВР  правила перерасчета применяются, если флагНов = 1, и не применяются, если флагНов = 0. По умолчанию флагНов =  1. Возвращает текущее, до вызова метода значение флага применения правил перерасчета

Замечание. Префикс ПП,  употребленный  с  методами   правил   перерасчета,   может быть  произвольным.

Пример  1:

процедура Выполнить()                     //              Связана с кнопкой Пуск обработки  Проба перем ПП, колВед, колПод, ин;

ОчиститьОкноСообщений();              //         Очищаем окно сообщений

ПП  = ПравилоПерерасчета.ВБанк_2; колВед = ПП.КоличествоВедущих(); колПод = ПП.КоличествоПодчиненных();

Сообщить("Правило перерасчета " + ПП.Код); Сообщить("Число ведущих  ВР:"  + колВед); Сообщить("Число зависимых ВР: " + колПод); Сообщить("Список ведущих  ВР:");

для ин = 1 по колВед цикл Сообщить(ПП.ПолучитьВедущий(ин).Код);

конецЦикла; // для Сообщить("Список зависимых ВР:"); для ин = 1 по колПод цикл

Сообщить(ПП.ПолучитьПодчиненный(ин).Код); конецЦикла; // для

конецПроцедуры // Выполнить

Результат:

Правило перерасчета  ВБанк_2

Число ведущих  ВР: 6

Число зависимых ВР:  1

Список ведущих  ВР:

НачСальдо_2

Оклад_2

ПремияКоэф_2

ПремияСум_2

Премия1234_2

НДФЛ_2

Список зависимых ВР: ВБанк_2

Пример  2.  В  правиле перерасчета ВБанк_2  первоначально удаляются все  ведущие  и подчиненные ВР, а затем оно  формируется  заново.

процедура Выполнить()                     //              Связана с кнопкой Пуск обработки Проба  перем ПП,  ВРВед[6], ВРПод,  ин;

ОчиститьОкноСообщений();              //         Очищаем окно сообщений  ПП  =  ПравилоПерерасчета.ВБанк_2;

ВРВед[1]  = ВидРасчета.НачСальдо_2; ВРВед[2]  = ВидРасчета.Оклад_2; ВРВед[3] = ВидРасчета.ПремияКоэф_2; ВРВед[4]  = ВидРасчета.ПремияСум_2; ВРВед[5]  = ВидРасчета.Премия1234_2; ВРВед[6]  = ВидРасчета.НДФЛ_2; ВРПод = ВидРасчета.ВБанк_2;

ПП.УдалитьВсеВедущие();                //          Удаляем  ведущие ВР ПП.УдалитьВсеПодчиненные();            //       Удаляем подчиненные ВР

// Контроль

Сообщить("Число ведущих ВР: " + ПП.КоличествоВедущих()); Сообщить("Число подчиненных ВР: " + ПП.КоличествоПод4иненных()); для ин = 1 по 6 цикл

ПП.ДобавитьКакВедущий(ВРВед[ин]); конецЦикла; // для ПП.ДобавитьКакПодчиненный(ВРПод);

// Контроль

Сообщить("Число ведущих ВР: " + ПП.КоличествоВедущих()); Сообщить("Число подчиненных ВР: " + ПП.КоличествоПодчиненных());

конецПроцедуры // Выполнить

После   ввода расчетов  интерфейс   ЖЗ  предоставляет  возможность  рассчитать  зарплату  сотрудников,  сформировать  их расчетные листки  и  ведомость  о  перечислениях в банк.  Для  этих целей  с кнопками  диалога (рис.  7.21)  Расчет  зарплаты,  связаны   соответственно   процедуры  РасчетЗП,  ПечатьРЛ  и   ВедомостьБанк.  Это  простые процедуры,  но   для   полноты   изложения  мы   напишем   и   приведем  их  код.   Дополнительно  рассмотрим  запрос, возвращающий распределение результатов  расчетов  ЖЗ по хозяйственным операциям.

7.17.1.   РАСЧЕТ ЗАРПЛАТЫ

Процедура РасчетЗП для  выбранного сотрудника  или сотрудников  заданного  подразделения  выполняет  расчет  его  начислений и   удержаний,  включая  перечисление п банк.   То   есть   в   первом   случае   она   повторяет   действия   процедуры,  запускаемой иконкой  или соответствующим ей пунктом  меню,  во втором эти действия повторяются  для каждого  сотрудника выоранного  подразделения.  1аким ооразом,  наша задача написать  процедуру расчета объекта, а затем  вызвать ее необходимое  число раз.

Поскольку расчет  с ВР  НачСальдо_2 фиксирован, то в  создаваемой  процедуре записи  с  таким ВР  не  будут рассчитываться вовсе. Также  не  рассчитываются записи с неотмененной ручной правкой.  Кроме  того, заложим в процедуру код, проверяющий  присутствие у объекта   обязательного  расчета   с  ВР  НДФЛ2 .  В  соответствии  с  документом  Табель  наличие одного  обязательного  расчета,  например  НДФЛ_2,   говорит о том, что  в  ЖЗ  есть  и  все иные  обязательные расчеты объекта, то  есть  расчеты с ВР Оклад_2 и ВБанк_2.

После всего сказанного  текст процедур расчета зарплаты может быть таким:

// Процедура РасчетОбъекта рассчитывает все записи объекта ЖЗ,

// кроме расчета с ВР НачСальдо_2

// Поскольку процедура присутствует в модуле формы списка ЖЗ,

// то все методы ЖР вызываются без префикса  процедура РасчетОбъекта(сотр)

перем флаг, сотр2;

// Флаг будет равен единице, если у сотрудника есть расчет с ВР Оклад_2 флаг = 0;

сотр2 = сотр;                           //                 Запоминаем для вывода сообщения

// Открываем  выборку расчетов объекта, зарегистрированных в текущем периоде ВыбратьПериодПоОбъекту(сотр);

пока ПолучитьЗапись() = 1 цикл

если видРасч = ВидРасчета.НДФЛ_2 тогда флаг = 1;

конецЕсли;

// Фиксированные и исправленные записи рассчитывать нет смысла если Фиксирована + Исправлена = 0 тогда

Рассчитать(); конецЕсли;

конецЦикла; // пока если флаг = 0 тогда

Сообщить("Оформите табель сотруднику " + сотр2.Наименование); конецЕсли;

конецПроцедуры // РасчетОбъекта процедура СоздатьСЗнач(сЗначСотр) далее

процедура РасчетЗП( )

перем сотр, сЗначСотр, ин; ОчиститьОкноСообщений();

если кто =  1 тогда                //          Расчет зарплаты выбранного сотрудника Состояние("Расчет зарплаты сотрудника " + Объект.Наименование);

РасчетОбъекта(Объект);

// Расчет заплаты сотрудников выбранного  подразделения

// Используя метод ЖР ВыбратьПоЗначению, занесем (без повторов) значение

// атрибута Объект расчетов выбранного подразделения в список сЗначСотр

иначе

Состояние("Формируем список сотрудников подразделения " + Объект.Родитель); СоздатьСЗнач(сЗначСотр);      //    Формируем  список сотрудников подразделения для ин = 1 по сЗначСотр.РазмерСписка() цикл

сотр = сЗначСотр.ПолучитьЗначение(ин);

Состояние("Расчет зарплаты сотрудника " + сотр.Наименование);  РасчетОбъекта(сотр);

конецЦикла; // для

// Поправляем закладку отбора УстановитьОтбор("Родитель",  сотр.Родитель);

конецЕсли; конецПроцедуры // РасчетЗП

процедура СоздатьСЗнач(сЗначСотр)      //   Формируем список сотрудников подразделения перем сотр, пер;

сЗначСотр = СоздатьОбъект("СписокЗначений");

пер = ТекущийПериод();

ВыбратьПоЗначению("Родитель", Объект.Родитель, пер, пер);

сотр = Объект;                            //                 Первый объект выборки пока ПолучитьЗапись() = 1 цикл

// Значения в список сЗначСотр заносятся без повторов

если сотр = Объект тогда продолжить;

иначе

сЗначСотр.ДобавитьЗначение(сотр); сотр = Объект;

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

// Добавляем ссылку  на последнего сотрудника выбранного подразделения сЗначСотр.ДобавитьЗначение(сотр);

конецПроцедуры // СоздатьСЗнач

Замечания:

1.       Созданный  код  работает   существенно   быстрее,  чем  аналогичный  встроенный  в  1С.

2.        Процедуры  РасчетОбъекта  и  РасчетЗП  добавляются   в   модуль  формы  списка  ЖЗ Зарплата_2.

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

4.        Сотрудников  выбранного   подразделения можно   было  бы  извлечь из  справочника Сотрудники_2  и  затем   передать   их  процедуре  РасчетОбъекта,  употребив,  например, следующий  код:

процедура РасчетЗЩ )

перем пер, сотр, сСотр_2; ОчиститьОкноСообщений();

если кто =  1 тогда                   //            Расчет зарплаты выбранного сотрудника Состояние("Расчет зарплаты сотрудника " + Объект.Наименование); РасчетОбъекта(Объект);

иначе

сСотр_2  =  СоздатьОбъект("Справочник.Сотрудники_2"); сСотр_2.ИспользоватьРодителя(Объект.Родитель); сСотр_2.ВыбратьЭлементы();

пока сСотр_2.ПолучитьЭлемент() = 1 цикл

сотр = сСотр_2.ТекущийЭлемент(); Состояние("Расчет зарплаты сотрудника " + сотр); РасчетОбъекта(сотр);

конецЦикла; // пока

// Поправляем закладку отбора УстановитьОтбор("Родитель",  сотр.Родитель);

конецЕсли;

конецПроцедуры // РасчетЗП

Критерий выбора кода в  данном  случае  его быстродействие. Вопрос замера времени вычислений обсуждается в разд. 2.8.3.

5.       На период отладки  вам может понадобиться приводимый ниже код,  отменяющий ручную   правку  и   обнуляющий   результат   расчета   с  ВР   ВБанк_2  (перечисление в банк):

// Отменяет ручную правку  и заносит  0 в результат расчета с ВР ВБанк_2

процедура Выполнить()                 //           Связана с кнопкой  Пуск обработки Проба перем жз, перТек, пер;

жз = СоздатьОбъект("ЖурналРасчетов.Зарплата_2"); жз.ВыбратьПериод(жз.НачалоТекущегоПериода()); пока жз.ПолучитьЗапись() = 1 цикл

если жз.Исправлена = 1 тогда

жз.ОтменитьИсправление();      //    Обнуляем флаг ручной правки конецЕсли;

если жз.ВидРасч = ВидРасчета.ВБанк_2 тогда

жз.Результат = 0; конецЕсли;

конецЦикла; // пока конецПроцедуры // Выполнить

Источник: Бартеньев О. В. 1С:Предприятие:  программирование для  всех.  Базовые объекты и расчеты на одной дискете. М.: Диалог-МИФИ, 2005. 464 с.

По теме:

  • Комментарии