Почему не получается обратиться к реквизиту табличной части документа при программном заполнении?

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

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

Разбираем архитектурную ошибку

Главная причина возникновения ошибки заключается в смешивании понятий Данные объекта и Данные формы. В системе 1С существует четкое разделение:

  1. Данные объекта — это те реквизиты, которые физически хранятся в таблицах базы данных. Их структура задается в конфигураторе на вкладке «Данные» конкретного документа. Если реквизита нет в конфигураторе в структуре табличной части, то его не существует в базе данных.
  2. Данные формы — это временные элементы, которые существуют только в момент открытия формы документа в «толстом» или «тонком» клиенте. Реквизиты, такие как ИнвентарныйНомер, часто создаются на форме для удобства пользователя. Они заполняются динамически при открытии документа путем чтения данных из связанных справочников.

Когда вы пишете обработку, вы работаете с объектом через менеджер Документы.ИмяДокумента.СоздатьДокумент(). В этот момент никакой формы не существует, а значит, и тех «визуальных» реквизитов, которые вы видите на экране, для кода просто нет.

Анализируем ваш код

Давайте посмотрим на ситуацию, которую вы описали в своем коде. Вы пытаетесь обратиться к полю, которого нет в структуре данных:


// Ошибочный подход:
НоваяСтрока = НовыйДок.ОС.Добавить();
// Попытка обратиться к реквизиту, которого не существует в базе:
НоваяСтрока.Объект.ОС.ИнвентарныйНомер = Sum; 

Попытка использовать Элементы.ОС.ТекущиеДанные также не принесет результата, так как объект Элементы доступен только в контексте модуля формы, а ваша обработка работает с серверным объектом. Для того чтобы данные сохранились в базе, они должны попадать в те поля, которые реально существуют в конфигураторе.

Как правильно решить задачу

Если вам необходимо хранить дополнительные сведения (например, код основного средства или иные номера) внутри документа, у нас есть несколько проверенных стратегий:

Способ 1: Добавление реквизита в конфигуратор (рекомендуемый для постоянных данных)

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


НоваяСтрока = НовыйДок.ОС.Добавить();
НоваяСтрока.ОсновноеСредство = НайденнаяНоменклатура;
// Теперь этот код будет работать, так как реквизит добавлен в структуру документа:
НоваяСтрока.КодОС = Num; 

Способ 2: Использование дополнительных реквизитов (БСП)

Если вы не хотите вносить изменения в конфигурацию (например, конфигурация на поддержке), используйте механизм Дополнительные реквизиты и сведения (БСП). В этом случае вы добавляете свойство через пользовательский режим. Запись таких данных производится через специальные функции подсистемы УправлениеСвойствами.

Выводы и рекомендации

Подводя итоги, запомним основные правила:

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

← На главную