Календарь представляет собой объект, который устанавливает для каждой календарной даты некоторое числовое значение, которое может интерпретироваться при работе программы тем или иным образом. Например, в календаре, представляющем собой график работы организации или предприятия, каждому рабочему дню может соответствовать единица, а каждому выходному — ноль. В календаре учета рабочего времени сотрудников предприятия, каждой дате календаря может соответствовать число — продолжительность рабочего дня в часах и т. д.
В глобальном контексте программы 1С:Предприятие есть атрибут "Календари". Этот объект в качестве своих атрибутов имеет значения объектов конкретных видов календарей, заданных в конфигурации. Кроме того, этот объект имеет метод ПолучитьАтрибут, который позволяет получить доступ к объекту календаря конкретного вида по его имени. Т.е. допустимы следующие синтаксические конструкции:
Календари.Служащие.Дней(ТекДата, ТекДата + 5);
Календари.ПолучитьАтрибут("Служащие").Дней(ТекДата, ТекДата + 5);
Праздники в системе 1С:Предприятие представляет собой объект похожий на календарь, но он заполняется выборочно (не все даты подряд) и в нем могут вводиться и удаляться строки для определенных дат. Данный объект используются как набор исключений при заполнении календарей (см. метод календаря УчитыватьПраздники).
Контекст работы с календарями
Доступ к атрибутам и методам календарей осуществляется, например, через объект, созданный системной функцией СоздатьОбъект с ключевым словом
"Календарь".
Англоязычный синоним ключевого слова "Календарь" — "Calendar".
Пример:
// Рассчитать продолжительность месяца в часах по календарю "Служащие"
Календ = СоздатьОбъект("Календарь.Служащие");
Час = Календ.Часов('01.01.96', '31.01.96');
// Рассчитать продолжительность текущего расчетного
// периода журнала расчетов Зарплата по календарю Служащие
Календ = СоздатьОбъект("Календарь.Служащие");
ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
Час = Календ.Часов(ЖР.НачалоТекущегоПериода(), ЖР.КонецТекущегоПериода());
Кроме того, объекты типа «календарь» являются сохраняемыми, т. е. реквизиты справочников, документов, журналов расчета могут иметь тип «календарь» и хранить ссылки на объекты этого типа.
Пример:
Процедура ПровестиРасчет()
// ВнСовместитель — реквизит журнала расчетов
// Категории — периодический реквизит справочника ВнутренниеСовместители
// Календарь — реквизит справочника Категории
Календ = ВнСовместитель.Категория.Получить(ДатаОкончания).Календарь;
// размер оклада
Оклад = ВнСовместитель.Оклад.Получить(ДатаОкончания) *
ВнСовместитель.Ставка.Получить(ДатаОкончания);
Дней = Календ.Дней(ДатаНачала, ДатаОкончания);
ВсегоДней = Календ.Дней(НачалоПериодаПоДате(ДатаНачала),
КонецПериодаПоДате(ДатаНачала));
Если ВсегоДней > 0 Тогда
Если Документ.Вид() = "НачалоМесяца" Тогда
Результат = Окр(Оклад * Дней / ВсегоДней);
Иначе
Результат = -Окр(Оклад*Дней/ВсегоДней);
КонецЕсли;
Иначе
Результат = 0;
Сообщить("Неправильно указан календарь (" + Объект.Наименование + ")");
Сообщить("Возможно, не задана категория работника");
КонецЕсли;
КонецПроцедуры