1с цикл по справочнику

Справочники в языке 1С 8.3, 8.2 (в примерах)
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
2020-02-29T09:18:46+00:00 Документы Константы Перечисления РегистрыБухгалтерии
РегистрыНакопления РегистрыСведений Справочники
Скачать эти примеры в виде тестовой базы (как загрузить, как исследовать)
Полный синтаксис (нажмите, чтобы раскрыть)
Оглавление (нажмите, чтобы раскрыть)
&НаСервере
Процедура КакОбойтиЭлементыСправочникаНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Вкусы КАК Вкусы
|ГДЕ
| ЭтоГруппа = ЛОЖЬ
|УПОРЯДОЧИТЬ ПО
| Наименование”;
РезультатЗапроса = Запрос.Выполнить();
ВыборкаВкусов = РезультатЗапроса.Выбрать();
Пока ВыборкаВкусов.Следующий() Цикл
Сообщить(ВыборкаВкусов.Наименование);
КонецЦикла;
КонецПроцедуры
Результат обхода элементов справочника
&НаСервере
Процедура КакОбойтиГруппыСправочникаНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Вкусы КАК Вкусы
|ГДЕ
| ЭтоГруппа = ИСТИНА
|УПОРЯДОЧИТЬ ПО
| Наименование”;
РезультатЗапроса = Запрос.Выполнить();
ВыборкаВкусов = РезультатЗапроса.Выбрать();
Пока ВыборкаВкусов.Следующий() Цикл
Сообщить(ВыборкаВкусов.Наименование);
КонецЦикла;
КонецПроцедуры
Результат обхода групп справочника
/// справочника (иерархически) в 1с 8.3, 8.2
&НаСервере
Процедура КакОбойтиГруппыИЭлементыСправочникаНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Вкусы КАК Вкусы
|УПОРЯДОЧИТЬ ПО
| Наименование Иерархия”;
РезультатЗапроса = Запрос.Выполнить();
ВыборкаВкусов = РезультатЗапроса.Выбрать();
Пока ВыборкаВкусов.Следующий() Цикл
Отступ = “”;
Для Шаг = 0 По ВыборкаВкусов.Уровень() Цикл
Отступ = Отступ + ” “;
КонецЦикла;
Сообщить(Отступ + ВыборкаВкусов.Наименование);
КонецЦикла;
КонецПроцедуры
Результат обхода групп и элементов (иерархически) справочника
/// (перечислим все элементы группы)
&НаСервере
Процедура КакОтобратьЭлементыСправочникаПоРодителюНаСервере()
// для тестов найдём группу “Любимые” по её имени
СсылкаНаРодителя = Справочники.Вкусы.НайтиПоНаименованию(“Любимые”);
// перечислим только те элементы справочника, что
// входят в группу “Любимые”
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Вкусы КАК Вкусы
|ГДЕ
| Вкусы.Родитель = &Родитель”;
Запрос.УстановитьПараметр(“Родитель”, СсылкаНаРодителя);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаВкусов = РезультатЗапроса.Выбрать();
Пока ВыборкаВкусов.Следующий() Цикл
Сообщить(ВыборкаВкусов.Наименование);
КонецЦикла;
КонецПроцедуры
Результат отбора элементов по родителю (группе) справочника
/// (перечислим все договоры контрагента)
&НаСервере
Процедура КакОтобратьЭлементыСправочникаПоВладельцуНаСервере()
// для тестов найдём клиента по коду 1 (это Андрей, у него 2 договора)
СсылкаНаКлиента = Справочники.Клиенты.НайтиПоКоду(“000000001”);
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Договоры КАК Договоры
|ГДЕ
| Договоры.Владелец = &Владелец”;
Запрос.УстановитьПараметр(“Владелец”, СсылкаНаКлиента);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДоговоров = РезультатЗапроса.Выбрать();
Пока ВыборкаДоговоров.Следующий() Цикл
Сообщить(ВыборкаДоговоров.Наименование);
КонецЦикла;
КонецПроцедуры
Результат отбора элементов справочника по владельцу
/// и другим реквизитам в 1с 8.3, 8.2
&НаСервере
Процедура КакОтобратьЭлементыСправочникаПоРеквизитамНаСервере()
// сделаем отбор элементов справочника Клиенты
// у которых реквизит Пол = Мужской и ЛюбимыйЦвет = Красный
// вместо этих реквизитов для отбора можно использовать
// Код, Наименование или любой другой реквизит справочника
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Наименование,
| Пол,
| ЛюбимыйЦвет
|ИЗ
| Справочник.Клиенты КАК Клиенты
|ГДЕ
| Клиенты.ЭтоГруппа = ЛОЖЬ И
| Клиенты.Пол = &Пол И
| Клиенты.ЛюбимыйЦвет = &Цвет”;
Запрос.УстановитьПараметр(“Пол”, Перечисления.Пол.Мужской);
Запрос.УстановитьПараметр(
“Цвет”,
Справочники.Цвета.НайтиПоНаименованию(“Красный”)
);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаКлиентов = РезультатЗапроса.Выбрать();
Пока ВыборкаКлиентов.Следующий() Цикл
Сообщить(
ВыборкаКлиентов.Наименование + ” ” +
ВыборкаКлиентов.Пол + ” ” +
ВыборкаКлиентов.ЛюбимыйЦвет
);
КонецЦикла;
КонецПроцедуры
Результат отбора элементов справочника по реквизитам
Процедура СозданиеИИзменениеЭлементовИГруппСправочникаНаСервере()
/// Как создать новый элемент справочника в 1с 8.3, 8.2
// создадим новый элемент справочника Города
// с именем Владивосток
Владивосток = Справочники.Города.СоздатьЭлемент();
Владивосток.Наименование = “Владивосток”;
Владивосток.Записать();
/// Как создать новую группу справочника в 1с 8.3, 8.2
// создадим новую группу справочника Города
ГородаУМоря = Справочники.Города.СоздатьГруппу();
ГородаУМоря.Наименование = “Города у моря”;
ГородаУМоря.Записать();
/// Как перенести элемент справочника в другую группу в 1с 8.3, 8.2
// перенесём созданный Владивосток в группу “Города у моря”
Владивосток.Родитель = ГородаУМоря.Ссылка;
Владивосток.Записать();
/// Как внести изменения в элемент справочника по ссылке
/// в 1с 8.3, 8.2
// найдём город Калькутта
КалькуттаСсылка = Справочники.Города.НайтиПоНаименованию(“Калькутта”);
Если Не КалькуттаСсылка.Пустая() Тогда
// изменим и запишем численность жителей в городе
Калькутта = КалькуттаСсылка.ПолучитьОбъект();
Калькутта.Численность = 1000000;
Калькутта.Записать();
КонецЕсли;
/// Как получить и проверить пустую ссылку типа справочник в 1с 8.3, 8.2
ПустаяСсылка = Справочники.Города.ПустаяСсылка();
Если ПустаяСсылка.Пустая() Тогда
Сообщить(“Ссылка действительно пустая.”);
КонецЕсли;
/// Как узнать принадлежность элемента справочника группе
/// с учетом уровней иерархии в 1с 8.3, 8.2
ПермьСсылка = Справочники.Города.НайтиПоНаименованию(“Пермь”);
РоссияСсылка = Справочники.Города.НайтиПоНаименованию(“Россия”);
// проверим принадлежит ли город Пермь группе Россия
Если ПермьСсылка.ПринадлежитЭлементу(РоссияСсылка) Тогда
Сообщить(“Элемент Пермь находится в группе Россия.”);
КонецЕсли;
/// Как скопировать существующий элемент справочника в 1с 8.3, 8.2
// скопируем элемент Пермь
КопияПерми = ПермьСсылка.Скопировать();
КопияПерми.Наименование = КопияПерми.Наименование + ” КОПИЯ”;
КопияПерми.УстановитьНовыйКод();
КопияПерми.Записать();
/// Как выяснить уровень вложенности элемента справочника
/// в 1с 8.3, 8.2
Сообщить(КопияПерми.Уровень()); // 1
/// Как заблокировать элемент справочника перед изменениями
/// в 1с 8.3, 8.2
// выполним блокировку элемента справочника
// от изменения другими режимами или пользователями
Пермь = ПермьСсылка.ПолучитьОбъект();
Если Не Пермь.Заблокирован() Тогда
Пермь.Заблокировать();
// тут идёт какой-то долгий алгоритм
// в результате которого мы меняем
// заблокированный элемент
Пермь.Численность = 5000;
Пермь.Записать();
// и только потом освобождаем его
// для других режимов и пользователей
Пермь.Разблокировать();
КонецЕсли;
/// Как заполнить новый элемент справочника на основании
/// в 1с 8.3, 8.2
// в модуле справочника Города я определил процедуру
// ОбработкаЗаполнения, которая обрабатывает ситуации
// когда мы заполняем один элемент на основании
// данных другого (см. в базе для скачивания)
Хабаровск = Справочники.Города.СоздатьЭлемент();
Хабаровск.Заполнить(
Справочники.Города.НайтиПоНаименованию(“Рио-де-Жанейро”)
);
Хабаровск.Наименование = “Хабаровск”;
Хабаровск.Записать();
/// Как пометить на удаление элемент справочника в 1с 8.3, 8.2
// пометим на удаление только что созданный Хабаровск
Хабаровск.УстановитьПометкуУдаления(
Истина, // пометка удаления
Ложь // включая подчиненные (если речь о группе справочника)
);
// метод Записать вызывать не нужно
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьКлиентаПоИмени(Имя)
Возврат Справочники.Клиенты.НайтиПоНаименованию(Имя);
КонецФункции
/// Как открыть форму существующего элемента справочника
/// по ссылке в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФормуСуществующегоЭлементаСправочника(Команда)
СсылкаНаЭлемент = ПолучитьКлиентаПоИмени(“Андрей”);
ПараметрыФормы = Новый Структура(“Ключ”, СсылкаНаЭлемент);
ОткрытьФорму(
“Справочник.Клиенты.ФормаОбъекта”, // имя формы
ПараметрыФормы // параметры для формы
);
КонецПроцедуры
/// Как открыть форму существующей группы справочника
/// по ссылке в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФормуСуществующейГруппыСправочника(Команда)
СсылкаНаГруппу = ПолучитьКлиентаПоИмени(“Vip”);
ПараметрыФормы = Новый Структура(“Ключ”, СсылкаНаГруппу);
ОткрытьФорму(
“Справочник.Клиенты.ФормаГруппы”, // имя формы
ПараметрыФормы // параметры для формы
);
КонецПроцедуры
/// Как открыть форму выбора элемента справочника и
/// отследить её закрытие в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФормуВыбораЭлементаСправочника(Команда)
ОповещениеОЗакрытии = Новый ОписаниеОповещения(“ПослеВыбораЭлемента”,
ЭтотОбъект);
ОткрытьФорму(
“Справочник.Клиенты.ФормаВыбора”,,,,,,ОповещениеОЗакрытии
);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораЭлемента(Результат, Параметры) Экспорт
Если Результат <> Неопределено Тогда
Сообщить(“Был выбран элемент ” + Результат);
КонецЕсли;
КонецПроцедуры
/// Как открыть форму выбора группы справочника и
/// отследить её закрытие в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФормуВыбораГруппыСправочника(Команда)
ОповещениеОЗакрытии = Новый ОписаниеОповещения(“ПослеВыбораГруппы”,
ЭтотОбъект);
ОткрытьФорму(
“Справочник.Клиенты.ФормаВыбораГруппы”,,,,,,ОповещениеОЗакрытии
);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораГруппы(Результат, Параметры) Экспорт
Если Результат <> Неопределено Тогда
Сообщить(“Была выбрана группа ” + Результат);
КонецЕсли;
КонецПроцедуры
/// Как открыть форму списка справочника и
/// установить отбор по реквизиту в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФормаСпискаСправочникаСОтбором(Команда)
// откроем список клиентов, оставив
// только мужчин
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить(“Пол”, ПолучитьПеречислениеМужской());
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить(“Отбор”, ПараметрыОтбора);
ОткрытьФорму(
“Справочник.Клиенты.ФормаСписка”,
ПараметрыФормы
);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьПеречислениеМужской()
Возврат Перечисления.Пол.Мужской;
КонецФункции
/// Как открыть форму списка справочника с нужным отображением
/// в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФормуСпискаСправочникаСНужнымОтображением(Команда)
// откроем список клиентов с отображением “Список”
ФормаСписка = ПолучитьФорму(“Справочник.Клиенты.ФормаСписка”);
ФормаСписка.Открыть();
ФормаСписка.Элементы.Список.Отображение = ОтображениеТаблицы.Список;
КонецПроцедуры
/// Как открыть форму только что созданного, но ещё
/// не записанного элемента справочника в 1с 8.3, 8.2
&НаКлиенте
Процедура КакОткрытьФормуНовогоНеЗаписанногоСправочника(Команда)
// получаем форму нового справочника
ФормаНовогоСправочника = ПолучитьФорму(
“Справочник.Еда.ФормаОбъекта”,,, Истина);
// делаем копию её данных (так как напрямую их менять
// нельзя)
КопияДанныхФормы = ФормаНовогоСправочника.Объект;
// заполняем эти данные на сервере
ЗаполнитьДанныеФормыНаСервере(КопияДанныхФормы);
// копируем заполненные данные в исходную форму
КопироватьДанныеФормы(КопияДанныхФормы,
ФормаНовогоСправочника.Объект);
// показываем форму нового заполненного
// элемента справочника пользователю
ФормаНовогоСправочника.Открыть();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьДанныеФормыНаСервере(ДанныеФормы)
// преобразуем данные формы в документ
Еда = ДанныеФормыВЗначение(ДанныеФормы,
Тип(“СправочникОбъект.Еда”));
Еда.Наименование = “Груша”;
Еда.Калорийность = 500;
// преобразуем документа обратно в данные формы
ЗначениеВДанныеФормы(Еда, ДанныеФормы);
КонецПроцедуры
/// Скачать и выполнить эти примеры на компьютере
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Источник
19.10.05 – 07:37
Нужно написать цикл по элементам справочника(не включая группы) Делаю
СпрНом=СоздатьОбъект(“Справочник.Номенклатура”);
СпрНом.ВыборГруппы(0);
СпрНом.ВыбратьЭлементы(1);
Пока СпрНом.ПолучитьЭлемент(0)=1 Цикл
Если СпрНом.ЭтоГруппа()=1 Тогда
Продолжить;
КонецЕсли;
Если Вопрос(СпрНом.Наименование, “Да+Нет” )= “Да” Тогда
СпрНом.ВидНоменклатуры=ВыбВидНом;
СпрНом.Родитель=Группа1;
СпрНом.Записать();
КонецЕсли;
КонецЦикла;
Но цикл прекращается после обработки первого элемента
1 – 19.10.05 – 07:50
зачем 0 в скобках???
2 – 19.10.05 – 07:54
0 — не надо включать подчиненные элементы.
3 – 19.10.05 – 07:58
СЗ = СоздатьОбъект(“СписокЗначений”);
СпрНом.ВыбратьЭлементы();
Пока СпрНом.ПолучитьЭлемент()=1 Цикл
Если СпрНом.ЭтоГруппа()=1 Тогда Продолжить;КонецЕсли;
Если Вопрос(СпрНом.Наименование, “Да+Нет” )= “Да” Тогда
СЗ.ДобавитьЗначение(СпрНом.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;
Для сч=1 По СЗ.РазмерСписка() Цикл
Эл = СЗ.ПолучитьЗначение(сч);
Если СпрНом.НайтиЭлемент(Эл) = 0 Тогда Продолжить; КонецЕсли;
СпрНом.ВидНоменклатуры=ВыбВидНом;
СпрНом.Родитель = Группа1;
СпрНом.Записать();
КонецЦикла;
4 – 19.10.05 – 08:05
MetaEditor, таким оьразом идет цикл по всем элемнетам , а мне нужно только те которые не включены в группы
5 – 19.10.05 – 08:12
4)Если СпрНом.Уровень()=1 Тогда … ?
6 – 19.10.05 – 08:46
у тебя выборка с учетом иерархии, при смене родителя выборка сбивается.
делай ВЫбратьЭлементы(0)
7 – 19.10.05 – 09:04
спр.ВыбратьЭлементы();
Пока спр.ПолучитьЭлемент() = 1 Цикл
Если (спр.Уровень() =1) и (спр.ЭтоГруппа() = 0) Тогда
Сообщить(спр.Наименование);
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
8 – 19.10.05 – 09:27
выборка у тебя сбивается при методе Записать() – поэтому и цикл прерывается после первого же элемента…
(3) – совершенно прав: выгружаешь нужные элементы или в сз или в тз, а потом во втором цикле их колбасишь…
9 – 19.10.05 – 09:34
8 сам по себе метод записать() выборку не сбивает
10 – 19.10.05 – 10:08
Надо ввести бан, за неправильные советы.
Правильный ответ (6)
11 – 19.10.05 – 10:56
(9) понятное дело, что если элемент справочника не был изменен, то записать – не приведен к сбою выборки… просто сам по себе подход – изменять элементы при обходе выборке – не правильный… вот я к чему, особенно это уже не первый раз встречается в топиках: то элементы справочника, то обход ТЗ, то документов…
12 – 19.10.05 – 12:01
(10) ты прав!!! и в первую очередь тебя забанить надо… потому что парамет 0 – тебе не поможет…
13 – 19.10.05 – 12:13
(12) Конечно, при смене родителя в выборке, параметр в выбратьэлементы(0) не поможет.
Но не поможет тебе. А у меня как раз сработает.
14 – 19.10.05 – 12:27
(13) проведем следственный эксперимент – сделай все, как в (0) (с учетом того, что родитель изменится прям при обходе элементов выборки… и посмотри, как он тебе помогает… или попробуй изменять коды элементов в той же выборке…
15 – 19.10.05 – 12:29
14 вот найдется же дятел…
сам и проверяй. у всех порядочных людей 6 сработает
16 – 19.10.05 – 12:44
(14) сам ты дятел, и еще какой!!! если ты получаешь элемент верхнего уровня с учетом иерархии, меняешь ему родителя, переходишь к обходу элементов того родителя, которого назначил, система измененный элемент опять будет брать по твоему, так как он уже в той группе, к обходу элементов которой перешли?
17 – 19.10.05 – 12:44
Мне не пора вмешаться?
18 – 19.10.05 – 13:14
(17) неа, “все только начинается” (с)
19 – 19.10.05 – 13:38
То есть ты хочешь только элементы первого уровня выбрать?
Спр=СоздатьОбъект(“Справочник.Номенклатура”);
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
Если (Спр.Уровень()=1) и (Спр.ЭтоГруппа()=0) Тогда
Сообщить(Спр.Наименование);
КонецЕсли;
КонецЦикла;
В общем тоже что и Черномор писал, только можно опустить “Иначе, Продолжить;”, так как это не имеет никакого смысла!
Источник
Цикл в программировании — это любая многократно исполняемая последовательность инструкций, организованная любым способом. Именно так описывается цикл во всех языках программирования. По сути циклы в 1С 8.3 не исключение. Но как всегда, каждый язык программирования имеет свою конструкцию, синтаксис, что выражаясь на обычном языке можно описать как правописание. Перейдем к изучении основных понятий и к примерам.
Цикл «Для…»
Оператор цикла Для предназначен для циклического повторения операторов, в конструкции Цикл – КонецЦикла. Условие выполнения цикла всегда проверяется в начале, перед выполнением цикла.
Для <Переменная> = <Знач1> По <Знач2> Цикл
// Код
КонецЦикла;
Где:
- Переменная является счетчиком и при каждом повторении цикла автоматически увеличивается на 1. Иначе говоря, это счетчик цикла.
- Знач1 число, которое задает начальное значение счетчику цикла.
- Знач2 число, которое задает максимальное значение счетчику цикла. Если значение счетчика цикла становится больше чем Знач2 цикл прекращается.
Пример 1 — Простой обход циклом с счетчиком
Для Сч = 1 По 10 Цикл
Сообщить(Сч); // Ответ – 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
КонецЦикла;
На данном примере счетчик цикла Сч при каждом входе в цикл увеличится на единицу, и пока не достигнет значению 11, цикл будет продолжаться.
Пример 2 — Обход с увеличением
Но, при решении конкретных задач, автоматическое увеличение значения счетчика цикла на единицу не всегда уместно. Так что же делать, ведь это же автоматическая функция?! Но всегда есть выход.
Рассмотрим конкретный пример в котором попробуем счетчику цикла задать шаг ровной к 5-и:
Для Сч = 0 По 50 Цикл
Сообщить(Сч); // Ответ – 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50
Сч = Сч + 5 – 1;
КонецЦикла;
Пример 3 — С выходом из цикла «Прервать» (проверка на вечный цикл)
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания – попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Приведем пример, где Сч, Счетчик, Сдвиг, Шаг, КоличествоСообщений являются переменными. Во избежание вхождения программы в вечный цикл, проводиться проверка и при необходимости цикл прерывается:
КолСообщений = 0;
Для Сч = Счетчик По Сдвиг Цикл
Сообщить(Сч);
КолСообщений = КолСообщений + 1;
Если КолСообщений > КоличествоСообщений Тогда
Сообщить (“Количество сообщений больше заданного значения. Цикл прерван!”);
Прервать;
КонецЕсли;
Сч = Сч + Шаг – 1;
КонецЦикла;
*Данный пример мы привели во внешней обработке.
Цикл «Для Каждого…»
Оператор цикла Для Каждого предназначен для циклического обхода коллекций значений. При каждой итерации цикла возвращается новый элемент коллекции. Обход осуществляется до тех пор, пока не будут перебраны все элементы коллекции.
Для Каждого <Переменная> Из < КоллекцияЗначений> Цикл
// Код
КонецЦикла;
- Переменная: при каждом входе в цикл переменной присваивается значение очередного элемента коллекции.
- КоллекцияЗначений: коллекция значений, элементы которой будут присваиваются переменной Переменная.
Пример 1 — Простой обход таблицы значения
Создадим таблицу значений. Как мы помним, делается это на сервере.
Таб = Новый ТаблицаЗначений;
Таб.Колонки.Добавить(“Автомобиль”);
Таб.Колонки.Добавить(“Класс”);
Таб.Колонки.Добавить(“Вес”);
Стр = Таб.Добавить();
Стр.Автомобиль = “KIA”;
Стр.Класс = “A Класс”;
Стр.Вес = 1100;
Стр = Таб.Добавить();
Стр.Автомобиль = “Ford”;
Стр.Класс = “B Класс”;
Стр.Вес = 1300;
Стр = Таб.Добавить();
Стр.Автомобиль = “BMW”;
Стр.Класс = “C Класс”;
Стр.Вес = 1400;
И так, мы создали таблицу значений. Вскроем таблицу, для лучшего понимания.
Индекс | Значение элемента | Тип элемента | Автомобиль | Класс | Вес |
СтрокаТаблицыЗначений | СтрокаТаблицыЗначений | «KIA» | «A Класс» | 1 100 | |
1 | СтрокаТаблицыЗначений | СтрокаТаблицыЗначений | «Ford» | «B Класс» | 1 300 |
2 | СтрокаТаблицыЗначений | СтрокаТаблицыЗначений | «BMW» | «C Класс» | 1 400 |
Теперь реализуем обход по коллекции с помощью цикла Для Каждого.
Для Каждого Ст Из Таб Цикл
Сообщить(“Автомобиль ” + Ст.Автомобиль + ” ” + Ст.Класс + “а имеет вес ” + Ст.Вес +” кг.”);
КонецЦикла;
// Ответ 1 – Автомобиль KIA A Класса имеет вес 1 100 кг.
// Ответ 2 – Автомобиль Ford B Класса имеет вес 1 300 кг.
// Ответ 3 – Автомобиль BMW C Класса имеет вес 1 400 кг.
Как мы видим, в каждой строке сообщения оказались данные одной машины, то есть присвоились значение очередного элемента коллекции переменной Ст.
*Данный пример мы привели во внешней обработке.
Пример 2 — Обход массива
Создадим еще одну коллекцию. Массив, в отличии от таблиц значений, можно создать на клиенте тоже.
МоиПодруги = Новый Массив;
МоиПодруги.Добавить(“Арина”);
МоиПодруги.Добавить(“Марина”);
МоиПодруги.Добавить(“Карина”);
Взглянем на коллекцию:
Индекс | Значение элемента | Тип элемента |
«Арина» | Строка | |
1 | «Марина» | Строка |
2 | «Карина» | Строка |
А теперь реализуем обход по коллекции, с помощью цикла Для Каждого:
Для Каждого Имя Из МоиПодруги Цикл
Сообщить(Имя);
КонецЦикла;
// Ответ 1 – Арина
// Ответ 2 – Марина
// Ответ 3 – Карина
Пример 3 — Оператор «Продолжить»
Еще один пример, где применим оператор Продолжить:
МоиЛюбимыеЦифры = Новый Массив;
МоиЛюбимыеЦифры.Добавить(3);
МоиЛюбимыеЦифры.Добавить(7);
МоиЛюбимыеЦифры.Добавить(8);
МоиЛюбимыеЦифры.Добавить(9);
Индекс | Значение элемента | Тип элемента |
3 | Число | |
1 | 7 | Число |
2 | 8 | Число |
3 | 9 | Число |
Для Каждого Ст Из МоиЛюбимыеЦифры Цикл
Если Ст <> 8 Тогда
Продолжить;
Иначе
Сообщить(“Я люблю цифру ” + Ст + “!”)
КонецЕсли;
КонецЦикла;
// Ответ – Я люблю цифру 8!
Цикл «Пока…»
Оператор цикла Пока предназначен для циклического повторения операторов, находящиеся внутри конструкции Цикл – КонецЦикла. Цикл выполняется, пока логическое выражение равно Истина. Условие выполнения цикла всегда проверяется вначале, перед выполнением цикла. (Описание: синтакс-помощник)
Пока <Выражение> Цикл
// Код
КонецЦикла;
Выражение: логическое выражение, в зависимости значения которой будет выполнятся, или не выполнятся цикл.
Пример 1 — Обход массива с счетчиком
МоиЛюбимыеКонфеты = Новый Массив ();
МоиЛюбимыеКонфеты.Добавить(“Снегурочка N1”);
МоиЛюбимыеКонфеты.Добавить(“Баядерка N2”);
МоиЛюбимыеКонфеты.Добавить(“Синяя птица N3”);
МоиЛюбимыеКонфеты.Добавить(“Красная Шапочка N4”);
Взглянем на коллекцию.
Индекс | Значение элемента | Тип элемента |
«Снегурочка N1» | Строка | |
1 | «Баядерка N2» | Строка |
2 | «Синяя птица N3» | Строка |
3 | «Красная Шапочка N4» | Строка |
Сч = 0;
Пока Сч < МоиЛюбимыеКонфеты.Количество() Цикл
Сообщить(МоиЛюбимыеКонфеты[Сч]);
Сч = Сч + 1;
КонецЦикла;
//Ответ 1 – Снегурочка N1
//Ответ 2 – Баядерка N2
//Ответ 3 – Синяя птица N3
//Ответ 4 – Красная Шапочка N4
Как мы знаем, индексы строк в коллекции начинаются с 0-я. Это прекрасно видно на развернутом виде коллекции.
- МоиЛюбимыеКонфеты.Количество() определяет количество срок в коллекции, что в данном случае рано 4-ом.
- МоиЛюбимыеКонфеты[Сч] определяет элемент коллекции по индексу, где Сч играет роль индекса, и при каждом входе в цикл прибавляется на единицу. Тем самим, мы с каждым разом обращаемся к следующей строке коллекции, начиная со строки с индексом 0. И цикл будет продолжаться, пока значение логического выражение Сч < МоиЛюбимыеКонфеты.Количество() не станет ровному Ложь.
*Данный пример мы привели во внешней обработке.
Пример 2 — Обратный цикл с счетчиком
Но можно получить тот же список, но в обратном порядке. Это называется обратный цикл, хотя на самом деле, этот тот же самый цикл Пока.
Обратимся к тому же массиву, но напишем код обратного цикла.
МоиЛюбимыеКонфеты = Новый Массив();
МоиЛюбимыеКонфеты.Добавить(“Снегурочка N1”);
МоиЛюбимыеКонфеты.Добавить(“Баядерка N2”);
МоиЛюбимыеКонфеты.Добавить(“Синяя птица N3”);
МоиЛюбимыеКонфеты.Добавить(“Красная Шапочка N4”);
Сч = МоиЛюбимыеКонфеты.Количество() – 1;
Пока Сч >= 0 Цикл
Сообщить(МоиЛюбимыеКонфеты[Сч]); // Среда Вторник Понедельник
Сч = Сч – 1;
КонецЦикла;
//Ответ 4 – Красная Шапочка N4
//Ответ 3 – Синяя птица N3
//Ответ 2 – Баядерка N2
//Ответ 1 – Снегурочка N1
Поясню, что счет индекса начинается с цифры равному количества строк -1, поскольку индекс последней строки ровно 3-ом. После, в каждом цикле, индекс уменьшается на единицу и тем самим мы обходим коллекцию с обратной стороны.
*Данный пример мы привели во внешней обработке.
«Прервать» и «Продолжить» в циклах 1С 8.3
Вы думаю заметили, что в нескольких циклах, мы специально показали действие операторов Прервать и Продолжить. Хотя слова сами говорят о себе, да и в циклах вполне понятны их действия, тем не менее в заключении статьи, поясним и действие этих операторов.
- Прервать: прерывает выполнение цикла в любой точке. После выполнение этого оператора цикл прекращается и управление передается следующему оператору, который находиться после ключевого слова КонецЦикла.
- Продолжить: возвращает управление в начало цикла. Операторы, следующие в теле цикла за оператором Продолжить, не выполняются в текущей итерации обхода.
Видео Школы 1С по теме циклов
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Источник