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