При разработке алгоритмов в 1С регулярно возникает задача проверить, существует ли определенная колонка (реквизит) у строки табличной части. При работе с универсальной коллекцией ТаблицаЗначений разработчики привыкли обращаться к свойству Колонки или методу Владелец(). Однако для объекта типа ОбработкаТабличнаяЧастьСтрока или ДокументТабличнаяЧастьСтрока данные варианты не работают, так как табличные части прикладных объектов имеют другой программный интерфейс.
Разберем подробнее наиболее удобные и надежные способы проверки наличия колонки "Сумма" в строке табличной части.
Проанализируем ситуацию, когда имя объекта (документа или обработки) и имя табличной части заранее известны. В этом случае наиболее красивым и производительным решением является обращение к дереву метаданных конфигурации.
Рассмотрим пример кода для метаданных обработки:
ИмяКолонки = "Сумма";
РеквизитНайден = (Метаданные.Обработки.ИмяОбработки.ТабличныеЧасти.ИмяТЧ.Реквизиты.Найти(ИмяКолонки) <> Неопределено);
Если РеквизитНайден Тогда
// Выполняем логику, если колонка существует
КонецЕсли;
Этот метод не вызывает сбоев, не требует выполнения ресурсоемких операций и работает гарантированно быстро.
Выясним, как поступить, если конкретный вид объекта метаданных неизвестен, а в распоряжении есть только сама переменная строки СтрокаТабличнойЧасти. В таком случае мы можем использовать функцию ЗаполнитьЗначенияСвойств.
Чтобы избежать ошибочных срабатываний (например, если в существующей колонке записано значение Неопределено или Null), передадим в структуру уникальный маркер:
Маркер = Новый УникальныйИдентификатор;
СтруктураПроверки = Новый Структура("Сумма", Маркер);
ЗаполнитьЗначенияСвойств(СтруктураПроверки, СтрокаТабличнойЧасти);
ЕстьКолонка = (СтруктураПроверки.Сумма <> Маркер);
Если ЕстьКолонка Тогда
// Колонка присутствует в объекте
КонецЕсли;
Посмотрим на особенности работы в контексте управляемых форм. Если переменная строки табличной части получена из реквизита формы и имеет тип ДанныеФормыЭлементКоллекции, проверить наличие реквизита можно с помощью встроенного метода Свойство():
ЕстьКолонка = СтрокаТабличнойЧасти.Свойство("Сумма");
Если ЕстьКолонка Тогда
// Колонка существует
КонецЕсли;
Если разработка ведется в типовой конфигурации на базе БСП, разберем еще один универсальный вариант. В общем модуле ОбщегоНазначения предусмотрена специальная функция:
ЕстьКолонка = ОбщегоНазначения.ЕстьРеквизитИлиСвойствоОбъекта(СтрокаТабличнойЧасти, "Сумма");
Функция автоматически определит тип переданного объекта и вернет булево значение без генерации ошибок.
Рассмотрим вариант с проверкой обращения к полю через считывание его значения:
ЕстьКолонка = Ложь;
Попытка
ЗначениеКолонки = СтрокаТабличнойЧасти.Сумма;
ЕстьКолонка = Истина;
Исключение
ЕстьКолонка = Ложь;
КонецПопытки;
Важно: Метод с перехватом исключения является наименее предпочтительным. Использование блока Попытка ... Исключение снижает скорость выполнения кода при возникновении ошибки и загромождает отладку. Отдавайте преимущество проверке через метаданные, метод Свойство() или ЗаполнитьЗначенияСвойств.