Опубликовано: 16.08.2022

Работа с видами и группами видов расчётов

Контекст работы с видами и группами видов расчётов

Виды и группы видов расчёта являются частью глобального контекста выполнения программы «1С:Предприятие». Таким образом, для использования атрибутов и методов видов расчётов и групп расчётов достаточно писать непосредственно обращение к атрибутам и методам того или иного расчёта или группы расчётов с использованием ключевого слова ВидРасчета (англоязычный синоним — CalculationKind) или ГруппаРасчетов (англоязычный синоним — CalculationGroup). Это исключает необходимость использования функции СоздатьОбъект() для получения ссылки на соответствующий агрегатный объект.

Общий синтаксис:

ВидРасчета.<ИдентификаторВидаРасчета>.<ИмяАтрибута>
ВидРасчета.<ИдентификаторВидаРасчета>.<ИмяМетода>()

ГруппаРасчетов.<ИдентификаторГруппыВидовРасчета>.<ИмяАтрибута>
ГруппаРасчетов.<ИдентификаторГруппыВидовРасчета>.<ИмяМетода>()

Пример использования:

// Узнаем, входит ли вид расчета ОплатаПоОкладу
// в группу ОблагаютсяНалогом
Проверка = ВидРасчета.ОплатаПоОкладу.ВходитВГруппу(ГруппаРасчетов.ОблагаютсяНалогом);

// Выведем наименование вида расчета
Сообщить(ВидРасчета.Доплата.Наименование);

Объекты типа "ВидРасчета" могут сохраняться в базе данных (реквизиты справочников, документов, журналов расчёта могут иметь тип "ВидРасчета" и хранить ссылки на объекты этого типа).

Атрибуты видов расчёта и групп видов расчёта

Доступ к идентификатору вида расчёта или группы видов расчёта, заданному при конфигурировании, предоставляет атрибут Код (англоязычный синоним — Code). Значение атрибута имеет строковый тип.

Пример:

ВР = ВидРасчета.ПоОкладу;
Сообщить(ВР.Код);

Другой пример:

Группа = ГруппаРасчетов.ОблагаютсяНалогом;
Сообщить(Группа.Код);

Доступ к комментарию вида расчёта или группы видов расчёта, заданному при конфигурировании, предоставляет атрибут Наименование (англоязычный синоним — Descriptor). Значение атрибута имеет строковый тип.

Пример:

ВР = ВидРасчета.АмортизацияС_НДС;
Сообщить(ВР.Наименование);

Другой пример:

Группа = ГруппаРасчетов.ОблагаютсяНалогом;
Сообщить(Строка(Группа.Наименование));

Атрибуты видов расчёта

Сведения об очередности вида расчёта, заданной при конфигурировании, содержит атрибут Очередность (англоязычный синоним — Priority). Значение атрибута имеет числовой тип.

Примечание: Понятие очередности используется для упорядочивания записей журнала расчётов. Это помогает упорядочить расчёт записей, тем самым выполняя, например, расчёт всех начислений раньше, чем расчет базирующихся на них удержаний.

Пример использования атрибута:

ВР = ВидРасчета.ПоОкладу;
Сообщить("Расчет " + ВР.Наименование + "с очередностью " + ВР.Очередность);

Сведения о приоритете вытеснения вида расчёта, заданному при конфигурировании, содержит атрибут ПриоритетВытеснения (англоязычный синоним — ReplacePriority). Значение атрибута имеет числовой тип. Для невытесняющих видов расчёта значение этого атрибута равно нулю.

Примечание: Система использует приоритет вытеснения при разрешении ситуации, когда полностью или частично пересекаются периоды действия видов расчёта. Например, когда метод журнала расчётов ВвестиРасчет() вводит расчёт в «занятый» временной интервал.

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

Пример использования:

Процедура ПровестиДокумент()
   ЖрнЗарплата.ВыбратьЗаписиПоОбъекту(Сотрудник, Начало, Окончание);
   Можно = 1;
   Пока ЖрнЗарплата.ПолучитьЗапись() > 0 Цикл
      Если ЖрнЗарплата.ВидРасч.ПриоритетВытеснения >= ВидРасчета.ОплатаБЛ.ПриоритетВытеснения Тогда
         Можно = 0;
      КонецЕсли;
   КонецЦикла;
   Если Начало > Окончание Тогда
      Можно = 0;
   КонецЕсли;
   Если Можно = 1 Тогда
      ЖрнЗарплата.ВвестиРасчет(Сотрудник, ВидРасчета.ОплатаБЛ, Начало, Окончание, 0);
      Если Начало > ЖрнЗарплата.НачалоТекущегоПериода() Тогда
         Перерасчет(ГруппаРасчетов.ПересчДляБЛ, Сотрудник, ТекущийДокумент(), Начало, Окончание);
      КонецЕсли;
   Иначе
      Предупреждение("Некорректный больничный лист! 
                     | Проверьте и исправьте даты начала и окончания.
                     | После этого закройте документ, повторно откройте 
                     | и проведите его");
      НеПроводитьДокумент();
   КонецЕсли;
КонецПроцедуры

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

Получить доступ к объекту вида расчёта конкретного вида по его имени позволяет метод ПолучитьАтрибут() (англоязычный синоним — GetAttrib()). Метод применяется только к объекту глобально контекста "ВидРасчета".

Синтаксис метода:

ВидРасчета.ПолучитьАтрибут(<ИмяВидаРасчета>)

где <ИмяВидаРасчета> — строковое выражение, содержащее идентификатор вида расчёта, как он задан в Конфигураторе.

Таким образом, приведённые ниже выражения идентичны:

Проверка = ВидРасчета.ПолучитьАтрибут("ОплатаПоОкладу").ВходитВГруппу(ГруппаРасчетов.ОблагаютсяНалогом);

// или

Проверка = ВидРасчета.ОплатаПоОкладу.ВходитВГруппу(ГруппаРасчетов.ОблагаетсяНалогом);

Определить входимость вида расчёта в конкретную группу расчётов позволяет метод ВходитВГруппу() (англоязычный синоним — BelongsToGroup()). Возвращаемым значением метода является число 1, если вид расчёта входит в указанную группу, или 0, если вид расчёта не входит в эту группу.

Синтаксис метода:

ВходитВГруппу(<Группа>)

где <Группа> — группа расчётов, входимость в которую проверяется.

Пример:

// В журнале расчетов зарплаты посчитаем все начисления
// для текущего сотрудника
ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
// Начало и конец текущего периода журнала
НТП = ЖР.НачалоТекущегоПериода();
КТП = ЖР.КонецТекущегоПериода();
Группа = ГруппаРасчетов.ВсеНачисления;
Всего = 0;
ЖР.ВыбратьЗаписиПоОбъекту(Объект, НТП, КТП);
Пока ЖР.ПолучитьЗапись() = 1 Цикл
   Если (ЖР.ВидРасч.ВходитВГруппу(Группа) = 1) Тогда
      Всего = Всего + ЖР.Результат;
   КонецЕсли;
КонецЦикл;
 . . .

Определить, не является ли «пустым» значение переменной или реквизита типа "ВидРасчета" позволяет метод Выбран() (англоязычный синоним — Selected()). Параметры у этого метода отсутствуют. Возвращаемым значением метода является число 1, если конкретный вид расчёта выбран, или 0, если вид расчёта не выбран.

Пример:

Допл = ГруппаРасчетов.Доплаты;
ЖЗ = СоздатьОбъект("ЖурналРасчетов.Зарплата");
// Док — ссылка на документ, имеющий реквизит Сотрудник
ЖЗ.ВыбратьЗаписиПоОбъекту(Док.Сотрудник);
Пока ЖЗ.ПолучитьЗапись() = 1 Цикл
   Если ЖЗ.ВидРасч.ВходитВГРуппу(Допл) = 1 Тогда
      // предполагается, что документы-основания этих
      // видов расчета имеют реквизит ВР
      Если ЖЗ.Документ.ВР.Выбран() = 0 Тогда
         Сообщить("Не указан конкретный вид расчета в документе!");
      КонецЕсли;
   КонецЕсли;
КонецЦикла;

Определить, вытесняет ли текущий вид расчёта, расчёт, указанный в параметре, позволяет метод ВытесняетВидРасчета() (англоязычный синоним — DisplaceCalc()). Возвращаемым значением метода является число 1, если вид расчета, метод которого вызывается, вытесняет расчёт, указанный в параметре. В противном случае метод возвращает 0. Метод предназначен для определения взаимного влияния видов расчёта при вводе их в журнал расчётов.

Синтаксис метода:

ВытесняетВидРасчета(<ВидРасчета>)

где <ВидРасчета> — вид расчёта, для которого проверяется, вытесняется ли он текущим видом расчёта.

Пример:

// ВР — реквизит документа типа "ВидРасчета",
// Сотр — реквизит документа типа "Элемент справочника Сотрудники".
// ДтНач, ДтОконч — реквизиты документа типа "Дата"
ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖР.ВыбратьПоОбъекту(Сотр, ДтНач, ДтОконч);
Пока ЖР.ПолучитьЗапись() = 1 Цикл
   Если ЖР.ВидРасч.ВытесняетВидРасчета(ВР) = 0 Тогда
      // если нашли вид расчета, который мы не сможем вытеснить
      Сообщить("Невозможно корректное проведение документа");
      СтатусВозврата(0);
      Возврат;
   КонецЕсли;
КонецЦикла;

Определить, вытесняется ли текущий вид расчёта указанным видом расчёта, позволяет метод ВытесняетсяВидомРасчета() (англоязычный синоним — DisplaceByCalc()). Возвращаемым значением метода является число 1, если вид расчёта, метод которого вызывается, вытесняется видом расчёта, заданным в качестве параметра. В противном случае метод возвращает 0.

Синтаксис метода:

ВытесняетсяВидомРасчета(<ВидРасчета>)

где <ВидРасчета> — вид расчёта, для которого проверяется, вытесняет ли он текущий вид расчёта.

Пример использования:

Если ЖР.ВидРасч.ВытесняетсяВидомРасчета(ВР) = 1 Тогда
    . . .
КонецЕсли;

Методы групп видов расчёта

Определить, содержит ли текущая группа указанный вид расчёта, позволяет метод СодержитВидРасчета() (англоязычный синоним — ContainCalculationKind()). Возвращаемым значением метода является число 1, если вид расчёта входит в текущую группу видов расчёта, или 0, если вид расчёта не входит в группу.

Синтаксис метода:

СодержитВидРасчета(<ВидРасчета>)

где <ВидРасчета> — вид расчета, входимость которого проверяется.

Пример:

Входит = ГруппаРасчетов.ОблНалогом.СодержитВидРасчета(ЖР.ВидРасч);

Определить количество видов расчётов, включённых в данную группу, позволяет метод Количество() (англоязычный синоним — Count()). Параметры у этого метода отсутствуют, а возвращаемым значением является целое число — количество видов расчета, входящих в группу. Метод обычно применяется в цикле с методом ПолучитьРасчет().

Пример:

// Модуль выполняется в контексте журнала расчетов
// Сотр - текущий сотрудник
// Для всех видов удержаний проведем расчет
// в журнале расчетов зарплаты
ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ВсеУд = ГруппаРасчетов.ВсеУдержания;
Счетчик = 1;
Пока Счетчик <= ВсеУд.Количество() Цикл
   ЖР.ВвестиРасчет(Сотр, ВсеУд.ПолучитьРасчет(Счетчик));
   Счетчик = Счетчик + 1;
КонецЦикла;

Получить ссылку на вид расчёта, входящий в данную группу под определённым (порядковым) номером, позволяет метод ПолучитьРасчет() (англоязычный синоним — GetCalculation()). Обычно этот метод применяется в цикле с методом Количество().

Синтаксис метода:

ПолучитьРасчет(<Номер>)

где <Номер> — номер вида расчёта в списке видов расчёта данной группы.

Пример:

// Модуль выполняется в контексте журнала расчетов
// Сотр - текущий сотрудник
// Для всех видов удержаний проведем расчет
// в журнале расчетов зарплаты
ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ВсеУд = ГруппаРасчетов.ВсеУдержания;
Счетчик = 1;
Пока Счетчик <= ВсеУд.Количество() Цикл
   ЖР.ВвестиРасчет(Сотр, ВсеУд.ПолучитьРасчет(Счетчик));
   Счетчик = Счетчик + 1;
КонецЦикла;

Другие статьи по схожей тематике