Почему не выводится колонка с данными в печатной форме 1С и как это исправить

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

Разработка печатных форм — одна из самых частых задач программиста 1С. Казалось бы, алгоритм прост: создать запрос, получить данные, выгрузить их в макет. Однако на практике мы часто сталкиваемся с ситуацией, когда одна или несколько колонок остаются пустыми, хотя код написан без синтаксических ошибок. В этой статье мы детально разберем ситуацию, когда в отчете не отображается колонка с числовыми данными, проанализируем возможные причины — от ошибок в запросе до настроек свойств ячеек в макете — и найдем оптимальные пути решения.

Анализ исходного кода и структуры запроса

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


Запрос = Новый Запрос; 
Запрос.УстановитьПараметр("Сотрудник", ЭтотОбъект.Сотрудник); 
Запрос.УстановитьПараметр("Ссылка", ЭтотОбъект.Ссылка); 
Запрос.Текст = "ВЫБРАТЬ 
| ТЧ.Ссылка КАК Ссылка, 
| ТЧ.Ссылка.Сотрудник КАК Сотрудник, 
| ТЧ.НомерСтроки КАК НомерСтроки, 
| ТЧ.СодержаниеРаботы КАК СодержаниеРаботы, 
| ТЧ.КоличествоЧасов КАК КоличествоЧасов, 
| ТЧ.Контрагент КАК Контрагент, 
| ТЧ.КолвоРабочихДней КАК КолвоРабочихДней, 
| ТЧ.ПроектРабота КАК ПроектРабота 
|ИЗ 
| Документ.ивсУчетРабочегоВремениЗаМесяц.ПроектыРаботы КАК ТЧ 
|ГДЕ 
| ТЧ.Ссылка = &Ссылка 
| И ТЧ.Ссылка.Сотрудник = &Сотрудник"; 
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Первое, на что стоит обратить внимание — это условие связи в секции ГДЕ. Здесь используется фильтрация по ссылке документа и по сотруднику из шапки этого документа. Если в табличной части ПроектыРаботы содержатся данные, которые по какой-то причине не соответствуют сотруднику, указанному в шапке (хотя логически они должны совпадать), запрос может вернуть пустой результат или исключить нужные строки. Однако, если строки выводятся, а пуста только одна колонка КоличествоЧасов, причину нужно искать глубже.

Проверка свойств ячейки в макете табличного документа

Часто проблема кроется не в программном коде, а в настройках самого макета (таблицы), который мы получаем методом ПолучитьМакет. Даже если вы передаете верное значение в параметр области, 1С может его игнорировать.

Выясним основные причины на уровне макета:

  1. Тип заполнения ячейки: Это самая распространенная ошибка. Откройте макет в конфигураторе, выделите ячейку, куда должно выводиться значение КоличествоЧасов, и откройте палитру свойств (F4). Проверьте свойство «Заполнение». Если там установлено значение Текст, то программа будет отображать только то слово, которое написано в ячейке, игнорируя передаваемый параметр. Для вывода данных необходимо установить значение «Параметр».
  2. Соответствие имен: Имя параметра в макете должно символ в символ совпадать с тем, что вы пишете в коде после точки от свойства Параметры. Например, если в коде написано ОбластьДетали.Параметры.КоличествоЧасов, то и в макете в поле «Параметр» должно стоять КоличествоЧасов. Ошибки в регистре или лишние пробелы недопустимы.
  3. Формат вывода: Проверьте свойство «Формат» у ячейки. Если там задано условие ЧЗ=0 (не выводить нулевые значения), а из запроса приходит 0, то ячейка будет выглядеть абсолютно пустой, создавая иллюзию ошибки.

Использование отладчика для поиска истины

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

Установим точку останова на строке Выборка.Следующий() внутри цикла Пока. Когда выполнение программы прервется, добавим выражение Выборка.КоличествоЧасов в табло (Ctrl+Alt+W). Если отладчик показывает значение 0 или NULL, значит проблема не в печатной форме, а в данных самого документа.

Проанализируем ситуацию, если данные в базе есть, но запрос их не видит:

Оптимизация кода вывода данных

Разберем, как сделать код более надежным и читаемым. В исходном примере мы видели дублирование строк и получение области внутри цикла, что снижает производительность. Перепишем этот фрагмент правильно:


// Получаем область макета один раз до начала цикла
ОбластьДетали = Макет.ПолучитьОбласть("Детали");

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

Использование функции ЗаполнитьЗначенияСвойств позволяет автоматически сопоставить имена колонок запроса с именами параметров в области макета. Это уменьшает вероятность опечаток при ручном присваивании каждого параметра.

Обработка пустых значений (NULL)

В языке запросов 1С, если данные в поле отсутствуют, запрос возвращает значение NULL. При попытке вывода NULL в ячейку макета, она останется пустой. Чтобы гарантированно видеть хотя бы нулевое значение, рекомендуется модифицировать текст запроса, используя функцию ЕСТЬNULL. Посмотрим на пример:


| ВЫБРАТЬ
|   ЕСТЬNULL(ТЧ.КоличествоЧасов, 0) КАК КоличествоЧасов,
|   ТЧ.СодержаниеРаботы КАК СодержаниеРаботы
| ИЗ ...

Эта несложная доработка застрахует вас от "пропадания" данных в тех случаях, когда значение в базе просто не заполнено. Вы увидите 0, что сразу даст понять: код работает, но данных в документе нет.

Заключение

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

← На главную