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