Заполнение табличного поля в 1С: код и примеры
Содержание
Табличное поле заполняют построчно: сначала готовят колонки с нужными типами, затем добавляют строки методом Добавить() и записывают значения в ячейки — по имени колонки (Строка.Цена = 250) или по индексу (Строка.Установить(2, 250)). Для массового заполнения табличной части документа из готового набора данных есть Загрузить().
Сразу про термин. «Табличное поле» — это название из версий 8.1 и 8.2. В 1С 8.3 с интерфейсом «Такси» элемент формы называется Таблица, а данные под ним — это либо таблица значений (ТаблицаЗначений), либо табличная часть документа или справочника (ТабличнаяЧасть), либо динамический список. Приёмы заполнения зависят именно от источника данных, поэтому разберём каждый.
Готовим колонки и источник данных
Перед записью строк нужно понимать, с чем работаете. Элемент формы «Таблица» сам данные не хранит — он их только показывает. Данные лежат в объекте под ним.
Три типичных источника:
- 🧮 Таблица значений — временный набор данных в памяти, создаётся кодом. Колонки задаёте сами.
- 📄 Табличная часть объекта (
Товары,Услугии т. п.) — колонки уже описаны в конфигураторе как реквизиты табличной части, менять их кодом нельзя. - 🔁 Динамический список — заполняется запросом, строки программно не добавляют.
Для таблицы значений колонки создают методом Колонки.Добавить() — указывают имя, тип и при необходимости заголовок:
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
Таблица.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"), "Кол-во");
Таблица.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
Таблица.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
Тип колонки задавайте через ОписаниеТипов сразу. Если тип не указать, колонка примет значение любого типа — это удобно на черновиках, но потом при записи в типизированную табличную часть документа такие данные могут не подойти.
У табличной части документа колонки описаны в конфигураторе, их структуру кодом не формируют — вы сразу переходите к добавлению строк. Операции с ТаблицаЗначений чаще выполняют в серверном контексте (&НаСервере): объект тяжёлый, и его перебор на клиенте замедляет форму.
Добавляем строки и записываем значения в ячейки
Новая строка появляется методом Добавить(). Он возвращает саму строку — её сразу удобно записать в переменную и заполнить ячейки:
НоваяСтрока = Таблица.Добавить();
НоваяСтрока.Номенклатура = ВыбраннаяНоменклатура;
НоваяСтрока.Количество = 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, а не Количество().Для Каждого. Переделайте на цикл Пока от конца к началу.Ещё один тонкий момент — контекст. Таблица значений живёт на сервере; если собрать её в серверной процедуре и попытаться обратиться на клиенте без передачи, данных там не окажется. Собирайте и обрабатывайте таблицу значений в одном серверном вызове, а на форму отдавайте уже готовый результат.
Частые вопросы
Чем «табличное поле» отличается от «таблицы» в 1С 8.3?
С какого номера начинается индексация строк и колонок?
Таблица[0], последняя — Таблица[Таблица.Количество() - 1]. Индекс колонки в методе Установить() тоже отсчитывается от нуля.Можно ли добавить колонку в табличную часть документа кодом?
Колонки.Добавить() и Колонки.Удалить().Как заполнить табличную часть из таблицы значений быстрее всего?
Загрузить() — он переносит все строки разом. Главное, чтобы имена колонок таблицы значений совпадали с именами реквизитов табличной части.Как обратиться к текущей строке таблицы на форме?
Элементы.ИмяТаблицы.ТекущиеДанные — это строка, на которой стоит курсор. Из неё читают и пишут ячейки в обработчиках событий формы.