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