Как проверить наличие колонки в строке табличной части в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке алгоритмов в 1С регулярно возникает задача проверить, существует ли определенная колонка (реквизит) у строки табличной части. При работе с универсальной коллекцией ТаблицаЗначений разработчики привыкли обращаться к свойству Колонки или методу Владелец(). Однако для объекта типа ОбработкаТабличнаяЧастьСтрока или ДокументТабличнаяЧастьСтрока данные варианты не работают, так как табличные части прикладных объектов имеют другой программный интерфейс.

Разберем подробнее наиболее удобные и надежные способы проверки наличия колонки "Сумма" в строке табличной части.

Способ 1. Проверка через метаданные объекта

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

Рассмотрим пример кода для метаданных обработки:


ИмяКолонки = "Сумма";
РеквизитНайден = (Метаданные.Обработки.ИмяОбработки.ТабличныеЧасти.ИмяТЧ.Реквизиты.Найти(ИмяКолонки) <> Неопределено);

Если РеквизитНайден Тогда
    // Выполняем логику, если колонка существует
КонецЕсли;

Этот метод не вызывает сбоев, не требует выполнения ресурсоемких операций и работает гарантированно быстро.

Способ 2. Проверка через ЗаполнитьЗначенияСвойств с маркером

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

Чтобы избежать ошибочных срабатываний (например, если в существующей колонке записано значение Неопределено или Null), передадим в структуру уникальный маркер:


Маркер = Новый УникальныйИдентификатор;
СтруктураПроверки = Новый Структура("Сумма", Маркер);

ЗаполнитьЗначенияСвойств(СтруктураПроверки, СтрокаТабличнойЧасти);

ЕстьКолонка = (СтруктураПроверки.Сумма <> Маркер);

Если ЕстьКолонка Тогда
    // Колонка присутствует в объекте
КонецЕсли;

Способ 3. Использование метода Свойство() в управляемых формах

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


ЕстьКолонка = СтрокаТабличнойЧасти.Свойство("Сумма");

Если ЕстьКолонка Тогда
    // Колонка существует
КонецЕсли;

Способ 4. Вызов функции из Библиотеки Стандартных Подсистем (БСП)

Если разработка ведется в типовой конфигурации на базе БСП, разберем еще один универсальный вариант. В общем модуле ОбщегоНазначения предусмотрена специальная функция:


ЕстьКолонка = ОбщегоНазначения.ЕстьРеквизитИлиСвойствоОбъекта(СтрокаТабличнойЧасти, "Сумма");

Функция автоматически определит тип переданного объекта и вернет булево значение без генерации ошибок.

Способ 5. Перехват исключения через Попытка ... Исключение

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


ЕстьКолонка = Ложь;
Попытка
    ЗначениеКолонки = СтрокаТабличнойЧасти.Сумма;
    ЕстьКолонка = Истина;
Исключение
    ЕстьКолонка = Ложь;
КонецПопытки;

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

← На главную