Помимо традиционного метода Выборка.Следующий() есть другие варианты обхода:
Пока Выборка.НайтиСледующий(Новый Структура("Ссылка", ВыборкаШапка.Ссылка)) Цикл
Здесь задаем структуру отбора, в соответствие с которым будут отбираться записи. Есть один важный нюанс: НайтиСледующий начинает искать с записи, на которой было последнее позиционирование, т.е если нужные записи были выше, то их не найдет. Чтобы избежать такой ситуации, перед НайтиСледующий надо добавить строку Выборка.Сбросить(). В этом случае позиционирование осуществляется на начало выборки.
Пока Выборка.СледующийПоЗначениюПоля(<ИмяПоля>) Цикл - ищет строку с следующим значением заданного поля.
Подходит, когда в запросе есть сортировка по полю. Это некоторая альтернатива обхода итогов и Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам).
При выполнении этого метода курсор позиционируется на строку с отличающимся значением поля. Далее выборка обходиться методом Следующий(). Как только значение контролируемого поля меняется, то управление передается на СледующийПоЗначениюПоля.
Например:
"ВЫБРАТЬ
| ИзмененияКалендарей.ПроизводственныйКалендарь КАК ПроизводственныйКалендарь,
| ИзмененияКалендарей.КодПроизводственногоКалендаря КАК КодПроизводственногоКалендаря,
| ГОД(КлассификаторТаблица.ДатаНачала) КАК Год,
| КлассификаторТаблица.НомерПериода,
| КлассификаторТаблица.ДатаНачала КАК ДатаНачала,
| КлассификаторТаблица.ДатаОкончания КАК ДатаОкончания,
| КлассификаторТаблица.Основание КАК Основание
|ИЗ
| ВТИзмененияКалендарей КАК ИзмененияКалендарей
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТКлассификаторТаблица КАК КлассификаторТаблица
| ПО КлассификаторТаблица.КалендарьКод = ИзмененияКалендарей.КодПроизводственногоКалендаря
|УПОРЯДОЧИТЬ ПО
| ИзмененияКалендарей.ПроизводственныйКалендарь,
| КлассификаторТаблица.НомерПериода";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.СледующийПоЗначениюПоля("ПроизводственныйКалендарь") Цикл
НаборЗаписей = РегистрыСведений.ПериодыНерабочихДнейКалендаря.СоздатьНаборЗаписей();
Пока Выборка.Следующий() Цикл
ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), Выборка);
ЗаполнитьЗначенияСвойств(ТаблицаИзменений.Добавить(), Выборка);
КонецЦикла;
НаборЗаписей.Отбор.ПроизводственныйКалендарь.Установить(Выборка.ПроизводственныйКалендарь);
Если ОбновлениеИнформационнойБазы.ЭтоВызовИзОбработчикаОбновления() Тогда
ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(НаборЗаписей);
Продолжить;
КонецЕсли;
НаборЗаписей.Записать();
КонецЦикла;
|