Заполнение табличного поля в 1С: код и примеры

· 9 мин

Содержание

Табличное поле заполняют построчно: сначала готовят колонки с нужными типами, затем добавляют строки методом Добавить() и записывают значения в ячейки — по имени колонки (Строка.Цена = 250) или по индексу (Строка.Установить(2, 250)). Для массового заполнения табличной части документа из готового набора данных есть Загрузить().

Сразу про термин. «Табличное поле» — это название из версий 8.1 и 8.2. В 1С 8.3 с интерфейсом «Такси» элемент формы называется Таблица, а данные под ним — это либо таблица значений (ТаблицаЗначений), либо табличная часть документа или справочника (ТабличнаяЧасть), либо динамический список. Приёмы заполнения зависят именно от источника данных, поэтому разберём каждый.

Готовим колонки и источник данных

Перед записью строк нужно понимать, с чем работаете. Элемент формы «Таблица» сам данные не хранит — он их только показывает. Данные лежат в объекте под ним.

Три типичных источника:

  • 🧮 Таблица значений — временный набор данных в памяти, создаётся кодом. Колонки задаёте сами.
  • 📄 Табличная часть объекта (Товары, Услуги и т. п.) — колонки уже описаны в конфигураторе как реквизиты табличной части, менять их кодом нельзя.
  • 🔁 Динамический список — заполняется запросом, строки программно не добавляют.

Для таблицы значений колонки создают методом Колонки.Добавить() — указывают имя, тип и при необходимости заголовок:

Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
Таблица.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"), "Кол-во");
Таблица.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
Таблица.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));

Тип колонки задавайте через ОписаниеТипов сразу. Если тип не указать, колонка примет значение любого типа — это удобно на черновиках, но потом при записи в типизированную табличную часть документа такие данные могут не подойти.

У табличной части документа колонки описаны в конфигураторе, их структуру кодом не формируют — вы сразу переходите к добавлению строк. Операции с ТаблицаЗначений чаще выполняют в серверном контексте (&НаСервере): объект тяжёлый, и его перебор на клиенте замедляет форму.

Что проверить перед заполнением
Выполнено: 0 / 4

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

Новая строка появляется методом Добавить(). Он возвращает саму строку — её сразу удобно записать в переменную и заполнить ячейки:

НоваяСтрока = Таблица.Добавить();
НоваяСтрока.Номенклатура = ВыбраннаяНоменклатура;
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 250;
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;

Записать значение в ячейку можно тремя способами — выбирайте по ситуации:

СпособПримерКогда удобно
По имени через точкуСтрока.Цена = 250Имя колонки известно заранее
По имени через [ ]Строка["Цена"] = 250Имя колонки в переменной
По индексуСтрока.Установить(2, 250)Колонки перебираются в цикле

Метод Установить() принимает индекс колонки, который считается с нуля. В примере выше колонки идут так: Номенклатура — 0, Количество — 1, Цена — 2, Сумма — 3. Поэтому Установить(2, 250) пишет в цену.

Строку можно добавить не в конец, а в нужную позицию — методом Вставить() с индексом:

ВставленнаяСтрока = Таблица.Вставить(0); // станет первой
ВставленнаяСтрока.Номенклатура = Товар;

Заполнение табличной части документа

У документа или справочника строки добавляют так же — через Добавить() по имени табличной части:

СтрокаТовары = Документ.Товары.Добавить();
СтрокаТовары.Номенклатура = Товар;
СтрокаТовары.Количество = 5;

Если данные уже собраны в таблицу значений, не перебирайте их строку за строкой — загрузите целиком методом Загрузить():

Документ.Товары.Загрузить(Таблица);

Главное условие Загрузить(): имена колонок таблицы значений должны точно совпадать с именами реквизитов табличной части. Колонки, которых нет среди реквизитов, просто игнорируются, а недостающие останутся пустыми. Обратная операция — выгрузить табличную часть в таблицу значений для обработки — делается методом Выгрузить().

Перебор строк и обращение по индексу

Все строки перебирают циклом Для Каждого. Внутри доступны ячейки по именам колонок:

ИтогоСумма = 0;
Для Каждого Строка Из Таблица Цикл
    Строка.Сумма = Строка.Количество * Строка.Цена;
    ИтогоСумма = ИтогоСумма + Строка.Сумма;
КонецЦикла;

Когда нужна конкретная строка по номеру, обращайтесь по индексу в квадратных скобках — отсчёт с нуля:

ПерваяСтрока = Таблица[0];
ПоследняяСтрока = Таблица[Таблица.Количество() - 1];

Метод Количество() возвращает число строк, а Индекс() — позицию конкретной строки в коллекции:

Позиция = Таблица.Индекс(НоваяСтрока);

Нельзя удалять строки прямо в цикле Для Каждого — после удаления перебор собьётся и часть строк пропустится. Удаляйте в цикле Пока, идя от конца к началу:

Индекс = Таблица.Количество() - 1;
Пока Индекс >= 0 Цикл
    Строка = Таблица[Индекс];
    Если Строка.Количество = 0 Тогда
        Таблица.Удалить(Строка);
    КонецЕсли;
    Индекс = Индекс - 1;
КонецЦикла;

Так удаление строки не сдвигает ещё не пройденные позиции: мы движемся сверху вниз, и всё, что осталось впереди, уже имеет меньшие индексы.

Подсчитать сумму по колонке без ручного цикла помогает метод Итог() — он складывает значения числовой колонки по всем строкам:

ОбщаяСумма = Таблица.Итог("Сумма");

Если нужно поменять строки местами — например, поднять строку выше по кнопке, — используйте Сдвинуть(): первым параметром строка, вторым смещение (отрицательное — вверх):

Таблица.Сдвинуть(ТекущаяСтрока, -1); // поднять на одну позицию

Очистить все строки разом можно методом Очистить() — он оставит колонки, но уберёт содержимое.

Поиск, отбор и сортировка строк

Чтобы не перебирать всю таблицу ради одной строки, пользуйтесь встроенными методами.

Найти первую строку по значению колонки:

Строка = Таблица.Найти(ИскомыйТовар, "Номенклатура");
Если Строка <> Неопределено Тогда
    Строка.Количество = Строка.Количество + 1;
КонецЕсли;

Метод Найти() возвращает Неопределено, если совпадений нет, — проверку на это ставьте всегда.

Отобрать сразу все подходящие строки — через НайтиСтроки() со структурой отбора. На выходе массив строк:

Отбор = Новый Структура("Номенклатура", ИскомыйТовар);
Строки = Таблица.НайтиСтроки(Отбор);
Для Каждого Строка Из Строки Цикл
    Строка.Цена = НоваяЦена;
КонецЦикла;

Отсортировать строки перед выводом можно методом Сортировать(): имена колонок через запятую, направление — Возр или Убыв:

Таблица.Сортировать("Цена Убыв, Номенклатура Возр");

Свернуть одинаковые строки с суммированием (аналог группировки) — метод Свернуть(): первым параметром группировочные колонки, вторым — суммируемые:

Таблица.Свернуть("Номенклатура", "Количество, Сумма");

А чтобы получить значения одной колонки массивом — например, список всех номенклатур из таблицы, — используйте ВыгрузитьКолонку():

МассивНоменклатуры = Таблица.ВыгрузитьКолонку("Номенклатура");

Есть и обратная операция. Когда значения для колонки уже посчитаны в массиве, их заливают одним вызовом ЗагрузитьКолонку() — порядок элементов массива должен совпадать с порядком строк:

Таблица.ЗагрузитьКолонку(МассивЦен, "Цена");

Это удобно, когда цены или остатки получены отдельным запросом и выстроены в том же порядке, что строки таблицы: не нужно перебирать строки вручную.

Настройка отображения и форматирование колонок

Данные заполнены — теперь о том, как они выглядят в элементе формы. Внешним видом управляет не сам объект данных, а колонки элемента «Таблица» на форме.

Формат числа или даты задают в свойстве Формат колонки — прямо в редакторе формы или кодом. Например, показать цену с двумя знаками после запятой и без разделителя групп:

Элементы.ТоварыЦена.Формат = "ЧДЦ=2; ЧГ=0";

Здесь ЧДЦ=2 — два знака в дробной части, ЧГ=0 — без разбивки на разряды. Для даты формат задают иначе, например ДФ=dd.MM.yyyy.

Что ещё настраивают на колонке таблицы формы:

  • 📏 Ширина — свойство Ширина колонки (в символах).
  • 👁 Видимость — свойство Видимость, колонку можно скрыть, оставив данные.
  • ✏️ Редактирование — свойства ТолькоПросмотр для колонки целиком или ФорматРедактирования для режима ввода.
  • 🔤 Заголовок — свойство Заголовок, если имя колонки данных не годится для показа.

Подсветить строки по условию (например, выделить красным строки с нулевым количеством) удобно через настройку Условное оформление формы — её открывают из командной панели редактора формы. Там задают оформляемые поля, оформление (цвет текста, фона, шрифт) и условие отбора. Это нагляднее, чем менять цвет в коде, и работает без перерисовки вручную.

Обработка событий таблицы на форме

Табличное поле реагирует на действия пользователя через события элемента формы. Обработчики назначают в редакторе формы: выделяют таблицу или её колонку, открывают палитру свойств и в разделе событий создают процедуру.

Чаще всего используют событие ПриИзменении у колонки ввода — чтобы пересчитать зависимые ячейки. Классика: пользователь ввёл количество, а программа сама считает сумму:

&НаКлиенте
Процедура ТоварыКоличествоПриИзменении(Элемент)
    СтрокаТЧ = Элементы.Товары.ТекущиеДанные;
    СтрокаТЧ.Сумма = СтрокаТЧ.Количество * СтрокаТЧ.Цена;
КонецПроцедуры

Обратите внимание на Элементы.Товары.ТекущиеДанные — это текущая строка таблицы на форме. Через неё читают и пишут ячейки той строки, в которой стоит курсор.

Другие полезные события таблицы:

  • ПриАктивизацииСтроки — срабатывает при переходе на другую строку; удобно обновлять связанные поля формы.
  • Выбор — двойной щелчок или Enter по строке; часто используют для открытия связанного объекта.
  • ПередНачаломДобавления — позволяет подставить значения по умолчанию в новую строку или запретить добавление.

Через ПередНачаломДобавления удобно не пускать пользователя заполнять строки, пока не готова шапка документа. Параметр Отказ при установке в Истина отменяет добавление:

&НаКлиенте
Процедура ТоварыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
    Если Не ЗначениеЗаполнено(Объект.Склад) Тогда
        Отказ = Истина;
        Сообщить("Сначала выберите склад в шапке");
    КонецЕсли;
КонецПроцедуры

Событийные процедуры у таблицы формы почти всегда клиентские (&НаКлиенте), поскольку реагируют на действия пользователя в интерфейсе. Если внутри нужны тяжёлые вычисления или данные из базы — выносите их в серверный вызов.

Частые ошибки при заполнении

Большинство сбоев при работе с табличным полем — из-за несовпадения имён и типов либо из-за неверной работы с индексами.

Диагностика: выберите симптом

Ещё один тонкий момент — контекст. Таблица значений живёт на сервере; если собрать её в серверной процедуре и попытаться обратиться на клиенте без передачи, данных там не окажется. Собирайте и обрабатывайте таблицу значений в одном серверном вызове, а на форму отдавайте уже готовый результат.

Частые вопросы

Чем «табличное поле» отличается от «таблицы» в 1С 8.3?
Это одно и то же по сути, но разные названия в разных версиях. «Табличное поле» — термин 8.1 и 8.2, в 8.3 с интерфейсом «Такси» элемент формы называется «Таблица». Данные под ним — таблица значений, табличная часть или динамический список.
С какого номера начинается индексация строк и колонок?
С нуля. Первая строка — Таблица[0], последняя — Таблица[Таблица.Количество() - 1]. Индекс колонки в методе Установить() тоже отсчитывается от нуля.
Можно ли добавить колонку в табличную часть документа кодом?
Нет. Реквизиты табличной части описаны в конфигураторе, программно их не добавляют. Динамически менять колонки можно только у таблицы значений через Колонки.Добавить() и Колонки.Удалить().
Как заполнить табличную часть из таблицы значений быстрее всего?
Методом Загрузить() — он переносит все строки разом. Главное, чтобы имена колонок таблицы значений совпадали с именами реквизитов табличной части.
Как обратиться к текущей строке таблицы на форме?
Через Элементы.ИмяТаблицы.ТекущиеДанные — это строка, на которой стоит курсор. Из неё читают и пишут ячейки в обработчиках событий формы.