При работе с конфигурацией 1С:Зарплата и управление персоналом (ЗУП) редакции 3.1, особенно при необходимости доработки вывода информации по отпускам, многие разработчики сталкиваются с вопросом о механизме заполнения регистра сведений Заработанные права на отпуска. Давайте вместе разберем, как устроен этот регистр, где находится логика его заполнения, и какие подходы к корректировке данных являются наиболее правильными.
Прежде всего, давайте уясним, что Регистр сведений "Заработанные права на отпуска" в ЗУП 3.1 является техническим регистром. Это означает, что он предназначен для хранения временных или расчетных данных и заполняется динамически в момент необходимости, а не является постоянным хранилищем, которое обновляется документами в реальном времени. Мы можем заметить, что этот регистр фактически заполняется при формировании отчета Остатки отпусков. Это может показаться необычным, так как отчет традиционно воспринимается как результат, а не как механизм для формирования данных, но в данном случае такая логика обусловлена необходимостью расчета остатков на произвольную дату.
В регистре фиксируются такие ключевые данные, как:
Эти показатели позволяют нам отслеживать помесячное накопление дней отпуска сотрудником.
Итак, мы выяснили, что регистр заполняется при формировании отчета. Чтобы добраться до самого кода, который осуществляет это заполнение, нам потребуется заглянуть в общие модули конфигурации. Мы можем сфокусироваться на Общем модуле "ОстаткиОтпусков". Именно там сосредоточены основные процедуры и функции для работы с расчетами по отпускам.
В этом модуле мы обнаружим следующие ключевые процедуры и функции, отвечающие за сбор и обработку данных:
СоздатьВТИсходныхДанныхДляРасчетаОстатков: Эта процедура занимается сбором исходных данных, необходимых для расчета остатков отпусков. Она агрегирует сведения, которые затем будут использованы для заполнения регистра. Мы можем внимательно изучить ее, чтобы понять, откуда берутся первичные данные.ИсходныеДанныеДляРасчетаОстатков: Данная функция, вероятно, формирует структуру или таблицу значений с уже подготовленными исходными данными, которые будут переданы для дальнейших расчетов.ЗаработанныеОтпуска: Именно эта функция (или процедура) отвечает за непосредственное заполнение регистра Заработанные права на отпуска на основе подготовленных исходных данных. Это то самое место, куда нам нужно будет смотреть, если мы хотим понять логику начисления и, возможно, внести корректировки в алгоритм, хотя к таким действиям следует подходить с особой осторожностью.Почему регистр заполняется динамически, а не постоянно? Причина кроется в том, что заранее неизвестна дата, на которую пользователю потребуется получить остатки отпусков. Если бы данные формировались и хранились постоянно, это привело бы к колоссальному объему записей, которые в большинстве случаев не были бы востребованы. Динамическое заполнение позволяет рассчитывать актуальные остатки "по запросу", учитывая все изменения до нужной даты.
Мы должны быть предельно осторожны с попытками прямой корректировки самого регистра Заработанные права на отпуска. Если мы внесем изменения напрямую в записи регистра, то при следующем же открытии расчета или формировании отчета эти данные, скорее всего, будут переобновлены стандартным алгоритмом. Регистр будет перезаполнен на основе исходных данных, и наши ручные правки будут утеряны.
Вместо того чтобы пытаться изменить сам регистр, мы можем обратить свое внимание на исходные данные, по которым этот регистр обновляется. Корректировка именно этих первичных источников обеспечит долговременный и корректный результат.
Права на отпуск и их расчет зависят от множества факторов, регистрируемых в различных документах и регистрах системы. Рассмотрим основные из них, которые прямо или косвенно влияют на заполнение регистра Заработанные права на отпуска:
Ключевые документы, которые регистрируют право сотрудника на отпуск, включают:
Прием на работу: При оформлении сотрудника в этом документе мы указываем виды отпусков, которые ему положены, и их продолжительность (количество дней).Кадровый перевод: Если сотрудник переводится на другую должность или в другое подразделение, и при этом меняются условия предоставления отпусков (например, добавляется дополнительный отпуск), эти изменения фиксируются в Кадровом переводе. Крайне важно проверять, чтобы при кадровом переводе не были случайно "закрыты" или удалены права на отпуск, как это произошло в одном из описанных случаев, когда в штатной единице не был указан положенный отпуск.Начальная штатная расстановка (раздел "Главное – Данные на начало эксплуатации"): Этот документ используется для внесения исторических данных при начале работы с программой ЗУП 3.1. Он позволяет задать начальные условия для расчета прав на отпуска.Ввод остатков отпусков (раздел "Главное – Остатки отпусков"): Это специальный документ, предназначенный для корректировки остатков отпусков на любую необходимую дату. Он позволяет вручную ввести остатки по видам отпусков в разрезе рабочих лет, а также указать дни отсутствия, которые влияют на сдвиг рабочего года.Корректировка остатков отпусков: Аналогично предыдущему, используется для целенаправленной корректировки существующих остатков.Эти документы определяют базовые условия, на основе которых система будет начислять заработанные права на отпуск.
Механизм расчета накопленных дней отпуска в ЗУП 3.1 привязан к дате начала рабочего года сотрудника. По умолчанию, за каждый отработанный месяц сотруднику начисляется 2,33 дня отпуска (при стандартной продолжительности отпуска 28 календарных дней). Право на полный отпуск возникает у сотрудника по истечении 11 полных месяцев работы в каждом рабочем году. При этом последний месяц в рабочем году не всегда требует отработки половины месяца; дни отпуска могут быть начислены сразу при достижении 11 месяцев.
Важно учитывать, что на накопление прав на отпуск и сдвиг рабочего года влияют периоды отсутствия сотрудника, не включаемые в стаж, дающий право на отпуск. Например, отпуск без сохранения заработной платы свыше 14 календарных дней в течение рабочего года сдвигает окончание рабочего года на соответствующее количество дней. Это может приводить к неравномерному начислению прав на отпуск. Для обеспечения ежемесячного равномерного начисления в релизе ЗУП 3.1.7.61 и более поздних версиях был введен новый алгоритм начисления заработанных отпусков, который учитывает эти нюансы.
Крайне важно понимать, что Регистр сведений "Заработанные права на отпуска" не содержит дат начала и окончания фактических отпусков сотрудника. Многие новички или те, кто сталкивается с системой впервые, пытаются получить эти данные из данного регистра, что является заблуждением. В этом регистре мы найдем только начало и окончание рабочего года, за который отпуск еще не был получен, и информацию о накопленных днях.
Если нам нужна информация о фактическом использовании отпусков (даты их начала и окончания), мы должны обращаться к другим источникам:
Отпуск: Именно в этом документе фиксируются фактические даты начала и окончания предоставленного отпуска (при большом штате удобно использовать массовое автоматическое оформление документов «Отпуск»).Остатки отпусков и Справка по отпускам сотрудника. Эти отчеты способны детализировать данные по рабочим годам и видам отпусков.Регистр накопления "Фактические отпуска" или "Предоставленные отпуска" могут содержать данные о уже использованных отпусках, что позволяет провести план-фактный анализ отпусков.Иногда мы сталкиваемся с ситуацией, когда регистр Заработанные права на отпуска заполняется неверно или не до нужной даты, что приводит к некорректным данным в отчетах. В таких случаях нам следует проанализировать следующие моменты:
Если данные в регистре заполняются не полностью или с ошибками, мы можем рассмотреть наличие и корректность следующих документов:
Ввод остатков отпусков: Убедимся, что все исторические остатки введены правильно на нужную дату.Корректировка остатков отпусков: Проверим, не были ли внесены корректировки, которые могли повлиять на расчет прав.Начальная штатная расстановка: Этот документ важен для начальных данных.Частой причиной некорректного расчета прав является неправильное оформление кадровых документов. Например, как было отмечено в одном из случаев, документом Кадровый перевод могли "закрыть" отпуска, если в штатной единице не было указано, что ей положен отпуск. При оформлении таких документов мы должны внимательно проверять параметры предоставления отпусков.
Проверим карточку сотрудника и все его кадровые документы (Прием на работу, Кадровый перевод) на предмет корректного указания видов отпусков и количества дней для них.
В некоторых случаях, если при начале работы с программой или в результате ошибки были введены некорректные права на отпуск (например, дублирующий вид отпуска), мы можем прибегнуть к непосредственному удалению ошибочных записей из регистра Заработанные права на отпуска. Это делается путем отбора по сотруднику и виду отпуска, и последующего удаления строк.
Однако, мы должны помнить о главном предупреждении: при повторном формировании отчета данные могут быть перезаполнены. Этот метод является "скорой помощью" и не устраняет корневую причину, если она кроется в исходных документах.
Если наша задача – немного доработать вывод информации по отпускам сотрудников, например, вывести "Дату начала отпуска" и "Дату окончания отпуска" на форму элемента сотрудника, нам следует придерживаться следующего подхода:
Как мы уже выяснили, прямой код, заполняющий этот регистр, является частью внутреннего механизма. Его изменение может привести к непредсказуемым последствиям при обновлениях и некорректному расчету в целом. Наша цель – получить информацию, а не изменить сам расчет.
Для получения "Даты начала отпуска" и "Даты окончания отпуска" нам следует обратиться к:
Отпуск: Мы можем выполнить запрос к этим документам, чтобы найти последние оформленные отпуска сотрудника.Остатки отпусков и Справка по отпускам сотрудника: Эти отчеты уже агрегируют нужную информацию. Мы можем изучить, какие регистры и таблицы они используют, чтобы построить свой запрос.Для вывода реквизитов на форму элемента сотрудника, мы можем написать свой код на стороне клиента или сервера, который будет выполнять запрос к соответствующим регистрам или документам. Например, чтобы получить данные о последних отпусках, мы можем сделать запрос к регистру накопления, где хранятся данные о предоставленных отпусках.
// Пример запроса для получения последнего отпуска сотрудника
// (псевдокод, требует адаптации под конкретные регистры ЗУП 3.1)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Отпуска.ДатаНачала,
| Отпуска.ДатаОкончания
|ИЗ
| РегистрНакопления.ОтпускаОрганизаций КАК Отпуска // Или другой регистр, содержащий фактические отпуска
|ГДЕ
| Отпуска.Сотрудник = &Сотрудник
|УПОРЯДОЧИТЬ ПО
| Отпуска.ДатаНачала УБЫВ
|ИТОГИ ПО
| Сотрудник";
Запрос.УстановитьПараметр("Сотрудник", Объект.Ссылка); // Объект.Ссылка - это ссылка на текущего сотрудника
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
// Присваиваем значения реквизитам формы
ЭтаФорма.Элементы.ПолеДатаНачалаОтпуска.Значение = Результат.ДатаНачала;
ЭтаФорма.Элементы.ПолеДатаОкончанияОтпуска.Значение = Результат.ДатаОкончания;
Иначе
// Отпуск не найден
ЭтаФорма.Элементы.ПолеДатаНачалаОтпуска.Значение = Неопределено;
ЭтаФорма.Элементы.ПолеДатаОкончанияОтпуска.Значение = Неопределено;
КонецЕсли;
Для получения информации о подразделениях (Департамент, Отдел, Подразделение), мы можем использовать справочник ПодразделенияОрганизаций или ШтатноеРасписание, учитывая установленную иерархию и актуальные данные о сотруднике (например, через регистр сведений СведенияОСотрудниках или документ Кадровый перевод на актуальную дату).
На форме элемента справочника Сотрудники мы можем создать дополнительные реквизиты и элементы формы для вывода этих данных. Их заполнение будет происходить при открытии формы, используя разработанный нами запрос.
Таким образом, мы видим, что хотя регистр Заработанные права на отпуска является ключевым для расчета, его прямое изменение не рекомендуется. Вместо этого, мы можем эффективно работать с системой, понимая источники данных и используя адекватные механизмы (запросы к документам и другим регистрам) для получения необходимой информации и ее вывода.