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