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

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

При разработке внешних обработок часто возникает задача: найти объект в справочнике (например, Номенклатура) и вывести его реквизиты в табличный документ на форме. Однако начинающие разработчики часто сталкиваются с тем, что код не выдает ошибок, но и данные в таблице не появляются. В этой статье мы подробно разберем, почему так происходит, исправим типичные ошибки в логике поиска и научимся правильно заполнять ТабличныйДокумент.

Разбор типичных ошибок в коде поиска

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


СтрокаКод = "000000005";
ААА = Справочники.Номенклатура;
НайденнаяНомен = Справочники.Номенклатура.НайтиПоКоду(СтрокаКод);
Если ААА = НайденнаяНомен.Пустая() Тогда
    Сообщить("Элемент не найден!");
Иначе
    // Попытка записи в таблицу...
КонецЕсли;

В этом фрагменте скрыто сразу несколько серьезных проблем. Выясним их причины:

  1. Сравнение менеджера со значением Булево. В строке Если ААА = НайденнаяНомен.Пустая() переменная ААА является ссылкой на менеджер справочника, а НайденнаяНомен.Пустая() возвращает Истина или Ложь. Сравнение объекта с логическим типом всегда будет ложным, и код пойдет по неверной ветке.
  2. Метод проверки на пустоту. Для ссылки, полученной через НайтиПоКоду, правильно использовать либо метод Пустая(), либо сравнивать её с предопределенной пустой ссылкой справочника.
  3. Длина кода. Код 000000005 содержит лидирующие нули. Если в конфигурации тип кода — числовой или длина кода меньше 9 символов, поиск вернет пустую ссылку.

Чтобы исправить проверку, воспользуемся правильным синтаксисом:


НайденнаяНомен = Справочники.Номенклатура.НайтиПоКоду(СтрокаКод);
Если НайденнаяНомен.Пустая() Тогда
    Сообщить("Номенклатура с кодом " + СтрокаКод + " не найдена.");
    Возврат;
КонецЕсли;

Проблема нулевой высоты таблицы

Следующий важный момент — вывод данных. Рассмотрим ошибку в цикле, который должен заполнять строки:


ВысотаТаблицы = ЭлементыФормы.ТабДок.ВысотаТаблицы;
Для строка = 1 ПО ВысотаТаблицы Цикл 
    // Заполнение...
КонецЦикла;

Проанализируем ситуацию: если ваш ТабличныйДокумент (с именем ТабДок) на форме изначально пуст, то свойство ВысотаТаблицы равно 0. В этом случае цикл Для строка = 1 ПО 0 не выполнится ни разу. Это главная причина, почему данные не отображаются, хотя объект в базе найден успешно.

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

Метод 1: Прямое заполнение ячеек (простой способ)

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


// Определяем номер новой строки
НомерСтроки = ЭлементыФормы.ТабДок.ВысотаТаблицы + 1;

// Обращаемся к ячейкам по координатам (Строка, Колонка)
ЭлементыФормы.ТабДок.Область(НомерСтроки, 1).Текст = НайденнаяНомен.Код;
ЭлементыФормы.ТабДок.Область(НомерСтроки, 2).Текст = НайденнаяНомен.Наименование;

Важный нюанс: Использование метода Область() более эффективно, чем связка ПолучитьОбласть("R1C1").ТекущаяОбласть. Это сокращает количество обращений к памяти и делает код чище.

Метод 2: Использование макета (профессиональный подход)

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

  1. Перейдем в дерево метаданных нашей обработки и создадим новый Макет с типом "Табличный документ".
  2. В макете выделим строку, назовем область (например, СтрокаДанных).
  3. В ячейках этой области укажем параметры: Код и Наименование (в свойствах ячейки установим значение "Параметр").

Теперь напишем код для вывода этой области в наш основной документ на форме:


// Получаем макет обработки
Макет = ПолучитьМакет("МакетДанных");

// Получаем именованную область из макета
ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаДанных");

// Заполняем параметры области данными из найденной ссылки
ОбластьСтрока.Параметры.Код = НайденнаяНомен.Код;
ОбластьСтрока.Параметры.Наименование = НайденнаяНомен.Наименование;

// Выводим готовую область в табличный документ на форме
ЭлементыФормы.ТабДок.Вывести(ОбластьСтрока);

Этот способ автоматически решает проблему высоты таблицы: метод Вывести() сам добавляет новую строку в конец документа и переносит все форматирование из макета.

Когда лучше использовать Табличную часть?

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

Рекомендуем использовать Табличную часть:

Для Табличной части код добавления данных выглядел бы гораздо проще:


НоваяСтрока = ТЧНоменклатура.Добавить();
НоваяСтрока.Номенклатура = НайденнаяНомен;
НоваяСтрока.Код = НайденнаяНомен.Код;

Оптимизация и производительность

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

Таким образом, мы разобрали основные причины, по которым данные из справочника могут не попадать в таблицу. Главное — следить за типами данных при сравнении (ПустаяСсылка), правильно определять индекс строки для записи и отдавать предпочтение работе через макеты для создания качественного интерфейса.

← На главную