При работе с конфигурацией 1C:International Resource Planning (IRP) программисты часто сталкиваются с тем, что при создании нового документа поле Организация (или Company) уже заполнено определенным значением. Это происходит еще до выполнения кода в процедуре ПриСозданииНаСервере модуля формы. Для эффективной кастомизации системы нам необходимо понимать, в какой момент и с помощью каких механизмов платформа и программный код подставляют эти данные.
В этой статье мы подробно разберем жизненный цикл создания объекта в 1C:IRP 2.0, проанализируем роль системных обработчиков и выясним, как управлять заполнением реквизитов по умолчанию.
Прежде всего, разберем хронологию событий, которые происходят на стороне сервера, когда пользователь нажимает кнопку «Создать». Многие начинающие разработчики ищут логику в модуле формы, однако к моменту инициализации формы объект уже существует в памяти сервера с заполненными данными. Порядок следующий:
Таким образом, если мы видим заполненную организацию сразу после открытия формы, значит, она была установлена либо платформой автоматически, либо программно в ОбработкаЗаполнения.
В конфигурации IRP 2.0 логика заполнения вынесена в модуль объекта. Рассмотрим, как это работает. Когда мы создаем новый документ, система вызывает процедуру ОбработкаЗаполнения, в которую передается параметр ДанныеЗаполнения.
Проанализируем пример кода, который может отвечать за установку организации:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
// Если данные заполнения — это структура, переданная из формы списка
Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
ЗаполнитьПоСтруктуре(ДанныеЗаполнения);
КонецЕсли;
// Обращение к системным настройкам пользователя IRP
Если НЕ ЗначениеЗаполнено(ЭтотОбъект.Company) Тогда
ЭтотОбъект.Company = UserSettingsServer.GetDefaultUserCompany(Пользователи.ТекущийПользователь());
КонецЕсли;
КонецПроцедуры
В IRP 2.0 активно используется подсистема UserSettings. Программа ищет настройки в специальном регистре или кэше настроек пользователя. Если вы хотите изменить организацию по умолчанию, в первую очередь проверьте настройки пользователя в интерфейсе самой программы.
Рассмотрим ситуацию, которую часто упускают из виду: влияние фильтров. Платформа 1С обладает встроенным механизмом: если в форме списка установлен фильтр по какому-либо реквизиту (например, по организации), то при нажатии кнопки «Создать» значение из этого фильтра автоматически передается в ДанныеЗаполнения нового объекта.
Выясним, как это работает пошагово:
Company = "Main Store".Если вам кажется, что организация заполняется «магическим» образом, проверьте, не установлены ли фиксированные настройки или отборы в форме списка, из которой вызывается создание.
В 1C:IRP 2.0 для повышения производительности и удобства пользователя часто применяются Параметры сеанса (Session Parameters). При запуске системы инициализируется контекст пользователя, в который считываются основные настройки: компания по умолчанию, склад, валюта и бизнес-единица.
Проанализируем, как можно программно получить эти данные, если стандартные механизмы вам не подходят:
// Пример получения организации из параметров сеанса в IRP
DefaultCompany = ПараметрыСеанса.CurrentUserCompany;
// Или через специализированный серверный модуль
DefaultCompany = UserSettingsServer.GetValue("DefaultCompany");
Важно помнить, что IRP может сохранять «последнее выбранное значение». Это реализуется через ХранилищеОбщихНастроек (CommonSettingsStorage). Если пользователь один раз выбрал организацию «Б», система может запомнить этот выбор и подставлять его в следующий раз, даже если в официальных настройках указана организация «А».
Если перед вами стоит задача переопределить заполнение организации по умолчанию, рекомендуем следующий алгоритм действий:
ПередОбработкойЗаполнения или ПослеОбработкиЗаполнения.ОбработкаЗаполнения.Посмотрим на пример кода в подписке на событие, который позволяет гибко управлять организацией:
Процедура УстановитьОрганизациюПриЗаполнении(Источник, ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка) Экспорт
// Проверяем, что это новый объект и организация еще не заполнена
Если Источник.ЭтоНовый() И НЕ ЗначениеЗаполнено(Источник.Company) Тогда
// Ваша кастомная логика
Источник.Company = ПолучитьОрганизациюПоПодразделению(ПараметрыСеанса.ТекущийПользователь);
КонецЕсли;
КонецПроцедуры
Заполнение организации в 1C:IRP 2.0 — это результат работы нескольких уровней системы: платформенных фильтров, настроек подсистемы UserSettings и логики в модуле объекта (ОбработкаЗаполнения). Понимание этого процесса позволяет не только быстро находить причины «странного» поведения программы, но и корректно вносить изменения в логику автоматизации бизнес-процессов.