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