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