Чтобы в 1С создать элемент справочника программно, на сервере вызовите Справочники.ИмяСправочника.СоздатьЭлемент(), заполните реквизиты и выполните Записать(). Группа создаётся так же, только методом СоздатьГруппу(). На практике к этим трём строкам добавляют ещё три вещи: проверку, нет ли такого элемента уже, заполнение значениями по умолчанию и обработку ошибок записи.

Ниже — от минимального примера до процедуры, которую не стыдно запускать на рабочей базе.

Минимальный пример

1С
&НаСервере
Процедура СоздатьСкладНаСервере()

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

КонецПроцедуры

Что здесь происходит:

  1. Справочники.Склады — менеджер справочника. Через него создают, ищут и выбирают элементы.
  2. СоздатьЭлемент() создаёт новый объект в памяти. В базе его ещё нет.
  3. Реквизиты заполняются обычным присваиванием.
  4. Записать() сохраняет объект в базу. Если у справочника включена автонумерация, код присвоится сам.

После записи НовыйСклад.Ссылка — ссылка на созданный элемент. Её можно подставлять в документы и другие справочники.

Код должен выполняться на сервере. На клиенте объектов справочников нет, поэтому кнопка на форме вызывает клиентскую процедуру, а та — серверную. Как это устроено в обработке, я показывал в статье как создать обработку в 1С.

Создание группы справочника программно

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

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

Элемент = Справочники.Номенклатура.СоздатьЭлемент();
Элемент.Наименование = "Коробка 40×30×30";
Элемент.Родитель = Группа.Ссылка;
Элемент.Записать();

Реквизит Родитель определяет, в какой папке лежит элемент. Чтобы создать вложенную группу, у новой группы тоже указывают Родитель. Проверить, группа это или элемент, можно через стандартный реквизит ЭтоГруппа.

Заполнение по умолчанию: главная ловушка

Когда пользователь создаёт номенклатуру вручную, форма сама подставляет единицу измерения, ставку НДС, вид номенклатуры и другие значения. Программное создание этого не делает — форма не открывается. В результате элемент записывается, а потом документ с ним не проводится или считает НДС не так.

Решение — вызвать заполнение объекта:

1С
Элемент = Справочники.Номенклатура.СоздатьЭлемент();
Элемент.Заполнить(Неопределено);
Элемент.Наименование = "Коробка 40×30×30";
Элемент.НаименованиеПолное = Элемент.Наименование;
Элемент.Записать();

Заполнить запускает обработчик заполнения из модуля объекта — там типовые конфигурации подставляют часть значений по умолчанию. Но не все: что-то заполняется именно в модуле формы. Поэтому правило простое — создайте один элемент руками, один кодом и сравните их. Всё, что отличается, задайте в коде явно.

Состав реквизитов отличается в Бухгалтерии, УТ, КА и ERP, поэтому имена в примерах — ориентир, а не готовый код для любой базы.

Проверка дублей перед созданием

Без проверки повторный запуск обработки создаст второй такой же элемент. Справочник с дублями — частая причина ошибок в отчётах и обменах.

Проверка дублей при программном создании элемента справочника 1С
Проверка дублей при программном создании элемента справочника 1С

Простые способы найти существующий элемент:

  • НайтиПоКоду(Код) — если код у вас осмысленный и уникальный;
  • НайтиПоНаименованию(Наименование, Истина) — второй параметр включает точное совпадение;
  • НайтиПоРеквизиту("ИНН", ИНН) — по любому реквизиту, например ИНН у контрагентов или артикулу у номенклатуры.

Все три метода возвращают пустую ссылку, если ничего не найдено. Если подходящих элементов несколько, вернётся первый попавшийся — для надёжного поиска лучше запрос.

Вот функция, которая ищет элемент и создаёт его, только если не нашла:

1С
&НаСервереБезКонтекста
Функция НайтиИлиСоздатьНоменклатуру(Артикул, Наименование, Группа)

	Ссылка = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Артикул);
	Если ЗначениеЗаполнено(Ссылка) Тогда
		Возврат Ссылка;
	КонецЕсли;

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

	Если Не Элемент.ПроверитьЗаполнение() Тогда
		Возврат Справочники.Номенклатура.ПустаяСсылка();
	КонецЕсли;

	Попытка
		Элемент.Записать();
	Исключение
		Сообщить("Не записан элемент " + Наименование + ": " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
		Возврат Справочники.Номенклатура.ПустаяСсылка();
	КонецПопытки;

	Возврат Элемент.Ссылка;

КонецФункции

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

Как изменить существующий элемент

Ссылку нельзя изменить напрямую — сначала нужно получить объект:

1С
Объект = Ссылка.ПолучитьОбъект();
Объект.Наименование = "Коробка 40×30×30 (усиленная)";
Объект.Записать();

Если элемент открыт у пользователя и он тоже его меняет, запись может упасть с ошибкой блокировки. В массовых обработках это нормально ловить через Попытка и выводить список того, что не записалось.

Коды, предопределённые элементы и пометка удаления

Несколько деталей, о которые спотыкаются чаще всего:

  • Код. Если у справочника включена автонумерация, код присваивается при записи, и задавать его не нужно. Если нужен код заранее, до записи вызовите УстановитьНовыйКод(). Задавать код вручную стоит, только когда он несёт смысл, например совпадает с кодом в учётной системе поставщика. Тогда следите за уникальностью: при включённом контроле уникальности запись дубля по коду не пройдёт.
  • Предопределённые элементы. Это элементы, заложенные в конфигурации, — например, основной склад или стандартные виды номенклатуры. Обращаются к ним как Справочники.Склады.ИмяПредопределённого, создавать их кодом не нужно. Удалять тоже нельзя: на них опирается логика программы.
  • Пометка удаления. Методы НайтиПоКоду и НайтиПоНаименованию находят и помеченные на удаление элементы. Если вы не хотите «воскрешать» удалённого контрагента, проверьте у найденного элемента реквизит ПометкаУдаления или ищите запросом с условием НЕ ПометкаУдаления.
  • Удаление. Для программной пометки используют УстановитьПометкуУдаления(Истина) у объекта. Непосредственное удаление Удалить() не проверяет ссылки, и в документах останутся «битые» ссылки, — в рабочих базах так делать не стоит.

Массовое создание: на что обратить внимание

Когда элементов сотни и тысячи — например, при загрузке номенклатуры из прайса поставщика:

  1. Сначала тест на копии базы. Ошибка в логике поиска дублей легко создаст тысячу лишних элементов.
  2. Транзакции. Если загрузка должна пройти целиком или никак, оберните её в НачатьТранзакцию() / ЗафиксироватьТранзакцию() и откатывайте при ошибке. Но не держите в одной транзакции десятки тысяч записей — база будет заблокирована надолго.
  3. Не используйте ОбменДанными.Загрузка = Истина без нужды. Это свойство отключает обработчики и проверки при записи. Оно нужно для обменов, где объект приходит полностью готовым. В обычной загрузке оно позволит записать элементы без обязательных реквизитов, и проблемы всплывут позже.
  4. Права. Код выполняется с правами текущего пользователя. Если у него нет права добавлять элементы справочника, запись упадёт с ошибкой. Привилегированный режим включайте осознанно и только там, где это действительно нужно.
  5. Логирование. Выводите, что создано, что найдено и что не записалось. Через неделю этот отчёт сэкономит вам час разбирательств.

Если задача — загрузка из Excel, в типовых конфигурациях есть штатная загрузка в списки и табличные части, её стоит попробовать до того, как писать код. Код нужен, когда формат файла нестандартный или требуется сложная логика сопоставления.

Типовые ошибки

  • «Метод объекта не обнаружен (СоздатьЭлемент)» на клиенте. Код выполняется на клиенте. Перенесите его в серверную процедуру.
  • «Метод объекта не обнаружен (СоздатьГруппу)». У справочника нет иерархии групп и элементов.
  • «Поле объекта не обнаружено (Артикул)». В вашей конфигурации реквизит называется иначе. Сверьтесь с деревом конфигурации.
  • «Не заполнено поле ...» или запись отменена. Не заполнены обязательные реквизиты. Используйте Заполнить(Неопределено) и ПроверитьЗаполнение().
  • Создаются дубли. Нет поиска существующего элемента или поиск идёт по неуникальному полю. Ищите по коду, артикулу или ИНН.
  • Элемент создан, но документы с ним не проводятся. Не заполнены значения, которые форма подставляет по умолчанию. Сравните с элементом, созданным вручную.
  • Нет прав на добавление. Пользователь, под которым работает код, не имеет права на справочник. Проверьте группы доступа.

Если нужно загрузить справочники из чужой системы или прайса, сопоставить их с существующими и не наплодить дублей, — помогу удалённо: загрузка в 1С из Excel, доработка 1С под задачи. Про то, как подготовить сам справочник номенклатуры, — в статье настройка номенклатуры в 1С.

Итог

  • Элемент справочника создаётся на сервере: СоздатьЭлемент() → заполнение реквизитов → Записать().
  • Группа создаётся методом СоздатьГруппу(), элемент кладётся в неё через реквизит Родитель.
  • Вызывайте Заполнить(Неопределено), чтобы получить значения по умолчанию, и сравнивайте результат с элементом, созданным вручную.
  • Перед созданием ищите существующий элемент по коду, артикулу или ИНН, чтобы не плодить дубли.
  • Проверяйте заполнение и ловите ошибки записи через Попытка, особенно в массовой загрузке.
  • ОбменДанными.Загрузка = Истина — только для обменов, не для обычных обработок.