Синтаксис и применение Ключевое слово ПЕРВЫЕ в платформе 1С:Предприятие. Описание и примеры кода.
Полное описание, параметры и ограничения
Ключевое слово ПЕРВЫЕ
ПЕРВЫЕ <Количество> позволяет задать предельное количество строк в результате запроса. Для этого в описании запроса следует указать ключевое слово ПЕРВЫЕ, и после него – требуемое количество строк.
Будут отобраны самые первые (в соответствии с правилами упорядочивания результатов запроса) строки.
<Количество> задается целым числом.
Пример:
// Необходимо отобрать пять самых дорогих товаров.
// Выборка должна осуществляться в порядке убывания цены товара.
ВЫБРАТЬ ПЕРВЫЕ 5
Справочник.Номенклатура.Наименование,
Справочник.Номенклатура.ЗакупочнаяЦена
УПОРЯДОЧИТЬ ПО
Справочник.Номенклатура.ЗакупочнаяЦена УБЫВ
Результат запроса:
Наименование
ЗакупочнаяЦена
Кухонный комбайн Крупс
15 000
Джинсы женские
1 500
Рубашка "Ковбойка"
1 100
Брюки детские
800
Смеситель "Ультра"
460
Практические примеры
ИЗ, ГДЕ и ПЕРВЫЕ: выбрать две крупнейшие собственные позиции
Четыре строки создаются в типизированной таблице значений, помещаются в свою временную таблицу и отбираются запросом. Явная сортировка делает смысл первых двух строк определённым.
Где и как запускать
Полный серверный общий модуль учебной базы. Собственные значения в памяти, без чтения или записи рабочих данных.
Подготовка
В отдельной учебной базе 8.5.1.1343 создайте общий модуль УчебныйЯзык: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь. Клиентские и внешнее соединение отключены; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать.
Вставьте весь приведённый текст в этот общий модуль. ВыполнитьПример — экспортная точка входа; остальные процедуры и функции располагаются рядом, а не внутри неё.
В своей внешней учебной обработке создайте управляемую форму, команду Выполнить и кнопку. Клиентский обработчик Выполнить(Команда) вызывает свою процедуру ВыполнитьНаСервере(); она имеет директиву &НаСервереБезКонтекста и одну строку УчебныйЯзык.ВыполнитьПример();. Это серверный вызов общего модуля, а не разрешение клиенту прямо обращаться к серверной библиотеке.
Все товары, количества и строки придуманы в этом модуле. Запись документов, подключение к чужой базе, файлы, сеть и печать не используются. В рабочие общие модули текст не вставляйте.
HTML только показывает BSL. Код в 1С не запускался; перечисленные результаты и отрицательные опыты проверяйте самостоятельно в собственном стенде.
Процедура ВыполнитьПример() Экспорт
Источник = Новый ТаблицаЗначений;
Источник.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(20)));
Источник.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(5, 0, ДопустимыйЗнак.Неотрицательный)));
Источник.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 2, ДопустимыйЗнак.Неотрицательный)));
Данные = Новый Массив;
Данные.Добавить(Новый Структура("Код,Количество,Цена", "own-A", 5, 100));
Данные.Добавить(Новый Структура("Код,Количество,Цена", "own-B", 0, 200));
Данные.Добавить(Новый Структура("Код,Количество,Цена", "own-C", 3, 250));
Данные.Добавить(Новый Структура("Код,Количество,Цена", "own-D", 4, 150));
Для Каждого Позиция Из Данные Цикл
СтрокаИсточника = Источник.Добавить();
СтрокаИсточника.Код = Позиция.Код;
СтрокаИсточника.Количество = Позиция.Количество;
СтрокаИсточника.Цена = Позиция.Цена;
КонецЦикла;
Менеджер = Новый МенеджерВременныхТаблиц;
Попытка
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Менеджер;
Запрос.Текст = "ВЫБРАТЬ
| Данные.Код КАК Код,
| Данные.Количество КАК Количество,
| Данные.Цена КАК Цена
|ПОМЕСТИТЬ ВТСвоиКниги
|ИЗ &Источник КАК Данные;
|ВЫБРАТЬ ПЕРВЫЕ 2
| Книги.Код КАК Код,
| Книги.Количество * Книги.Цена КАК Сумма
|ИЗ ВТСвоиКниги КАК Книги
|ГДЕ Книги.Количество >= &Минимум
|УПОРЯДОЧИТЬ ПО Сумма УБЫВ, Код";
Запрос.УстановитьПараметр("Источник", Источник);
Запрос.УстановитьПараметр("Минимум", 3);
Пакет = Запрос.ВыполнитьПакет();
Если Пакет.Количество() <> 2 Тогда
ВызватьИсключение "Ожидались создание и выборка собственных строк";
КонецЕсли;
Итог = Пакет[1].Выгрузить();
Если Итог.Количество() <> 2 Тогда
ВызватьИсключение "Ожидались две крупнейшие подходящие строки";
КонецЕсли;
Сообщить(Итог[0].Код = "own-C" И Итог[0].Сумма = 750);
Сообщить(Итог[1].Код = "own-D" И Итог[1].Сумма = 600);
Сообщить(Источник.Количество() = 4);
Исключение
Менеджер.Закрыть();
ВызватьИсключение;
КонецПопытки;
Менеджер.Закрыть();
Сообщить(Итог.Количество() = 2);
КонецПроцедурыРазбор по шагам
ТаблицаЗначений и её колонки имеют явные типы. Это обязательная подготовка внешней таблицы для помещения в временную таблицу запроса, а не чтение справочника книг.
Создать четыре строки: A=500, B=0, C=750, D=600 по произведению собственного количества и цены.
ПОМЕСТИТЬ создаёт ВТСвоиКниги в собственном менеджере. Данные — псевдоним источника первого запроса; Книги — псевдоним временной таблицы второго. Это не поля со значениями этих имён.
Второй запрос читает свою ВТСвоиКниги. ГДЕ Количество>=3 оставляет A,C,D; own-B с нулём отсекается до отбора первых строк.
УПОРЯДОЧИТЬ ПО Сумма УБЫВ, Код задаёт убывание суммы и дополнительный ключ при равенстве. ПЕРВЫЕ 2 оставляет C=750 и D=600, а A=500 уже не входит.
ВыполнитьПакет возвращает две позиции по порядку запросов. Только индекс 1 здесь содержит нужную выборку товаров; индекс 0 — результат помещения строк.
Менеджер закрывается при ошибке и успехе. После закрытия используем независимую выгруженную Итог, но не временную таблицу и не закрытый менеджер.
Как проверить результат
Четыре сообщения Истина: C/750, D/600, четыре неизменённые строки источника и две строки независимой итоговой таблицы.
Уберите ПЕРВЫЕ 2: подходящих строк станет три, поэтому проверку размера и последующие ожидания надо изменить. Измените own-D на количество 5: суммы C и D обе 750; второе поле сортировки Код сохраняет порядок C перед D.
Ожидаемый результат
Отбор, сортировка, ограничение размера и время жизни временной таблицы показаны на полном воспроизводимом наборе своих данных.
На что обратить внимание
ПЕРВЫЕ без явного упорядочивания не обещает именно две крупнейшие позиции. Порядок исходного массива не заменяет ORDER BY.
Переданный ТаблицаЗначений не следует бездумно использовать как обычную постоянную таблицу. Здесь внешний источник сначала помещается в собственную временную таблицу.
Не закрывайте менеджер чужого отчёта. Этот пример создаёт свой менеджер и не удаляет постоянные таблицы, справочники или файлы.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.