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

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

Как проверить, что табличная часть не пустая в 1С

Как проверить, что табличная часть документа или справочника не пустая в 1С: метод Количество(), запросы, проверка в форме и при проведении. Примеры кода.

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

Встроенный язык 1С предоставляет несколько способов такой проверки: метод Количество() коллекции строк, запрос к базе данных, а также стандартные механизмы проверки заполнения на уровне конфигурации. Выбор зависит от контекста: проверяете вы объект в памяти, данные в базе или ввод пользователя в форме.

Проверка через метод Количество() — базовый способ

Табличная часть объекта — это коллекция значений, и у неё есть метод Количество(), который возвращает число строк. Проверка сводится к сравнению результата с нулём:

Если Объект.Товары.Количество() = 0 Тогда

Сообщить("Табличная часть ""Товары"" не заполнена!");

Отказ = Истина;

Возврат;

КонецЕсли;

Альтернативная запись через сравнение «больше нуля» читается как позитивное условие и удобна, когда дальше идёт основная логика обработки строк:

Если Объект.Товары.Количество() > 0 Тогда

// обработка строк табличной части

КонецЕсли;

Метод Количество() работает одинаково для табличных частей документов, справочников, обработок, а также для таблиц значений и динамических списков строк. Это самый быстрый по производительности способ, потому что не требует обхода коллекции — размер хранится в самой коллекции.

Проверка в модуле объекта при проведении и записи

Наиболее частый сценарий — запретить проведение документа без строк. Для этого используется обработчик ОбработкаПроверкиЗаполнения в модуле объекта. Он вызывается автоматически при записи и проведении, если у реквизита включена проверка заполнения или задана программно:

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

Если Товары.Количество() = 0 Тогда

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = "Не заполнена табличная часть ""Товары""";

Сообщение.Поле = "Товары";

Сообщение.УстановитьДанные(ЭтотОбъект);

Сообщение.Сообщить();

Отказ = Истина;

КонецЕсли;

КонецПроцедуры

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

Обратите внимание: если вы установили Отказ = Истина, дальнейшая запись и проведение будут прерваны. Это безопасное поведение — документ без строк не попадёт в учётные регистры и не создаст движений.

Проверка заполнения на уровне конфигуратора

Не всегда нужен программный код. В конфигураторе у табличной части есть свойство «Проверка заполнения» (ПроверкаЗаполнения), которое можно установить в значение «Выдавать ошибку». Тогда платформа сама не даст записать объект с пустой табличной частью — без единой строки кода.

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

Сравнение вариантов проверки

Свойство «Проверка заполнения» в конфигураторе

Не требует кода, работает всегда. Ограничение: нельзя задать условия и свой текст ошибки.

ОбработкаПроверкиЗаполнения в модуле объекта

Гибкие условия, свой текст сообщения, привязка к полю. Требует написания кода.

Проверка в форме (перед записью)

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

Запрос к базе данных

Проверяет фактические данные без чтения объекта целиком. Не видит несохранённые изменения в текущем объекте.

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

Если нужно предупредить пользователя ещё до записи — например, при нажатии кнопки «Провести» — проверку выполняют в модуле формы. В управляемой форме табличная часть доступна через реквизит формы Объект:

&НаКлиенте

Процедура ПровестиДокумент(Команда)

Если Объект.Товары.Количество() = 0 Тогда

ПоказатьПредупреждение(, "Добавьте хотя бы одну строку в табличную часть ""Товары""");

Возврат;

КонецЕсли;

Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение));

КонецПроцедуры

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

Проверка через запрос к базе данных

Когда нужно проверить табличную часть документа, уже сохранённого в базе, не читая весь объект в память, эффективнее использовать запрос. Это особенно актуально при массовых проверках — например, поиске всех «пустых» документов за период:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| РеализацияТовары.Ссылка КАК Документ,

| КОЛИЧЕСТВО(РеализацияТовары.Номенклатура) КАК ЧислоСтрок

|ИЗ

| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары

|ГДЕ

| РеализацияТовары.Ссылка = &Ссылка

|

|СГРУППИРОВАТЬ ПО

| РеализацияТовары.Ссылка";

Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);

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

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

// строк в табличной части нет

КонецЕсли;

Метод Пустой() результата запроса возвращает Истина, если выборка не содержит записей, — это и есть признак пустой табличной части. Для массового поиска проблемных документов запрос строят наоборот: выбирают документы, для которых нет строк в табличной части, через соединение ЛЕВОЕ СОЕДИНЕНИЕ с условием ЕСТЬ NULL.

Проверка не только пустоты, но и заполненности строк

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

ЕстьЗаполненныеСтроки = Ложь;

Для Каждого СтрокаТовары Из Объект.Товары Цикл

Если ЗначениеЗаполнено(СтрокаТовары.Номенклатура)

И СтрокаТовары.Количество > 0 Тогда

ЕстьЗаполненныеСтроки = Истина;

Прервать;

КонецЕсли;

КонецЦикла;

Если Не ЕстьЗаполненныеСтроки Тогда

Сообщить("В табличной части нет ни одной корректно заполненной строки");

Отказ = Истина;

КонецЕсли;

Оператор Прервать останавливает цикл при первой подходящей строке — это важно для производительности в документах с сотнями строк. Альтернатива без цикла — метод НайтиСтроки() с отбором, который возвращает массив подходящих строк, и проверка его размера.

Типичные ошибки
01
Проверка только в форме: документ записывается пустым через обмен или обработку, потому что модуль объекта проверки не содержит.
02
Использование запроса для несохранённого объекта: запрос не видит строки, добавленные в открытой форме, и даёт ложный результат.
03
Цикл по всем строкам без Прервать: на больших табличных частях проверка выполняется дольше, чем могла бы.
04
Сравнение с Неопределено вместо Количество() = 0: табличная часть объекта всегда существует как коллекция, она не бывает Неопределено — такая проверка бессмысленна.

Проверка результата и контрольные точки

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

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

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

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

Проведение пустого документа из формы
Норма

Сообщение об ошибке, фокус на табличной части, документ не проведён

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

Документ проводится без строк или сообщение не привязано к полю

Программная запись пустого документа
Норма

Отказ срабатывает и вне формы

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

Документ записывается через обмен или обработку без контроля

Проведение документа со строками
Норма

Проведение проходит без лишних сообщений

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

Появляются дублирующие или ложные ошибки

Итог

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

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

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

Чем отличается проверка Количество() = 0 от проверки через запрос?

Количество() анализирует объект, загруженный в память, включая несохранённые изменения. Запрос читает только данные в базе. Для текущего редактируемого объекта всегда используйте Количество(), для массового анализа сохранённых документов — запрос.

Можно ли запретить пустую табличную часть без программирования?

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

Почему проверка в форме не срабатывает при обмене данными?

Обмен данными записывает объект программно, минуя форму. Обработчики формы при этом не выполняются. Контроль нужно размещать в модуле объекта — в ОбработкаПроверкиЗаполнения или ПередЗаписью.

Как проверить, что в табличной части есть строки с заполненной номенклатурой?

Используйте метод НайтиСтроки() с отбором по полю Номенклатура или цикл с ЗначениеЗаполнено(). Если найденный массив пуст — корректных строк нет, даже если Количество() больше нуля.

Сработает ли проверка при записи документа в режиме ОбменДанными.Загрузка?

При установленном признаке ОбменДанными.Загрузка = Истина стандартная проверка заполнения отключается платформой. Если контроль нужен и в этом режиме, реализуйте его явно в обработчике ПередЗаписью с собственной логикой.

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

Постройте запрос с левым соединением шапки документа и его табличной части, сгруппируйте по ссылке и отберите записи, где количество строк равно нулю или поле соединения ЕСТЬ NULL. Такой запрос выполняется быстро даже на больших объёмах данных.