Мы сталкиваемся с распространенной проблемой в 1С ЗУП 3.1, когда система некорректно ведет учет права на дополнительный отпуск за вредность, а также разрядов и категорий сотрудников, после временных кадровых переводов. Давайте подробно разберем эту ситуацию, выясним причины возникновения ошибки и рассмотрим возможные решения, включая как временные обходные пути, так и глубокое техническое исправление.
Рассмотрим типовой сценарий, который приводит к ошибке. Представим сотрудника, принятого на работу 01.10.23, у которого есть право на отпуск за вредность. Далее происходят следующие события:
В этой ситуации мы обнаруживаем, что после возвращения на основное место работы, система 1С ЗУП 3.1 перестает учитывать право сотрудника на отпуск за вредность. Самое интересное, что если мы посмотрим в регистр сведений Положенные виды ежегодных отпусков, то увидим там корректную запись о праве на отпуск после окончания «большого» временного перевода. Однако, это право почему-то не подтягивается при расчете заработанных дней отпуска и даже в стандартных отчетах по отпускам система показывает, что права на вредный отпуск нет.
Аналогичная картина наблюдается и с другими периодическими данными, такими как разряды или категории сотрудников, которые также перестают корректно учитываться после подобных временных переводов. Даже регистр сведений Занятость позиций ШР интервальный, который должен обрабатывать такие ситуации, может отображать некорректные данные, превращая нашего "сторожа" в "главбуха" по окончанию переводов, если не включена настройка "Поддерживать несколько временных переводов, совпадающих по периоду".
Давайте выясним, почему возникает такая ситуация. Исторически в 1С регистры сведений, которые хранят периодическую информацию (например, право на отпуск, разряд, категорию), часто формируются одним отрезком. Это означает, что при изменении какого-либо реквизита, регистратор делает две записи:
Когда мы имеем дело с вложенными или пересекающимися временными переводами, этот "отрезковый" подход начинает давать сбой. Рассмотрим на примере:
Предположим, у нас есть "Сведение_1" (право на вредность). Мы вводим первый временный перевод с "ДатаНачала_1" по "ДатаКонец_1", который устанавливает "Сведение_2" (без вредности).
Затем, внутри этого первого перевода, мы вводим второй временный перевод с "ДатаНачала_2" по "ДатаКонец_2", который устанавливает "Сведение_3" (снова с вредностью).
При стандартной логике записи в регистры, последняя запись, возвращающая состояние, будет относится к "Сведению_2" (без вредности), так как она сформирована по окончании первого, более "длинного" перевода. Таким образом, после завершения всех переводов, система будет считать, что действует "Сведение_2", а не "Сведение_1", которое должно было восстановиться после окончания всех временных изменений.
Проблема в том, что для ряда важных регистров, таких как Положенные виды ежегодных отпусков, не предусмотрено "брата" – интервального регистра сведений (ИРС). Интервальные регистры способны корректно обрабатывать подобные вложенные и пересекающиеся периоды, сохраняя полную и точную историю изменений. Они не просто записывают "отрезки", а формируют цепочку интервалов, где каждый последующий интервал точно вытесняет предыдущий на период своего действия, а затем восстанавливает его. В ЗУП 3.1 такие ИРС есть (например, КадроваяИсторияСотрудниковИнтервальный), но не для всех критически важных параметров.
Мы выяснили, что описанная проблема была официально признана ошибкой фирмой 1С и зарегистрирована на bugboard.v8.1c.ru. Это означает, что разработчики знают о ней и планируют ее исправление в будущих версиях.
Начиная с версии 3.1.35.13 ЗУП 3.1, был добавлен сервисный инструмент "Перезаполнение интервальных регистров". Этот инструмент предназначен для исправления ошибочных данных и может использоваться по рекомендации технической поддержки для устранения рассогласования между интервальными и базовыми регистрами. Это говорит о том, что механизм интервальных регистров активно развивается и совершенствуется.
Пока мы ожидаем полноценного исправления от 1С или разрабатываем собственное решение, существуют несколько обходных путей, которые помогут нам справиться с проблемой:
После завершения всех временных переводов, если право на отпуск за вредность не восстановилось автоматически, мы можем вручную внести его с помощью документа Ввод остатков отпусков. Этот документ позволяет нам напрямую скорректировать записи в регистре сведений Положенные виды ежегодных отпусков, указав дату, с которой право на отпуск должно быть восстановлено.
Ввод остатков отпусков.Этот метод является трудоемким и требует внимательности, особенно если у нас десятки таких переводов в месяц.
Вместо использования одного "длинного" временного перевода, мы можем разбить его на несколько постоянных кадровых переводов:
с 01.01.2023 по 09.10.2023 он сторож).с 10.10.2023 по 31.10.2023 он главбух).с 16.10.2023 по 22.10.2023 он снова на вредной позиции).с 01.11.2023 он снова сторож).Этот подход позволяет системе корректно регистрировать изменения, так как каждый перевод явно указывает на изменение параметров. Однако, у этого метода есть существенные недостатки, особенно в условиях использования систем электронного документооборота (ЭДО):
Как мы уже упоминали, для корректного отображения занятости сотрудников в регистре Занятость позиций ШР интервальный при наличии нескольких совпадающих по периоду временных переводов, нам необходимо включить специальную настройку кадрового учета:
Настройка – Кадровый учет.Эта настройка решает проблему с занятостью, но напрямую не устраняет ошибку с правом на вредный отпуск, хотя и является частью комплексного решения проблем с временными переводами.
Для программистов и продвинутых пользователей, которые стремятся к наиболее надежному и универсальному решению, мы можем реализовать собственный интервальный регистр сведений (ИРС) для учета права на отпуск или других периодических данных, которые страдают от "отрезкового" подхода.
Механизм ИРС в 1С ЗУП 3.1 реализован достаточно универсально. Разработчики 1С предусмотрели, что при наличии регистра сведений, имя которого заканчивается на "Интервальный", общие модули конфигурации автоматически распознают его и начинают работать с ним как с основным, вместо его "обычного" собрата.
Интервальный регистр не имеет собственного регистратора. Он собирает данные исключительно из своего "родного" (основного) регистра сведений и записывает их в себя в строгом интервальном порядке. При любом изменении в основном регистре, подается команда на полную перезапись соответствующего интервала в ИРС. Таким образом, независимо от того, как часто кадровики меняют, удаляют или создают кадровые документы, ИРС всегда будет отражать актуальное и корректное состояние на любую дату.
Давайте разберем по шагам, как мы можем создать новый интервальный регистр, например, для Положенные виды ежегодных отпусков.
РегистрСведений.ГрафикиРаботыСотрудниковИнтервальный. Скопируем его со всеми измерениями, ресурсами и реквизитами.
ИмяОсновногоРС + "Интервальный". Например, если основной регистр ПоложенныеВидыЕжегодныхОтпусков, то новый ИРС будет называться ПоложенныеВидыЕжегодныхОтпусковИнтервальный. Это критически важно, так как общие модули 1С распознают ИРС именно по этому суффиксу.
ПоложенныеВидыЕжегодныхОтпусков), а также свои собственные дополнительные измерения, которые обычно присутствуют в интервальных регистрах (например, ПериодНачало, ПериодОкончание, Активность и т.д.). Убедитесь, что все поля основного регистра, которые должны быть интервальными, присутствуют в ИРС.
В модуле менеджера нового ИРС нам понадобится внести небольшие изменения. Обычно в нем содержится ссылка на основной регистр, который он обслуживает. Найдите код, где указывается имя регистра, и замените его на имя вашего основного регистра. Например, если вы скопировали ИРС для графиков, там будет что-то вроде Метаданные.РегистрыСведений.ГрафикиРаботыСотрудников.Имя. Мы должны изменить это на Метаданные.РегистрыСведений.ПоложенныеВидыЕжегодныхОтпусков.Имя.
Пример кода (обратите внимание, что конкретный код может немного отличаться в зависимости от версии ЗУП и выбранного шаблона ИРС):
// В Модуле менеджера РегистрСведений.ПоложенныеВидыЕжегодныхОтпусковИнтервальный
Функция ИмяОсновногоРегистра() Экспорт
Возврат Метаданные.РегистрыСведений.ПоложенныеВидыЕжегодныхОтпусков.Имя;
КонецФункции
Аналогично, в структуре данных нового ИРС (если она используется для определения полей) необходимо убедиться, что она соответствует полям основного регистра. Например, если в ИРС копировался ресурс, относящийся к графикам, его нужно заменить на ресурс, соответствующий праву на отпуск. Это может быть ресурс, хранящий флаг "предоставляется" или количество дней.
Теперь нам нужно внести изменения в модуль объекта основного регистра сведений (в нашем примере ПоложенныеВидыЕжегодныхОтпусков). Мы добавим три небольшие процедуры, которые обеспечат взаимодействие основного регистра с его новым интервальным "братом". Эти процедуры вы можете скопировать из модуля объекта любого другого основного регистра, у которого есть ИРС.
Процедура ЗаполнитьИнтервальныйРегистр: Эта процедура используется для первоначального заполнения или обновления данных в интервальном регистре.
Процедура ЗаполнитьИнтервальныйРегистр(ПараметрыОбновления = Неопределено) Экспорт
ЗарплатаКадрыПериодическиеРегистры.ПеренестиВозвратныйРегистрВИнтервальныйРегистрСведений(
Метаданные.РегистрыСведений.ПоложенныеВидыЕжегодныхОтпусков.Имя, ПараметрыОбновления);
КонецПроцедуры
Процедура ОбновитьДвиженияИнтервальногоРегистра: Эта процедура используется для обновления движений интервального регистра после изменений в основном регистре. Она должна вызываться в тех местах, где происходят записи в основной регистр.
Процедура ОбновитьДвиженияИнтервальногоРегистра(МенеджерВременныхТаблиц) Экспорт
ЗарплатаКадрыПериодическиеРегистры.ОбновитьДвиженияИнтервальногоРегистра(
Метаданные.РегистрыСведений.ПоложенныеВидыЕжегодныхОтпусков.Имя, МенеджерВременныхТаблиц);
КонецПроцедуры
Процедура ПерезаполнитьИнтервальныйРегистр: Эта процедура предназначена для полной очистки и повторного заполнения интервального регистра, что полезно при массовых изменениях или для устранения рассогласований.
Процедура ПерезаполнитьИнтервальныйРегистр(ПараметрыОбновления = Неопределено) Экспорт
Если ПараметрыОбновления = Неопределено
Или Не ПараметрыОбновления.Свойство("РегистрОчищен") Тогда
НаборЗаписей = РегистрыСведений.ПоложенныеВидыЕжегодныхОтпусковИнтервальный.СоздатьНаборЗаписей();
НаборЗаписей.Записать();
Если ПараметрыОбновления <> Неопределено Тогда
ПараметрыОбновления.Вставить("РегистрОчищен", Истина);
КонецЕсли;
КонецЕсли;
ЗарплатаКадрыПериодическиеРегистры.ПеренестиВозвратныйРегистрВИнтервальныйРегистрСведений(
Метаданные.РегистрыСведений.ПоложенныеВидыЕжегодныхОтпусков.Имя, ПараметрыОбновления);
КонецПроцедуры
После реализации этих изменений, система 1С ЗУП 3.1 начнет использовать ваш новый интервальный регистр для корректного учета права на отпуск за вредность, устраняя проблему с временными переводами.
Для правильного функционирования учета отпуска за вредность, убедитесь, что в вашей конфигурации выполнены следующие настройки:
Настройка – Расчет зарплаты – Настройка состава начислений и удержаний) убедитесь, что установлен флаг "Надбавка за вредность". Это автоматически добавит в справочник Виды отпусков соответствующий вид отпуска "Отпуск за вредность".
Начиная с версии 3.1.2, в ЗУП была реализована возможность учитывать фактически отработанное во вредных условиях время при расчете остатков отпуска за вредность, что является важным шагом к корректному расчету.
Проблема некорректного учета права на дополнительный отпуск за вредность и разрядов после временных переводов в 1С ЗУП 3.1 является серьезным недостатком типовой конфигурации, связанным с архитектурой хранения периодических данных. Хотя фирма 1С признала эту ошибку и работает над ее устранением, мы можем использовать обходные пути или, для наиболее надежного решения, реализовать собственный интервальный регистр сведений.
Реализация собственного ИРС, хоть и требует определенных навыков программирования, предоставляет универсальный и масштабируемый механизм, который может быть применен не только для отпусков, но и для других периодических данных (например, разрядов), которые страдают от аналогичной проблемы. Этот подход позволит нам обеспечить точность и корректность учета, независимо от сложности кадровых перемещений и частоты внесения изменений.
В конечном итоге, выбор решения зависит от наших ресурсов, срочности исправления и требований к надежности системы. Важно тщательно проанализировать свой бизнес-процесс и выбрать наиболее подходящий вариант для нашей организации.