К статье
Практический материал

Разработка и Конфигурация · 10 мин

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

Способы проверить табличный документ 1С на пустоту: ВысотаТаблицы, ШиринаТаблицы, НайтиТекст, анализ областей. Примеры кода, типичные ошибки и FAQ.

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

Прямого метода «Пустой()» у табличного документа нет, поэтому проверка выполняется косвенно — через размеры документа, наличие текста в ячейках или количество заполненных областей. Выбор способа зависит от того, что считать «пустотой»: отсутствие любых ячеек вообще, отсутствие текста или отсутствие данных при выведенной шапке отчёта.

Ниже разобраны рабочие способы проверки с примерами кода на встроенном языке 1С, их ограничения и типичные ошибки, которые приводят к ложным результатам.

Проверка через ВысотаТаблицы и ШиринаТаблицы

Самый простой и быстрый способ — свойства ВысотаТаблицы и ШиринаТаблицы. Они возвращают количество строк и колонок, реально занятых в документе. Если в документ ничего не выводилось, оба значения равны нулю.

Функция ТабличныйДокументПуст(ТабДок)

Если ТабДок.ВысотаТаблицы = 0

Или ТабДок.ШиринаТаблицы = 0 Тогда

Возврат Истина;

КонецЕсли;

Возврат Ложь;

КонецФункции

Метод подходит, когда документ формируется «с нуля» и любой вывод (хотя бы одна ячейка) означает, что документ не пуст. Проверка выполняется мгновенно, без перебора ячеек, поэтому её безопасно вызывать даже для больших документов.

Ограничение очевидно: если в документ выводится макет с постоянной шапкой, высота будет больше нуля даже тогда, когда данных нет. Для отчётов, где шаблон выводится всегда, этот способ даёт ложный результат «не пуст».

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

Когда документ содержит служебные области (шапку, рамки, подписи), проверяют не размеры, а содержимое ячеек. Универсальный вариант — перебор ячеек и анализ свойства Текст:

Функция ЕстьТекстВДокументе(ТабДок)

Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл

Для НомерКолонки = 1 По ТабДок.ШиринаТаблицы Цикл

Область = ТабДок.Область(НомерСтроки, НомерКолонки);

Если Не ПустаяСтрока(Область.Текст) Тогда

Возврат Истина;

КонецЕсли;

КонецЦикла;

КонецЦикла;

Возврат Ложь;

КонецФункции

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

Обратите внимание: ячейки, содержащие только пробелы или неразрывные пробелы, функция ПустаяСтрока корректно распознаёт как пустые, поэтому дополнительная обрезка строки не требуется.

Поиск конкретного значения методом НайтиТекст

Если критерий «непустоты» — наличие определённых данных (например, строки с итогом, номера документа, наименования контрагента), удобнее метод НайтиТекст. Он ищет заданную строку в документе и возвращает область или Неопределено.

ОбластьПоиска = ТабДок.НайтиТекст("Итого");

Если ОбластьПоиска = Неопределено Тогда

// Документ не содержит итоговой строки — считаем пустым

КонецЕсли;

Метод полезен для отчётов, где строка данных всегда содержит известный маркер. Но он не подходит как универсальная проверка пустоты: отсутствие конкретной строки не означает отсутствие данных вообще.

Сравнение способов проверки

ВысотаТаблицы = 0

Самый быстрый. Подходит, когда документ формируется полностью с нуля. Не работает, если всегда выводится шаблон.

Перебор ячеек с проверкой Текст

Универсальный, но медленный на больших документах. Корректно отличает оформление от данных.

НайтиТекст

Ищет конкретный маркер. Хорош для отчётов с известной структурой, не универсален.

Проверка данных до вывода

Самый надёжный: проверяется не документ, а выборка/таблица значений до формирования печатной формы.

Проверка данных до формирования документа

На практике самый надёжный подход — вообще не проверять готовый табличный документ, а проверять источник данных до вывода. Если печатная форма строится по запросу или таблице значений, достаточно проверить Выборка.Количество(), РезультатЗапроса.Пустой() или ТаблицаЗначений.Количество() = 0.

РезультатЗапроса = Запрос.Выполнить();

Если РезультатЗапроса.Пустой() Тогда

Сообщить("Нет данных для формирования печатной формы");

Возврат;

КонецЕсли;

Такой подход исключает двойную работу: не нужно формировать документ, который потом окажется пустым, и не нужно анализировать ячейки. Кроме того, пользователь получает понятное сообщение вместо пустого листа.

Проверку готового документа стоит оставить для случаев, когда документ приходит «извне» — например, сформирован другой процедурой, получен из внешней компоненты или объединён из нескольких частей.

Маршрут решения

Как выбрать способ

Документ формируется с нуля и любой вывод означает данныеПроверяйте ВысотаТаблицы = 0 — это быстро и достаточно
В документе всегда есть шапка или служебные областиПеребирайте ячейки с проверкой Текст или ищите маркер через НайтиТекст
Данные доступны до формирования документаПроверяйте результат запроса или таблицу значений до вывода
Документ приходит из внешнего источникаКомбинируйте проверку размеров и наличия текста

Проверка на тонком клиенте и в управляемых формах

В управляемых формах реквизит формы типа ТабличныйДокумент доступен на клиенте, и свойства ВысотаТаблицы и ШиринаТаблицы у него можно читать. Однако полноценная работа с табличным документом (вывод областей, макетов) выполняется на сервере.

Типовой шаблон: на сервере формируется документ, там же выполняется проверка на пустоту, и если документ пуст — на клиент возвращается признак с сообщением, а не пустой результат. Это уменьшает трафик и упрощает логику формы.

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

bsl
&НаСервере
Процедура СформироватьНаСервере()
	ТабДок = СформироватьПечатнуюФорму();
	Если ТабДок.ВысотаТаблицы = 0 Тогда
		ВызватьИсключение "Нет данных для печатной формы";
	КонецЕсли;
	РезультатДокумент = ТабДок;
КонецПроцедуры

Типичные ошибки при проверке

Частая ошибка — проверять только ВысотаТаблицы для документа, в который всегда выводится макет-заголовок. Проверка показывает «не пусто», пользователь открывает форму с одной шапкой и считает это сбоем программы.

Вторая ошибка — сравнение текста ячейки с пустой строкой через = "" вместо ПустаяСтрока(). Ячейка с пробелом пройдёт такую проверку как «заполненная», и документ с одними пробелами будет признан непустым.

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

Типичные ошибки
01
Проверка только ВысотаТаблицы при постоянно выводимой шапке — ложный результат «не пусто»
02
Сравнение Текст = "" вместо ПустаяСтрока() — ячейки с пробелами считаются заполненными
03
Полный перебор ячеек большого документа без ограничения диапазона — замедление работы
04
Попытка вывести области и работать с макетом на тонком клиенте — ошибки исполнения
05
Формирование документа ради проверки, когда можно проверить данные до вывода

Проверка результата и границы применения

Чтобы убедиться, что проверка работает правильно, протестируйте её на трёх наборах: полностью пустом документе, документе только с шапкой и документе с реальными данными. Результат должен быть «пуст», «пуст» (по критерию данных) и «не пуст» соответственно.

Учитывайте, что объединённые ячейки, картинки и диаграммы в табличном документе не содержат текста. Если «непустота» документа определяется наличием изображения или диаграммы, текстовые проверки не помогут — ориентируйтесь на размеры документа или на данные-источники.

Для регламентных операций (автоматическая рассылка отчётов, формирование пакета документов) сочетайте оба уровня: проверку данных до формирования и контрольную проверку готового документа. Это защищает от ситуации, когда данные есть, но из-за ошибки в макете в документ ничего не вывелось.

Контрольные точки

Как проверить результат

Пустой документ без вывода
Норма

ВысотаТаблицы = 0 и ШиринаТаблицы = 0

Тревожный признак

Высота больше нуля — значит, что-то выводится раньше проверки

Документ только с шапкой
Норма

Перебор ячеек с Текст не находит данных в области строк данных

Тревожный признак

Проверка по размеру сообщает «не пусто»

Документ с данными
Норма

Проверка возвращает «не пуст», печатная форма открывается

Тревожный признак

Проверка ошибочно блокирует вывод — ищите пробелы или неверный диапазон

Частые вопросы

Есть ли у табличного документа метод «Пустой()»?

Нет, такого метода не существует. Проверка выполняется косвенно: через свойства ВысотаТаблицы и ШиринаТаблицы, перебор текста ячеек или поиск конкретных значений методом НайтиТекст.

Почему ВысотаТаблицы больше нуля, хотя данных нет?

Значит, в документ что-то выводится помимо данных: шапка макета, служебная область, колонтитул или рамка. Проверяйте не размеры, а наличие текста в ячейках области данных, либо проверяйте источник данных до вывода.

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

Реквизит формы типа ТабличныйДокумент на клиенте доступен для чтения: можно проверить ВысотаТаблицы и ШиринаТаблицы. Формирование документа и сложный анализ ячеек лучше выполнять на сервере.

Что быстрее: перебор ячеек или проверка размеров?

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

Как не показывать пользователю пустую печатную форму?

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

Учитываются ли картинки и диаграммы при проверке текста?

Нет. Перебор ячеек анализирует только текстовое содержимое. Если документ состоит из изображения или диаграммы, ориентируйтесь на размеры документа или на наличие данных-источников.

Итог

Что важно запомнить

Прямого метода проверки пустоты у табличного документа нет. Для документа «с нуля» достаточно проверить ВысотаТаблицы = 0; для документов с постоянной шапкой — перебирать текст ячеек или искать маркер. Самый надёжный вариант — проверять данные до формирования документа и не выводить пустую форму вовсе.