Разработка и Конфигурация · 11 мин
Как сделать календарь в 1С: от производственного календаря до поля на форме
Как создать календарь в 1С: производственный календарь, графики работы, поле календаря на форме и программная работа с датами. Пошаговая инструкция.
Под «календарём в 1С» обычно понимают три разные задачи: заполнение производственного календаря предприятия, настройку графиков работы сотрудников и вывод элемента «календарь» на форму для выбора даты. Каждая задача решается своими инструментами, и путаница между ними — главная причина ошибок: например, пользователь правит производственный календарь, а расчёт отпускных не меняется, потому что документ опирается на график работы, а не на общий календарь.
В типовых конфигурациях (1С:ЗУП, 1С:Бухгалтерия, 1С:ERP) производственный календарь уже предзаполнен по данным официального календаря РФ и обновляется вместе с конфигурацией. В самописных решениях его придётся создать и заполнить вручную. Поле выбора даты на форме вообще не требует программирования — это стандартный элемент управления платформы.
Ниже разобраны все три сценария: от простого вывода календаря на форму до программного расчёта рабочих дней. Материал ориентирован на платформу 1С:Предприятие 8.3 и типовые конфигурации на управляемых формах.
Определите, какой именно календарь вам нужен
Прежде чем что-то настраивать, важно понять, какой объект решает вашу задачу. В 1С существует несколько связанных, но разных сущностей:
- Производственный календарь — справочник, где отмечены рабочие, предпраздничные, выходные и праздничные дни. Служит основой для графиков.
- График работы сотрудников — описывает, как конкретный работник или подразделение трудится: пятидневка, сменный график 2/2, суммированный учёт и т.д.
- Поле «Календарь» на форме — элемент интерфейса для визуального выбора даты пользователем.
- Регистр «Данные графика» — рассчитанные часы и дни по графику, к которым обращаются расчёты зарплаты и отпусков.
Как выбрать действие
Проверка и заполнение производственного календаря
В типовых конфигурациях производственный календарь находится в разделе настроек. В 1С:ЗУП путь такой: «Настройка» → «Производственные календари». В 1С:Бухгалтерии: «Главное» → «Настройки» → «Производственные календари» (в некоторых релизах — через «Администрирование»). Откройте календарь «Российская Федерация» (или календарь вашего региона/предприятия) и убедитесь, что текущий и следующий годы заполнены.
Если конфигурация обновляется регулярно, календарь заполняется автоматически вместе с обновлением — на основе постановления о переносе выходных дней. Если обновления давно не было, год может оказаться незаполненным. В этом случае нажмите кнопку «Заполнить по умолчанию» — программа проставит стандартную пятидневку с субботой и воскресеньем как выходными, а праздничные дни придётся отметить вручную.
Ручная корректировка делается так: выделите день или несколько дней, нажмите «Изменить день» и выберите вид дня — рабочий, выходной, праздничный, предпраздничный (сокращённый). Для переноса выходного сначала объявите исходный день рабочим, затем целевой — выходным. После любых изменений обязательно перезаполните зависимые графики работы: они не пересчитываются автоматически.
Создание графика работы сотрудников
График работы — это объект, который реально используется в расчётах. В 1С:ЗУП перейдите: «Настройка» → «Графики работы сотрудников» → «Создать». Укажите наименование (например, «Пятидневка 40 часов» или «Сменный 2/2»), год и производственный календарь, на основе которого строится график.
Дальше настройте шаблон заполнения. Для пятидневки достаточно указать дни недели и часы: понедельник–пятница по 8 часов, суббота и воскресенье — выходные. Для сменного графика задайте цикл: например, 2 рабочих дня по 11 часов, 2 выходных. Программа размножит цикл на весь год, учитывая праздники из производственного календаря, если включён соответствующий флаг.
После сохранения нажмите «Заполнить» и проверьте итоговую таблицу: количество рабочих дней и часов за год должно совпадать с нормой по производственному календарю. Затем привяжите график к сотрудникам — через кадровые документы (приём на работу, кадровый перевод) или через документ «График работы сотрудников», если график меняется на период.
Как проверить результат
Совпадает с нормой производственного календаря (для полной ставки)
Расхождение в часы или дни — шаблон заполнен неверно
Сокращены на 1 час
Обычная длительность — не учтён признак предпраздничного дня
Праздничные дни не попали в рабочее время
Праздники посчитаны рабочими — календарь не заполнен или не перезаполнен график
Вывод календаря на форму для выбора даты
Если задача — дать пользователю выбирать дату на самописной форме (внешняя обработка, документ, отчёт), программировать ничего не нужно. Создайте реквизит формы или объекта с типом «Дата» и перетащите его на форму в дереве элементов. Платформа автоматически покажет поле ввода с кнопкой выбора, по которой открывается выпадающий календарь.
Для более наглядного отображения используйте элемент формы «Поле календаря» — он показывает месяц целиком прямо на форме. Добавьте элемент, свяжите его с реквизитом типа «Дата» через свойство «ПутьКДанным». При выборе дня значение запишется в реквизит, и его можно использовать в коде.
Пример обработки выбора даты в модуле формы:
&НаКлиенте
Процедура ДатаНачалаПриИзменении(Элемент)
Если ДатаНачала > ДатаОкончания Тогда
ДатаОкончания = ДатаНачала;
КонецЕсли;
КонецПроцедуры
Если нужен не просто выбор даты, а планировщик с событиями (встречи, задачи, бронирования), используйте элемент «Планировщик» — он позволяет отображать интервалы времени, перетаскивать их мышью и хранить события в реквизите соответствующего типа. Это штатный инструмент для календарей задач и журналов записи.
Программная работа с календарём и датами
Во встроенном языке 1С дата — примитивный тип, и базовые операции делаются арифметикой: добавление секунд, дней (через умножение на 86400), функции НачалоДня(), КонецМесяца(), ДобавитьМесяц(). Например, получить первый день следующего месяца: НачалоМесяца(ДобавитьМесяц(ТекущаяДата(), 1)).
Сложнее обстоит дело с расчётом рабочих дней — встроенной функции «прибавить N рабочих дней» в платформе нет. В типовых конфигурациях есть готовые механизмы: в ЗУП и ERP используется функциональность календарных графиков (общий модуль «КалендарныеГрафики» в библиотеке стандартных подсистем), которая умеет считать разницу в рабочих днях по заданному графику.
В самописной конфигурации типичный подход такой: создать регистр сведений «ДанныеПроизводственногоКалендаря» с измерением «Дата» и ресурсом «ВидДня», заполнить его и далее считать рабочие дни запросом. Пример запроса для подсчёта рабочих дней в периоде:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(Календарь.Дата) КАК РабочихДней
|ИЗ
| РегистрСведений.ДанныеПроизводственногоКалендаря КАК Календарь
|ГДЕ
| Календарь.Дата МЕЖДУ &Начало И &Конец
| И Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейКалендаря.Рабочий)";
Не храните виды дней строками («рабочий», «выходной») — используйте перечисление. Это ускоряет запросы, исключает опечатки в значениях и упрощает доработку: добавление нового вида дня не ломает существующие данные.
Частые ошибки и ограничения
Самая распространённая ошибка — правка производственного календаря вместо графика работы. Если у сотрудника индивидуальный режим (например, работа по субботам), менять нужно его график, а не общий календарь предприятия, иначе изменения коснутся всех расчётов компании.
Вторая типичная проблема — забытое перезаполнение графиков после обновления календаря. Симптом: в табеле за январь праздничные дни стоят рабочими, расчётчик видит переработки, которых не было. Лечение: открыть график, нажать «Заполнить» заново и пересчитать зависимые документы.
Третья ошибка разработчиков — расчёт рабочих дней «в лоб» через проверку дня недели (ДеньНедели(Дата) <= 5). Такой код не учитывает праздники и переносы, поэтому даёт неверный результат минимум несколько раз в год. Всегда опирайтесь на данные календаря, а не на день недели.
FAQ
Календарь за следующий год пуст. Что делать?
Откройте производственный календарь и нажмите «Заполнить по умолчанию» — будет создана стандартная пятидневка. Затем вручную отметьте праздничные и перенесённые дни по официальному постановлению. Если конфигурация обновляется, проще установить свежее обновление — календарь заполнится автоматически. После заполнения перезаполните все графики работы.
Как сделать график «сутки через трое»?
Создайте новый график работы, в шаблоне заполнения задайте цикл из четырёх дней: один рабочий день с нужным количеством часов и три выходных. Программа размножит цикл на весь год. Учтите, что для таких режимов обычно применяется суммированный учёт рабочего времени — настройте его в параметрах графика.
Почему после изменения календаря зарплата не пересчиталась?
Графики работы и рассчитанные документы не обновляются автоматически. Сначала перезаполните графики (открыть график → «Заполнить»), затем перепроведите документы расчёта за затронутый период. Если период закрыт и выплаты произведены, изменения делают только после анализа последствий и с резервной копией.
Можно ли вывести календарь на форму без конфигуратора?
Нет. Добавление элементов на форму самописного объекта делается только в конфигураторе. Однако в типовых конфигурациях многие формы уже содержат выбор даты, а механизм «Изменить форму» позволяет вывести на форму существующие реквизиты без доработки конфигурации.
Как в запросе прибавить к дате несколько рабочих дней?
Прямой функции нет. Правильный путь — выбрать из регистра календаря рабочие дни, следующие за исходной датой, упорядочить по дате и взять N-ю строку (через ПЕРВЫЕ с упорядочиванием). В типовых конфигурациях с БСП используйте готовые функции общего модуля «КалендарныеГрафики», которые решают эту задачу.
Чем отличается производственный календарь от графика работы?
Календарь описывает только виды дней (рабочий, выходной, праздничный) для всей страны или предприятия. График строится на его основе и добавляет часы работы, смены и циклы конкретных сотрудников. В расчётах зарплаты и отпусков используется именно график, а календарь — лишь основа для его заполнения.
Что важно запомнить
Производственный календарь задаёт виды дней, график работы — часы и режим конкретных сотрудников, а поле выбора даты на форме создаётся без кода. После любых правок календаря перезаполняйте графики, а расчёт рабочих дней в коде ведите только по данным календаря, а не по дню недели.