Как правильно заполнить таблицу значений данными из иерархического справочника

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

При разработке обработок в среде «1С:Предприятие» часто возникает задача выгрузки данных из справочников в промежуточные структуры, такие как Таблица значений или Дерево значений. Несмотря на кажущуюся простоту, начинающие разработчики часто сталкиваются с ситуацией, когда строки в таблицу добавляются, но остаются пустыми. В этой статье мы подробно разберем, почему это происходит, проанализируем ошибки при использовании метода ЗаполнитьЗначенияСвойств и изучим наиболее эффективные способы работы с иерархическими данными.

Разбор типичной проблемы: почему таблица пустая?

Рассмотрим стандартную ситуацию: у нас есть иерархический справочник Номенклатура и мы хотим заполнить таблицу значений именами элементов. Типичная ошибка заключается в несоответствии имен колонок таблицы значений и имен реквизитов справочника в объекте выборки.

Если в вашей таблице значений колонка называется Значение, а вы пытаетесь использовать автоматизированные методы заполнения, система не сможет сопоставить это поле с Наименованием или Кодом справочника. Для платформы 1С критически важно полное совпадение идентификаторов.

Способ 1: Прямое присваивание в цикле обхода выборки

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

Посмотрим на пример реализации такого кода:


Выборка = Справочники.Номенклатура.ВыбратьИерархически();

Пока Выборка.Следующий() Цикл
    // Добавляем новую строку в таблицу значений ТЗРезультаты
    НоваяСтрокаТЗ = ТЗРезультаты.Добавить();      
    
    // Явно сопоставляем реквизит справочника колонке таблицы
    НоваяСтрокаТЗ.Наименование = Выборка.Наименование;
    НоваяСтрокаТЗ.Артикул = Выборка.Артикул;
    
    // Можно также выводить отладочные сообщения
    Сообщить("Добавлен элемент: " + Выборка.Наименование);    
КонецЦикла;

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

Способ 2: Использование метода ЗаполнитьЗначенияСвойств

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

Важное условие: чтобы данные из Выборки попали в НовуюСтрокуТЗ, имена колонок в таблице значений должны строго совпадать с именами реквизитов справочника (например, Наименование, Код, Родитель).

Разберем по шагам правильное использование этого метода:

  1. Создаем таблицу значений с колонками, чьи имена идентичны реквизитам справочника.
  2. Запускаем цикл обхода.
  3. Вызываем метод ЗаполнитьЗначенияСвойств(Приемник, Источник).

Выборка = Справочники.Номенклатура.Выбрать();

Пока Выборка.Следующий() Цикл
    НоваяСтрока = ТЗРезультаты.Добавить();
    // Все совпадающие поля будут заполнены автоматически
    ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
КонецЦикла;

Если в ТЗРезультаты есть колонка Наименование, она заполнится. Если же колонка называется НазваниеОбъекта, она останется пустой, так как в объекте Выборка такого свойства нет.

Способ 3: Использование запросов — современный и эффективный подход

Как отмечают опытные разработчики, использование динамических выборок (метод Выбрать()) в современных конфигурациях считается менее предпочтительным, чем использование запросов. Выясним, какие преимущества дают нам запросы:

Посмотрим на пример выгрузки данных справочника в таблицу значений через запрос:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Номенклатура.Наименование КАК Наименование,
    |   Номенклатура.Код КАК Код,
    |   Номенклатура.Артикул КАК Артикул
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |   Номенклатура.ЭтоГруппа = ЛОЖЬ"; // Выбираем только элементы

РезультатЗапроса = Запрос.Выполнить();

// Таблица значений будет создана автоматически с нужными колонками
ТЗРезультаты = РезультатЗапроса.Выгрузить();

Особенности работы с иерархией

Поскольку справочник Номенклатура является иерархическим, обычная Таблица значений может быть не самым удобным инструментом, так как она представляет собой «плоский» список. Если вам необходимо сохранить визуальную структуру папок и подпапок, лучше использовать объект Дерево значений.

При использовании запросов для получения иерархии в языке запросов 1С применяется конструкция ИТОГИ ПО ... ИЕРАРХИЯ. После этого результат запроса выгружается не в таблицу, а в дерево:


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

Важные нюансы для Управляемых форм

Проанализируем ситуацию, если вы работаете в режиме управляемого приложения. В этом случае ТаблицаЗначений является серверным типом данных. Чтобы отобразить её на форме, необходимо выполнить следующие действия:

  1. Создать реквизит формы с типом ТаблицаЗначений.
  2. На сервере заполнить программную таблицу значений.
  3. Использовать метод ЗначениеВРеквизитФормы(ВашаТЗ, "ИмяРеквизитаФормы") для отображения данных пользователю.

Без этого шага данные в памяти сервера будут существовать, но пользователь увидит пустую таблицу на своем экране.

Подведем итог: для корректного заполнения таблиц всегда проверяйте соответствие имен колонок и реквизитов. Старайтесь отдавать предпочтение запросам, так как это упрощает код и повышает скорость работы системы. Если же вы используете метод ЗаполнитьЗначенияСвойств, убедитесь, что структура вашей таблицы полностью повторяет структуру источника данных.

← На главную