При отладке правил обмена в Конвертации Данных или разработке сложных алгоритмов переноса информации часто возникает необходимость ограничить выборку элементов справочника — например, взять только первые 10 или 100 записей, чтобы не обрабатывать многотысячный массив данных при каждом тестовом прогоне.
Разберем особенности работы встроенного языка запросов платформы 1С:Предприятие 7.7 и проанализируем практические способы получения ограниченного списка элементов справочника.
В отличие от платформы 1С 8.х, где в языке запросов предусмотрена конструкция ПЕРВЫЕ N (или аналог TOP N в T-SQL), встроенный язык запросов 1С 7.7 не поддерживает подобные инструкции. Запрос 1С 7.7 всегда считывает всю выборку, удовлетворяющую условиям. Поэтому ограничить число записей непосредственно в самом тексте встроенного запроса средствами платформы невозможно.
Тем не менее, решить задачу выборки первых N элементов можно несколькими эффективными способами на уровне встроенного языка.
Рассмотрим самый простой и быстродействующий вариант — прямую выборку элементов с использованием объекта Справочник, счетчика и объекта СписокЗначений.
Разберем пример кода, который выбирает первые 10 элементов справочника Контрагенты (пропуская группы) и добавляет их в список значений:
Сч = 0;
Спис = СоздатьОбъект("СписокЗначений");
Спр = СоздатьОбъект("Справочник.Контрагенты");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
Если Спр.ЭтоГруппа() = 1 Тогда
Продолжить;
КонецЕсли;
Спис.ДобавитьЗначение(Спр.ТекущийЭлемент());
Сч = Сч + 1;
Если Сч = 10 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Сформированный СписокЗначений можно использовать далее в качестве условия для встроенного запроса с помощью конструкции Условие(Контр в Спис);.
Если для получения данных необходимо применить возможности группировки и сортировки языка запросов 1С 7.7, мы можем выполнить запрос без ограничений, выгрузить результат в объект ТаблицаЗначений и взять из нее только необходимые строки.
Проанализируем алгоритм ограничения выборки через запрос и метод Выгрузить():
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = "Обрабатывать все;
|Контр = Справочник.Контрагенты.ТекущийЭлемент;
|Группировка Контр без групп;";
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
ТЗК = СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ТЗК, 0, 0);
Спис = СоздатьОбъект("СписокЗначений");
// Выгружаем ровно 10 строк, начиная с 1-й строки
ТЗК.Выгрузить(Спис, 1, 10, "Контр");
КонецЕсли;
В этом примере с помощью метода Выгрузить() таблицы значений мы переносим в СписокЗначений диапазон строк с 1 по 10 по колонке Контр.
Если ваша информационная база 1С 7.7 работает на базе MS SQL Server и в конфигурации подключена внешняя компонента 1С++, ограничение выборки можно сделать на стороне СУБД с помощью прямого SQL-запроса.
В этом случае используется стандартная SQL-конструкция SELECT TOP 10 через объект ODBCRecordset. Это наиболее производительный вариант для больших таблиц, так как SQL-сервер вернет ровно 10 записей, не считывая остальные 15 000 элементов базы данных.
Если ограничение количества записей требуется исключительно для тестирования правил обмена в Конвертации Данных, рассмотрим альтернативные подходы:
ПередВыгрузкойОбъекта в правилах выгрузки данных (ПВД) или правилах конвертации объектов (ПКО) можно объявить счетчик. При достижении лимита в 10 элементов установить параметр Отказ = 1;, что прекратит выгрузку последующих объектов.