Объект Календарь в системе 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 Цикл
// ...
КонецЦикла;
См. также: ВыбратьДаты