К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как записать элемент справочника в 1С

Как программно записать элемент справочника в 1С: создание объекта, заполнение реквизитов, метод Записать(), проверка результата и типичные ошибки.

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

Общая логика всегда одинакова: получить объект (новый или существующий), заполнить его реквизиты и вызвать метод записи. Однако детали зависят от того, создаёте ли вы новый элемент, изменяете существующий, работаете с иерархией, предопределёнными элементами или подчинёнными справочниками.

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

Создание и запись нового элемента справочника

Для создания нового элемента используется менеджер справочника и его метод СоздатьЭлемент(). Метод возвращает объект типа «СправочникОбъект», который существует только в памяти до вызова Записать().

Минимально необходимое поле — Наименование. Если в конфигурации у реквизитов включена проверка заполнения, потребуется заполнить и их, иначе запись завершится ошибкой с сообщением о незаполненном поле.

НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();

НовыйЭлемент.Наименование = "Тестовый товар";

НовыйЭлемент.Артикул = "Т-001";

НовыйЭлемент.Записать();

Сообщить("Создан элемент: " + НовыйЭлемент.Ссылка);

После успешного вызова Записать() у объекта появляется свойство Ссылка — уникальный идентификатор элемента в базе. Именно ссылку следует сохранять и передавать дальше, если элемент нужен в других документах или регистрах.

Изменение существующего элемента

Чтобы изменить уже записанный элемент, недостаточно иметь его ссылку — ссылка доступна только для чтения. Нужно получить объект методом ПолучитьОбъект(), внести изменения и записать.

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

Если Не ЭлементСсылка.Пустая() Тогда

ЭлементОбъект = ЭлементСсылка.ПолучитьОбъект();

ЭлементОбъект.Артикул = "Т-002";

ЭлементОбъект.Записать();

КонецЕсли;

Обратите внимание: ПолучитьОбъект() блокирует элемент на время редактирования. Если код прервётся до вызова Записать() или объект не будет освобождён, другие пользователи могут получить ошибку блокировки при попытке изменить тот же элемент.

Проверка существования элемента перед записью

Частая задача — создать элемент, только если его ещё нет в базе. Для поиска используются методы НайтиПоНаименованию(), НайтиПоКоду() и НайтиПоРеквизиту(). Все они возвращают либо ссылку на найденный элемент, либо пустую ссылку.

Наименование = "Офисная бумага А4";

Ссылка = Справочники.Номенклатура.НайтиПоНаименованию(Наименование, Истина);

Если Ссылка.Пустая() Тогда

НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();

НовыйЭлемент.Наименование = Наименование;

НовыйЭлемент.Записать();

Ссылка = НовыйЭлемент.Ссылка;

КонецЕсли;

Второй параметр Истина в НайтиПоНаименованию() означает поиск по точному соответствию. Без него поиск выполняется по началу строки, что может привести к нахождению «не того» элемента и пропуску создания нужного.

Запись элемента в группу и работа с иерархией

Если справочник иерархический (с иерархией элементов), у элемента есть реквизит Родитель, который определяет, в какой группе он находится. Группа создаётся отдельным методом СоздатьГруппу().

Группа = Справочники.Номенклатура.СоздатьГруппу();

Группа.Наименование = "Канцелярия";

Группа.Записать();

НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();

НовыйЭлемент.Наименование = "Ручка шариковая";

НовыйЭлемент.Родитель = Группа.Ссылка;

НовыйЭлемент.Записать();

Если справочник имеет иерархию групп и элементов, группе нельзя присвоить родителя-элемент, а элементу — записать его в «не группу» без учёта настроек конфигурации. Перед записью убедитесь, что тип иерархии справочника позволяет выбранную структуру.

Запись в транзакции и массовое создание элементов

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

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

Попытка

Для Каждого Строка Из ДанныеЗагрузки Цикл

Элемент = Справочники.Номенклатура.СоздатьЭлемент();

Элемент.Наименование = Строка.Наименование;

Элемент.Записать();

КонецЦикла;

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

Исключение

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

Сообщить("Ошибка загрузки: " + ОписаниеОшибки());

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

Особые случаи: предопределённые и подчинённые элементы

Предопределённые элементы

Предопределённые элементы создаются в конфигураторе и в пользовательском режиме доступны через свойство менеджера справочника: Справочники.Валюты.USD. Изменять их можно как обычные элементы через ПолучитьОбъект(), но создавать и удалять программно их нельзя — ссылка на предопределённый элемент существует всегда.

Подчинённые справочники

Если справочник подчинён другому (например, «Договоры» подчинены «Контрагентам»), обязательным является реквизит Владелец. Без его заполнения запись завершится ошибкой.

Договор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();

Договор.Владелец = КонтрагентСсылка;

Договор.Наименование = "Договор поставки № 15";

Договор.Записать();

Типичные ошибки
01
Присвоение реквизитов через ссылку вместо объекта — приводит к ошибке «Поле объекта недоступно для записи»
02
Поиск по наименованию без точного соответствия — находится чужой элемент, вместо создания нового изменяется существующий
03
Отсутствие проверки на пустую ссылку после поиска — ПолучитьОбъект() от пустой ссылки вызывает исключение
04
Запись без заполнения обязательных реквизитов (Владелец, реквизиты с проверкой заполнения) — запись отклоняется
05
Вызов Записать() в цикле без транзакции при массовой загрузке — при сбое остаются частично загруженные данные

Проверка результата записи

Убедиться, что элемент действительно записан, можно несколькими способами. Самый простой — проверить, что после Записать() у объекта заполнена ссылка и она не пустая. Дополнительно полезно выполнить повторный поиск по ключевым реквизитам.

Контрольные точки

Как проверить результат

Ссылка после Записать()
Норма

Ссылка не пустая, элемент открывается в списке справочника

Тревожный признак

Исключение при записи или пустая ссылка

Значения реквизитов
Норма

Повторное чтение элемента возвращает записанные значения

Тревожный признак

Реквизиты пустые или содержат старые данные

Отсутствие дублей
Норма

Поиск по наименованию возвращает один элемент

Тревожный признак

Найдено несколько элементов с одинаковым наименованием

Если запись выполняется в фоновом задании или на сервере, сообщения пользователю могут не отображаться — результат лучше фиксировать в журнале регистрации через ЗаписьЖурналаРегистрации() или возвращать ссылку вызвавшему коду.

Итог

Что важно запомнить

Новый элемент создаётся через СоздатьЭлемент(), изменение — через ПолучитьОбъект() у ссылки, фиксация — методом Записать(). Перед созданием проверяйте существование элемента поиском, а массовые операции выполняйте в транзакции и только после проверки на копии базы.

Частые вопросы

Чем отличается СоздатьЭлемент() от ПолучитьОбъект()?

СоздатьЭлемент() создаёт новый объект в памяти, которого ещё нет в базе. ПолучитьОбъект() загружает из базы существующий элемент по ссылке для редактирования. Оба объекта записываются методом Записать().

Почему возникает ошибка «Поле объекта недоступно для записи»?

Ошибка появляется при попытке изменить реквизит через ссылку, а не через объект. Ссылка доступна только для чтения. Получите объект методом ПолучитьОбъект() и изменяйте реквизиты у него.

Как записать элемент без проверки заполнения обязательных реквизитов?

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

Как узнать код нового элемента после записи?

Если в справочнике включена автонумерация, код присваивается при записи автоматически. После Записать() его можно прочитать из свойства Код объекта. Если автонумерация отключена, код нужно присваивать вручную до записи.

Можно ли записать элемент справочника из внешней обработки?

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

Что делать, если при записи возникает ошибка блокировки?

Ошибка «Конфликт блокировок» означает, что элемент уже редактируется другим пользователем или сеансом. Повторите попытку позже, а в массовых обработках добавьте обработку исключений с пропуском заблокированных элементов и их повторной обработкой.