Как в табличной части проверить заполненность поля и перейти к следующей строке

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Анализ распространенных ошибок: ПустаяСтрока против ЗначениеЗаполнено

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

  1. Функция ПустаяСтрока() предназначена исключительно для строковых значений. Если передать в нее значение ссылочного типа (например, ссылку на элемент справочника ХарактеристикиНоменклатуры), платформа не сможет корректно обработать тип данных, либо результат проверки будет некорректным.
  2. Реквизиты ссылочного типа проверяются универсальной системной функцией ЗначениеЗаполнено() либо специализированным методом ссылки ПустаяСсылка().

Функция ЗначениеЗаполнено() является универсальной: она возвращает Ложь, если переданное значение равно пустой строке, числу 0, пустой дате '00010101', пустой ссылке любого справочника или документа, а также значению Неопределено или NULL.

Отказ от оператора перехода (метки и Перейти)

Еще одна типичная архитектурная ошибка — попытка реализовать пропуск строки через метки и безусловный переход (Перейти ~Метка;). Использование оператора Перейти ломает линейность чтения кода, усложняет отладку и считается плохой практикой разработки. В языке 1С для досрочного перехода к следующей итерации цикла существует штатный оператор Продолжить.

Когда интерпретатор встречает оператор Продолжить, выполнение текущего шага цикла немедленно прерывается, и управление передается в начало следующей итерации (к следующему элементу коллекции).

Правильный обход табличной части документа

Рассмотрим типовую конструкцию обхода строк табличной части документа на сервере. Предположим, у документа есть табличная часть Товары с реквизитами ХарактеристикаНоменклатуры и Партия. Нам необходимо пропустить строки с незаполненными характеристиками, а для заполненных — сформировать реквизит партии.


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

    // Проверяем заполненность реквизита строки
    Если Не ЗначениеЗаполнено(СтрокаТабличнойЧасти.ХарактеристикаНоменклатуры) Тогда
        // Пропускаем дальнейшие действия и берем следующую строку
        Продолжить;
    КонецЕсли;

    // Ниже выполняется основной алгоритм для заполненной строки
    // Например, расчет сопутствующих данных или заполнение реквизитов
    СтрДляРазбора = Строка(СтрокаТабличнойЧасти.ХарактеристикаНоменклатуры);
    
    // Выполняем требуемые манипуляции
    Если СтрНайти(СтрДляРазбора, "Срочный") > 0 Тогда
        СтрокаТабличнойЧасти.Партия = "Приоритетная";
    КонецЕсли;

КонецЦикла;

Особенности обработки данных в управляемых формах

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

  1. Не запускайте обход всей таблицы при изменении одной ячейки. Если пользователь редактирует реквизит в строке, запуск цикла по всей табличной части приведет к существенным задержкам на больших документах. Вместо обхода коллекции следует обработать только текущую строку, получив ее через свойство Элементы.ИмяТаблицы.ТекущиеДанные.
  2. Доступ к реквизитам ссылок на клиенте. Если требуется прочитать дополнительные свойства характеристики, обращение через точку на клиенте вызовет ошибку. В управляемом приложении чтение реквизитов ссылочных объектов должно происходить на стороне сервера.

Посмотрим на пример правильной обработки изменения конкретной строки в модуле формы:


&НаКлиенте
Процедура ТоварыХарактеристикаНоменклатурыПриИзменении(Элемент)

    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    Если ТекущаяСтрока = Неопределено Тогда
        Возврат;
    КонецЕсли;

    // Если характеристика очищена пользователем — очищаем зависимое поле
    Если Не ЗначениеЗаполнено(ТекущаяСтрока.ХарактеристикаНоменклатуры) Тогда
        ТекущаяСтрока.Партия = "";
        Возврат;
    КонецЕсли;

    // Вызываем серверную процедуру для расчета параметров
    РассчитатьПараметрыСтрокиНаСервере(ТекущаяСтрока.НомерСтроки);

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

Архитектурные рекомендации по работе со сложными данными

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

  1. Нестабильность формата. Строковое представление ссылки может изменяться в зависимости от системных настроек языка, прав пользователя или модификаций конфигурации. Смещение даже на один символ приведет к искажению дат или ошибке преобразования типов.
  2. Преобразование в дату. Конструктор Дата("Строка") требует строгого формата ГГГГММДДЧЧММСС. Попытка передать строку вида "01.01.2024" без явного выделения чисел года, месяца и дня вызовет аварийное завершение работы программы. Для безопасного формирования даты из отдельных частей необходимо использовать явное приведение к числу: Дата(Число(Год), Число(Месяц), Число(День)).
  3. Хранение данных в отдельных реквизитах. Наиболее надежное решение — не разбирать строку, а хранить дату производства и признак смены в качестве отдельных реквизитов справочника характеристик или серий номенклатуры. Это устраняет необходимость парсинга и обеспечивает максимальное быстродействие при любых операциях с табличными частями.
← На главную