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