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