Почему возникает ошибка «Переменная не определена» при обращении к табличной части документа в 1С

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

При разработке и доработке документов в среде 1С:Предприятие разработчики нередко сталкиваются с ошибкой компиляции вида «Переменная не определена (ИмяТабличнойЧасти)» при попытке обойти строки таблицы с помощью цикла Для Каждого. Разберем детально, почему платформа не видит указанную переменную, как устроена адресация данных и как правильно обращаться к табличным частям в различных контекстах выполнения программного кода.

Причина ошибки: несоответствие идентификатора метаданных

Наиболее частая причина появления ошибки «Переменная не определена» — использование имени элемента формы, заголовка или синонима вместо фактического имени объекта метаданных. В платформе 1С сущности четко разделены:

  1. Имя в метаданных: системный идентификатор реквизита или табличной части, используемый в программном коде конфигурации. Он не может содержать пробелов, знаков препинания и спецсимволов (например, РаспределениеМатериалов).
  2. Синоним: человекочитаемое представление имени объекта для отображения пользователям в интерфейсе (например, «Распределение материалов»). Синоним никак не доступен как переменная в коде.
  3. Имя элемента формы (Табличного поля): название визуального элемента управления на форме документа. Разработчик может назвать таблицу на форме просто Распределение, но это имя элемента управления, а не самой коллекции данных.

Если в коде написать:


Для Каждого ТекСтрока Из Распределение Цикл
    // Ошибка: переменная не определена
КонецЦикла;

Платформа выполняет поиск переменной, реквизита формы или табличной части с точным именем Распределение. Если в дереве метаданных табличная часть называется РаспределениеМатериалов, компилятор выдает синтаксическую ошибку.

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

Рассмотрим несколько надежных способов определить реальное имя таблицы, к которой необходимо обратиться:

  1. Использование контекстной подсказки (Ctrl + Пробел): наберите в модуле первые буквы предполагаемого имени (например, Распредел) и нажмите комбинацию клавиш Ctrl + Пробел. Платформа выведет список всех доступных в данном контексте реквизитов и табличных частей.
  2. Проверка свойств элемента управления: откройте форму документа в конфигураторе, перейдите в свойства нужного табличного поля и найдите свойство «Данные». В нем будет указан точный путь к источнику данных (например, ЭтотОбъект.РаспределениеМатериалов или Объект.РаспределениеМатериалов).
  3. Дерево метаданных: раскройте ветку нужного документа в дереве метаданных конфигуратора и проверьте список вложенных табличных частей.

Правильное обращение к табличной части в обычном приложении

В обычных формах (толстый клиент) табличные части основного реквизита документа доступны в модуле формы напрямую по имени метаданных либо через контекст ЭтотОбъект.

Исправленный вариант обхода строк:


Для Каждого ТекСтрока Из РаспределениеМатериалов Цикл
    // Обработка строки табличной части
КонецЦикла;

Если требуется обратиться к табличной части через явное указание контекста текущего объекта документа:


Для Каждого ТекСтрока Из ЭтотОбъект.РаспределениеМатериалов Цикл
    // Обработка строки табличной части
КонецЦикла;

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

В управляемом интерфейсе контекст формы изолирован от самого объекта базы данных. На клиенте данные документа представлены прикладным объектом ДанныеФормыСтруктура, а его табличные части — объектом ДанныеФормыКоллекция.

Прямое обращение по имени метаданных (без указания реквизита формы) в управляемой форме вызовет ошибку. Обращение выполняется строго через основной реквизит формы — Объект:


&НаКлиенте
Процедура ОбработатьСтроки()
    Для Каждого ТекСтрока Из Объект.РаспределениеМатериалов Цикл
        // Обработка строк коллекции формы
    КонецЦикла;
КонецПроцедуры

Динамический доступ и проверка метаданных

Если имя табличной части заранее неизвестно или передается в виде строковой переменной, обращение выполняется через механизм квадратных скобок:


ИмяТЧ = "РаспределениеМатериалов";

// Проверяем наличие табличной части в метаданных объекта
Если Метаданные().ТабличныеЧасти.Найти(ИмяТЧ) <> Неопределено Тогда
    Таблица = ЭтотОбъект[ИмяТЧ];
    Для Каждого ТекСтрока Из Таблица Цикл
        // Безопасная обработка строк
    КонецЦикла;
КонецЕсли;

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

← На главную