Новая строка в документе, справочнике и регистре 1С 8.3: кнопки, горячие клавиши и встроенный язык

· 9 мин

Содержание

Чтобы добавить строку в табличную часть документа 1С, нажмите кнопку Добавить над таблицей или клавишу Insert, затем заполните ячейки и нажмите Enter. В коде строку в 1С добавляют методом Добавить() табличной части: НоваяСтрока = Объект.Товары.Добавить();, после чего присваивают значения колонкам.

Это работает одинаково в Бухгалтерии 3.0, ЗУП 3.1, УТ 11 и других конфигурациях на платформе 8.3 с интерфейсом «Такси»: механизм табличных частей общий для платформы.

Как добавить строку в табличную часть вручную

Табличная часть — это таблица внутри формы: «Товары» в накладной, «Начисления» в документе зарплаты, «Услуги» в акте. У каждой такой таблицы своя командная панель.

Основные способы

  1. Кнопка Добавить над таблицей. Появляется пустая строка, курсор встаёт в первую доступную колонку.
  2. Клавиша Insert (Ins), когда фокус стоит в таблице. Делает то же самое, только без мыши.
  3. Копирование строки клавишей F9 (или командой Скопировать в меню Ещё). Удобно, когда новая строка отличается от соседней только количеством или ценой.
  4. Кнопка Подбор в документах с товарами и услугами. Открывает список номенклатуры, где можно набрать сразу десяток позиций с количеством и перенести их одним нажатием.
  5. Кнопка Заполнить, если она есть в документе. Строки создаются автоматически по документу-основанию, остаткам или другим данным базы.

После ввода значения в ячейку переходите к следующей колонке клавишей Tab или Enter. Редактирование строки заканчивается, когда вы уходите с неё стрелкой вниз или нажимаете Enter в последней колонке.

Горячие клавиши для работы со строками

ДействиеКлавиша
Добавить новую строкуInsert
Скопировать текущую строкуF9
Начать редактирование ячейкиF2 или Enter
Удалить строкуDelete
Отменить ввод в ячейкеEsc

Новая строка по кнопке Добавить встаёт в конец таблицы. Чтобы она оказалась на нужном месте, после ввода переместите её командами Переместить вверх и Переместить вниз из меню Ещё или стрелками на панели, если они выведены.

Загрузка строк из таблицы Excel

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

Если такой команды в вашей конфигурации нет, используют внешнюю обработку загрузки данных из табличного документа. Её запускают через Файл → Открыть, а в рабочей базе с включённой защитой нужно отдельно разрешить её запуск.

Программное добавление строки во встроенном языке

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

Строка в объекте документа на сервере

ДокументОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
ДокументОбъект.Дата = ТекущаяДатаСеанса();

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

ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);

Здесь Сумма получится 6 000. Имена реквизитов в типовых конфигурациях бывают другими, поэтому сверяйте их в дереве метаданных конфигуратора.

Вставка строки в определённую позицию

Метод Вставить(Индекс) создаёт строку на указанном месте. Индексы начинаются с нуля:

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

Колонку НомерСтроки заполнять не нужно: платформа пересчитывает номера сама.

Строка в форме документа на клиенте

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

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

Если нужно, чтобы строка открылась на редактирование так же, как после нажатия Insert, вызовите Элементы.Товары.ДобавитьСтроку(). Это интерактивное добавление: сработают все обработчики, которые стоят на событиях таблицы формы.

Строка в таблице значений и реквизите формы

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

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

НоваяСтрока = Таблица.Добавить();
НоваяСтрока.Сотрудник = СотрудникСсылка;
НоваяСтрока.Сумма = 45000;

Если таблица — реквизит формы, на клиенте это коллекция данных формы. Строки в неё добавляют так же, но таблицу значений целиком на клиент не передают: на сервере её помещают в реквизит методом ЗначениеВРеквизитФормы(Таблица, "ИмяРеквизита"), а обратно забирают через РеквизитФормыВЗначение("ИмяРеквизита").

Такие строки нигде не хранятся после закрытия формы, если вы сами не запишете их в документ или регистр.

Чем отличаются способы

СпособГде вызыватьСрабатывают обработчики формы
Объект.Товары.Добавить()Клиент или сервер формыНет
Элементы.Товары.ДобавитьСтроку()КлиентДа, как при ручном вводе
ДокументОбъект.Товары.Добавить()Сервер, без формыНет
ТабличнаяЧасть.Вставить(Индекс)Там же, где Добавить()Нет

Автоматический пересчёт сумм при добавлении строки

Когда пользователь вводит количество, сумма пересчитывается не сама по себе. Её считает обработчик события ПриИзменении у поля «Количество» или «Цена» в форме.

Отсюда главный подвох: при программном добавлении строки обработчики ПриИзменении не вызываются. Если вы заполнили количество и цену кодом, сумма, НДС и скидка останутся пустыми.

Как это исправить

  • ✅ Посчитайте сумму прямо в коде, как в примере выше.
  • ✅ Вызовите ту же процедуру пересчёта, которую вызывает обработчик поля. Найдите её в модуле формы: откройте свойства поля «Количество», раздел событий, и перейдите к обработчику ПриИзменении.
  • ✅ Используйте интерактивное ДобавитьСтроку(), если сценарий допускает участие пользователя.

События таблицы формы

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

  • 📌 ПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) — сработает при начале ввода. Параметр НоваяСтрока равен Истина для добавленной строки, Копирование — для скопированной по F9.
  • 📌 ПриОкончанииРедактирования — после завершения ввода строки, удобно для итоговых пересчётов.
  • 📌 ПередНачаломДобавления — здесь можно запретить добавление, установив Отказ = Истина.
&НаКлиенте
Процедура ТоварыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	Если НоваяСтрока И Не Копирование Тогда
		Элемент.ТекущиеДанные.Количество = 1;
	КонецЕсли;
КонецПроцедуры

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

Добавление строк в справочники и регистры

«Добавить строку» в справочник означает создать новый элемент. В регистр — новую запись. Механика у них разная.

Справочник

Вручную: откройте список справочника и нажмите Создать или Insert. Клавиша F9 в списке тоже копирует выделенный элемент, после чего остаётся поменять пару полей.

В коде:

НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Кабель ВВГ 3х2,5";
НовыйЭлемент.Записать();

Табличная часть самого справочника, например список штрихкодов или контактной информации, пополняется так же, как у документа: НовыйЭлемент.ИмяТабличнойЧасти.Добавить(), затем запись элемента.

Регистр сведений

В списке независимого регистра сведений есть кнопка Создать. В коде одну запись удобно создавать менеджером записи:

Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
Запись.Период = НачалоДня(ТекущаяДатаСеанса());
Запись.Валюта = ВалютаСсылка;
Запись.Курс = 92.5;
Запись.Кратность = 1;
Запись.Записать();

Если записей много, работают через набор записей: СоздатьНаборЗаписей(), установка отбора, Добавить() для каждой строки и Записать(). Без отбора запись набора заменит весь регистр, поэтому отбор ставьте всегда.

Регистры накопления и бухгалтерии

Строку в такой регистр руками не добавить: записи появляются только при проведении документов. Для корректировки остатков используют документ корректировки, а в Бухгалтерии 3.0 проводки вручную вводят документом «Операция» в журнале операций.

В коде движения пишут в модуле проведения документа:

Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = СтрокаТЧ.Номенклатура;
Движение.Количество = СтрокаТЧ.Количество;
Движения.ТоварыНаСкладах.Записывать = Истина;

Имя регистра в примере условное, в вашей конфигурации оно своё.

Отладка: почему строка не добавляется или пропадает

Если код отработал без ошибок, а строки в документе нет, проверьте по порядку.

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

Как пройти код отладчиком

  1. Для файловой базы ничего настраивать не нужно. Для клиент-серверной служба сервера 1С должна быть запущена с параметром -debug, иначе серверный код не остановится.
  2. Запустите Отладка → Начать отладку → 1С:Предприятие.
  3. Поставьте точку останова на строке с Добавить() клавишей F9.
  4. Выполните действие в пользовательском режиме. Когда выполнение остановится, проходите код по строкам: F10 — шаг через процедуру, F11 — шаг внутрь.
  5. Нажмите Shift+F9 и вычислите Объект.Товары.Количество(). Число строк должно вырасти на один после вызова Добавить().

Если точка останова не срабатывает, проверьте, на какой стороне выполняется код. Процедура с &НаСервере останавливается только при отладке сервера, а не клиента.

Как быстро загрузить тысячи строк

Добавлять по одной строке через Добавить() для пары сотен позиций нормально. На десятках тысяч строк скорость падает из-за лишних обращений к базе.

Загрузка таблицы целиком

Если данные уже собраны в таблицу значений с такими же именами колонок, загрузите её одной командой:

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

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

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

ЗаполнитьЗначенияСвойств копирует все колонки с совпадающими именами, так код короче и в нём меньше опечаток.

Что ещё ускоряет загрузку

  • 🚀 Один запрос вместо обращений через точку. Цикл с СтрокаТЧ.Номенклатура.ЕдиницаИзмерения для каждой строки читает элемент из базы. Получите нужные поля одним запросом заранее.
  • 🚀 Запись пачками в транзакции. При создании элементов справочника оборачивайте по 500–1000 записей в НачатьТранзакцию() и ЗафиксироватьТранзакцию(), с ОтменитьТранзакцию() в обработке исключения.
  • 🚀 Пересчёт сумм на сервере один раз после заполнения всех строк, а не после каждой.
  • 🚀 Загрузка на сервере, а не на клиенте. Передача тысяч строк между клиентом и сервером медленнее, чем обработка на месте.

Флаг ОбменДанными.Загрузка = Истина отключает проверки и обработчики при записи и заметно ускоряет загрузку. Но вместе с ними отключается и заполнение служебных реквизитов. Используйте его только в обработках обмена, где вы точно знаете, что пропускается. Перед массовой загрузкой в рабочую базу сделайте резервную копию.

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

Как добавить строку в середину табличной части?
Вручную — добавьте строку и переместите её командами Переместить вверх или Переместить вниз. В коде — методом Вставить(Индекс), где индекс отсчитывается от нуля.
Сколько строк может быть в табличной части?
Жёсткого предела для практических задач нет, но документ на десятки тысяч строк долго открывается и проводится. Такие объёмы лучше делить на несколько документов.
Можно ли добавить новую колонку, а не строку?
Да, но это изменение конфигурации: реквизит табличной части добавляют в конфигураторе или в расширении. В пользовательском режиме можно только показать или скрыть уже существующие колонки через Ещё → Изменить форму.
Можно ли запретить пользователю добавлять строки?
Да. В свойствах элемента таблицы формы снимите флажок ИзменятьСоставСтрок или в обработчике ПередНачаломДобавления установите Отказ = Истина по своему условию.
Как удалить строку программно?
Методом Удалить() табличной части: Объект.Товары.Удалить(СтрокаТЧ). При удалении в цикле перебирайте строки с конца, иначе часть строк будет пропущена.