Программная работа со справочниками в 1С

Apr 17, 2022 15:33

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

СправочникиМенеджер

Объект СправочникиМенеджер предназначен для управления всеми справочниками конфигурации. Через цикл можно получить доступ к менеджеру каждого справочника:

//перебор всех менеджеров справочников:
Для Каждого Мен Из Справочники Цикл
//Мен - менеджер конкретного справочника
КонецЦикла;


Также можно обратиться к менеджеру справочника через точку или через квадратные скобки:

//Получение менеджера конкретного справочника:
МенТовары = Справочники.Товары;
МенТовары = Справочники["Товары"];

Также через СправочникиМенеджер можно проверить является ли ссылка справочником:

//какая-то ссылка, нужно узнать это ссылка на справочник или нет
ПростоСсылка = ПолучитьКакуюТоСсылку();

//получим описание типов со всеми типами справочников конфигурации
ВсеСправочникиКонфигурации = Справочники.ТипВсеСсылки();

//проверяем
Если ВсеСправочникиКонфигурации.СодержитТип(ТипЗнч(ПростоСсылка)) Тогда
//да, это справочник
Иначе
//нет, что-то другое
КонецЕсли;

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

Для программного создания элементов есть метод СоздатьЭлемент. Для программного создания групп - метод СоздатьГруппу:

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

НоваяГруппаТоваров = Справочники.Товары.СоздатьГруппу();
НоваяГруппаТоваров.Наименование = "Комплектующие";
//...заполнение прочих реквизитов
//запись в базу
НоваяГруппаТоваров.Записать();

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

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

//функция вернула какую-то ссылку на справочник Товары
СсылкаНаТовар = СсылкаНаТовар();

//получам объект из ссылки
ТоварОбъект = СсылкаНаТовар.ПолучитьОбъект();
//меняем наименование
ТоварОбъект.Наименование = ТоварОбъект.Наименование + " (изменение)";
//записываем
ТоварОбъект.Записать();

Программное копирование элемента справочника

Методом Скопировать можно создать копию элемента справочника. Данный метод можно вызывать как у ссылки, так и у объекта:

//через ссылку
КопияИзСсылки = СсылкаНаТовар.Скопировать();
КопияИзСсылки.Записать();

//через объект
ТоварОбъект = СсылкаНаТовар.ПолучитьОбъект();
КопияИзОбъекта = ТоварОбъект.Скопировать();
КопияИзОбъекта.Записать();

Программное удаление элемента справочника

Для удаления применяются два метода: УстановитьПометкуУдаления и Удалить. Метод УстановитьПометкуУдаления только установит пометку на удаление, сам элемент не будет удален из базы данных. Метод Удалить удалит элемент из базы данных без проверки ссылочной целостности. То есть, если на этот элемент были ссылки в других местах, то теперь вместо ссылки будет надпись «Объект не найден». Не рекомендуется пользоваться методом Удалить. Важно отметить, что вызов метода УстановитьПометкуУдаления вызывает запись объекта. Дополнительно записывать объект не нужно.

ТоварОбъект = СсылкаНаТовар.ПолучитьОбъект();
ТоварОбъект.УстановитьПометкуУдаления(Истина);
//также будут помечены на удаление все подчиненные элементы

//без пометки удаления подчиненных элементов:
ТоварОбъект.УстановитьПометкуУдаления(Истина, Ложь);

//снятие пометки на удаление
ТоварОбъект.УстановитьПометкуУдаления(Ложь);

//удаление без проверки ссылочной целостности
ТоварОбъект.Удалить();
//также удалит все вложенные элементы

Программный поиск по справочнику

Для поиска используются методы НайтиПоКоду, НайтиПоНаименованию и НайтиПоРеквизиту.

НайтиПоКоду

//поиск по коду
ТоварСсылка = Справочники.Товары.НайтиПоКоду("000000008");

//по полному коду. Полный код включает в себя все коды родителей:
//код родителя/код элемента
ТоварСсылка = Справочники.Товары.НайтиПоКоду("000000003/000000008", Истина);

//поиск в пределах одной группы, Группа - ссылка на группу справочника
ТоварСсылка = Справочники.Товары.НайтиПоКоду("000000008",, Группа);

//поиск в пределах владельца, Владелец - ссылка на владельца
ТоварСсылка = Справочники.Товары.НайтиПоКоду("000000008",,, Владелец);

НайтиПоНаименованию

//поиск по наименованию, должна совпадать левая часть
ТоварСсылка = Справочники.Товары.НайтиПоНаименованию("Смартфон");
//будут найдены и "Смартфон" и "Смартфон самсунг", но метод вернет первый
//попавшийся элемент

//точное совпадение, кроме хвостовых пробелов
//будет найден только Смартфон
ТоварСсылка = Справочники.Товары.НайтиПоНаименованию("Смартфон", Истина);

//поиск в пределах одной группы, Группа - ссылка на группу справочника
ТоварСсылка = Справочники.Товары.НайтиПоНаименованию("Смартфон",, Группа);

//поиск в пределах владельца, Владелец - ссылка на владельца
ТоварСсылка = Справочники.Товары.НайтиПоНаименованию("Смартфон",,,Владелец);

Для обоих методов если элемент не будет найден, то метод вернет пустую ссылку. Если для справочника указана нулевая длина кода или наименования, то метод вернет Неопределено.

НайтиПоРеквизиту

//поиск по реквизиту, 1-ый параметр имя реквизита, 2-ой значение
ТоварСсылка = Справочники.Товары.НайтиПоРеквизиту("Артикул", "Арт001");

//поиск в пределах одной группы, Группа - ссылка на группу справочника
ТоварСсылка = Справочники.Товары.НайтиПоРеквизиту("Артикул", "Арт001", Группа);

//поиск в пределах владельца, Владелец - ссылка на владельца
ТоварСсылка = Справочники.Товары.НайтиПоРеквизиту("Артикул","Арт1",,Владелец);

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

Выборка справочника

Для выборки всех элементов справочника используются методы Выбрать и ВыбратьИерархически. Метод Выбрать получает прямую выборку. Метод ВыбратьИерархически получает выборку с учетом иерархии, сразу после выборки группы будут идти элементы из этой группы. В обоих методах можно выполнять отбор по родителю, по владельцу, а также по индексированным полям. Последним параметром можно указать поля для сортировки выборки:

//отбор по артикулу. Поле артикул должно быть проиндексировано
//в отборе может быть только одно поле.
ОтборАрт = Новый Структура("Артикул", "");
ВыборкаСпр = Справочники.Товары.Выбрать(,, ОтборАрт, "Наименование Убыв");
Пока ВыборкаСпр.Следующий() Цикл
Сообщить(ВыборкаСпр.Наименование);
КонецЦикла;
//выборка будет отсортирована по убыванию поля Наименование
//по умолчанию сортируется по основному представлению. Можно указать только
//Код, наименование или проиндексированный реквизит примитивного типа.

//отбор по родителю или владельцу:
ВыборкаСпр = Справочники.Товары.Выбрать(Группа);
ВыборкаСпр = Справочники.Товары.Выбрать(, Владелец);

//иерархическая выборка, сначала группы, потом элементы из этой группы
ВыборкаСпр = Справочники.Товары.ВыбратьИерархически();
//можно получить уровень элемента (для верхнего = 0)
Сообщить(ВыборкаСпр.УровеньВВыборке());

//из выборки можно получить объект
Пока ВыборкаСпр.Следующий() Цикл
ТоварОбъект = ВыборкаСпр.ПолучитьОбъект();
КонецЦикла;

Получение ссылки по уникальному идентификатору

С помощью метода УникальныйИдентификатор можно получить уникальный идентификатор от ссылки справочника. Чтобы через уникальный идентификатор получить ссылку на справочник используется метод ПолучитьСсылку:

//получение УИД ссылки
УИДСпр = ТоварСсылка.УникальныйИдентификатор();

//получение ссылки по УИД
ТоварСсылка = Справочники.Товары.ПолучитьСсылку(УИДСпр);
ТоварОбъект = Ссылка.ПолучитьОбъект();
//если после получения объекта от ссылки он равен Неопределено,
//значит этой ссылки не соответствует ни один объект базы данных
Если ТоварОбъект = Неопределено Тогда
//нет такого объекта
КонецЕсли;

Также с помощью метода УстановитьСсылкуНового можно установить новому объекту определенный идентификатор. Например, из другой базы был выгружен элемент справочника. В текущей базе нужно создать новый элемент с таким же идентификатором. Для этого можно воспользоваться следующим кодом:

//переменная УИДСтрокой - это строка с идентификатором из другой базы
УИДСпр = Новый УникальныйИдентификатор(УИДСтрокой);
ТоварСсылка = Справочники.Товары.ПолучитьСсылку(УИДСпр);
ТоварОбъект = Справочники.Товары.СоздатьЭлемент();
ТоварОбъект.УстановитьСсылкуНового(ТоварСсылка);
//параметром передается именно ссылка, а не идентификатор
//...заполнение реквизитов
ТоварОбъект.Записать();
//уникальный идентификатор нового объекта будет равен уникальному
//идентификатору из другой базы

Прочие методы

//получение макета
МакетСпр = Справочники.Товары.ПолучитьМакет("ИмяМакета");
//можно через объект
МакетСпр = ТоварОбъект.ПолучитьМакет("ИмяМакета");

//получить полное наименование или код с учетом вложенности через /
ПолноеНаименование = ТоварСсылка.ПолноеНаименование();
ПолныйКод = ТоварСсылка.ПолныйКод();

//принадлежит ли элемент определенной группе
Если ТоварСсылка.ПринадлежитЭлементу(СсылкаНаГруппу) Тогда
Сообщить("Принадлежит");
КонецЕсли;

//уровень вложенности, если не в группе, то вернет 0
УровеньИерархии = ТоварСсылка.Уровень();

//определить пустая ссылка или нет
Если ТоварСсылка.Пустая() Тогда
//пустая
КонецЕсли;

//получение пустой ссылки
ПустойТовар = Справочники.Товары.ПустаяСсылка();

Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра "Кто хочет стать миллионером?" с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, ни­дер­ландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля - краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

программирование

Previous post Next post
Up