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