Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
18 апр 2024, 11:14

Как остановить цикл

Автор Voodi86, 08 апр 2013, 23:36

0 Пользователей и 1 гость просматривают эту тему.

Voodi86

Здравтсвуйте,
Помогите пожалуйста решить проблему. У меня есть внешняя обработка. в ней настроина возможность печати этикетки, проблема заключается в том, что программа должна печатать товар на котором в таблице стоит товар + ниже по списку услуги к этому товару. У меня сейчас либо печатается все товары в одну этикетку либо только один товар, без услуг. Есть такой цикл:
Макет = ПолучитьМакет("Этикетка");
   ОблКарт = Макет.ПолучитьОбласть("Картинки");
   ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
   ОбластьМакета.Параметры.Номер = СсылкаНаОбъект.Номер;
   ОбластьМакета.Параметры.Дата = СсылкаНаОбъект.Дата;
   ОбластьМакета.Параметры.ДатаОтгр = СсылкаНаОбъект.ДатаОтгрузки;
   ТабДокумент.Вывести(ОбластьМакета);
   СтрМат = ЭтаФорма.ЭлементыФормы.ТаблицаМатериалов.ТекущиеДанные;
   Для каждого СтрМат Из Материалы Цикл
      Если СтрМат.Материал.Услуга Тогда
         Если ЭтоОбработкаКромок(СтрМат.Материал) Тогда
            ОбластьМакета = Макет.ПолучитьОбласть("Кромка");
            КартинкаПоТипуКромки(ОблКарт, ОбластьМакета, СтрМат.ОбрКромок);
         Иначе
            ОбластьМакета = Макет.ПолучитьОбласть("Услуга");
            Если ЭтоМатирование(СтрМат.Материал) Тогда
               ОбластьМакета.Параметры.Площадь = СтрМат.Площадь;
               ОбластьМакета.Параметры.Длина = СтрМат.Длина;
               ОбластьМакета.Параметры.Высота = СтрМат.Высота;
            ИначеЕсли СтрМат.Материал.ЕдиницаХраненияОстатков.ЕдиницаПоКлассификатору = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("m2") Тогда
               ОбластьМакета.Параметры.Площадь = СтрМат.Площадь;
               ОбластьМакета.Параметры.Длина = СтрМат.Длина;
               ОбластьМакета.Параметры.Высота = СтрМат.Высота;
            Иначе
               ОбластьМакета.Параметры.Колво = СтрМат.Количество;
            КонецЕсли;
         КонецЕсли;
      Иначе
         ОбластьМакета = Макет.ПолучитьОбласть("Материал");
         ОбластьМакета.Параметры.Высота = СтрМат.Высота;
         ОбластьМакета.Параметры.Длина = СтрМат.Длина;
         ОбластьМакета.Параметры.Колво = СтрМат.Количество;
               КонецЕсли;
      ОбластьМакета.Параметры.Материал = СтрМат.Материал.НаименованиеПолное;
      ТабДокумент.Вывести(ОбластьМакета);
   КонецЦикла;
В этом примере, он берет все товары и к ним услуги. и это. как я понимаю из за Для каждого СтрМат Из Материалы Цикл. Как мне прописать, что бы он брал только один товар и к нему услуги. Или что бы цтикл останавливался, когда дойдет до следующего товара.

SlazZy

А вы уверены, что вы правильно спроектировали структуру документа(ну или из чего вы печатаете?), просто условие-то можно поставить на неравестно.
Например в одной переменной вы запоминаете текущий товар и на каждом витке цикла сравниваете не изменился ли товар, если изменился тогда Прервать

Но вообще, мне кажется тут имеет смысл сделать 2 табличные части, в одной только товары, во второй услуги со ссылкой на товар - вам так было бы намного проще анализировать, или хотя бы добавить в эту табличную часть реквизит "товар" и заполнять его у услуг. Это более устойчивое соответствие, чем просто перебирать всё подряд.

Voodi86

Разделить на два документа не получится никак. Другие возможности обработку не позволяют этого.
Добавлено: 09 апр 2013, 00:04


Например в одной переменной вы запоминаете текущий товар и на каждом витке цикла сравниваете не изменился ли товар, если изменился тогда Прервать.

Подскажите пожалуйста, как правельно праписать код, что бы прервалась процедура, когда поменяется товар. У меня переменная запоминает товар, на котором стоит курсор. Потом ниже по списку идут услуги к этому товаруб и надо прервать цикл, когда будут пройдены услуги, и цикл дойдет до другого товара. Может пример где есть?


Dethmontt

Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Dethmontt

Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

SlazZy

Voodi86, судя по тому, что я вижу - ваш цикл работает совсем не так, как вы думаете :)
сначала вы устанавливаете ссылку на текущие данные(если это ТЧ, то это ДанныеФормыСтруктура, если я ничего не путаю) в любом случае это не товар, это коллекция, в которой содержатся либо данные строки, либо неопределено.

Потом вы в цикле ПЕРЕОПРЕДЕЛЯЕТЕ эту переменную, то есть фактически затираете то, что сделали предыдущим действием. И перебираете элементы некой коллекции Материалы...
В общем, обработку в студию :)

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск