Приветствую Вас ГостьВторник, 05.08.2025, 07:20

Каталог статей


Варианты обхода выборки запроса

Помимо традиционного метода Выборка.Следующий() есть другие варианты обхода:

Пока Выборка.НайтиСледующий(Новый Структура("Ссылка", ВыборкаШапка.Ссылка)) Цикл

Здесь задаем структуру отбора, в соответствие с которым будут отбираться записи. Есть один важный нюанс: НайтиСледующий начинает искать с записи, на которой было последнее позиционирование, т.е если нужные записи были выше, то их не найдет. Чтобы избежать такой ситуации, перед НайтиСледующий надо добавить строку Выборка.Сбросить(). В этом случае позиционирование осуществляется на начало выборки.

Пока Выборка.СледующийПоЗначениюПоля(<ИмяПоля>) Цикл - ищет строку с следующим значением заданного поля.

Подходит, когда в запросе есть сортировка по полю. Это некоторая альтернатива обхода итогов и Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам).

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

Например:

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

        Выборка = Запрос.Выполнить().Выбрать();
        Пока Выборка.СледующийПоЗначениюПоля("ПроизводственныйКалендарь") Цикл
            НаборЗаписей = РегистрыСведений.ПериодыНерабочихДнейКалендаря.СоздатьНаборЗаписей();
            Пока Выборка.Следующий() Цикл
                ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), Выборка);
                ЗаполнитьЗначенияСвойств(ТаблицаИзменений.Добавить(), Выборка);
            КонецЦикла;
            НаборЗаписей.Отбор.ПроизводственныйКалендарь.Установить(Выборка.ПроизводственныйКалендарь);
            Если ОбновлениеИнформационнойБазы.ЭтоВызовИзОбработчикаОбновления() Тогда
                ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(НаборЗаписей);
                Продолжить;
            КонецЕсли;
            НаборЗаписей.Записать();
        КонецЦикла;

 


 

 

Категория: Программирование | Добавил: leshic (02.07.2025)
Просмотров: 12 | Рейтинг: 0.0/0
Всего комментариев: 0
Вход на сайт
Поиск
Категории раздела
СКД [51]
Регистры [7]
Формы [48]
Администрирование [50]
Запросы [11]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [49]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0