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