1с проверить наличие справочника

Обновлено: 07.07.2024

Примеры запросов для работы с иерархическими справочниками

В данном разделе показаны примеры решения типовых задач при работе с иерархическими справочниками.

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

Для получения подчиненных элементов иерархического справочника в языке запросов предусмотрена конструкция В ИЕРАРХИИ. Пример использования В ИЕРАРХИИ:

ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ
Справочник.Номенклатура КАК Номенклатура

ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)

В данном примере будут получены все записи справочника Номенклатура, находящиеся в группе &Группа, включая ее саму, ее подчиненные группы и элементы, принадлежащие подчиненным группам.

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

ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ
Справочник.Номенклатура КАК Номенклатура

ГДЕ
Номенклатура.Родитель = &Группа

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

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

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

ВЫБРАТЬ ПЕРВЫЕ 1
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Родитель = &Родитель

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

Если Запрос.Выполнить().Пустой() Тогда
Сообщить("Зписей нет");
Иначе
Сообщить("Записи есть");
КонецЕсли;

Получение всех родителей элемента

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

Запрос = Новый Запрос("ВЫБРАТЬ
| Номенклатура.Родитель,
| Номенклатура.Родитель.Родитель,
| Номенклатура.Родитель.Родитель.Родитель,
| Номенклатура.Родитель.Родитель.Родитель.Родитель,
| Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|
|ГДЕ
| Номенклатура.Ссылка = &ТекущийЭлементНоменклатуры";

Пока Истина Цикл
Запрос.УстановитьПараметр("ТекущийЭлементНоменклатуры", ТекущийЭлементНоменклатуры);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Прервать;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Для НомерКолонки = 0 По Результат.Колонки.Количество() - 1 Цикл
ТекущийЭлементНоменклатуры = Выборка[НомерКолонки];
Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда
Прервать;
Иначе
Сообщить(ТекущийЭлементНоменклатуры);
КонецЕсли;
КонецЦикла;

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

Если число уровней в справочнике ограничено и невелико, то возможно получение всех родителей одним запросом без цикла.

Вывод иерархического справочника в отчет

Для вывода иерархического справочника в отчет с сохранением иерархии необходимо пользоваться запросом аналогичным следующему:

ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ
Справочник.Номенклатура КАК Номенклатура
УПОРЯДОЧИТЬ ПО
Наименование ИЕРАРХИЯ

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

Для того чтобы группы справочника размещались выше элементов необходимо в данном запросе заменить предложение УПОРЯДОЧИТЬ ПО на следующее:

УПОРЯДОЧИТЬ ПО
Номенклатура.ЭтоГруппа ИЕРАРХИЯ,
Наименование

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

Возможна также замена предложения УПОРЯДОЧИТЬ ПО на предложение АВТОУПОРЯДОЧИВАНИЕ. В этом случае результат будет упорядочен в соответствии с настройками справочника, т.е. если в справочнике указано, что группы должны располагаться выше элементов, то они будут расположены выше.

Получить иерархическую структуру справочника также возможно и при помощи итогов.

ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена

ИЗ Справочник.Номенклатура КАК Номенклатура

ГДЕ
(Номенклатура.ЭтоГруппа = ЛОЖЬ)

УПОРЯДОЧИТЬ ПО Наименование

ИТОГИ ПО Номенклатура.Ссылка ТОЛЬКО ИЕРАРХИЯ

Получение итогов по иерархии

Для получения итогов по иерархии в запросе необходимо в предложении ИТОГИ ПО указать ключевое слово ИЕРАРХИЯ после указания поля, по которому будет рассчитываться итоги. Пример отчета "Обороты номенклатуры" с получением итогов по иерархии:

ВЫБРАТЬ
УчетНоменклатурыОбороты.Номенклатура КАК Номенклатура,
УчетНоменклатурыОбороты.Номенклатура.Представление,
УчетНоменклатурыОбороты.КоличествоОборот КАК КоличествоОборот
ИЗ
РегистрНакопления.УчетНоменклатуры.Обороты КАК УчетНоменклатурыОбороты
ИТОГИ СУММА(КоличествоОборот) ПО
Номенклатура ИЕРАРХИЯ

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

В случае, когда не нужны итоги по элементам, а нужны итоги только по группам, нам необходимо использовать в итогах конструкцию ТОЛЬКО ИЕРАРХИЯ. Пример:

ВЫБРАТЬ
УчетНоменклатурыОбороты.Номенклатура КАК Номенклатура,
УчетНоменклатурыОбороты.Номенклатура.Представление,
УчетНоменклатурыОбороты.КоличествоОборот КАК КоличествоОборот
ИЗ
РегистрНакопления.УчетНоменклатуры.Обороты КАК УчетНоменклатурыОбороты
ИТОГИ СУММА(КоличествоОборот) ПО
Номенклатура ТОЛЬКО ИЕРАРХИЯ

В результате данного запроса будут итоговые записи только для групп номенклатуры.

Inkognito --> Inkognito



Просмотр профиля

Необходимо проверить существование справочника в конфигурации (BASERP отличилась наличием справочника "УпаковкиЕдиницыИзмерения", хотя во всех других конфигурациях используется "КлассификаторЕдиницИзмерения"). Можно конечно реализовать проверку на конфигурацию, но лучше на реквизит.
//--------------------------

Vofka --> Vofka



Просмотр профиля

Только я не понял что тут написано и что за ошибка?

Телепатирую, что вместо Метаданные.Справочники надо написать Метаданные.Справочники.МойСправочник.

Petre --> Petre



Просмотр профиля Inkognito @ Today, 15:49 ,
Думаю, натолкнет на мысль.
Во-первых, Метаданные.Справочники.МойСправочник = Метаданные.Справочники["МойСправочник"] , во-вторых, Метаданные.Справочники.Найти("МойСправочник"); Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія". Inkognito --> Inkognito



Просмотр профиля

как программно проверить пустой ли справочник. и как программно его заполнить (находясь в модуле документа)?
(из модуля документа вызываю процедуру), но не работает
СпрУпаковка= СоздатьОбъект("Справочник.Упаковки");
СпрУпаковка.ИспользоватьВладельца(наименованиеЭтикетки); //наименованиеЭтикетки тип спр. номенклатура
СпрУпаковка.ВыбратьЭлементы(0);

Если СпрУпаковка.ПолучитьЭлемент() = 0 Тогда
Сообщить("Справочник+ "+СпрУпаковка+"пустной");
СпрУпаковка.Новый();
СпрУпаковка.Наименование = "Втулка (шт)";

(нужно программно заполнить наименование, размер и расход)
количество наименований=5

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь


Как проверить есть ли в двумерном массиве одинаковые элементы?
Дан массив .Как проверить есть ли в нём одинаковые элементы?


Как проверить есть ли в матрице элементы совпадающие с каким-либо элементом вектора
Как проверить есть ли в матрице элементы совпадающие с каким-либо элементом вектора


Проверить, есть ли в нем отрицательные элементы. Если есть, найдите их количество
Создать массив с именем А из 10-ти элементов, задав значения его элементов с помощью датчика.


Проверить, есть ли в массиве положительные элементы и если есть, то найти среди них максимальный
задан одном. массив из N чисел. нужно проверить есть ли в массиве положительные элементы и если.

СпрУпаковка.ИспользоватьВладельца(наименованиеЭтикетки); //наименованиеЭтикетки тип спр. номенклатура

"наименованиеЭтикетки" - это элемент справочника.
Его нужно предварительно найти и сохранить в переменную.
Например:

И обязательно, в конце создания нового не забыть:

Во первых ВыбратьЭлементы(0) - неправильно, поскольку подчинение - это и тоже иерархия, иначе получитьэлемент всегда будет равно 1 (если есть хоть один подчиненный элемент). Надо ВыбратьЭлементы(1)
Во вторых, таки да - записать. Во первых ВыбратьЭлементы(0) - неправильно, поскольку подчинение - это и тоже иерархия, иначе получитьэлемент всегда будет равно 1 (если есть хоть один подчиненный элемент). Надо ВыбратьЭлементы(1)
Во вторых, таки да - записать.

Совершенно верно!
"ВыбратьЭлементы(<Режим>)" я упустил .

Еще - при создании нового подчиненного элемента обязательно нужно указывать владелца:

Еще - при создании нового подчиненного элемента обязательно нужно указывать владелца: В случае если было ИспользоватьВладельца() - уже не надо. В случае если было ИспользоватьВладельца() - уже не надо.

Век живи, век учись!

А я, для надежности, всегда использую ;)

я правильно поняла.
СпрЭтикетки=СоздатьОбъект("Справочник.Номенклатура");
Если СпрЭтикетки.НайтиПоНаименованию(наименованиеЭтикетки,0,1)=1 Тогда
Владелец=СпрЭтикетки.ТекущийЭлемент();
КонецЕсли;
СпрУпаковка= СоздатьОбъект("Справочник.Упаковки");
СпрУпаковка.ИспользоватьВладельца(Владелец);
СпрУпаковка.ВыбратьЭлементы(1);

Если СпрУпаковка.ПолучитьЭлемент() = 0 Тогда
Сообщить("Справочник+ "+СпрУпаковка+"пустной");
СпрУпаковка.Новый();
СпрУпаковка.Наименование = "Втулка";
СпрУпаковка.Записать();
КонецЕсли; //СпрУпаковка.ПолучитьЭлемент() = 0 Тогда

но все равно ничего не происходит..

Ну будем ставить проверку на всё

СпрЭтикетки=СоздатьОбъект("Справочник.Номенклатура");
Сообщить("Создали объект");
Если СпрЭтикетки.НайтиПоНаименованию(наименованиеЭтикетки,0,0)=1 Тогда // а то строки бывают с пробелами
Сообщить("Нашли владельца");
Владелец=СпрЭтикетки.ТекущийЭлемент();
Иначе
Сообщить("Не найден владелец " + НаименованиеЭтикетки + " Тип " +ТипЗначенияСтр(НаименованиеЭтикетки));// а вдруг таки наименование этикетки не строка?
возврат;
КонецЕсли;
СпрУпаковка= СоздатьОбъект("Справочник.Упаковки");
СпрУпаковка.ИспользоватьВладельца(Владелец);
СпрУпаковка.ВыбратьЭлементы(1);

Если СпрУпаковка.ПолучитьЭлемент() = 0 Тогда
Сообщить("Справочник+ "+СпрУпаковка+"пустой");
СпрУпаковка.Новый();
СпрУпаковка.Наименование = "Втулка";
СпрУпаковка.Записать();
КонецЕсли; //СпрУпаковка.ПолучитьЭлемент() = 0 Тогда

Извиняюсь, недосмотрел.
Может поменять владелец на другую переменную, все-таки это зарезервированное слово

Ну будем ставить проверку на всё

СпрЭтикетки=СоздатьОбъект("Справочник.Номенклатура");
Сообщить("Создали объект");
Если СпрЭтикетки.НайтиПоНаименованию(наименованиеЭтикетки,0,0)=1 Тогда // а то строки бывают с пробелами
Сообщить("Нашли владельца");
Владелец=СпрЭтикетки.ТекущийЭлемент();
Иначе
Сообщить("Не найден владелец " + НаименованиеЭтикетки + " Тип " +ТипЗначенияСтр(НаименованиеЭтикетки));// а вдруг таки наименование этикетки не строка?
возврат;
КонецЕсли;
СпрУпаковка= СоздатьОбъект("Справочник.Упаковки");
СпрУпаковка.ИспользоватьВладельца(Владелец);
СпрУпаковка.ВыбратьЭлементы(1);

Если СпрУпаковка.ПолучитьЭлемент() = 0 Тогда
Сообщить("Справочник+ "+СпрУпаковка+"пустой");
СпрУпаковка.Новый();
СпрУпаковка.Наименование = "Втулка";
СпрУпаковка.Записать();
КонецЕсли; //СпрУпаковка.ПолучитьЭлемент() = 0 Тогда

Войдите как ученик, чтобы получить доступ к материалам школы

Язык запросов 1С 8.3 для начинающих программистов: функции и операторы для работы с типами (ТИПЗНАЧЕНИЯ, ТИП, ССЫЛКА, ЕСТЬNULL, ВЫРАЗИТЬ)

Автор уроков и преподаватель школы: Владимир Милькин

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

01

В языке запросов существует целый класс функций и операторов для работы с типами реквизитов. Давайте рассмотрим их.

Функция ТИПЗНАЧЕНИЯ

Эта функция принимает один параметр (значение) и возвращает его тип. Для описанного на картинке (выше) реквизита Вкус справочника Еда вернётся следующее:

02

Если мы запросим тип поля Наименование, то, как и ожидается, получим Строка:

А теперь давайте рассмотрим реквизит ОтличительныйПризнак у справочника Города:

04

Вы видите, что этот реквизит может иметь один из нескольких типов: Строка, Справочник.Вкусы, Справочник.Цвета. Такой тип реквизитов называется СОСТАВНЫМ .

Если мы попытаемся заполнить значение такого реквизита в режиме 1С:Предприятие, то система спросит нас, какого типа будет вводимое значение:

05

И только после нашего выбора позволит ввести значение выбранного типа.

Таким образом, элементы справочника одного вида (Справочник.Города) смогут хранить в одном и том же реквизите (ОтличительныйПризнак) значения разных типов (Строка, Цвета или Вкусы).

Вы можете убедиться в этом сами пощёлкав по элементам справочника Города в режиме 1С:Предприятие. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.

Здесь значение отличительного признака является элементом справочника Вкусы:

06

07

А здесь вообще элементом справочника Цвета:

09

Вот какие возможности открывает перед нами составной тип данных!

Интересно, как поведёт себя функция ТИПЗНАЧЕНИЯ на реквизите ОтличительныйПризнак, имеющий составной тип данных:

Это уже очень интересно. Давайте разбираться с каждой строкой в отдельности.

Тип значения отличительного признака для элемента Россия равен NULL. Мы впервые сталкиваемся с этим типом. Значения данного типа используются исключительно для определения отсутствующего значения при работе с базой данных.

Так и есть, ведь элемент Россия является группой, а не обычным элементом справочника Города, поэтому у него отсутствует поле ОтличительныйПризнак. А тип у отсутствующего значения, как мы прочитали выше, всегда равен NULL.

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

Для Красноярска тип признака равен Цвета, потому что значение выбранное в базе является ссылкой на элемент справочника Цвета.

Для Воронежа тип признака равен Строка, потому что значение введенное в базе является обычной строкой.

Индия снова группа, поэтому значение отсутствует. А тип у отсутствующего значения, как мы помним, равен NULL.

Далее всё аналогично, кроме Сан-Паулу. Это не группа, а обычный элемент справочника (город), но тип его значения пустой. Как так?

А дело вот в чём. Если вы зайдёте в элемент справочника Города с наименованием Сан-Паулу, то увидите, что поле ОтличительныйПризнак совершенно никак не заполнено. Оно пустое. А все незаполненные поля составного типа имеют специальное значение НЕОПРЕДЕЛЕНО .

С НЕОПРЕДЕЛЕНО мы также сталкиваемся впервые.

Значение НЕОПРЕДЕЛЕНО применяется, когда необходимо использовать пустое значение, не принадлежащее ни к одному другому типу. Это как раз наша ситуация.

А тип для значения, которое не принадлежит ни к одному из типов, как вы уже наверное догадались отсутствует.

Функция ТИП

Она принимает всего один параметр - имя примитивного типа (СТРОКА, ЧИСЛО, ДАТА, БУЛЕВО), либо имя таблицы, тип ссылки которой нужно получить.

Результатом данной конструкции будет значение типа Тип для указанного типа.

Звучит туманно, не правда ли?

Давайте рассмотрим применение данной конструкции и всё сразу станет на свои места.

Пусть нам требуется отобрать все записи справочника Города, у которых составной реквизит ОтличительныйПризнак имеет значение типа СТРОКА:

01

Теперь давайте отберём все записи, у которых значения реквизита ОтличительныйПризнак являются ссылками на элементы справочника Цвета (таблица Справочник.Цвета):

02

Отступление

Как вы помните, некоторые элементы справочника Города не имеют реквизита ОтличительныйПризнак. Функция ТИПЗНАЧЕНИЯ для таких элементов выдаёт NULL.

Как можно сделать отбор таких элементов в запросе? Для этого предусмотрен специальный логический оператор ЕСТЬ NULL (не путать с функцией ЕСТЬNULL, которую мы рассмотрим ниже). Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.

Вот пример его использования:

03

Но есть и такие элементы (Сан-Паулу), у которых реквизит ОтличительныйПризнак (составного типа) просто не заполнен и равен специальному значению НЕОПРЕДЕЛЕНО.

Чтобы отобрать такие записи следует использовать другую конструкцию:

Но сравнение с НЕОПРЕДЕЛЕНО для определения пустых (не заполненных) реквизитов будет работать только для составных типов.

Кстати, у логического оператора ЕСТЬ NULL форма отрицания выглядит следующим образом:

Логический оператор ССЫЛКА

Оператор ССЫЛКА позволяет проверить, является ли значение выражения, указанного слева от него, ссылкой на таблицу , указанную справа.

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

05

Как вы помните, эту же задачу мы могли бы решить используя ТИПЗНАЧЕНИЯ и ТИП:

Функция ЕСТЬNULL

Функция предназначена для замены значения NULL на другое значение.

Мы помним, что значение NULL возвращается в том случае, если запрашиваемый реквизит (поле, свойство) не существует.

Как например, реквизит ОтличительныйПризнак для групп справочника Города:

06

Функция ЕСТЬNULL поможет нам вывести другое значение в том случае, если это значение равно NULL. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Пусть в данном случае это будет строка "Такого реквизита нет!":

08

Получается, что если первый параметр функции ЕСТЬNULL не равен NULL, то возвращается он. Если же он равен NULL, то возвращается второй параметр.

Функция ВЫРАЗИТЬ

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

Как мы помним, составные поля могут быть одного из нескольких типов, указанных в конфигураторе.

Для поля ОтличительныйПризнак такими допустимыми типами являются СТРОКА, Справочник.Цвета и Справочник.Вкусы.

Иногда возникает необходимость привести значения составного поля к какому-либо определенному типу.

Давайте приведём все значения поля ОтличительныйПризнак к типу Справочник.Цвета:

09

В результате, все значения элементов, которые имели тип Справочник.Цвета, остались заполненными и оказались приведенными к указанному типу. Все значения других типов (СТРОКА, Справочник.Вкусы) теперь стали равны NULL. В этом состоит особенность приведения типа при помощи функции ВЫРАЗИТЬ.

Приводить тип можно или к примитивному типу (БУЛЕВО, ЧИСЛО, СТРОКА, ДАТА) или к ссылочному типу. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Но тип, к которому делается приведение, обязательно должен входить в список типов для данного составного поля, иначе система выдаст ошибку.

Читайте также: