Основная страница

 

Глава 25
Работа с Календарями и Праздниками


 

Объект Календарь в системе 1С:Предприятие предназначен для вычисления временных интервалов на основании произвольных временных графиков. Этот объект может использоваться, например, для учета графика работы предпри­ятия, графика работы внешних организаций, графика учета рабочего времени тех или иных работников предприятия и пр.

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

В глобальном контексте программы 1С:Предприятие есть атрибут "Календари". Этот объект в качестве своих атрибутов имеет значения объек­тов конкретных видов календарей, заданных в конфигурации. Кроме того, этот объект имеет метод ПолучитьАтрибут, который позволяет получить доступ к объекту календаря конкретного вида по его имени. Т.е. допустимы следующие синтаксические конструкции:

Календари.Служащие.Дней(ТекДата, ТекДата + 5);

Календари.ПолучитьАтрибут("Служащие").Дней(ТекДата, ТекДата + 5);

Праздники в системе 1С:Предприятие представляет собой объект похожий на календарь, но он заполняется выборочно (не все даты подряд) и в нем могут вводиться и удаляться строки для определенных дат. Данный объект исполь­зуются как набор исключений при заполнении календарей (см. метод календа­ря УчитыватьПраздники).

Контекст работы с календарями

Доступ к атрибутам и методам календарей осуществляется, например, через объект, созданный системной функцией СоздатьОбъект с ключевым словом

"Календарь".

Англоязычный синоним ключевого слова "Календарь" — "Calendar".

Пример:

// Рассчитать продолжительность месяца в часах по календарю "Служащие"

Календ = СоздатьОбъект("Календарь.Служащие");

Час = Календ.Часов('01.01.96', '31.01.96');

// Рассчитать продолжительность текущего расчетного

// периода журнала расчетов Зарплата по календарю Служащие

Календ = СоздатьОбъект("Календарь.Служащие");

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

Час = Календ.Часов(ЖР.НачалоТекущегоПериода(), ЖР.КонецТекущегоПериода());

Кроме того, объекты типа «календарь» являются сохраняемыми, т. е. рекви­зиты справочников, документов, журналов расчета могут иметь тип «кален­дарь» и хранить ссылки на объекты этого типа.

Пример:

Процедура ПровестиРасчет()

   // ВнСовместитель — реквизит журнала расчетов

   // Категории — периодический реквизит справочника ВнутренниеСовместители

   // Календарь — реквизит справочника Категории

   Календ = ВнСовместитель.Категория.Получить(ДатаОкончания).Календарь;

   // размер оклада

   Оклад = ВнСовместитель.Оклад.Получить(ДатаОкончания) *

                       ВнСовместитель.Ставка.Получить(ДатаОкончания);

   Дней = Календ.Дней(ДатаНачала, ДатаОкончания);

   ВсегоДней = Календ.Дней(НачалоПериодаПоДате(ДатаНачала),

                           КонецПериодаПоДате(ДатаНачала));

   Если ВсегоДней > 0 Тогда

      Если Документ.Вид() = "НачалоМесяца" Тогда

         Результат = Окр(Оклад * Дней / ВсегоДней);

      Иначе

         Результат = -Окр(Оклад*Дней/ВсегоДней);

      КонецЕсли;

   Иначе

      Результат = 0;

      Сообщить("Неправильно указан календарь (" + Объект.Наименование + ")");

      Сообщить("Возможно, не задана категория работника");

   КонецЕсли;

КонецПроцедуры

Контекст работы с праздниками

Доступ к атрибутам и методам праздников осуществляется через объект, создаваемый системной функцией СоздатьОбъект с ключевым словом "Праздники".

Англоязычный синоним ключевого слова "Праздники" — "Holidays".

Атрибуты и методы объекта Календари

<ИмяКалендаря>

Установить значение календаря конкретного вида.

Синтаксис:

<ИмяКалендаря>

Описание:

Атрибут <ИмяКалендаря> задает значение календаря конкретного вида. В тексте программного модуля используется название конкретного вида календа­ря, как он назван в конфигураторе.

Пример:

Календари.Служащие.Дней(ТекДата, ТекДата + 5);

ПолучитьАтрибут

Получить значение объекта конкретного вида календаря по иденти­фикатору.

Синтаксис:

ПолучитьАтрибут(<ИмяАтрибута>)

Англоязычный синоним:

GetAttrib

Параметры:

<ИмяАтрибута>

Строковое выражение, содержащее имя конкрет­ного вида календаря, как оно задано в конфигура­торе.

Возвращаемое значение:

Значение атрибута <ИмяАтрибута >.

Описание:

Метод ПолучитьАтрибут позволяет получить значение объекта конкретно­го вида календаря по идентификатору, как оно задано в метаданных.

Пример:

Календари.ПолучитьАтрибут("Служащие").Дней(ТекДата, ТекДата - 5);

Атрибуты календарей и праздников

Дата

Дата текущей строки календаря/праздника.

Синтаксис:

Дата

Англоязычный синоним:

Date

Описание:

Атрибут Дата (только для чтения) содержит дату текущей (на которой по­зиционирована выборка) строки календаря/праздника.

Значение

Значение текущей строки календаря/праздника

Синтаксис:

Значение

Англоязычный синоним:

Value

Описание:

Атрибут Значение (доступно чтание и запись) содержит значение текущей (на которой позиционирована выборка) строки календаря/праздника — число с двумя знаками после запятой.

Общие методы календарей и праздников

ПолучитьАтрибут

Получить значение атрибута по идентификатору.

Синтаксис:

ПолучитьАтрибут(<ИмяАтрибута>}

Англоязычный синоним:

GetAttrib

Параметры:

<ИмяАтрибута>

Строковое выражение, содержащее имя атрибута, как оно задано в конфигураторе.

Возвращаемое значение:

Значение атрибута <ИмяАтрибута >.

Описание:

Метод ПолучитьАтрибут позволяет получить значение атрибута по иден­тификатору, как оно задано в метаданных. Доступные имена атрибутов — "Дата" и "Значение".

Пример:

// Календарь служащих

Календ = СоздатьОбъект("Календарь.Служащие");

Календ.ВыбратьДаты(ДатаНачала, ДатаОкончания);

Пока Календ.СледующаяДата() = 1 Цикл

   Сообщить("" + Календ.ПолучитьАтрибут("Дата") + "; ");

   // ...

КонецЦикла;

УстановитьАтрибут

Установить значение атрибута по имени идентификатора.

Синтаксис:

УстановитьАтрибут(<ИмяРеквизита>, <Значение>)

Англоязычный синоним:

SetAttrib

Параметры:

<ИмяРеквизита>

Строковое выражение, содержащее имя атрибута, как оно задано в конфигураторе.

<Значение>

Выражение, содержащее устанавливаемое значе­ние атрибута.

Описание:

Метод УстановитьАтрибут позволяет установить значение атрибута по имени идентификатора, как оно задано в конфигураторе. Доступные имена ат­рибутов — "Дата" и "Значение".

Пример:

// Календарь служащих

Календ = СоздатьОбъект("Календарь.Служащие");

Календ.ВыбратьДаты(ДатаНачала, ДатаОкончания);

Пока Календ.СледующаяДата() = 1 Цикл

   Календ.УстановитьАтрибут("Значение", 1);

   // ...

КонецЦикла;

Методы календарей

Выбран

Возвращает признак того, выбран конкретный календарь или нет.

Синтаксис:

Выбран()

Англоязычный синоним:

Selected

Возвращаемое значение:

Число: 1, если конкретный календарь выбран; 0 в противном случае.

Описание:

Этот метод предназначен для определения, не является ли «пустым» значе­ние переменной или реквизита типа «Календарь».

Календарь в рамках описываемого встроенного языка — сохраняемый агре­гатный тип данных, т. е. объекты этого типа могут сохраняться в информацион-йой базе. Например, реквизиты справочника, документа или журнала расчетов, Могут иметь тип «Календарь» и, следовательно, хранить ссылки на конкретные календари. При этом часто необходимо иметь возможность определить выбрано ли конкретное значение для реквизита (например, справочника или документа) этого типа.

Пример:

// реквизит справочника Календ имеет тип "Календарь"

Спр = СоздатьОбъект("Справочник.Категории");

Спр.ВыбратьЭлементы();

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

   Если Спр.Календ.Выбран() = 0 Тогда

      Сообщить("Не указан конкретный календарь! ");

   КонецЕсли;

КонецЦикла;

ВыбратьДаты

Открывает выборку записей календаря.

Синтаксис:

ВыбратьДаты(<ДатаНачала>, <ДатаОкончания>)

Англоязычный синоним:

SelectDates

Параметры:

<ДатаНачала>

Дата начала периода выборки.

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

Дата окончания периода выборки.

Возвращаемое значение:

Число: 1 — выборка открыта и в ней есть хоть одна запись; 0 — не обнаруже­но записей.

Описание:

Метод ВыбратьДаты открывает выборку записей календаря. Выбираются все элементы с даты начала по дату окончания включительно.

Пример:

// Календарь служащих

Календ = СоздатьОбъект("Календарь.Служащие");

Календ.ВыбратьДаты(ДатаНачала, ДатаОкончания);

Пока Календ.СледующаяДата() = 1 Цикл

   // ...

КонецЦикла;

См. также: СледующаяДата

СледующаяДата

Выбирает следующий день календаря в выборке.

Синтаксис:

СледующаяДата()

Англоязычный синоним:

NextDate

Возвращаемое значение:

Число: 1 — получена очередна язапись; 0 — не обнаружено очередной записи, т. е. конец выборки.

Описание:

Выбирает следующий день календаря (позиционируется на очередной запи­си выборки) в порядге дат.

Пример:

// Календарь служащих

Календ = СоздатьОбъект("Календарь.Служащие");

Календ.ВыбратьДаты(ДатаНачала, ДатаОкончания);

Пока Календ.СледующаяДата() = 1 Цикл

   //. . .

КонецЦикла;

См. также: ВыбратьДаты

Дней

Получить количество «ненулевых» дней за период.

Синтаксис:

Дней(<ДатаНачала>, <ДатаОкончания>)

Англоязычный синоним:

Days

Параметры:

<ДатаНачала>

Дата начала периода, в котором определяется ко­личество дней.

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

Дата окончания периода, в котором определяется количество дней.

Возвращаемое значение:

Целое положительное число — количество дней.

Описание:

Метод предназначен для определения количества календарных дней, кото­рым соответствует ненулевое числовое значение. <ДатаНачала> и <ДатаОкончания> включаются в рассматриваемый период. Следовательно, если даты начала и окончания совпадают, метод возвратит ноль или единицу в зависимости от значения числа, соответствующего заданной дате. Если <ДaтaHaчaлa> больше, чем <ДатаОкончания>, будет выведено сообщение об ошибке.

Пример:

// Расчет оплаты по окладу

// Календарь служащих

Календ = СоздатьОбъект("Календарь.Служащие");

// отработал...

Дни = Календ.Дней(ДатаНачала, ДатаОкончания);

// должен был бы работать...

Норма = Календ.Дней(НачалоПериодаПоДате(ДатаНачала),

                    КонецПериодаПоДате(ДатаНачала));

// получим оклад сотрудника на дату начала

// действия данного расчета

Оклад = Объект.Оклад.Получить(ДатаНачала);

// результат

Результат = Дни * Оклад / Норма;

См. также: Часов

Часов

Получить сумму числовых значений дней за определенный период.

Синтаксис:

Часов(<ДатаНачала>, <ДатаОкончания>)

Англоязычный синоним:

Hours

Параметры:

<ДатаНачала>

Дата начала периода, в котором определяется сум­ма числовых значений, интерпретируемая как ко­личество часов.

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

Дата окончания периода, в котором определяется сумма числовых значений, интерпретируемая как количество часов.

Возвращаемое значение:

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

Описание:

Метод предназначен для суммирования числовых значений по календарю за промежуток времени с даты начала по дату окончания. Метод удобен при ин­терпретации числовых значений календаря как продолжительности рабочих дней в часах (что отражается в названии метода). <ДатаНачала> и <ДатаОкончания> включаются в рассматриваемый период. Если <ДатаНачала> больше, чем <ДатаОкончания>, будет выведено сообщение об ошибке.

Пример:

// Расчет оплаты по часовому тарифу

// Календарь рабочих

Календ = СоздатьОбъект("Календарь.Рабочие");

// отработал...

Чс = Календ.Часов(ДатаНачала, ДатаОкончания);

// должен был бы работать...

Норма = Календ.Часов(НачалоПериодаПоДате(ДатаНачала),

                     КонецПериодаПоДате(ДатаНачала));

// получим тариф сотрудника на дату начала действия данного расчета

Тариф = Объект.Тариф.Получить(ДатаНачала);

// результат

Результат = Чс * Тариф / Норма;

См. также: Дней

Автозаполнение

Выполняет автозаполнение календаря в заданном периоде.

Синтаксис:

Автозаполнение(<ДатаНачала>, <ДатаОкончания>)

Англоязычный синоним:

Autolayout

Параметры:

<ДатаНачала>

Дата начала периода автозаполнения.

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

Дата окончания периода автозаполнения.

Возвращаемое значение:

Число: 1 — получилось; 0 — не получилось.

Описание:

Метод Автозаполнение выполняет автозаполнение календаря в заданном периоде. При этом старые данные (в т.ч. «ручные» исправления) в указанном периоде пропадают.

Пример:

// Календарь служащих

Календ = СоздатьОбъект("Календарь.Служащие");

Календ.УчитыватьПраздники(1);

Результат = Календ.Автозаполнение(ДатаНачала, ДатаОкончания);

См. также: УчитыватьПраздники

УчитыватьПраздники

Установка флага учета праздников при автозаполнении.

Синтаксис:

УчитыватьПраздники(<Флаг>)

Англоязычный синоним:

UseHolidays

Параметры:

<Флаг>

Необязательный параметр. Число: 1 — учитываются праздники при автозаполнении; 0 — не учитывают­ся праздники при автозаполнении.

Возвращаемое значение:

Возвращает текущую установку. Число: 1 — учитываются праздники при ав­тозаполнении; 0 — не учитываются праздники при автозаполнении.

Описание:

Метод УчитыватьПраздники выполняет установку флага учета праздни­ков при автозаполнении.

Пример:

// Календарь служащих

Календ = СоздатьОбъект("Календарь.Служащие");

Календ.УчитыватьПраздники(1);

Результат = Календ.Автозаполнение(ДатаНачала, ДатаОкончания);

См. также: Автозаполнение

ПолучитьДату

Получить дату календаря.

Синтаксис:

ПолучитьДату(<ДатаНачала>, <Количество>)

Англоязычный синоним:

GetDate

Параметры:

<ДатаНачала>

Дата начала периода, от которой будут отсчиты­ваться дни.

<Количество>

Количество дней, отсчитываемых от <ДатаНачала>.

Возвращаемое значение:

Значение типа «дата».

Описание:

Метод предназначен для определения даты, отстоящей от заданной даты на известное количество дней. В отличие от простого прибавления числа к дате, результатом которого является дата, смещенная на заданное количество дней, данный метод календаря производит определение итоговой даты, пропуская дни календаря, для которых задано нулевое значение. Это значит, например, что если в конфигурации присутствует календарь, представляющий собой гра­фик работы предприятия, то данный метод позволит легко определить дату, отстоящую от заданной на определенное количество «рабочих» дней (т. е. дней, для которых задано ненулевое числовое значение).

Пример:

Процедура ПровестиДокумент()

   Если Число(Окончание) = 0 Тогда

      // календарь

      Календ = Сотрудник.Категория.Получить(Начало).Календарь;

      // при расчете отпуска, запишем дату его окончания

      Календ = СоздатъОбъект("Календарь.Отпуск");

      Окончание = Календ.ПолучитьДату(Начало, КоличДней);

   КонецЕсли;

   Если Расчет <> ВидРасчета.ОтпускПоУходуЗаРебенком Тогда

      Если Окончание > ЖрнЗарплата.КонецТекущегоПериода() Тогда

         РасчетВперед(ГруппаРасчетов.ПересчДляОтпуска, Сотрудник,

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

      КонецЕсли;

      ЖрнЗарплата.ВвестиРасчет(Сотрудник, Расчет, Начало, Окончание, 0);

   Иначе

      ЖрнЗарплата. ВвестиРасчет (Сотрудник, Расчет,

             Максимум(Начало, ЖрнЗарплата.НачалоТекущегоПериода()),

                  Минимум(Окончание, ЖрнЗарплата.КонецТекущегоПериода()), 0);

      Зарегистрировать(Контекст, ТекущийДокумент());

   КонецЕсли;

КонецПроцедуры

Методы праздников

Новый

Ввести новый «праздничный» день.

Синтаксис:

Новый(<Дата>, <Значение>)

Англоязычный синоним:

New

Параметры:

<Дата>

Дата нового праздника.

<Значение>

Положительное число с двумя знаками после запя­той (не более 100). Поскольку объект «Праздни­ки», как правило, используется для ввода выход­ных праздничных дней по календарям, то значе­ние, как правило, задают равным нулю.

Описание:

Метод Новый вводит и записывает новую запись (новый «праздничный» день).

Пример:

// Праздничные дни

Празд = СоздатьОбъект("Праздники");

Празд.Новый('01.05.99', 0)

Удалить

Удаляет «праздничный» день.

Синтаксис:

Удалить(<Дата>)

Англоязычный синоним:

Delete

Параметры:

<Дaтa>

Дата удаляемой строки (праздника).

Описание:

Метод Удалить позволяет удалить существующую запись («праздничный» день). Если строка с такой датой не найдена, то метод ничего не делает. Воз­вращаемого значения нет.

Пример:

// Праздничные дни

Празд = СоздатьОбъект("Праздники");

Празд.Удалить('01.05.99');

ВыбратьДаты

Открывает выборку записей праздников.

Синтаксис:

ВыбратьДаты(<ДатаНачала>, <ДатаОкончания>)

Англоязычный синоним:

SelectDates

Параметры:

<ДатаНачала>

Дата начала периода выборки.

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

Дата окончания периода выборки.

Возвращаемое значение:

Число: 1 — выборка открыта и в ней есть хоть одна запись; 0 — не обнаруже­но записей.

Описание:

Метод ВыбратьДаты открывает выборку записей праздников. Выбираются все элементы с даты начала по дату окончания включительно.

Пример:

// Праздничные дни

Празд = СоздатьОбъект("Праздники");

Празд.ВыбратьДаты(ДатаНачала, ДатаОкончания);

Пока Празд.СледующаяДата() = 1 Цикл

   // ...

КонецЦикла;

См. также: СледующаяДата

СледующаяДата

Выбирает следующий день праздников в выборке.

Синтаксис:

СледующаяДата()

Англоязычный синоним:

NextDate

Возвращаемое значение:

Число: 1 — получена очередна язапись; 0 — не обнаружено очередной записи, т. е. конец выборки.

Описание:

Выбирает следующий день праздников (позиционируется на очередной за­писи выборки) в порядке дат.

Пример:

// Праздничные дни

Празд = СоздатьОбъект("Праздники");

Празд.ВыбратьДаты(ДатаНачала, ДатаОкончания);

Пока Празд.СледующаяДата() = 1 Цикл

   // ...

КонецЦикла;

См. также: ВыбратьДаты






Перейти  к оглавлению: Описание встроенного языка