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