Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 1C: Предприятие, SAP, ERP и учётные системы > 1с 7.7, Перечисление


Автор: MadMas 16.6.2008, 07:23
Задача:
В цикле нужно как-то пробегать значения перечисления и при совпадении представления устанавливать реквизит формы равный этому перечислению.

Например, есть перечисление виды договоров, состоящее из "НД"->"нетиповой доходный", "МСВ"->"Межсетевой".
Если переменная Дог="Межсетевой", реквизит формы должен принять значение ПЕречисление.ВидыДогоыоров.МСВ.

Как это реализовать? 

Автор: SaschaL 16.6.2008, 09:33
Не совсем понятно что вы хотите но я бы поступил так
Код

пока Справочник.получитьЭлемент() = 1 Цикл
        Если Дог = Перечисление.ВидыДоговора.Межсетевой тогда
                 //Ваши действия
                 ..............
        КонецЕсли;
КонецЦикла

Автор: MadMas 16.6.2008, 09:36
Нет, количество перечислений достаточно большое, простым "если" сравнение писать не хочется. Смысл в том чтобы в цикле сравнить пользовательское представление перечисления с имеющейся переменной, и при совпадении установить реквизиту это перечисление...

Автор: SaschaL 16.6.2008, 09:44
Ну просто так не обойти в цикле перечисления. Если только не добраться до них через метаданные.
Но вот вопрос вам ведь все равно придется сравнивать значения перечислений а это как я понимаю вам все равно не обойтись без логического Если?

можете более подробно осветить задачу, которую нужно выполнить?

Может что умное попытаюсь посоветовать. smile 

Автор: MadMas 16.6.2008, 09:51
Пишу обработку для переноса данных по согласованию. Перечислений куча, значений у перечислений тоже куча, если все сравнивать "Если", то можно сразу лизнуть розетку, это менее болезненно. Написала что-то наподобии этого:

Код

Для счетчик=1 По Перечисление.КД.КоличествоЗначений() Цикл 
если Перечисление.КД.ЗначениеПоНомеру(счетчик) = Категория Тогда
        КатегорияДоговора = Перечисление.КД.ЗначениеПоНомеру(счетчик);
КонецЕсли;
КонецЦикла;


Но застрялось на переменной КатегорияДоговора, ей ни в какую не хочет присваиваться значение перечисления (категорияДоговора -- реквизит формы с типом Перечисление.КД).

Дальше хуже, теперь при наличии равенства Перечисление.КД.ЗначениеПоНомеру(счетчик) = Категория (под отладчиком "Межсетевой"="Межсетевой"), не отрабатывается "Если ...", он просто делает вид что строки не эквивалентны :( 

Автор: SaschaL 16.6.2008, 10:07
Подумать дано! Если что вечеров отпишусь

Автор: Itsys 17.6.2008, 00:04
Попробуй так:
Код

Для счетчик=1 По Перечисление.КД.КоличествоЗначений() Цикл 
   Если СокрЛП(Перечисление.КД.ЗначениеПоНомеру(счетчик)) = СокрЛП(Категория) Тогда
        КатегорияДоговора = Перечисление.КД.ЗначениеПоНомеру(счетчик);
   КонецЕсли;
КонецЦикла;

Автор: MadMas 17.6.2008, 05:39
Ага, пробовала. Я почти все перепробовала -- с теоретической точки зрения код верен, под отладчиком все красиво и вроде бы должно это перечисление в реквизит вставать. Но ничего подобного :( МОжет это быть глюк 1С к-нить?

Автор: Itsys 17.6.2008, 12:39
В отладчике значения СокрЛП(Перечисление.КД.ЗначениеПоНомеру(счетчик)) и СокрЛП(Категория) смотрела? Они точно одинаковые?

Попробуй так:
Код

Для счетчик=1 По Перечисление.КД.КоличествоЗначений() Цикл 
    Если СокрЛП(Перечисление.КД.ЗначениеПоНомеру(счетчик)) = СокрЛП(Категория) Тогда
        КатегорияДоговора = Перечисление.КД.ЗначениеПоНомеру(счетчик);
    Иначе                                           
        Сообщить ("Тестируется " + СокрЛП(Перечисление.КД.ЗначениеПоНомеру(счетчик)));
        Если СтрДлина(СокрЛП(Категория)) <> СтрДлина(СокрЛП(Перечисление.КД.ЗначениеПоНомеру(счетчик))) Тогда
            Сообщить("Ай-яй-яй, строки разной длины");
        Иначе
            Для К = 1 По СтрДлина(СокрЛП(Категория)) Цикл
                Если Сред(СокрЛП(Категория), К, 1) <> Сред(СокрЛП(Перечисление.КД.ЗначениеПоНомеру(счетчик)), К, 1) Тогда
                    Сообщить("Ай-яй-яй, символ №" + К + " не совпадает");
                    Прервать;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Автор: MadMas 17.6.2008, 13:14
Однозначно одинаковые. Что-то с 1С странное, попробовала на другой машине -- заработал первый вариант. Спасибо )

Автор: bpgrey 24.6.2008, 11:09
кстати, по поводу перебора всех значений..
Работает такая конструкция:
Цитата

Для с=1 По метаданные.перечисление() Цикл
Для сс= 1 По метаданные.перечисление(с).значение() Цикл
Сообщить(""+метаданные.перечисление(с)+"  "+метаданные.перечисление(с).значение(сс))
КонецЦикла;
КонецЦикла;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)