Работа с табличными частями в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются как разработчики, так и пользователи. Пустая табличная часть может стать причиной ошибок в отчетах, некорректной работы документов или даже сбоев в бизнес-процессах. Например, при попытке провести документ с незаполненной спецификацией система может выдать ошибку, а пользователь — потерять время на поиск проблемы.
В этой статье мы разберем 7 различных способов проверки табличных частей на пустоту: от визуальных методов для новичков до программных решений для опытных специалистов. Вы узнаете, как избежать типичных ошибок, какие методы наиболее эффективны в разных сценариях, и получите готовые кодовые примеры для внедрения в свои конфигурации. Особое внимание уделим нюансам работы с управляемыми формами и обычными формами, а также рассмотрим случаи, когда стандартные методы могут дать ложный результат.
Материал будет полезен как начинающим 1С-программистам, так и опытным разработчикам, которые хотят оптимизировать свой код. Все примеры тестировались на актуальных версиях платформы 1С:Предприятие 8.3 (включая последние релизы 2026 года).
1. Визуальная проверка: когда достаточно взгляда
Самый простой способ определить, пустая ли табличная часть — посмотреть на неё в интерфейсе. Этот метод подходит для пользователей, которые не имеют доступа к конфигуратору или не умеют писать код. Однако даже здесь есть нюансы, о которых многие не знают.
В управляемых формах пустая табличная часть обычно отображается как серый прямоугольник с надписью "Добавьте новую строку" или аналогичной. В обычных формах (устаревший интерфейс) — это просто пустая сетка без данных. Но будьте внимательны: иногда в таблице могут оставаться "невидимые" строки с пустыми значениями, которые визуально не отличаются от действительно пустой таблицы. Такое часто происходит после программного удаления строк или при ошибках заполнения.
- 👁️ Управляемая форма: Ищите подсказку "Добавьте новую строку" или кнопку "+" внизу таблицы. Если их нет — возможно, таблица скрыта через настройки видимости.
- 📊 Обычная форма: Проверьте, есть ли хотя бы одна серая строка без данных. В некоторых конфигурациях пустые строки могут отображаться как заполненные (например, с дефолтными значениями).
- ⚙️ Настройки отображения: В некоторых случаях строки могут быть скрыты фильтром. Попробуйте сбросить фильтрацию через меню таблицы.
⚠️ Внимание: Визуальная проверка не гарантирует 100% точности. Например, в таблице может оставаться одна строка с пустыми полями, которую система воспринимает как заполненную. Это актуально для документов, где табличная часть обязательна к заполнению (например, "Товары" в документе "Реализация").
2. Стандартный метод платформы: Количество()
Для программной проверки в 1С существует встроенный метод Количество(), который возвращает количество строк в табличной части. Это самый надёжный способ, если вам нужно получить точный результат в коде.
Синтаксис простой:
Если Документ.Товары.Количество() = 0 Тогда
// Табличная часть пустая
КонецЕсли;
Этот метод работает и в управляемых формах, и в обычных формах, а также при обращении к табличной части напрямую из модуля объекта. Однако есть важные нюансы:
- 🔄 Производительность: Метод
Количество()работает быстро, но если таблица содержит миллионы строк, лучше использоватьПустая()(о нём ниже). - 📌 Удаленные строки: В некоторых конфигурациях строки могут помечаться на удаление, но физически оставаться в таблице.
Количество()учитывает и такие строки. - 🔒 Права доступа: Если у пользователя нет прав на чтение табличной части, метод вернёт 0, даже если строки есть.
| Метод | Работает в управляемых формах | Работает в обычных формах | Учитывает помеченные на удаление | Быстродействие |
|---|---|---|---|---|
Количество() |
✅ Да | ✅ Да | ✅ Да | ⚡ Быстро (но медленнее Пустая() для больших таблиц) |
Пустая() |
✅ Да | ✅ Да | ❌ Нет | ⚡⚡ Очень быстро |
| Визуальная проверка | ✅ Да | ✅ Да | ❓ Зависит от конфигурации | ⏳ Медленно (требует действий пользователя) |
⚠️ Внимание: В некоторых типовых конфигурациях (например, 1С:ERP или 1С:УТ 11) методКоличество()может возвращать некорректные значения для табличных частей с иерархией (например, "Структура подчинённости" в документе "Заказ клиента"). В таких случаях лучше использоватьПустая().
3. Метод Пустая(): оптимальное решение для большинства задач
Метод Пустая() — это специализированная функция платформы 1С:Предприятие, которая возвращает Истина, если табличная часть не содержит ни одной строки (включая помеченные на удаление). Это наиболее универсальный и рекомендуемый способ проверки.
Пример использования:
Если Документ.Товары.Пустая() Тогда
Сообщить("Табличная часть пустая!");
Иначе
Сообщить("В таблице есть строки.");
КонецЕсли;
Преимущества метода Пустая():
- ⚡ Мгновенная работа: Не перебирает все строки, а проверяет только фактическое наличие данных.
- 🛡️ Учитывает права доступа: Если у пользователя нет прав на просмотр табличной части, вернёт
Истина. - 🔄 Работает с иерархическими таблицами: В отличие от
Количество(), корректно обрабатывает вложенные структуры.
Однако есть и ограничения. Например, если в таблице есть строки, но все они помечены на удаление, Пустая() вернёт Ложь, тогда как Количество() покажет ненулевое значение. Это важно учитывать при работе с документами, где удаление строк — часть бизнес-логики.
Если вам нужно проверить табличную часть на наличие НЕпустых строк (т.е. строк с хотя бы одним заполненным полем), используйте комбинацию Пустая() и цикла по строкам с проверкой значений.
4. Проверка через цикл: когда нужна детальная аналитика
Иногда недостаточно просто узнать, пустая ли таблица — требуется проверить, есть ли в ней хотя бы одна строка с ненулевыми значениями. Например, в документе "Поступление товаров" может быть строка с пустым полем "Номенклатура", но заполненным "Количеством". В таких случаях стандартные методы не подходят, и приходится использовать цикл.
Пример кода для проверки наличия хоть одного ненулевого значения в табличной части:
Перем ЕстьДанные;
ЕстьДанные = Ложь;
Для Каждого Строка Из Документ.Товары Цикл
Если НЕ Строка.Номенклатура.Пустая() ИЛИ
НЕ Строка.Количество.Пустая() ИЛИ
НЕ Строка.Цена.Пустая() Тогда
ЕстьДанные = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ ЕстьДанные Тогда
Сообщить("Таблица пустая или содержит только пустые строки!");
КонецЕсли;
Этот подход полезен для:
- 📦 Контроля качества данных: Например, чтобы запретить проведение документа, если в таблице есть строки без номенклатуры.
- 🔍 Сложной валидации: Когда нужно проверять не только наличие строк, но и их содержимое (например, корректность заполнения обязательных полей).
- 📊 Отчётов: Чтобы исключать из анализа строки с нулевыми значениями.
⚠️ Внимание: Цикл по строкам может значительно замедлить работу системы, если табличная часть содержит тысячи записей. В таких случаях лучше сначала проверятьПустая(), и только если она возвращаетЛожь, запускать детальный анализ.
☑️ Проверка табличной части через цикл
5. Проверка в управляемых формах: особенности клиент-серверного взаимодействия
В управляемых формах работа с табличными частями имеет свои нюансы из-за разделения логики на клиентскую и серверную части. Если вы пытаетесь проверить таблицу на стороне клиента (например, в модуле формы), стандартные методы могут не сработать, так как реальные данные хранятся на сервере.
Рассмотрим два подхода:
5.1. Проверка на стороне клиента (быстро, но не всегда точно)
Для визуального контроля можно использовать свойство ВидимыеСтроки элемента формы:
Если ЭлементыФормы.Товары.ВидимыеСтроки.Количество() = 0 Тогда
// Таблица пустая (с точки зрения интерфейса)
КонецЕсли;
Однако этот метод проверяет только отображаемые строки. Если применён фильтр или строки скрыты условным оформлением, результат может быть неточным.
5.2. Проверка на стороне сервера (надежно, но требует обращения)
Для точной проверки нужно обратиться к серверу:
&НаСервере
Функция ПроверитьТабличнуюЧастьНаСервере(Документ)
Возврат Документ.Товары.Пустая();
КонецФункции
// На клиенте:
Если ПроверитьТабличнуюЧастьНаСервере(Объект) Тогда
Сообщить("Таблица пустая!");
КонецЕсли;
Преимущества серверной проверки:
- 🔒 Точность: Учитываются все строки, включая скрытые и помеченные на удаление.
- 🛡️ Безопасность: Логика проверки не зависит от интерфейса.
- 🔄 Производительность: Серверные методы оптимизированы для работы с большими данными.
⚠️ Внимание: При частом обращении к серверу для проверки табличных частей может возникать задержка интерфейса. Оптимизируйте код: например, кэшируйте результат проверки в переменной формы, если он нужен несколько раз подряд.
6. Проверка через запрос: для сложных условий
Если вам нужно не просто узнать, пустая ли таблица, а проверить её по сложным критериям (например, "есть ли строки с номенклатурой из определённой группы и количеством больше 10"), удобнее использовать запрос. Этот метод универсален и работает как в управляемых, так и в обычных формах.
Пример запроса для проверки наличия строк в табличной части:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ 1
ИЗ Документ.Товары
ГДЕ Документ.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Документ.Ссылка);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Сообщить("Таблица пустая!");
Иначе
Сообщить("В таблице есть данные.");
КонецЕсли;
Преимущества использования запросов:
- 🔍 Гибкость: Можно добавлять любые условия (фильтры по полям, соединения с другими таблицами и т.д.).
- 📊 Производительность: Запросы оптимизированы для работы с большими объёмами данных.
- 🔗 Универсальность: Один и тот же запрос можно использовать для проверки таблиц в документах, справочниках и регистрах.
Недостатки:
- ⏳ Сложность: Требует знания языка запросов 1С.
- 🔄 Нагрузка: Частые запросы могут замедлять работу системы.
Как ускорить запрос для проверки табличной части?
Используйте конструкцию ВЫБРАТЬ ПЕРВЫЕ 1 вместо полного перебора. Например:
ВЫБРАТЬ ПЕРВЫЕ 1
1 КАК ЕстьДанные
ИЗ Документ.Товары
ГДЕ Документ.Ссылка = &Ссылка
Это прекращает выполнение запроса после нахождения первой подходящей строки.
7. Проверка в типовой конфигурации: примеры из 1С:ERP и 1С:УТ
В типовой конфигурации 1С:ERP Управление предприятием 2 и 1С:Управление торговлей 11 проверка табличных частей часто реализована через стандартные процедуры. Например, в документе "Заказ клиента" перед проведением проверяется табличная часть "Товары":
Пример кода из типовой конфигурации (упрощённо):
Процедура ПередЗаписью(Отказ)
Если Товары.Пустая() Тогда
Сообщить("Необходимо заполнить табличную часть Товары!");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Особенности типовой реализации:
- 📋 Обязательные табличные части: В большинстве документов (например, "Реализация товаров и услуг") табличная часть "Товары" обязательна к заполнению. Система автоматически блокирует проведение, если она пустая.
- 🔄 Дополнительные проверки: Помимо проверки на пустоту, часто проверяется корректность заполнения полей (например, наличие номенклатуры, положительное количество).
- 🛠️ Расширяемость: В типовой конфигурации можно добавить свои проверки через механизм расширений, не изменяя исходный код.
Если вы работаете с типовой конфигурацией, рекомендуем:
- Изучить стандартные процедуры проверки (обычно они находятся в модуле объекта документа).
- Не изменять типовой код напрямую — используйте расширения.
- Учитывать, что в некоторых документах (например, "Счет на оплату") табличная часть может быть необязательной.
⚠️ Внимание: В последних версиях 1С:ERP (начиная с 2.5) появилась возможность настраивать обязательность заполнения табличных частей через интерфейс без программирования. Проверьте настройки документа в конфигураторе, прежде чем писать код.
В типовой конфигурации 1С:УТ 11 проверка табличной части на пустоту реализована через метод Пустая() в процедуре ПередЗаписью(). Этот подход рекомендуется использовать и в своих разработках для совместимости.
FAQ: Частые вопросы о проверке табличных частей в 1С
❓ Почему метод Количество() возвращает 1, хотя таблица визуально пустая?
Это типичная ситуация, когда в таблице остаётся "призрачная" строка после программного удаления или ошибки заполнения. Такая строка может быть невидимой в интерфейсе, но физически присутствовать в данных. Чтобы очистить таблицу полностью, используйте метод Очистить():
Документ.Товары.Очистить();
После этого Количество() вернёт 0.
❓ Как проверить табличную часть на пустоту в отчёте?
В отчётах табличные части проверяются через схему компоновки данных. Если вам нужно скрыть раздел отчёта, если таблица пустая, используйте параметр "Условие" в настройках группы:
ВЫРАЗИТЬ(Документ.Товары.Количество() > 0 КАК Число) = 1
Либо обработайте результат запроса в модуле отчёта:
Если Результат.Пустой() Тогда
Возврат;
КонецЕсли;
❓ Можно ли проверить табличную часть без обращения к серверу в управляемой форме?
Да, но с оговорками. На клиенте вы можете проверить только видимые строки через свойство ЭлементыФормы.ИмяТаблицы.ВидимыеСтроки.Количество(). Однако этот метод не учитывает:
- Строки, скрытые фильтром;
- Строки, помеченные на удаление;
- Строки, не подгруженные на клиент (при постраничной загрузке).
Для точной проверки всё равно потребуется серверный вызов.
❓ Как проверить табличную часть в мобильном приложении 1С?
В мобильном клиенте 1С:Предприятие работа с табличными частями аналогична управляемым формам. Используйте:
Если Объект.Товары.Пустая() Тогда
// Логика для пустой таблицы
КонецЕсли;
Обратите внимание, что в мобильном приложении:
- Визуальная проверка может быть затруднена из-за адаптивного интерфейса;
- Запросы выполняются медленнее, чем на десктопе;
- Некоторые методы (например, работа с условным оформлением) могут быть ограничены.
❓ Почему после очистки таблицы метод Пустая() всё равно возвращает Ложь?
Это происходит, если в таблице остаются помеченные на удаление строки. Метод Очистить() удаляет только непомеченные строки. Чтобы полностью очистить таблицу, используйте:
Пока Документ.Товары.Количество() > 0 Цикл
Документ.Товары.Удалить(Документ.Товары[0]);
КонецЦикла;
Или воспользуйтесь транзакцией:
НачатьТранзакцию();
Документ.Товары.Очистить();
Документ.Записать();
ЗафиксироватьТранзакцию();