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