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