В какой момент заполняется реквизит формы «ТекущаяОрганизация» в ЗУП 3.1 и как это отладить?

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

При разработке и доработке конфигурации «Зарплата и управление персоналом» (версии 3.1) программисты часто сталкиваются с ситуацией, когда реквизит формы ТекущаяОрганизация в карточке сотрудника ведет себя неочевидно. В режиме «1С:Предприятие» поле организации отображается заполненным, однако при отладке в обработчиках ПриСозданииНаСервере или ПриОткрытии реквизит содержит пустую ссылку. Особенно часто такая проблема возникает для сотрудников, работающих по договорам гражданско-правового характера (ГПХ).

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

Причины пустой организации у договорников ГПХ

Проанализируем особенности учета договоров ГПХ в типовой конфигурации ЗУП 3.1:

  1. Отсутствие кадровых приказов: Для физических лиц, выполняющих работы по договорам ГПХ, не создаются стандартные кадровые документы («Прием на работу»). Из-за этого в регистре сведений ТекущиеКадровыеДанныеСотрудников не формируются стандартные записи о назначении организации.
  2. Специфика реквизита формы: В форме элемента справочника Сотрудники реквизит ТекущаяОрганизация является реквизитом формы, а не реквизитом объекта. Для штатных сотрудников он считывается из кадровой истории, а для договорников должен определяться по действующим документам «Договор (работы, услуги)».
  3. Подстановка в интерфейсе: Поле на форме в режиме «1С:Предприятие» может visually отображать организацию за счет рабочих настроек пользователя, параметрических связей выбора или контекста формы списка, в то время как сам реквизит формы ТекущаяОрганизация еще не проинициализирован в программном коде.

Последовательность событий формы при считывании объекта

Выясним, в какой именно момент платформа заполняет данные формы при открытии существующего элемента справочника. В управляемых формах 1С порядок вызова обработчиков следующий:

  1. ПриЧтенииНаСервере: Вызывается на сервере после считывания данных объекта из информационной базы, но ДО выполнения обработчика ПриСозданииНаСервере. Именно в этом событии типовые механизмы ЗУП считывают кадровые данные и инициализируют специфические реквизиты формы, такие как ТекущаяОрганизация.
  2. ПриСозданииНаСервере: Вызывается при формировании формы на сервере. В этот момент основные реквизиты объекта уже прочитаны, а дополнительные обработчики формы завершили свою работу.
  3. ПриОткрытии: Клиентское событие, выполняемое перед непосредственным отображением формы пользователю.

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

Использование замера производительности для поиска источника заполнения

Для точного определения точки в коде, где происходит обращение к реквизитам формы или их перезаполнение, воспользуемся штатным инструментом отладки — Замером производительности. Разберем порядок действий по шагам:

  1. Запустим конфигуратор и откроем сеанс «1С:Предприятие» в режиме отладки.
  2. В режиме «1С:Предприятие» откроем форму списка справочника Сотрудники и установим курсор на нужной строке.
  3. Перейдем в конфигуратор и в меню «Отладка» включим Замер производительности (или нажмите соответствующую горячую клавишу).
  4. Вернемся в режим «1С:Предприятие» и откроем карточку сотрудника (двойным кликом или нажатием Enter).
  5. После того как форма элемента полностью открылась, вернемся в конфигуратор и отключим замер производительности.
  6. В открывшемся окне результатов замера применим поиск по имени реквизита (например, ТекущаяОрганизация) или по именам общих модулей, таких как СотрудникиФормыБазовый.

Замер производительности зафиксирует все серверные и клиентские вызовы, выполняемые при открытии формы, включая процедуры модуля формы и подключенных общих модулей. Вы увидите строки кода, в которых происходит считывание и запись реквизита:


ПараметрыФункциональныхОпций.Вставить("Организация", ЗарплатаКадрыПовтИсп.ГоловнаяОрганизация(Форма.ТекущаяОрганизация));

Способы решения проблемы при записи

Если при записи карточки договорника возникает ошибка из-за незаполненной организации в независимых регистрах сведений (например, ДанныеДляПодбораСотрудников), проанализируем варианты решения:

Вариант 1. Корректное оформление документов ГПХ

Убедимся, что для сотрудника создан и проведен документ «Договор (работы, услуги)». После проведения документа срез данных начнет корректно возвращать организацию для данного физлица, и реквизит формы будет заполняться штатно при считывании элемента.

Вариант 2. Программная коррекция через расширение конфигурации

Если необходимо обеспечить гарантированное заполнение реквизита до момента записи, доработаем форму элемента справочника Сотрудники через расширение. Для этого перехватим событие ПриЧтенииНаСервере или ПередЗаписьюНаСервере:


&НаСервере
Процедура Расш1_ПриЧтенииНаСервереПосле(ТекущийОбъект)
    Если Не ЗначениеЗаполнено(ТекущаяОрганизация) Тогда
        // Если организация не определена из кадровых данных, 
        // извлекаем её из действующего договора ГПХ
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ ПЕРВЫЕ 1
            |	Договор.Организация КАК Организация
            |ИЗ
            |	Документ.ДоговорРаботыУслуги КАК Договор
            |ГДЕ
            |	Договор.Сотрудник = &Сотрудник
            |	И Договор.Проведен = ИСТИНА";
        
        Запрос.УстановитьПараметр("Сотрудник", ТекущийОбъект.Ссылка);
        Выборка = Запрос.Выполнить().Выбрать();
        
        Если Выборка.Следующий() Тогда
            ТекущаяОрганизация = Выборка.Организация;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

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

← На главную