Как настроить автоматический выбор вида начисления в документе «Отпуск» в зависимости от организации

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом
← На главную

В конфигурации 1С:Зарплата и управление персоналом 3.1 часто возникает ситуация, когда в одной информационной базе ведется учет по нескольким организациям. По историческим причинам или из-за особенностей локального учета для каждой организации могут быть созданы свои виды начислений для основного отпуска (например, Отпуск основной (Орг1) и Отпуск основной (Орг2)). Однако при создании документа Отпуск система автоматически подставляет лишь одно начисление, игнорируя принадлежность сотрудника к конкретной организации. Разберем подробно, почему так происходит и как реализовать автоматическую подстановку нужного вида расчета.

Анализ типовой логики выбора начисления

Для начала проанализируем, как программа определяет, какое начисление вывести в форму документа. В 1С:ЗУП 3.1 логика заполнения начислений по категориям (основной отпуск, дополнительный и т.д.) вынесена в общие модули. В частности, за это отвечает процедура ЗаполнитьНачислениеВФормеДокументаПоКатегории в общем модуле РасчетЗарплатыРасширенныйФормы.

Проблема заключается в том, что если в плане видов расчета Начисления существует несколько элементов с категорией «Основной отпуск», система не имеет штатного механизма приоритетов. Она просто выбирает первый попавшийся объект из массива доступных начислений. Код выглядит примерно так:


// Пример упрощенной логики в типовом модуле
Если Начисления.Количество() > 0 Тогда
    РеквизитНачисления = Начисления[0];
КонецЕсли;

Поскольку в типовом функционале отсутствует привязка «Начисление — Организация», нам придется использовать программные методы решения задачи или методические обходные пути.

Почему настройка Штатного расписания не решает задачу?

Часто пользователи пытаются решить проблему через справочник Штатное расписание. Рассмотрим, почему это не дает желаемого результата:

  1. В позиции штатного расписания (на закладке «Дополнительно») действительно можно указать виды отпусков.
  2. Однако там указывается Вид отпуска (объект справочника ВидыОтпусков), который определяет только право на количество дней отпуска.
  3. Вид расчета (начисление) привязан к виду отпуска в настройках самого начисления, но связь эта «много к одному». То есть на один вид отпуска может ссылаться несколько начислений.

Таким образом, штатное расписание помогает программе понять, сколько дней положено сотруднику, но не каким именно начислением эти дни должны быть оплачены в конкретной организации.

Решение проблемы через создание расширения

Наиболее корректным техническим решением будет создание расширения конфигурации. Нам необходимо перехватить момент выбора или смены организации в документе, чтобы принудительно установить нужный вид начисления.

Рассмотрим по шагам, как реализовать подстановку в форме документа Отпуск:

Шаг 1. Перехват события изменения организации.

Нам нужно расширить процедуру ПриИзмененииОрганизации в форме документа. Это гарантирует, что если пользователь передумает и выберет другую организацию, вид начисления обновится автоматически.


&НаКлиенте
Процедура Расш1_ПриИзмененииОрганизацииПосле(Элемент)
    // Вызываем серверную процедуру для определения начисления
    Расш1_УстановитьНачислениеПоОрганизацииСервер();
КонецПроцедуры

&НаСервере
Процедура Расш1_УстановитьНачислениеПоОрганизацииСервер()
    Если Объект.Организация = Справочники.Организации.НайтиПоНаименованию("Организация №1") Тогда
        Объект.ВидРасчетаОсновногоОтпуска = ПланыВидовРасчета.Начисления.НайтиПоНаименованию("Отпуск основной №1");
    ИначеЕсли Объект.Организация = Справочники.Организации.НайтиПоНаименованию("Организация №2") Тогда
        Объект.ВидРасчетаОсновногоОтпуска = ПланыВидовРасчета.Начисления.НайтиПоНаименованию("Отпуск основной №2");
    КонецЕсли;
КонецПроцедуры

Шаг 2. Обработка создания нового документа.

Проанализируем ситуацию при открытии формы. Если документ новый и организация уже подставилась из настроек пользователя, нужно также вызвать логику определения начисления. Лучше всего использовать ПриСозданииНаСервере с префиксом &После.


&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда
        // Только для новых документов
        Расш1_УстановитьНачислениеПоОрганизацииСервер();
    КонецЕсли;
КонецПроцедуры

Важный нюанс: Использование метода НайтиПоНаименованию или НайтиПоКоду в коде не является «лучшей практикой». Рекомендуется создать дополнительный реквизит (свойство) у справочника Организации через механизм дополнительных сведений, где и хранить ссылку на соответствующее начисление. Тогда код станет универсальным и не потребует правки при добавлении новых организаций.

Альтернативный вариант: Без программирования

Если внесение изменений в код невозможно, рассмотрим методический подход. Проанализируем, можно ли объединить начисления. 1С рекомендует использовать одно начисление для всех организаций, регулируя различия в расчете через формулу.

Выясним, как это сделать:

  1. В формуле начисления можно использовать логическое условие.
  2. Пример формулы: ?(Организация = НашаОрганизация1, Расчет1, Расчет2).
  3. Для этого в настройках начисления на вкладке «Основное» нужно убедиться, что показатели, используемые в формуле, доступны для выбора.

Еще один вариант без кода — создание разных Видов отпусков в справочнике Виды отпусков (например, «Основной Орг 1» и «Основной Орг 2»). Затем в каждом начислении указать соответствующий вид отпуска. После этого в штатном расписании каждой организации закрепить свой вид отпуска. При выборе сотрудника в документе Отпуск программа подтянет положенные ему виды отпусков, и, соответственно, связанные с ними начисления.

Минус этого метода: Разделение основного отпуска на разные виды в справочнике может привести к путанице в отчетах по остаткам отпусков и потребует очень внимательной настройки прав на отпуска для всех сотрудников.

Резюме

Подводя итог, можно сказать: наиболее стабильным и удобным для пользователя решением является использование расширения. Это позволит сохранить прозрачность учета (разные начисления для разных организаций) и обеспечит полную автоматизацию процесса без необходимости вручную менять начисления на вкладке «Начислено».

Рассмотрим еще раз ключевые моменты: для автоматизации в документе Отпуск следует модифицировать форму документа, ориентируясь на событие ПриИзмененииОрганизации. Это исключит ошибки человеческого фактора и ускорит работу расчетчика.

← На главную