МЕТОДЫ ЖУРНАЛА РАСЧЕТОВ И ЕГО ПЕРИОДА
Знакомясь с новыми записями, во-первых, отметим, что в ЖЗ нет длинного заданного в документе расчета. Он разбился на обычные так, что период действия каждого лежит в пределах некоторого расчетного периода.
Во-вторых, обратим внимание, что разбиение затрагивает только временной параметр расчетов. Сумма премии переносится в каждый интервал разбиения. То есть в нашем случае 1С удваивает премии Агальцова Ю. А. по сравнению с величинами, заданными в документе.
В-третьих, как и ожидалось, расчет Премия суммой вытеснил расчет Премия коэффициентом, укоротив (на временной оси) последний на 15 дней слева. При этом вновь изменились только временные параметры расчета. Его результат сохранился. Единственный случай, когда наблюдается изменение результата, - это полное вытеснение расчета.
В-четвертых, скорректируем наши представления об упорядочении расчетов: в пределах выбранного объекта расчеты располагаются по приоритетам (очередности исполнения), в пределах одного приоритета - в порядке возрастания атрибута расчета ДатаНачала, а при равных датах - в алфавитном порядке.
Итак, на временной оси ЖЗ введенные расчеты располагаются в соответствии с рис. 7.72, а количественные характеристики каждого расчета удвоились.
|
пп т |
|
|
|
п |
БП |
ПС1
<-> |
ПС2
--> |
|
Рис. 7.72. ВРПремияСум_2 (ПС) и ПремияКоэф_2 (ПК) из приведенного на рис. 7.69 и 7. 70 документа на временной оси ЖЗ
Если рис. 7.72 закономерен, то двукратное увеличение результатов входит в противоречие с документом и реальными событиями. В самом деле, если ваш отпуск длится, скажем, 40 дней, то в документе-приказе об отпуске, в котором отпускные вводятся единой суммой, нужно указать именно эту сумму, а также даты начала и конца отпуска. После проведения документа мы получим 2 или 3 расчета (в зависимости от отпускного периода), но общая сумма отпускных должна сохраниться. То есть, разбивая длинный расчет на к частей, мы должны иметь некоторый алгоритм деления его суммы на те же к частей.
Если расчет А вытесняется расчетом Б, интервал действия которого лежит в пределах интервала действия расчета А (см. рис. 7.4, б), наблюдается та же, что и в случае длинных ВР, картина: интервал действия расчета А разбивается на 2 части, но при этом результат расчета сохраняется для каждой из частей разбиения. Это приводит к удвоению результата по сравнению со значением, определенным в документе, породившим расчет.
Этот эффект иллюстрирует рис. 7.73, в котором в качестве расчета А выступает Премия коэффициентом, а Премия суммой является расчетом Б.
|
|
Сотрудник II ВР |
Часы 1 Резу... |
Хоз.on. |
I Начало |
Окоича* |
|
9 і |
Агальцов Юрий |
Премия суммой |
11.500.00 |
2013001 |
1201.02 |
22.01.02 |
|
|
Агальцов Юрий |
Премия коэффициентом |
167.011.670.00 |
2013001 |
01.01.02 |
11.01 02 |
|
• ; |
Агальцов Юрий |
Премия коэффициентом |
1Б7 0 Н1 -670 0012013001 |
123.01.02 |
31.01.02 |
|
|
Рис. 7. 73. После разбиения результат расчета Премия коэффициентом удвоился |
В документе для расчетов Агальцова Ю. А. Премия суммой и Премия коэффициентом заданы приведенные на рис. 7.74 интервалы действия.
|
Премия коэффициентом |
|01 01.02 |
1°1 |
131.01.02 [?] |
|
Премия суммой |
jl2.01.02 |
У |
122.01.02 |п| |
Рис. 7.74. Интервал действия расчета Б (Премия суммой) лежит внутри интервала действия расчета А (Премия коэффициентом), причем расчет Б вытесняет расчет А
Ясно, что наблюдаемый эффект потребует ручной правки результата.
7.13. МЕТОДЫ ЖУРНАЛА РАСЧЕТОВ И ЕГО ПЕРИОДА
Приводятся в табл. 7.16.
Методы ЖР и его периода
|
Таблица 7.16 |
|
Метод |
Описание |
|
|
Метод периода ЖР |
|
пер = пер.ПрибавитьПериод (кол); |
Прибавляет к периоду пер, где пер = жр.ПериодДействия | жр.ПериодРегистрации | жр.ТекущийПериод() или иное значение типа РасчетныйПериод, заданное параметром кол число периодов
Методы ЖР |
|
нтп = жр.НачалоТекущего Периода(); |
Возвращает дату начала текущего периода ЖР |
|
ктп = жр.КонецТекущего Периода(); |
Возвращает дату конца текущего периода ЖР |
|
нтп = жр.НачалоПериода ПоДате(дата); |
Возвращает дату начала расчетного периода ЖР, которому принадлежит заданная дата |
|
ктп = жр.КонецПериода ПоДате(дата); |
Возвращает дату конца расчетного периода ЖР, которому принадлежит заданная дата |
|
пер = жр.ПериодПоДате(дата); |
Возвращает расчетный период ЖР (объект типа РасчетныйПериод), которому принадлежит заданная дата |
|
флаг = жр.УстановитьТекущий Период(пер, [способ]); |
Устанавливает в качестве текущего период пер, где пер -значение типа РасчетныйПериод. Если способ= 1, то при смене периода отрабатываются ее сопровождающие системные действия, то есть смена периода осуществляется так же, как и при ее интерактивном выполнении. Если способ = 0, то системные действия не отрабатываются, в частности не производится архивация документов при смене периода вперед и не изменяется значение атрибута записей Рассчитана при смене назад |
|
пер = жр.ТекущийПериод(); |
Возвращает текущий расчетный период - значение типа РасчетныйПериод |
|
флаг = жр.ПолучитьЗапись(); |
Позиционирует выборку на ее следующей записи и возвращает 1 или за пределами выборки и возвращает 0, если выборка пуста или исчерпана |
|
флаг = жр.ВыполнитьРасчет(); |
Рассчитывает текущую запись ЖР, обращаясь к процедуре ПровестиРасчет, которой снабжен ВР этой записи |
|
on = жр.ОписательПериода (дата); |
Возвращает строку, описывающую расчетный период, содержащий дату, заданную параметром дата. Формат строки зависит от продолжительности расчетного периода. Если продолжительность - месяц, то результат имеет, например, следующий вид: Январь 2002 г. |
|
зап = жр.ТекущаяЗапись(); |
Возвращает текущую запись ЖР - значение типа Запись-Журнал аРасчетов |
|
|
Метод |
Описание |
|
флаг = жр.НайтиЗапись(зап); |
Осуществляет в ЖР поиск записи зап. Переменная зап должна иметь тип ЗаписьЖурналаРасчетов |
флаг = жр. Фиксировать
Запись(); |
Устанавливает в атрибут Фиксирована текущей записи ЖР значение, равное единице |
|
флаг = жр.ОсвободитьЗапись(); |
Устанавливает в атрибут Фиксирована текущей записи ЖР значение, равное нулю |
|
флаг = жр.ВвестиПерерасчет(); |
Вводит в текущий период запись, которая является копией текущей записи одного из прошлых периодов, обнуляя ее результат. Введенная запись называется перерасчетом, и ее атрибут Перерасчет равен единице. Результат перерасчета уменьшается на значение атрибута Результат первичной записи. Перерасчет нельзя ввести, если первичная запись сама является перерасчетом |
|
флаг = жр.ВвестиПерерасчет НаОсновании(док); |
Метод выполняет те же действия, что и метод ВвестиПере-расчет, с той лишь разницей, что перерасчет вводится на основании документа док |
|
названиеЖР = жр.Вид(); |
Возвращает заданный в конфигурации идентификатор ЖР, например Зарплата_2. Результат имеет символьный тип |
|
предстЖР = жр.Представление Вида(); |
Возвращает заданный в конфигурации синоним ЖР, а при отсутствии синонима - идентификатор ЖР. Результат имеет символьный тип |
|
жр.НазначитьТип(рекв, тип, длина, точность); |
Назначает тип или разновидность типа, заданную параметром тип, реквизиту рекв неопределенного типа. Символьный параметр тип может принимать значение базового типа ("Число", "Строка", "Дата"), любой определенной в конфигурации разновидности типа, например "Справочник.Дети", или "Документ.ИзменениеОклада", или значение вида субконто |
|
жр.УстановитьРеквизит (рекв, знач); |
Устанавливает значение реквизита ЖР. Для сохранения значения после применения метода вызывается один из следующих методов: ВвестиРасчет, ВвестиРасчетНаОсновании, ЗаписатьРасчет или ЗаписатьРасчетНаОсновании. При этом если расчет вводится в документе, то в нем эти методы записывают дополнительные реквизиты ЖР, а также (по мере необходимости) атрибуты Сторно, Рассчитана, Исправлена, Фиксирована, Перерасчет и Результат; значения атрибутов Документ, РодительскийДокумент, Объект, ВидРасч, Дата-Начала, ДатаОкончания и ПервичнаяЗапись в этом случае методом УстановитьРеквизит не задаются.
Также метод УстановитьРеквизит употребляется с методами Новая и Записать. Причем метод Новая предшествует вызову метода УстановитьРеквизит. Методы могут применяться как в документах, так и в модулях иных объектов. При этом Ус-тановитьРеквизит должен определить значения обязательных атрибутов (Документ, РодительскийДокумент, Объект, ВидРасч, ДатаНачала и ДатаОкончания). Другие атрибуты и дополнительные реквизиты ЖР определяются по мере необходимости. Атрибуты ЖР ПериодДействия и ПериодРегист-рации пользователем не устанавливаются |
|
Метод |
Описание |
|
*флаг = жр.ВвестиРасчет (объект, видРасч, датаНачала, датаОкончания, [результат]); |
Вводит расчет в ЖР. При вводе длинных расчетов метод вводит в ЖР несколько расчетов. Также несколько записей может быть введено при вводе вытесняющих расчетов. Может быть вызван в модуле документа или в модуле ВР. В первом случае атрибуты Документ и РодительскийДокумент принимают значение текущего документа (возвращается методом ТекущийДокумент). Во втором значения этих атрибутов вновь введенных расчетов становятся равными соответствующим значениям текущего расчета, то есть расчета, результат которого определяется. Параметры метода определяют значения одноименных атрибутов вводимого расчета |
|
*флаг = жр.ВвестиРасчетНа Основании(документ, (объект, видРасч, датаНачала, датаОкончания, [результат]); |
Выполняет те же действия, что и метод ВвестиРасчет, за тем исключением, что атрибут Документ введенного расчета заполняется значением параметра документ, указывающим на документ-основание. Атрибут РодительскийДокумент принимает, как и в методе ВвестиРасчет, значение текущего документа |
|
*флаг — жр. ЗаписатьРасчет (объект, ВР, датаНач, датаКон, [результат]); |
Выполняет те же действия, что и метод ВвестиРасчет, за тем исключением, что расчет не вытесняет сам себя, даже если он является самовытесняющимся |
*флаг = жр.ЗаписатьРасчетНа Основании(док, объект, ВР, датаНач, датаКон,
[результат]); |
Выполняет те же действия, что и метод ВвестиРасчетНаОс-новании, за тем исключением, что расчет не вытесняет сам себя, даже если он является самовытесняющимся |
|
*жр.Рассчитать(); |
Вычисляется результат расчета. Результат возвращается предопределенной процедурой ПровестиРасчет модуля соответствующего ВР. Если рассчитываемая запись фиксирована или скорректирована вручную и ее атрибут Исправлена = 1, результат расчета не изменяется. Расчет не выполнятся, если ЖР позиционирован на записи прошлого периода • |
|
*флаг = жр.ВыбратьЗаписи ([датаНач], [датаКон]); |
Открывает выборку записей ЖР, период действия которых пересекается с периодом, заданным параметрами типа Дата датаНач и датаКон. Если параметры опущены, то открывается выборка всех расчетов ЖР |
|
*флаг = жр.ВыбратьПериод ([дата]); |
Открывает выборку записей ЖР, период регистрации которых совпадает с периодом, в котором лежит параметр метода дата. Если параметр дата опущен, то открывается выборка расчетов, зарегистрированных в текущем периоде |
*флаг = жр.ВыбратьЗаписиПо Объекту(объект, [датаНач],
[датаКон]); |
Открывает выборку записей ЖР, принадлежащих объекту, заданному параметром объект, и период действия которых пересекается с периодом, заданным параметрами типа Дата датаНач и датаКон. Если параметры датаНач и датаКон опущены, то выбираются все принадлежащие заданному объекту расчеты ЖР, период действия которых пересекается с текущим периодом |
|
Метод |
Описание |
|
*флаг = жр.ВыбратьЗаписиПо Документу(док); |
Открывает выборку записей ЖР, атрибут Документ которых равен значению параметра док, имеющему тип Документ |
|
*флаг = жр.ВыбратьПериодПо Объекту(объект, [дата]); |
Открывает выборку записей ЖР, принадлежащих объекту, заданному параметром объект, и период регистрации которых совпадает с периодом, в котором лежит параметр дата. Если параметр дата опущен, то открывается выборка расчетов, зарегистрированных в текущем периоде |
|
*флаг = жр.ВыбратьПо Значению (графаОтбора, значОтбора, перНач, пер Кон); |
Открывает выборку записей ЖР по отбору, заданному символьным параметром графаОтбора, со значением значОтбора. Период регистрации выбираемых расчетов принадлежит временному интервалу, заданному параметрами перНач и перКон, имеющими тип РасчетныйПериод |
|
жр.Новая(); |
Создает новую запись ЖР. Добавление записи в ЖР осуществляется методом Записать |
|
жр.3аписать(); |
Добавляет или изменяет текущую запись ЖР. Добавлению записи предшествует вызов метода Новая. Изменение значений реквизитов ЖР выполняется методом УстановитьРекви-зит, вызываемым до метода Записать, но после метода Новая (если добавляется новая запись). При добавлении записи в обязательном порядке устанавливаются значения реквизитов Объект, Документ, РодительскийДокумент и ВидРасч. Следует помнить, что метод Записать не отрабатывает заданные правила перерасчета и вытеснения ВР |
|
*флаг = жр.УдалитьЗапись(); |
Удаляет текущую запись ЖР (проставляет DBF-пометку удаления записи) |
|
жр.Исправить(новРез); |
Заменяет существующий результат текущей записи ЖР на нов-Рез, устанавливая в атрибут Исправлена значение 1. Исправленная запись помечается иконкой СО. Результаты таких записей не изменяются при исполнении метода ВыполнитьРасчет или Рассчитать. Параметр новРез имеет числовой тип |
|
жр. ОтменитьИсправление(); |
Устанавливает в атрибут Исправлена текущей записи ЖР значение 0
Методы модуля формы ЖР |
|
списокВидовТек - ВидыОтбора ([списокВидовНов]); |
Устанавливает для интерактивного режима работы доступные виды отбора ЖР. Новые виды отбора задаются строкой списокВидовНов, содержащей перечисление имен граф отбора, например "Родитель, Образование". Возвращает строку с именами видов отбороэ, доступных до вызова метода. По умолчанию доступны все заданные при создании ЖР виды отбора |
|
флаг = УстановитьОтбор (графаОтбора, значениеОтбора); |
Устанавливает режим отображения записей ЖР по отбору. Заданному символьным параметром графаОтбора. В ЖР будут отображаться лишь те записи, объекты которых имеют реквизит, заданный параметром графаОтбора, например Образование, равный величине, заданной параметром значе-ниеОтбора. Тип параметра значениеОтбора должен совпадать с типом соответствующего реквизита объекта. Чтобы вновь вернуться в режим вывода всех записей ЖР, следует сделать следующий вызов:
УстановитьОтбор(""); |
|
Метод |
Описание |
флаг = ПолучитьОтбор
(графаОтбора,
значениеОтбора); |
Возвращает в символьную переменную графаОтбора текущий вид отбора, а в переменную значениеОтбора - его значение. Вид отбора задается методом УстановитьОтбор. Если отбор не установлен (отображаются все записи), то переменная флаг получит значение 0 |
|
флаг = ЗакладкиОтбора (графаОтбора, [значениеОтбора]); |
Устанавливает режим отображения закладок отбора, заданного символьным параметром графаОтбора, открывая закладку со значением значениеОтбора. Если второй параметр опущен, то активизируется первая закладка. Если первый параметр равен пустой строке, то закладки отбора не отображаются |
|
периодТек = Г раницаПросмотра ([период Нов])\ |
Устанавливает, если задан параметр периодНов, границу просмотра ЖР. Возвращает значение границы просмотра, существовавшее до вызова метода. Тип параметра и результата - РасчетныйПериод. Интерактивно границы просмотра устанавливаются цепочкой Действия - Задать глубину просмотра архива или после выбора иконки на панели инструментов диалогафо?мь^Ж^_ |
флаг = Установить
Представление (режим, [объект]); |
Устанавливает режим вывода записей ЖР. Если режим равен:
• 1, выводятся все записи ЖР, параметр объект не используется;
• 2, выводятся записи, имеющие атрибут Объект, равный значению параметра объект;
• 3, выводятся записи, имеющие атрибут Документ, равный значению параметра объект |
|
флаг = ПолучитьПредставление (режим, объект); |
Возвращает в параметры режим и объект текущие значения режима представления записей ЖР, заданного методом УстановитьПредставление. Переменная флаг примет значение 1, если представление установлено, или 0 -в противном случае |
|
флагТек = РассчитыватьПри ОтменеИсправления ([флагНов]); |
Устанавливает, если флагНов = 1, режим автоматического расчета записей при интерактивной отмене ручной правки.
По умолчанию флагНов = 0 и автоматического расчета записей при интерактивной отмене ручной правки не производится. Возвращает значение флага расчета, действующее в системе на момент вызова метода |
Замечания:
1. Префикс жр, употребленный с методами ЖР и его периодом, может быть произвольным.
2. Методы, отмеченные звездочкой (*), применяются только с переменными, определяемыми функций СоздатьОбъект. Прочие методы, если они находятся в модуле формы ЖР и применяются для текущего журнала, употребляются без префикса.
3. Появляющаяся в таблице переменная флаг равна единице, если метод выполнен удачно, и нулю - в противном случае.
Пример 1 для метода периода ЖР. Выводятся текущий, следующий и предшествующие периоды журнала Зарплата_2.
процедура Выполнил^ ) // Связана с кнопкой Пуск обработки Проба
перем жз, перТек, пер;
жз = СоздатьОбъект(''ЖурналРасчетов.Зарплата_2''); пер = жз.ТекущийПериодО;
Сообщить(''Текущий период:" + Символ Табуляции + пер); пер = пер.ПрибавитьПериод(1);
Сообщить("Период после:" + СимволТабуляции + пер); пер = пер.ПрибавитьПериод(-2);
Сообщить("Период до:" + СимволТабуляции + пер); кОнецПроцедуры // Выполнить
Результат:
Текущий период: Декабрь 2001 г.
Период после: Январь 2002 г.
Период до: Ноябрь 2001 г.
Пример 2 для метода периода ЖР. Выводятся текущий, следующий и предшествующие периоды регистрации.
процедура Выполнить() // Связана с кнопкой Пуск обработки Проба
перем жз, перТек, пер;
жз = СоздатьОбъект(''ЖурналРасчетов.Зарплата_2'');
' жз.ВыбратьЗаписи(); // Позиционируемся на первом расчете ЖЗ
пер = жз.ПериодРегистрации; // или жз.ПериодДействия;
Сообщить("Период регистрации:" + СимволТабуляции + пер); пер = пер.ПрибавитьПериод(1);
Сообщить("Период после:" + СимволТабуляции + пер); пер = пер.ПрибавитьПериод(-2);
Сообщить("Период до:" + СимволТабуляции + пер); конецПроцедуры // Выполнить
Результат тот же, что и в примере 1.
Пример 3. Выводится вид и представление вида ЖЗ Зарплата_2.
процедура Выполнить() // Связана с кнопкой Пуск обработки Проба
перем жз;
жз = СоздатьОбъект("ЖурналРасчетов.Зарплата_2");
// Идентификатор ЖЗ
Сообщить(жз.Вид()); // Зарплата_2
// Синоним ЖЗ
Сообщить(жз.ПредставлениеВида()); // Журнал заработной платы конецПроцедуры // Выполнить
Пример 4. В окно сообщений выводятся все расчеты ЖЗ, относящиеся к выбранному сотруднику.
процедура Выполнить() // Связана с кнопкой Пуск обработки Проба
перем сСотр_2, жз;
сСотр_2 = СоздатьОбъект("Справочник.Сотрудники_2");
// Метод Выбрать вызывает диалог для выбора элемента справочника
// Если сотрудник не выбран
если сСотр_2.Выбрать("Выберите сотрудника", "ФормаСписка") = 0 тогда Предупреждение("Сотрудник не выбран."); возврат; конецЕсли;
// Выбран Добрецов Б. Ю.
жз = СоздатьОбъект("ЖурналРасчетов.Зарплата_2"); жз.ВыбратьЗаписиПоОбьекту(сСотр_2.ТекущийЭлемент()); пока жз.ПолучитьЗапись() = 1 цикл
Сообщить("" + жз.Объект + СимволТабуляции + жз.ВидРасч + Символ Табуляции + жз.Результат); конецЦикла; // пока конецПроцедуры // Выполнить
|
Результат: |
|
Добрецов Борис Юрьевич |
Начальное сальдо |
0.75 |
|
Добрецов Борис Юрьевич |
Премия коэффициентом |
1670 |
|
Добрецов Борис Юрьевич |
Премия суммой |
2000 |
|
Добрецов Борис Юрьевич |
Перечисление в банк |
8444 |
|
Добрецов Борис Юрьевич |
НДФЛ |
1261.65 |
|
Добрецов Борис Юрьевич |
Оклад |
2800 |
|
Добрецов Борис Юрьевич |
Премия 1234 |
3235 |
|
Пример 5. В окно сообщений выводятся все расчеты ЖЗ, относящиеся к выбранному документу.
процедура Выполнить() // Связана с кнопкой Пуск обработки Проба
перем док, жз;
док = СоздатъОбъект("Документ.Премия");
// Метод Выбрать вызывает диалог для выбора документа // Если документ не выбран
если док.Выбрать("Выберите документ") = 0 тогда Предупреждение("Документ не выбран."); возврат; конецЕсли;
жз = СоздатьОбъект("ЖурналРасчетов.Зарплата_2"); жз.ВыбратьЗаписиПоДокументу(док.ТекущиЙДокумент()); пока жз.ПолучитьЗапись() = 1 цикл
Сообщить("" + жз.Объект + СимволТабуляции + жз.ВидРасч +
СимволТабуляции + жз.Результат); конецЦикла; // пока конецПроцедуры // Выполнить
Результат:
Пример 6. В окно сообщений выводятся все зарегистрированные в текущем периоде расчеты ЖЗ (объект, ВР и результат) сотрудников второго цеха.
процедура Выполнить() // Связана с кнопкой Пуск обработки Проба
перем сСотр_2, жз, пер, подр;
сСотр_2 = СоздатьО6ъект(''СправочникСотрудники_2''); если сСотр_2.НайтиПоНаименованию(”02 Цех”, 0) = 0 тогда Предупреждение(''Второй цех не найден.”); возврат; конецЕсли;
жз = СоздатьОбъект(''ЖурналРасчетов.Зарплата_2''); пер = жз.ТекущийПериод();
// Подразделение предприятия (найденная выше группа справочника Сотрудники_2) подр = сСотр_2.ТекущийЭлемент(); жз.ВыбратьПоЗначению(''Родитель'', подр, пер, пер); пока жз.ПолучитьЗапись() = 1 цикл
Сообщить(”” + жз.Объект + СимволТабуляции + жз.ВидРасч +
СимволТабуляции + жз.Результат); конецЦикла; // пока конецПроцедуры // Выполнить
|
Результат: |
|
Абрамова Лариса Сергеевна |
Начальное сальдо |
2.6 |
|
Абрамова Лариса Сергеевна |
Оклад |
2500 |
|
Абрамова Лариса Сергеевна |
НДФЛ |
325 |
|
Абрамова Лариса Сергеевна |
Перечисление в банк |
2177 |
|
Пример 7. Удаляются все расчеты ЖЗ, относящиеся к выбранному документу, и сам документ. Записи получают DBF-пометку удаления, а документу проставляется 1С-пометка удаления.
процедура Выполнить() // Связана с кнопкой Пуск обработки Проба
перем док, жз;
док = СоздатьОбъект(”Документ.Премия”);
// Метод Выбрать вызывает диалог для выбора документа // Если документ не выбран если док.Выбрать(''Выберите документ”) = 0 тогда Предупреждение(”Документ не выбран.”); возврат; конецЕсли;
жз = СоздатьОбъект(”ЖурналРасчетов.Зарплата_2”); жз.ВыбратьЗаписиПоДокументу(док.ТекущийДокумент()); пока жз.ПолучитьЗапись() = 1 цикл
жз.УдалитьЗапись(); // Удаляем расчет (ставим DBF-пометку удаления) конецЦикла; // пока
док.Удалить(О); // Удаляем документ (ставим 1С-пометку удаления)
конецПроцедуры // Выполнить
Пример 8. Обнуляется флаг ручной правки расчетов выбранного сотрудника, кроме расчетов с ВР ПремияСум_2, для которых, наоборот, вносится ручная правка результата. Новая величина премии равна 1250 руб. Попутно выполняется расчет записей, с которых снимется флаг ручной правки.
процедура Выполнить() // Связана с кнопкой Пуск обработки Проба
перем сСотр_2, жз, ВР;
сСотр_2 = СоздатьОбъект("Справочник.Сотрудники_2");
// Метод Выбрать вызывает диалог для выбора элемента справочника // Если сотрудник не выбран
если сСотр_2.Выбрать(''Выберите сотрудника", "ФормаДляВыбора") = 0 тогда Предупреждение("Сотрудник не выбран."); возврат; конецЕсли;
// Выбран Агальцов Ю. А.
жз = СоздатьОбъект("ЖурналРасчетов.Зарплата_2"); жз.ВыбратьПериодП0Объекту(сСотр_2.ТекущийЭлемент());
ВР = ВидРасчета.ПремияСум_2; пока жз.ПолучитьЗапись() = 1 цикл
если (жз.Исправлена =1) и (жз.ВидРасч о ВР) тогда
жз.ОтменитьИсправление(); // Снимаем флаг ручной правки результата жз.Рассчитать(); // Рассчитываем запись
конецЕсли;
если жз.ВидРасч = ВР тогда жз.Исправить( 1250.0); конецЕсли; конецЦикла; // пока Предупреждение('Тотово."); конецПроцедуры // Выполнить
Для иллюстрации методов модуля формы ЖР войдем в конфигурацию, раскроем ее пункт Журналы расчетов и в ЖЗ Зарплата_2 установим еще один вид (графу) отбора - Образование (рис. 7.75).
 |
|
Рис. 7. 75. В ЖЗ Зарплата_2 доступны отборы по графам Родитель и Образование |
Пример 9. В форме списка ЖЗ Зарплата_2 устанавливается отбор по графе Образование. Это выполняется в предопределенной процедуре ПриОткрытии модуля формы списка ЖЗ.
процедура ПриОткрытии() // Предопределенная процедура
перем обр, флаг, сСотр_2, сОбр_2;
// Задаем доступные виды отбора (этот вызов может быть опущен) ВидыОтбора("Родитель, Образование");
// Отображаем закладки отбора по реквизиту Образование ЗакладкиОтбора("Образование");
// Установим представление по одному объекту // Найдем для этого сотрудника, имеющего высшее образование сСотр_2 = СоздатьОбъект("Справочник.Сотрудники_2"); сОбр_2 = СоздатьОбъект("Справочник.Образование_2");
// Выбираем вид образования обр
флаг = сОбр_2.Выбрать("Выберите вид образования",""); если флаг = 1 тогда
обр = сОбр_2.ТекущийЭлемент();
если сСотр_2.НайтиПоРеквизиту("Образование", обр, 1) = 1 тогда // Отображаем записи по одному объекту УстановитьПредставление(2, сСотр_2.ТекущийЭлемент()); конецЕсли; конецЕсли; сСотр_2 = 0; сОбр_2 = 0;
// Для иных процедур модуля определим нтп нтп = НачалоТекущегоПериода(); конецПроцедуры
|
Результат после открытия формы ЖЗ см. на рис. 7.76. |
|
Высшее 1 Начальное Неоконченное высшее I Среднее | |
|
Г- По цехам |
|
Jt) Д] о| |
|
ВСотрчдник ||ВР ВЧа... (Резчл... |Хоз.... 1 |
IНачало ІОконч... ^ | |
|
1 1 |
Добрецов Борис |
(Начальное сальдо |
0.101201300С |
01.1201 |
31.1201 |
|
|
Добрецов Борис |
Оклад |
165.0 |
2.800.00|201300С |
01.1201 |
31.1201 |
|
р |
Добрецов Борис |
Премия суммой |
|
500.0012013001 |
12.12.01 |
221201 |
|
4 1 |
Добрецов Борис |
Премия коэффициентом |
165.0 |
1.650.00J 2013001 |
01.12.01 |
11.12.01 |
|
|
Премия 1234 |
|
2,475.00| 2013001 |
23.12.01 |
31.1201 |
|
1 Добрецов Борис |
НДФЛ |
|
965.251201700: |
01.12.01 |
31.1201 |
|
\ 1<Н Добрецов Борис |
Перечисление в банк |
II 6.459.001230010(1 |
01.12.01 |
31.12.01 . |
|
Рис. 7.76. Установлены отбор по графе Образование и режим представления по одному объекту
Замечание. Чтобы полноценно использовать отбор по графе Образование, нужно внести соответствующие изменения и в диалог формы списка ЖЗ Зарплата 2, и в модуль формы. В частности, флажок придется заменить на приведенный
на рис. 7.77 переключатель.
Установить отбор------—
С По цехам С По образованию
Рис. 7.77. Переключатель видов отборов
Пример 10. В форме списка ЖЗ Зарплата_2 выводятся только сотрудники с заданным образованием.
процедура ПриОткрытии() // Предопределенная процедура
перем обр, флаг, сОбр_2, графаОтбора, значениеОтбора;
// Выбираем вид образования обр
сОбр_2 = СоздатьОбъект(''Справочник.Образование_2''); флаг = сОбр_2.Выбрать(''Выберите вид образования",""); если флаг = 1 тогда
обр = сОбр_2.ТекущийЭлементО;
// Задаем режим вывода записей о сотрудниках с образованием обр УстановитьОтбор("Образование", обр); конецЕсли;
// Контрольный вывод
если ПолучитьОтбор(графаОтбора, значениеОтбора) = 1 тогда Сообщить("Установлен отбор по графе " + графаОтбора +
" со значением " + значениеОтбора); конецЕсли;
УстановитьПредставление(І); // Вывод списка сотрудников
// Для иных процедур модуля определим нтп нтп = НачалоТекущегоПериодаО; конецПроцедуры // ПриОткрытии
Результат:
Установлен отбор по графе Образование со значением Среднее
Пример 11.В форме списка ЖЗ Зарплата_2 выводятся только записи, относящиеся к документу, выбранному в предопределенной процедуре ПриОткрытии.
процедура ПриОткрытии() // Предопределенная процедура
перем док;
док = СоздатьОбъект("Документ.Премия");
// Метод Выбрать вызывает диалог для выбора документа // Если документ не выбран
если док.Выбрать("Выберите документ") = 0 тогда Предупреждение("Документ не выбран."); возврат; конецЕсли;
// Вывод расчетов, порожденных выбранным ранее документом УстановитьПредставление(3, док. ТекущийД окумент());
// Для иных процедур модуля определим нтп нтп = НачалоТекущегоПериода(); конецПроцедуры // ПриОткрытии
7.14. ПРЕДОПРЕДЕЛЕННЫЕ ПРОЦЕДУРЫ МОДУЛЯ ФОРМЫ ЖУРНАЛА РАСЧЕТОВ
Приведены в табл. 7.17.
Предопределенные процедуры модуля формы ЖР
Процедур*
ПриИсправлении
Результата
(запись)
ПриОтмене
Исправления
(запись)
ПриРасчете
(объектРасчета)
ПриВыбореВладельца
(владелец)
ПриУ становкеОтбора
(графаОтбора, значениеОтбора)
Описание
Таблица 7.17
Вызывается при попытке ручного исправления результата расчета (после нажатия на ОК в приведенном на рис. 7.78 диалоге).
ние результат;
Исправить не [
1Л2О00І
Cancel
Рис. 7.78. Ручная правка результата
Параметр запись имеет тип ЗалисьЖурналаРасчетов и является ссылкой на исправляемую запись ЖР. Диалог ввода ручной
М2
правки вызывается при нажатии на иконку панели управления ЖР
Вызывается при интерактивной попытке отмены ручной правки результата расчета. Параметр запись имеет тип ЗаписьЖурналаРасчетов и является ссылкой на текущую запись ЖР
Вызывается при попытке интерактивно инициировать расчет записи, документа или объекта. При расчете записи объектРасчета - это текущая запись ЖР, при расчете объекта - элемент справочника-владельца ЖР, при расчете документа - документ, породивший записи ЖР. Расчет записи, объекта и документа инициируются иконками k І Ь панели управления ЖР или соответствующими пунктами меню
Вызывается при интерактивном переходе в справочнике-владельце ЖР от одного элемента к другому. Формальный параметр владелец является ссылкой на выбираемый элемент-владелец. Выполняется только в режиме вывода расчетов по одному объекту. Справочник-владелец можно,
в частности, открыть, нажав на иконку ления ЖР
I панели управ-
Вызывается при интерактивной установке отбора в ЖР. Напомним, что ніггерактнвно отбор управляется диалогами, вызываемыми
иконками-* ^ или соответствующими командами меню. Параметр графаОтбора является символьным и содержит имя графы отбора. Тип параметра значениеОтбора совпадает с типом используемого в качестве графы отбора реквизита справочника-владельца ЖР
|
Процедура |
Описание |
|
ПриУстановкеГ раницы Просмотра (период) |
Вызывается при интерактивной смене границы просмотра ЖР. Интерактивно граница просмотра задается в диалоге, вызываемом при помощи иконки панели управления ЖР, или при выборе соответствующего пункта меню. Параметр период имеет тип РасчетныйПериод и содержит значение периода, задающего границу просмотра ЖР |
ПриУстановке
Представления
(режим) |
Вызывается при иігтеракіивной смене режима представления ЖР. Интерактивно режим представления задается на панели управления
ЖР иконками •= (все объекты), ~ (один объект) и = (один документ). Числовой параметр режим имеет значение:
• 1, если осуществляется переход к просмотру всех записей ЖР;
• 2, если устанавливается просмотр одного объекта;
• 3, если планируется просматривать записи по одному документу-основанию |
|
|
Пример. Запрещается ручное исправление результатов во всем ЖР. |
// Процедура входит в состав модуля формы списка ЖР процедура ПриИсправленииРезультата(запись)
Предупреждение(''Ручная правка невозможна.");
СтатусВозврата(0);
конецПроцедуры
7.15. ВИДЫ РАСЧЕТОВ И ИХ ГРУППЫ
7.15.1. ВЫВОД СПИСКОВ ВИДОВ РАСЧЕТОВ И ИХ ГРУПП
С ВР и группами ВР мы уже имели возможность ознакомиться весьма плотно. Те- | перь наша задача - привести достаточные для активного употребления этих объектов справочные сведения.
Приведем, однако, прежде коды, выводящие список ВР и групп ВР конфигурации.
// Процедура вывода списка ВР конфигурации
// Выводит для каждого ВР его атрибуты: код (идентификатор),
// наименование (комментарий), очередность и приоритет, а также его синоним процедура Выполнить() // Связана с кнопкой Пуск обработки Проба
перем всегоВР; // Число ВР в конфигурации
перем ин, код, ВР, наим, очер, приорВыт, синоним;
ОчиститьОкноСообщений(); // Очищаем окно сообщений
всегоВР = Метаданные.ВидРасчета(); для ин = 1 по всегоВР цикл
код = Метаданные.ВидРасчета(ин).Идентификатор;
// ВР имеет тип ВидРасчета
ВР = ВидРасчета.ПолучитьАтрибут(код);
наим = ВР.Наименование;
// или наим = Метаданные.ВидРасчета(ин).Комментарий; очер = ВР.Очередность;
приорВыт = ВР.ПриоритетВытеснения; синоним = Метаданные. ВидРасчета(ин). Синоним;
Сообщить(код + " - " + наим + " - " + очер + " - " + приорВыт + " - " + синоним); конецЦикла; // для конецПроцедуры // Выполнить
Фрагмент результата:
Авторские - Другие авторские вознаграждения - 30 - 0 - Др. авторские возн-ия АвторскиеЗаНП - Авторские за создание произведений науки - 30 - 0 - Авт. за науку БанковскиеИздержки - Банковские издержки - 152 - 0 - Банковские издержки
// Процедура вывода списка групп ВР конфигурации
// Выводит для каждой группы ВР ее атрибуты: код (идентификатор)
// и наименование (комментарий), а также синоним
процедура Выполнить() // Связана с кнопкой Пуск обработки Проба
перем всегоГруппВР; // Число групп ВР в конфигурации
перем ин, код, наим, синоним;
ОчиститьОкноСообщений(); // Очищаем окно сообщений
всегоГруппВР = Метаданные.ГруппаРасчетов(); для ин = 1 по всегоГруппВР цикл
код = Мегаданные.ГруппаРасчетов(ин).Иденіификатор; наим = Метаданные.ГруппаРасчетов(ин).Комментарий; синоним = Метаданные.ГруппаРасчетов(ин). Синоним;
Сообщить(код + "-." + наим + " - " + синоним); конецЦикла; // для конецПроцедуры // Выполнить
Фрагмент результата:
ВсеНачисления - Группа, в которую входят начисления - Все начисления ВсеУдержания - Группа, в которую входят все удержания - Все удержания ВсеНачисления_2 - Для сотрудников из справочника Сотрудники_2 - Все начисления
7.15.2. АТРИБУТЫ ВИДОВ РАСЧЕТОВ И ИХ ГРУПП
Приводятся в табл. 7.18.
Таблица 7.18
Атрибуты ВР и их групп |
|
Атрибут |
Описание |
|
Атрибуты ВР и групп ВР |
|
Код |
Строка, содержащая идентификатор ВР или группы ВР |
|
Наименование |
Строка, содержащая комментарий ВР или группы ВР |
|
Атрибуты ВР |
|
Очередность |
Число, задающее очередность (приоритет) выполнения ВР (см. разд. 7.3.4) |
Приоритет
Вытеснения |
Число, задающее приоритет вытеснения ВР. Не рекомендован для употребления и сохранен для поддержания совместимости с прежними версиями 1С |
|
7.15.3. МЕТОДЫ ВИДОВ РАСЧЕТОВ И ИХ ГРУПП
Приводятся в табл. 7.19.
Таблица 7.19
Методы ВР и групп ВР |
|
Метод |
Описание |
|
Методы ВР |
ВР = ВидРасчета.
ПолучитьАтрибут
(код); |
Возвращает объект типа ВидРасчета, идентификатор которого равен символьному параметру код |
флаг = <ВР>Входит
ВГругппу(группа); |
Возвращает 1, если вид расчета ВР входит в группу ВР, заданную параметром группа типа ГруппаРасчетов |
флаг = <ВР.>
Выбран(); |
Возвращает 1, если ВР - объект типа ВидРасчета - имеет значение, или О-в противном случае. Употребляется, в частности, для реквизитов типа ВидРасчета объектов 1С, например справочников или документов, с целью узнать, задан ли для реквизита ВР или реквизит имеет пустое
значение |
флаг = ВР1.Вытесняет
ВидРасчета(ВР2); |
Возвращает 1, если вид расчета ВР1 вытесняет вид расчета ВР2, или О-в противном случае |
|
флаг = ВР1.Вытесняется ВидомРасчета (ВР2); |
Возвращает 1, если вид расчета ВР1 вытесняется видом расчета ВР2, или О-в противном случае |
|
Методы групп ВР |
флаг = ГВР.Содержит
ВидРасчета(ВР); |
Вернет 1, если группа видов расчетов ГВР содержит вид расчета ВР, или О-в противном случае |
|
кол = ГВР.Количество(); |
Возвращает число ВР, входящих в группу расчетов ГВР |
|
ВР = ГВР.Получить Расчет(ном); |
Вернет объект типа ВидРасчета, входящий в группу расчетов ГВР под номером ном. Если номер ном больше числа расчетов в группе, то возникнет завершающая ошибка, сопровождаемая сообщением "Выход за границы группы расчетов" |
|
|
Примеры для методов ВР: |
процедура ВыполнитьО // Связана с кнопкой Пуск обработки Проба
перем ВР1,ВР2; перем ин, код, наим, синоним;
ОчиститьОкноСообщений( ); // Очищаем окно сообщений
ВР1 = ВидРасчета.ПремияСум_2;
ВР2 = ВидРасчета.ПремияКоэф_2;
если ВР1.ВытесняетВидРасчета(ВР2) = 1 тогда
Сообщить("ВР Премия суммой вытесняет ВР Премия коэффициентом."); конецЕсли;
// Определим переменные ВР типа ВидРасчета иным способом ВР1 = ВидРасчета. ПолучшъАтрибуг("ПремияСум_2");
ВР2 = ВидРасчета.ПолучшъАтрибут("ПремияКоэф_2"); если ВР1.ВытесняетсяВидомРасчега(ВР2) = 1 тогда
Сообщить("ВР Премия суммой вытесняется ВР Премия коэффициентом."); иначе
Сообщить("ВР Премия коэффициентом вытесняется ВР Премия суммой."); конецЕсли;
конецПроцедуры // Выполнить Результат:
ВР Премия суммой вытесняет ВР Премия коэффициентом.
ВР Премия коэффициентом вытесняется ВР Премия суммой.
Примеры для методов групп ВР:
процедура Выполнить() // Связана с кнопкой Пуск обработки Проба
перем ВР, ГВР, кол, ном;
ОчиститьОкноСообщений(); // Очищаем окно сообщений
ВР = ВидРасчета.ПремияСум_2;
ГВР = ГруппаРасчетов.ВсеНачисления_2; если ГВР.СодержитВидРасчета(ВР) = 1 тогда
Сообщшъ('Труппа ВР " + ГВР.Код + " содержит ВР " + ВР.Код); иначе
Сообщигъ("Группа ВР " + ГВР.Код + " не содержит ВР " + ВР.Код); конецЕсли;
кол = ГВР.Количество();
Сообщигъ("В группу ВР " + ГВР.Код + " входит" + кол + " ВР"); ном = 2;
ВР = ГВР.ПолучитъРасчет(ном);
Сообщитъ("В группе ВР " + ГВР.Код + " под номером " + ном +
" расположен расчет " + ВР.Код); конецПроцедуры // Выполнитъ
Результат:
Группа ВР ВсеНачисления_2 содержит ВР ПремияСум_2 В группу ВР ВсеНачисления_2 входит 4 ВР
В группе ВР ВсеНачисления_2 под номером 2 расположен расчет ПремияКоэф_2
7.16. АТРИБУТЫ И МЕТОДЫ ПРАВИЛ ПЕРЕРАСЧЕТА
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.17. ЗАВЕРШАЕМ КОДИРОВАНИЕ ПРОЦЕДУР МОДУЛЯ ФОРМЫ СПИСКА ЖУРНАЛА ЗАРПЛАТА_2
После ввода расчетов интерфейс ЖЗ предоставляет возможность рассчитать зарплату сотрудников, сформировать их расчетные листки и ведомость о перечислениях
в банк. Для этих целей с кнопками диалога (рис. 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; конецЕсли; конецЦикла; // пока конецПроцедуры // Выполнить