Вход | Регистрация

1С:Предприятие ::

Метки:Встроенный язык

Косяки с "Перечислением"

Я
   Diter
20.07.04 - 16:43
Пытаюсь программно создать элемент справочника. Среди реквизитов справочника есть реквизит типа "перечисление". Есть строка типа
"Перечисление.ВидПеречисления.ЗначениеПеречисления" т.е. мне известно что там должно быть (значение этого реквизита элемента справочника).
Пытаюсь сделат так
Для Ном=1 По Метаданные.Перечисление() Цикл
Если Метаданные.Перечисление(ВидПеречисления).Значение(Ном).Представление=ЗначениеПеречисления Тогда
Справ.УстановитьАтрибут(Реквизит,Метаданные.Перечисление(ВидПеречисления).Значение(Ном));
Прервать;
КонецЕсли;    
КонецЦикла;
Записываю элемент справочника и нифига - поле пустое. Как мне установить значение этого реквизита? Помогите
 
 
   Guk
 
1 - 20.07.04 - 16:47
(0) А кусок рабочего кода, нельзя предоставить? Из (0) ничего не понятно...
   Diter
2 - 20.07.04 - 16:55
Ок кусок кода :
немного описания - таблицаданных - ТЗ в которой храняться данные для создания элементов справочника. Каждая колонка - реквизит справочника т.е. имя колонки - реквизит, тип колонки - тип реквизита, кроме случая с перечислением - в этом случае тип колонки - строка. Если значение представляет собой перечисление, то оно записано в виде, указанном в (0).
Идёт перебор колонок с заполнением соответствующих реквизитов справочника :
Кол=3;
        Пока Кол<=ТаблицаДанных.КоличествоКолонок() Цикл
            Тип_Вид="";
            Реквизит=ТаблицаДанных.ПолучитьПараметрыКолонки(Кол,Тип_Вид);
            Значение=СокрЛП(ТаблицаДанных.ПолучитьЗначение(СтрокаПоиска,Кол));
            Поз=Найти(Тип_Вид,".");
            Тип=Сред(Тип_Вид,1,Поз-1);
            Вид=Сред(Тип_Вид,Поз+1);
            Сообщить("Тип "+Тип);
            Сообщить("Вид"+Вид);
            Если Тип="Строка" Тогда
               // проверим вдруг это перечисление

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

                    Справ.УстановитьАтрибут(Реквизит,Значение);    
                КонецЕсли;
            Иначе
               // устанавливаем значение

                Справ.УстановитьАтрибут(Реквизит,Значение);
            КонецЕсли;
            Кол=Кол+1;    
        КонецЦикла;
        Справ.Записать();
   Z1
3 - 20.07.04 - 17:04
(0) Кто тебе сказал что Метаданные эквивалентны перечислению ?

Надо использовать
ПолучитьАтрибут(<ИмяВидаПеречисл>) и не мучиться.
Далее выставляешь конкрет значение либо по номеру либо по идентефикатору.
   Diter
3 - 20.07.04 - 17:04
Всем спасибо. На Т1С ответили всё работает.
   Druid_2001
5 - 20.07.04 - 17:06
Попробуй использовать кусок кода из нижеприведенного примера
Для а = 1 по М.РеквизитШапки() Цикл
    ИмяРеквизита = М.РеквизитШапки(а);
    ЗначениеРеквизита = Док.ПолучитьАтрибут(ИмяРеквизита);
    ЗначениеЭталона = ДокЭталон.ПолучитьАтрибут(ИмяРеквизита);
    ТипРеквизита = ТипЗначения(ЗначениеРеквизита);
    Если ТипЗначения(ЗначениеЭталона) <> ТипРеквизита Тогда
        Если ТипРеквизита = 10 Тогда
        ДокЭталон.НазначитьТип(ИмяРеквизита, "Перечисление."+ЗначениеРеквизита.Вид());
                Иначе
        ДокЭталон.НазначитьТип(ИмяРеквизита, ТипЗначенияСтр(ЗначениеРеквизита));
        КонецЕсли;
    КонецЕсли;
    ДокЭталон.УстановитьАтрибут(ИмяРеквизита, ЗначениеРеквизита);
    ЗначениеЭталона = ДокЭталон.ПолучитьАтрибут(ИмяРеквизита);
КонецЦикла;


Список тем форума
Рекламное место пустует   Рекламное место пустует
Миста — веселый ресурс со своими эксклюзивными тараканами Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует