Как проверить заполнение колонки в табличной части 1С: разбираем все способы и исправляем ошибки

Программист 1С v8.3 (Обычные формы)
← На главную

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

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

Анализ ошибки: почему не работает простой код?

Рассмотрим ситуацию, с которой часто сталкиваются разработчики. Имеется табличная часть (например, под названием КатегорияРеакцияРаботника), в которой есть колонка ФИОАудируемого. Требуется запретить переход на другую страницу формы, если эта колонка не заполнена.

Типичный ошибочный код выглядит следующим образом:


Если ПустаяСтрока(Аудируемые) Тогда   
    Сообщить("Выберите ФИО аудируемого!"); 
    Отказ = Истина;
    Возврат;
КонецЕсли;

Этот код не будет работать по нескольким причинам:

  1. Несоответствие типов данных: Функция ПустаяСтрока() предназначена исключительно для работы со строковыми типами данных. Передавая в нее объект табличной части (или коллекцию строк), мы гарантированно получим ошибку или неверное поведение, так как система не может неявно преобразовать сложную таблицу в строку.
  2. Проверка всей таблицы вместо конкретных ячеек: Ссылка на саму табличную часть не дает информации о том, заполнены ли конкретные реквизиты внутри ее строк. Нам необходимо анализировать каждую строку отдельно.
  3. Отсутствие цикла: Табличная часть — это коллекция строк. Чтобы проверить данные в ней, нам обязательно нужно организовать обход этой коллекции.

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

---

Решение 1: Проверка заполнения колонки во ВСЕХ строках таблицы

Разберем первый сценарий. Нам необходимо убедиться, что пользователь заполнил колонку ФИОАудируемого абсолютно в каждой строке, которую он добавил в табличную часть. Если хотя бы в одной строке поле осталось пустым, мы должны прервать выполнение операции и вывести предупреждение.

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


ЕстьОшибки = Ложь;

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

// Если в процессе обхода был установлен флаг ошибки
Если ЕстьОшибки Тогда 
    Сообщить("Во всех строках таблицы должно быть заполнено ФИО аудируемого!"); 
    Отказ = Истина; // Блокируем дальнейший переход или действие
    Возврат; 
КонецЕсли;

Как это работает шаг за шагом:

  1. Мы создаем переменную ЕстьОшибки и изначально присваиваем ей значение Ложь. Это наш индикатор состояния.
  2. Запускаем цикл по строкам таблицы. Внутри цикла переменная тСтр последовательно получает доступ к каждой строке коллекции КатегорияРеакцияРаботника.
  3. Через точку от строки мы обращаемся к реквизиту тСтр.ФИОАудируемого и передаем его в функцию ЗначениеЗаполнено(). Конструкция Если Не... срабатывает тогда, когда значение пустое (например, пустая ссылка на справочник «Физические лица» или пустая строка).
  4. Если найдена незаполненная ячейка, мы меняем значение флага ЕстьОшибки на Истина и используем оператор Прервать, чтобы не тратить ресурсы системы на проверку оставшихся сотен строк — ошибка уже гарантированно есть.
  5. После завершения цикла мы анализируем состояние флага. Если он равен Истина, мы выводим сообщение пользователю и устанавливаем параметр Отказ = Истина, который отменяет смену страницы формы или запись объекта.

---

Решение 2: Проверка заполнения ХОТЯ БЫ ОДНОЙ строки (Альтернативный сценарий)

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

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

Рассмотрим, как будет выглядеть этот алгоритм в коде:


// Предполагаем худшее: что ни одна строка не заполнена
ЕстьОшибки = Истина; 

Для каждого тСтр Из КатегорияРеакцияРаботника Цикл
    // Если находим хотя бы одну заполненную ячейку
    Если ЗначениеЗаполнено(тСтр.ФИОАудируемого) Тогда
        ЕстьОшибки = Ложь; // Условие выполнено, ошибки нет!
        Прервать;         // Прерываем цикл, так как цель достигнута
    КонецЕсли;
КонецЦикла;

// Если после обхода всей таблицы флаг так и остался Истина
Если ЕстьОшибки Тогда 
    Сообщить("Необходимо заполнить ФИО аудируемого хотя бы в одной строке!"); 
    Отказ = Истина; 
    Возврат; 
КонецЕсли;

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

---

Решение 3: Декларативная проверка без программирования

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

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

  1. Откройте форму документа или обработки в конфигураторе.
  2. Найдите элемент управления (поле ввода), который отображает колонку ФИОАудируемого внутри вашей таблицы на форме.
  3. Откройте палитру свойств этого поля ввода (нажатием клавиши F4).
  4. Найдите свойство АвтоотметкаНезаполненного и установите его в значение Истина.

Что это дает? Во-первых, пустые ячейки в этой колонке будут автоматически подчеркиваться красной пунктирной линией, сигнализируя пользователю о необходимости ввода. Во-вторых, при попытке записи или проведения документа платформа сама выполнит валидацию данных и не позволит сохранить объект с пустыми значениями, выведя стандартное системное предупреждение.

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

---

Решение 4: Прогрессивный метод с использованием «СообщениеПользователю»

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

Профессиональный подход предполагает использование объекта СообщениеПользователю. Этот объект позволяет «привязать» текст ошибки к конкретному полю на форме и даже к конкретной строке табличной части. При нажатии на текст ошибки в панели сообщений система автоматически активизирует нужную строку и установит фокус ввода на незаполненное поле.

Рассмотрим, как реализовать такую проверку программно:


ИндексСтроки = 0;

Для каждого тСтр Из КатегорияРеакцияРаботника Цикл
    Если Не ЗначениеЗаполнено(тСтр.ФИОАудируемого) Тогда
        
        // Создаем объект сообщения
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Не заполнено ФИО аудируемого в строке № " + (ИндексСтроки + 1) + "!";
        
        // Указываем путь к данным формы для точечной подсветки ячейки
        Сообщение.Поле = "КатегорияРеакцияРаботника[" + ИндексСтроки + "].ФИОАудируемого";
        
        // Выводим сообщение на экран
        Сообщение.Сообщить();
        
        Отказ = Истина;
    КонецЕсли;
    
    ИндексСтроки = ИндексСтроки + 1;
КонецЦикла;

Использование свойства Поле с указанием индекса строки коллекции (индексация начинается с 0, поэтому для вывода пользователю мы прибавляем 1) делает интерфейс программы невероятно дружелюбным и отзывчивым.

---

Резюме и рекомендации

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

← На главную