Чтобы в 1С создать элемент справочника программно, на сервере вызовите Справочники.ИмяСправочника.СоздатьЭлемент(), заполните реквизиты и выполните Записать(). Группа создаётся так же, только методом СоздатьГруппу(). На практике к этим трём строкам добавляют ещё три вещи: проверку, нет ли такого элемента уже, заполнение значениями по умолчанию и обработку ошибок записи.
Ниже — от минимального примера до процедуры, которую не стыдно запускать на рабочей базе.
Минимальный пример
&НаСервере
Процедура СоздатьСкладНаСервере()
НовыйСклад = Справочники.Склады.СоздатьЭлемент();
НовыйСклад.Наименование = "Склад в Казани";
НовыйСклад.Записать();
КонецПроцедурыЧто здесь происходит:
Справочники.Склады— менеджер справочника. Через него создают, ищут и выбирают элементы.СоздатьЭлемент()создаёт новый объект в памяти. В базе его ещё нет.- Реквизиты заполняются обычным присваиванием.
Записать()сохраняет объект в базу. Если у справочника включена автонумерация, код присвоится сам.
После записи НовыйСклад.Ссылка — ссылка на созданный элемент. Её можно подставлять в документы и другие справочники.
Код должен выполняться на сервере. На клиенте объектов справочников нет, поэтому кнопка на форме вызывает клиентскую процедуру, а та — серверную. Как это устроено в обработке, я показывал в статье как создать обработку в 1С.
Создание группы справочника программно
Группы бывают только у иерархических справочников с иерархией групп и элементов (это задаётся в свойствах справочника в конфигураторе).
Группа = Справочники.Номенклатура.СоздатьГруппу();
Группа.Наименование = "Упаковка";
Группа.Записать();
Элемент = Справочники.Номенклатура.СоздатьЭлемент();
Элемент.Наименование = "Коробка 40×30×30";
Элемент.Родитель = Группа.Ссылка;
Элемент.Записать();Реквизит Родитель определяет, в какой папке лежит элемент. Чтобы создать вложенную группу, у новой группы тоже указывают Родитель. Проверить, группа это или элемент, можно через стандартный реквизит ЭтоГруппа.
Заполнение по умолчанию: главная ловушка
Когда пользователь создаёт номенклатуру вручную, форма сама подставляет единицу измерения, ставку НДС, вид номенклатуры и другие значения. Программное создание этого не делает — форма не открывается. В результате элемент записывается, а потом документ с ним не проводится или считает НДС не так.
Решение — вызвать заполнение объекта:
Элемент = Справочники.Номенклатура.СоздатьЭлемент();
Элемент.Заполнить(Неопределено);
Элемент.Наименование = "Коробка 40×30×30";
Элемент.НаименованиеПолное = Элемент.Наименование;
Элемент.Записать();Заполнить запускает обработчик заполнения из модуля объекта — там типовые конфигурации подставляют часть значений по умолчанию. Но не все: что-то заполняется именно в модуле формы. Поэтому правило простое — создайте один элемент руками, один кодом и сравните их. Всё, что отличается, задайте в коде явно.
Состав реквизитов отличается в Бухгалтерии, УТ, КА и ERP, поэтому имена в примерах — ориентир, а не готовый код для любой базы.
Проверка дублей перед созданием
Без проверки повторный запуск обработки создаст второй такой же элемент. Справочник с дублями — частая причина ошибок в отчётах и обменах.

Простые способы найти существующий элемент:
НайтиПоКоду(Код)— если код у вас осмысленный и уникальный;НайтиПоНаименованию(Наименование, Истина)— второй параметр включает точное совпадение;НайтиПоРеквизиту("ИНН", ИНН)— по любому реквизиту, например ИНН у контрагентов или артикулу у номенклатуры.
Все три метода возвращают пустую ссылку, если ничего не найдено. Если подходящих элементов несколько, вернётся первый попавшийся — для надёжного поиска лучше запрос.
Вот функция, которая ищет элемент и создаёт его, только если не нашла:
&НаСервереБезКонтекста
Функция НайтиИлиСоздатьНоменклатуру(Артикул, Наименование, Группа)
Ссылка = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Артикул);
Если ЗначениеЗаполнено(Ссылка) Тогда
Возврат Ссылка;
КонецЕсли;
Элемент = Справочники.Номенклатура.СоздатьЭлемент();
Элемент.Заполнить(Неопределено);
Элемент.Наименование = Наименование;
Элемент.НаименованиеПолное = Наименование;
Элемент.Артикул = Артикул;
Элемент.Родитель = Группа;
Если Не Элемент.ПроверитьЗаполнение() Тогда
Возврат Справочники.Номенклатура.ПустаяСсылка();
КонецЕсли;
Попытка
Элемент.Записать();
Исключение
Сообщить("Не записан элемент " + Наименование + ": " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат Справочники.Номенклатура.ПустаяСсылка();
КонецПопытки;
Возврат Элемент.Ссылка;
КонецФункцииПроверитьЗаполнение() выполняет те же проверки, что и форма при записи: обязательные реквизиты и проверки из модуля объекта. Если что-то не так, программа выведет сообщения, а функция вернёт пустую ссылку вместо исключения посреди загрузки.
Как изменить существующий элемент
Ссылку нельзя изменить напрямую — сначала нужно получить объект:
Объект = Ссылка.ПолучитьОбъект();
Объект.Наименование = "Коробка 40×30×30 (усиленная)";
Объект.Записать();Если элемент открыт у пользователя и он тоже его меняет, запись может упасть с ошибкой блокировки. В массовых обработках это нормально ловить через Попытка и выводить список того, что не записалось.
Коды, предопределённые элементы и пометка удаления
Несколько деталей, о которые спотыкаются чаще всего:
- Код. Если у справочника включена автонумерация, код присваивается при записи, и задавать его не нужно. Если нужен код заранее, до записи вызовите
УстановитьНовыйКод(). Задавать код вручную стоит, только когда он несёт смысл, например совпадает с кодом в учётной системе поставщика. Тогда следите за уникальностью: при включённом контроле уникальности запись дубля по коду не пройдёт. - Предопределённые элементы. Это элементы, заложенные в конфигурации, — например, основной склад или стандартные виды номенклатуры. Обращаются к ним как
Справочники.Склады.ИмяПредопределённого, создавать их кодом не нужно. Удалять тоже нельзя: на них опирается логика программы. - Пометка удаления. Методы
НайтиПоКодуиНайтиПоНаименованиюнаходят и помеченные на удаление элементы. Если вы не хотите «воскрешать» удалённого контрагента, проверьте у найденного элемента реквизитПометкаУдаленияили ищите запросом с условиемНЕ ПометкаУдаления. - Удаление. Для программной пометки используют
УстановитьПометкуУдаления(Истина)у объекта. Непосредственное удалениеУдалить()не проверяет ссылки, и в документах останутся «битые» ссылки, — в рабочих базах так делать не стоит.
Массовое создание: на что обратить внимание
Когда элементов сотни и тысячи — например, при загрузке номенклатуры из прайса поставщика:
- Сначала тест на копии базы. Ошибка в логике поиска дублей легко создаст тысячу лишних элементов.
- Транзакции. Если загрузка должна пройти целиком или никак, оберните её в
НачатьТранзакцию()/ЗафиксироватьТранзакцию()и откатывайте при ошибке. Но не держите в одной транзакции десятки тысяч записей — база будет заблокирована надолго. - Не используйте
ОбменДанными.Загрузка = Истинабез нужды. Это свойство отключает обработчики и проверки при записи. Оно нужно для обменов, где объект приходит полностью готовым. В обычной загрузке оно позволит записать элементы без обязательных реквизитов, и проблемы всплывут позже. - Права. Код выполняется с правами текущего пользователя. Если у него нет права добавлять элементы справочника, запись упадёт с ошибкой. Привилегированный режим включайте осознанно и только там, где это действительно нужно.
- Логирование. Выводите, что создано, что найдено и что не записалось. Через неделю этот отчёт сэкономит вам час разбирательств.
Если задача — загрузка из Excel, в типовых конфигурациях есть штатная загрузка в списки и табличные части, её стоит попробовать до того, как писать код. Код нужен, когда формат файла нестандартный или требуется сложная логика сопоставления.
Типовые ошибки
- «Метод объекта не обнаружен (СоздатьЭлемент)» на клиенте. Код выполняется на клиенте. Перенесите его в серверную процедуру.
- «Метод объекта не обнаружен (СоздатьГруппу)». У справочника нет иерархии групп и элементов.
- «Поле объекта не обнаружено (Артикул)». В вашей конфигурации реквизит называется иначе. Сверьтесь с деревом конфигурации.
- «Не заполнено поле ...» или запись отменена. Не заполнены обязательные реквизиты. Используйте
Заполнить(Неопределено)иПроверитьЗаполнение(). - Создаются дубли. Нет поиска существующего элемента или поиск идёт по неуникальному полю. Ищите по коду, артикулу или ИНН.
- Элемент создан, но документы с ним не проводятся. Не заполнены значения, которые форма подставляет по умолчанию. Сравните с элементом, созданным вручную.
- Нет прав на добавление. Пользователь, под которым работает код, не имеет права на справочник. Проверьте группы доступа.
Если нужно загрузить справочники из чужой системы или прайса, сопоставить их с существующими и не наплодить дублей, — помогу удалённо: загрузка в 1С из Excel, доработка 1С под задачи. Про то, как подготовить сам справочник номенклатуры, — в статье настройка номенклатуры в 1С.
Итог
- Элемент справочника создаётся на сервере:
СоздатьЭлемент()→ заполнение реквизитов →Записать(). - Группа создаётся методом
СоздатьГруппу(), элемент кладётся в неё через реквизитРодитель. - Вызывайте
Заполнить(Неопределено), чтобы получить значения по умолчанию, и сравнивайте результат с элементом, созданным вручную. - Перед созданием ищите существующий элемент по коду, артикулу или ИНН, чтобы не плодить дубли.
- Проверяйте заполнение и ловите ошибки записи через
Попытка, особенно в массовой загрузке. ОбменДанными.Загрузка = Истина— только для обменов, не для обычных обработок.




