Как исправить ошибку «Поле объекта не обнаружено (НаборСвойств)» при проведении документа в 1С

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

При изучении программирования в 1С по практическому пособию разработчика (авторы М.Г. Радченко и Е.Ю. Хрусталева), многие начинающие разработчики сталкиваются с ошибкой «Поле объекта не обнаружено (НаборСвойств)» при выполнении обработчика ОбработкаПроведения в документе ОказаниеУслуги. Давайте разберем причины этой ошибки, проанализируем код и выясним, как правильно настроить запрос для корректного формирования движений по регистрам.

Суть проблемы и диагностика

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

Рассмотрим типичный фрагмент проблемного кода:


Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Материал = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.НаборСвойств = ВыборкаДетальныеЗаписи.НаборСвойств; // Ошибка здесь!

Разбор типичных ошибок в тексте запроса

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

  1. Отсутствие поля в секции ВЫБРАТЬ: Если вы добавили характеристику (НаборСвойств) в метаданные документа и регистра, но забыли упомянуть её в тексте запроса, она не появится в результате выполнения.
  2. Отсутствие поля в секции СГРУППИРОВАТЬ ПО: Поскольку в документе «Оказание услуги» используется суммирование количества и сумм, запрос содержит группировку. Все поля, не являющиеся агрегатными функциями (как СУММА), должны быть перечислены в блоке СГРУППИРОВАТЬ ПО.
  3. Отсутствие псевдонимов (Aliasing): В коде обращения к полям часто используются имена КоличествоВДокументе или СуммаВДокументе. Если в запросе не написать КАК КоличествоВДокументе, система присвоит полю стандартное имя (например, Количество), и программный код не сможет найти нужное свойство.

Правильная структура запроса в ОбработкеПроведения

Рассмотрим, как должен выглядеть исправленный текст запроса внутри процедуры проведения. Обратите внимание на обязательное наличие поля НаборСвойств во всех частях запроса.


Запрос.Текст = 
    "ВЫБРАТЬ
    |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
    |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
    |    ОказаниеУслугиПереченьНоменклатуры.НаборСвойств,
    |    СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК КоличествоВДокументе,
    |    СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК СуммаВДокументе
    |ИЗ
    |    Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
    |ГДЕ
    |    ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
    |
    |СГРУППИРОВАТЬ ПО
    |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
    |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры,
    |    ОказаниеУслугиПереченьНоменклатуры.НаборСвойств";

После выполнения такого запроса объект ВыборкаДетальныеЗаписи будет содержать все необходимые поля, и обращение ВыборкаДетальныеЗаписи.НаборСвойств отработает без ошибок.

Работа с отладчиком для поиска недостающих полей

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

  1. Установите точку останова (клавиша F9) на строке с ошибкой.
  2. Запустите проведение документа. Когда программа остановится, выделите переменную ВыборкаДетальныеЗаписи.
  3. Нажмите Shift + F9 (Вычислить выражение).
  4. В открывшемся окне нажмите на кнопку с лупой или разверните дерево значений. Вы увидите список всех колонок, которые вернул запрос.

Если в списке нет НаборСвойств, значит, проблема в последнем блоке кода, где переопределяется Запрос.Текст. В учебнике Радченко часто используется несколько запросов подряд или временные таблицы через МенеджерВременныхТаблиц. Проверьте, чтобы во временную таблицу НоменклатураДокумента поле также было включено.

Важность использования конструктора запроса

Чтобы избежать опечаток в именах полей, мы рекомендуем использовать Конструктор запроса. Для этого нажмите правой кнопкой мыши на тексте запроса в конфигураторе и выберите «Конструктор запроса...». На закладке «Поля» убедитесь, что выбраны все нужные реквизиты табличной части, а на закладке «Группировки» они корректно перенесены в правое окно.

Важный нюанс: при использовании характеристик номенклатуры (которые и хранятся в НаборСвойств), всегда следите за тем, чтобы этот реквизит был добавлен в табличную часть документа ОказаниеУслуги. Если реквизита нет в метаданных документа, конструктор запроса не предложит его для выбора, и вы получите ошибку при проведении.

Таким образом, для решения проблемы достаточно синхронизировать состав полей в метаданных, тексте запроса и коде обработки результата. Это фундаментальный навык при разработке на платформе 1С:Предприятие 8.3.

← На главную