Как определить, в какой момент заполняется реквизит объекта в 1С

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

При разработке и сопровождении конфигураций на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда реквизит нового документа или справочника оказывается заполненным еще до того, как пользователь начал ввод данных. Особенно это сбивает с толку, когда в стандартных процедурах вроде ОбработкаЗаполнения код явно очищает реквизит, но в процедуре формы ПриСозданииНаСервере он снова оказывается заполненным. Проанализируем жизненный цикл объекта и выясним, в каких "потаенных" местах платформа может устанавливать значения.

1. Свойства метаданных: самый незаметный уровень

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

  1. Значение заполнения (FillValue): Это статическое значение, которое платформа подставляет в реквизит сразу при инициализации нового объекта. Если здесь стоит «Истина» или ссылка на конкретный элемент, то даже до вызова кода в модулях объект уже будет содержать эти данные.
  2. Заполнять из заполнения данных выборки (FillFromFillingValue): Это свойство заставляет платформу искать подходящие значения в контексте создания объекта. Например, если объект создается из формы списка, где установлен отбор по этому реквизиту, платформа автоматически подставит значение из отбора.

Выясним причину на конкретном примере. Если у вас есть документ «Прием на работу» и реквизит ОтражатьВТрудовойКнижке всегда равен Истина, обязательно загляните в свойства метаданных. Именно это часто становится «ловушкой» для разработчика, который ищет проблему только в программном коде.

2. Обработка заполнения в модуле объекта и подписки

Когда мы создаем новый объект, платформа всегда вызывает событие ОбработкаЗаполнения. Разберем по шагам, что там происходит:

Во-первых, программный код в самом модуле объекта. Проанализируем типичный фрагмент кода:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    // Установка значений по умолчанию
    ЭтотОбъект.Ответственный = Пользователи.ТекущийПользователь();
    ЭтотОбъект.Дата = ТекущаяДатаСеанса();
КонецПроцедуры

Во-вторых, не забудем про Подписки на события. В типовых конфигурациях, таких как ЗУП 3.1 или ERP, часто используются общие подписки на событие ОбработкаЗаполнения для целых групп документов. Чтобы их найти, воспользуемся поиском ссылок на объект метаданных или поиском по тексту во всей конфигурации по ключевой фразе "ОбработкаЗаполнения". Подписки могут изменять реквизиты объекта уже после того, как отработал основной код модуля объекта.

3. Параметры формы и механизм «ЗначенияЗаполнения»

Если объект создается интерактивно через вызов ОткрытьФорму, управление передается в форму. Однако между созданием объекта в памяти и выполнением кода ПриСозданииНаСервере в форме есть важный промежуточный этап. Рассмотрим ситуацию, когда форма открывается программно:


ПараметрыЗаполнения = Новый Структура("ВашРеквизит", Истина);
ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ПараметрыЗаполнения);
ОткрытьФорму("Документ.ВашДокумент.ФормаОбъекта", ПараметрыФормы);

В данном примере используется зарезервированный ключ ЗначенияЗаполнения. Если он передан в параметры формы, платформа автоматически применит эти значения к объекту после выполнения ОбработкаЗаполнения, но до начала работы кода в ПриСозданииНаСервере. Это крайне мощный и часто используемый в БСП механизм, который позволяет «прокидывать» данные в новый объект без изменения его модуля.

4. Влияние расширений конфигурации

Проанализируем ситуацию с расширениями. В современных реалиях (особенно в ЗУП 3.1) значительная часть логики может быть вынесена в расширения. Проверьте наличие методов &Перед, &После или &Вместо для процедуры ОбработкаЗаполнения или процедур формы. Расширение может переопределять логику заполнения, и вы не увидите этого в основной конфигурации. Используйте глобальный поиск по имени реквизита, обязательно включив область поиска «Все расширения».

5. Чтение данных (для существующих объектов)

Если вопрос касается не нового, а уже записанного документа, то реквизит может заполняться в момент чтения из базы данных. Посмотрим на события модуля объекта:

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

6. Механизмы Библиотеки Стандартных Подсистем (БСП)

В типовых решениях (ЗУП, ERP, КА) заполнение часто делегируется специализированным общим модулям. Рассмотрим, как это работает. В процедуре ПриСозданииНаСервере часто можно встретить вызов:

УправлениеТорговлейКлиентСервер.ЗаполнитьОбъектПоУмолчанию(ЭтотОбъект);

Или использование механизма настроек пользователя. БСП может хранить «последние введенные значения» или «значения по умолчанию для автора» в регистре сведений НастройкиПользователей. При создании нового документа система считывает эти настройки и программно заполняет реквизиты. Чтобы найти виновника, придется глубоко погрузиться в отладку общих модулей с префиксом ЗаполнениеОбъектов.

7. Использование функциональных опций

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

8. Практические советы по отладке

Если все вышеперечисленное не помогло, перейдем к «тяжелой артиллерии» — отладке. Выясним причину изменения значения с помощью следующих приемов:

  1. Точка останова в начале модуля объекта: Установите точку останова в самой первой строке процедуры ОбработкаЗаполнения. Если при остановке реквизит уже заполнен — значит, дело в Значении заполнения в метаданных.
  2. Стек вызовов: Когда отладчик остановится в ПриСозданииНаСервере, внимательно изучите стек вызовов (Call Stack). Он покажет цепочку процедур, приведшую к открытию формы. Пройдитесь по ним вверх, чтобы увидеть, не передаются ли параметры заполнения.
  3. Замер производительности: Запустите замер производительности в момент нажатия кнопки «Создать». В результатах замера найдите имя вашего реквизита. Это позволит увидеть все строки кода во всей конфигурации (включая общие модули), где происходит обращение к этому полю или его присваивание.
  4. Поиск по всей конфигурации: Выполните поиск строки .ИмяВашегоРеквизита =. Это позволит найти все места прямой записи значения. Помните, что реквизит может заполняться и через ЗаполнитьЗначенияСвойств(), поэтому поиск только по имени может не дать результата — ищите также упоминания в контексте структур.

Подводя итог, можно сказать, что в 1С существует как минимум пять уровней, на которых может инициализироваться реквизит: свойства метаданных, код модуля объекта, подписки на события, параметры открытия формы и механизмы БСП. Системный подход к проверке каждого уровня позволит быстро найти «скрытое» заполнение и обеспечить корректную работу бизнес-логики вашего приложения.

← На главную