Новая строка в документе, справочнике и регистре 1С 8.3: кнопки, горячие клавиши и встроенный язык
Содержание
Чтобы добавить строку в табличную часть документа 1С, нажмите кнопку Добавить над таблицей или клавишу Insert, затем заполните ячейки и нажмите Enter. В коде строку в 1С добавляют методом Добавить() табличной части: НоваяСтрока = Объект.Товары.Добавить();, после чего присваивают значения колонкам.
Это работает одинаково в Бухгалтерии 3.0, ЗУП 3.1, УТ 11 и других конфигурациях на платформе 8.3 с интерфейсом «Такси»: механизм табличных частей общий для платформы.
Как добавить строку в табличную часть вручную
Табличная часть — это таблица внутри формы: «Товары» в накладной, «Начисления» в документе зарплаты, «Услуги» в акте. У каждой такой таблицы своя командная панель.
Основные способы
- Кнопка
Добавитьнад таблицей. Появляется пустая строка, курсор встаёт в первую доступную колонку. - Клавиша
Insert(Ins), когда фокус стоит в таблице. Делает то же самое, только без мыши. - Копирование строки клавишей
F9(или командойСкопироватьв менюЕщё). Удобно, когда новая строка отличается от соседней только количеством или ценой. - Кнопка
Подборв документах с товарами и услугами. Открывает список номенклатуры, где можно набрать сразу десяток позиций с количеством и перенести их одним нажатием. - Кнопка
Заполнить, если она есть в документе. Строки создаются автоматически по документу-основанию, остаткам или другим данным базы.
После ввода значения в ячейку переходите к следующей колонке клавишей 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С должна быть запущена с параметром
-debug, иначе серверный код не остановится. - Запустите
Отладка → Начать отладку → 1С:Предприятие. - Поставьте точку останова на строке с
Добавить()клавишейF9. - Выполните действие в пользовательском режиме. Когда выполнение остановится, проходите код по строкам:
F10— шаг через процедуру,F11— шаг внутрь. - Нажмите
Shift+F9и вычислитеОбъект.Товары.Количество(). Число строк должно вырасти на один после вызоваДобавить().
Если точка останова не срабатывает, проверьте, на какой стороне выполняется код. Процедура с &НаСервере останавливается только при отладке сервера, а не клиента.
Как быстро загрузить тысячи строк
Добавлять по одной строке через Добавить() для пары сотен позиций нормально. На десятках тысяч строк скорость падает из-за лишних обращений к базе.
Загрузка таблицы целиком
Если данные уже собраны в таблицу значений с такими же именами колонок, загрузите её одной командой:
ТаблицаТоваров = Запрос.Выполнить().Выгрузить();
ДокументОбъект.Товары.Загрузить(ТаблицаТоваров);
Загрузить() заменяет все строки табличной части. Если нужно дописать к существующим, используйте цикл с ЗаполнитьЗначенияСвойств:
Для Каждого СтрокаИсточника Из ТаблицаТоваров Цикл
НоваяСтрока = ДокументОбъект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточника);
КонецЦикла;
ЗаполнитьЗначенияСвойств копирует все колонки с совпадающими именами, так код короче и в нём меньше опечаток.
Что ещё ускоряет загрузку
- 🚀 Один запрос вместо обращений через точку. Цикл с
СтрокаТЧ.Номенклатура.ЕдиницаИзмерениядля каждой строки читает элемент из базы. Получите нужные поля одним запросом заранее. - 🚀 Запись пачками в транзакции. При создании элементов справочника оборачивайте по 500–1000 записей в
НачатьТранзакцию()иЗафиксироватьТранзакцию(), сОтменитьТранзакцию()в обработке исключения. - 🚀 Пересчёт сумм на сервере один раз после заполнения всех строк, а не после каждой.
- 🚀 Загрузка на сервере, а не на клиенте. Передача тысяч строк между клиентом и сервером медленнее, чем обработка на месте.
Флаг ОбменДанными.Загрузка = Истина отключает проверки и обработчики при записи и заметно ускоряет загрузку. Но вместе с ними отключается и заполнение служебных реквизитов. Используйте его только в обработках обмена, где вы точно знаете, что пропускается. Перед массовой загрузкой в рабочую базу сделайте резервную копию.
Частые вопросы
Как добавить строку в середину табличной части?
Переместить вверх или Переместить вниз. В коде — методом Вставить(Индекс), где индекс отсчитывается от нуля.Сколько строк может быть в табличной части?
Можно ли добавить новую колонку, а не строку?
Ещё → Изменить форму.Можно ли запретить пользователю добавлять строки?
ИзменятьСоставСтрок или в обработчике ПередНачаломДобавления установите Отказ = Истина по своему условию.Как удалить строку программно?
Удалить() табличной части: Объект.Товары.Удалить(СтрокаТЧ). При удалении в цикле перебирайте строки с конца, иначе часть строк будет пропущена.