Как корректно вывести справочник Номенклатура в табличный документ в 1С 7.7

Программист 1С v7.7
← На главную

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

Анализ проблемы: почему выводится только заголовок?

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


ТекстЗапроса = "
|Артикул = Справочник.Номенклатура.Артикул; 
|БазоваяЕдиница = Справочник.Номенклатура.БазоваяЕдиница;
|Весовой = Справочник.Номенклатура.Весовой;
|"; 

В данном случае проблема заключается в отсутствии инструкции Группировка. В языке запросов 1С 7.7, если вы не указываете группировку, система не создает выборку, которую можно обойти в цикле Пока Запрос.Группировка() = 1. Выборка остается пустой, и цикл просто не выполняется. Для исправления ситуации необходимо обязательно добавить переменную, по которой будет идти группировка (обычно это сам элемент справочника), и указать ее в тексте запроса.

Корректное построение запроса с группировкой

Рассмотрим правильный вариант формирования текста запроса. Нам необходимо получить ссылку на сам элемент справочника (используя ТекущийЭлемент) и сгруппировать результат по нему. Проанализируем исправленный код:


Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    Запрос = СоздатьОбъект("Запрос");
    
    // Обязательно добавляем поле Товар и инструкцию Группировка
    ТекстЗапроса = " 
    |Товар = Справочник.Номенклатура.ТекущийЭлемент;
    |Артикул = Справочник.Номенклатура.Артикул; 
    |БазоваяЕдиница = Справочник.Номенклатура.БазоваяЕдиница; 
    |Весовой = Справочник.Номенклатура.Весовой; 
    |Группировка Товар без групп; // 'без групп' исключает папки из списка
    |";

    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица"); // Имя макета в дереве метаданных
    Таб.ВывестиСекцию("Заголовок");

    // Теперь цикл по группировке будет работать корректно
    Пока Запрос.Группировка("Товар") = 1 Цикл
        Таб.ВывестиСекцию("Номенклатура");
    КонецЦикла;

    Таб.ТолькоПросмотр(1); // Запрещаем редактирование для пользователя
    Таб.Показать("Список номенклатуры", "");
КонецПроцедуры

Обратим внимание на важный нюанс: инструкция Группировка Товар без групп; позволяет вывести плоский список элементов. Если же вам нужно сохранить иерархию (выводить папки), используйте просто Группировка Товар;.

Настройка макета: параметры и выражения в ячейках

Частой ошибкой является неправильное отображение данных в самой таблице, когда вместо значений (например, артикула) в ячейках печатается текст вида Запрос.Артикул. Это происходит из-за неверной настройки свойств ячейки в редакторе таблиц. Выясним причину и разберем варианты решения.

В 1С 7.7 у каждой ячейки есть свойство «Контроль» (Тип заполнения), которое определяет, как интерпретировать содержимое:

  1. Текст: Все, что написано в ячейке, выводится буквально. Если написать Запрос.Артикул, то именно эта строка и появится в отчете.
  2. Выражение: Содержимое ячейки воспринимается как код на языке 1С. В этом случае в ячейке нужно написать Запрос.Артикул без лишних знаков, и система вычислит значение переменной из модуля.
  3. Шаблон: Позволяет комбинировать статичный текст и переменные. Переменные в этом случае заключаются в квадратные скобки. Пример: Арт.: [Запрос.Артикул].

Важный совет: Чтобы данные выводились корректно, убедитесь, что для ячеек в секции "Номенклатура" установлен тип «Выражение». В 1С 7.7 не используются угловые скобки < > для обозначения параметров внутри кода ячейки, если выбран тип «Выражение».

Ошибки в синтаксисе методов

В процессе написания кода легко допустить опечатки, которые приводят к ошибке «Поле агрегатного объекта не обнаружено». Рассмотрим самые распространенные случаи:

Альтернатива: Использование объектной модели (ВыбратьЭлементы)

Если вам нужно просто вывести список справочника без сложных условий и расчетов, использование объекта Запрос может быть избыточным. Проанализируем более простой и быстрый способ через метод ВыбратьЭлементы(). Это особенно актуально для файловых баз (DBF), где прямая выборка работает быстрее.


Процедура СформироватьНапрямую()
    Перем Спр, Таб;
    Спр = СоздатьОбъект("Справочник.Номенклатура");
    Таб = СоздатьОбъект("Таблица");
    Таб.ВывестиСекцию("Заголовок");
    
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
        // Проверяем, не является ли элемент группой (папкой)
        Если Спр.ЭтоГруппа() = 1 Тогда
            Продолжить; // Пропускаем папки
        КонецЕсли;
        
        // В макете в этом случае в ячейках должно быть написано: Спр.Артикул
        Таб.ВывестиСекцию("Номенклатура");
    КонецЦикла;
    
    Таб.Показать("Печать напрямую");
КонецПроцедуры

Профессиональное оформление отчета

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

Подводя итог, отметим: для успешного вывода справочника в 1С 7.7 необходимо четко следить за наличием группировок в запросах, правильно называть секции макета и внимательно выбирать тип заполнения ячеек ("Выражение" или "Шаблон"). Эти базовые принципы позволят вам создавать надежные и быстрые отчеты любой сложности.

← На главную