7.7 Помогите рассчитать уровень ветки(вложенности?, ...) 1С7.7 бух dbf

Тема в разделе "Общие вопросы "1С:Предприятие 7.7"", создана пользователем Lsr, 12 дек 2012.

  1. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Lsr я же специально не использовал каких-то специфических операторов 8-ки (за исключением цикла ДЛЯ КАЖДОГО, но он напрямую заменяется циклом ДЛЯ ПО).
  2. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    все таки 8ка другая немного... массивы другие, структуры в 7ке нет, нет истины/ложь, в связи с этим конструкции другие..
    а цикл для каждого - к сожалению иногда не заменяется ни чем)
  3. TopicStarter Overlay
    Lsr
    Offline

    Lsr

    Регистрация:
    12 дек 2012
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    Фобец, запустил Ваш код. Выдало сообщение об ошибке. Извините, но разбираться не буду. Лучше я подожду пока Вы сами его запустите, чем копаться в чужом коде.
  4. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Под спойлером рабочий код.

    Код:
    Перем Ложь;
    Перем Истина;
    Перем ИсходныйСписокОтрезков;
    Перем ИндексВыбранногоОтрезка;
    
    
    Функция СоздатьОтрезок(НачалоОтрезка, КонецОтрезка)
    
    Отрезок = СоздатьОбъект("СписокЗначений");
    Отрезок.ДобавитьЗначение(НачалоОтрезка,"А");
    Отрезок.ДобавитьЗначение(КонецОтрезка, "Б");
    Возврат Отрезок;
    
    КонецФункции
    
    
    
    Процедура Добавить(МассивРезультат, ИндексОтрезка)
    
    МассивОтрезковУровня = СоздатьОбъект("СписокЗначений");
    МассивОтрезковУровня.ДобавитьЗначение(ИндексОтрезка);
    
    МассивРезультат.ДобавитьЗначение(МассивОтрезковУровня);
    
    КонецПроцедуры
    
    
    
    Процедура Вставить(МассивРезультат, ИндексОтрезка, Уровень)
    
    МассивОтрезковУровня = МассивРезультат.ПолучитьЗначение(Уровень);
    МассивОтрезковУровня.ДобавитьЗначение(ИндексОтрезка);
    
    КонецПроцедуры
    
    
    
    Функция ОтрезокВходитВИнтервал(ИндексОтрезка, ОтрезокИнтервал)
    
    Принадлежит = Ложь;
    
    Отрезок = ИсходныйСписокОтрезков.ПолучитьЗначение(ИндексОтрезка);
    
    Если (Отрезок.Получить("А") >= ОтрезокИнтервал.Получить("А")) И (Отрезок.Получить("Б") <= ОтрезокИнтервал.Получить("Б")) Тогда
    Принадлежит = Истина;
    КонецЕсли;
    
    Возврат Принадлежит;
    
    КонецФункции
    
    
    
    Функция ПолучитьСписокСвободныхОтрезков(МассивРезультат, Уровень)
    
    МассивСвободныхОтрезков = СоздатьОбъект("СписокЗначений");
    
    ИндексБазовогоОтрезка = МассивРезультат.ПолучитьЗначение(1).ПолучитьЗначение(1);
    БазовыйОтрезок = ИсходныйСписокОтрезков.ПолучитьЗначение(ИндексБазовогоОтрезка);
    
    МассивСвободныхОтрезков.ДобавитьЗначение(БазовыйОтрезок);
    
    МассивОтрезковУровня = МассивРезультат.ПолучитьЗначение(Уровень);
    Для ИндексОтрезкаУровня = 1 По МассивОтрезковУровня.РазмерСписка() Цикл
    ИндексОтрезкаУровняВИсходномСписке = МассивОтрезковУровня.ПолучитьЗначение(ИндексОтрезкаУровня);
    ОтрезокУровня = ИсходныйСписокОтрезков.ПолучитьЗначение(ИндексОтрезкаУровняВИсходномСписке);
    
    Для ИндексСвободногоОтрезка = 1 По МассивСвободныхОтрезков.РазмерСписка() Цикл
    ТекущийСвободныйОтрезок = МассивСвободныхОтрезков.ПолучитьЗначение(ИндексСвободногоОтрезка);
    Если ОтрезокВходитВИнтервал(ИндексОтрезкаУровняВИсходномСписке, ТекущийСвободныйОтрезок) = Истина Тогда
    Отрезок0А = ТекущийСвободныйОтрезок.Получить("А");
    Отрезок0Б = ОтрезокУровня.Получить("А");
    Отрезок1А = ОтрезокУровня.Получить("Б");
    Отрезок1Б = ТекущийСвободныйОтрезок.Получить("Б");
    
    МассивСвободныхОтрезков.УдалитьЗначение(ИндексСвободногоОтрезка);
    
    Если НЕ (Отрезок0А = Отрезок0Б) Тогда
    МассивСвободныхОтрезков.ДобавитьЗначение(СоздатьОтрезок(Отрезок0А, Отрезок0Б));
    КонецЕсли;
    
    Если НЕ (Отрезок1А = Отрезок1Б) Тогда
    МассивСвободныхОтрезков.ДобавитьЗначение(СоздатьОтрезок(Отрезок1А, Отрезок1Б));
    КонецЕсли;
    
    Прервать;
    КонецЕсли;
    КонецЦикла;
    
    КонецЦикла;
    
    Возврат МассивСвободныхОтрезков;
    
    КонецФункции
    
    
    
    Функция ОтрезокПринадлежитьОдномуИзОтрезковУровня(МассивРезультат, ИндексОтрезка, Уровень)
    
    МассивОтрезковУровня = МассивРезультат.ПолучитьЗначение(Уровень);
    
    Принадлежит = Ложь;
    
    Для ИндексОтрезкаУровня = 1 По МассивОтрезковУровня.РазмерСписка() Цикл
    ИндексОтрезкаУровняВИсходномМассиве = МассивОтрезковУровня.ПолучитьЗначение(ИндексОтрезкаУровня);
    Если ИндексОтрезкаУровняВИсходномМассиве = ИндексОтрезка Тогда //Сам с собой не сравниваем
    Продолжить;
    КонецЕсли;
    Если ОтрезокВходитВИнтервал(ИндексОтрезка, ИсходныйСписокОтрезков.ПолучитьЗначение(ИндексОтрезкаУровняВИсходномМассиве)) = Истина Тогда
    Принадлежит = Истина;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    
    Возврат Принадлежит;
    
    КонецФункции
    
    
    
    Функция ОтрезокПринадлежитьОдномуИзОтрезковПоследнегоУровня(МассивРезультат, ИндексОтрезка)
    
    ПоследнийУровень = МассивРезультат.РазмерСписка();
    
    Принадлежит = ОтрезокПринадлежитьОдномуИзОтрезковУровня(МассивРезультат, ИндексОтрезка, ПоследнийУровень);
    
    Возврат Принадлежит;
    
    КонецФункции
    
    
    
    Функция ОтрезокПринадлежитПустомуИнтервалу(МассивРезультат, ИндексОтрезка, Уровень)
    
    //Отрезок должен входить в занятый интервал ПРЕДЫДУЩЕГО уровня, ну и соответственно надо найти на каком уровне есть свободный интервал (еще раз: с учетом того что отрезок будет входить в занятый интервал ПРЕДЫДУЩЕГО уровня).
    Принадлежит = Ложь;
    
    Для Уровень = 2 по МассивРезультат.РазмерСписка() Цикл //Начинаем не с первого, а со второго уровня. На первый ничего добавить не можем
    
    ПринадлежитПредыдущемуУровню = ОтрезокПринадлежитьОдномуИзОтрезковУровня(МассивРезультат, ИндексОтрезка, Уровень - 1);
    Если ПринадлежитПредыдущемуУровню = Ложь Тогда // не принадлежит предыдущему уровню, дальше искать нельзя, возврат Ложь
    Прервать;
    КонецЕсли;
    
    СписокСвободныхОтрезков = ПолучитьСписокСвободныхОтрезков(МассивРезультат, Уровень);
    Для ИндексСвободногоОтрезка = 1 По СписокСвободныхОтрезков.РазмерСписка() Цикл
    Если ОтрезокВходитВИнтервал(ИндексОтрезка, СписокСвободныхОтрезков.ПолучитьЗначение(ИндексСвободногоОтрезка)) = Истина Тогда
    Принадлежит = Истина;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    
    Если Принадлежит = Истина Тогда //Нашли, дальше обходить уровни не надо
    Прервать;
    КонецЕсли;
    
    КонецЦикла;
    
    Возврат Принадлежит;
    
    КонецФункции
    
    
    
    Функция Главная(ИсходныйСписокОтрезков, ИндексВыбранногоОтрезка)
    
    МассивРезультат = СоздатьОбъект("СписокЗначений");
    
    Добавить(МассивРезультат, ИндексВыбранногоОтрезка);
    
    Для ИндексОтрезка = 1 По ИсходныйСписокОтрезков.РазмерСписка() Цикл
    
    Если ИндексОтрезка = ИндексВыбранногоОтрезка Тогда //Если это выбранный отрезок, то повторно его смотреть не надо
    Продолжить;
    КонецЕсли;
    
    Если ОтрезокПринадлежитьОдномуИзОтрезковПоследнегоУровня(МассивРезультат, ИндексОтрезка) = Истина Тогда
    Добавить(МассивРезультат, ИндексОтрезка);
    Продолжить;
    КонецЕсли;
    
    
    Уровень = 0;
    Если ОтрезокПринадлежитПустомуИнтервалу(МассивРезультат, ИндексОтрезка, Уровень) = Истина Тогда //Уровень - возвращаемое значение
    Вставить(МассивРезультат, ИндексОтрезка, Уровень);
    Продолжить;
    КонецЕсли;
    
    //Здесь выводим сообщение или как-то помечаем, что отрезок добавить не можем, поскольку некуда
    
    КонецЦикла;
    
    Возврат МассивРезультат;
    
    КонецФункции
    
    
    
    //*******************************************
    Процедура Сформировать()
    
    Результат = Главная(ИсходныйСписокОтрезков, ИндексВыбранногоОтрезка);
    
    //Вывод результата
    ОчиститьОкноСообщений();
    Для Уровень = 1 по Результат.РазмерСписка() Цикл
    Сообщить("Уровень " + Строка(Уровень));
    
    ЭлементыУровня = Результат.ПолучитьЗначение(Уровень);
    Для ИндексЭлементовУровня = 1 По ЭлементыУровня.РазмерСписка() Цикл
    ИндексЭлементаВИсходномСписке = ЭлементыУровня.ПолучитьЗначение(ИндексЭлементовУровня);
    Отрезок = ИсходныйСписокОтрезков.ПолучитьЗначение(ИндексЭлементаВИсходномСписке);
    Сообщить("  Отрезок " + Отрезок.Получить("А") + " - " + Отрезок.Получить("Б"));
    КонецЦикла;
    
    КонецЦикла;
    
    КонецПроцедуры
    
    
    
    ИсходныйСписокОтрезков = СоздатьОбъект("СписокЗначений");
    //ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(1,5));
    //ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(1,3));
    //ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(6,9));
    //ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(6,8));
    //ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(7,8));
    //ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(3,5));
    //ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(4,5));
    //ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(1,40));
    //ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(8,35));
    //ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(9,15));
    //ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(9,18));
    //ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(1,14));
    //ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(1,9));
    //ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(18,18));
    //ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(2,14));
    ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(1,5));
    ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(6,8));
    ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(1,2));
    ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(6,9));
    ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(7,8));
    ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(3,5));
    ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(4,5));
    ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(1,40));
    ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(8,35));
    ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(9,15));
    ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(9,18));
    ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(1,14));
    ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(1,9));
    ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(18,18));
    ИсходныйСписокОтрезков.ДобавитьЗначение(СоздатьОтрезок(2,14));
    ИндексВыбранногоОтрезка = 13;
    Ложь = 0;
    Истина = 1;
    

    [off]
    Ну в данном конкретном случае - заменить абсолютно не проблема. )
    [/off]
  5. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    кстати, shurikvz не плох судя по коду, у него решение на сз, немного громоздко выглядит.. более подробно смогу посмотреть свой код и код Шурика только в пон. по быстродействию списки должны быть шустрее, чем парсинг строки, хотя циклов немало - в пон. сравним результаты)




    [off] P.S.: Lsr - не хватает вам все-таки любознательности, хотя задачу обозначаете вы, и участие пользователей форума, является лишь добровольным решением "поразмять мозги"..) [/off]
  6. TopicStarter Overlay
    Lsr
    Offline

    Lsr

    Регистрация:
    12 дек 2012
    Сообщения:
    11
    Симпатии:
    0
    Баллы:
    1
    shurikvz, спасибо. Проверил. Работает!!! Мне приятно, что мой топик о помощи вызвал живой интерес у профи. И очень приятно, что Вы его решили совсем другим способом, чем Ёпрст4 с мисты. Желаю Вам всяческих успехов.
    Уважаемый Фобец, любознательности у меня через край. Чего мне не хватает, так это времени.
    Я предполагаю, что этой фразой Вы хотели сказать, что я должен был принимать в форуме более активное участие, например, выложить свой вариант кода. Как показало время, моё поведение на форуме оказалось действенным. Как я уже где-то писал, мой код "индусский". Итак на мисте было больше понтов, чем конструктивизма, а если бы я выложил свой код, то всё свелось бы к обсуждению какой я лох и решения не было бы. Но как Вы наверно заметили, я предложил несколько ссылок, в которых были элементы логики решения моей задачи. К тому же это я на форумах описал алгоритм для решения своего вопроса. Поэтому, если я Вас правильно понял, то вынужден с Вами не согласиться.
    Однако я хочу именно Вам, господин Фобец, высказать своё особое спасибо и почтение. Именно Вы, без понтов и ёрничества, первым предложили реальный код для решения задачи. И как Вы сами заметили, часть Вашего кода очень многим понравилась, в том числе и мне. Возможно, именно Ваш поступлок сподвигнул Ёпрст4 напрячься по полной. И пусть Вас не смущает, что первым рабочий код выложил Ёпрст4. Меня, например, не смущает, что первый рабочий код (позже я нашел у себя ошибку) был у меня, но никто этого не узнает. И что для меня это была не разминка мозгов, а его многократное кипячение.
    Ещё раз ОГРОМНОЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Вам спасибо и успехов в жизни
  7. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Отмечаю тему как решенную.
    Хотел бы только заметить, уважаемый Lsr, что на данном сайте "спасибо" принято выражать кнопкой повышения рейтинга.
  8. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    [off]
    Ну у нас не миста. На мисте действительно могут и дятлом обозвать, а решения не предложить. Но с другой стороны то, что там спецы нормальные есть отрицать нельзя.
    У нас здесь поспокойней. Могут конечно тоже постебаться, но перегибов нет, следим за этим по мере возможности.
    [/off]
Похожие темы
  1. Pasha
    Ответов:
    9
    Просмотров:
    2.014
  2. oleg4mok
    Ответов:
    1
    Просмотров:
    306
  3. Tiger86
    Ответов:
    8
    Просмотров:
    429
Загрузка...

Поделиться этой страницей