Перейти к основному содержимому

Выборки данных 1С

Разработчику
Загрузка эмулятора 1С…

Два способа получить данные из базы

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

  1. Методами менеджера — выборка, НайтиПоНаименованию, ПолучитьСсылку;
  2. Языком запросовВЫБРАТЬ … ИЗ … ГДЕ ….

Выборка — первый способ, который удобен для последовательного обхода небольшого числа элементов. Запрос — для фильтрации, соединений и агрегации на стороне СУБД.


Выборка справочника

Выборка — объект для перебора элементов справочника по условию отбора.

&НаСервере
Процедура ВывестиАктивныхКонтрагентов()
Выборка = Справочники.Контрагенты.Выбрать(, , Новый Структура("ПометкаУдаления", Ложь));
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование + " — " + Выборка.ИНН);
КонецЦикла;
КонецПроцедуры

Метод Выбрать(Родитель, Отбор, …) возвращает итератор. Следующий() переходит к следующему элементу и возвращает Истина, пока элементы есть.

Отбор и родитель

ПараметрНазначение
РодительТолько дочерние элементы иерархического справочника
ОтборСтруктура или Массив условий по реквизитам
ПорядокСортировка обхода

Для одного элемента по коду или наименованию чаще используют НайтиПоКоду, НайтиПоНаименованию, НайтиПоРеквизиту — без полного обхода.


Выборка документов

&НаСервере
Процедура ДокументыЗаПериод(ДатаНач, ДатаКон)
Выборка = Документы.РеализацияТоваров.Выбрать(ДатаНач, ДатаКон);
Пока Выборка.Следующий() Цикл
Если Выборка.Проведен Тогда
Сообщить(Выборка + " сумма " + Выборка.СуммаДокумента);
КонецЕсли;
КонецЦикла;
КонецПроцедуры

У документов выборка часто задаётся интервалом дат. Для сложных условий (несколько реквизитов, соединения с регистрами) переходите на запрос.


Выборка и запрос — когда что использовать

СитуацияВыборкаЗапрос
Обход всех элементов группы справочникаизбыточен
Отбор по 3+ полям, JOIN, итоги
Нужна ТаблицаЗначений для отчёта
Поиск одного элемента по уникальному полюметод Найти*
Миллионы строк✓ с ограничением полей

Правило: если данные можно описать одним объектом метаданных и простым отбором — выборка читается проще. Как только появляются агрегаты, соединения или выборка «кусочками» — запрос.

Пример того же отбора запросом (см. также 118.md):

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

Обход результата запроса

Запрос возвращает РезультатЗапроса. Его тоже можно обойти выборкой:

Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// Выборка.Наименование, Выборка.ИНН
КонецЦикла;

Или сразу получить ТаблицаЗначений через Выгрузить() — удобно для форм и обработок.


Ограничения выборки

  • Обход идёт по одному объекту за шаг — лишние обращения к БД при массовых операциях.
  • Нет группировки и суммирования — только код в цикле.
  • Регистры сведений и накопления читают через наборы записей и виртуальные таблицы в запросах — см. 124.md.

Связанные материалы


Практика 15 минут

  1. В обработке на сервере обойдите выборкой элементы любого справочника учебной базы.
  2. Тот же список получите запросом в ТаблицаЗначений.
  3. Сравните количество строк и удобство кода при добавлении второго условия отбора.

Лаборатория — выборка и запрос (40 минут)

Задача: вывести номенклатуру с артикулом, содержащим «ABC».

Часть A — выборка

&НаСервере
Функция СписокЧерезВыборку(МаскаАртикула) Экспорт
Результат = Новый Массив;
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
Если СтрНайти(Выборка.Артикул, МаскаАртикула) > 0 Тогда
Результат.Добавить(Выборка.Ссылка);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции

Фильтр в коде — просто для обучения; на большой базе это медленно.

Часть B — запрос

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

Часть C — сравнение

Замерьте время на 1000+ элементов (если есть тестовые данные). Зафиксируйте вывод: при втором условии отбора запрос короче и предсказуемее по нагрузке.


Проверка себя

  • Чем Выборка.Следующий() отличается от цикла Для каждого по массиву?
  • Почему для остатков на складе выборка документов не подходит?
  • Когда Выгрузить() предпочтительнее построчного обхода?

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").