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

Создать элемент справочника 1с программно.
Создание новых элементов и групп справочника производится с помощью программного объекта СправочникМенеджер.ИмяСправочника. Данный объект доступен только на сервере.
Создание элементов справочников и групп элементов выполняется по следующему алгоритму:
- Создание элемента или группы;
- Заполнение владельца (если справочник подчиненный);
- Заполнение родителя (если справочник иерархический);
- Заполнение наименования и реквизитов (если не задана автоматическая нумерация, то и кода);
- Заполнение табличных частей;
- Запись элемента.
Программное создание элемента справочника выполняется с применением метода СоздатьЭлемент(). Например:
НовыйЭлемент=Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование=Объект.Название;
НовыйЭлемент.Артикул=Объект.Артикул;
НовыйЭлемент.Записать();
Программное создание группы справочника:
НоваяГруппа=Справочники.Номенклатура.СоздатьГруппу();
НоваяГруппа.Наименование="Материалы";
НоваяГруппа.Записать();
Если планируем добавить Элемент Справочника в Группу, то в код вносим строку:
НовыйЭлемент.Родитель=НоваяГруппа.Ссылка;
Справочники 1с программно создаются так:

Поиск элементов справочника 1с
Для поиска элементов справочников в языке программирования 1С предусмотрено несколько методов:
НайтиПоКоду(Код, ПоискПоПолномуКоду, Родитель, Владелец)НайтиПоНаименованию(Наименование, ТочноеСоответствие, Родитель, Владелец)НайтиПоРеквизиту(ИмяРеквизита, ЗначениеРеквизита, Родитель, Владелец)
Во всех методах если поиск успешный, то будет возвращена ссылка на найденный элемент.
Для иллюстрации различных видов поиска создадим обработку «Поиск Номенклатуры»

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