При работе с платформой 1С начинающие разработчики часто сталкиваются с трудностями при изменении элементов справочника из кода. В этой статье мы подробно разберем, как правильно добавить новые строки в табличную часть справочника, проанализируем основные ошибки и рассмотрим лучшие практики работы с данными на платформе 1С.
Разберем типичную ситуацию: необходимо программно добавить сведения в табличную часть физического лица (например, стаж работы). Часто встречается ошибка, когда попытка вызова метода добавления строки выполняется непосредственно для ссылки на элемент справочника:
// ОШИБКА: Ссылка доступна только для чтения!
НоваяСтрока = СсылкаФизЛицо.Стажи.Добавить();
При выполнении такого кода платформа выдаст ошибку: «Объект недоступен для изменения» или «Поле объекта не обнаружено». В концепции 1С ссылка (СправочникСсылка) используется исключительно для чтения данных и получения общей информации об объекте из базы. Любые модификации — редактирование реквизитов, очистка или добавление строк в табличные части — требуют получения ссылочного объекта (СправочникОбъект).
Рассмотрим правильный порядок действий для добавления строки в табличную часть объекта 1С:
ПолучитьОбъект() на основании имеющейся ссылки.Добавить(), обязательно указывая скобки, так как это метод, а не свойство.Записать() для записи объекта в базу данных. Без этого шага данные останутся только в оперативной памяти и будут утеряны.Проанализируем готовый пример кода:
// 1. Получаем объект из ссылки
ОбъектФЛ = СсылкаФизЛицо.ПолучитьОбъект();
// 2. Добавляем новую строку в табличную часть
НоваяСтрока = ОбъектФЛ.Стажи.Добавить();
// 3. Заполняем реквизиты новой строки
НоваяСтрока.ВидСтажа = Перечисления.ВидыСтажа.ОбщийТрудовой;
НоваяСтрока.ДатаНачала = ДатаНачала;
НоваяСтрока.Лет = 5;
// 4. Обязательно записываем объект для сохранения изменений в БД
ОбъектФЛ.Записать();
Если требуется добавить несколько строк (например, при обработке результатов запроса или переборе таблицы значений), операция добавления выполняется в цикле:
ОбъектФЛ = СсылкаФизЛицо.ПолучитьОбъект();
Для Каждого ЗаписьИзИсточника Из ТаблицаИсточника Цикл
НоваяСтрока = ОбъектФЛ.Стажи.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ЗаписьИзИсточника);
КонецЦикла;
ОбъектФЛ.Записать();
Вызов метода Записать() следует выполнять после завершения цикла, чтобы не производить лишних обращений к базе данных на каждой итерации.
Выясним основные нюансы, о которых стоит помнить при написании кода:
1. Забытые скобки у метода: синтаксис Добавить без скобок возвращает сам метод как объект, а не созданную строку, что влечет за собой ошибки при попытке обращения к колонкам.
2. Неверное имя табличной части: имена табличных частей в синтаксисе 1С чувствительны к точным наименованиям в конфигураторе (например, табличная часть может называться Стажи, а не Стаж).
3. Контекст выполнения (Клиент/Сервер): метод ПолучитьОбъект() и сохранение объектов доступны строго на стороне сервера (в контексте &НаСервере или в серверных модулях). При работе на тонком или веб-клиенте эти операции должны передаваться на сервер.
4. Предварительная очистка: метод Добавить() помещает строку в конец текущего списка. Если требуется перезаписать табличную часть полностью, предварительно вызовите метод ОбъектФЛ.Стажи.Очистить().
5. Оптимизация загрузки: если данные уже выгружены в таблицу значений с совпадающими именами колонок, вместо цикла удобнее использовать метод ОбъектФЛ.Стажи.Загрузить(ТаблицаИсточника).