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

Вопрос по ветвлению (Если-ИначеЕсли)

Автор Артем Данилов, 20 сен 2017, 14:10

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

Артем Данилов

Всем привет!!!
Подскажите, пожалуйста. Дана рама (квадрат), внизу надо сделать отверстия шириной 30 мм. При выполнение этого скрипта, при ширине менее ~510мм. два отверстия встречаются, а как поправить скрипт, чтобы при менее 520 мм. отверстие было только одно? Я думаю надо добавить ветвление только не понимаю, как это реализовать.
Процедура ДобавитьОперации_Отверстия(Балка, СтрокаТаблицы, ТаблицаОпераций, СписокImpostPosition, СписокImpost, ЭтоДренаж = Ложь, НаправлениеДренажа = Неопределено)

Если НаправлениеДренажа = "Нет" Или НаправлениеДренажа = "Со стороны открывания" Тогда
// Если СтрокаТаблицы.Тип = 2 Тогда     // если это рама
// ЭтоДренаж = Ложь;
// Иначе
Возврат;
// КонецЕсли;
КонецЕсли;


Если СтрокаТаблицы.Тип = 1 Тогда
ТекстТипБалки = " (створка)";
ИначеЕсли СтрокаТаблицы.Тип = 2 Тогда
ТекстТипБалки = " (рама)";
Иначе
ТекстТипБалки = " (импост)";
КонецЕсли;

Корректировка = (СтрокаТаблицы.Длина - СтрокаТаблицы.Lenght)/2;

Если ЭтоДренаж Тогда

// ДРЕНАЖ ДЕЛАЕТСЯ ТОЛЬКО НА РАМУ(НИЖНЯЯ) И ИМПОСТ (ГОРИЗОНТАЛЬНЫЙ)
//  ЕСЛИ У ИМПОСТА ЕСТЬ СОЕДИНЕНИЕ С ДРУГИМ ИМПОСТОМ СНИЗУ, ТО ДРЕНАЖ НЕ ДЕЛАЕТСЯ

Если СтрокаТаблицы.Тип = 3 Тогда
Если Балка.ImpostList2.Count > 0 Тогда
//Возврат;
КонецЕсли;
КонецЕсли;


// ФОРМИРОВАНИЕ ДРЕНАЖА СОСТОИТ ИЗ ДВУХ ОПЕРАЦИЙ:
// 1. ДРЕНАЖ ОТ СТЕКЛА
// 2. ДРЕНАЖ ВЫВОД

КодОперацииОтСтекла = "Дренаж от стекла" + ТекстТипБалки;

Если СтрокаТаблицы.Тип = 3 Или  НаправлениеДренажа = Неопределено Тогда
ТекстНаправления = "";
Иначе
ТекстНаправления = " " + НРег(НаправлениеДренажа);
КонецЕсли;
КодОперацииВывод = "Дренаж" + ТекстНаправления + ТекстТипБалки;

ОтступПоФальцу = 70;
ОтступОтКраяИмпоста = 50;

СдвигОперации = 130; //50;

ПерваяКоордината = ОтступПоФальцу + Корректировка;
ПоследняяКоордината = Балка.LenghtC - ОтступПоФальцу + Корректировка;

Если Балка.Ang1 = 90 Тогда 
// начало отсчета по фальцу = началу балки
// ничего корректировать не нужно
ИначеЕсли Балка.Ang2 = 90 Тогда
// корректируем на разницу Lenght И LenghtC
КорректировкаПоФальцу = (Балка.Lenght-Балка.LenghtC);
ПерваяКоордината = ПерваяКоордината + КорректировкаПоФальцу;
ПоследняяКоордината = ПоследняяКоордината + КорректировкаПоФальцу;
Иначе
// корректируем на половину разницу Lenght И LenghtC
КорректировкаПоФальцу = (Балка.Lenght-Балка.LenghtC)/2;
ПерваяКоордината = ПерваяКоордината + КорректировкаПоФальцу;
ПоследняяКоордината = ПоследняяКоордината + КорректировкаПоФальцу;
КонецЕсли;

// Первая координата
КоординатаОперации = Окр(ПерваяКоордината);
ДобавитьОперацииДляАртикула(КодОперацииОтСтекла, ПерваяКоордината, СтрокаТаблицы.Номенклатура.Артикул, Истина);
ДобавитьОперацииДляАртикула(КодОперацииВывод, ПерваяКоордината+СдвигОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);

// Последняя координата
КоординатаОперации = Окр(ПоследняяКоордината);
ДобавитьОперацииДляАртикула(КодОперацииОтСтекла, ПоследняяКоордината, СтрокаТаблицы.Номенклатура.Артикул, Истина);
ДобавитьОперацииДляАртикула(КодОперацииВывод, ПоследняяКоордината-СдвигОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);


// если нет импостов просто равномерно распределяем по оставшейся длине
Если СписокImpostPosition.Count = 0 Тогда

ДлинаОтрезка = ПоследняяКоордината-ПерваяКоордината;
КоличествоОтверстий = Цел(ДлинаОтрезка/600);
ИнтервалОпераций = ДлинаОтрезка/(КоличествоОтверстий + 1);

Для сч=1 По КоличествоОтверстий Цикл
// КоординатаОперации = Окр(ИнтервалОпераций * сч + ПерваяКоордината);
// ДобавитьОперацииДляАртикула(КодОперацииОтСтекла, КоординатаОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);
// ДобавитьОперацииДляАртикула(КодОперацииВывод, КоординатаОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);
КонецЦикла;

Иначе
// если есть импоста, тогда считаем промежутки между ними как длина отдельной балки
// сохраняем координаты соединений в таблицу для сортировки по координатам
ТаблицаКоординатСоединений = Новый ТаблицаЗначений;
ТаблицаКоординатСоединений.Колонки.Добавить("КоординатаСоединения");
ТаблицаКоординатСоединений.Колонки.Добавить("ВеличинаОтступа");

Для ИтераторСписка = 0 По СписокImpostPosition.Count-1 Цикл
СтрокаКоординат = ТаблицаКоординатСоединений.Добавить();
СтрокаКоординат.КоординатаСоединения = СписокImpostPosition.Get_Item(ИтераторСписка);
СтрокаКоординат.ВеличинаОтступа = СписокImpost.get_item(0).C + ОтступОтКраяИмпоста;
КонецЦикла;

ТаблицаКоординатСоединений.Сортировать("КоординатаСоединения");

НачалоОтрезка = ПерваяКоордината;
Для Каждого СтрокаКоординат Из ТаблицаКоординатСоединений Цикл

КонецОтрезка = Окр(СтрокаКоординат.КоординатаСоединения + Корректировка - СтрокаКоординат.ВеличинаОтступа);

Если СтрокаТаблицы.Тип = 3 Тогда    //импост
// делаем по сторонам импоста от стекла и с отступом от импоста вывод

КоординатаОперации = КонецОтрезка;
ДобавитьОперацииДляАртикула(КодОперацииОтСтекла, КоординатаОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);
ДобавитьОперацииДляАртикула(КодОперацииВывод, СтрокаКоординат.КоординатаСоединения - СдвигОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);

КоординатаОперации = Окр(СтрокаКоординат.КоординатаСоединения + Корректировка + СтрокаКоординат.ВеличинаОтступа);
ДобавитьОперацииДляАртикула(КодОперацииОтСтекла, КоординатаОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);
ДобавитьОперацииДляАртикула(КодОперацииВывод, СтрокаКоординат.КоординатаСоединения + СдвигОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);

Иначе                            // рама
// делаем по сторонам импоста от стекла и под импостом вывод
КоординатаОперации = КонецОтрезка;
ДобавитьОперацииДляАртикула(КодОперацииОтСтекла, КоординатаОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);

КоординатаОперации = Окр(СтрокаКоординат.КоординатаСоединения + Корректировка + СтрокаКоординат.ВеличинаОтступа);
ДобавитьОперацииДляАртикула(КодОперацииОтСтекла, КоординатаОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);

ДобавитьОперацииДляАртикула(КодОперацииВывод, СтрокаКоординат.КоординатаСоединения + Корректировка, СтрокаТаблицы.Номенклатура.Артикул, Истина);

КонецЕсли;
ДлинаОтрезка = КонецОтрезка - НачалоОтрезка;

КоличествоОтверстий = Цел(ДлинаОтрезка/600);
ИнтервалОпераций = ДлинаОтрезка/(КоличествоОтверстий + 1);
Для сч=1 По КоличествоОтверстий Цикл
// КоординатаОперации = Окр(ИнтервалОпераций * сч + НачалоОтрезка);
// ДобавитьОперацииДляАртикула(КодОперацииОтСтекла, КоординатаОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);
// ДобавитьОперацииДляАртикула(КодОперацииВывод, КоординатаОперации+СдвигОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);
КонецЦикла;

НачалоОтрезка = Окр(СтрокаКоординат.КоординатаСоединения + Корректировка + СтрокаКоординат.ВеличинаОтступа);
КонецЦикла;
КонецЕсли;



//// ДРЕНАЖ ВЫВОД
//Если СтрокаТаблицы.Тип = 3 Или  НаправлениеДренажа = Неопределено Тогда
// ТекстНаправления = "";
//Иначе
// ТекстНаправления = " " + НРег(НаправлениеДренажа);
//КонецЕсли;
//
//КодОперации = "Дренаж" + ТекстНаправления + ТекстТипБалки;
//
//// если нет импостов просто равномерно распределяем по длине
//Если СписокImpostPosition.Count = 0 Тогда
//
// ДлинаОтрезка = ПоследняяКоордината-ПерваяКоордината;
// КоличествоОтверстий = Цел(ДлинаОтрезка/600)+1;             
// ИнтервалОпераций = ДлинаОтрезка/(КоличествоОтверстий + 1);
//
// Для сч=1 По КоличествоОтверстий Цикл
// КоординатаОперации = Окр(ИнтервалОпераций * сч + ПерваяКоордината);
// ДобавитьОперацииДляАртикула(КодОперации, КоординатаОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);
// КонецЦикла;
//Иначе
// // если есть импоста, тогда считаем промежутки между ними как длина отдельной балки
// // сохраняем координаты соединений в таблицу для сортировки по координатам
// ТаблицаКоординатСоединений = Новый ТаблицаЗначений;
// ТаблицаКоординатСоединений.Колонки.Добавить("КоординатаСоединения");
// ТаблицаКоординатСоединений.Колонки.Добавить("ВеличинаОтступа");
//
// Для ИтераторСписка = 0 По СписокImpostPosition.Count-1 Цикл
// СтрокаКоординат = ТаблицаКоординатСоединений.Добавить();
// СтрокаКоординат.КоординатаСоединения = СписокImpostPosition.Get_Item(ИтераторСписка);
// СтрокаКоординат.ВеличинаОтступа = СписокImpost.get_item(0).C + ОтступОтКраяИмпоста;
// КонецЦикла;
// СтрокаКоординат = ТаблицаКоординатСоединений.Добавить();
// СтрокаКоординат.КоординатаСоединения = ПоследняяКоордината;
// СтрокаКоординат.ВеличинаОтступа = 0;
//
//
//
// ТаблицаКоординатСоединений.Сортировать("КоординатаСоединения");
//
// НачалоОтрезка = ПерваяКоордината;
// Для Каждого СтрокаКоординат Из ТаблицаКоординатСоединений Цикл
//
// КонецОтрезка = Окр(СтрокаКоординат.КоординатаСоединения + Корректировка - СтрокаКоординат.ВеличинаОтступа);
// ДлинаОтрезка = КонецОтрезка - НачалоОтрезка;

// КоличествоОтверстий = Цел(ДлинаОтрезка/600)+1;
// ИнтервалОпераций = ДлинаОтрезка/(КоличествоОтверстий + 1);
// Для сч=1 По КоличествоОтверстий Цикл
// КоординатаОперации = Окр(ИнтервалОпераций * сч + НачалоОтрезка);
// ДобавитьОперацииДляАртикула(КодОперации, КоординатаОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);
// КонецЦикла;
//
// НачалоОтрезка = Окр(СтрокаКоординат.КоординатаСоединения + Корректировка + СтрокаКоординат.ВеличинаОтступа);
// КонецЦикла;
//КонецЕсли;



Иначе

// ОСУШЕНИЕ ПОЛОСТЕЙ ДЕЛАЕТСЯ ТОЛЬКО НА РАМУ (ВЕРХ, ИНОГДА НИЗ) И СТВОРКУ (ВЕРХ, НИЗ)
// ОСУШЕНИЕ СОСТОИТ ИЗ ДВУХ ОПЕРАЦИЙ:
// 1. ОСУШЕНИЕ ВЫВОД
// 2. ОСУШЕНИЕ ОТ СТЕКЛА

// ОСУШЕНИЕ ВЫВОД - делается с небольшим сдвигом от ОСУШЕНИЕ ОТ СТЕКЛА (в мм.)
//
КодОперацииОтСтекла = "Осушение от стекла" + ТекстТипБалки;
КодОперацииВывод = "Осушение вывод" + ТекстТипБалки;

СдвигОперации = 130; //50;

ОтступПоФальцу = 70;
ОтступОтКраяИмпоста = 50;

ПерваяКоордината = ОтступПоФальцу + Корректировка;
ПоследняяКоордината = Балка.LenghtC - ОтступПоФальцу + Корректировка;

Если Балка.Ang1 = 90 Тогда 
// начало отсчета по фальцу = началу балки
// ничего корректировать не нужно
ИначеЕсли Балка.Ang2 = 90 Тогда
// корректируем на разницу Lenght И LenghtC
КорректировкаПоФальцу = (Балка.Lenght-Балка.LenghtC);
ПерваяКоордината = ПерваяКоордината + КорректировкаПоФальцу;
ПоследняяКоордината = ПоследняяКоордината + КорректировкаПоФальцу;
Иначе
// корректируем на половину разницу Lenght И LenghtC
КорректировкаПоФальцу = (Балка.Lenght-Балка.LenghtC)/2;
ПерваяКоордината = ПерваяКоордината + КорректировкаПоФальцу;
ПоследняяКоордината = ПоследняяКоордината + КорректировкаПоФальцу;
КонецЕсли;

// Первая координата
КоординатаОперации = Окр(ПерваяКоордината);   
ДобавитьОперацииДляАртикула(КодОперацииОтСтекла, ПерваяКоордината, СтрокаТаблицы.Номенклатура.Артикул, Истина);

ДобавитьОперацииДляАртикула(КодОперацииВывод, КоординатаОперации + СдвигОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);

// Последняя координата
КоординатаОперации = Окр(ПоследняяКоордината); 
ДобавитьОперацииДляАртикула(КодОперацииОтСтекла, ПоследняяКоордината, СтрокаТаблицы.Номенклатура.Артикул, Истина);

ДобавитьОперацииДляАртикула(КодОперацииВывод, КоординатаОперации - СдвигОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);

// если нет импостов просто смотрим нужно ли добавить еще операцию
Если СписокImpostPosition.Count = 0 Тогда

Если СтрокаТаблицы.Lenght > 1000 Тогда // добавляем еще одну операцию (по госту если длина <1000 тогда 2, иначе 3

// КоординатаОперации = Окр((ПоследняяКоордината - ПерваяКоордината)/2 + ПерваяКоордината);
// ДобавитьОперацииДляАртикула(КодОперацииОтСтекла, КоординатаОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);
//
// ДобавитьОперацииДляАртикула(КодОперацииВывод, КоординатаОперации + СдвигОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);
КонецЕсли;

Иначе
// если есть импоста, тогда считаем промежутки между ними как длина отдельной балки
// сохраняем координаты соединений в таблицу для сортировки по координатам
ТаблицаКоординатСоединений = Новый ТаблицаЗначений;
ТаблицаКоординатСоединений.Колонки.Добавить("КоординатаСоединения");

Для ИтераторСписка = 0 По СписокImpostPosition.Count-1 Цикл
СтрокаКоординат = ТаблицаКоординатСоединений.Добавить();
СтрокаКоординат.КоординатаСоединения = СписокImpostPosition.Get_Item(ИтераторСписка);
КонецЦикла;
СтрокаКоординат = ТаблицаКоординатСоединений.Добавить();
СтрокаКоординат.КоординатаСоединения = СтрокаТаблицы.Lenght;

ТаблицаКоординатСоединений.Сортировать("КоординатаСоединения");

ПозицияИмпоста = 0;
        Для Каждого СтрокаКоординат Из ТаблицаКоординатСоединений Цикл
ДлинаОтрезка = СтрокаКоординат.КоординатаСоединения - ПозицияИмпоста;
Если ДлинаОтрезка > 1000 Тогда
//КоординатаОперации = Окр((ПоследняяКоордината - ПерваяКоордината)/2 + ПерваяКоордината);
//ДобавитьОперацииДляАртикула(КодОперацииОтСтекла, КоординатаОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);
//
//ДобавитьОперацииДляАртикула(КодОперацииВывод, КоординатаОперации + СдвигОперации, СтрокаТаблицы.Номенклатура.Артикул, Истина);
КонецЕсли;
ПозицияИмпоста = СтрокаКоординат.КоординатаСоединения;
КонецЦикла;
КонецЕсли;
КонецЕсли;

КонецПроцедуры

Артем Данилов


Golickoff

Зачем комментировать пост, в котором и без того не меньше полусотни комментариев?
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

AIFrame

Когда нужно как-то ограничить большой кусок кода в тонком месте, я использую переменные с булевом.
Типа:
НужноОдноОтверстие = ЛОЖЬ;
Если чтототам < 520 Тогда
    НужноОдноОтверстие = ИСТИНА;
КонецЕсли;

Или
НужноОдноОтверстие = ?(чтототам < 520, ИСТИНА, ЛОЖЬ);
Или
НужноОдноОтверстие = (чтототам < 520);

Ну и потом, в месте где нужно нарисовать одно или два
Если НужноОдноОтверстие Тогда
    // Делаем одно
Иначе
    // Делаем два
КонецЕсли;

И мое мнение - не можете понять собственный код, не видите последовательность его выполнения в момент написания - есть смысл начать с нуля, упрощать, создавать функции для рутинных толстых операций, внедрять флаги вместо лесенок Если Иначе Тогда. Со временем, когда опыта станет больше и вы научитесь мысленно компилить более сложный и изощренный код, в т.ч. чужой, проблема типа той, что в текущем топике, перестанет возникать (или быть проблемой).

Теги:

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

Рейтинг@Mail.ru

Поиск