ФОРМА СПИСКА ЖУРНАЛА ДОКУМЕНТОВ ТАБЕЛЬ
Документы Табель отображаются в одноименном журнале документов (см. рис. 7.40). Диалог формы списка этого журнала документов создадим в соответствии с рис. 7.50.
 |
Рис. 7.50. Диалог формы списка журнала документов Табель |
Модуль формы списка журнала документов Табель содержит предопределенную процедуру ПриОткрытии. Назначение процедуры такое же, как и у одноименной процедуры модуля формы списка журнала кадровых приказов (раз. 5.8.3.2).
// Список действий по документу. Передается процедуре глобального модуля // глДействия(ТекущийДокумент, сДейст) перем сДейст;
// Формирует список действий и устанавливает интервал журнала,
// отображающий все введенные документы вида Табель процедура ПриОткрытии()
перем дНач; // Дата начала интервала журнала Табель
перем флаг, док;
ОчиститьОкноСообщений();
// Определяем список действий для кнопки "Действия" сДейстДобавитьЗначение("Структура подчиненности"); сДейстДобавитьЗначение("Ввести на основании"); сДейст.ДобавитьЗначение("Движения документа");
флаг =1; // Равен единице, если удалось создать док
попытка
док = СоздатьОбъект("Документ.Табель"); исключение флаг = 0; конецПопытки;
если флаг = 1 тогда // Если документ Табель создан
// Находим документ с наименьшей датой. По умолчанию документы // располагаются в выборке по возрастанию их дат док. ВыбратьДокументы();
если док.ПолучитьДокумент() = 1 тогда дНач = док.ДатаДок; иначе
дНач = ТекущаяДата(); конецЕсли;
иначе // Искомого документа нет
дНач = ТекущаяДата();
конецЕсли;
УстановитьИнтервал(дНач, ТекущаяДата()); конецПроцедуры // ПриОткрытии
// В основной программе модуля всего один оператор сДейст = СоздатьОбъект(''СписокЗначений'');
7.7. ПРАВИЛА ПЕРЕРАСЧЕТА ВИДОВ РАСЧЕТОВ
Все используемые нами ВР в конфигурацию уже добавлены (разд. 7.3.5). Теперь нам нужно уточнить их свойства.
Известно, что результаты одних расчетов зависят от результатов других. Так, налогом облагаются ВР Оклад_2 и все премии. Поэтому ВР НДФЛ_2, возвращающий размер налога, называется зависимым или подчиненным. Виды расчетов, от которых ВР НДФЛ2 зависит, называются ведущими. Другой пример: ВР ВБанк_2 зависит от всех иных ВР и должен пересчитываться при вводе каждого расчета.
Система информирует о необходимости расчета зависимых записей ЖЗ, меняя значение их атрибута Рассчитана с 1 на 0. Соответствующим образом изменяются и иконки, сопровождающие записи. Такая смена значения атрибута Рассчитана обеспечивается правилами перерасчета, которые определяются в конфигурации в подразделе Правила перерасчета раздела Виды расчетов.
Добавим новое правило с именем НДФЛ2, определив ведущие и зависимый ВР в соответствии с рис. 7.51.
 |
Рис. 7.51. Правило перерасчета для ВРНДФЛ_2 |
Это правило будет срабатывать при вводе ВР, отмеченных в левом списке рисунка, приводя к обнулению значения атрибута Рассчитана у ВР, отмеченного в правом списке. В нашем случае галочку возле ВР Оклад_2 из левого списка можно убрать, поскольку расчеты с ВР Оклад_2 и НДФЛ_2 вводятся в ЖЗ одним документом, что явным образом обеспечивает изменение значения атрибута Рассчитана.
Добавим теперь в конфигурацию и другие нужные нам правила перерасчета. Их общий список приведем в табл. 7.12.
Таблица 7.12
Новые правила перерасчета |
Идентифи
катор |
Ведущие ВР |
Зависимый
ВР |
НДФЛ_2 |
Оклад_2, ПремияКоэф_2, ПремияСум_2, Премия 1234_2 |
НДФЛ_2 |
ВБанк_2 |
НачСальдо 2, Оклад 2, ПремияКоэф 2, ПремияСум 2, Премия1234_2, НДФЛ_2 |
ВБанк_2 |
Премия 1234_2 |
Оклад_2, ПремияКоэф_2, ПремияСум_2 |
Премия1234_2 |
|
Таким образом, благодаря этим правилам мы будем практически всегда иметь в ЖЗ верные сведения о том, какие записи нужно рассчитать заново, воспользовавшись, например, соответствующим пунктом колонки Действия меню системы (рис. 7.52).
Я Рас с читалъ іашкь |
|
“р Рассчитать объект |
л |
Горюнова Улына |
Начальное с- |
|
-о^о] |
«1 |
Горюнова Ульяна |
Оклад |
165.0! |
3200 00І |
V
т
1
1 |
? |
Горюнова У льяна |
НДФЛ |
|
416.001 |
-1 |
О |
Горюнова Ульяна |
Перечне лет* |
|
2.784.001 |
|
Рис. 7.52. Расчет отдельной записи ЖЗ |
Правила перерасчета срабатывают не только при вводе, но и при ручной правке ведущего ВР.
Замечание. Ситуация, когда не работают правила перерасчета, анализируется в разд. 7.10.1.
7.8. ВИДЫ РАСЧЕТОВ ДОКУМЕНТА ТАБЕЛЬ
7.8.1. ВИД РАСЧЕТА ОКЛАД_2
Выполним всю цепочку задания свойств ВР Оклад_2, включающую также и написание кода процедуры получения результата.
Предварительно, однако, нам потребуется создать группу ВР ВсеНачисления_2, в которую мы будем включать расчеты-начисления, облагаемые НДФЛ.
Войдем к конфигурацию, добавим группу ВР ВсеНачисления_2 (рис. 7.53), включив в нее указанные на рис. 7.54 ВР.
В Л Группы расчетов
м ВсеУдержания_2 •« ВсеНачисления_2
Рис. 7.53. Добавляем группу ВР ВсеНачисления_2 в конфигурацию системы
Группа расчетов ВсеНачисления 2
?мионим: |Все начисления
ИдемгиФшатор: |ВсеНачисления_2
комментарий: |Для сотрудников из справочника Сотруаники_2
Включает вины расчетов
Не включает еиоы расчетов
Авторские АвторскиеЗаАП АвторскиеЗаИП
Оклад.2
Премчяі 234_2
Прениям рои 2
АвторскиеЗаЛП
ПремияСуи_2
Рис. 7.54. Группа ВР ВсеНачисления_2 |
 |
Раскроем далее окно задания свойств ВР Оклад_2 (рис. 7.55).
-•• Рис. 7.55. Окно задания свойств ВР Оклад_2
Воспользовавшись кнопкой Настройка вытеснения, зададим ВР Оклад_2 как само-вытесняющийся (рис. 7.56).
 |
Рис. 7.56. Теперь ВР Оклад_2 является самовытесняющимся |
Допишем в модуль ВР следующий код:
процедура ПровестиРасчет() // Процедура модуля ВР Оклад_2
// Процедура выполняется при проведении расчета с ВР Оклад_2 перем всегоЧасовПоКалендарю, нтп, ктп;
// На случай непредусмотренной ошибки
если ПустоеЗначение(Объект.Календарь) = 1 тогда
Сообщшъ("Сотруцник " + СокрП(Объект.Наименование) + " не имеет календаря."); возврат; конецЕсли;
нтп = НачалоТекущегоПериода(); ктп = КонецТекущегоПериода();
всегоЧасовПоКалендарю = Объекг.Календарь.Часов(нгп, ктп); если всегоЧасовПоКалендарю > 0 тогда
результат = Объект.Оклад.Получитъ(ктп) * всегоЧасов / всегоЧасовПоКалендарю; -иначе // На случай непредусмотренной ошибки
Сообщить("В календаре сотрудника " + СокрП(Объект.Наименование) +
" нет рабочих дней."); конецЕсли;
конецПроцедуры // ПровестиРасчет Замечания:
\i. Значение периодического реквизита Оклад, возвращается методом справочника Получитъ. Простое использование Объект.Оклад даст нулевой результат
2. Весь код, если бы не проверки, можно было бы разместить в одном операторе:
результат = Объект.Оклад.Получит^КонецТекущегоПериодаО) * всегоЧасов /
Объект.Календарь.Часов(НачалоТекущегоПериодаО, КонецТекущегоПериода());
7.8.2. ВИД РАСЧЕТА НДФЛ_2
ВР НДФЛ_2 также сделаем самовытесняющимся. Ранее этот ВР мы включили в группу ВР ВсеУдержания_2, которую употребили при оценке начального сальдо. Нам же для расчета налога понадобится группа ВР ВсеНачисления_2. Ее присутствие сократит код процедуры вычисления результата:
процедура ПровестиРасчет() // Процедура модуля ВР НДФЛ_2
// Процедура выполняется при проведении расчета с ВР НДФЛ_2 перем жз, нтп, ктп, налог;
жз = СоздатъОбъект("ЖурнапРасчетов.Зарплата_2"); нтп = жз.НачалоТекущегоПериода(); ктп = жз.КонецТекущегоПериода(); налог = 0;
жз.ВыбратьПериодПоОбъекту^бъект, нтп); пока жз.ПолучитьЗапись() = 1 никл
если жз.ВидРасч.ВходитВГруппу(ГруппаРасчетов.ВсеНачисления_2) = 1 тогда налог = налог + жз.результат; конецЕсли; конецЦикла; // пока
// Константа СтавкаНалога является периодической
результат = налог * Константа.СтавкаНалогаПолучит^ктп) /100;
КонецПроцедуры // ПровестиРасчет
Замечание. Будет неверным вместо метода
жз.ВыбратьПериодПоОбъекіу^бъект, нтп);
использовать метод
жз.ВыбратьЗаписиПоОбъекту(Объект, нтп, ктп);
поскольку последний выбирает записи, период действия которых лежит между нтп и ктп. В то же время метод ВыбратьПериодПоОбъекту выбирает все записи, зарегистрированные в текущем периоде и действующие как в текущем, так и в будущих или прошлых периодах.
Чтобы процедура работала, в конфигурацию необходимо добавить периодическую числовую константу СтавкаНалога, положив ее равной, например, 13 %. Последнее можно сделать, запустив после создания константы следующую процедуру:
процедура Выполнить() // Связана с кнопкой Пуск обработки Проба
Константа.СтавкаНалога.Установить(ТекущаяДатаО, 13); конецПроцедуры // Выполнить
7.8.3. ВИД РАСЧЕТА ВБАНК_2
Самовытесняющийся ВР ВБанк_2 оценивается следующей процедурой: процедура ПровестиРасчет() // Процедура модуля ВР ВБанк_2
// Процедура выполняется при проведении расчета с ВР ВБанк_2 // Формула расчета:
// банк = Целая часть(Начальное сальдо + Все начисления - Все удержания) перем жз, нтп, ВР, банк;
жз = СоздатьОбъект(''ЖурналРасчетов.Зарплата_2''); нтп = жз.НачалоТекущегоПериодаО; банк = 0;
// См. замечание относительно метода ВыбратьЗаписиПоОбъекту в предыдущем разделе жз.ВыбратьПериодПоОбъекту(Объект, нтп); пока жз.ПолучитьЗапись() = 1 цикл ВР = жз.ВидРасч;
если (ВР.ВходитВГруппу(ГруппаРасчетов.ВсеНачисления_2) = 1) или (ВР = ВидРасчета.НачСальдо_2) тогда банк = банк + жз.результат;
иначеЕсли ВР.ВходитВГруппу(ГруппаРасчетов.ВсеУдержания_2) = 1 тогда банк = банк - жз.результат; конецЕсли; конецЦикла;//пока
результат = Цел(банк); // Для записи в ЖЗ берем целую часть результата конецПроцедуры // ПровестиРасчет
7.9. ПРЕМИИ
7.9.1. СВОЙСТВА ДОКУМЕНТА
В ЖЗ на данный момент введены расчеты только с обязательными ВР (рис. 7.47). Позаботимся теперь о премиях.
Ввод расчетов-премий будем, как и договаривались, выполнять одним документом - Премия (см. табл. 7.2). Этим документом можно вводить как один выбранный ВР, например ПремияКоэф_2, так несколько премиальных ВР. Проведение документа осуществляется лишь в том случае, когда все сотрудники, представленные к премии и перечисленные в табличной части документа, имеют ненулевую премию. Причем в режиме одновременного начисления нескольких премий, например ПремияКоэф_2, ПремияСум_2 и Премия 12342, они должны быть ненулевыми для каждого сотрудника, занесенного в документ.
Расчеты, порождаемые документом, будут иметь один период действия, задаваемый в шапке документа. В табличной части мы перечислим сотрудников, получивших премию и ее размер.
Напомним формулы для расчета премиальных:
ПремияКоэф_2 = всегоЧасов * к3; // к3 - устанавливаемый руководителем коэффициент
// По умолчанию к3 = 10 для всех сотрудников ПремияСум_2 = Сумма_премии; // Сумма премии устанавливается руководителем // к5 - постоянный для всех сотрудников коэффициент // Берется из списка периодических констант Премия 1234_2 = (Оклад_2 + ПремияКоэф_2 + ПремияСум_2) * к5;
Премия 12342 не требует ввода какого-либо числового значения. Достаточно указать факт ее начисления, что можно сделать, например, при помощи, перечисления ДаНет. По умолчанию, если начисляется Премия1234_2, всем попавшим в список документа сотрудникам установим значение Да. Сотрудники, не получающие премию это вида, из списка удаляются.
Период действия ВР-премий может быть разным. Поэтому нужно иметь возможность задавать даты начала и конца действия каждого ВР.
Учитывая приведенные сведения, определим свойства документа в соответствии с рис. 7.57.
 |
Рис. 7.57. Свойства документа Премия |
Свойства реквизитов документа, кроме заданных по умолчанию, опишем в табл. 7.13.
Таблица 7.13
Реквизиты документа Премия |
Реквизиты |
Описание |
Тип
(разновидность типа) /Ддина-Точность |
Реквизиты шапки документа |
ДатаНачКоэф,
ДатаКонКоэф |
Соответственно дата начала и конца действия расчетов с ВР ПремияКоэф_2 |
Дата |
ДатаНачСум,
ДатаКонСум |
Соответственно дата начала и конца действия расчетов с ВР ПремияСум_2 |
|
ДатаНач1234,
ДатаКон1234 |
Соответственно дата начала и конца действия расчетов с ВР Премия 1234_2 |
|
кто |
Способ заполнения табличной части документа. Используется как идентификатор радиокнопок диалога формы списка документа. Если кто = 1, то подбор выполняется по одному сотруднику; если кто = 2, то в табличную часть документа заносятся сотрудники выбранного подразделения. Используется при открытии проведенного документа |
Числовой /1.0 |
коэф, сум, п1234 |
Флаги начисления премий соответственно коэффициентом, суммой или 1234. Премия начисляется, если флаг равен единице, и не начисляется, если флаг равен нулю |
Числовой /1.0 |
текСтрока |
Номер выбранной строки в списке подразделений сПодр. Используется при открытии проведенного документа для верного позиционирования списка подразделений |
Числовой / 3.0 |
Реквизиты табличной части документа |
Сотрудник |
Сотрудник, получающий премию |
Справочник.
Сотрудники_2 |
к3 |
Коэффициент для расчета ПремииКоэф_2.
По умолчанию к3 = 10. Соответствующий столбец табличной части имеет заголовок Коэф. |
Числовой / 3.0 |
Сумма |
Сумма премии по ВР ПремияСум_2 |
Числовой /10.2 |
Премия1234 |
Флаг начисления премии по ВР Премия 1234_2 |
Перечисление ДаНет |
|
Новый документ можно завести как из формы списка ЖЗ Зарплата_2, нажав на кнопку Ввод расчета (см. рис. 7.21), так и из колонки Документы меню интерфейса Ученик (см. рис. 7.45). Старые документы по премии доступны из ЖЗ и могут быть открыты в журнале документов Расчеты.
Замечание. Выбор значения перечисления ДаНет выполняется из отображенного на рис. 7.58 списка. |
 |
Рис. 7.58. Выбор значения перечисления в ячейке столбца Премия 1234 табличной части документа |
7.9.2. ДИАЛОГ ФОРМЫ СПИСКА ДОКУМЕНТА
7.9.2.1. СЛОИ ДИАЛОГА
Диалог формы списка документа Премия оформим (больше с учебной целью) с двумя закладками, расположив его реквизиты на четырех слоях. Состав основного слоя приведем в соответствие с рис. 7.59.
 |
Рис. 7.59. Основной слой диалога формы списка документа Премия |
На втором слое, которому мы дали имя ВидПремии, расположим флажки коэф, сум и и 1234, указывающие на вид начисляемой премии (рис. 7.60).
 |
Рис. 7.60. Элементы диалога слоя ВидПремии |
Конечно же, основной и второй слои можно было бы благополучно совместить, переместив вид премии на первый слой. Однако, вновь руководствуясь учебными целями, мы сохраним существующее разбиение элементов диалога по слоям.
На слое номер 3, имя которого ИнтервалыРасчетов, предусмотрим задание дат начала и конца всех ВР (рис. 7.61), оставив справа полосу для размещения трех нижних кнопок четвертого слоя.
Интервалы действия расчетов Вид премии Начало интервала Конец интервала
Премия коэффициентом (датаНачКсо^ |ДатаКоиКсо[?|
Премия суммой |ДатаНачСуг^П| . [ДэтаКо«Су*{П]
Премия 1234 |ЛатаНач12з|о| |Дата*Сон123{?|
Рис. 7.61. Состав слоя третьего слоя
Последний, четвертый слой отведем под кнопки (рис. 7.62).
ЗапоФФпъ
Удалить
Очистить
Провести
ОК
Закрыть
Рис. 7.62. Расположение кнопок на четвертом слое диалога
Замечание. При вставке в диалог числового реквизита формата 1.0 (или нескольких числовых реквизитов такого формата) имеется возможность разместить его как поле ввода, флажок или переключатель. Если хотя бы один вставляемый реквизит имеет иной тип или формат, то все реквизиты можно вставить только как поля ввода. Поэтому мы выполнили поэтапную вставку, выбрав для реквизитов кто и прем поле типа переключатель.
Задание дополнительных слоев осуществляется в результате выполнения цепочки Диалог - Слои - выбрать иконку Новый слой ( ) в появившемся диалоге (рис. 7.63) -ввести имя слоя (рис. 7.64) - ОК.
 |
Рис. 7.63. Слои диалога формы списка документа Премия |
 |
Рис. 7.64. Новый слой диалога |
В окне слоев (рис. 7.63) также осуществляется переход со слоя на слой, удаление слоев и их сортировка. Перемещение выделенных элементов диалога с одного слоя на другой производится посредством пункта Поместить колонки Диалог меню системы (рис. 7.65).
 |
Рис. 7.65. Пункты меню для перемещения выделенных элементов диалога на другой слой |
7.9.2.2. ЗАКЛАДКИ ДИАЛОГА
Созданные слои будем отображать на двух закладках: Ввод премий и Интервалы расчетов. На первой закладке одновременно выводятся слои 1, 2 и 4 (Основной, ВидПремии и Кнопки), а на второй - слои 3 (ИнтервалыРасчетов) и 4. Причем при выводе слоя 4 на закладке 2 первые 3 кнопки невидимы.
Описание закладок заносится в атрибут формы Закладки, который является объектом типа СписокЗначений. Это можно сделать, например, в предопределенной процедуре модуля формы ПриОткрытии, разместив в ней следующий код:
// Следующий метод обеспечивает доступ к атрибуту Закладками Форма. ИспользоватьЗакладки( 1);
Форма.Закладки.ДобавитьЗначение(1, "Ввод премий");
Форма.Закладки.ДобавитьЗначение(2, "Интервалы расчетов");
// Теперь можно задать отображаемые на закладке слои Форма.ИспользоватьСлой("Основной, ВидПремии, Кнопки");
Таким образом, с каждой закладкой можно связать один или более слоев. Информация о том, какие слои и какие их элементы должны отображаться при выборе закладки, располагается в предопределенной процедуре модуля формы ПриВыбореЗакладки. В нашем случае она может содержать следующий код:
процедура ПриВыбореЗакладки(номЗакл, значЗакл)
// номЗакл, значЗакл - соответственно номер и значение закладки. В нашем случае // значения этих параметров совпадают если номЗакл = 1 тогда
Форма.ИспользоватьСлой("Основной, ВидПремии, Кнопки");
// заполнить, удалить и очистить - идентификаторы одноименных кнопок Форма. Заполнить. Видимость( 1);
Форма.Удалить. Видимость( 1);
Форма. Очистить. Видимость( 1); иначе
Форма.ИспользоватьСпой(''ИнтервалыРасчетов, Кнопки");
Форма. Заполнить. Видимость(0);
Форма.Удалить. Видимость(0);
Форма. Очистить. Видимость(0); конецЕсли
конецПроцедуры // ПриВыбореЗакладки
В результате проделанной работы мы будем получать на введенных заклад: приведенные на рис. 7.66 и 7.67 изображения.
Ввод прений Интервалы расчетов]
221201
Приказ о прении №
Вид преміи
Режим заполненія
р Коэффициент
Р Счьвла
р Прения 1234
Цех 01 Цех
Премия! 234
Заполигъ
Агальцов Юрий Алексеевич
500 00
Добрецов Борис Юрьевич
Удалитъ
Бараненков Иван Ильич
Очистить
Волосков Михаил Андреевич
Кузьмина Раиса Николаевна
500.00
Провести
Васильева Елена Ивановна
Смирнова Нина Федоровна
500 00
Закрыть
Рис. 7.66. Закладка Ввод премий |
Весе пренаай Интервалы расчетов! |
|
Интервалы действия расчетов |
|
|
Вид премии Начало интервала Конек интервала
Премия коэффициентом |оі.і201 |п| |11.1201 |g| |
Премия суммой |121201 |п| |221201 [?] |
Провести 1 |
Премия 1234 J231201 |п| |31.1201 |п| |
ОК |
Закрыть |
|
Рис. 7.67. Закладка Интервалы расчетов
Замечание. Код подготовки закладок несколько упростится, если кнопки Заполнить, Удалить и Очистить разместить на основном слое.
7.9.2.3. ЭЛЕМЕНТЫ ДИАЛОГА И ИХ ФОРМУЛЫ
Свод элементов диалога дадим в табл. 7.14.
Таблица 7.14
Элементы диалога формы списка документа Премия и их формулы |
Элементы
диалога |
Формула/команда |
Описание |
Режим заполнения; радикнопки Сотрудник и Цех (имеет идентификатор кто) |
Проследить() |
Управляет доступностью элемента диалога сПодр. Если кто = 1 (активна радиокнопка Сотрудник), то элемент сПодр недоступен, если кто = 2, то элемент доступен |
сПодр |
ОтобразитьСПодрО |
Отображает имя выбранного в списке сПодр подразделения и запоминает значение текущей строки списка текСтрока |
флажки коэф, сум и п1234 |
Столбцы() |
Задают вид вводимого ВР. Регулируют видимость столбцов табличной части следующим образом: если коэф = 1, то виден только столбец Коэф.; если сум = 2, то - столбец Сумма, если п1234 = 1, то - столбец 1234, если какая-либо переменная диалога равна нулю, то соответствующий столбец не виден |
Заполнить |
Заполнить() |
Заполняет табличную часть для сотрудников выбранного подразделения, если кто = 2, или открывает форму подбора сотрудников, если кто = 1 |
Удалить |
УдалитьЗап(1) |
Удаляет текущую строку табличной части. Удалению предшествует запрос о необходимости удаления. Доступен, если в табличной части есть хотя бы одна запись |
Очистить |
УдалитьЗап(2) |
Удаляет все строки табличной части. Удалению предшествует запрос о необходимости удаления. Доступен, если в табличной части есть хотя бы одна запись |
Провести |
#Провести |
Выполняет проведение (перепроведение) документа Премия, то есть заносит в ЖЗ расчеты выбранными ВР-премиями |
ОК |
#3аписать Провести Закрыть |
Выполняют проведение (перепроведение), запись и закрытие документа. Документ сохраняется в журнале документов Расчеты |
Закрыть |
#3акрыть |
Закрывает документ |
|
Элементы диалога НомерДок, ДатаДок, № и Сотрудник сделаем недоступными. Доступность и видимость других элементов определяется состоянием диалога.
7.9.3. МОДУЛЬ ФОРМЫ СПИСКА ДОКУМЕНТА
Содержит, кроме названных в табл. 7.14, процедуры ПриОткрытии, ПриЗаписи и ПремияДа.
перем кЗПоУмолчанию; // Значение задается в процедуре ПриОткрытии процедура Проследить() далее
процедура Столбцы() далее
процедура ПремияК10() далее
процедура ПремияДа(пЗнач) далее
процедура Заполнить() далее
процедура ОбработкаПодбора(значен, конт) далее
процедура УдалитьЗап(флаг) далее
процедура КнопкиВидимость(флаг) далее
// Формирует список подразделений сПодр и устанавливает начальные значения // переменных диалога. Причем, если документ проведен, то начальные // значения берутся из ЖЗ процедура ПриОткрытии() перем жз, сСотр_2, дост;
// Значение коэффициента к3 по умолчанию; можно оформить как константу 1С кЗПоУмолчанию = 10;
сСотр_2 = СоздатъОбъект(''Справочник.Сотрудники_2'');
// Формируем, анализируя справочник Сотрудники_2, список подразделений сСотр_2.ПорядокКодов(); с Сотр_2. ВыбратьЭлементы (); пока сСотр_2.ПолучитьЭлемент() = 1 цикл
если сСотр_2.ЭтоГруппа() = 1 тогда
сПодр.ДобавитъЗначение(сСотр_2.ТекущийЭлемент(), сСотр_2.Наименование); конецЕсли; конецЦикла; // пока если Проведен() = 0 тогда
жз = СоздатьОбъект("ЖурналРасчетов.Зарплата_2");
// Начальные значения для периодов действия вводимых расчетов
датаНачКоэф = жз.НачалоТекущегоПериода();
датаКонКоэф = датаНачКоэф +10;
датаНачСум = датаКонКоэф + 1;
датаКонСум = датаНачСум + 10;
датаНач1234 = датаКонСум + 1;
датаКон1234 = жз.КонецТекущегоПериода();
жз = 0;
кто = 2; // Премия сотрудникам выбранного подразделения
коэф =1; // Можно начислить премию коэффициентом
сум = 0; п1234 = 0;
текСтрока =1; // Позиционируемся на цехе 01 в списке сПодр
иначе // Документ проведен
если кто = 2 тогда // Правильно позиционируем список значений сПодр сПодр.ТекущаяСтрока(текСтрока); конецЕсли; конецЕсли;
// Регулируем доступность и видимость элементов диалога Проследить( );
Столбцы( );
// дост — 1, если в табличной части есть записи дост = ?(КоличествоСтрок() = 0, 0, 1); форма.Удалить.Доступность(дост); форма.Очистить.Доступность(дост);
форма.ПанельИнструментов(0); // Отключаем панель инструментов
форма.ЗаголовокС'Премии'');
// Следующий метод обеспечивает доступ к атрибуту Закладками Форма.ИспользоватьЗакладки(1);
Форма.Закладки.ДобавитьЗначение(1, "Ввод премий"); Форма.Закладки.ДобавитьЗначение(2, "Интервалы расчетов");
// Теперь можно задать отображаемые на закладке слои Форма.ИспользоватьСлой("Основной, ВидПремии, Кнопки"); конецПроцедуры // ПриОткрытии
// Распределяет слои диалога формы по закладкам процедура ПриВыбореЗакладки(номЗакл, значЗакл)
// номЗакл, значЗакл - соответственно номер и значение закладки // В нашем случае значения этих параметров совпадают если номЗакл = 1 тогда
Форма.ИспользоватьСлой("Основной, ВидПремии, Кнопки "); КнопкиВидимость(1); // Показываем все кнопки
иначе
Форма.ИспользоватьСлой("ИнтервалыРасчетов, Кнопки ");
КнопкиВидимость(0); // Скрываем три верхние кнопки
конецЕсли
конецПроцедуры // ПриВыбореЗакладки
// Управляет видимостью кнопок Заполнить, Удалить и Очистить (см. рис. 7.61) процедура КнопкиВидимость(флаг)
// заполнить, удалить и очистить - идентификаторы одноименных кнопок Форма.Заполнить.Видимость(флаг);
Форма.Удалить.Видимость(флаг);
Форма.Очистить.Видимость(флаг); конецПроцедуры // КнопкиВидимость
// Управляет доступностью элемента диалога сПодр процедура Проследить()
Премия отобранным сотрудникам кто = 2
если кто = 1 тогда //
форма.СПодр.Доступность(0); иначе //
форма.СПодр .Доступность( 1); конецЕсли;
КонецПроцедуры // Проследить
//Управляет видимостью столбцов Коэф., Сумма и Премия 1234 табличной части документа // и доступностью элементов задания дат на слое ИнтервалыРасчетов
процедура Столбцы()
форма.кЗ.Видимость(коэф); // Премия коэффициентом
форма.ДатаНачКоэф.Доступность(коэф);
форма.ДатаКонКоэф.Доступность(коэф);
форма.Сумма.Видимость(сум); // Премия суммой
форма. ДатаНачСум.Доступность(сум); форма.ДатаКонСум.Доступность(сум);
форма.Премия1234.Видимость(п1234); // Премия 1234
фор'ма.ДатаНач1234.Доступность(п1234);
форма.ДатаКон1234.Доступность(п1234);
если коэф = 1 тогда // Премия коэффициентом
// Заносим в пустые столбцы ПремияКоэф равный кЗПоУмолчанию коэффициент ПремияК10(); конецЕсли;
если п1234 = 1 тогда // Премия 1234
// Заносим в пустые столбцы Премия 1234 значения Да перечисления ДаНет ПремияДа(Перечисление. ДаНет.ЗначениеПоНомеру(1)); конецЕсли;
конецПроцедуры // Столбцы
процедура ОтобразитьСПодр() // Формула элемента диалога сПодр
текСтрока = сПодр.ТекущаяСтрока(); сПодр.ПолучитьЗначение(текСтрока); конецПроцедуры // ОтобразитьСПодр
// Заносит в пустые ячейки столбца задания коэффициента к3 // равный кЗПоУмолчанию коэффициент процедура ПремияК10()
если ВыбратьСтроки() = 1 тогда
пока ПолучитьСтроку() = 1 цикл
к3 = ?(к3 = 0, кЗПоУмолчанию, к3); конецЦикла; // пока конецЕсли;
конецПроцедуры // ПремияК10
// Заносит в пустые столбцы Премия 1234 значения Да перечисления ДаНет процедура ПремияДа(пЗнач)
если ВыбратьСтроки() = 1 тогда
пока ПолучитьСтроку() = 1 цикл
если ПустоеЗначение(Премия1234) = 1 тогда Премия 1234 =пЗнач; конецЕсли; конецЦикла; // пока конецЕсли;
конецПроцедуры // ПремияДа
// Заполняет табличную часть документа Премия для одного (кто = 1)
// или группы сотрудников процедура Заполнить() перем подр;
// Удаляем, если табличная часть заполняется для подразделения // или всего предприятия, ее строки, но только с согласия пользователя если (кто > 1) и (КоличествоСтрок( ) > 0) тогда
если Вопрос("Удалить имеющиеся строки?", "Да+Нет") = "Да" тогда
УдалитьСтроки(); // Очищаем табличную часть документа
иначе
возврат; конецЕсли; конецЕсли; если кто = 1 тогда
// Указываем явно имя основной формы списка для метода ОткрытьПодбор // Задаем режим множественного выбора
// Добавляем в табличную часть в результате каждого выбора в открытой форме // данные одного сотрудника. Собственно добавление осуществляет // предопределенная процедура модуля формы ОбработкаПодбора ОткрытьПодбор("Справочник.Сотрудники_2", "ФормаСписка",, 1); иначеЕсли кто = 2 тогда // Работаем с подразделением
сСотр_2 = СоздатьОбъект("Справочник.Сотрудники_2");
// Заносим в табличную часть данные о сотрудниках выбранного подразделения подр
подр = сПодр.ПолучитьЗначение(сПодр.ТекущаяСтрока());
сСотр_2.ИспользоватьРодителя(подр);
сСотр_2.ВыбратьЭлементы();
пока сСотр_2.ПолучитьЭлемент() = 1 цикл
если сСотр_2.ЭтоГруппа() = 0 тогда // Только сотрудники
// Используем уже имеющуюся процедуру ОбработкаПодбора,
// выполняющую обработку одного сотрудника ОбработкаПодбора(сСотр_2,""); конецЕсли; конецЦикла; // пока конецЕсли;
если КоличествоСтрок() > 0 тогда форма.Удалить.Доступность(1); форма.Очистить.Доступность(1); конецЕсли;
конецПроцедуры // Заполнить
процедура ОбработкаПодбора(значен, конт)
// Запрещаем, если добавляем по одному сотруднику, выбор того же лица дважды если (кто = 1) и (ВыбратьСтроки() = 1) тогда пока ПолучитьСтроку() = 1 цикл
если Сотрудник = значен.ТекущийЭлемент() тогда Предупреждение("Сотрудник уже выбран."); возврат; конецЕсли; конецЦикла; // пока конецЕсли;
НоваяСтрока(); // Новая строка в табличной части документа
Сотрудник = значен.ТекущийЭлемент();
// Премия коэффициентом или 1234 если (коэф = 1) или (п1234 = 1) тогда
к3 = кЗПоУмолчанию; // Коэффициент по умолчанию
конецЕсли;
если п1234 = 1 тогда // Премия 1234 или все премии
// Заносим в столбец Премия 1234 значение Да перечисления ДаНет Премия 1234 = Перечисление.ДаНет.ЗначениеПоНомеру(1); конецЕсли;
// Если есть хотя бы одна запись, то есть что удалять если (кто = 1) и (КоличествоСтрок() = 1) тогда форма.Удалить.Доступность(1); форма.Очистить .Доступность( 1); конецЕсли;
конецПроцедуры // ОбработкаПодбора
// Удаляет с согласия пользователя, если флаг = 1, текущую запись табличной // части документа, и, если флаг = 2, все записи процедура УдалитьЗап(флаг) перем вопр;
вопр = "Удалить " + ?(флаг = 1, "одну запись", "все записи") + "?"; если Вопрос(вопр, "Да+Нет") = "Да" тогда если флаг = 1 тогда УдалитьСтроку();
иначе // флаг = 2
УдалитьСтроки(); конецЕсли;
если КоличествоСтрок() = О тогда форма.Удалить.Доступность(О); форма.Очистить.Доступность(О); конецЕсли; конецЕсли;
конецПроцедуры // УдалитьЗап
// Выполняет проверку дат процедура ПриЗаписи() перем ош; ош = 0;
если (коэф = 1) и (датаНачКоэф > датаКонКоэф) тогда ош = 1; конецЕсли;
если (сум = 1) и (датаНачСум > датаКонСум) тогда ош = 1; конецЕсли;
если (п1234 = 1) и (датаНач1234 > датаКон1234) тогда ош= 1; конецЕсли; если ош = 1 тогда
Предупреждение("Неверный период действия расчета."); СтатусВозврата(0); // Запрещаем запись документа
конецЕсли;
конецПроцедуры // ПриЗаписи
7.9.4. МОДУЛЬ ДОКУМЕНТА
Содержит предопределенную процедуру ОбработкаПроведения. Она для каждого сотрудника табличной части заносит в ЖЗ либо выбранный расчет, либо все расчеты. Причем расчеты заносятся с вычисленными результатами.
Документ можно провести, лишь когда все заданные премии имеют ненулевое значение. В противном случае выдается сообщение; расчеты в ЖЗ не переносятся.
функция ПровершъНаНульО далее функция НайтиЧасы(жз, нтп) далее функция НайтиХозОп(хозОп, ВР) далее
процедура ВводРасчВЖЗ(жз, хозОп, ВР, датаНач, датаКон, рез) далее
процедура ОбработкаПроведения() перем жз, нтп;
перем ВР[3], рассч[3], всегоЧасов[3], рез[3], датаНач[3], датаКон[3]; перем а, б, ин;
// Объект с разновидностью типа Справочник.ХозОпДляВР перем хозОп;
датаНач[1] = датаНачКоэф; датаКон[1] = датаКонКоэф;
датаНач[2] = датаНачСум; датаКон[2] = датаКонСум;
датаНач[3] = датаНач1234; датаКон[3] =датаКон1234;
если ПроверитъНаНулъО = 1 тогда
Предупреждение("Есть расчеты с нулевой премией."); возврат; конецЕсли;
// Для поиска хозяйственных операций ВР хозОп = СоздатъОбъект("Справочник.ХозОпДляВР"); жз = СоздатьОбъект("ЖурналРасчетов.Зарплата_2"); нтп = жз.НачалоТекущегоПериодаО;
// ВР - массив видов премий ВР[1] = ВидРасчета.ПремияКоэф_2;
ВР[2] = ВидРасчета.ПремияСум_2;
ВР[3] = ВидРасчета.Премия1234_2;
для ин = 1 по 3 цикл // Инициализация вспомогательных массивов
// Массив рассч используется для задания значения атрибута ЖЗ Рассчитана рассч[ин] = 0; всегоЧасов[ин] = 0; рез[ин] = 0; конецЦикла; // для
ВыбратьСтроки(); // Открываем выборку строк документа
пока ПолучитьСтроку() = 1 цикл
// Устанавливаем реквизиты для каждого вводимого ВР
а = 1; б = 2; // Параметры цикла Для, вводящего расчеты в ЖЗ
если коэф = 1 тогда // Премия коэффициентом // Найдем по ЖЗ число часов, отработанных сотрудником всегоЧасов[1] = НайтиЧасы(жз, нтп); рез[1] = всегоЧасов[ 1 ] * к3; // Начисленная премия рассч[1] =1; // Запись рассчитана
конецЕсли;
если сум = 1 тогда |
// |
Премия суммой |
рез[2] = Сумма; |
// |
Начисленная премия |
рассч[2] = 1; |
// |
Запись рассчитана |
конецЕсли;
// Для ввода премии |
1234 (и 1234 = |
1) все готово |
если п1234 = 1 тогда |
// |
Премия 1234 |
а =1; б = 3; |
// |
Параметры цикла Для, вводящего расчеты в ЖЗ |
конецЕсли;
// Ввод расчетов для ин = а по б цикл |
|
|
|
если (ин < 3) и (рассч[ин] = 0) тогда |
продолжить;
конецЕсли;
жз.УстановитьРеквизит(" Рассчитана", рассч [ин]); жз.УстановитьРеквизитС'всегоЧасов'', всегоЧасов[ин]);
ВводРасчВЖЗ(жз, хозОп, ВР[ин], датаНач[ин], датаКон[ин], рез[ин]); конецЦикла // для конецЦикла; // пока
// Вычисляем результаты введенных расчетов
// Выборка записей ЖЗ по документу не дает верного результата
// Поэтому используем выбор записей текущего периода по объекту
// В данном документе нижеследующий расчет результата нужен только
//для ВР Премия 1234. Остальные премии уже подсчитаны
если п1234 = 1 тогда
ВыбратьСтроки(); // Открываем выборку строк документа
пока ПолучитьСтроку() = 1 цикл
жз.ВыбратьПериодПоОбъекту(Сотрудник, нтп); пока жз.ПолучитьЗапись() = 1 цикл
если (жз.Документ = ТекущийДокумент()) и (жз.ВидРасч = ВР[3]) тогда жз.Рассчитать(); // или жз.ВыполнитьРасчет
конецЕсли; конецЦикла; // пока конецЦикла; // пока конецЕсли;
если Проведен() = 0 тогда // Если Документ проводится впервые
// Ограничиваем время показа окна с предупреждением тремя секундами Предупреждение("Документ проведен.", 3); иначе
Предупреждение("Документ перепроведен.", 3); конецЕсли;
конецПроцедуры // ОбработкаПроведения
// Проверяет на наличие расчетов с нулевым результатом // Если таковые есть, то записи не проводятся функция ПроверитьНаНуль()
ВыбратьСтроки( ); // Открываем выборку строк документа
пока ПолучитьСтроку() = 1 цикл
// Отрицательных значений к3 и Сумма быть не может - так заданы свойства // этих элементов диалога. Кроме того, для элемента Сумма задано // свойство Разделять триады
// Премия коэффициентом если (коэф = 1) и (к3 = 0) тогда возврат 1; конецЕсли;
// Премия суммой если (сум = 1) и (Сумма = 0) тогда возврат 1; конецЕсли;
//Премия 1234
если (п1234 = 1) и (Премия 1234 = Перечисление.ДаНет.ЗначениеПоНомеру(2)) тогда возврат 1; конецЕсли; конецЦикла; // пока возврат 0;
конецФункции // ПоверитьНаНуль
// Ищет для премии коэффициентом по ЖЗ число часов, отработанных сотрудником // Это число занесено в ЖЗ вместе с расчетом, имеющим ВР Оклад_2 функция НайтиЧасы(жз, нтп)
жз. ВыбратьПериодПоОбъекту(Сотрудник, нтп); пока жз.ПолучитьЗапись() = 1 цикл
если жз.ВидРасч = ВидРасчета.Оклад_2 тогда возврат жз. ВсегоЧасов; конецЕсли; конецЦикла; // пока
возврат 0; // Расчет с ВР,Оклад_2 для сотрудника не введен конецФункции // НайтиЧасы
// Вводит новые или редактирует имеющиеся в ЖЗ расчеты с заданным ВР процедура ВводРасчВЖЗ(жз, хозОп, ВР, датаНач, датаКон, рез) жз,УстановитьРеквизит("строкаДок", НомерСтроки); жз.УстановитьРеквизит("хозОп", НайтиХозОп(хозОп, ВР)); жз.ВвестиРасчет(Сотрудник, ВР, датаНач, датаКон, рез); конецПроцедуры // ВводРасчВЖЗ
// Возвращает хозяйственную операцию ВР ,
функция НайтиХозОп(хозОп, ВР)
// Ищем простым перебором в справочнике ХозОпДляВР вид расчета ВР
хозОп.ВыбратьЭлементы();
флаг = 0;
пока хозОп.ПолучитьЭлемент() = 1 цикл если хозОп.ВР = ВР тогда флаг = 1; прервать; конецЕсли; конецЦикла; // пока если флаг = 1 тогда
возврат хозОп.хозОп; иначе
возврат ПолучитьПустоеЗначение(хозОп); конецЕсли;
конецФункции // НайтиХозОп
7.9.5. ФОРМА СПИСКА ЖУРНАЛА ДОКУМЕНТОВ РАСЧЕТЫ
Документы НачПериода_2 и Премия отображаются в журнале документов Расчеты (см. рис. 7.57). Форму списка этого журнала документов создадим такую же, как и форму списка журнала документов Табель (разд. 7.6.5).
Модуль формы списка журнала документов Расчеты содержит предопределенную процедуру ПриОткрытии. Назначение процедуры такое же, как и у одноименной процедуры модуля формы списка журнала кадровых приказов (разд. 5.8.3.2).
// Список действий по документу. Передается процедуре глобального модуля // глДействия(ТекущийДокумент, сДейст) перем сДейст;
// Формирует список действий и устанавливает интервал журнала,
// отображающий все введенные документы вида НачПериода_2 и Премия процедура ПриОткрытии()
перем дНач; // Дата начала интервала журнала Расчеты
перем флаг, док;
ОчистигьОкноСообщенийО;
// Определяем список действий для кнопки Действия сДейст.ДобавитьЗначение("Структура подчиненности"); сДейст.ДобавшъЗначение("Движения документа");
флаг = 1; // Равен единице, если удалось создать док
попытка
док = СоздатьОбъект("Документ.НачПериода_2"); исключение попытка
док = СоздатьОбъект("Документ.Премия"); исключение флаг = 0; конецПопытки; конецПопытки;
// Если документ НачПериода_2 или Премия создан если флаг = 1 тогда
// Находим документ с наименьшей датой. По умолчанию документы располагаются // в выборке по возрастанию их дат док. ВыбратьДокументы(); если док.ПолучитьДокумент() = 1 тогда дНач = док.ДатаДок; иначе
дНач = ТекущаяДата(); конецЕсли;
иначе // Искомых документов нет
дНач = ТекущаяДата(); конецЕсли;
УстановитьИнтервал(дНач, ТекущаяДата( )); конецПроцедуры // ПриОткрытии
// В основной программе модуля всего один оператор сДейст = СоздатьОбъект("СписокЗначений");
7.10. ВИДЫ РАСЧЕТОВ ДОКУМЕНТА ПРЕМИЯ
7.10.1. ПРЕМИЯ КОЭФФИЦИЕНТОМ
ВР ПремияКоэф_2 является самовытесняющимся. Включен в группу ВР ВсеНа-числения_2, которая применяется при оценке налога и размера выплат в банк. Является согласно правилам перерасчета ведущим по отношению к ВР НДФЛ2, ВБанк_2 и Премия 1234_2 (разд. 7.7). То есть при вводе расчета с ВР ПремияКоэф_2 или ручном исправлении его результата атрибут Рассчитана нефиксированных расчетов с такими ВР и не имеющих вдобавок неотмененной ручной правки становится равен нулю. Чтобы получить верные результаты, придется после ввода расчета с ВР ПремияКоэф_2 рассчитать заново либо зависимые расчеты, либо весь объект.
Важно, однако, иметь в виду, что если сначала ввести ручную правку расчета с ВР ПремияКоэф_2, затем снять флаг ручной правки и рассчитать заново запись с новым результатом, то атрибут Рассчитана зависимых расчетов не изменится, а общий результат расчета объекта окажется неверным (хотя система будет "думать", что объект рассчитан).
Напомним, что рассчитанные записи сопровождаются в ЖЗ иконкой
„ П ’
считанные - иконкой
процедура ПровестиРасчет() // Процедура модуля ВР ПремияКоэф_2 перем жз;
// Процедура выполняется при проведении расчета с ВР ПремияКоэф_2 // Имеет следующий алгоритм:
// По значению реквизита ЖЗ сторокаДок в документе-родителе ищется запись,
// породившая расчет, в этой записи читается значение реквизита к3,
//зная которое находим искомую величину премии. Переменная всего Часов,
// необходимая для расчета результата, является реквизитом ЖЗ // Если расчет вводился до ввода документа Табель, то всего Часов = 0 если всегоЧасов = 0 тогда // Найдем значение реквизита всегоЧасов
жз = СоздатьОбъект(''ЖурналРасчетов.Зарплата_2''); жз.ВыбратьПериодПоОбъекту(Объект, жз.НачалоТекущегоПериодаО); пока жз.ПолучитьЗапись() = 1 цикл
если жз.ВидРасч = ВидРасчета.Оклад_2 тогда всегоЧасов = жз.ВсегоЧасов; конецЕсли; конецЦикла; // пока конецЕсли;
Документ. ПолучитьСтрокуПоНомеру(строкаДок); результат = всегоЧасов * Документ.к3; конецПроцедуры // ПровестиРасчет
7.10.2. ПРЕМИЯ СУММОЙ
ВР ПремияСум_2 является самовытесняющимся. Включен в группу ВР ВсеНачис-ления_2. Является ведущим по отношению к ВР НДФЛ_2, ВБанк_2 и Премия 12342 (разд. 7.7). Вытесняет ВР ПремияКоэф_2.
процедура ПровестиРасчет( ) // Процедура модуля ВР ПремияСум_2
// Процедура выполняется при проведении расчета с ВР ПремияСум_2
// Имеет следующий алгоритм:
// По значению реквизита ЖЗ сторокаДок в документе-родителе ищется запись,
// породившая расчет, в этой записи читается значение реквизита Сумма,
// которое и является искомой величиной премии Документ. ПолучитьСтрокуПоНомеру(строкаДок); результат = Документ. Сумма; конецПроцедуры // ПровестиРасчет
7.10.3. ПРЕМИЯ 1234
. ВР Премия1234_2 является самовытесняющимся. Включен в группу ВР ВсеНа-числения_2. Является ведущим по отношению к ВР НДФЛ_2, ВБанк_2 и зависимым от ВР Оклад_2, ПремияКоэф_2, ПремияСум_2 (разд. 7.7).
процедура ПровестиРасчет() // Процедура модуля ВР Премия 1234_2 перем жз, нтп, ктп, прем 1234;
// Процедура выполняется при проведении расчета с ВР Премия1234_2 // Вычисляется по следующей формуле:
// Премия 12342 = (Оклад_2 + ПремияКоэф_2 + ПремияСум_2) * к5, где
// к5 - постоянный для всех сотрудников коэффициент
// Коэффициент к5 - берется из списка периодических констант
жз = СоздатьОбъект("ЖурналРасчетов.Зарплата_2");
нтп = жз.НачалоТекущегоПериода();
ктп = жз.КонецТекущегоПериода();
прем 1234 = 0;
жз.ВыбратьПериодПоОбъекту(Объект, нтп); пока жз.ПолучитьЗапись() = 1 цикл
если (жз.ВидРасч = ВидРасчета.Оклад_2) или
(жз.ВидРасч = ВидРасчета.ПремияКоэф_2) или (жз.ВидРасч = ВидРасчета.ПремияСум_2) тогда прем 1234 = прем 1234 + жз.результат; конецЕсли; конецЦикла; // пока
результат = прем1234 * Константа. К5. По лучить(ктп); конецПроцедуры // ПровестиРасчет
Значение числовой константы к5, которая должна быть периодической, после ее добавления в конфигурацию определим, запустив следующую процедуру:
процедура Выполнить() // Связана с кнопкой Пуск обработки Проба
Константа. К5.Установить(ТекущаяДата(), 0.5); конецПроцедуры // Выполнить
7.11. ВЗАИМОДЕЙСТВИЕ ВИДА РАСЧЕТА ПРЕДПРИЯТИЯ
Характер взаимодействия ВР предприятия представлен в табл. 7.15, где под взаимодействием понимаются такие свойства ВР, как способность вытеснять иные ВР, быть по отношению к ним зависимым или ведущим, а также очередность исполнения.
Таблица 7.15
Взаимодействие ВР предприятия |
Вид расчета |
Ведущий по отношению к ВР |
Зависит от ВР |
Вытесняет
ВР |
Очеред
ность |
НачСальдо_2 |
ВБанк_2 |
- |
- |
1 |
Оклад_2 |
ВР НДФЛ_2, ВБанк_2 |
- |
- |
1 |
ПремияКоэф_2 |
Премия1234.2, НДФЛ_2, ВБанк_2 |
- |
- |
5 |
ПремияСум_2 |
НДФЛ_2, ВБанк_2 |
- |
ПремияКоэф_2 |
1 |
Премия1234_2 |
// |
Оклад_2,
ПремияКоэф_2,
ПремияСум_2 |
|
10 |
НДФЛ_2 |
|
Оклад_2, ПремияКоэф_2, ПремияСум 2, Премия1234_2 |
|
15 |
ВБанк_2 |
- |
От всех ВР |
- |
20 |
|
Замечания: |
1. Это важная таблица, о составлении такой или ей подобной надлежит позаботиться лицам, сопровождающим и поддерживающим программы расчета заработной платы.
2. Все ВР табл. 7.15 являются самовытесняющимися.
3. Задание ВР ПремияСум_2 вытесняющим по отношению к ВР ПремияКоэф_2 обусловлено учебными целями. На примере взаимодействия этих двух ВР мы продемонстрируем работу алгоритма вытеснения 1С.
Напомним также, что ВР Оклад_2, ПремияКоэф_2, ПремияСум_2 и Премия 12342 входят в группу ВР ВсеНачисления_2, а группа ВР ВсеУдержания_2 содержит пока что лишь один ВР - НДФЛ_2.
Все приведенные в табл. 7.15 свойства уже введены в конфигурацию системы. Теперь посмотрим на практике, как они реализуются. Пока что можно сказать, что полностью полагаться на правила перерасчета нельзя (это уже отмечалось выше), поскольку они срабатывают при вводе ведущих ВР или при их ручной правке, но не оказывают влияния на зависимые ВР при расчете записи с ведущим ВР в результате выбора пункта меню Рассчитать запись (разд. 7.10.1).
7.12. ДЛИННЫЕ РАСЧЕТЫ.
ЭФФЕКТ ВЫТЕСНЕНИЯ РАСЧЕТА
В этом разделе мы рассмотрим поведение длинных расчетов на примере ВР Пре-мияКоэф_2 и ПремияСум_2. Первый мы удлиним вперед, в будущий период (БП), а второй назад, в прошлый период (ПП). Учитывая, что ВР ПремияСум_2 вытесняет ВР ПремияКоэф_2, действие расчета с ВР ПремияСум_2 ограничим сверху серединой текущего периода (ТП) (рис. 7.68).
 |
Рис. 7.68. ВРПремияСум_2 и ПремияКоэф_2 на временной оси документа по начислению премии |
После оформления документа (рис. 7.69, 7.70) и его проведения в ЖЗ на фамилию Агальцова добавятся 4 записи о премиях (рис. 7.71).
 |
Рис. 7.69. Премии Агальцова Ю. А. в документе Премия |
 |
Рис. 7.70. Интервалы действия премий Агальцова Ю. А |
|
Сотрудник |
ВР |
Часы |
Резчл... |
Хоз.... |
Начало |
Окота... «I |
|
Агальцов Юрий |
Премия с<*имой |
|
1.000 00 |
2013001 |
01.11.01 |
3011.01 |
ё |
Агальцов Юрий |
Начальное сальдо |
|
000 |
2013000 |
01 1201 |
31 1201 |
ё |
Агальцов Юрий |
Оклад |
165.0 |
2.900 00 |
2013000 |
01.1201 |
31.1201 |
ё |
Агальцов Юрий |
Премия суммой |
|
1.000.00 |
2013001 |
01.1201 |
15.1201 |
ё |
Агальцов Юрий |
Премия коэффициентом |
165.0 |
1.650.00 |
2013001 |
161201 |
31.1201 |
ё |
Агальцов Юрий |
Премия коэффициентом |
1650 |
1.650.00 |
2013001 |
01.01.02 |
31.01.02 |
|
Рис. 7.71. Расчеты-премии Агальцова Ю. А |
Содержание раздела