Как в 1С запросом получить всех родителей элемента справочника?

Выбрать родителей элемента запросом 1С

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

Функция ПолучитьРодителейЭлемента(Элемент) Экспорт
	Уровень = Элемент.Уровень();
	Объединить = "";
	Родитель = "";
	Текст = "";
	Для Номер = 1 По Уровень Цикл
		Родитель = Родитель + ".Родитель";
		Если Номер <> 1 Тогда
			Объединить = "
			|	
			|	ОБЪЕДИНИТЬ ВСЕ
			|";
		КонецЕсли;
		Текст = Текст + Объединить + "
		|ВЫБРАТЬ
		|		Номенклатура" + Родитель + " КАК Родитель
		|	ИЗ
		|		Справочник.Номенклатура КАК Номенклатура
		|	ГДЕ
		|		Номенклатура.Ссылка = &Элемент";
	КонецЦикла;
	Запрос = Новый Запрос;
	Запрос.Текст = "
	|ВЫБРАТЬ
	|	База.Родитель КАК Родитель
	|ИЗ
	|	(" + Текст + ") КАК База";
	Запрос.УстановитьПараметр("Элемент", Элемент);
	РезультатЗапроса = Запрос.Выполнить();
	Выборка = РезультатЗапроса.Выбрать();
	Пока Выборка.Следующий() Цикл
		Сообщит(Выборка.Родитель);
	КонецЦикла;
КонецФункции


Как видите, в этой функции сначала получаем, на каком уровне находится элемент. Теперь, в зависимости от уровня элемента пишем текст запроса. И в конце концов, выводим всех родителей в окно сообщений.

5 ответы
  1. Анастасия says:

    Процедура КнопкаВыполнитьНажатие(Кнопка)
    //ПолеВвода1 – Здесь ссылка на элемент справочника Номенклатура.
    Сообщить(ПолеВвода1);
    Родитель = ПолеВвода1;
    Если НайтиРодителя(Родитель).Пустая() Тогда
    Сообщить(“Родителя нет!”);
    Возврат;
    КонецЕсли;
    Пока НЕ НайтиРодителя(Родитель).Пустая() Цикл
    Род = НайтиРодителя(Родитель);
    Сообщить(Род);
    Родитель=Род;
    КонецЦикла;
    КонецПроцедуры

    Функция НайтиРодителя(СсылкаНом)
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | Номенклатура.Родитель
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.Ссылка = &Ссылка”;
    Запрос.УстановитьПараметр(“Ссылка”,СсылкаНом);
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    Возврат Выборка.Родитель;
    КонецФункции;

    Ответить
    • softmaker
      softmaker says:

      Спасибо, Анастасия! Но одна большая проблема этого алгоритма: запрос в цикле.

      Ответить
  2. Julia says:

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

    Ответить
  3. SERVODROIDRU says:

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

    Ответить

Ответить

Want to join the discussion?
Feel free to contribute!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *