Слушатель курса Разработка и оптимизация запросов в 1С:Предприятие 8.3 столкнулся с трудностями при обращении к конкретному объекту непосредственно в запросе. С аналогичной задачей может столкнуться каждый, поэтому мы решили опубликовать вопрос слушателя и ответ тренера из Мастер-группы курса.
Вопрос
В самом начале курса было показано, как найти объект на встроенном языке, например, НайтиПоНаименованию или НайтиПоКоду и передать его в запрос через параметр. А можно ли обратиться к объекту прямо в запросе, не используя параметр. Например, найти номенклатуру, зная её точное название или артикул?
Ответ тренера
Искать по произвольному реквизиту в запросе тоже можно, сравнивая значение этого реквизита с примитивными типами. Разумеется, значение реквизита так же должно иметь примитивный тип.
Выборка номенклатуры по конкретному значению артикула:
ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Артикул = "Арт1234"
Если значение реквизита не является примитивным типом, требуется через точку перейти на следующий уровень детализации.
То есть, чтобы выбрать номенклатуру с единицей измерения “штука”, нельзя написать
Номенклатура.ЕдиницаИзмерения = "Шт"
Правильным будет следующее условие:
Номенклатура.ЕдиницаИзмерения.Наименование = "Шт".
P.S.
Понимать, как работают запросы и уметь их строить — обязательный навык для всех, кто дорабатывает и внедряет 1С.
После курса Вы сможете:
- Строить сложные запросы с несколькими источниками данных
- Уверенно задействовать вложенные запросы и временные таблицы
- Использовать встроенный язык для обработки результатов запроса
- Учитывать особенности соединений и объединений нескольких таблиц.
- Разрабатывать запросы на уровне задач Аттестации 1С:Специалист по платформе.
- Как создать элемент (группу) справочника?
- Как найти элемент справочника?
- Как удалить элемент справочника?
- Как перебрать элементы справочника?
- Как выбрать все элементы из определенной группы?
- Как перебрать элементы подчиненного справочника с помощью запроса?
- Как перебрать элементы подчиненного справочника с помощью выборки справочника?
- Как открыть форму списка (элемента) справочника?
- Как добавить запись в табличную часть элемента справочника?
- Как удалить строки из табличной части справочника?
- Как перебрать строки табличной части справочника?
- Как создать элемент в нужной группе?
- Как узнать, есть ли у текущего элемента подчиненные?
- Как узнать количество подчиненных элементов у выбранного элемента справочника?
- Как узнать количество подчиненных элементов у выбранного элемента справочника, если подчиненных справочников нексолько?
- Как получить всех родителей выбранного элемента справочника?
- Как получить запросом «полный» код элементов справочника, если тип кода — Строка?
- Как получить все элементы справочника, содержащие в наименовании определенную подстроку, со всей иерархией, в которую они входят?
- Как найти все элементы справочника, в которых не заполнен строковый реквизит?
- Как перенести все элементы справочника «Контрагенты» из одной группы в другую?
- Как организовать программный выбор элемента справочника?
- Как сохранить фотографию сотрудника в справочнике «Сотрудники»?
Как создать элемент (группу) справочника?
НовыйЭлемент = Справочники.ДокументыУдостоверяющиеЛичность.СоздатьЭлемент(); НовыйЭлемент.Наименование = "военный билет"; // Установить другие реквизиты. // ..... НовыйЭлемент.Записать(); НовыйЭлемент = Справочники.Банки.СоздатьЭлемент(); // Получить ссылку на группу, в которой будет находиться новый элемент Родитель = Справочники.Банки.НайтиПоКоду("000000001"); НовыйЭлемент.Наименование = "АКБ"; НовыйЭлемент.Код = "000000011"; НовыйЭлемент.Родитель = Родитель; // Установить другие реквизиты // ..... НовыйЭлемент.Записать(); НоваяГруппа = Справочники.Номенклатура.СоздатьГруппу(); // Получить ссылку на группу, в которой должна находиться создаваемая группа Родитель = Справочники.Номенклатура.НайтиПоНаименованию("Обувь", Истина); НоваяГруппа.Наименование = "Модельная обувь"; НоваяГруппа.Родитель = Родитель; // Установить другие реквизиты // ..... НоваяГруппа.Записать(); // Создать новый элемент в корне справочника НовыйЭлемент = Справочники.Подразделения.СоздатьЭлемент(); НовыйЭлемент.Наименование = "IT отдел"; НовыйЭлемент.Записать(); // Получить ссылку на родителя для добавляемых элементов Родитель = НовыйЭлемент.Ссылка; // Создать дочерний элемент. НовыйЭлемент = Справочники.Подразделения.СоздатьЭлемент(); НовыйЭлемент.Наименование = "Группа разработки"; НовыйЭлемент.Родитель = Родитель; НовыйЭлемент.Записать();
Как найти элемент справочника?
// Поиск по коду РезультатПоиска = Справочники.Номенклатура.НайтиПоКоду("00030"); Если РезультатПоиска.Пустая() Тогда // Выполнить действия, предусмотренные в случае, когда элемент не найден. КонецЕсли; // Поиск по наименованию РезультатПоиска = Справочники.Номенклатура.НайтиПоНаименованию("Кроссовки"); // Поиск по реквизиту РезультатПоиска = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", "К-120002");
Как удалить элемент справочника?
// Найти ссылки на удаляемый элемент. МассивСсылок = Новый Массив; МассивСсылок.Добавить(СсылкаНаУдаляемыйЭлемент); НайденныеСсылки = НайтиПоСсылкам(МассивСсылок); Если НайденныеСсылки.Количество() > 0 Тогда Сообщить("Нельзя удалять элемент, на него имеются ссылки"); Иначе УдаляемыйЭлемент = СсылкаНаУдаляемыйЭлемент.ПолучитьОбъект(); УдаляемыйЭлемент.Удалить(); КонецЕсли; УдаляемыйЭлемент.УстановитьПометкуУдаления(Истина);
Как перебрать элементы справочника?
Выборка = Справочники.Номенклатура.ВыбратьИерархически(); Пока Выборка.Следующий() Цикл Наименование = Выборка.Наименование; // Обращение к другим данным справочника // ..... КонецЦикла; Запрос = Новый Запрос( "ВЫБРАТЬ | Ссылка, | Наименование |ИЗ | Справочник.Номенклатура |АВТОУПОРЯДОЧИВАНИЕ" ); Результат = Запрос.Выполнить().Выбрать(); Пока Результат.Следующий() Цикл Наименование = Результат.Наименование; КонецЦикла;
Как выбрать все элементы из определенной группы?
Выборка = Справочники.Номенклатура.Выбрать(ПолеВводаРодитель); Пока Выборка.Следующий() Цикл Наименование = Выборка.Наименование; КонецЦикла; Запрос = Новый Запрос( "ВЫБРАТЬ | Ссылка, | Наименование |ИЗ | Справочник.Номенклатура |ГДЕ | Родитель = &Родитель |АВТОУПОРЯДОЧИВАНИЕ" ); Запрос.УстановитьПараметр("Родитель", ПолеВводаРодитель); Результат = Запрос.Выполнить().Выбрать(); Пока Результат.Следующий() Цикл Наименование = Результат.Наименование; КонецЦикла; Выборка=Справочники.Номенклатура.ВыбратьИерархически(ПолеВводаРодитель); Пока Выборка.Следующий() Цикл Наименование = Выборка.Наименование; КонецЦикла; Запрос = Новый Запрос( "ВЫБРАТЬ | Ссылка, | Наименование |ИЗ | Справочник.Номенклатура |ГДЕ | Родитель В ИЕРАРХИИ(&Родитель) |АВТОУПОРЯДОЧИВАНИЕ" ); Запрос.УстановитьПараметр("Родитель", ПолеВводаРодитель); Результат = Запрос.Выполнить().Выбрать(); Пока Результат.Следующий() Цикл Наименование = Результат.Наименование; КонецЦикла;
Как перебрать элементы подчиненного справочника с помощью запроса?
Процедура ПереборПодчиненыхЭлементов(Контрагент) Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | КонтактныеЛица.Ссылка |ИЗ | Справочник.КонтактныеЛица КАК КонтактныеЛица |ГДЕ | КонтактныеЛица.Владелец = &Владелец"; Запрос.УстановитьПараметр("Владелец", Контрагент); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл ОчереднойПодчиненый = Выборка.Ссылка; КонецЦикла; КонецПроцедуры
Как перебрать элементы подчиненного справочника с помощью выборки справочника?
Процедура ПереборПодчиненыхЭлементов(Контрагент) // Получить выборку по указанному контрагенту Выборка = Справочники.КонтактныеЛица.Выбрать( , Контрагент); Пока Выборка.Следующий() Цикл ОчереднойПодчиненый = Выборка.Ссылка; КонецЦикла; КонецПроцедуры
Как открыть форму списка (элемента) справочника?
Форма = Справочники.Номенклатура.ПолучитьФормуСписка(); Форма.Открыть(); Элемент = Справочники.Номенклатура.НайтиПоКоду("00070"); Форма = Элемент.ПолучитьФорму(); Форма.Открыть();
Как добавить запись в табличную часть элемента справочника?
ЭлементОбъект = СсылкаКонтрагент.ПолучитьОбъект(); НоваяСтрока = ЭлементОбъект.ВидыДеятельности.Добавить(); // Заполнить реквизиты НоваяСтрока.ВидДеятельности = ПолеВводаВидДеятельности; // ..... ЭлементОбъект.Записать();
Как удалить строки из табличной части справочника?
ЭлементСправочника = Справочники.Контрагенты.НайтиПоКоду("Ю0006"); ОбъектСправочника = ЭлементСправочника.ПолучитьОбъект(); ОбъектСправочника.ВидыДеятельности.Очистить(); ОбъектСправочника.Записать(); ОбъектСправочника = ВыбранныйЭлемент.ПолучитьОбъект(); // Создать структуру для отбора удаляемых строк СтруктураОтбора = Новый Структура("ВидДеятельности", ВыбранныйВидДеятельности); // Получить массив удаляемых строк ПодходящиеСтроки = ОбъектСправочника.ВидыДеятельности.НайтиСтроки(СтруктураОтбора); // Удалить строки Для Каждого ОчереднаяСтрока Из ПодходящиеСтроки Цикл ОбъектСправочника.ВидыДеятельности.Удалить(ОчереднаяСтрока); КонецЦикла; ОбъектСправочника.Записать();
Как перебрать строки табличной части справочника?
ЭлементСправочника = Справочники.Контрагенты.НайтиПоКоду("Ю0006"); Для Каждого ТекущаяСтрока Из ЭлементСправочника.ВидыДеятельности Цикл Сообщить(ТекущаяСтрока.ВидДеятельности); КонецЦикла;
Как создать элемент в нужной группе?
КодГруппы = "330100"; ПоискПоПолномуКоду = Ложь; // значение по умолчанию Группа = Справочники.Номенклатура.НайтиПоКоду(КодГруппы, ПоискПоПолномуКоду); Если Группа.Пустая() Тогда Группа = Справочники.Номенклатура.СоздатьГруппу(); Группа.Код = КодГруппы; Группа.Наименование = "Загруженные"; Группа.Записать(); ИначеЕсли НЕ Группа.ЭтоГруппа Тогда Сообщить("Найден элемент справочника с указанным кодом!"); // Предусмотреть прерывание алгоритма... КонецЕсли; Спр = Справочники.Номенклатура.СоздатьЭлемент(); Спр.Наименование = "Программно созданный"; // Реквизиты заполняются в соответствии с задачей // ..... Спр.Родитель = Группа.Ссылка; Спр.Записать(); Группа = Справочники.Номенклатура.Загруженные; КодЭлемента = "330100"; ПоискПоПолномуКоду = Ложь; // Значение по умолчанию Родитель = Справочники.Номенклатура.НайтиПоКоду(КодЭлемента, ПоискПоПолномуКоду); Если Родитель.Пустая() Тогда Родитель = Справочники.Номенклатура.СоздатьЭлемент(); Родитель.Код = КодЭлемента; Родитель.Наименование = "Загруженные"; Родитель.Записать(); КонецЕсли; Спр = Справочники.Номенклатура.СоздатьЭлемент(); Спр.Наименование = "Программно созданный"; // Реквизиты заполняются в соответствии с задачей // ..... Спр.Родитель = Родитель.Ссылка; Спр.Записать();
Как узнать, есть ли у текущего элемента подчиненные?
Выборка = Справочники.Номенклатура.Выбрать( , Владелец); Если Выборка.Следующий() = Истина Тогда // Есть подчиненные элементы. КонецЕсли; Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | ЕдиницыИзмерения.Ссылка |ИЗ | Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения |ГДЕ | ЕдиницыИзмерения.Владелец = &Владелец"; Запрос.УстановитьПараметр("Владелец", Владелец); Если НЕ Запрос.Выполнить().Пустой() Тогда // Есть подчиненные элементы! КонецЕсли;
Как узнать количество подчиненных элементов у выбранного элемента справочника?
Выборка = Справочники.ЕдиницыИзмерения.Выбрать( , Владелец); КоличествоЭлементов = 0; Пока Выборка.Следующий() Цикл КоличествоЭлементов = КоличествоЭлементов + 1; КонецЦикла; Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | КОЛИЧЕСТВО(*) КАК КоличествоЗаписей |ИЗ | Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения |ГДЕ | ЕдиницыИзмерения.Владелец = &Владелец"; Запрос.УстановитьПараметр("Владелец", Владелец); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда КоличествоЗаписей = Выборка.КоличествоЗаписей; КонецЕсли;
Как узнать количество подчиненных элементов у выбранного элемента справочника, если подчиненных справочников несколько?
ВЫБРАТЬ СУММА(КоличествоПодчиненных) КАК КоличествоПодчиненныхЭлементов ИЗ (ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК КоличествоПодчиненных ИЗ Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения ГДЕ ЕдиницыИзмерения.Владелец = &Владелец ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ Справочник.СерииНоменклатуры КАК СерииНоменклатуры ГДЕ СерииНоменклатуры.Владелец = &Владелец ) КАК ВложенныйЗапрос
Как получить всех родителей выбранного элемента справочника?
МассивРодителей = Новый Массив; Родитель = СсылкаНаЭлемент.Родитель; Пока НЕ Родитель.Пустая() Цикл МассивРодителей.Добавить(Родитель); Родитель = Родитель.Родитель; КонецЦикла; Для Каждого ТекущийРодитель Из МассивРодителей Цикл // Работа с текущим родителем КонецЦикла;
ВЫБРАТЬ Номенклатура.Ссылка КАК Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Ссылка = &Ссылка ИТОГИ ПО Ссылка ТОЛЬКО ИЕРАРХИЯ
ТекущийЭлементНоменклатуры = ЭлементНоменклатура; Запрос = Новый Запрос( "ВЫБРАТЬ | Номенклатура.Родитель, | Номенклатура.Родитель.Родитель, | Номенклатура.Родитель.Родитель.Родитель, | Номенклатура.Родитель.Родитель.Родитель.Родитель, | Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Ссылка = &ТекущийЭлементНоменклатуры"; Пока Истина Цикл Запрос.УстановитьПараметр("ТекущийЭлементНоменклатуры", ТекущийЭлементНоменклатуры); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Прервать; КонецЕсли; Выборка = Результат.Выбрать(); Выборка.Следующий(); Для НомерКолонки = 0 По Результат.Колонки.Количество() - 1 Цикл ТекущийЭлементНоменклатуры = Выборка[НомерКолонки]; Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда Прервать; Иначе Сообщить(ТекущийЭлементНоменклатуры); КонецЕсли; КонецЦикла; Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда Прервать; КонецЕсли; КонецЦикла;
Как получить запросом «полный» код элементов справочника, если тип кода — Строка?
ВЫБРАТЬ Контрагенты.Ссылка, ВЫБОР КОГДА (Контрагенты.Родитель.Код ЕСТЬ NULL ) ТОГДА Контрагенты.Код КОГДА (Контрагенты.Родитель.Родитель.Код ЕСТЬ NULL ) ТОГДА Контрагенты.Родитель.Код + "/" + Контрагенты.Код ИНАЧЕ Контрагенты.Родитель.Родитель.Код + "/" + Контрагенты.Родитель.Код + "/" + Контрагенты.Код КОНЕЦ КАК ПолныйКод ИЗ Справочник.Контрагенты КАК Контрагенты
Как получить все элементы справочника, содержащие в наименовании определенную подстроку, со всей иерархией, в которую они входят?
Запрос = Новый Запрос( "ВЫБРАТЬ | Контрагенты.Ссылка КАК Ссылка |ИЗ | Справочник.Контрагенты КАК Контрагенты |ГДЕ | (Контрагенты.Наименование ПОДОБНО &ЧастьНаименования) И (НЕ Контрагенты.ЭтоГруппа) |ИТОГИ ПО | Ссылка ТОЛЬКО ИЕРАРХИЯ" ); Запрос.УстановитьПараметр("ЧастьНаименования", "%" + ПолеВводаПодстрока + "%");
Как найти все элементы справочника, в которых не заполнен строковый реквизит?
ВЫБРАТЬ ФизическиеЛица.Ссылка ИЗ Справочник.ФизическиеЛица КАК ФизическиеЛица ГДЕ (ФизическиеЛица.ИНН = "") ВЫБРАТЬ ФизическиеЛица.Ссылка ИЗ Справочник.ФизическиеЛица КАК ФизическиеЛица ГДЕ (ФизическиеЛица.СтраховойНомерПФР = "") ИЛИ (ФизическиеЛица.СтраховойНомерПФР = " - -")
Как перенести все элементы справочника «Контрагенты» из одной группы в другую?
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Контрагенты.Ссылка |ИЗ | Справочник.Контрагенты КАК Контрагенты |ГДЕ | Контрагенты.Родитель = &СтарыйРодитель"; Запрос.УстановитьПараметр("СтарыйРодитель", СтарыйРодитель); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Контрагент = Выборка.Ссылка.ПолучитьОбъект(); Контрагент.Родитель = НовыйРодитель; Контрагент.Записать(); КонецЦикла;
Как организовать программный выбор элемента справочника?
// Получить форму выбора справочника как подчиненную форме документа ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора( , ЭтаФорма); // Открыть полученную форму ФормаВыбора.Открыть(); Процедура ОбработкаВыбора(ЗначениеВыбора, Источник) ПолученноеЗначение = ЗначениеВыбора; // Дальнейшая обработка значения... КонецПроцедуры ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора( , ЭтаФорма); Выбрано = ФормаВыбора.ОткрытьМодально(); Процедура ПолеВводаНачалоВыбора(Элемент, СтандартнаяОбработка) // Запретить стандартную обработку. СтандартнаяОбработка = Ложь; // Получить форму выбора справочника как подчиненную полю ввода ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора( , Элемент); // Открыть полученную форму ФормаВыбора.Открыть(); КонецПроцедуры Процедура ПолеВводаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) // Отключить стандартную обработку (при необходимости) СтандартнаяОбработка = Ложь; ПолученноеЗначение = ВыбранноеЗначение; // Дальнейшая обработка значения... КонецПроцедуры
Как сохранить фотографию сотрудника в справочнике «Сотрудники»?
Процедура ЗагрузитьФотографию(Элемент) Режим = РежимДиалогаВыбораФайла.Открытие; ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); ДиалогОткрытияФайла.ПолноеИмяФайла = ""; Фильтр = "Текст (*,*)|*.*"; ДиалогОткрытияФайла.Фильтр = Фильтр; ДиалогОткрытияФайла.МножественныйВыбор = Ложь; ДиалогОткрытияФайла.Заголовок = "Выберите картинку"; Если ДиалогОткрытияФайла.Выбрать() Тогда ВыбраннаяКартинка = Новый Картинка(ДиалогОткрытияФайла.ПолноеИмяФайла); ЭлементХранилища = Новый ХранилищеЗначения(ВыбраннаяКартинка); Фотография = ЭлементХранилища; КонецЕсли; КонецПроцедуры ВыбФайл = Новый ДвоичныеДанные(ДиалогОткрытияФайла.ПолноеИмяФайла); элХранилища = Новый ХранилищеЗначения(ВыбФайл); Фотография = элХранилища;
- Как получить данные из табличной части документов?
- Как получить данные из табличной части документов и представить их в иерархическом виде?
- Как подсчитать количество одинаковых элементов в выбираемых данных?
- Как применять условия для отбора по значениям полей, вычисленных как результат агрегатной функции?
- Как ограничить выборку из виртуальной таблицы?
- Как просуммировать данные по одинаковым значениям одного из полей выборки?
- Как получить только те записи, в которых значение определенного поля превышает указанное значение?
- Как обратиться к подчиненным полям в запросе?
- Как объединить результаты нескольких запросов?
- Как выбрать данные из двух таблиц, удовлетворяющие определенному условию?
- Как дополнить данные одной таблицы данными, выбранными из другой таблицы по определенному условию?
- Как объединить данные из двух таблиц по определенному условию?
- Как вывести некоторое значение вместо NULL в запросе?
- Как вместе с данными некоторой таблицы получить общие итоги из этой же таблицы?
- Как получить иерархические итоги по группе справочника?
- Как по состоянию на заданную дату по регистру «ОстаткиНаСкладе» найти последний документ «ПоступлениеТоваровУслуг», по которому приходила номенклатура
- Как подсчитать количество записей с одинаковым значением некоторого поля?
- Как в итоговых записях вывести количество различных записей?
- Как узнать количество записей в результате запроса?
- Как проверить достаточность остатков товаров на складах, указанных в документе?
- Как в запросе осуществить отбор по значению перечисления?
- Как получить курсы валют на две интересующие даты?
- Как одним запросом получить таблицу расхождений курсов взаиморасчетов всех выписанных документов «ЗаказПокупателя» с официальным курсом?
- Как написать запрос таким образом, чтобы на определенном уровне иерархии запроса считались одни итоговые функции, а на другом уровне другие?
- Как получить перечень документов, приведших данные подчиненного периодического регистра сведений к определенному состоянию?
- Как установить параметры запроса, если текст запроса заранее не известен?
Как получить данные из табличной части документов?
ВЫБРАТЬ РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
Как получить данные из табличной части документов и представить их в иерархическом виде?
ВЫБРАТЬ РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары ИТОГИ ПО Номенклатура ТОЛЬКО ИЕРАРХИЯ
Как подсчитать количество одинаковых элементов в выбираемых данных?
ВЫБРАТЬ РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура, СУММА(РеализацияТоваровУслугТовары.Количество) КАК Количество ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары СГРУППИРОВАТЬ ПО РеализацияТоваровУслугТовары.Номенклатура
Как применять условия для отбора по значениям полей, вычисленных как результат агрегатной функции?
ВЫБРАТЬ РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура, СУММА(РеализацияТоваровУслугТовары.Количество) КАК Количество ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары СГРУППИРОВАТЬ ПО РеализацияТоваровУслугТовары.Номенклатура ИМЕЮЩИЕ СУММА(РеализацияТоваровУслугТовары.Количество) > 10
Как ограничить выборку из виртуальной таблицы?
ВЫБРАТЬ ПродажиОбороты.Номенклатура КАК Номенклатура ИЗ РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон) КАК ПродажиОбороты
Как просуммировать данные по одинаковым значениям одного из полей выборки?
ВЫБРАТЬ ПродажиОбороты.Подразделение КАК Подразделение, ПродажиОбороты.Номенклатура КАК Номенклатура, ПродажиОбороты.КоличествоОборот, ПродажиОбороты.СтоимостьОборот КАК СтоимостьОборот ИЗ РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон) КАК ПродажиОбороты ИТОГИ СУММА(СтоимостьОборот) ПО Подразделение
Как получить только те записи, в которых значение определенного поля превышает указанное значение?
ВЫБРАТЬ ПродажиОбороты.Подразделение КАК Подразделение, ПродажиОбороты.Номенклатура КАК Номенклатура, ПродажиОбороты.КоличествоОборот, ПродажиОбороты.СтоимостьОборот КАК СтоимостьОборот ИЗ РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон, , Подразделение = &Подразделение) КАК ПродажиОбороты ГДЕ ПродажиОбороты.КоличествоОборот > &Порог
Как обратиться к подчиненным полям в запросе?
ВЫБРАТЬ ПродажиОбороты.ДоговорКонтрагента.Владелец, ПродажиОбороты.КоличествоОборот, ПродажиОбороты.СтоимостьОборот КАК СтоимостьОборот ИЗ РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон) КАК ПродажиОбороты // Этим запросом посчитаем обороты за период по контрагентам ВЫБРАТЬ ПродажиОбороты.ДоговорКонтрагента.Владелец, СУММА(ПродажиОбороты.КоличествоОборот) КАК КоличествоОборот, СУММА(ПродажиОбороты.СтоимостьОборот) КАК СтоимостьОборот ИЗ РегистрНакопления.Продажи.Обороты((&ДатаНач, &ДатаКон) КАК ПродажиОбороты СГРУППИРОВАТЬ ПО ПродажиОбороты.ДоговорКонтрагента.Владелец
Как объединить результаты нескольких запросов?
// Одним запросом получим номенклатуру из всех табличных частей документа Реализация товаров, услуг: ВЫБРАТЬ РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары ОБЪЕДИНИТЬ ВЫБРАТЬ РАЗЛИЧНЫЕ РеализацияТоваровУслугВозвратнаяТара.Номенклатура ИЗ Документ.РеализацияТоваровУслуг.ВозвратнаяТара КАК РеализацияТоваровУслугВозвратнаяТара ОБЪЕДИНИТЬ ВЫБРАТЬ РАЗЛИЧНЫЕ РеализацияТоваровУслугУслуги.Номенклатура ИЗ Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
Как выбрать данные из двух таблиц, удовлетворяющие определенному условию?
ВЫБРАТЬ ЗаказыПокупателейОстатки.Номенклатура, ЗаказыПокупателейОстатки.КоличествоОстаток КАК ЗаказаноПокупателями, ЗаказыПоставщикамОстатки.КоличествоОстаток КАК ЗаказаноПоставщикам ИЗ РегистрНакопления.ЗаказыПокупателей.Остатки(&ДатаОтч) КАК ЗаказыПокупателейОстатки ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПоставщикам.Остатки(&ДатаОтч) КАК ЗаказыПоставщикамОстатки ПО ЗаказыПокупателейОстатки.Номенклатура = ЗаказыПоставщикамОстатки.Номенклатура
Как дополнить данные одной таблицы данными, выбранными из другой таблицы по определенному условию?
ВЫБРАТЬ ЗаказыПокупателейОстатки.Номенклатура, ЗаказыПокупателейОстатки.КоличествоОстаток КАК ЗаказаноПокупателями, ЗаказыПоставщикамОстатки.КоличествоОстаток КАК ЗаказаноПоставщикам ИЗ РегистрНакопления.ЗаказыПокупателей.Остатки(&ДатаОтч) КАК ЗаказыПокупателейОстатки ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПоставщикам.Остатки(&ДатаОтч) КАК ЗаказыПоставщикамОстатки ПО ЗаказыПокупателейОстатки.Номенклатура = ЗаказыПоставщикамОстатки.Номенклатура
Как объединить данные из двух таблиц по определенному условию?
// Получим список номенклатуры с количеством, заказанным покупателям и поставщикам // через полное соединение по условию: ВЫБРАТЬ ВЫБОР КОГДА (ЗаказыПокупателейОстатки.Номенклатура) ЕСТЬ NULL ТОГДА ЗаказыПоставщикамОстатки.Номенклатура ИНАЧЕ ЗаказыПокупателейОстатки.Номенклатура КОНЕЦ КАК Номенклатура, ЗаказыПокупателейОстатки.КоличествоОстаток КАК ЗаказаноПокупателями, ЗаказыПоставщикамОстатки.КоличествоОстаток КАК ЗаказаноПоставщикам ИЗ РегистрНакопления.ЗаказыПокупателей.Остатки(&ДатаОтч) КАК ЗаказыПокупателейОстатки ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПоставщикам.Остатки(&ДатаОтч) КАК ЗаказыПоставщикамОстатки ПО ЗаказыПокупателейОстатки.Номенклатура = ЗаказыПоставщикамОстатки.Номенклатура //2 вариант ВЫБРАТЬ ВложенныйЗапрос.Номенклатура, СУММА(ВложенныйЗапрос.ЗаказаноПокупателями) КАК ЗаказаноПокупателями, СУММА(ВложенныйЗапрос.ЗаказаноПоставщикам) КАК ЗаказаноПоставщикам ИЗ (ВЫБРАТЬ ЗаказыПокупателейОстатки.Номенклатура КАК Номенклатура, ЗаказыПокупателейОстатки.КоличествоОстаток КАК ЗаказаноПокупателями, 0 КАК ЗаказаноПоставщикам ИЗ РегистрНакопления.ЗаказыПокупателей.Остатки(&ДатаОтч, ) КАК ЗаказыПокупателейОстатки ОБЪЕДИНИТЬ ВЫБРАТЬ ЗаказыПоставщикамОстатки.Номенклатура, 0, ЗаказыПоставщикамОстатки.КоличествоОстаток ИЗ РегистрНакопления.ЗаказыПоставщикам.Остатки(&ДатаОтч, ) КАК ЗаказыПоставщикамОстатки ) КАК ВложенныйЗапрос СГРУППИРОВАТЬ ПО ВложенныйЗапрос.Номенклатура
Как вывести некоторое значение вместо NULL в запросе?
ВЫБРАТЬ ЕСТЬNULL(Справочник.Номенклатура.Артикул, "---") КАК Артикул, Справочник.Номенклатура.Представление КАК Номенклатура
Как вместе с данными некоторой таблицы получить общие итоги из этой же таблицы?
ВЫБРАТЬ ПродажиОбороты.Номенклатура КАК Номенклатура, ПродажиОбороты.СуммаОборот КАК СуммаПродаж, ПродажиОбороты.СуммаОборот / СовокупныеОбороты.СуммаОборот * 100 КАК ПроцентнаяДоля ИЗ РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон) КАК ПродажиОбороты ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон) КАК СовокупныеОбороты ПО ИСТИНА УПОРЯДОЧИТЬ ПО ПроцентнаяДоля УБЫВ
Как получить иерархические итоги по группе справочника?
ВЫБРАТЬ ТоварыГруппы.Ссылка КАК Номенклатура, ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток ИЗ (ВЫБРАТЬ Номенклатура.Ссылка КАК Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Родитель В ИЕРАРХИИ(&Группа) И (Номенклатура.ЭтоГруппа = ЛОЖЬ) ) КАК ТоварыГруппы ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&МоментПолучения, Номенклатура В ИЕРАРХИИ (&Группа)) КАК ТоварыНаСкладахОстатки ПО ТоварыГруппы.Ссылка = ТоварыНаСкладахОстатки.Номенклатура ИТОГИ СУММА(КоличествоОстаток) ПО Номенклатура ТОЛЬКО ИЕРАРХИЯ
Как по состоянию на заданную дату по регистру «ОстаткиНаСкладе» найти последний документ «ПоступлениеТоваровУслуг», по которому приходила номенклатура
ВЫБРАТЬ ВложенныйЗапрос.Номенклатура, МАКСИМУМ(ТоварыНаСкладах.Регистратор) КАК Регистратор ИЗ (ВЫБРАТЬ ТоварыНаСкладах.Номенклатура КАК Номенклатура, МАКСИМУМ(ТоварыНаСкладах.Период) КАК Период ИЗ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах ГДЕ ТоварыНаСкладах.Период <= &ДатаОтчета И (ТоварыНаСкладах.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг) СГРУППИРОВАТЬ ПО ТоварыНаСкладах.Номенклатура ) КАК ВложенныйЗапрос ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах ПО ВложенныйЗапрос.Номенклатура = ТоварыНаСкладах.Номенклатура И ВложенныйЗапрос.Период = ТоварыНаСкладах.Период ГДЕ (ТоварыНаСкладах.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг) СГРУППИРОВАТЬ ПО ВложенныйЗапрос.Номенклатура
Как подсчитать количество записей с одинаковым значением некоторого поля?
ВЫБРАТЬ Контрагенты.ОсновнойМенеджерПокупателя, КОЛИЧЕСТВО(Контрагенты.Ссылка) КАК КоличествоЗакрепленных ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ (Контрагенты.ЭтоГруппа = ЛОЖЬ) И (Контрагенты.ОсновнойМенеджерПокупателя <> &НеЗаполненМенеджер) СГРУППИРОВАТЬ ПО Контрагенты.ОсновнойМенеджерПокупателя УПОРЯДОЧИТЬ ПО КоличествоЗакрепленных УБЫВ
Как в итоговых записях вывести количество различных записей?
ВЫБРАТЬ Контрагенты.ОсновнойМенеджерПокупателя.Представление КАК ОсновнойМенеджерПокупателя, Контрагенты.Представление, 1 КАК КоличествоЗакрепленных ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ (Контрагенты.ЭтоГруппа = ЛОЖЬ) УПОРЯДОЧИТЬ ПО КоличествоЗакрепленных УБЫВ ИТОГИ КОЛИЧЕСТВО(КоличествоЗакрепленных) ПО ОсновнойМенеджерПокупателя
Как узнать количество записей в результате запроса?
Результат = Запрос.Выполнить(); КолЗаписей = Результат.Выбрать().Количество();
Как проверить достаточность остатков товаров на складах, указанных в документе?
ВЫБРАТЬ ВложенныйЗапрос.Номенклатура, ВложенныйЗапрос.Размещение КАК Склад, ВложенныйЗапрос.КоличествоСписываемое, ТоварыНаСкладахОстатки.КоличествоОстаток ИЗ (ВЫБРАТЬ ВнутреннийЗаказТовары.Номенклатура КАК Номенклатура, ВнутреннийЗаказТовары.Размещение КАК Размещение, СУММА(ВнутреннийЗаказТовары.Количество *ВнутреннийЗаказТовары.Коэффициент) КАК КоличествоСписываемое ИЗ Документ.ВнутреннийЗаказ.Товары КАК ВнутреннийЗаказТовары ГДЕ ВнутреннийЗаказТовары.Ссылка = &Ссылка СГРУППИРОВАТЬ ПО ВнутреннийЗаказТовары.Номенклатура, ВнутреннийЗаказТовары.Размещение ) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&МоментВремениДокумента, Склад В (ВЫБРАТЬ РАЗЛИЧНЫЕ ВЫРАЗИТЬ(ВнутреннийЗаказТоварыДляОтбора.Размещение КАК Справочник.Склады) ИЗ Документ.ВнутреннийЗаказ.Товары КАК ВнутреннийЗаказТоварыДляОтбора ГДЕ ВнутреннийЗаказТоварыДляОтбора.Ссылка = &Ссылка И НЕ ВЫРАЗИТЬ(ВнутреннийЗаказТоварыДляОтбора.Размещение КАК Справочник.Склады) ЕСТЬ NULL ) И Номенклатура В (ВЫБРАТЬ РАЗЛИЧНЫЕ ВнутреннийЗаказТоварыДляОтбора.Номенклатура ИЗ Документ.ВнутреннийЗаказ.Товары КАК ВнутреннийЗаказТоварыДляОтбора ГДЕ ВнутреннийЗаказТоварыДляОтбора.Ссылка = &Ссылка)) КАК ТоварыНаСкладахОстатки ПО ВложенныйЗапрос.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура И ВложенныйЗапрос.Размещение = ТоварыНаСкладахОстатки.Склад
Как в запросе осуществить отбор по значению перечисления?
Запрос.Текст = "ВЫБРАТЬ | ВоинскийУчетСрезПоследних.Физлицо |ИЗ | РегистрСведений.ВоинскийУчет.СрезПоследних(&ДатаОтчета) КАК ВоинскийУчетСрезПоследних |ГДЕ | ВоинскийУчетСрезПоследних.ОтношениеКВоинскомуУчету = Значение(Перечисление.ОтношениеКВоинскомуУчету.Состоит)"; Запрос.УстановитьПараметр("ДатаОтчета", ДатаОтчета);
Как получить курсы валют на две интересующие даты?
ВЫБРАТЬ ВалютыСрезПоследних.Валюта, ВалютыСрезПоследних.Курс, &ПерваяДата Как Дата ИЗ РегистрСведений.Валюты.СрезПоследних(&ПерваяДата, ) КАК ВалютыСрезПоследних ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВалютыСрезПоследних.Валюта, ВалютыСрезПоследних.Курс, &ВтораяДата ИЗ РегистрСведений.Валюты.СрезПоследних(&ВтораяДата, ) КАК ВалютыСрезПоследних
Как одним запросом получить таблицу расхождений курсов взаиморасчетов всех выписанных документов «ЗаказПокупателя» с официальным курсом?
ВЫБРАТЬ ВложенныйЗапрос.Ссылка КАК Документ, ВложенныйЗапрос.ДоговорКонтрагентаВалютаВзаиморасчетов КАК ВалютаДоговора, ВложенныйЗапрос.КурсВзаиморасчетов, ВЫБОР КОГДА КурсыВалют.Курс ЕСТЬ NULL ТОГДА 0 ИНАЧЕ КурсыВалют.Курс КОНЕЦ КАК КурсОфициальный, ВЫБОР КОГДА КурсыВалют.Курс ЕСТЬ NULL ТОГДА ВложенныйЗапрос.КурсВзаиморасчетов ИНАЧЕ ВложенныйЗапрос.КурсВзаиморасчетов - КурсыВалют.Курс КОНЕЦ КАК Превышение ИЗ (ВЫБРАТЬ ЗаказПокупателя.Ссылка КАК Ссылка, МАКСИМУМ(КурсыВалют.Период) КАК Период, ЗаказПокупателя.КурсВзаиморасчетов КАК КурсВзаиморасчетов, ЗаказПокупателя.ДоговорКонтрагента.ВалютаВзаиморасчетов КАК ДоговорКонтрагентаВалютаВзаиморасчетов ИЗ Документ.ЗаказПокупателя КАК ЗаказПокупателя ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют ПО ЗаказПокупателя.ДоговорКонтрагента.ВалютаВзаиморасчетов = КурсыВалют.Валюта И ЗаказПокупателя.Дата >= КурсыВалют.Период СГРУППИРОВАТЬ ПО ЗаказПокупателя.КурсВзаиморасчетов, ЗаказПокупателя.ДоговорКонтрагента.ВалютаВзаиморасчетов, ЗаказПокупателя.Ссылка ) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют ПО ВложенныйЗапрос.ДоговорКонтрагентаВалютаВзаиморасчетов = КурсыВалют.Валюта И ВложенныйЗапрос.Период = КурсыВалют.Период
Как написать запрос таким образом, чтобы на определенном уровне иерархии запроса считались одни итоговые функции, а на другом уровне другие?
ВЫБРАТЬ ОстаткиТоваровКомпанииОстатки.Номенклатура КАК Номенклатура, ОстаткиТоваровКомпанииОстатки.Номенклатура.Представление, ОстаткиТоваровКомпанииОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, ОстаткиТоваровКомпанииОстатки.ХарактеристикаНоменклатуры.Представление, ОстаткиТоваровКомпанииОстатки.КоличествоОстаток КАК КоличествоОстаток, NULL как Заказ, 0 КАК Резерв ИЗ РегистрНакопления.ОстаткиТоваровКомпании.Остатки КАК ОстаткиТоваровКомпанииОстатки ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЗаказыПокупателейОстатки.Номенклатура, ЗаказыПокупателейОстатки.Номенклатура.Представление, ЗаказыПокупателейОстатки.ХарактеристикаНоменклатуры, ЗаказыПокупателейОстатки.ХарактеристикаНоменклатуры.Представление, 0, ЗаказыПокупателейОстатки.ЗаказПокупателя, ЗаказыПокупателейОстатки.КоличествоОстаток ИЗ РегистрНакопления.ЗаказыПокупателей.Остатки КАК ЗаказыПокупателейОстатки ИТОГИ СУММА(КоличествоОстаток), СУММА(Резерв) ПО Номенклатура, ХарактеристикаНоменклатуры
Как получить перечень документов, приведших данные подчиненного периодического регистра сведений к определенному состоянию?
ВЫБРАТЬ КандидатыНаРаботу.ФизЛицо КАК ФизЛицо, КандидатыНаРаботу.Регистратор КАК Документ, КандидатыНаРаботу.Статус КАК Статус ИЗ РегистрСведений.КандидатыНаРаботу.СрезПоследних(&ДатаОтчета, ) КАК КандидатыНаРаботуСрезПоследних ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КандидатыНаРаботу КАК КандидатыНаРаботу ПО КандидатыНаРаботуСрезПоследних.ФизЛицо = КандидатыНаРаботу.ФизЛицо ГДЕ КандидатыНаРаботуСрезПоследних.Статус = &Отложен И КандидатыНаРаботу.Период <= &ДатаОтчета УПОРЯДОЧИТЬ ПО КандидатыНаРаботу.ФизЛицо.Наименование, Документ ИТОГИ МАКСИМУМ(Статус) ПО ФизЛицо АВТОУПОРЯДОЧИВАНИЕ
Как установить параметры запроса, если текст запроса заранее не известен?
Запрос = Новый Запрос(" |ВЫБРАТЬ | Номенклатура.Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Ссылка В ИЕРАРХИИ(&ГруппаНоменклатуры)"); // Получить описание параметров запроса. ПараметрыЗапроса = Запрос.НайтиПараметры(); Для Каждого ПараметрЗапроса Из ПараметрыЗапроса Цикл ЗаданноеЗначение = Неопределено; // Открыть диалог ввода значения данного параметра. Если ВвестиЗначение(ЗаданноеЗначение, "Задайте значение параметра " + ПараметрЗапроса.Имя, ПараметрЗапроса.ТипЗначения) Тогда Запрос.УстановитьПараметр(ПараметрЗапроса.Имя, ЗаданноеЗначение); Иначе Возврат; КонецЕсли; КонецЦикла; РезультатЗапроса = Запрос.Выполнить();
0
1С 8.3 : Запрос по вхождению искомой строки в наименования элементов справочника
В данной статье я расскажу вам как быстро найти в справочнике элементы у которых в наименовании присутствует вхождение искомой нами строки:
Текст запроса будет выглядеть так:
Код 1C v 8.х
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.Наименование
|ИЗ
| Справочник.Товары КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНОПараметрСтрокаПоиска";
Запрос.УстановитьПараметр("ПараметрСтрокаПоиска", ПараметрСтрокаПоиска);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
КонецЦикла;
где оператор запроса ПОДРОБНО как раз и будет искать вхождения ПараметрСтрокаПоиска по всем элементам справочника Номенклатура.
Установить значение параметра ПараметрСтрокаПоиска можно командой:
Код 1C v 8.х
РезультатПоиска.Параметры.УстановитьЗначениеПараметра("ПараметрСтрокаПоиска", "%" + СтрокаПоиска + "%");
Подобным образом можно организовать поиск по точному вхождению строки. Такой способ подходит для поиска элемента справочника например по коду. Строка запроса изменится и будет выглядеть так:
|Номенклатура.Наименование ПОДОБНОПараметрСтрокаПоиска
Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если значение выражения удовлетворяет шаблону – результатом оператора будет ИСТИНА, иначе – ЛОЖЬ.
Следующие символы в строке шаблона являются служебными и имеют смысл, отличный от символа строки:
- % (процент): последовательность, содержащая любое количество произвольных символов
- _ (подчеркивание): один произвольный символ
- […] (в квадратных скобках один или несколько символов): любой одиночный символ из перечисленных внутри квадратных скобок. В перечислении могут встречаться диапазоны, например a-z, означающие произвольный символ, входящий в диапазон, включая концы диапазона.
- [^…] (в квадратных скобках значок отрицания, за которым следует один или несколько символов): любой одиночный символ, кроме тех, которые перечислены следом за значком отрицания
На чтение 8 мин Просмотров 1к. Опубликовано 24.10.2020
Содержание
- Получение элементов иерархического справочника, находящихся в подчинении заданной группы
- Проверка наличия подчиненных элементов у элемента справочника
- Получение всех родителей элемента
- Вывод иерархического справочника в отчет
- Получение итогов по иерархии
В данном разделе показаны примеры решения типовых задач при работе с иерархическими справочниками.
Получение элементов иерархического справочника, находящихся в подчинении заданной группы
Для получения подчиненных элементов иерархического справочника в языке запросов предусмотрена конструкция В ИЕРАРХИИ. Пример использования В ИЕРАРХИИ:
ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&Группа)
В данном примере будут получены все записи справочника Номенклатура, находящиеся в группе &Группа, включая ее саму, ее подчиненные группы и элементы, принадлежащие подчиненным группам.
Если же нас интересуют только элементы и группы, находящиеся непосредственно в заданной группе, то такие элементы мы можем получить установив условие на поле Родитель. Пример:
ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Родитель = &Группа
Такой запрос выберет группы и элементы, находящиеся в подчинении группы со ссылкой &Группа.
Проверка наличия подчиненных элементов у элемента справочника
Для проверки наличия подчиненных записей элемента справочника можно пользоваться запросом, аналогичным представленному:
ВЫБРАТЬ ПЕРВЫЕ 1
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Родитель = &Родитель
В данном примере ссылка элемента, для которого необходимо проверить наличие дочерних элементов, записывается в параметр запроса «Родитель». После выполнения такого запроса необходимо проверить результат на пустоту. Если результат не пустой, то подчиненные записи есть. Иначе — нет. Пример:
Если Запрос.Выполнить().Пустой() Тогда
Сообщить(«Зписей нет»);
Иначе
Сообщить(«Записи есть»);
КонецЕсли;
Получение всех родителей элемента
В языке запросов не предусмотрено специальных средств для получения всех родителей элемента. Для выполнения задачи можно воспользоваться иерархическими итогами, однако получение иерархических итогов оптимизировано для построения итогов большого количества записей, и не вполне эффективно для получения родителей одного элемента. Для более эффективного получения всех родительских записей элемента, рекомендуется перебирать в цикле его родителей небольшими порциями. Пример:
Запрос = Новый Запрос(«ВЫБРАТЬ
| Номенклатура.Родитель,
| Номенклатура.Родитель.Родитель,
| Номенклатура.Родитель.Родитель.Родитель,
| Номенклатура.Родитель.Родитель.Родитель.Родитель,
| Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|
|ГДЕ
| Номенклатура.Ссылка = &ТекущийЭлементНоменклатуры»;
Пока Истина Цикл
Запрос.УстановитьПараметр(«ТекущийЭлементНоменклатуры», ТекущийЭлементНоменклатуры);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Прервать;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Для НомерКолонки = 0 По Результат.Колонки.Количество() — 1 Цикл
ТекущийЭлементНоменклатуры = Выборка[НомерКолонки];
Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда
Прервать;
Иначе
Сообщить(ТекущийЭлементНоменклатуры);
КонецЕсли;
КонецЦикла;
Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда
Прервать;
КонецЕсли;
КонецЦикла;
В данном примере в окно служебных сообщений выводятся все родители для ссылки, записанной в переменную ЭлементНоменклатура. В цикле выбирается по 5 родителей ссылки.
Если число уровней в справочнике ограничено и невелико, то возможно получение всех родителей одним запросом без цикла.
Вывод иерархического справочника в отчет
Для вывода иерархического справочника в отчет с сохранением иерархии необходимо пользоваться запросом аналогичным следующему:
ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ
Справочник.Номенклатура КАК Номенклатура
УПОРЯДОЧИТЬ ПО
Наименование ИЕРАРХИЯ
Данный запрос выбирает все записи из справочника и производит упорядочивание по иерархии. Результат будет упорядочен по наименованию, с учетом иерархии.
Для того чтобы группы справочника размещались выше элементов необходимо в данном запросе заменить предложение УПОРЯДОЧИТЬ ПО на следующее:
УПОРЯДОЧИТЬ ПО
Номенклатура.ЭтоГруппа ИЕРАРХИЯ,
Наименование
Результат по-прежнему будет упорядочен по иерархии, однако группы будут располагаться выше элементов.
Возможна также замена предложения УПОРЯДОЧИТЬ ПО на предложение АВТОУПОРЯДОЧИВАНИЕ. В этом случае результат будет упорядочен в соответствии с настройками справочника, т.е. если в справочнике указано, что группы должны располагаться выше элементов, то они будут расположены выше.
Получить иерархическую структуру справочника также возможно и при помощи итогов.
ВЫБРАТЬ
Номенклатура.Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ЗакупочнаяЦена
ИЗ Справочник.Номенклатура КАК Номенклатура
ГДЕ
(Номенклатура.ЭтоГруппа = ЛОЖЬ)
УПОРЯДОЧИТЬ ПО Наименование
ИТОГИ ПО Номенклатура.Ссылка ТОЛЬКО ИЕРАРХИЯ
Получение итогов по иерархии
Для получения итогов по иерархии в запросе необходимо в предложении ИТОГИ ПО указать ключевое слово ИЕРАРХИЯ после указания поля, по которому будет рассчитываться итоги. Пример отчета «Обороты номенклатуры» с получением итогов по иерархии:
ВЫБРАТЬ
УчетНоменклатурыОбороты.Номенклатура КАК Номенклатура,
УчетНоменклатурыОбороты.Номенклатура.Представление,
УчетНоменклатурыОбороты.КоличествоОборот КАК КоличествоОборот
ИЗ
РегистрНакопления.УчетНоменклатуры.Обороты КАК УчетНоменклатурыОбороты
ИТОГИ СУММА(КоличествоОборот) ПО
Номенклатура ИЕРАРХИЯ
В результате данного запроса будут рассчитаны итоги не только для каждой номенклатуры, но и для групп, к которым принадлежит та или иная номенклатура.
В случае, когда не нужны итоги по элементам, а нужны итоги только по группам, нам необходимо использовать в итогах конструкцию ТОЛЬКО ИЕРАРХИЯ. Пример:
ВЫБРАТЬ
УчетНоменклатурыОбороты.Номенклатура КАК Номенклатура,
УчетНоменклатурыОбороты.Номенклатура.Представление,
УчетНоменклатурыОбороты.КоличествоОборот КАК КоличествоОборот
ИЗ
РегистрНакопления.УчетНоменклатуры.Обороты КАК УчетНоменклатурыОбороты
ИТОГИ СУММА(КоличествоОборот) ПО
Номенклатура ТОЛЬКО ИЕРАРХИЯ
В результате данного запроса будут итоговые записи только для групп номенклатуры.
Найти элемент справочника в 1С 8 можно тремя способами:
1) Поиск по коду
Если известен код элемента справочника, и необходимо получить ссылку на него, то можно воспользоваться методом НайтиПоКоду( , , , ) менеджера справочника. В простейшем случае необходимо передать данному методу код элемента справочника и в результате будет получена либо ссылка на элемент справочника, либо пустая ссылка, если элемент с таким кодом не найден. Следует заметить, что если в справочнике присутствует несколько элементов с указанным кодом, то будет возвращен тот, который найден первым.
Описание параметров метода НайтиПоКоду:
- (обязательный). Тип: Число, Строка. Описание: искомый код, строка или число в зависимости от настроек справочника в конфигураторе.
- (необязательный). Тип: Булево. Описание: определяет режим поиска по полному коду, истина — искомый код следует задавать в виде строки, состоящей из последовательности кодов по уровням справочника, разделенных символом “/”. Значение по умолчанию: Ложь.
- (необязательный). Тип: СправочникСсылка. Описание: родитель, в пределах которого нужно выполнять поиск, если не указан, то поиск будет проводиться во всем справочнике.
- (необязательный). Тип: СправочникСсылка. Описание: владелец, в пределах которого нужно выполнять поиск, если не указан, то поиск будет проводиться во всем справочнике.
2) Поиск по наименованию
Если известно наименование элемента справочника и необходимо получить ссылку на него, то можно воспользоваться методом НайтиПоНаименованию( , , , ) менеджера справочника. В простейшем случае необходимо передать данному методу наименование элемента справочника и в результате будет получена либо ссылка на элемент справочника, либо пустая ссылка, если элемент с таким наименованием не найден. Следует заметить, что если в справочнике присутствует несколько элементов с указанным наименованием, то будет возвращен тот, который найден первым.
Описание параметров метода НайтиПоНаименованию:
- (обязательный). Тип: Строка. Описание: строка, содержащая искомое наименование.
- ТочноеСоответствие> (необязательный). Тип: Булево. Описание: определяет режим поиска по полному соответствию, поиск будет успешным, если строка поиска: в случае значения параметра Ложь — будет соответствовать левой части наименования, в случае значения параметра Истина — будет полностью совпадать с наименованием (за исключением “хвостовых” пробелов в наименовании). Значение по умолчанию: Ложь.
- (необязательный). Тип: СправочникСсылка. Описание: родитель, в пределах которого нужно выполнять поиск, если не указан, то поиск будет проводиться во всем справочнике.
- (необязательный). Тип: СправочникСсылка. Описание: владелец, в пределах которого нужно выполнять поиск, если не указан, то поиск будет проводиться во всем справочнике.
3) Поиск по произвольному реквизиту
Если известно значение какого либо реквизита справочника и необходимо получить ссылку на него, то можно воспользоваться методом НайтиПоРеквизита( , , , ) менеджера справочника. В простейшем случае необходимо передать данному методу имя реквизита, его значение и в результате будет получена либо ссылка на элемент справочника, либо пустая ссылка, если элемент с таким значением указанного реквизита не найден. Следует заметить, что если в справочнике присутствует несколько элементов с таким значением указанного реквизита, то будет возвращен тот, который найден первым.
Описание параметров метода НайтиПоРеквизит:
- (обязательный). Тип: Строка. Описание: имя реквизита, как он задан в конфигураторе, по значению которого осуществляется поиск. Тип значения: произвольный, кроме ХранилищеЗначения и строк произвольной длины.
- (обязательный). Тип: Произвольный. Описание: значение реквизита, по которому должен выполняться поиск.
- (необязательный). Тип: СправочникСсылка. Описание: родитель, в пределах которого нужно выполнять поиск, если не указан, то поиск будет проводиться во всем справочнике.
- (необязательный). Тип: СправочникСсылка. Описание: владелец, в пределах которого нужно выполнять поиск, если не указан, то поиск будет проводиться во всем справочнике.
В данной статье я расскажу вам как быстро найти в справочнике элементы у которых в наименовании присутствует вхождение искомой нами строки:
Текст запроса будет выглядеть так:
где оператор запроса ПОДРОБНО как раз и будет искать вхождения ПараметрСтрокаПоиска по всем элементам справочника Номенклатура.
Установить значение параметра ПараметрСтрокаПоиска можно командой:
Подобным образом можно организовать поиск по точному вхождению строки. Такой способ подходит для поиска элемента справочника например по коду. Строка запроса изменится и будет выглядеть так:
|Номенклатура.Наименование ПОДОБНОПараметрСтрокаПоиска
Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если значение выражения удовлетворяет шаблону – результатом оператора будет ИСТИНА, иначе – ЛОЖЬ.
Следующие символы в строке шаблона являются служебными и имеют смысл, отличный от символа строки:
- % (процент): последовательность, содержащая любое количество произвольных символов
- _ (подчеркивание): один произвольный символ
- […] (в квадратных скобках один или несколько символов): любой одиночный символ из перечисленных внутри квадратных скобок. В перечислении могут встречаться диапазоны, например a-z, означающие произвольный символ, входящий в диапазон, включая концы диапазона.
- [^…] (в квадратных скобках значок отрицания, за которым следует один или несколько символов): любой одиночный символ, кроме тех, которые перечислены следом за значком отрицания

