Очень часто в 1С 8.3. в справочнике необходимо настроить определенный порядок подчинения элементов. Для реализации подобных задач из простого справочника необходимо сделать иерархический справочник 1С.
В платформе 1С существует два вида иерархии – иерархия групп и элементов и иерархия элементов.
Иерархия групп и элементов
Для того, чтобы справочник имел иерархию групп и элементов, необходимо в редакторе справочника на закладке Иерархия установить флаг Иерархический справочник, а свойству Вид иерархии установить значение Иерархия групп и элементов.

Тогда у справочника можно будет создавать группы, и размещать элементы в группах.

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

После этого, каждый элемент может быть родителем другого элемента.

Родитель иерархического справочника 1С
У каждого элемента иерархического справочника должен быть родитель. В случае иерархии групп и элементов родитель это группа иерархического справочника, в случае иерархии элементов, родитель это элемент.
Родитель это стандартный реквизит справочника. Если иерархия отключена, то этот стандартный реквизит не доступен. Как у этого справочника Сотрудники.

А если иерархия включена, то этот реквизит доступен. Как у справочника Контрагенты.

Если форма элемента справочника автоматически генерируется платформой (т.е. она не создана), то этот реквизит отображается на управляемой форме. И, в случае иерархии групп и элементов в нем указана группа, в которую входит этот элемент.

Если группа не указана, то значит элемент верхнего уровня.

Также, родитель имеется у элементов справочника с иерархией элементов.

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

Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Подписывайтесь на мой канал в телеграмме: https://t.me/Programming1CNizamutdinov
И вступайте в мои группы:
Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009
Родитель в справочнике
Ключевые слова: родитель, элемент, группа, справочник, перенос
Родитель – это группа (папка), которой принадлежит элемент.
Основные методы работы с родителем:
Все примеры рассматриваются для справочников, в которых установлен Переключатель «Серии Кодов» — «Во всем справочнике»
Иначе, используемая автором функция Спр.НайтиПоКоду() мягко говоря может дать непредсказуемый результат.
Выбор всех элементов, принадлежащих группе:
//Выбираем элементы, лежащие в группе с кодом Гл005172 Спр = СоздатьОбъект("Справочник.Номенклатура"); Если Спр.НайтиПоКоду("Гл005172") = 1 Тогда Спр.ИспользоватьРодителя(Спр.ТекущийЭлемент()); КонецЕсли; Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент() = 1 Цикл Сообщить(Спр.ТекущийЭлемент()); КонецЦикла;
Выбор элементов, непосредственно принадлежащих выбранной группе.
//Выбираем элементы, непосредственно принадлежащих группе с кодом Гл005172 Спр = СоздатьОбъект("Справочник.Номенклатура"); Если Спр.НайтиПоКоду("Гл005172") = 1 Тогда Ур = Спр.ТекущийЭлемент().Уровень() + 1; Спр.ИспользоватьРодителя(Спр.ТекущийЭлемент()); Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент() = 1 Цикл Если Спр.ТекущийЭлемент().Уровень() = Ур Тогда Сообщить(Спр.ТекущийЭлемент()); КонецЕсли; КонецЦикла; КонецЕсли;
Здесь проверяется уровень элементов и выбираются только те, чей уровень на 1 больше, чем у выбранной группы. Если нужно выбрать только элементы без групп, тогда нужно добавить проверку на ЭтоГруппа().
А если заюзать чудный метод <ВключатьПодчиненные()/IncludeChildren()/>, то код можно сделать проще:
//Выбираем элементы, непосредственно принадлежащих группе с кодом Гл005172 Спр = СоздатьОбъект("Справочник.Номенклатура"); Если Спр.НайтиПоКоду("Гл005172") = 1 Тогда // Ур = Спр.ТекущийЭлемент().Уровень() + 1; Спр.ИспользоватьРодителя(Спр.ТекущийЭлемент()); Спр.ВключатьПодчиненные(0); //<-- Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент() = 1 Цикл // Если Спр.ТекущийЭлемент().Уровень() = Ур Тогда Сообщить(Спр.ТекущийЭлемент()); // КонецЕсли; КонецЦикла; КонецЕсли;
Изменение родителя уже существующего элемента:
//Переносим элемент с кодом Гл000485 в группу с кодом Гл005172 Спр = СоздатьОбъект("Справочник.Номенклатура"); Если Спр.НайтиПоКоду("Гл005172") = 1 Тогда Род = Спр.ТекущийЭлемент(); Если Спр.НайтиПоКоду("Гл000485") = 1 Тогда Спр.Родитель = Род; Спр.Записать(); КонецЕсли; КонецЕсли;
p.s. Обратите внимание на Спр.Записать() – часто забывают это сделать и изменения не принимаются J
p.p.s Обратите внимание на Спр.Родитель = Род. Часто пишут Спр.ТекущийЭлемент().Родитель = Род и получают ошибку о невозможности перепозиционироваться.
Перенос элементов из одной группы в другую:
//Перенос всех элементов из группы с кодом Гл000476 в группу с кодом Гл005172 Спр = СоздатьОбъект("Справочник.Номенклатура"); Справ = СоздатьОбъект("Справочник.Номенклатура"); Если Спр.НайтиПоКоду("Гл005172") = 1 Тогда Род = Спр.ТекущийЭлемент(); Если Спр.НайтиПоКоду("Гл000476") = 1 Тогда Спр.ИспользоватьРодителя(Спр.ТекущийЭлемент()); Пока Спр.ВыбратьЭлементы() = 1 Цикл Спр.ПолучитьЭлемент(); Спр.Родитель = Род; Спр.Записать(); КонецЦикла; КонецЕсли; КонецЕсли;
Перенос из одной группы в другую только элементов, без групп:
//Перенос всех элементов из группы с кодом Гл000476 в группу с кодом Гл005172 Спр = СоздатьОбъект("Справочник.Номенклатура"); Если Спр.НайтиПоКоду("Гл005172") = 1 Тогда Род = Спр.ТекущийЭлемент(); Если Спр.НайтиПоКоду("Гл000476") = 1 Тогда Спр.ИспользоватьРодителя(Спр.ТекущийЭлемент()); nn = 0; Пока nn = 0 Цикл nn = 1; Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент() = 1 Цикл Если Спр.ЭтоГруппа() = 0 Тогда Спр.Родитель = Род; Спр.Записать(); nn = 0; КонецЕсли; КонецЦикла; КонецЦикла; КонецЕсли; КонецЕсли;
Сложность двух предыдущих задач состоит в том, что при смене Родителя сбивается выборка, и ее надо делать заново.
Ну а чтобы не сбивалась выборка есть несколько способов:
-получение этой выборки запросом;
-получение этой выборки в список значений;
-неэффективно, но как вариант, перебор всего справочника без учета подчинения с проверкой на принадлежность нужной группе;
Для проверки принадлежности элемента группе следует использовать метод ПринадлежитГруппе().
P.S. Самая распространенная ошибка — сравнение элемента справочника со строкой. Происходит из-за непонимания, что это разные типы данных.
Неправильно:
Если ЭлементСправочника = "Капуста" Тогда
Правильно:
Если ЭлементСправочника.Наименование = "Капуста" Тогда
Содержание:
1. Простая рекурсивная функция
2. Запрос в цикле
1. Простая рекурсивная функция
При разработке в 1С иногда возникают задачи получения цепочки связанных друг с другом определенных элементов справочников или документов. Но, несмотря на довольно частое возникновение задач получения различных иерархической схемы данных, в 1С, к сожалению, не предусмотрены типовые механизмы для получения такого рода связанной информации. Для примера получения такой информации рассмотрим задачу получения в 1С 8.3 родителей всех элементов справочника Склады. Чтобы решить данную задачу, можно воспользоваться простой рекурсивной функцией, которая будет получать родителя выбранного элемента справочника в цикле, а на следующем этапе получать родителя полученного родителя элемента. Пример такой функции:
// Функция возвращает массив родителей элемента справочника, полученного на вход.
Функция ПолучитьМассивРодителейЭлемента(ЭлементСправочника)
МассивРодителейЭлемента = Новый Массив;
Пока ПустоеЗначение(ЭлементСправочника.Родитель) = 0 Цикл
МассивРодителейЭлемента.Добавить(ЭлементСправочника.Родитель);
ЭлементСправочника = ЭлементСправочника.Родитель;
КонецЦикла
Возврат МассивРодителейЭлемента;
КонецФункции
Данный метод может использоваться также и для получения всей цепочки документов-оснований списка документов, нужно только подставить вместо элемента справочника нужный нам документ, а вместо родителя проверять на заполненность вариант документа — основания.
2. Запрос в цикле
Хотя приведенная выше простая рекурсивная функция компактна и легка в написании, она имеет существенный для производительности недостаток – обращение через точку в цикле. При обращении каждую итерацию к серверу будут получены не только все ненужные реквизиты элемента справочника или документа, но и все табличные части, привязанные к данному элементу, что увеличит нагрузку на сервер и снизит производительность, получая с сервера большое количество ненужных данных. Например, если мы получаем документ-основание реализации, в которой тысяча строк, то все эти будут переданы с сервера на клиент. Нагрузку можно снизить, заменив обращение через точку выполнением запроса в цикле. В этом случае каждую итерацию цикла будем получать хотя бы только нужный нам реквизит. Но запрос в цикле тоже вещь очень плохая, так как инициирует многократное обращение к серверу, увеличивая время, затрачиваемое на работу цикла. Поэтому гораздо лучше не выполнять запрос в цикле, а создавать в цикле текст запроса, затем выполнить запрос с полученным текстом, получив все нужные данные с сервера только один раз. Рассмотрим пример запроса с динамическим формированием текста запроса в зависимости от уровня родителя справочника в 1С:
Функция ПолучитьМассивРодителейЭлемента (ЭлементСправочника)
МассивРодителейЭлемента = Новый Массив;
УровеньРодителя = ЭлементСправочника.Уровень();
ТекстОбъединить = «»;
ТекстРодительЭлемента = «»;
ТекстЗапросаВТ = «»;
Для инд = 1 По УровеньРодителя Цикл
ТекстРодительЭлемента= ТекстРодительЭлемента+ «.Родитель»;
Если инд<> 1 Тогда
ТекстОбъединить= »
|
| ОБЪЕДИНИТЬ ВСЕ
|»;
КонецЕсли;
ТекстЗапросаВТ= ТекстЗапросаВТ+ ТекстОбъединить+ »
|ВЫБРАТЬ
| Склады» + ТекстРодительЭлемента+ » КАК Родитель
| ИЗ
| Справочник.Склады КАК Склады
| ГДЕ
| Склады.Ссылка = &ЭлементСправочника»;
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст = »
|ВЫБРАТЬ
| ВТ_СписокРодителей.Родитель КАК Родитель
|ИЗ
| (» + ТекстЗапросаВТ+ «) КАК ВТ_СписокРодителей»;
Запрос.УстановитьПараметр(«ЭлементСправочника», ЭлементСправочника);
ВыборкаЗапроса = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
МассивРодителейЭлемента.Добавить(Выборка.Родитель);
КонецЦикла;
Возврат МассивРодителейЭлемента;
КонецФункции
Если заранее известно точное значения уровня вложенности элемента справочника, то запрос можно составлять не динамически, а вручную, сразу указав нужное количество объединений таблиц.
Специалист компании «Кодерлайн»
Александр Суворов
Если у справочника в свойствах задано Иерархический справочник, то может возникнуть необходимость найти родителя элемента справочника. Количество уровней иерархии в справочнике может быть как ограниченным, так и без ограничений.
Если количество уровней фиксированное, то через точку можно получить родительский элемент любого уровня.
РодительСсылка = СправочникСсылка.Родитель.Родитель.Родитель;
Если количество уровней не ограничено, то можно на встроенном языке 1С написать универсальную функцию, которая определит самую верхнюю группу.
Определить самого верхнего родителя
Универсальную функцию для определения самого верхнего родителя элемента можно реализовать с помощью встроенного языка программирования. Функции на вход подаётся ссылка на элемент иерархического справочника, а возвращается ссылка на самую верхнюю группу.
Функция ПолучитьРодителя(СправочникСсылка)Пока НЕ СправочникСсылка.Родитель.Пустая() Цикл
СправочникСсылка = СправочникСсылка.Родитель;
КонецЦикла;Возврат СправочникСсылка;КонецФункции
Определить самого верхнего родителя с использованием запроса
В запросе можно найти родителей элемента обратившись к свойствам через точку или с помощью левого соединения. Данные методы не универсальны, так как уровень вложенности фиксирован в запросе. Такой метод подходит, когда заранее известно количество уровней иерархического справочника. Функция на вход принимает ссылку на элемент иерархического справочника, а возвращает ссылку на группу N-уровня.
Функция ПолучитьРодителейЗапросе(СправочникСсылка) Запрос
= Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Справочник1.Родитель.Родитель.Родитель КАК Родитель
|ИЗ
| Справочник.Справочник1 КАК Справочник1
|ГДЕ
| Справочник1.Ссылка = &Справочник1Ссылка"; Запрос
.УстановитьПараметр("Справочник1Ссылка", СправочникСсылка);
Результат = Запрос.Выполнить();Если НЕ Результат.Пустой() Тогда Выборка
= Результат.Выбрать();
Выборка.Следующий();
Возврат Выборка.Родитель;КонецЕсли;Возврат Справочники.Справочник1.ПустаяСсылка();КонецФункции
1С 8.x : Получение всех родителей элемента справочника
В языке запросов не предусмотрено специальных средств для получения всех родителей элемента. Для выполнения задачи можно воспользоваться иерархическими итогами, однако получение иерархических итогов оптимизировано для построения итогов большого количества записей, и не вполне эффективно для получения родителей одного элемента. Для более эффективного получения всех родительских записей элемента, рекомендуется перебирать в цикле его родителей небольшими порциями. Пример:
Код 1C v 8.х
В данном примере в окно служебных сообщений выводятся все родители для ссылки, записанной в переменную ЭлементНоменклатура. В цикле выбирается по 5 родителей ссылки.
Если число уровней в справочнике ограничено и невелико, то возможно получение всех родителей одним запросом без цикла.
Программная работа со справочниками
Справочники в 1С — это объекты конфигурации, предназначенные для хранения данных, имеющих одинаковую структуру и носящие списочный характер. Например, в справочниках может храниться: перечень номенклатуры, контрагентов, сотрудников, банковских счетов и т.д. В статье рассматриваются базовые принципы работы с этим объектом метаданных.
Создание элемента справочника
Создание новых элементов и групп справочника производится с помощью программного объекта СправочникМенеджер.ИмяСправочника . Данный объект доступен только на сервере. Создание нового элемента или группы справочника состоит из следующих этапов:
- Создание элемента или группы;
- Заполнение владельца (если справочник подчиненный);
- Заполнение родителя (если справочник иерархический);
- Заполнение наименования и реквизитов (если не задана автоматическая нумерация, то и кода);
- Заполнение табличных частей;
- Запись элемента.
Создание новой группы:
Создание нового элемента:
Поиск элементов справочника
Для поиска элементов справочников в языке программирования 1С предусмотрено несколько методов:
- НайтиПоКоду(Код, ПоискПоПолномуКоду, Родитель, Владелец)
- НайтиПоНаименованию(Наименование, ТочноеСоответствие, Родитель, Владелец)
- НайтиПоРеквизиту(ИмяРеквизита, ЗначениеРеквизита, Родитель, Владелец)
Во всех методах если поиск успешный, то будет возвращена ссылка на найденный элемент.
Удаление элементов справочника
Элементы справочника могут быть помечены на удаление и удалены из базы непосредственно.
Непосредственное удаление – операция необратимая, в то время как пометку на удаление можно отменить. Пометка на удаление хранится в предопределенном реквизите ПометкаУдаления . В пользовательском режиме помеченные на удаление элементы и группы справочника помечаются красным крестиком.
Пометку на удаление можно установить/снять двумя разными способами:
Пример непосредственного удаления элемента справочника:
Обход элементов справочника
Для обхода элементов справочника в языке программирования 1С предусмотрено два метода:
- Выбрать(Родитель, Владелец, Отбор, Порядок)
- ВыбратьИерархически(Родитель, Владелец, Отбор, Порядок)
Методы отличаются порядком следования отобранных элементов: при иерархической выборке для каждого элемента сначала выбираются элементы, для которых он является родителем, а затем уже выбираются элементы следующего уровня.
Рассмотрим примеры обхода элементов справочника:
Выбор элементов справочника запросом
Поиск данных в базе 1С предпочтительнее выполнять при помощи запросов. Запрос позволяет описать практически любые условия для отбора, в отличие от методов Выбрать() и ВыбратьИерархически() , на которые накладываются существенные ограничения. К тому же, в большинстве случаев работа с использованием запросов быстрее, чем работа с использованием программного кода.
Простой пример поиска и вывода товаров со стоимостью больше 1000:
Открытие форм справочника
Для открытия любых форм справочников рекомендуется использовать метод
Для открытия формы элемента или группы справочника также возможно использовать более простой метод
Кроме методов ОткрытьФорму() и ПоказатьЗначение() есть и другие ( ОткрытьФормуМодально , ОткрытьЗначение , ПолучитьФорму ), но их использование не рекомендуется, т.к. часть этих методов использует режим модального открытия, часть противоречит свежим рекомендациям фирмы 1С.
Приведем примеры программного открытия форм справочника:
Внимание! Следует понимать, что интерактивная работа (в том числе открытие форм) в 1С возможна только на стороне клиента. В то же время поиск и изменение данных возможны только на стороне сервера.
Справочники
Справочники хранят в себе одинаковые по структуре данные. Например, справочник товаров или справочник должностей. Справочники это ссылочный тип данных, на любой элемент справочника можно сослаться, в документах, константах или вообще в каких либо реквизитах.
Структура справочника
Справочник обычно описываются следующим набором данных:
Предопределенные реквизиты
У каждого справочника есть номер и наименование. В принципе их можно отключить, указав длину 0. Так же код может быть числовым или текстовым, если код текстовый для удобства сортировки система дополняет код лидирующими нулями на всю длину кода, например если у справочника указана длина кода 9 и справочнику был присвоен код 3 то система дополнит нулями до такого вида: «000000003». Также в случае если имеется распределенная база в код обычно добавляется префикс той базы в которой был создан элемент, например: «ЦН0000003». Нужно учитывать эту особенность если вы соберетесь указывать числовой код, этот объект не сможет корректно работать в распределенной базе. У справочника есть и другие предопределенные реквизиты:
Иерархичность.
Иерархия это способность выводить справочник в виде дерева. Эта возможность бывает очень удобной, в случаях когда в справочнике содержится много информации. В таких случаях бывает полезно разложить номенклатуру «по полочкам». При включении иерархичности у справочника, добавляются два стандартных реквизита ЭтоГруппа и Родитель . Манипулируя значением реквизита Родитель, можно переназначать родителей элемента. Строится иерархия на группах, в эти группы могут входить другие элементы или другие группы. Аналогию можно провести с проводником windows или с большинством файловых систем если вам будет удобно: есть папки в которых могут быть как файлы так и папки в которых в свою очередь тоже могут быть и файлы и папки итд. Иерархия может работать и без групп. То есть родителями могут выступать другие элементы справочника. Такой вид иерархии называется иерархия элементов. Если мы настроили иерархию, у нас появляется возможность настраивать, для какого типа могут использоваться реквизиты, для групп, элементов, или и для того и для другого. Иерархия настраивается на закладке Иерархия свойств справочника.
Подчиненность
Подчиненность это возможность сделать несколько записей одного справочника уникальными для одной записи другого справочника (если вы знакомы с основами реляционных баз даных, это связь, один ко многим ) . Например: у одного контрагента, может быть много договоров, но это будут только его договора, у второго контрагента будет свой набор договоров. В этом случае справочник договоры подчинен справочнику контрагенты. Подчинение справочника реализовано предопределенным реквизитом Владелец , следовательно у одной конкретно взятой записи справочника, может быть только один владелец. В то же время у одного справочника может быть несколько владельцев. Владельцами могут быть не только справочники, а также планы обмена, планы видов характеристик, планы счетов, планы видов расчета. Также можно указать вид объекта для подчинения, доступны элементы, группы или и то и другое. Если для справочника определены подчиненные справочники и у элемента справочника не назначена основная форма, то при открытии элемента этого справочника в режиме предприятия, в управляемых формах система автоматически добавит панель для открытия подчиненных справочников с фильтром на поле владелец по текущему элементу. Такое поведение можно настроить и на уже существующих формах. (скрин)
Ввод по Строке
При выборе ссылочных данных в 1С есть возможность выбрать элемент справочника или документ, набирая ключевые реквизиты объекта который мы хотим найти, выглядит это следующим образом: пользователь, набирает «масло моторное» в поле ввода с типом «Справочник.Номенклатура» и нажимает ввод. 1С находит все записи которые начинаются с названия со слов «масло моторное» и показывает их в виде выпадающего списка под полем где пользователь вводил текст. Такой же ввод возможен и для документов. Это поведение системы можно настроить на закладке «Формы». Там есть поле Ввод по строке , по умолчанию для справочников указана возможность поиска по коду и наименованию, но туда можно добавить и свои реквизиты, для того, что бы добавить этот реквизит, он должен быть индексирован и реквизит должен быть примитивного типа.
Предопределенные элементы справочников.
Предопределенные элементы справочников определяются в конфигураторе на закладке Прочие . При создании элемента указывается имя и наименование предопределенного элемента. Имя и будет являться идентификатором для обращения к этому предопределенному элементу, поэтому к имени предъявляются такие же требования как и к другим идентификаторам(не может начинаться с числа, нельзя использовать пробелы и тд). Наименование может быть любым, его пользователь и увидит в справочнике и сможет его при желании изменить. Пользователь не может изменить имя который был указано при создании этого элемента, зато он может удалить предопределенный элемент.(надо бы найти номер релиза когда это стало возможным). Обращение к предопределенным элементам происходит так:
Таким образом, очень удобно ссылаться на предопределенные элементы из встроенного языка или опираться на них при построении каких то условий. Предопределенные элементы справочников можно использовать в схемах СКД и запросах.
Важно. Контроль за удалением предопределенных элементов лежит на плечах разработчиков, а не платформы.
Для предопределенных элементов справочников, стандартный реквизит Предопределенный имеет значение Истина. Это свойство которое доступно только на чтение, но это не означает, что нельзя «обычный» элемент справочника сделать предопределенным и наоборот. В последних релизах 8.3FIXME(Надо узнать в каких именно), появилась возможность переопределять предопределенные элементы изменяя свойство ИмяПредопределенныхДанных . Например, вот так можно сделать элемент не предопределенным:
И наоборот указав в свойстве ИмяПредопределенныхДанных имя предопределенного элемента справочника, можно сделать его предопределенным. У иерархических справочников возможно указывать предопределенные группы. Предопределенные элементы нельзя создавать у подчиненных справочников. В пользовательском режиме предопределенный элемент отличается, от обычного, следующим образом(показать скрин).
Подсказка. Предопределенные элементы часто используют для того, что бы избавиться в коде от конструкций вида: НайтиПоКоду и НайтиПоНаименованию . Использование этих методов считается дурным тоном, так как наименование и код справочника достаточно часто изменяются. Обычно поступают следующим образом: Создают справочник, например Настройки с единственным реквизитом Значение . После этого в конфигураторе добавляют предопределенный элемент с нужным названием а в режиме 1с Предприятие, задают его значение. Теперь вместо того что бы писать в коде:
или что еще хуже
Можно просто указать:
Классы для работы со справочниками.
Все классы справочника можно увидеть в ветке Прикладные объекты –> Справочники .
Cправочники это элементы которые хранятся в базе данных, считается очевидным, что обращение к любому из классов возможно только на сервере.
Справочник менеджер
Справочник менеджер – можно получить с помощью переменных глобального контекста:
Этот класс служит для:
Получать пустые ссылки:
И много еще разных возможностей которые можно наблюдать в синтаксис помощнике в ветке: Прикладные объекты – >Справочники – СправочникМенеджер.<ИмяСправочника>
Справочник ссылка
Справочник ссылка – самый часто используемый тип. Используется для чтения данных справочника. Его можно получить с помощью НайтиПоНаименованию , НайтиПоКоду и др методов класса СправочникМенеджер . Так же его можно получить с помощь класса Выборка и этот тип данных хранится в реквизите Cсылка объекта класса Справочник объект . В этом классе нам доступны все реквизиты справочника, табличные части и все стандартные реквизиты. Абсолютно все свойства этого класса нам доступны только на чтение. Для того что бы изменять реквизиты справочника нам нужен класс Справочник Объект . Получить его можно с помощью метода Получить Объект() .
Справочник Объект
Класс Справочник Объект отличается от класса Справочник Ссылка не многим, основная его функция обеспечить возможность изменения элемента справочника. Запись происходит с помощью метода Записать()
Справочник Выборка
Справочник Выборка получается с помощью методов Выбрать и Выбрать Иерахически он позволяет обойти элементы справочника в цикле, с помощью метода Следующий() .
Популярные приемы работы со справочниками
Поиск по наименованию.
Несмотря на то, что неоднократно рассматривается поиск элемента справочника по наименованию, «зашивать» в код значения из базы данных считается дурным тоном.
Для поиска по наименованию используется функция НайтиПоНаименованию() . Для использования этого метода необходимо указать наименование по которому будет происходить поиск. Если поиск должен проходить по точному соответствию с указанной строкой то вторым параметром, нужно указать Истина, иначе поиск будет проходить по первым буквам указанного шаблона поиска, то есть если в качестве строки для поиска указать «Слон» то под шаблон попадут и «Слон» и «Слон игрушечный» и «Слонопотам». Поиск можно ограничить определенной группой, если справочник иерархический или владельцем, если справочник подчиненный. Если значение не найдено, метод вернет пустую ссылку того типа справочника для которого производился поиск.
Поиск по коду
Для поиска по коду используется функция НайтиПоКоду() . Для использования этого метода необходимо в параметре «Код» указать код, по которому будет производиться поиск. Если в качестве кода указывается полный путь с учетом иерархии (уровни справочника разделяются символом «/»), то второй параметр поиск по полному коду, необходимо установить в Истина. Например: Номенклатура «Слонопотам» с кодом «001142» находится в папке «Мягкие Игрушки» с кодом «000826» которая находится в папке «Игрушки» с кодом 000375. Тогда можно найти ее с помощью вот такой строки
Или можно искать сразу:
Поиск можно ограничить определенной группой, если справочник иерархический или владельцем, если справочник подчиненный. Если значение не найдено, метод вернет пустую ссылку того типа справочника для которого производился поиск. Поиск может осуществляться и по реквизиту с помощью одноименного метода, главное условие реквизит должен быть индексирован.
Выборка
Выборка позволяет обходить в цикле элементы справочника. Для иерарахических справочников доступна выборка по родителю, для подчиненных по владельцу. Для любого вида справочника возможно указать отбор, которому будут соответствовать элементы в выборке и поле по которому выборка будет упорядочена. Работает выборка следующим образом:
При использовании метода Следующий() в классе выборка, текущим устанавливается следующий элемент из текущей выборки. Если в выборка спозиционировалась на определенном элементе, она возвращает Истина, иначе Ложь. Для класса Справочник Выборка доступны все поля и табличные части, которые определены для текущего справочника, а так же есть свойство Ссылка которое позволяет получить ссылку на текущий элемент справочника из выборки. Для того что бы при выборке учитывалась иерархия справочника, необходимо использовать метод ВыбратьИерархически() .
Программное создание элементов справочника
Элементы и группы справочников, можно создавать и не посредственно из программного кода. Для этого используется следующий код:
Группа справочника создается аналогично с помощью метода СоздатьГруппу() В том случае, если у справочника установлено свойство Автонумерация код указывать не нужно, он устанавливается автоматически.
Проверка переменной с типом СправочникСсылка на заполненность
Иногда возникает необходимость проверить заполнено ли значение с типом «Справочник.Ссылка». Такая необходимость может возникнуть, когда реквизит какого либо объекта имеет тип «Справочник.Ссылка» или когда вы например ищете элемент справочника по коду или наименованию, или в ряде других случаев, когда метод возвращает пустую ссылку на справочник. Есть несколько способов это сделать:
Только для сервера
Проверка элемента справочника на вхождение в какую либо группу или подчинение элементу
Когда мы говорим о проверке подчиненности, необходимо понимать, что все методы справедливы не только для групп, но и для элементов, если у справочника установлен вид иерархии «Иерархия элементов». Здесь возможно несколько вариантов: если у нас есть группа и нам необходимо знать если ли именно в ней и нигде иначе определенный элемент справочника, то можно сравнить предопределенный реквизит Родитель нужного нам элемента справочника с ссылкой на группу, например:
Если справочник многоуровневый и нужно знать есть ли элемент в этой группе или где то в подчинненых группах то можно воспользоваться методом «ПринадлежитЭлементу()» этот метод вернет Истина если элемент содержится в текущей или любой подчиненной группе. Например в этом случае
условие будет истинным.
СправочникСсылка <> СправочникОбъект
При работе со справочниками очень важно понимать, что во всех реквизитах, выборках и тд, мы чаще всего работаем с типом СправочникСсылка и этот тип позволяет получить любую информацию которая находится в его реквизитах, но не поддерживает запись. Для изменения реквизитов справочника и записи следует использовать тип СправочникОбъект. Преобразовать ссылку в объект можно с помощью метода ПолучитьОбъект() Например:
Проверка на то что ссылка является ссылкой на справочник
Проверить то что справочник является ссылкой можно очень просто, с помощью одной строки:
Где СсылкаНаЭлементСправочника проверяемая ссылка, эта строка вернет Истина если проверяемая ссылка является ссылкой на какой либо элемент справочника.

