Как правильно записать элемент справочника 1С в конкретную папку (группу)?

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

Проанализируем частую задачу разработчиков 1С: программное создание нового элемента справочника с помещением его в определенный каталог (группу или папку). Разберем типичные ошибки, возникающие при поиске родительской группы, и рассмотрим правильные методы написания кода.

1. Разница между иерархическим родителем и владельцем

При попытке поместить новый элемент в группу справочника важно не путать два ключевых свойства метаданных:

  1. Родитель (Parent) — используется в иерархических справочниках. Определяет, в какой именно папке (группе) находится текущий элемент или подгруппа.
  2. Владелец (Owner) — используется только для подчиненных справочников (например, справочник «Договоры» подчинен справочнику «Контрагенты»). Попытка присвоить родительскую папку в реквизит Владелец приведет к логической или синтаксической ошибке.

Если справочник является иерархическим (вид иерархии в Конфигураторе установлен как «Иерархия групп и элементов»), для помещении элемента в папку нужно заполнять именно реквизит Родитель.

2. Выясним причину ошибки «Неверно указан реквизит»

Часто разработчики пытаются найти папку для подстановки с помощью метода НайтиПоРеквизиту, передавая в него имя системного реквизита "Код" или "Наименование":

Влад = Справочники.БС_Товары.НайтиПоРеквизиту("Наименование", "КОМПЬЮТЕРЫ и ОРГТЕХНИКА(ОС)");

Вызов данного кода приводит к ошибке: «Ошибка при вызове метода контекста (НайтиПоРеквизиту): Неверно указан реквизит».

Рассмотрим причины, почему метод НайтиПоРеквизиту не работает в данном случае:

  1. Неприменимость к стандартным реквизитам: Метод НайтиПоРеквизиту предназначен исключительно для дополнительных (пользовательских) реквизитов. Для стандартных реквизитов Код и Наименование в платформе 1С предусмотрены отдельные специализированные методы.
  2. Требование к индексации: Метод работает только с теми пользовательскими реквизитами, у которых в конфигураторе включено свойство «Индексировать».

Для поиска элементов и групп по стандартным реквизитам следует использовать встроенные методы:

  1. Для поиска по коду: Справочники.БС_Товары.НайтиПоКоду("000000000002")
  2. Для поиска по наименованию: Справочники.БС_Товары.НайтиПоНаименованию("КОМПЬЮТЕРЫ и ОРГТЕХНИКА(ОС)", Истина) (второй параметр ТочноеСоответствие = Истина гарантирует поиск точного совпадения).

3. Разберем по шагам правильный алгоритм записи элемента в папку

Посмотрим на корректную реализацию создания элемента справочника с назначением родительской группы:


// 1. Находим нужную группу справочника по коду или наименованию
СсылкаНаГруппу = Справочники.БС_Товары.НайтиПоКоду("000000000002");

// 2. Проверяем, найдена ли группа
Если Не СсылкаНаГруппу.Пустая() Тогда

    // Получаем текущую строку из формы во временную переменную (оптимизация)
    ТекущаяСтрока = ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока;

    // 3. Создаем новый элемент справочника
    НовыйТовар = Справочники.БС_Товары.СоздатьЭлемент();
    
    // 4. Указываем родительскую папку
    НовыйТовар.Родитель = СсылкаНаГруппу;
    
    // 5. Заполняем остальные реквизиты
    НовыйТовар.Код = ТекущаяСтрока.ИдентНомерСкр;
    НовыйТовар.Наименование = ТекущаяСтрока.Товар;
    НовыйТовар.ЕдиницаИзмерения = ТекущаяСтрока.ЕдиницаИзмерения;
    НовыйТовар.СлужебныйИнвНомер = ТекущаяСтрока.ИнвНомер;
    
    // 6. Записываем объект в базу данных
    НовыйТовар.Записать();

Иначе
    Сообщить("Целевая группа не найдена в справочнике!");
КонецЕсли;

4. Рекомендации по оптимизации и культуре разработки

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

  1. Избегайте лишних разыменований (обращений через точку): Если обращаться к реквизиту формы несколько раз подряд (например, ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока.Товар, ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока.ЕдиницаИзмерения), платформа выполняет цепочку вызовов при каждом обращении. Выделение ТекущаяСтрока в отдельную локальную переменную перед записью реквизитов существенно снижает накладные расходы.
  2. Избегайте «жесткого кодирования» (hardcode) кодов и наименований: Поиск групп по текстовым строкам вида "000000000002" или "КОМПЬЮТЕРЫ" делать не рекомендуется. Если пользователь переименует папку или пересчитает коды, код перестанет работать.
  3. Альтернативы жесткому коду:
    • Создание предопределенного элемента или группы в Конфигураторе (тогда в коде можно обращаться через Справочники.БС_Товары.ИмяПредопределеннойГруппы).
    • Добавление настройки на форму или в константу/регистр сведений, где пользователь сможет сам выбрать нужную папку из справочника.
← На главную