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