Работа с печатными формами и отчетами в платформе 1С:Предприятие 7.7 существенно отличается от более современных версий. Ошибки при формировании табличного документа часто связаны с неправильным построением запроса или неверной настройкой самого макета (таблицы). Рассмотрим подробно, как правильно организовать вывод данных из справочника Номенклатура, разберем типичные ошибки и изучим несколько способов реализации этой задачи.
Разберем ситуацию, когда при выполнении программного кода в табличный документ попадает только шапка отчета, а строки с товарами отсутствуют. Проанализируем типичный фрагмент кода, в котором допущена критическая ошибка в тексте запроса:
ТекстЗапроса = "
|Артикул = Справочник.Номенклатура.Артикул;
|БазоваяЕдиница = Справочник.Номенклатура.БазоваяЕдиница;
|Весовой = Справочник.Номенклатура.Весовой;
|";
В данном случае проблема заключается в отсутствии инструкции Группировка. В языке запросов 1С 7.7, если вы не указываете группировку, система не создает выборку, которую можно обойти в цикле Пока Запрос.Группировка() = 1. Выборка остается пустой, и цикл просто не выполняется. Для исправления ситуации необходимо обязательно добавить переменную, по которой будет идти группировка (обычно это сам элемент справочника), и указать ее в тексте запроса.
Рассмотрим правильный вариант формирования текста запроса. Нам необходимо получить ссылку на сам элемент справочника (используя ТекущийЭлемент) и сгруппировать результат по нему. Проанализируем исправленный код:
Процедура Сформировать()
Перем Запрос, ТекстЗапроса, Таб;
Запрос = СоздатьОбъект("Запрос");
// Обязательно добавляем поле Товар и инструкцию Группировка
ТекстЗапроса = "
|Товар = Справочник.Номенклатура.ТекущийЭлемент;
|Артикул = Справочник.Номенклатура.Артикул;
|БазоваяЕдиница = Справочник.Номенклатура.БазоваяЕдиница;
|Весовой = Справочник.Номенклатура.Весовой;
|Группировка Товар без групп; // 'без групп' исключает папки из списка
|";
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица"); // Имя макета в дереве метаданных
Таб.ВывестиСекцию("Заголовок");
// Теперь цикл по группировке будет работать корректно
Пока Запрос.Группировка("Товар") = 1 Цикл
Таб.ВывестиСекцию("Номенклатура");
КонецЦикла;
Таб.ТолькоПросмотр(1); // Запрещаем редактирование для пользователя
Таб.Показать("Список номенклатуры", "");
КонецПроцедуры
Обратим внимание на важный нюанс: инструкция Группировка Товар без групп; позволяет вывести плоский список элементов. Если же вам нужно сохранить иерархию (выводить папки), используйте просто Группировка Товар;.
Частой ошибкой является неправильное отображение данных в самой таблице, когда вместо значений (например, артикула) в ячейках печатается текст вида Запрос.Артикул. Это происходит из-за неверной настройки свойств ячейки в редакторе таблиц. Выясним причину и разберем варианты решения.
В 1С 7.7 у каждой ячейки есть свойство «Контроль» (Тип заполнения), которое определяет, как интерпретировать содержимое:
Запрос.Артикул, то именно эта строка и появится в отчете.Запрос.Артикул без лишних знаков, и система вычислит значение переменной из модуля.Арт.: [Запрос.Артикул].Важный совет: Чтобы данные выводились корректно, убедитесь, что для ячеек в секции "Номенклатура" установлен тип «Выражение». В 1С 7.7 не используются угловые скобки < > для обозначения параметров внутри кода ячейки, если выбран тип «Выражение».
В процессе написания кода легко допустить опечатки, которые приводят к ошибке «Поле агрегатного объекта не обнаружено». Рассмотрим самые распространенные случаи:
ВывестиСекцю() — пропущена буква "и". Правильно: ВывестиСекцию().Таб.ВывестиСекцию("Номенклатура"), программа выдаст ошибку. Имена должны совпадать полностью, включая регистр и отсутствие лишних пробелов.Если вам нужно просто вывести список справочника без сложных условий и расчетов, использование объекта Запрос может быть избыточным. Проанализируем более простой и быстрый способ через метод ВыбратьЭлементы(). Это особенно актуально для файловых баз (DBF), где прямая выборка работает быстрее.
Процедура СформироватьНапрямую()
Перем Спр, Таб;
Спр = СоздатьОбъект("Справочник.Номенклатура");
Таб = СоздатьОбъект("Таблица");
Таб.ВывестиСекцию("Заголовок");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
// Проверяем, не является ли элемент группой (папкой)
Если Спр.ЭтоГруппа() = 1 Тогда
Продолжить; // Пропускаем папки
КонецЕсли;
// В макете в этом случае в ячейках должно быть написано: Спр.Артикул
Таб.ВывестиСекцию("Номенклатура");
КонецЦикла;
Таб.Показать("Печать напрямую");
КонецПроцедуры
Чтобы сделать работу пользователя с отчетом удобнее, рекомендуется использовать дополнительные методы объекта Таблица:
Таб.Опции(0,0,5,0) позволит закрепить первые 5 строк (если ваша шапка занимает столько), чтобы при прокрутке длинного списка номенклатуры заголовки колонок всегда были перед глазами.Таб.ПараметрыСтраницы(1, 100, 1) можно программно задать ландшафтную ориентацию и масштаб по ширине страницы, чтобы таблица не "разрывалась" при печати.Формат() непосредственно в ячейке макета, например: Формат(Запрос.Весовой, "Ч010.3").Подводя итог, отметим: для успешного вывода справочника в 1С 7.7 необходимо четко следить за наличием группировок в запросах, правильно называть секции макета и внимательно выбирать тип заполнения ячеек ("Выражение" или "Шаблон"). Эти базовые принципы позволят вам создавать надежные и быстрые отчеты любой сложности.