Работа с табличными частями в 1С:Предприятие — одна из самых частых задач как для программистов, так и для опытных пользователей. Добавление строк может потребоваться при заполнении документов, справочников или регистров, но не всегда очевидно, какой метод выбрать: встроенные инструменты платформы, программный код или обработки. Неправильный подход приводит к ошибкам вроде дублирования данных, нарушения ссылочной целостности или даже падения системы при массовых операциях.

Эта статья охватывает все актуальные способы добавления строк — от ручного ввода через интерфейс до автоматизации с помощью встроенного языка и Query. Мы разберём нюансы для разных версий платформы (8.3.20+), типичные ошибки при работе с реквизитами табличных частей и оптимальные сценарии применения каждого метода. Особое внимание уделено производительности: почему Добавить() в цикле работает медленнее, чем массовая вставка через Загрузить(), и как этого избежать.

Если вы только начинаете осваивать , начните с первых двух разделов — там описаны базовые действия без кода. Опытным разработчикам будет полезен раздел про оптимизацию и сравнительная таблица методов.

📊 Какой способ добавления строк в 1С вы используете чаще?
Ручной ввод через интерфейс
Скрипты на встроенном языке
Обработки с формой
Запросы (Query)
Другой

1. Ручное добавление строк через интерфейс 1С

Самый простой способ — использовать стандартные кнопки формы. Он подходит для единичных операций, когда не требуется автоматизация. Рассмотрим пошагово, как добавить строку в табличную часть документа (например, "РеализацияТоваровУслуг"):

1. Откройте документ в режиме редактирования (двойной клик или кнопка Изменить).

2. Перейдите на вкладку с табличной частью (например, "Товары").

3. Нажмите кнопку Добавить (или сочетание клавиш Insert).

4. Заполните реквизиты новой строки: номенклатуру, количество, цену и т.д.

Если кнопка Добавить неактивна, проверьте:

  • 🔹 Права пользователя — возможно, у вас нет прав на редактирование документа.
  • 🔹 Статус документа — в проведённом или помеченном на удаление документе добавлять строки нельзя.
  • 🔹 Настройки формы — некоторые конфигурации скрывают кнопку добавления для определённых ролей.
💡

Чтобы быстро дублировать строку, выделите её и нажмите F9 (или Ctrl+D в новых версиях платформы). Это сэкономит время при заполнении похожих позиций.

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

2. Добавление строк через контекстное меню и горячие клавиши

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

Способ 1: Контекстное меню

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

Способ 2: Горячие клавиши

  • 🔹 Insert — добавить строку после текущей.
  • 🔹 Ctrl+Insert — добавить строку перед текущей (работает не во всех конфигурациях).
  • 🔹 Shift+Insert — вставить строку из буфера обмена (если поддерживается).

⚠️ Внимание: В тонком клиенте и веб-клиенте 1С:Предприятия некоторые сочетания клавиш могут конфликтовать с браузером. Например, Ctrl+D дублирует вкладку в Chrome. В этом случае используйте кнопки формы или настройте свои сочетания в параметрах платформы.

Как настроить свои горячие клавиши в 1С?

В файле 1CEStart.cfg (или через Параметры запуска в ярлыке) добавьте строку:

/HotKeysCustom="path\to\your\hotkeys.xml"

Где hotkeys.xml — файл с описанием пользовательских сочетаний. Подробнее см. документацию по платформе 8.3.20+.

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

Для автоматизации используйте методы встроенного языка. Основные сценарии:

  • 🔹 Добавление строк при проведении документа.
  • 🔹 Массовое заполнение табличных частей по алгоритму.
  • 🔹 Интеграция с внешними системами (например, загрузка из Excel).

Базовый синтаксис:

// Получаем объект документа

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

// Добавляем строку в табличную часть "Товары"

НоваяСтрока = Док.Товары.Добавить();

НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Монитор 24\"");

НоваяСтрока.Количество = 2;

НоваяСтрока.Цена = 15000;

// Сохраняем документ

Док.Записать();

⚠️ Внимание: Метод Добавить() возвращает ссылку на новую строку, а не её индекс. Если вам нужен индекс, используйте:

Индекс = Док.Товары.Количество() - 1;

Оптимизация для массового добавления:

В циклах избегайте многократного вызова Добавить() — это тормозит работу. Вместо этого:

ТабличнаяЧасть = Док.Товары;

ТабличнаяЧасть.Очистить();

Для Каждого Товар Из МассивТоваров Цикл

НоваяСтрока = ТабличнаяЧасть.Добавить();

НоваяСтрока.Номенклатура = Товар.Номенклатура;

НоваяСтрока.Количество = Товар.Количество;

КонецЦикла;

🔹 Убедиться, что документ не проведён

🔹 Проверить права на редактирование табличной части

🔹 Обработать исключения (например, отсутствие номенклатуры)

🔹 Оптимизировать код для больших объёмов данных

-->

4. Использование метода Загрузить() для массового добавления

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

Пример:

// Создаём массив структур с данными

МассивСтрок = Новый Массив();

Для Сч = 1 По 1000 Цикл

СтруктураСтроки = Новый Структура();

СтруктураСтроки.Вставить("Номенклатура", Справочники.Номенклатура.НайтиПоНаименованию("Товар" + Сч));

СтруктураСтроки.Вставить("Количество", 1);

МассивСтрок.Добавить(СтруктураСтроки);

КонецЦикла;

// Загружаем в табличную часть

Док.Товары.Загрузить(МассивСтрок);

Ключевые особенности:

  • 🔹 Загрузить() полностью заменяет текущее содержимое табличной части, если не использовать флаг Истина как второй параметр:
  • Док.Товары.Загрузить(МассивСтрок, Истина); // Добавляет строки к существующим
  • 🔹 Структура данных в массиве должна точно соответствовать структуре табличной части (имена реквизитов, типы значений).
  • 🔹 Метод не вызывает события ПриИзменении для отдельных строк.

⚠️ Внимание: При загрузке больших объёмов данных (10 000+ строк) разбейте массив на пакеты по 1 000–2 000 строк, чтобы избежать блокировки интерфейса.

💡

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

5. Добавление строк через запрос (Query)

Для сложных сценариев (например, когда данные берутся из нескольких таблиц) удобно использовать запросы. Этот метод требует знания языка запросов , но даёт максимальную гибкость.

Пример: добавление строк на основе остатков товаров

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ОстаткиТоваров.Номенклатура КАК Номенклатура,

| ОстаткиТоваров.КоличествоОстатков КАК Количество

|ИЗ

| РегистрНакопления.ОстаткиТоваров.Остатки() КАК ОстаткиТоваров

|ГДЕ

| ОстаткиТоваров.КоличествоОстатков > 0";

Результат = Запрос.Выполнить();

// Загружаем результат в табличную часть

Док.Товары.Загрузить(Результат.Выгрузить());

Когда использовать запросы:

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

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

Метод Скорость Сложность Когда использовать
Добавить() Низкая Просто Единичные строки, простая логика
Загрузить() Высокая Средне Массовая загрузка, интеграция
Запросы (Query) Средняя Сложно Сложные выборки, агрегация данных
Обработки с формой Низкая Просто Ручной ввод с дополнительными проверками

6. Типичные ошибки и как их избежать

Даже опытные разработчики сталкиваются с проблемами при работе с табличными частями. Разберём самые распространённые:

1. Дублирование строк

Причина: повторный вызов Добавить() без проверки на существование. Решение — проверяйте уникальность по ключевым реквизитам:

Если НЕ Док.Товары.НайтиСтроки(Новый Структура("Номенклатура", Номенклатура)).Количество() > 0 Тогда

Док.Товары.Добавить();

КонецЕсли;

2. Потеря ссылок после записи

Если вы сохраняете ссылку на строку (например, НоваяСтрока = Док.Товары.Добавить()), а затем записываете документ (Док.Записать()), ссылка становится недействительной. Чтобы избежать ошибок, используйте индексы или повторно получайте строку после записи.

3. Ошибки при загрузке данных

При использовании Загрузить() часто забывают про:

  • 🔹 Типы данных — например, передача строки вместо ссылки на справочник.
  • 🔹 Обязательные реквизиты — если в табличной части есть поля с признаком ЗаполнениеОбязательно.
  • 🔹 Уникальность — дубли по уникальным полям (например, серийные номера).

⚠️ Внимание: В конфигурациях с управляемыми формами (например, 1С:ERP или 1С:УТ 11) при программном добавлении строк может срабатывать логика формы (например, автоматическое заполнение цен). Чтобы отключить это, используйте параметр Ложь в методе Записать():

Док.Записать(Ложь); // Без оповещения формы о изменениях
Как отладить ошибки при добавлении строк?

1. Включите Режим отладки в конфигураторе (Сервис → Параметры → Отладка).

2. Установите точку останова на строке с Добавить() или Загрузить().

3. Проверьте значения переменных в Отладчике, особенно типы данных (например, не передаётся ли Неопределённо вместо ссылки).

4. Для запросов используйте Запрос.Выполнить().Выгрузить() в отладчике, чтобы увидеть результат выборки.

7. Оптимизация производительности

При работе с большими табличными частями (10 000+ строк) даже оптимальные методы могут тормозить. Советы по ускорению:

1. Отключите проверки на время загрузки

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

Док.ПроверятьЗаполнение = Ложь;

Док.Товары.Загрузить(БольшойМассивДанных);

Док.ПроверятьЗаполнение = Истина;

2. Используйте транзакции

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

НачатьТранзакцию();

Попытка

Док.Товары.Загрузить(Данные);

Док.Записать();

ЗафиксироватьТранзакцию();

Исключение

ОтменитьТранзакцию();

Сообщить(ОписаниеОшибки());

КонецПопытки;

3. Разбивайте данные на пакеты

При загрузке более 5 000 строк разбейте массив на части по 1 000–2 000 строк и вызывайте Загрузить() в цикле с паузой:

Для Инд = 0 По МассивДанных.ВГраница() Шаг 1000 Цикл

Пачка = МассивДанных.Получить(Инд, Мин(Инд + 999, МассивДанных.ВГраница()));

Док.Товары.Загрузить(Пачка, Истина);

Приостановить(0.1); // Даём время на обработку

КонецЦикла;

⚠️ Внимание: В клиент-серверном варианте работы пакетная загрузка может блокировать другие сеансы. Выполняйте такие операции в нерабочее время или на тестовой базе.

💡

Для максимальной производительности комбинируйте Загрузить() с отключением проверок и транзакциями. Это ускорит загрузку в 5–10 раз по сравнению с построкачным добавлением.

8. Работа с табличными частями в типовых конфигурациях

В типовых решениях (1С:Бухгалтерия, 1С:УТ, 1С:ERP) табличные части часто имеют дополнительную логику. Разберём нюансы для популярных документов:

1. Документ "РеализацияТоваровУслуг" (УТ 11, ERP)

  • 🔹 При добавлении строки автоматически заполняются цена и ставка НДС из регистра сведений ЦеныНоменклатуры.
  • 🔹 Поле ХарактеристикаНоменклатуры обязательно для товаров с несколькими характеристиками.
  • 🔹 Для услуг поле Номенклатура должно ссылаться на элемент с видом Услуга.

2. Документ "ПоступлениеТоваровУслуг" (УТ 11)

При добавлении строки проверяются:

  • 🔹 Серийные номера — если номенклатура ведётся по сериям, требуется заполнить реквизит Серии.
  • 🔹 Счета учёта — автоматически подставляются из настроек номенклатуры.
  • 🔹 Договоры — если в шапке документа указан договор, строки наследуют его реквизиты.

⚠️ Внимание: В 1С:ERP 2.5+ при добавлении строк в документ "ЗаказПокупателя" срабатывает механизм резервирования товаров. Если остатков недостаточно, строка не добавится. Чтобы обойти это, используйте параметр ПроверятьРезервы = Ложь при записи документа.

Для работы с типовыми конфигурациями полезно изучить их метаданные в конфигураторе (Файл → Открыть конфигурацию). Например, в 1С:Бухгалтерия 3.0 табличная часть "Товары" в документе "Поступление" имеет реквизиты СчетДт и СчетКт, которые обязательны для бухгалтерского учёта.

📊 С какой типовой конфигурацией 1С вы работаете чаще?
1С:Бухгалтерия
1С:Управление торговлей (УТ)
1С:ERP
1С:Зарплата и управление персоналом (ЗУП)
Другая/Самописная
❓ Как добавить строку в табличную часть, если кнопка "Добавить" неактивна?

Причины и решения:

  • 🔹 Документ проведён — снимите пометку проведения (Действия → Провести/Отменить проведение).
  • 🔹 Недостаточно прав — проверьте роль пользователя в Администрирование → Пользователи.
  • 🔹 Ограничение конфигурации — некоторые документы (например, "Инвентаризация" в УТ) блокируют редактирование после определенных действий.
  • 🔹 Режим "Только просмотр" — переключитесь в режим редактирования (Действия → Изменить).
❓ Можно ли добавить строку в табличную часть через мобильное приложение 1С?

Да, но с ограничениями:

  • 🔹 В 1С:Мобильной платформе поддерживаются только управляемые формы.
  • 🔹 Для добавления строки используйте длинное нажатие на табличную часть или кнопку + в интерфейсе.
  • 🔹 Программное добавление возможно через HTTP-сервисы или REST API (начиная с версии платформы 8.3.20).

⚠️ В мобильном клиенте может отсутствовать поддержка некоторых реквизитов (например, табличные части с иерархией).

❓ Как скопировать строки из одной табличной части в другую?

Способы копирования:

  1. 🔹 Ручной способ: Выделите строки в исходной таблице (Ctrl+A), скопируйте (Ctrl+C), вставьте в целевую (Ctrl+V). Работает не во всех конфигурациях.
  2. 🔹 Программный способ:
    ЦелеваяТаблица.Загрузить(ИсточникТаблицы.Выгрузить());
  3. 🔹 Через обработку: Используйте типовую обработку "ПереносДанных" (доступна в 1С:УТ и 1С:ERP).

⚠️ При копировании проверяйте ссылочную целостность — если в строках есть ссылки на справочники, они должны существовать в базе-приёмнике.

❓ Почему при добавлении строки в 1С возникает ошибка "Значение не является значением объекта справочника"?

Ошибка означает, что вы пытаетесь присвоить строке табличной части неверный тип данных. Причины:

  • 🔹 Передаёте строку (например, наименование) вместо ссылки на справочник.
  • 🔹 Справочник не существует или удалён.
  • 🔹 Несовпадение типов (например, передаёте СправочникСсылка.Контрагенты в поле, ожидающее СправочникСсылка.Номенклатура).

Решение: всегда используйте методы поиска справочников, например:

Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Товар1");

Если Номенклатура = СправочникСсылка.ПустаяСсылка Тогда

Сообщить("Товар не найден!");

Иначе

НоваяСтрока.Номенклатура = Номенклатура;

КонецЕсли;

❓ Как добавить строку в табличную часть с иерархией (дерево)?

Для табличных частей с иерархией (например, "Спецификация" в 1С:ERP) используйте реквизит Родитель:

НоваяСтрока = Док.Спецификация.Добавить();

НоваяСтрока.Родитель = Док.Спецификация[0]; // Строка станет дочерней для первой строки

НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Комплект");

Чтобы развернуть/свернуть узлы в интерфейсе, используйте:

  • 🔹 +/- на клавиатуре.
  • 🔹 Двойной клик по строке с дочерними элементами.