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