Как программно добавить строку в табличную часть справочника в 1С?

Программист 1С v8.3 (Обычные формы)
← На главную

При работе с платформой 1С начинающие разработчики часто сталкиваются с трудностями при изменении элементов справочника из кода. В этой статье мы подробно разберем, как правильно добавить новые строки в табличную часть справочника, проанализируем основные ошибки и рассмотрим лучшие практики работы с данными на платформе 1С.

Причина возникновения ошибок при изменении данных

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


// ОШИБКА: Ссылка доступна только для чтения!
НоваяСтрока = СсылкаФизЛицо.Стажи.Добавить();

При выполнении такого кода платформа выдаст ошибку: «Объект недоступен для изменения» или «Поле объекта не обнаружено». В концепции 1С ссылка (СправочникСсылка) используется исключительно для чтения данных и получения общей информации об объекте из базы. Любые модификации — редактирование реквизитов, очистка или добавление строк в табличные части — требуют получения ссылочного объекта (СправочникОбъект).

Пошаговый алгоритм добавления строки в табличную часть

Рассмотрим правильный порядок действий для добавления строки в табличную часть объекта 1С:

  1. Получение объекта справочника: используем метод ПолучитьОбъект() на основании имеющейся ссылки.
  2. Обращение к табличной части: обращаемся к табличной части объекта по ее точному имени из конфигуратора.
  3. Добавление новой строки: вызываем метод Добавить(), обязательно указывая скобки, так как это метод, а не свойство.
  4. Заполнение реквизитов: заполняем поля сформированной строки необходимыми значениями.
  5. Сохранение изменений: вызываем метод Записать() для записи объекта в базу данных. Без этого шага данные останутся только в оперативной памяти и будут утеряны.

Проанализируем готовый пример кода:


// 1. Получаем объект из ссылки
ОбъектФЛ = СсылкаФизЛицо.ПолучитьОбъект();

// 2. Добавляем новую строку в табличную часть
НоваяСтрока = ОбъектФЛ.Стажи.Добавить();

// 3. Заполняем реквизиты новой строки
НоваяСтрока.ВидСтажа = Перечисления.ВидыСтажа.ОбщийТрудовой;
НоваяСтрока.ДатаНачала = ДатаНачала;
НоваяСтрока.Лет = 5;

// 4. Обязательно записываем объект для сохранения изменений в БД
ОбъектФЛ.Записать();

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

Если требуется добавить несколько строк (например, при обработке результатов запроса или переборе таблицы значений), операция добавления выполняется в цикле:


ОбъектФЛ = СсылкаФизЛицо.ПолучитьОбъект();

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

ОбъектФЛ.Записать();

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

Частые ошибки и способы их предотвращения

Выясним основные нюансы, о которых стоит помнить при написании кода:

1. Забытые скобки у метода: синтаксис Добавить без скобок возвращает сам метод как объект, а не созданную строку, что влечет за собой ошибки при попытке обращения к колонкам.

2. Неверное имя табличной части: имена табличных частей в синтаксисе 1С чувствительны к точным наименованиям в конфигураторе (например, табличная часть может называться Стажи, а не Стаж).

3. Контекст выполнения (Клиент/Сервер): метод ПолучитьОбъект() и сохранение объектов доступны строго на стороне сервера (в контексте &НаСервере или в серверных модулях). При работе на тонком или веб-клиенте эти операции должны передаваться на сервер.

4. Предварительная очистка: метод Добавить() помещает строку в конец текущего списка. Если требуется перезаписать табличную часть полностью, предварительно вызовите метод ОбъектФЛ.Стажи.Очистить().

5. Оптимизация загрузки: если данные уже выгружены в таблицу значений с совпадающими именами колонок, вместо цикла удобнее использовать метод ОбъектФЛ.Стажи.Загрузить(ТаблицаИсточника).

← На главную