Быстрый старт · 10 мин
Как вставить строку в таблицу в 1С
Как вставить строку в табличную часть документа в 1С клавишами и кнопками, а также программно через Добавить() и Вставить(). Примеры кода, ошибки и FAQ.
Фраза «вставить строку в таблицу» в 1С означает две разные задачи. Первая — пользовательская: добавить строку в табличную часть документа, например новую позицию в «Реализацию товаров и услуг» или в заказ поставщику. Вторая — разработческая: программно вставить строку в табличную часть, таблицу значений или область табличного документа при печати. Ниже разобраны оба сценария с точными действиями и кодом.
В пользовательском режиме всё сводится к сочетанию клавиш, кнопке «Добавить» или команде контекстного меню. В режиме разработчика используются методы Добавить() и Вставить(), причём у них принципиально разное поведение: первый добавляет строку в конец, второй — в произвольную позицию. Путаница между ними — частая причина ошибок в обработках.
Важный нюанс: вставить строку «в середину» списка в пользовательском режиме типовых конфигураций можно далеко не всегда. Обычно строка добавляется в конец, а порядок затем меняется кнопками перемещения. Как обойти это ограничение — в отдельном разделе.
Как добавить строку в табличную часть документа в пользовательском режиме
Откройте документ, например «Поступление товаров и услуг», и перейдите на вкладку с табличной частью («Товары», «Услуги»). Поставьте курсор в любую строку таблицы и нажмите клавишу Insert (Ins) — в конец списка добавится пустая строка, готовая к заполнению. Это самый быстрый способ, он работает практически во всех конфигурациях: «Бухгалтерия предприятия», «Управление торговлей», «ERP», «Зарплата и управление персоналом».
Альтернатива — кнопка «Добавить» на командной панели таблицы (обычно значок с зелёным плюсом) или пункт «Добавить» в контекстном меню по правой кнопке мыши. В управляемых формах также доступна кнопка «Ещё» → «Добавить». Если нужно добавить строку, похожую на существующую, используйте копирование: клавиша F9 или команда «Скопировать» — новая строка создастся с уже заполненными полями, останется поправить количество и цену.
После добавления заполните обязательные поля: номенклатуру, количество, цену. Признак успешного добавления — строка отображается в списке, документ проводится без сообщений о незаполненных полях. Если программа при записи выдаёт сообщение «Не заполнена колонка…», значит, в новой строке пропущено обязательное поле.
- 1Откройте документ и перейдите на вкладку с табличной частью
- 2Установите курсор в таблицу и нажмите Insert или кнопку «Добавить»
- 3Заполните обязательные поля новой строки: номенклатуру, количество, цену
- 4Запишите и проведите документ, убедитесь в отсутствии сообщений об ошибках
Как вставить строку в середину списка, а не в конец
В типовых формах новая строка почти всегда попадает в конец табличной части — кнопки «вставить выше текущей» в стандартном интерфейсе нет. Чтобы расположить строку в нужном месте, добавьте её в конец, а затем переместите кнопками со стрелками «Переместить вверх» / «Переместить вниз» на командной панели таблицы или сочетаниями Ctrl+Shift+стрелка вверх/вниз.
Если строк много, удобнее отсортировать таблицу по нужной колонке (клик по заголовку колонки) или использовать подбор: кнопка «Подбор» открывает форму выбора номенклатуры, где можно добавить сразу несколько позиций. Учтите, что порядок строк в табличной части влияет на порядок вывода в печатную форму, поэтому перед печатью проверьте нумерацию.
Программное добавление строки: метод Добавить()
Во встроенном языке 1С строка в табличную часть объекта добавляется методом Добавить(). Метод возвращает новую строку, у которой сразу можно заполнить реквизиты. Типовой фрагмент для документа:
НоваяСтрока = ДокументОбъект.Товары.Добавить();
НоваяСтрока.Номенклатура = НоменклатураСсылка;
НоваяСтрока.Количество = 5;
НоваяСтрока.Цена = 1200;
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Тот же метод работает для таблицы значений: ТаблицаЗначений.Добавить() создаёт строку с пустыми значениями колонок, описанных в коллекции Колонки. Если колонка не добавлена в таблицу значений явно, обращение к ней вызовет ошибку «Поле объекта не обнаружено» — это одна из самых частых проблем у начинающих разработчиков.
Для табличного поля на форме добавление через Элементы.Товары.ДобавитьСтроку() (управляемые формы) инициирует интерактивное добавление с отработкой событий «ПриНачалеРедактирования». Если нужно добавить строку без интерактива, работайте с данными формы — реквизитом типа «ДанныеФормыКоллекция», а не с элементом формы.
Вставка строки в нужную позицию: метод Вставить()
Метод Вставить(Индекс) вставляет строку в произвольную позицию коллекции. Индексация в 1С начинается с нуля: Товары.Вставить(0) вставит строку первой, сдвинув остальные вниз. Если передать индекс, равный количеству строк, поведение будет аналогично Добавить().
// Вставить строку второй в табличной части
НоваяСтрока = ДокументОбъект.Товары.Вставить(1);
НоваяСтрока.Номенклатура = НоменклатураСсылка;
НоваяСтрока.Количество = 1;
Для перемещения уже существующей строки используйте метод Сдвинуть(Строка, Смещение): Товары.Сдвинуть(Товары[5], -2) поднимет шестую строку на две позиции вверх. Отрицательное смещение двигает строку к началу, положительное — к концу.
Добавить() или Вставить()
Строка попадает в конец коллекции. Подходит для большинства обработок загрузки данных, когда порядок не важен или задаётся сортировкой.
Строка вставляется в заданную позицию, остальные сдвигаются. Нужен, когда порядок строк значим, например при формировании спецификации с фиксированной структурой.
Не создаёт строку, а меняет позицию существующей. Применяется для переупорядочивания без потери заполненных данных.
Вставка строки в табличный документ при формировании печатной формы
Отдельный случай — табличный документ (объект ТабличныйДокумент), из которого формируются печатные формы. Здесь «строка» — это область, и вставляется она методом ВставитьОбласть(). Это нужно, когда требуется встроить дополнительные строки в уже сформированную часть документа, например вставить итоговую строку между секциями.
ТабДок = Новый ТабличныйДокумент;
// ... вывод основных областей ...
ОбластьПриемник = ТабДок.Область(5, , 5, ); // строка 5
ТабДок.ВставитьОбласть(Макет.Область("СтрокаИтог"), ОбластьПриемник);
В большинстве задач вместо вставки используется последовательный вывод через Вывести() и Присоединить() — это проще и предсказуемее. ВставитьОбласть() оправдан, когда документ уже сформирован и нужно вклинить область в середину, не перестраивая весь вывод.
Типичные ошибки и как их избежать
Самая распространённая ошибка пользователей — попытка добавить строку в документ, который недоступен для редактирования: закрыт период, документ помечен на удаление или у пользователя нет прав. Признак — неактивные кнопки «Добавить» и Insert не срабатывает. Проверьте дату запрета редактирования и права доступа.
У разработчиков лидируют три проблемы: обращение к колонке, которой нет в таблице значений; забытый Записать() после программного добавления строки в объект (данные теряются при закрытии); и путаница между данными формы и элементом формы в управляемом приложении. Ещё одна ловушка — модификация коллекции внутри цикла обхода этой же коллекции: при вставке строк в цикле Для Каждого легко получить бесконечный цикл, поэтому вставляйте в отдельный проход или по индексам с конца.
Как проверить результат
Строка видна в списке, документ проводится без сообщений
Сообщение о незаполненных полях или строка исчезает после записи
После Записать() строка присутствует при повторном открытии объекта
Строка есть только до закрытия формы — значит, объект не записан
Строка стоит на нужном месте, нумерация пересчитана
Строка в конце — вероятно, использован Добавить() вместо Вставить()
Ответы на частые вопросы
Почему клавиша Insert не добавляет строку в таблицу?
Чаще всего курсор не находится в табличной части — кликните в любую ячейку таблицы и повторите. Другие причины: документ открыт только на просмотр, установлена дата запрета редактирования, нет прав на изменение, либо табличная часть доступна только для чтения по логике формы (например, документ основан на другом и заблокирован).
Можно ли вставить сразу несколько строк в табличную часть?
Интерактивно — через кнопку «Подбор», где в форме выбора отмечается несколько позиций номенклатуры, или копированием из буфера обмена, если конфигурация поддерживает вставку из Excel. Программно — циклом с вызовом Добавить() для каждой строки источника данных.
Как скопировать строку в табличной части, а не создавать пустую?
Выделите строку и нажмите F9 или выберите «Скопировать» в контекстном меню. Программно используйте методы ЗаполнитьЗначенияСвойств() для новой строки со ссылкой на строку-источник, либо Выгрузить()/Загрузить() для таблиц значений.
Чем отличается вставка строки в табличную часть от таблицы значений?
Табличная часть — хранилище данных объекта (документа, справочника), строки сохраняются в базе при записи объекта. Таблица значений — временная структура в памяти для промежуточных расчётов; её строки никуда не сохраняются, пока вы явно не перенесёте данные в объект или регистр.
Почему программно добавленная строка исчезает после закрытия формы?
Потому что изменения выполнены только в данных формы или в объекте в памяти, но объект не записан. Добавьте вызов Записать() у объекта документа. Если работа идёт в форме, убедитесь, что изменяется реквизит формы с данными объекта, а не локальная копия коллекции.
Как вставить строку в таблицу на управляемой форме из кода?
Обращайтесь к реквизиту формы с данными коллекции: Объект.Товары.Добавить() в модуле формы. Для интерактивного добавления с отработкой событий используйте Элементы.Товары.ДобавитьСтроку(). Прямое создание строки через элемент формы без данных не сработает — элемент лишь отображает коллекцию.
Что важно запомнить
В пользовательском режиме строка добавляется клавишей Insert, кнопкой «Добавить» или копированием (F9) и попадает в конец списка — позицию меняйте кнопками перемещения. Программно используйте Добавить() для конца коллекции, Вставить(Индекс) для конкретной позиции и ВставитьОбласть() для табличного документа. После программных изменений объекта обязательно вызывайте Записать(), а перед массовыми обработками делайте резервную копию базы.