Работа с табличными частями в 1С:Предприятие — одна из самых частых задач как для пользователей, так и для разработчиков. Незаполненная табличная часть может стать причиной ошибок при проведении документов, формировании отчетов или обмене данными. Например, если в документе РеализацияТоваровУслуг не заполнена табличная часть Товары, система может не позволить провести документ или корректно рассчитать суммы.
В этой статье мы разберем 5 проверенных способов проверки заполненности табличных частей — от простых методов для пользователей без навыков программирования до универсальных алгоритмов для разработчиков на встроенном языке 1С 8.3. Вы узнаете, как избежать типичных ошибок, какие нюансы учитывать при работе с разными типами документов, и получите готовые примеры кода для внедрения в свои конфигурации.
Особое внимание уделим проверке табличных частей с учетом скрытых строк и пометок удаления — этот момент часто упускают даже опытные специалисты, что приводит к ложным результатам при валидации данных.
1. Проверка заполненности табличной части без программирования (для пользователей)
Если вы не разработчик и не хотите погружаться в код, воспользуйтесь встроенными инструментами 1С. Этот метод подходит для большинства типовых конфигураций (УТ 11, БП 3.0, ЗУП 3.1 и др.).
Самый простой способ — визуальный осмотр табличной части:
- 🔍 Откройте документ в режиме редактирования (двойной клик или кнопка
Изменить). - 📄 Перейдите на вкладку с нужной табличной частью (например,
Товары,Услуги,Сотрудники). - 📊 Проверьте количество строк в нижней части таблицы. Если указано
0или таблица пустая — данные не заполнены. - ⚠️ Обратите внимание на серый цвет строк — это может означать, что строки помечены на удаление (даже если визуально кажется, что они есть).
В некоторых конфигурациях (например, Управление торговлей 11) есть встроенные механизмы валидации. Попробуйте:
- Нажать кнопку
Проверить заполнение(если она есть в панели инструментов документа). - Или воспользоваться кнопкой
Заполнить→Проверить заполнение.
⚠️ Внимание: В конфигурациях с сильно измененной логикой (например, отраслевые решения) стандартные кнопки проверки могут отсутствовать или работать иначе. В этом случае используйте методы для разработчиков (разделы 3–5).
2. Использование стандартных функций 1С для проверки (Количество(), ПустаяСтрока())
Для тех, кто готов написать пару строк кода, в 1С 8.3 есть встроенные функции, которые упрощают проверку. Основные из них:
- 📌
Количество()— возвращает количество строк в табличной части, включая помеченные на удаление. - 📌
ПустаяСтрока()— проверяет, является ли строка табличной части пустой (без заполненных реквизитов). - 📌
ЭтоГруппа()— актуально для иерархических табличных частей (например, в Управлении производственным предприятием).
Пример кода для проверки табличной части Товары в документе РеализацияТоваровУслуг:
Процедура ПроверитьЗаполнениеТоваров()
Если ДокументОбъект.Товары.Количество() = 0 Тогда
Сообщить("Табличная часть 'Товары' не заполнена!", СтатусСообщения.Важное);
Возврат Ложь;
КонецЕсли;
// Проверяем, есть ли непустые строки (на случай помеченных на удаление)
Заполнено = Ложь;
Для Каждого СтрокаТоваров Из ДокументОбъект.Товары Цикл
Если НЕ СтрокаТоваров.ПометкаУдаления И НЕ СтрокаТоваров.ПустаяСтрока() Тогда
Заполнено = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ Заполнено Тогда
Сообщить("В табличной части 'Товары' нет действительных строк!", СтатусСообщения.Важное);
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецПроцедуры
Этот код учитывает два ключевых момента:
- Пометки удаления — строки, помеченные на удаление, не должны считаться заполненными.
- Пустые строки — даже если строка существует, но все её реквизиты пустые, она не считается заполненной.
⚠️ Внимание: ФункцияПустаяСтрока()может работать некорректно, если в табличной части есть вычисляемые поля или реквизиты с значениями по умолчанию (например,Количество = 1). В таких случаях используйте явную проверку нужных полей (раздел 4).
☑️ Что учесть при проверке табличной части
3. Проверка с учетом конкретных реквизитов (для точной валидации)
Иногда недостаточно просто проверить наличие строк — нужно убедиться, что заполнены конкретные поля. Например, в табличной части Товары могут быть строки, но без указанного Номенклатуры или Количества. В этом случае документ не имеет смысла.
Пример кода для проверки обязательных реквизитов:
Функция ПроверитьОбязательныеРеквизитыТоваров(ДокументОбъект)
Для Каждого СтрокаТоваров Из ДокументОбъект.Товары Цикл
Если СтрокаТоваров.ПометкаУдаления Тогда
Продолжить;
КонецЕсли;
// Проверяем обязательные поля
Если ЗначениеЗаполнено(СтрокаТоваров.Номенклатура) И
ЗначениеЗаполнено(СтрокаТоваров.Количество) И
СтрокаТоваров.Количество > 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Сообщить("В табличной части 'Товары' нет строк с заполненной номенклатурой и количеством!", СтатусСообщения.Важное);
Возврат Ложь;
КонецФункции
В этом примере мы проверяем:
- 📦 Наличие
Номенклатуры(не пустая ссылка). - 📊 Наличие
Количества(и что оно больше 0). - 🗑️ Игнорируем строки с пометкой удаления.
Для разных документов набор обязательных реквизитов будет своим. Например, в Поступлении товаров может потребоваться проверка Цены и Суммы, а в Акте выполненных работ — Услуги и Сотрудник.
| Тип документа | Табличная часть | Обязательные реквизиты для проверки |
|---|---|---|
| РеализацияТоваровУслуг | Товары | Номенклатура, Количество, Цена |
| ПоступлениеТоваровУслуг | Товары | Номенклатура, Количество, СтавкаНДС |
| ЗаказПокупателя | Товары | Номенклатура, Количество |
| АктВыполненныхРабот | Услуги | Номенклатура, Количество, Сотрудник |
Если в вашей конфигурации есть механизм "Минимальное количество строк", его тоже стоит учитывать. Например, в некоторых отраслевых решениях документ не может быть проведен, если в табличной части меньше 3 строк.
4. Проверка табличной части с использованием запроса (для сложных условий)
Если табличная часть большая или нужно проверить сложные условия (например, наличие строк с определенными значениями), удобнее использовать запрос. Этот метод более ресурсоемкий, но гибкий.
Пример запроса для проверки заполненности табличной части Товары с учетом номенклатуры и количества:
Процедура ПроверитьТоварыЗапросом(ДокументОбъект)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Товары
|ГДЕ
| Товары.Ссылка = &СсылкаНаДокумент
| И НЕ Товары.ПометкаУдаления
| И НЕ ЗначениеЗаполнено(Товары.Номенклатура) = ЛОЖЬ
| И Товары.Количество > 0";
Запрос.УстановитьПараметр("СсылкаНаДокумент", ДокументОбъект.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если НЕ Выборка.Следующий() Тогда
Сообщить("В документе нет действительных строк с номенклатурой и количеством!", СтатусСообщения.Важное);
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецПроцедуры
Преимущества этого метода:
- ⚡ Быстрая обработка больших табличных частей (запрос оптимизирован на уровне СУБД).
- 🔧 Гибкость — можно добавлять любые условия (например, проверять только определенные виды номенклатуры).
- 📈 Возможность получить дополнительную информацию (например, сумму по строкам).
Недостатки:
- 🐢 Более медленная отработка для маленьких табличных частей (по сравнению с циклом по строкам).
- 📖 Требует знания языка запросов 1С.
⚠️ Внимание: При использовании запросов в транзакциях (например, при проведении документа) убедитесь, что запрос не блокирует таблицы на долгое время. Это может привести к взаимоблокировкам в многопользовательском режиме.
Как ускорить запрос для больших табличных частей?
Добавьте в запрос условие по индексируемым полям (например, Дата или Организация). Также можно использовать конструкцию РАЗМЕСТИТЬ ПО для ограничения выборки первых строк.
5. Автоматическая проверка при проведении документа (обработчик события)
Чтобы не забывать проверять табличные части, можно автоматизировать валидацию при проведении документа. Для этого используется обработчик события ПередЗаписью или ОбработкаПроведения.
Пример кода для обработчика ПередЗаписью:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если НЕ ПроверитьЗаполнениеТоваров() Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Функция ПроверитьЗаполнениеТоваров()
// Код проверки из раздела 2 или 3
...
КонецФункции
Где размещать этот код:
- 📄 В модуле объекта документа (для конкретного типа документов).
- 📁 В общем модуле (если логика проверки универсальная для нескольких документов).
Преимущества автоматической проверки:
- 🤖 Исключает человеческий фактор — пользователь не сможет провести документ с незаполненной табличной частью.
- 📋 Единообразие — все документы проверяются по одним и тем же правилам.
Недостатки:
- 🔧 Требует доступа к конфигуратору (для обычных пользователей не подходит).
- ⚠️ Может конфликтовать с другими обработчиками, если конфигурация сильно доработана.
Автоматическая проверка при проведении — самый надежный способ избежать ошибок, но требует тестирования на всех типах документов, где используется табличная часть.
6. Типичные ошибки и как их избежать
Даже опытные разработчики иногда допускают ошибки при проверке табличных частей. Рассмотрим самые распространенные:
| Ошибка | Причина | Как избежать |
|---|---|---|
| Ложное срабатывание на помеченные строки | Не учтена пометка удаления (ПометкаУдаления = Истина) |
Всегда проверяйте И НЕ Строка.ПометкаУдаления |
| Игнорирование пустых ссылок | Строка существует, но Номенклатура не заполнена |
Используйте ЗначениеЗаполнено(Строка.Номенклатура) |
| Неправильная работа с иерархией | В табличной части есть группы (например, в УПП) | Проверяйте ЭтоГруппа() для строк |
| Зацикливание на больших табличных частях | Цикл Для Каждого тормозит при 1000+ строках |
Используйте запрос или ПолучитьСтроки() с ограничением |
Еще одна типичная проблема — несоответствие логики проверки бизнес-процессам. Например, в документе Заказ покупателя может быть разрешена пустая табличная часть (если заказ создается "под закупку"), а в Реализации — нет. Всегда уточняйте требования к документам у бизнес-пользователей!
Чтобы минимизировать ошибки:
- 📋 Документируйте правила проверки (например, в виде комментариев в коде).
- 🧪 Тестируйте на реальных данных, а не только на тестовых примерах.
- 🔄 Используйте версионность — если логика проверки меняется, сохраняйте старые версии кода.
7. Проверка табличных частей в управляемых формах (для современных конфигураций)
В конфигурациях на управляемых формах (например, УТ 11, БП 3.0) можно проверять заполненность табличных частей прямо в форме документа, не дожидаясь проведения. Это удобно для пользователей, так как ошибки выявляются сразу.
Пример кода для клиентского модуля формы:
Процедура ТоварыПриИзменении(Элемент)
Если ДокументОбъект.Товары.Количество() = 0 Тогда
ЭлементыФормы.Сообщение.Значение = "Табличная часть 'Товары' не заполнена!";
ЭлементыФормы.Сообщение.Видимость = Истина;
Иначе
ЭлементыФормы.Сообщение.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
Как это работает:
- Создайте на форме поле
Сообщение(типПолеHTMLДокументаилиПолеТекста). - Настройте обработчик события
ПриИзменениидля табличной части. - В обработчике проверяйте заполненность и выводите предупреждение.
Преимущества этого подхода:
- 👀 Пользователь сразу видит проблему, не дожидаясь проведения.
- 🎨 Можно стилизовать сообщение (например, красным цветом).
- 🔄 Легко добавлять дополнительные проверки (например, на дубли номенклатуры).
⚠️ Внимание: В управляемых формах избегайте тяжелых проверок в клиентских обработчиках (например, запросов к базе). Это может привести к зависанию интерфейса. Для сложных проверок используйте серверные вызовы.
FAQ: Частые вопросы по проверке табличных частей в 1С
Как проверить табличную часть в документе, который еще не записан (новый документ)?
Если документ еще не записан (например, только что создан), его ссылка равна Неопределено. В этом случае проверяйте табличную часть напрямую через объект:
Если ДокументОбъект.Товары.Количество() = 0 Тогда
Сообщить("Табличная часть пуста!");
КонецЕсли;
Не используйте запросы — они требуют записанного документа.
Можно ли проверить табличную часть из внешней обработки?
Да, если у вас есть ссылка на документ. Пример:
ДокументОбъект = Документы.РеализацияТоваровУслуг.ПолучитьОбъект(СсылкаНаДокумент);
Если ДокументОбъект.Товары.Количество() = 0 Тогда
Сообщить("Табличная часть пуста!");
КонецЕсли;
Если документ не записан, передавайте его объект напрямую через параметры обработки.
Как проверить табличную часть в документе, который помечен на удаление?
Даже если документ помечен на удаление, его табличные части доступны для чтения. Используйте стандартные методы проверки, но учитывайте, что такой документ нельзя изменить:
ДокументОбъект = Документы.РеализацияТоваровУслуг.ПолучитьОбъект(СсылкаНаДокумент);
КоличествоСтрок = ДокументОбъект.Товары.Количество();
Если нужно проверить несколько документов (например, в обработке), используйте запрос с фильтром по пометке удаления:
ЗАПРОС.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ Документ.Ссылка ИЗ Документ.РеализацияТоваровУслуг КАК Документ ГДЕ Документ.ПометкаУдаления = ЛОЖЬ";
Почему функция ПустаяСтрока() возвращает Ложь, хотя строка кажется пустой?
Это происходит, если в строке есть:
- Скрытые реквизиты с значениями по умолчанию (например,
Количество = 1). - Вычисляемые поля, которые автоматически заполняются системой.
- Реквизиты с типом
Булево, гдеЛожьсчитается "заполненным" значением.
Решение: явно перечисляйте реквизиты, которые должны быть заполнены:
Если НЕ ЗначениеЗаполнено(Строка.Номенклатура) ИЛИ Строка.Количество <= 0 Тогда
// Строка считается пустой
КонецЕсли;
Как проверить табличную часть в мобильном приложении 1С?
В мобильном приложении 1С:Предприятие логика проверки такая же, как и в десктопной версии, но с учетом особенностей:
- Используйте клиентские процедуры для валидации на стороне устройства.
- Избегайте тяжелых запросов — они могут тормозить на слабых устройствах.
- Для проверки при записи документа используйте обработчик
ПередЗаписьюНаСервере.
Пример клиентской проверки:
Процедура ПроверитьТоварыНаМобильномУстройстве()
Если НЕ ЗначениеЗаполнено(Объект.Товары) Или Объект.Товары.Количество() = 0 Тогда
ПоказатьОповещениеПользователя("Заполните табличную часть 'Товары'!");
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецПроцедуры