Как организовать цикл в запросе 1с
Циклы в 1С и в любом другом языке программирования используются для повторения заданной последовательности действий. Цикл может выполняться фиксированное количество раз, пока выполняется условие или при обходе элементов коллекции.
Циклы с фиксированным количеством проходов.
Циклы с фиксированным, заранее известным количеством проходов (итераций) имеют следующий синтаксис:
Цикл выполнится столько раз сколько указано в переменной НужноеКоличествоИтераций которая должна быть числовой, значение сч будет увеличиваться на каждой итерации на 1, можно самому в теле цикла указывать содержимое переменной сч управляя количеством проходом, также нужно иметь ввиду, что на каждом витке цикла содержимое этой переменной будет увеличиваться на 1 в любом случае вне зависимости от ваших действий. Можно просто указать:
если нужно что бы цикл просто сделал жестко указанное количество итераций.
Циклы по условию.
Циклы по условию имеют следующий ситаксис:
Здесь цикл будет выполняться до тех пор, пока будет выполняться условие. Очень просто организовать бесконечный цикл не допуская увеличения переменной А больше 99. Такой цикл "повешает" 1С и его разумеется имеет смысл избегать, если вы конечно не используете оператор Прервать .
Циклы для обхода коллекций.
Любую коллекцию можно обойти в цикле следующим образом:
Коллекциями могут быть: строки и колонки табличных частей документов\справочников и таблиц значений, массивы и другие типы данных.
Операторы управляющие ходом цикла.
Продолжить
Оператор Продолжить делает следующий виток цикла передавая управление на начало цикла, таким образом пропуская команды которые идут ниже. Например в следующем случае:
значение переменной а будет увеличиваться только в нечетных проходах цикла, но цикл сделает 100 проходов без исключений.
Прервать
Оператор Прервать прерывает выполнение цикла, передавая выполнение на команды которые идут после цикла не рекомендуется его использовать без необходимости, так как он затрудняет анализ кода расположенного в цикле.
Использование функций в теле цикла.
Использование функций в тебе цикла считается дурным тоном если эта функция будет каждый раз возвращать одно и то же значение. Не имеет смысла каждый раз выполнять один и тот же код если результат его выполнения не изменяется, в таких случаях функцию необходимо выполнить до цикла поместив результат в переменную и далее в цикле использовать эту переменную.
Использование запросов в теле цикла.
Использование запросов в теле цикла также считается недопустимым. Так как при каждом витке цикла делается запросе к базе данных, а использование запросов подразумевает под собой идеологию "Все нужные данные должны быть получены одним запросом". Если есть возможность, следует проанализировать какие данные будут нужны в цикле, сделать запрос до цикла и в цикле пользоваться уже результатами ранее созданного запроса. Здесь следует добавить пример.
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
Цикл Для
Оператор цикла Для предназначен для циклического повторения операторов, находящихся внутри конструкции Цикл – КонецЦикла .
Перед началом выполнения цикла значение Выражение 1 присваивается переменной Имя_переменной . Значение Имя_переменной автоматически увеличивается при каждом проходе цикла. Величина приращения счетчика при каждом выполнении цикла равна 1.
Цикл выполняется, пока значение переменной Имя_переменной меньше или равно значению Выражение 2 . Условие выполнения цикла всегда проверяется в начале, перед выполнением цикла.
Имя_переменной | Идентификатор переменной (счетчика цикла), значение которой автоматически увеличивается на 1 при каждом повторении цикла. Так называемый счетчик цикла. |
Выражение 1 | Числовое выражение, которое задает начальное значение, присваиваемое счетчику цикла при первом проходе цикла. |
По | Синтаксическая связка для параметра Выражение 2 . |
Выражение 2 | Максимальное значение счетчика цикла. Когда переменная Имя_переменной становится больше чем Выражение 2, выполнение оператора цикла Для прекращается. |
Цикл | Операторы, следующие за ключевым словом Цикл выполняются, пока значение переменной Имя_переменной меньше или равно значения Выражение 2 . |
// Операторы | Исполняемый оператор или последовательность таких операторов. |
Прервать | Позволяет прервать выполнение цикла в любой точке. После выполнение этого оператора управление передается оператору, следующему за ключевым словом КонецЦикла . |
Продолжить | Немедленно передает управление в начало цикла, где производится вычисление и проверка условий выполнения цикла. Операторы, следующие в теле цикла за ним, на данной итерации обхода не выполняются. |
КонецЦикла | Ключевое слово, которое завершает структуру оператора цикла. |
Цикл Для Каждого
Оператор цикла Для каждого предназначен для циклического обхода коллекций значений. При каждой итерации цикла возвращается новый элемент коллекции. Обход осуществляется до тех пор, пока не будут перебраны все элементы коллекции.
Имя_переменной_1 | Переменная, которой при каждом повторении цикла присваивается значение очередного элемента коллекции. |
Из | Синтаксическая связка для параметра Имя_переменной_2 . |
Имя_переменной_2 | Переменная или выражение, предоставляющее коллекцию. Элементы этой коллекции будут присваиваться параметру Имя_переменной_1 . |
Цикл | Операторы, следующие за ключевым словом Цикл выполняются для каждого элемента коллекции. |
// Операторы | Исполняемый оператор или последовательность таких операторов. |
Прервать | Позволяет прервать выполнение цикла в любой точке. После выполнение этого оператора управление передается оператору, следующему за ключевым словом КонецЦикла . |
Продолжить | Немедленно передает управление в начало цикла, где производится вычисление и проверка условий выполнения цикла. Операторы, следующие в теле цикла за ним, на данной итерации обхода не выполняются. |
КонецЦикла | Ключевое слово, которое завершает структуру оператора цикла. |
Цикл Пока
Оператор цикла Пока предназначен для циклического повторения операторов, находящиеся внутри конструкции Цикл – КонецЦикла . Цикл выполняется, пока логическое выражение равно Истина. Условие выполнения цикла всегда проверяется вначале, перед выполнением цикла.
&НаСервере
Процедура ПолучениеЗапросомВсехСтрокСоЗначениямиВсехСтолбцовИзТаблицы ()
// Звездочка используется, когда нужно выбрать все столбцы из таблицы
Запрос = Новый Запрос ( "ВЫБРАТЬ
| *
|ИЗ
| Справочник.Материалы" );
РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда // Такая проверка рекомендуется фирмой 1С
Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Иначе // Например: Сообщить("Данные отсутствуют!");
КонецЕсли;
&НаСервере
Процедура ПолучениеЗапросомВсехСтрокСоЗначениямиОпределенныхСтолбцов ()
// У каждого столбца в таблице есть своё соответствующее имя
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| Производитель,
| СрокИспользования
|ИЗ
| Справочник.Материалы" );
РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда // Такая проверка рекомендуется фирмой 1С
Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Иначе // Сообщить("Данные отсутствуют!");
КонецЕсли;
&НаСервере
Процедура ИспользованиеПсевдонимовДляСтолбцовИТаблицВЗапросах ()
// Для каждого столбца может быть назначен Псевдоним. Запрос станет более понятным
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Запчасти.Наименование КАК НаименованиеМатериала,
| Запчасти.СрокИспользования КАК СрокИспМатериала,
| Запчасти.Производитель КАК ПроизводительМатериала
| ИЗ
| Справочник.Материалы КАК Запчасти" );
РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда // Такая проверка рекомендуется фирмой 1С
Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Иначе // Сообщить("Данные отсутствуют!");
КонецЕсли;
&НаСервере
Процедура УдалениеДубликатовИзРезультатаЗапроса ()
// В справочнике КлассификаторСроковПИ есть элементы-дубли. Строим запрос так,
// чтобы в результат попали только различные сроки использования
Запрос = Новый Запрос ( "ВЫБРАТЬ РАЗЛИЧНЫЕ
| Наименование
|ИЗ
| Справочник.КлассификаторСроковПИ" );
РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда // Такая проверка рекомендуется фирмой 1С
Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Иначе // Сообщить("Данные отсутствуют!");
КонецЕсли;
&НаСервере
Процедура ОграничениеКоличестваСтрокВРезультатеЗапроса ()
// Создание выборки первых 30 самых тяжелых материалов
Запрос = Новый Запрос ( "ВЫБРАТЬ ПЕРВЫЕ 30
| Наименование,
| Вес
|ИЗ
| Справочник.Материалы
|УПОРЯДОЧИТЬ ПО
| Вес УБЫВ" );
РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда // Такая проверка рекомендуется фирмой 1С
Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Иначе // Сообщить("Данные отсутствуют!");
КонецЕсли;
&НаСервере
Процедура ВставкаСтолбцаСОпределеннымЗначениемВРезультатЗапроса ()
// Добавление столбца СтавкаНДС и присвоение значения = 20
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| 20 КАК СтавкаНДС,
| Вес
|ИЗ
| Справочник.Материалы" );
РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда // Такая проверка рекомендуется фирмой 1С
Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Иначе // Сообщить("Данные отсутствуют!");
КонецЕсли;
&НаСервере
Процедура ВыборкаЗаписейЗапросаТолькоНаКоторыеИмеютсяПользовательскиеПрава ()
// Необходимо только для баз, в которых ограничение прав доступа работает на уровне записей (RLS)
// Данная реализация кода дает возможность выполнить запрос без ошибки
// и выбрать только те данные, на которые у пользователя есть права
Запрос = Новый Запрос ( "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Ссылка
|ИЗ
| Документ.ПоступлениеМатериалов" );
РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда // Такая проверка рекомендуется фирмой 1С
Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Иначе // Сообщить("Данные отсутствуют!");
КонецЕсли;
&НаСервере
Процедура ОтборЗаписейВЗапросеПоОпределенномуЗначениюРеквизиту ()
// Выборка котрагентов, у которых значение реквизита Резидентство = НеРезидент
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| СтранаРегистрации,
| ЮрАдрес,
| Резидентство
|ИЗ
| Справочник.Контрагенты
|ГДЕ
| Резидентство = ЗНАЧЕНИЕ(Перечисление.Резидентство.НеРезидент)
|" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ОтборЗаписейВЗапросеПоОпределенномуЗначениюБухСчету ()
// Выборка проводок с суммами и количеством по дебету бухгалтерского счёта 01.01,
// через обращение по предопределенному имени "ОсновныеСредстваВОрганизации"
Запрос = Новый Запрос ( "ВЫБРАТЬ
| СчетДт,
| СчетКт,
| Количество,
| Сумма
|ИЗ
| РегистрБухгалтерии.Хозрасчетный
|ГДЕ
| СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ОсновныеСредстваВОрганизации)" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ОпределениеПеременойТипаДатаВЗапросе ()
// Указывать дату можно прямо в запросе или передавать через параметр
Запрос = Новый Запрос ( "ВЫБРАТЬ
| ДАТАВРЕМЯ(2020, 05, 30, 23, 00, 00) КАК ДоНачалаЛетаОсталсяОдинЧас" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ФункцииДляРаботыСДатамиВЗапросе ()
Запрос . УстановитьПараметр ( "ВыбраннаяДата" , '20200607' );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ИспользованиеОператораВЫБОРвЗапросе ()
// Выборка материалов с добавлением поля "ОписаниеПлотности" для новой градации
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| Плотность,
| ВЫБОР
| КОГДА Плотность 2 ТОГДА
| ""Средняя плотность""
| ИНАЧЕ
| ""Очень плотный материал""
|
| КОНЕЦ КАК ОписаниеПлотности
| ИЗ
| Справочник.Материалы" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ИспользованиеЗначенияНеопределеноВЗапросе ()
// Выборка контрагентов у которых есть реквизит составного типа "ДокументыДвижения" и он не заполнен
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| ДокументыДвижения
|ИЗ
| Справочник.Контрагенты
|ГДЕ
| ДокументыДвижения = Неопределено" );
// Неопределено - применяется когда нужно использовать пустое значение
// не принадлежащее ни к одному другому типу
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПроверкаЗначенияНаСоответствиеСсылочномуТипуВЗапросе ()
// Выборка бухг.проводок, у которых регистратором является документ типа "ПоступлениеМатериалов"
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Регистратор,
| СчетДт,
| СчетКт,
| Сумма
|ИЗ
| РегистрБухгалтерии.Хозрасчетный
|ГДЕ
| Регистратор ССЫЛКА Документ.ПоступлениеМатериалов" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПроверкаЗначенияНаВхождениеВДиапазон ()
// Выборка материалов с весом от 3500 до 7500
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| Вес
|ИЗ
| Справочник.Материалы
|ГДЕ
| Вес МЕЖДУ 3500 И 7500" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПроверкаЗначенияНаВхождениеВСписок ()
// Выборка материалов произведенных на Гомелькабель и Гомельстекло
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| Производитель
|ИЗ
| Справочник.Материалы
|ГДЕ
| Производитель В (&Гомелькабель, &Гомельстекло)" ); // у оператора "В" есть вариант "В ИЕРАРХИИ" (в списке групп)
Запрос . УстановитьПараметр ( "Гомелькабель" , Справочники . Контрагенты . НайтиПоНаименованию ( "Гомелькабель" ));
Запрос . УстановитьПараметр ( "Гомельстекло" , Справочники . Контрагенты . НайтиПоНаименованию ( "Гомельстекло" ));
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПроверкаВЗапросеНаОтсутствиеРеквизита ()
// Выборка контрагентов у которых нет реквизита "Резидентство"
// (понятно, что этими элементами будут только группы)
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| Резидентство
|ИЗ
| Справочник.Контрагенты
|ГДЕ
| Резидентство ЕСТЬ NULL" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура ПроверкаВЗапросеИЗамена NULL НаДрЗначение ()
// Выборка контрагентов у которых нет реквизита "Резидентство"
// и вывод фразы "NULL", если "Резидентство" ЕСТЬ NULL
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| ЕСТЬNULL(Резидентство, ""NULL"")
|ИЗ
| Справочник.Контрагенты" );
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
// Функция запроса ЕстьNull обычно используется для избавления от значений типа Null
// для числовых полей запроса. В ряде случаев, например полного соединения
// двух таблиц функция ЕстьNull (ПараметрN1,ПараметрN2) может с успехом заменить
// конструкцию ВЫБОР КОГДА . ТОГДА ..ИНАЧЕ ….КОНЕЦ, когда для какого-либо поля
// значения NULL могут быть как в первой таблице, так и во второй
// такая конструкция позволяет получать не Null значение для поля.
//
// Но надо помнить, что в отличие от условного оператора ВЫБОР функция ЕстьNull
// приводит тип второго аргумента к типу первого аргумента, что нужно учитывать,
// если типы аргументов отличаются!
&НаСервере
Процедура ПолучениеПустойСсылкиВЗапросе ()
// Выборка контрагентов у которых есть реквизит "Резидентство" и он не заполнен
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование,
| Резидентство
|ИЗ
| Справочник.Контрагенты
|ГДЕ
| Резидентство = ЗНАЧЕНИЕ(Перечисление.Резидентство.ПустаяСсылка)" );
// Так же пишутся:
// ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
// ЗНАЧЕНИЕ(Документ.ПоступлениеМатериалов.ПустаяСсылка).
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
&НаСервере
Процедура СравнениеВЗапросеСтрокиСШаблоном ()
// Выборка контрагентов которые содержат слова, начинающиеся на " Гомель"
Запрос = Новый Запрос ( "ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Контрагенты
|ГДЕ
| Наименование ПОДОБНО ""%[ ][Г][о][м][е][л][ь]_%""" );
// Параметры строки шаблона:
// % - любое количество произвольных символов
// _ - один произвольный символ
// [] - любой одиночный символ, перечисленный внутри скобок
// [^] - любой одиночный символ, кроме тех, что внутри скобок после ^
РезультатЗапроса = Запрос . Выполнить (); Записи = РезультатЗапроса . Выбрать ();
Пока Записи . Следующий () Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
Цикл в запросе
ВЫБРАТЬ | ТабельУчетаРабочегоВремени.Подразделение.Наименование, .
Цикл в запросе
Как сделать цикл, к примеру, распечатать строку 100 раз, спасибо
Использовать цикл в запросе
У меня есть запрос, в котором я должен записать в таблицу Mark информации, но у меня данные не.
Цикл сумм в запросе
Здравствуйте. Помогите, пожалуйста, создать запрос. Имеется 2 таблицы со связью многие ко многим.
Преобразовать цикл в LINQ запросе
Не могу сообразить. Помогите :) private Dictionary<Terrain, Color> GetColors() < var content =.
Цикл в запросе. Не могу разобраться
Доброго времени суток!Произошел цикл. Даже с лимитом в 100 не выдает результата (ждал больше 15.
Можно ли в запросе создать цикл?
Подскажите, пожалуйста, можно ли создать цикл в SQL-запросе, который будет вычислять разницу между.
Цикл в запросе по двум полям
Добрый день! Подскажите пожалуйста, как правильно организовать запрос по двум полям: поле1.
Цикл в функции при запросе к MySQL
Доброе время суток! Имеется следующий код (см. ниже), который пингует определенный ресурс заведомо.
как использовать Цикл в Запросе sql
Пользователь водит в поле Edit1.Text желаемое кол-во столбцов в таблице бд mssql. Вопрос: как.
Читайте также: