Как программно добавить несколько строк в табличную часть в 1С:Предприятие 8?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке конфигураций на платформе 1С часто возникает задача автоматизации ввода данных. Одной из типичных задач является программное заполнение или добавление пустых строк в табличную часть документа или справочника. В этой статье мы подробно рассмотрим, как реализовать добавление нескольких строк, разберем особенности работы в управляемых формах и изучим методы оптимизации этого процесса.

Базовый метод добавления строки: использование цикла

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

Рассмотрим пример кода, который можно разместить в обработчике команды на сервере:


// Процедура на сервере для добавления строк
&НаСервере
Процедура ДобавитьПятьСтрокНаСервере()
    Для Итератор = 1 По 5 Цикл
        НоваяСтрока = Объект.Товары.Добавить();
        // На данном этапе строка уже создана и добавлена в конец коллекции
        // Мы можем сразу заполнить некоторые реквизиты по умолчанию
        НоваяСтрока.Количество = 1;
        НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
    КонецЦикла;
КонецПроцедуры

В данном примере Объект.Товары — это обращение к табличной части документа. Метод Добавить() возвращает объект только что созданной строки, что позволяет нам сразу обращаться к ее колонкам.

Особенности работы в управляемых формах

В управляемом приложении важно понимать разницу между данными, с которыми мы работаем. Когда мы находимся в модуле формы, табличная часть представлена типом ДанныеФормыКоллекция. Разберем основные моменты:

  1. Выполнение на клиенте: Мы можем добавлять строки и на стороне клиента. Это удобно, если не требуется обращение к базе данных для получения цен или остатков. Код будет выглядеть практически так же, обращение идет через Объект.ИмяТЧ.
  2. Выполнение на сервере: Если при добавлении строк нужно выполнять сложные расчеты, поиск ссылок или проверку остатков, код следует выносить в процедуру &НаСервере.
  3. Обновление интерфейса: Платформа автоматически отслеживает изменения в ДанныеФормыКоллекция, поэтому после завершения серверного вызова новые строки сразу появятся на экране пользователя.

Использование метода Вставить для управления позицией

Метод Добавить() всегда помещает новую строку в самый конец таблицы. Однако бывают ситуации, когда новые данные должны быть в начале списка или после определенной строки. В этом случае проанализируем метод Вставить().

Синтаксис метода: Вставить(Индекс). Индексация в 1С начинается с нуля. Посмотрим на пример добавления строк в начало таблицы:


Для Индекс = 0 По 4 Цикл
    // Каждая новая строка будет вставляться на первую позицию (индекс 0)
    НоваяСтрока = Объект.Товары.Вставить(0);
    НоваяСтрока.Примечание = "Срочно к обработке";
КонецЦикла;

Массовое заполнение и метод Загрузить

Если задача стоит более масштабно — например, нужно добавить не 5, а 500 строк из внешнего источника — использование метода Добавить() в цикле может привести к замедлению работы интерфейса. В таких случаях мы рекомендуем использовать временную таблицу значений.

Рассмотрим алгоритм действий:

  1. Создаем объект ТаблицаЗначений на сервере.
  2. Наполняем её нужными данными в цикле.
  3. Используем метод Загрузить() для мгновенного переноса данных в табличную часть.

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

Улучшение пользовательского опыта (UX)

Программное добавление строк часто дезориентирует пользователя: курсор остается на старом месте, а новые строки могут оказаться за пределами видимости (внизу списка). Выясним, как сделать работу удобнее.

Чтобы автоматически перевести фокус на первую из созданных строк и активизировать конкретную колонку, используем свойства элемента формы:


&НаКлиенте
Процедура КомандаДобавитьИПерейти(Команда)
    // Добавляем строку
    НоваяСтрока = Объект.Товары.Добавить();
    ИдентификаторСтроки = НоваяСтрока.ПолучитьИдентификатор();
    
    // Устанавливаем текущую строку в элементе формы "Товары"
    Элементы.Товары.ТекущаяСтрока = ИдентификаторСтроки;
    
    // Переводим фокус в режим редактирования колонки "Номенклатура"
    Элементы.Товары.ТекущийЭлемент = Элементы.ТоварыНоменклатура;
    Элементы.Товары.ИзменитьЭлемент();
КонецПроцедуры

Метод ИзменитьЭлемент() позволяет пользователю сразу начать ввод данных без лишних кликов мышкой, что значительно повышает скорость работы.

Функция ЗаполнитьЗначенияСвойств

Часто новые строки должны содержать те же данные, что и какая-то эталонная строка или структура. Чтобы не писать вручную присвоение для каждой колонки (Строка.Колонка1 = ..., Строка.Колонка2 = ...), проанализируем функцию ЗаполнитьЗначенияСвойств.

Она сопоставляет имена свойств источника и приемника и копирует значения. Это делает код чище и защищает от ошибок при добавлении новых реквизитов в табличную часть в будущем.


ИсточникДанных = Новый Структура("Склад, ЕдиницаИзмерения", СкладОтгрузки, Штуки);
Для Итератор = 1 По 5 Цикл
    НоваяСтрока = Объект.Товары.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, ИсточникДанных);
КонецЦикла;

Подведение итогов

Мы рассмотрели различные подходы к программному управлению строками. Для простых задач достаточно обычного цикла и метода Добавить(). Для сложных интерфейсных решений важно помнить об управлении фокусом через Элементы формы. А для высокопроизводительных операций лучше использовать работу с таблицами значений на сервере.

Помните, что при программном добавлении строк через метод Добавить() события формы, такие как ПередДобавлением, не вызываются. Если в этих событиях заложена бизнес-логика, её необходимо вызвать принудительно или вынести в общие модули для повторного использования.

← На главную