18c0693f

ПРОСМОТР ИСТОРИИ ПЕРИОДИЧЕСКОГО ОБЪЕКТА

Можно выполнить интерактивно, выбирая, например, на панели инструментов иконку ^ или нажимая F5. Программно осуществляется встроенной функцией От-крытьФорму.

Пример 1. Выводится история периодической константы МинимальнаяЗарплата. ОткрытьФорму(''История.Константа.МинимальнаяЗарплата'');

Результат см. на рис. 6.1.

Рис. 6.1. Результат вызова функции ОткрытьФорму
Пример 2. Выводится история окладов Горюновой У. В.

процедура Выполнить( ) перем сСотр_2;

сСотр_2 = СоздатьОбъект("Справочник.Сотрудники_2"); если сСотр_2.НайтиПоНаименованию('Торюнова", 0) = 1 тогда ОткрытьФорму(''История.Справочник.Сотрудники_2.0клад''„ сСотр_2.ТекущийЭлементО);

иначе

Предупреждение("Найти госпожу Горюнову У. В. не удалось."); конецЕсли;

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

Результат см. на рис. 6.2.

Рис. 6.2. История окладов Горюновой Ульяны Валерьевны
6.5. ВЫВОДЫ

1. Агрегатный тип данных Периодический применяется для периодических реквизитов справочников и периодических констант.

2. Метод ИспользоватьОбъект, связывающий ОП с периодическим объектом, не употребляется, если выборка периодических объектов осуществляется по документу.

3. Вызов

оп.ИспользоватьОбъект("т, элемент);

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

4. Позиция периодического объекта изменяется методами НайтиЗначение, Выбрать Значения, ВыбратьПоДокументу и ПолучитьЗначение. Метод ЗначениеНаДату позицию периодического объекта не изменяет.

5. Записи периодического объекта, удаляемые методом Удалить, получают DBF-пометку удаления и поэтому восстановлению не подлежат.

6. Программно просмотр истории периодического объекта можно выполнить, вызывая встроенную функцию ОткрытьФорму.

7. Каждый вид документа порождает в информационной базе в общем случае два DBF-файла и два CDX-файла - одна пара файлов для шапки документов заданного вида, вторая для их табличной части.

8. 1С открывает все созданные для документов и справочников DBF- и CDX-файлы. Поэтому рост числа таких файлов ведет к снижению быстродействия программы и, следовательно, нужно стремиться к снижению числа видов документов и справочников в конфигурации системы (впрочем, как и иных ее объектов).

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

7. ЖУРНАЛ И ВИДЫ РАСЧЕТОВ КАЛЕНДАРИ И ТАБЕЛЬ

7.1. ЖУРНАЛ РАСЧЕТОВ В ЗАДАЧЕ НАЧИСЛЕНИЯ ЗАРАБОТНОЙ ПЛАТЫ

7.1.1. ПОНЯТИЕ ЖУРНАЛА РАСЧЕТОВ

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

Журнал расчетов является агрегатным типом данных и применяется в 1С:Пред-приятии, например в конфигурации Заработная плата и кадры, для начисления заработной платы сотрудникам, поэтому его второе название в этой задаче - журнал зарплаты. Также журнал расчетов можно приспособить и для иных целей, например для расчета дивидендов акционеров АО. В общем случае в конфигурации можно задать и использовать произвольное число журналов расчетов, дав им подходящие имена.

Замечание. Далее, где это возможно, вместо общего названия "журнал расчетов" (ЖР) будем употреблять частное имя "журнал зарплаты" (ЖЗ).

Каждая запись ЖЗ называется расчетом и отображает некоторое начисление, например премию, или удержание, например налог на доходы физических лиц. Расчет связан с конкретным элементом справочника сотрудников, называемым объектом расчета или просто объектом. Совокупность всех начислений и удержаний объекта за расчетный период, продолжительность которого составляет, как правило, месяц, позволяет определить размер получаемой сотрудником заработной платы.

Справочник, элементы которого являются объектами расчетов, называется владельцем ЖЗ. В свою очередь, элемент такого справочника, называется владельцем расчетов, объектом которых он является.

Расчет характеризуется результатом, который возвращается специальными объектами 1С, имеющими тип ВидРасчета Более точно: результат вычисляется в процедуре ПровестиРасчет, принадлежащей модулю вида расчета - объекту типа Вид-Расчета. Далее, упоминая объекты типа ВидРасчета, мы будем использовать сокращение ВР.

7.1.2. ПРИМЕР ПРОСТОГО РАСЧЕТА

Возьмем простой расчет - начисление премии, зависящей от проработанных часов, и на его примере рассмотрим основные свойства расчета.

Алгоритм расчета премии состоит из одной конструкции "если-то-иначе":

1. Начало.

2. Выбрать сотрудника.

3. Если оплата сотрудника производится по окладу, то

премия = (оклад всегоЧасов / всегоЧасовПоКалендарю) коэффициент иначе // Часовой тариф

премия = тариф всегоЧасов коэффициент конец если 3.

4. Конец.

Оклад мы возьмем из справочника Сотрудники 2 (согласно ему все наши люди "сидят" на окладе). Значение переменной всегоЧасов - число отработанных сотрудником часов в расчетном периоде - придется вводить (или подсчитывать по табелю) ежемесячно. Значение переменной всегоЧасовПоКалендарю - число рабочих часов в расчетном периоде - в 1С определяется при помощи объектов типа Календарь. С переменной коэффициент поступим так: установим индивидуальный для каждого сотрудника коэффициент, причем его значения в разных расчетных периодах могут не совпадать. Если коэффициент постоянен и одинаков для всех работников, то его можно добавить в список констант, причем периодических.

Из приведенного обзора входных данных алгоритма следует, что справочник Со-трудники_2 нужно дополнить еще одним реквизитом - Календарь. Тогда, зная календарь, то есть зная продолжительность рабочей недели и рабочего дня сотрудника, а также даты выходных и праздников в расчетном периоде, легко вычислить значение переменной всегоЧасовПоКалендарю. В 1С его вернет следующий код:

// Возвращает число рабочих часов в расчетном периоде по календарю // кален - параметр типа Календарь; жз - переменная типа ЖурналРасчетов.Зарплата // датаП - дата, принадлежащая текущему расчетному периоду ЖЗ функция НайгиВсегоЧасовПоКалендарю(кален, жз, датаП) возврат кален.Часов(жз.НачалоПериодаПоДате(датаП), жз.КонецПериодаПоДате(датаП)); конецфункции // НайтиВсегоЧасовПоКалендарю

// Запустим функцию НайтиВсегоЧасовПоКалендарю из обработки Проба процедура Выполнить() // Связана с кнопкой Пуск обработки Проба

перем кален, жз, датаП, всегоЧасовПоКалендарю; кален = СоздатьОбъект("Календарь.Рабочие_2"); жз = СоздатьОбъект("ЖурналРасчетов.Зарплата_2");

// 3 марта 2001 г. - дата, принадлежащая текущему расчетному периоду ЖЗ датаП = '03.03.2001';

всегоЧасовПоКалендарю = НайтиВсегоЧасовПоКалендарю(кален, жз, датаП); Сообщить("Число рабочих часов в марте 2001 г. равно " + всегоЧасовПоКалендарю); конецПроцедуры // Выполнить

Результат;

Число рабочих часов в марте 2001 г. равно 167

Такой результат получен, потому что рабочие работают на пятидневке; продолжительность рабочего дня - 8 ч; в марте один праздник - 8 Марта; продолжительность предпраздничного дня -7 ч. Тогда имеем в марте 2001 г. 21 рабочий день и всегоЧасовПоКалендарю = 20 8 + 7 = 167. Более подробно об управлении календарями см. в разд. 7.5.

Вернемся, однако, к премии. В ЖЗ ее расчет может отобразиться в виде результата, представленного на рис. 7.1. Но чтобы его получить, придется выполнить некоторую цепочку действий. Эта цепочка должна отражать реальные процессы начисления зарплаты в целом и премии в частности.

Сотрчдник IBP 1
±1 Добрецов Борис 1 Премия коэфіі 167.01 1.670.00Ц 2013001 || 01 03 01 131 03.01
Рис. 7.1. Премия Добрецова Бориса Юрьевича.
Как правило, вопросы премирования отражаются в приказе о премии по отдельному подразделению или по предприятию в целом. Чтобы ускорить создание этого документа, в нем следует предусмотреть реквизиты Сотрудник, всего Часов, коэффициент, премия, а также даты, задающие период, за который премия начисляется, называемые датами начала и окончания расчета. Период, в которой эти даты входят, называется периодом действия расчета. В 1С период действия расчета всегда принадлежит одному расчетному периоду.

Кроме того, документ должен ссылаться на процедуру, выполняющую по введенным данным расчет премии. В самой же процедуре по известному календарю должен осуществляться расчет значения переменной всего ЧасовПоКалендарю.

Таким образом, табличная часть документа имеет вид, представленный в табл. 7.1.

Таблица 7.1

Табличная часть документа ПриказОПремии
Сотрудник Отработанные часы Коэффициент Премия
Добрецов Борис Юрьевич 167 10 1,670.00
Графа Премия заполняется автоматически и для редактирования недоступна.

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

Результатом проведения документа является добавление расчета в ЖЗ (см. рис. 7.1).

Список приведенных выше реквизитов документа не является исчерпывающим: для бухгалтерского учета начисления и удержания разных видов нужно отнести на соответствующие счета (дебет и кредит). То есть в документе, в его шапке, нужно добавить реквизит ХозОп (код хозяйственной операции ). Этот код можно выбирать из справочника ХозяйственнаяОперация. Однако известно, что один и тот же ВР связан с определенной хозяйственной операцией. Поэтому правильнее создать дополнительный справочник, например ХозОпДляВР, хранящий для каждого вида расчета его хозяйственную операцию.

7.1.3. НЕКОТОРЫЕ СВОЙСТВА ЖУРНАЛА ЗАРПЛАТЫ И ЕГО

РАСЧЕТОВ

Журнал зарплаты:

• характеризуется расчетным периодом;

• состоит из записей - расчетов;

• содержит для каждого объекта (сотрудника) все причитающиеся ему в расчетном периоде начисления и полагающиеся удержания.

Каждый расчет ЖЗ:

• регистрируется в некотором периоде расчета ЖЗ;

• имеет дату начала и дату окончания, которые в обязательном порядке должны находиться в пределах одного расчетного периода;

• имеет период действия;

• связан с документом, порождающим расчет;

• связан с объектом расчета;

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

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

Замечание. Период действия расчета может лежать в ином, отличном от текущего расчетном периоде. Так, расчет отпуска с 1 июня продолжительностью 40 календарных дней осуществляется в мае. Поэтому, начисляя отпускные, система должна, во-первых, разбить исходный расчет на два, задав для первого в качестве периода действия июнь, а для второго - июль (за это отвечает атрибут ЖЗ ПериодДействия), определив соответствующим образом атрибуты ЖЗ ДатаНачала и ДатаОкончания. Во-вторых, разместить обе части в майском расчетном периоде ЖЗ (за это отвечает атрибут ЖР ПериодРегистрации). Тогда процедура расчета выберет верные календари, расходы бухгалтерского учета будут отнесены на соответствующие периоды, а отпускник увидит в расчетном листке корректные даты.

7.1.4. МЕРОПРИЯТИЯ ПО СОЗДАНИЮ ЖУРНАЛА ЗАРПЛАТЫ

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

1) выделить все имеющиеся на предприятии виды начислений и удержаний;

2) оформить каждый вид начисления (удержания) как объект 1С типа ВидРасчета;

3) разработать документы 1С, автоматизирующие учет отработанного времени;

4) дополнить конфигурацию вспомогательным справочником хозяйственных операций для ВР предприятия;

5) создать ЖЗ;

6) сконструировать отчеты по выполняемым расчетам, в том числе расчетный листок сотрудника.

7.2. ЗАДАНИЕ РАСЧЕТНОГО ПЕРИОДА ЖУРНАЛА ЗАРПЛАТЫ

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

Текущий период - Зарплата_2 -ві
Период расчета. Декабрь 2001 г. ок
с Г 1 Декабря 2001 Отмена
Па 31 Декабре 2001 Помошь

Дополі «
Рис. 7.2. Задание расчетного периода
Смена периода является ответственной процедурой, поскольку приводит к закрытию текущего РП, в результате чего его записи переносятся в разряд архивных и оказываются доступными только для просмотра (если пользоваться стандартными интерактивными средствами). Программно новый РП задается методом журналов расчетов УстановитьТекущийПериод.

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

Если же произошла ошибка и новый РП установлен, когда еще не завершенное расчеты в старом, то возврат к прежнему РП при помощи формы рис. 7.2 приведет к обнулению результатов его расчетов (кроме фиксированных). Этого можно избежать, если вернуться назад программно, вызвав метод УстановитьТекущийПериод и задав в нем второй параметр равным нулю. Например:

процедура Выполнить( ) перем жз, пер, флаг;

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

пер = пер.ПрибавитьПериод(-1); // Получаем предыдущий период

// Возврат к прежнему РП

флаг = жз.УстановитьТекущийПериод(пер, 0); конецПроцедуры // Выполнить

Организовать просмотр прошлых периодов можно, задав соответствующую глубину просмотра архива (рис. 7.3).



Для этого при открытом ЖЗ воспользуйтесь пунктом Задать глубину просмотра архива, входящим в колонку Действия меню системы, или иконкой

7.3. ВИДЫ РАСЧЕТОВ

7.3.1. СВОЙСТВА ВИДОВ РАСЧЕТОВ

7.З.1.1. НЕСОВМЕСТИМЫЕ ВИДЫ РАСЧЕТОВ. ВЫТЕСНЕНИЕ РАСЧЕТА Введем еще несколько понятий.

Назовем интервалом действия расчета промежуток времени между датой начала и датой окончания расчета, включающий и сами даты.

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

Рассмотрим ситуацию, когда расчеты А и Б являются несовместимыми, расчет А с приведенным на рис. 7.4, а интервалом действия уже введен и вводится расчет Б. Возможны случаи:

1. Интервалы действия расчетов различны. Тогда расчет Б будет благополучно введен.

2. Интервалы действия расчетов совпадают, тогда в ЖЗ останется один расчет: либо А, либо Б. Это зависит от направления вытеснения, которое устанавливается в конфигурации для несовместимых ВР при их создании или редактировании. Например, если Б вытесняет А, то А удаляется из ЖЗ, а Б вводится. При обратном направлении вытеснения Б введен не будет.

3. Интервал действия расчета Б полностью лежит в интервале действия расчета А, но А вытесняет Б. Расчет Б не вводится.

4. Интервал действия расчета Б полностью лежит в интервале действия расчета А, но теперь уже Б вытесняет А. Расчет Б вводится, расчет А разбивается на два расчета - А1 и А2, такие, что интервал действия расчета А1 лежит на временной оси слева от интервала расчета Б, а интервал А2 - справа (рис. 7.4, б).

5. Интервалы действия расчетов А и Б частично пересекаются, причем А вытесняет Б. Тогда А остается полностью и вводится часть Б1 расчета Б, такая, что интервал этой части соприкасается на временной оси с интервалом А либо слева, либо справа (в зависимости от характера пересечения) (рис. 7.4, в).

6. Интервалы действия расчетов А и Б частично пересекаются, но теперь уже Б вытесняет А. Тогда Б вводится полностью и остается часть А1 расчета А, такая, что интервал этой части соприкасается на временной оси с интервалом Б либо слева, либо справа (рис. 7.4, г).

Рис. 7.4. Вытеснение расчета: а - интервал действия расчета А до ввода Б; б - Б полностью лежит в А и вытесняет его; в -А и Б частично пересекаются, А вытесняе г - А и Б частично пересекаются, Б вытесняет А
В качестве расчета Б может выступать как расчет, имеющий с А тот же ВР, так и расчет с иным ВР.

ВР, который может вытеснять сам себя, называется самовытесняющимся.

Настройка вытеснения ВР (направление вытеснения), так же как и приоритет, задают-cat в конфигурации при создании или редактировании ВР. В программе можно, применив методы видов расчетов ВытесняетВидРасчета и ВытесняетсяВидомРасчета, узнать, каким образом взаимодействуют два расчета, употребленные с этими методами.

7.З.1.2. ДЛИННЫЕ РАСЧЕТЫ

Расчет называется длинным, если он начинается в одном расчетном периоде, а заканчивается в другом. Длинные расчеты могут существовать только в документах. В 1С длинный расчет при вводе разбивается на обычные, такие, что каждый из них принадлежит к одному расчетному периоду (рис. 7.5).

Рис. 7.5. Длинный расчет А разбивается в ЖЗ на два обычных - А1 и А2, лежащих соответственно в расчетных периодах РП1 и РП2
7.3.2. ПЕРЕЧЕНЬ ВИДОВ РАСЧЕТОВ ПРЕДПРИЯТИЯ

Для определенности условимся, что на нашем предприятии используются приведенные в табл. 7.2 ВР, в которой сокращение ХО, употребленное в заголовке 5-го столбца, расшифровывается как хозяйственная операция.

Таблица 7.2

ВР предприятия
ВР Идентификатор / Синоним Результат Очеред

ность
ХО Документ
Дебет
ВР0 НачСальдо_2 / Начальное сальдо Начальное сальдо прежнего периода + Дебет - Кредит + Сторно 1 2013000 НачПе-

риода_2
ВР1 Оклад_2 / Оклад Оклад * всегоЧасов / всегоЧасов-ПоКалендарю 1 2013000 Табель
ВР2 Тариф_2 / Тариф Тариф * всегоЧасов 1 2013000
ВРЗ ПремияКоэф_2/ Премия коэффициентом всегоЧасов * к3, где к3 - устанавливаемый руководителем коэффициент. По умолчанию к3 =

10 для всех сотрудников
5 2013001 Премия
ВР4 ПремияСум_2 / Премия суммой Сумма премии 1 2013001
ВР5 Премия1234_2/ Премия 1234 (ВР1 | ВР2 + ВРЗ + ВР4) * к5, где к5 - постоянный для всех сотрудников коэффициент 10 2013001
Кредит
ВР6 НДФЛ_2/Налог на доходы физических лиц (ВР1 | ВР2 + ВРЗ + ВР4 + ВР5) * ставкаНалога 15 2017002 Табель
ВР7 ВБанк_2 / Перечисление в банк Целая часть от (ВР0 + ВР1 | ВР2 + ВРЗ + ВР4 + ВР5 - ВР6) 20 2300100
Замечания:
1. Начальное сальдо - это долг за предприятием, если больше нуля, или долг за работником - в противном случае

2. Коэффициент к5 и ставкаНалога добавляются в конфигурацию 1С как периодические константы.

3. ВР Тариф_2, поскольку все сотрудники справочника Сотрудники_2 "сидят" на окладе, в конфигурацию не вводится. Чтобы им воспользоваться, нужно модифицировать справочник Сотрудники_2, добавив в него реквизиты флагОклада и Тариф, задавая флагОклада равным единице, если оплата сотрудника осуществляется по окладу, или равным нулю, если по тарифу.

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

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

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

Для всех премий предусмотрим один документ Премия_2.

Результаты ВР5-7 зависят от результатов других расчетов, поэтому подобного рода ВР называются зависимыми. Они, понятно, должны оцениваться после каждого изменения результатов расчетов, от которых они зависят. Это достигается за счет программирования перерасчетов.

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

Документы, связанные с расчетами, мы будем размещать в перечисленных в табл. 7.3 журналах документов.

Таблица 7.3

Журналы документов, порождающих расчеты
Журнал документов Ускоритель Документ
Расчеты Alt+U НачПериода_2, Премия_2
Табель Alt+B Табель

7.3.3. ДОСТУП К ДОКУМЕНТАМ, ВВОДЯЩИМ РАСЧЕТЫ В ЖУРНАЛ ЗАРПЛАТЫ

В конфигурацию 1С подсистемы Заработная плата и кадры занесено более 200 ВР. Их точное число вернет вызов

Сообщить(Метаданные.ВидРасчета( )); // Сообщит о числе ВР в конфигурации

Число документов в конфигурации существенно меньше - несколько десятков. Не все из них порождают расчеты. Однако немало и таких. Выбор документа, вводящего в ЖЗ расчеты, из списка, содержащего несколько десятков наименований, обременителен. Поэтому поступим так. Разместим в новом перечислении ВР2 (рис. 7.6) имена документов из табл. 7.2, вводящих расчеты.

Рис. 7.6. Перечисление для выбора вводимого вЖЗрасчета
В представлениях значений перечисления В Р 2 отобразим имена соответствующих ВР:

• Начальное сальдо (представление элемента НачСальдо);

• Расчеты Оклад/Тариф, НДФЛ и ВБанк (представление элемента Табель);

• Премия коэффициентом, суммой и 1234 (представление элемента Премия).

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

7.3.4. ПОРЯДОК ВВОДА И ВЫЧИСЛЕНИЯ РАСЧЕТОВ ЖУРНАЛА ЗАРПЛАТЫ. ПРИОРИТЕТ ВИДОВ РАСЧЕТОВ

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

Порядок вычисления результатов расчетов уже не может быть произвольным, и для его регулирования в 1С каждый ВР снабжается приоритетом, задаваемым целым числом и определяющим очередность выполнения расчета. Причем чем меньше число, указанное для приоритета, тем скорее произойдет вызов процедуры, выполняющей расчет. Очередности (приоритеты) ВР предприятия указаны в табл. 7.2 и пояснений, пожалуй, не требуют. Заметим только, что между значениями приоритетов оставляют промежутки, чтобы при необходимости разместить в них приоритеты вновь появившихся ВР.

Чтобы продемонстрировать методы работы с ЖЗ и его расчетами, определим все расчеты как самовытесняющиеся, а также зададим ВР4 (премия суммой) как вытесняющий ВРЗ (премия коэффициентом).

7.3.5. ДОБАВЛЕНИЕ ВИДОВ РАСЧЕТОВ В КОНФИГУРАЦИЮ

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

Однако разделение расчетов оправданно, поскольку позволяет задавать приоритеты ВР, управлять вытеснением и перерасчетом, формировать подходящие группы расчетов.

Последуем и мы этой линии разделения ВР. Откроем конфигурацию, переместимся на закладке Метаданные в раздел Виды расчетов и введем новые ВР, а результат отобразим на рис. 7.7.

1?) НэчСальдо_2 Оклад?

і!] ПремияКоэф_2

2] ПремияСі*м_2 ?] Премия1234_2 |] НДФЛ_2 ВБанк_2

Рис. 7.7. ВР сотрудников из справочника Сотрудники_2.

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

Замечание. ВР хранятся в файле конфигурации системы 1CV7.MD.

7.3.6. ВИД РАСЧЕТА НАЧАЛЬНОЕ САЛЬДО

7.З.6.1. СВОЙСТВА ВИДА РАСЧЕТА НАЧАЛЬНОЕ САЛЬДО

Зададим их в соответствии с рис. 7.8.

Рис. 7.8. Свойства ВР Начальное сальдо
Это простой по свойствам ВР. Он не является вытесняющим, длинным или зависимым. Правда, он является обязательным и самовытесняющимся. Даты начала и окончания расчетов с ВР Начальное сальдо всех сотрудников одинаковы. Для определенности установим их равными дате начала текущего периода, возвращаемой методом ЖР НачалоТекущегоПериода.

Замечание. Идентификатор, синоним и комментарий ВР выводятся следующими сообщениями:

Сообщить(ВидРасчета.НачСальдо_2.Код);

Сообщить("" + ВидРасчета.НачСальдо_2);

Сообшить(ВидРасчета. НачСальдо_2. Наименование);

Результат:

НачСальдо_2 Начальное сальдо

Долг за предприятием или сотрудником

7.3.6.2. МОДУЛЬ ВИДА РАСЧЕТА НАЧАЛЬНОЕ САЛЬДО

Проста и формула расчета результата ВР Начальное сальдо:

// начСальдоСтар - начальное сальдо предшествующего расчетного периода начСальдоНовое = начСальдоСтар + Дебет - Кредит + Сторно;

В нашем случае

Дебет = Оклад_2 | Тариф_2 + ПремияКоэф_2 + ПремияСум_2 + Премия 1234_2;

Кредит = НДФЛ_2 + ВБанк_2;

// Сторно - результаты расчетов, возникших при исправлении ошибок

При отсутствии какого-либо ВР соответствующее слагаемое в формуле расчета начального сальдо равно нулю.

В модуль ВР Начальное сальдо включим следующий код:

функция НачСальдо(Сотрудник, нтп) далее

процедура ПровестиРасчет() // Выполняется при проведении расчета

// Результат, Объект - атрибуты ЖЗ

Результат = НачСальдо(Объект, НачалоТекущегоПериода()); конецПроцедуры

// Считает начальное сальдо функция НачСальдо(Сотрудник, нтп)

жз = СоздатьОбъект("ЖурналРасчетов.Зарплата_2"); сальдо = 0;

жз.ВыбратьПериодПоОбъекту(Сотрудник, нтп- 1); пока жз.ПолучитьЗапись( )=1 цикл

если жз.ВидРасч.ВходитВГруппу(ГруппаРасчетов.ВсеУдержания_2) = 1 тогда сальдо = сальдо - жз.Результат; иначеЕсли жз.ВидРасч = ВидРасчета.ВБанк_2 тогда сальдо = сальдо - жз.Результат;

иначе // Дебет или сторнированный расчет

сальдо = сальдо + жз.Результат; конецЕсли; конецЦикла; // пока возврат сальдо; конецФункции // НачСальдо

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

В нашем случае в группу ВсеУдержания_2 войдет лишь ВР НДФЛ_2 (рис. 7.9), и мы вместо строки кода

если жз.ВидРасч.ВходитВГруппу(ГруппаРасчетов.ВсеУдержания_2) = 1 тогда могли бы записать

если жз.ВидРасч = ВидРасчета.НДФЛ_2 тогда

Рис. 7.9. Новая группа ВРВсеУдержания_2
Однако чтобы сохранить работоспособность кода на случай добавления новых удержаний, оставим его без изменений. Конечно, нужно всегда помнить: каждое новое удержание должно быть добавлено в группу ВсеУдержания_2, иначе ВР Начальное сальдо и все иные ссылающиеся на эту группу программы будут давать неверные результаты.

Возможность включения ВР в существующие в конфигурации группы предоставляется 1С уже при вводе ВР (см. рис. 7.8). Однако чтобы это действие выполнять осознанно, нужно иметь информацию, какие группы и для каких целей используются. Ее можно сосредоточить в описании группы ВР (рис. 7.10), корректируя его каждый раз при добавлении или удалении ссылок на группу.

Рис. 7.10. Включаем в описание группы ВР сообщение об объекте, в котором есть ссылка на группу
Как мы ранее условились, ввод расчетов с ВР Начальное сальдо будет осуществляться непосредственно из модуля формы списка ЖЗ. Это выполняется методами ЖР Новая, УстановитьРеквизит и Записать. Специфика метода Записать в том, что он не проверяет правила вытеснения и перерасчета ВР, даже если они есть. Поскольку ВР Начальное сальдо является самовытесняющимся, то надо либо запретить ввод начального сальдо, если расчет с таким ВР объект уже имеет, либо заменить существующий на новый. Мы остановимся на первом варианте. Он логичен, поскольку начальное сальдо вычисляется по данным закрытого, отнесенного в архив периода и не должно изменяться во времени.

При вводе ВР Начальное сальдо сразу же будем вычислять и фиксировать его значение, вызывая метод ЖР ВыполнитьРасчет и устанавливая в атрибут ЖР Фиксирована число 1.

7.3.6.3. ДОКУМЕНТ НачПериода_2

Назначение документа НачПериода_2 - это фиксация факта смены расчетного периода: каждая плановая смена должна сопровождаться расчетом начального сальдо сотрудников. На документ НачПериода_2 согласно табл. 7.2 должны ссылаться расчеты с ВР НачСальдо_2. Эта ссылка фиксируется атрибутами ЖР Документ и Родитель-скийДокумент и носит формальный характер, ибо без нее нельзя ввести расчет в ЖЗ. С другой стороны, такой документ полезен, поскольку в нем будут отражаться такие важные операции, как смены расчетных периодов.

Документ будем фиксировать в новом журнале Расчеты, в котором будут размещаться и все иные, кроме Табеля, документы, вводящие расчеты в ЖЗ Зарплата_2.

Удобнее всего факт смены расчетного периода было бы выполнять в предопределенной процедуре модуля формы ЖР ПриСменеРасчетногоПериода. Однако такой процедуры нет, но взамен есть одноименная процедура глобального модуля. Именно в нее мы поместим вызов процедуры ФиксироватьСменуРП. Чтобы гарантировать вызов этой процедуры после выполнения всех проверок, код ее вызова нужно расположить в конце предопределенной процедуры ПриСменеРасчетногоПериода.

Вызов процедуры ФиксироватьСменуРП может быть таким:

// Это предварительное описание разместим до кода // предопределенной процедуры ПриСменеРасчетногоПериода процедура ФиксироватьСменуРЩжз, период) далее

процедура ПриСменеРасчетногоПериода(Жрн, Период)

// Меняем расчетный период в ЖЗ Зарплата_2 если Жрн.Вид() = "Зарплата_2" тогда

ФиксироватьСменуРЩЖрн, Период);

конецЕсли;

конецПроцедуры // ПриСменеРасчетногоПериода

Саму же процедуру ФиксироватьСменуРП расположим в конце глобального модуля: процедура ФиксироватьСменуРЩжз, период)

// Тело процедуры ФиксироватьСменуРП

конецПроцедуры // ФиксироватьСменуРП

Написание кода процедуры завершим после создания документа НачПериода_2, в табличной части которого определим 3 реквизита: НовПериод, ДатаУстановки и Пользователь. Первому и третьему назначим символьный тип с длиной строки в 15 символов, а второму - тип Дата. Такие реквизиты позволят нам фиксировать не только факт смены расчетного периода, но и лицо, смену осуществившее.

Все столбцы табличной части документа сделаем недоступными для редактирования, а в шапке документа разместим лишь заголовок таблицы (рис. 7.11).

Рис. 7.11. Диалог формы документа Начальное сальдо
Иные свойства документа определим в соответствии с рис. 7.12.

Идентификатор: |НачЛериода_2

Котаиентарий | Для ЖЗ Зарплага_2

Жідная

Сменим

Расчеты

ачало периода
Реквизиты шагжи Реквизиты табличной части
ш НоеПеоиоа
ЛатаУстановки
Пользователь
Новый 1 И Новый 1 Изменить 1 Уда/?гъ |
Номер

Ніриератор: j<< Не назначен >>

-Тмі-

<• Числовой Текстовый
~3

Г” ^онгро/ь уникальности

Г Ьу^агтер'»:'t'v"r ' :

Г* учет

Периооимюсть: | По всем данного в?ша I- Автоматическая нумерация Г” Раэреимть проведение документа F? Автоматическая нумерация строк

Рис. 7.12. Свойства документа НачПериода 2

Теперь ясен и текст процедуры ФиксироватьСменуРП:

// Заносит данные о смене расчетного периода в документ НачПериода_2 процедура ФиксироватьСменуРП(жз, период)

// период - переменная типа РасчетныйПериод перем док;

док = СоздатьОбъект("Документ.НачПериода_2");

// Номер документа не меняется и всегда равен единице док.НайтиПоНомеру(1, Дата(0)); если док.Выбран( ) = 1 тогда

док.НоваяСтрока(); // Добавляем в документ новую строку

док.НовПериод = жз.ОписательПериода(период.ДатаНачала);

// Дата смены расчетного периода ЖЗ Зарплата_2 док.ДатаУстановки = ТекущаяДата();

док.Пользователь = ИмяПользователя( ); док.Записать();

// Открываем документ НачПериода_2 под номером 1 для контрольного просмотра ОткрытьФорму(док.ТекущицДокумент()); иначе

Предупреждение(''Документа НачПериода_2 под номером 1 нет."); конецЕсли;

конецПроцедуры // ФиксироватьСменуРП

Чтобы предотвратить интерактивное редактирование документа НачПериода_2, снабдим модуль формы документа следующими предопределенными процедурами:

процедура ПриУдаленииСтроки()

Предупреждение(''В этом документе нельзя удалять записи.");

СтатусВозврата(0);

конецПроцедуры // ПриУдаленииСтроки процедура ПриВводеСтроки()

Предупреждение("В этот документ нельзя добавлять записи.");

СтатусВозврата(0); конецПроцедуры // ПриВводеСтроки

процедура ПриОткрытии()

форма.ПанельИнструментов(0); // Отключаем панель инструментов

конецПроцедуры // ПриОткрытии

Запрет на редактирование данных мы наложили, сделав недоступными столбцы табличной части документа.

Для создания и записи в журнал Расчеты документа НачПериода_2 с номером 1 воспользуемся обработкой Проба, разместив в ней на этот раз следующий код:

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

перем док;

док = СоздатьОбъект("Документ.НачПериода_2");

// Номер документа не меняется и всегда равен единице док.НайтиПоНомеру(1, Дата(0)); если док.Выбран() = 1 тогда

Предупреждение("Документ НачПериода_2 под номером 1 уже есть."); иначе

док.Новый(); док.НомерДок = 1; док.ДатаДок = ТекущаяДата(); док.Записать();

ОткрытьФорму("Журнал.Расчеты"); конецЕсли;

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

Результат приведен на рис. 7.13

Рис. 7.13. Создан документ НачПериода_2 под номером 1
В дальнейшем иных документов вида НачПериода_2 создаваться не будет, а все записи о смене расчетных периодов будут направляться в документ № 1.

7.3.7. СПРАВОЧНИК ХОЗЯЙСТВЕННЫХ ОПЕРАЦИЙ ВИДОВ РАСЧЕТОВ

С каждым ВР связана некоторая хозяйственная операция. Эту взаимосвязь отобразим в справочнике ХозОпДляВР, разместив в нем два дополнительных реквизита:

1) ВР типа ВидРасчета;

2) ХозОп с разновидностью типа Справочник.ХозяйственнаяОперация.

Число уровней справочника - 1. Длину атрибута Код установим равной трем, Наименования - нулю. Для редактирования используем форму списка (рис. 7.14).

Рис. 7.14. Хозяйственные операции ВР
Вызов справочников будем осуществлять из колонки Бухучет зарплаты меню интерфейса Ученик (рис. 7.15).

- ^ Бухучет зарплаты

0 Хозяйственные операции 0 План счетов 0 Виды аналитического учета 0 Хозоперации ВР

Рис. 7.15. Вспомогательные справочники для ведения бухучета зарплаты
Справочник ХозяйственнаяОперация имеется в базовой конфигурации Заработная плата и кадры и содержит, если заполнен, приведенные на рис. 7.16 данные.

Значения полей справочника ХозОпДляВР выбираются из раскрывающихся предоставляемых 1С списков. После заполнения, которое производится по данным табл. 7.2, справочник отобразится в соответствии с рис. 7.14.

Замечание. Данные, необходимые для бухгалтерского учета заработной платы и, в частности, для использования справочником ХозяйственнаяОперация, передаются в конфигурацию Заработная плата и кадры из конфигурации Бухгалтерский учет следующим образом. Первоначально из конфигурации Бухгалтерский учет в результате выполнения цепочки Сервис - Обмен данными - Выгрузка данных в конфигурацию "Зарплата + Кадры" в текстовый файл, например D:\lCv77\lsbtrans.txt, выгружаются объекты бухгалтерского учета и счета (из плана счетов) и соответствующие им статьи аналитического учета. (Если счета не выбраны, то из бухгалтерии будет выгружен заданный по умолчанию набор счетов.) Затем данные обменного файла загружаются программой Заработная плата и кадры в результате применения цепочки Сервис - Обмен данными - Загрузка данных -выбор файла с данными, например D:\lCv77\lsbtrans.txt, - Загрузить. Принятые данные используются в процессе заполнения справочника ХозяйственнаяОперация.

Создадим теперь журнал Зарплата_2 и введем в него расчеты с ВР НачСальдо_2.

7.4. ПОСТРОЕНИЕ ЖУРНАЛА ЗАРПЛАТА

7.4.1. АТРИБУТЫ ЖУРНАЛА РАСЧЕТОВ И ЕГО ПЕРИОДА

ЖР - это вполне готовый к употреблению объект, снабженный большим числом атрибутов и методов. Атрибуты журнала - это и есть те самые графы, заполняемые для каждого расчета (записи) журнала.

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

Таблица 7.4

Атрибуты ЖР и его периода
Атрибут Описание Тип
Атрибуты расчетного периода ЖР
ДатаНачала Дата начала расчетного периода (РП). Устанавливается при смене РП. Является компонентом объекта типа Расчет-ныйПериод Дата
ДатаОкончания Дата окончания РП. Устанавливается при его смене. Является компонентом объекта типа РасчетныйПериод
ОписательПериода Символьное представление РП. Так, если ДатаНачала = '01.12.2001', а ДатаОкончания = '31.12.2001', то ОписательПериода = "Декабрь 2001 г.". Полезен при формировании отчетов Символь

ный
Атрибуты ЖР
Документ Ссылка на документ, на основании которого расчет введен в ЖР. Автоматически заполняется в момент проведения документа. Если документа-основания нет, то совпадает с родительским документом Документ
Родительский

Документ

Документ, который ввел расчет в ЖР. Автоматически заполняется в момент проведения документа, добавляющего расчет в ЖР

Объект

Ссылка на элемент справочника-объекта расчета. В нашем случае имеет разновидность типа Справочник. Сотрудники_2. Для сотрудников из этого справочника в ЖЗ заносятся записи о начислениях и удержаниях, из которых складывается зарплата

Зависит от вида объекта

ВидРасч

Ссылка на процедуру, осуществляющую расчет текущей записи. Предназначен для чтения

Вид

Расчета

ДатаНачала

Дата начала действия расчета. Определяется при проведении родительского документа; если дата в нем не задана, то становится равной дате начала текущего расчетного периода. Предназначен для чтения

Дата

ДатаОкончания

Дата окончания действия расчета. Определяется так же, как и ДатаНачала. Значения атрибутов ДатаНачала и ДатаОкон-чания каждого расчета лежат в пределах одного расчетного периода. Предназначен для чтения

ПериодДействия

РП, в который попадают даты начала и окончания действия расчета. Пользователем не устанавливается, а определяется значениями атрибутов ЖР ДатаНачала и ДатаОкончания. Предназначен для чтения

Расчетный

Период

Период

Регистрации

Сторно’

Рассчитана

Исправлена

РП, в котором расчет введен в ЖР. Пользователем не устанавливается. Предназначен для чтения

Получает значение 1, если запись является сторнирующей, или 0 - для обычных записей. Сторнированные нерассчитан-ные записи отмечаются в ЖЗ иконкой G3, а рассчитанные -иконкой &3

Получает значение 1, если запись рассчитана, или О-в противном случае. Расчет выполняется либо по соответствующей команде колонки меню Действия, либо в результате применения метода ЖР Рассчитать или ВыполнитьРасчет. Нерассчитанные записи сопровождаются в ЖР иконкой СИ), рассчитанные - иконкой itl

Получает значение 1, если расчет исправлен вручную, или О, если ручная правка отменена или ее не было вовсе. Исправленные вручную записи сопровождаются в ЖР иконкой ІО. Ручное редактирование имеет больший приоритет, чем автоматический расчет, то есть исправленные вручную записи при очередном сеансе расчета не обновляются. Атрибут обнуляется в результате выполнения Действия - Отменить ручное исправление. После отмены запись считается нерассчи-танной и подлежит перерасчету

Числовой

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

Атрибут Описание Тип
[фиксирована Получает значение I, если расчет фиксирован, или 0 - в противном случае. Фиксируется при выполнении метода ЖР ФиксироватьЗапись. Результат расчета фиксированной записи не может быть изменен. Переводится в разряд нефиксированных расчетов методом ОсвободитъЗапись. Сопровождается в ЖР скрепкой на желтом фоне - КД Фиксируются, например, записи о перечислениях зарплаты в банк на лицевые счета сотрудников И
Перерасчет Получает значение 1, если запись является перерасчетом иной записи прошлого периода, или О-в противном случае. Перерасчеты вводятся в ЖР методом ВвестиПерерасчет или ВвестиПерерасчетНаОсновании. Предназначен для чтения. Сопровождается в ЖР следующей иконкой: &У N
ПервичнаяЗапись Запись, на основании которой введен текущий перерасчет. Получает значение при выполнении методов ВвестиПерерасчет и ВвестиПерерасчетНаОсновании. Предназначен для чтения Запись

Журнала

Расчетов
Результат Результат расчета Числовой
<Реквизит> Произвольный, дополняющий встроенные атрибуты, сопровождающий расчет реквизит
Наши ближайшие задачи - это определение дополнительных реквизитов ЖЗ и конструирование журнала.

7.4.2. ДОБАВЛЕНИЕ ЖУРНАЛА ЗАРПЛАТЫ В КОНФИГУРАЦИЮ СИСТЕМЫ

Взамен имеющегося в 1С ЖЗ, например в конфигурации Заработная плата и кадры, создадим новый ЖЗ, дав ему имя Зарплата_2.

Откроем конфигурацию, остановимся на пункте Журналы расчетов, присутствующем на закладке Метаданные, и добавим в него новый подпункт (рис. 7. 17).

В 0 Журналы расчетов ' № Ц Зарплата ; Efr ? Зарплата_2

Рис. 7.17. Новый журнал расчетов
а

б
Отвечая на вопросы конструктора ЖЗ, определим объект и период в соответствии с рис. 7.18.

В качестве дополнительных используем приведенные в табл. 7.5 реквизиты.

Таблица 7.5

Дополнительные реквизиты ЖЗ
Реквизит Описание Примечание
всегоЧасов Число часов, отработанных сотрудником в расчетном периоде Имеет числовой тип и формат 5.1
хозОп Связанная с расчетом хозяйственная операция Имеет разновидность типа

Справочник.Хозяйственная

Операция
строкаДок Номер строки табличной части документа, породившего расчет Имеет числовой тип и формат 5.0
Встроенных атрибутов ЖЗ и трех дополнительных реквизитов вполне достаточно для расчета зарплаты, ее бухгалтерского учета, выпуска сопровождающих расчет отчетов и даже для перечислений в банк. Кстати, последние возможны, если в справочнике Сотрудники_2 хранятся лицевые счета объектов расчета. Для упрощения положим, что номера лицевых счетов совпадают с кодами сотрудников, но предваряются префиксом Б-, например Б-301.

Реквизит строкаДок полезен, если один документ порождает несколько расчетов. Такие документы у нас есть, например Табель. Тогда, зная значение строкаДок, методом документа ПолучитьСтрокуПоНомеру сразу же находится строка табличной части документа, отвечающая рассматриваемой записи ЖЗ. Правда, доверять значению этого реквизита можно, если между строками табличной части документа и расчетами существует устойчивая связь. Она может нарушиться, например, если после удаления строки табличной части документ сохраняется без перепроведения. Таким образом, для документа передающего в ЖЗ значение реквизита строкаДок, необходимо в модуле документа вызвать метод документа, причем с единичным параметром, например, так:

процедура ПриЗаписи() // Предопределенная процедура модуля документа

ПриЗаписиПерепроводить(1); конецПроцеауры // ПриЗаписи

Можно обойтись и без вызова метода ПриЗаписиПерепроводить, если с кнопкой ОК формы документа связать такую последовательность команд:

#3аписать Провести Закрыть

Окно с заданными свойствами и реквизитами ЖЗ приведем на рис. 7.19.

Журнал расчетов зарплата 2

?і*юним |. Куриал заработной плап

I Зарплата. 2

Идентификатор

М»МНІ ИМИ

Справочник

I Расисты сотруамаюе из справок »м Сотруат*<*я_2

IСотруанмки_2

Пермооичность Размер I Месяц

Дата отсчета (01 01.01

Результат

Горюетъ

Новый

Удаляь

Графы отбора

•/ Роците/ь Оклад

?Образование

ПржаэОклад

-1 Зашсымтьна...

(* конец

начало

ПржазЛрием

Описание

Рис. 7.19. Характеристики вновь построенного ЖЗ

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

Замечания:

1. Для нового ЖЗ система создаст файл, возможно CJ4287.DBF.

2. Впоследствии мы введем еще одну графу отбора - Образование (разд. 7.13, пример 9).

7.4.3. ФОРМА СПИСКА ЖУРНАЛА ЗАРПЛАТЫ

В форме списка ЖЗ отобразим необходимую для визуального контроля расчетов информацию: ФИО сотрудника, ВР, а точнее, его представление, число отработанных часов (графа Часы), результат и даты начала и окончания расчета (рис. 7.20).

Размещение per визитов т урнала Расчетов

? Объект

ВиоРасч

? ДатаНачала ? ДатаОкончания ? Резугьтат ? чозОп

ПвсегоЧасое

Р Разместить в диалоге автоматически

Приведем предложенный 1С диалог формы к представленному на рис. 7.21 виду.
Рис. 7.21. Диалог формы списка ЖЗ
Все столбцы, кроме столбцов Хоз. оп. и Результат, оставим доступными только для просмотра. (Свойства столбца, напомним, меняются после его выделения и выполнения цепочки Действия - Свойства или нажатия на Alt + Enter.) Возможность смены хозяйственной операции в ЖЗ должна быть предусмотрена, так как в документах, порождающих расчеты, изменить хозяйственную операцию нельзя: она берется как есть из созданного нами справочника ХозОпДляВР (разд. 7.3.7). Заметим, что изменить хозяйственную операцию фиксированных расчетов не удастся и в ЖЗ.

Первый столбец ЖЗ предназначен для показа сопровождающих расчеты иконок (пиктограмм). Столбец с именем ВР добавлен в таблицу после выбора иконки / на панели инструментов Элементы диалога. В поле Формула этого столбца размещено выражение

+ ВидРасч

выводящее в ячейки столбца не идентификатор ВР, а его синоним.

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

Радиокнопки Сотрудник и Цех, задают режимы расчетов Начало месяца, итоговой заработной платы, а также режимы вывода документов - печати расчетного листка и ведомости перечислений в банк.

Радиокнопки, или переключатели, являются новым для нас элементом диалога. Для взаимосвязи радиокнопки размещаются в группе, в нашем случае имеющей название Режим расчета. Группа формируется следующим образом:

1. Добавляется радиокнопка (выбирается иконка на панели инструментов Элементы диалога) с заголовком Сотрудник, ей присваивается идентификатор кто (имя может быть произвольным), который и будет служить идентификатором группы. На закладке Дополнительно этой радиокнопке задается свойство Первый в группе.

2. Добавляется радиокнопка с заголовком Цех, и ей присваивается идентификатор кто2, который нам пригодится для управления доступностью кнопки. Никаких дополнительных свойств для нее не задается.

3. Кнопки обводятся рамкой группы (задается иконкой И), которой присваивается заголовок Режим расчета.

Замечание. Бывает, что 1С "капризничает" и не хочет объединять обведенные радиокнопки в группы. Однако с этим можно справиться, если имя кто и свойство Первый в группе приписать крайнему справа переключателю.

Переменная диалога кто принимает значения:

• 1, если выбрана радиокнопка Сотрудник; и в этом случае команды ЖЗ, например команда печати расчетного листка или ведомости перечислений в банк, выполняются для одного выбранного в ЖЗ сотрудника;

• 2, если выбрана радиокнопка Цех; команды ЖЗ выполняются для сотрудников отображаемого в ЖЗ подразделения.

Если в ЖЗ представлено все предприятие (закл = 0), то кто = 1 и радиокнопки недоступны, и тогда расчеты производятся для одного сотрудника.

В верхней правой части диалога разместим кнопки с картинками - обычные кнопки, в которых заголовок заменен на картинку, выбираемую на соответствующей закладке окна задания свойств кнопки (рис. 7.22).

Обшив I Допоо«тел>но | Комамаа ;| Orwcame
-Рисовать-

Растянуть

По центру Пропорцион
Изменить карт?ыу
Рис. 7.22. Задание картинки для кнопки
С элементами диалога формы списка ЖЗ свяжем перечисленные в табл. 7.6 формулы. Они, напомним, пишутся на закладке Дополнительно в окне задания свойств элементов диалога.

Таблица 7.6

Элементы диалога формы списка ЖЗ и их формулы
Элемент диалога Формула/комацда Описание
По цехам (имеет

идентификатор

закл)
ПоЦехам() Включает/отключает режим вывода расчетов по цехам. Радиокнопки становятся недоступными, если закл = 0. При этом значение кто устанавливается равным единице
Режим расчета; радиокнопки Сотрудник и Цех (имеет идентификатор кто) ЗиачКтоСтар() Запоминает значение переменной кто, для его восстановления при выборе режима отображения по цехам, то есть когда закл = 1
Ввод расчета ВводРасчета() Позволяет выбрать документ, вводящий новые расчеты, открыть форму документа и ввести нужные расчеты (описание ВР см. в табл. 7.2)
Элемент диалога Формула/команла Описание
Расчет зарплаты РасчетЗП() Рассчитывает зарплату одного сотрудника или сотрудников выбранного подразделения
ОткрытьФорму

(Объект,, 1)
Открывает для просмо гра форму элемента справочника Сотрудники_2
¦ ш ПечатьРЛ() Формирует расчетные листки и выводит их на печать
ВедомостьБанк() Формирует ведомость перечислений в банк
Закрыть #3акрыть Запускается предопределенная процедура ПриЗакрытии
Замечание. Процедуры РасчетЗП, ПечатьРЛ и ВедомостьБанк, а также расчет начального сальдо выполняются для одного сотрудника, если кто = 1 (активна радиокнопка Сотрудник), для сотрудников выбранного подразделения, либо, если кто = 2 (активна радиокнопка Цех).

Теперь можно добавить в меню интерфейса Ученик команду вызова ЖЗ Зарпла-та_2 (рис. 7.23), связав с ним указанные на рис. 7.24 свойства и задав акселератор Alt+C.

ЕЁ Журналы

0 Кадровые приказы 0 Журнал эарплаты_2

Рис. 7.23. Новый пункт меню интерфейса Ученик

Рис. 7.24. Свойства пункта Журнал зарплаты_2
Теперь ЖЗ доступен для приема данных и просмотра. Для их обработки мы разместим в модуле формы списка ЖЗ подходящие программы.

7.4.4. МОДУЛЬ ФОРМЫ СПИСКА ЖУРНАЛА ЗАРПЛАТЫ

Содержит процедуры, управляющие элементами диалога, позволяющие выбирать ВР для ввода в ЖЗ, выполнить расчет зарплаты и сформировать расчетные листки и ведомости перечислений в банк. Чтобы новый сеанс работы начинался с того же места, где завершился прежний, в программе сохраняются в предопределенной процедуре ПриЗакрытии и восстанавливаются в предопределенной процедуре ПриОткрытии соответствующие параметры формы списка ЖЗ.

7.4.4.1. ПРОЦЕДУРЫ, УПРАВЛЯЮЩИЕ ЭЛЕМЕНТАМИ ДИАЛОГА

// ктоСтар - значение элемента кто до установления значения закл = О перем ктоСтар;

перем нтп; // Начало текущего периода

перем тДок; // Текущий документ

// Объект с разновидностью типа Справочник.ХозОпДляВР перем хозОп;

процедура ПоЦехам() далее

// Процедура нужна, чтобы правильно реагировать на переключения флажка закл процедура ЗначКтоСтар() ктоСтар = кто;

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

процедура ПриЗакрытии() // Предопределенная процедура

перем значОтбора; // Текущее значение отбора при закл = 1

перем реж, значРеж; // Представление: списком или по одному объекту

// Сохраняем на диске значения переменных диалога закл, кто и иных установок

// для следующего сеанса работы

СохранитьЗначение("ЗакладкиВЗарплате", закл);

СохранитьЗначение("КтоВЗарплате", кто);

СохранитьЗначение("ЗначениеОтбора", Объект. Родитель);

// Представление: список или один сотрудник ПолучитьПредставление(реж, значРеж);

СохранитьЗначение("РежимПредставления", реж); СохранитьЗначение("ЗначениеПредставления", значРеж); конецПроцедуры // ПриЗакрытии

процедура ПриОткрытии() // Предопределенная процедура

перем реж, значРеж;

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

закл = ВосстановитьЗначение("ЗакладкиВЗарплате");

если ТипЗначения(закл) = 0 тогда // Если значение переменной закл не восстановлено закл = 1; кто= 1; иначе

кто = ВосстановитьЗначение("КтоВЗарплате"); конецЕсли; ктоСтар = кто;

ПоЦехам(); если закл = 1 тогда

значОтбора = ВосстановитьЗначение("ЗначениеОтбора");

ЗакладкиОтбора(" Родитель", значОтбора); конецЕсли;

реж = ВосстановитьЗначение("РежимПредставления"); значРеж = ВосстановитьЗначение("ЗначениеПредставления"); если реж = 1 тогда

УстановитьПредставление( 1);

иначе

УстановитьПредставление(реж, значРеж); конецЕсли;

нтп = НачалоТекущегоПериода(); конецПроцедуры // ПриОткрытии

// Включает/отключает режим вывода по цехам. Если закл = 0, то устанавливает // кто = 1 и делает недоступными радиокнопки группы Режим расчета процедура ПоЦехам()

если закл = 1 тогда // Если используются закладки отбора

ЗакпадкиОтбора("Родитель"); кто = ктоСтар;

Форма.Кто. Доступность(І);

Форма.Кто2.Доступность(1);

иначе

ЗакладкиОтбора(""); кто = 1;

Форма. Кто .Доступность(О);

Форма.Кто2.Доступность(0);

конецЕсли;

конецПроцедуры // ПоЦехам()

7.4.4.2. ВЫБОР ВИДА РАСЧЕТА ДЛЯ ВВОДА В ЖУРНАЛ ЗАРПЛАТЫ

Осуществляется из перечисления ВР_2. Ввод начального сальдо выполняется процедурами модуля ЖЗ, а иных ВР - соответствующими документами.

процедура НачСальдо() далее

процедура ВводРасчета()

перем значПер, флаг, докВид; значПер = "ВР_2";

// Вид ВР выбирается из диалога, представленного на рис. 7.25

флаг = ВвестиПеречисление(значПер, "Выберите виды расчетов для ввода");

// Если нажали OK, Enter или дважды ударили мышью по выбранному значению если флаг = 1 тогда

докВид = значПер.Идентификатор(); если докВид = "НачСальдо” тогда

НачСальдо(); // Ввод начального сальдо

жз = 0;

иначе // Табель или Премия

// Расчеты вводятся документом ОткрытьФорму(" Документ.” + докВид); конецЕсли; иначе

Предупреждение("Ничего не выбрано."); возврат; конецЕсли;

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

Рис. 7.25. Диалог для выбора вида документа
7.4.4.3. ВВОД НАЧАЛЬНОГО САЛЬДО

Выполняется, если кто = 1, для выбранного в справочнике Сотрудники_2 сотрудника либо для выбранного подразделения. Если сотрудник уже имеет в текущем расчетном периоде расчет в ВР НачСальдо_2, то при повторном вводе меняется лишь результат расчета.

Выбранное подразделение возвращается методом модуля формы ЖР ПолучитьОтбор.

процедура одинСотр(сотр) далее функция ЕстьВЖЗ(сотр) далее

// Заполняет ЖЗ расчетами с ВР НачСадьдо_2 процедура НачСальдо()

перем док, грОт, подр; // подр - значение отбора

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

нш = НачалоТекущегоПериода();

док = СоздатьОбъект("Документ.НачПериода_2");

если док.НайтиПоНомеру(1) = 0 тогда

ПредупреждениеС'Нельзя ввести начальное сальдо. Нет документа НачПериода_2 №1”); возврат; конецЕсли;

тДок = док.ТекущийДокумент();

// Определяемся относительно хозяйственной операции для ВР НачСальдо_2 хозОп = СоздатьОбъект(”Справочник.ХозОпДляВР”);

// Ищем простым перебором в справочнике ХозОпДляВР вид расчета НачСальдо_2

хозОп.ВыбратьЭлементы();

флаг = 0;

пока хозОп.ПолучитьЭлемент() = 1 цикл

если хозОп. ВР = ВидРасчета.НачСальдо_2 тогда флаг= 1; прервать; конецЕсли; конецЦикла; // пока если флаг = 0 тогда

Предупреждение(”Хозяйственная операция для ВР Начальное сальдо не найдена”); возврат; конецЕсли;

// Начало месяца для одного сотрудника. Разрешим множественные выбор если кто = 1 тогда

ОткрытьПодбор(”Справочник.Сотрудники_2”, "ФормаСписка”,, 1); иначеЕсли закл = 1 тогда // Используем закладки отбора

// При первом использовании ЖЗ закладки отбора в нем не отображаются,

// даже если закл = 1; в этом случае начальное сальдо вводится для всех сотрудников

ПолучитьОтбор(грОт, подр); // подр - значение отбора; имеет тип Справочник сСотр_2 = СоздатьОбъект("Справочник.Сотрудники_2"); сСотр_2.ИспользоватьРодителя(подр); сСотр_2. ВыбратьЭлементы(); пока сСотр_2.ПолучитьЭлемент() = 1 цикл если сСотр_2.ЭтоГруппа() = 0 тогда

// Ввод начального сальдо для одного сотрудника одинСотр(сСотр_2.ТекущийЭлемент()); конецЕсли; конецЦикла; // пока

УстановитьПредставление(1); // Отображаем записи по всем объектам // Если в ЖЗ нет записей, тогда подр имеет пустое значение; вводятся все // сотрудники и для отображения закладок отбора вызываем процедуру ПоЦехам если ПустоеЗначение(подр) = 1 тогда ПоЦехам(); конецЕсли;

Форма.Обновить();

конецЕсли;

конецПроцедуры // НачСальдо процедура ОбработкаПодбора(сотр, конт)

одинСотр(сотр); // Начальное сальдо для одного сотрудника

если закл = 0 тогда

закл = 1; // Показываем закладки отбора

ПоЦехам(); конецЕсли;

УстановитьПредставление(2, сотр); // Отображаем записи по одному объекту конецПроцедуры // ОбработкаПодбора

процедура одинСотр(сотр)

// Если расчет с ВР НачСальдо_2 объект уже имеет, то обновляем только результат если ЕстьВЖЗ(сотр) = 0 тогда

// Добавляем расчет с ВР НачСальдо_2 для выбранного сотрудника Новая();

УстановитьРеквизит("Документ", тДок); УстановитьРеквизит("РодительскийДокумент", тДок);

УстановитьРеквизит("Объект", сотр);

УстановитьРеквизит("ВидРасч", ВидРасчета.НачСальдо_2); УстановитьРеквизит("хрзОп", хозОп.ХозОП);

УстановитьРеквизит("ДатаНачала", нтп);

УстановитьРеквизит("ДатаОкончания", нтп); иначе // Делаем расчет нефиксированным

// Журнал позиционирован функцией ЕстьВЖЗ на нужной записи // Подготовка к обновлению результата

ОсвободитьЗапись(); // Делаем запись нефиксированной конецЕсли;

Записать( ); // Не забываем записать новые значения реквизитов

// Обращаемся к предопределенной процедуре ПровестиРасчет ВР НачСальдо_2 // Метод ВыполнитьРасчет должен быть расположен после вызова метода Записать ВыполнитьРасчет( ); // или Рассчитать()

ФиксироватьЗапись(); конецПроцедуры // одинСотр

// Вернет 1, если начальное сальдо для выбранного объекта уже введено,

// или О-в противном случае функция ЕстьВЖЗ(сотр)

если ВыбратьПериодПоОбъекту(сотр) = 1 тогда пока ПолучитьЗапись( ) = 1 цикл

если ВидРасч = ВидРасчета.НачСальдо_2 тогда возврат 1; конецЕсли; конецЦикла // пока конецЕсли; возврат 0;

конецФункции // ЕстьВЖЗ Замечания:

1. Процедуры РасчетЗП, ПечатьРЛ и ВедомостьБанк будут рассмотрены после завершения разработки программ ввода в ЖЗ всех ВР.

2. В ЖЗ сотрудники сортируются так же, как и в справочнике-объекте.

5. Расчеты не должны вводиться для уволенных или еще не приступивших к работе сотрудников, записи о которых, однако, есть в справочнике Сотрудники_2. Проблема решается просто, если есть соответствующие приказы с датами приема и увольнения сотрудника.

4. Записи ЖЗ, в которых неверно определены атрибуты, например в атрибут Документ занесено пустое значение типа Документ, сопровождаются в ЖЗ иконкой ?). Такие записи из ЖЗ нужно изъять. Интерактивно это можно выполнить, применив цепочку Действия - Очистить журнал расчетов.

5. Встроенная процедура СохранитьЗначение записывает на диск (в файл 1CV7.CFG) заданное вторым параметром значение. Встроенная функция ВосстановитьЗначение выполняет обратное действие. Если восстанавливается значение реквизита формы типа СписокЗначений, то функция вызывается как процедура, возвращая результат в свой второй параметр, например:

ВоостановшъЗначение("СписокПодразделений", сПодр);