Имя: Пароль:
1C
1С v8
OLE перенос справочников из 82 в 77, сохраняя иерархию.
,
0 maxstore
 
30.11.11
12:49
Цель: Перенести справочники из 7ки в 8ку. Как перенести, сохраняя иерархию?
Делаю: Подключился из 82 к 77 по OLE. Перебираю справочник из 77. Но у перебираемых элементов свойства Родитель нет.
Как быть?
<kod>
   СпрТМЦ = v77.CreateObject("Справочник.ТМЦ");
   СпрТМЦ.ВыбратьЭлементы();
   
   Пока СправочникТМЦ.ПолучитьЭлемент()=1 Цикл
       
           НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
           НовыйЭлемент.Наименование = СправочникТМЦ.Наименование;
           
           Если Справочники.Номенклатура.НайтиПоНаименованию(СправочникТМЦ.Родитель,Истина)<>Неопределено Тогда
               НовыйЭлемент.Родитель = Справочники.Номенклатура.НайтиПоНаименованию(СправочникТМЦ.Родитель,Истина);
           Иначе
               НоваяГруппа = Справочники.Номенклатура.СоздатьГруппу();
               НоваяГруппа.Наименование = СправочникТМЦ.Наименование;
               НоваяГруппа.Записать();    
               НовыйЭлемент.Родитель = Справочники.Номенклатура.НайтиПоНаименованию(СправочникТМЦ.Родитель,Истина);
           КонецЕсли;
           
           НовыйЭлемент.Записать();            

   КонецЦикла;
</kod>

В данном примере СправочникТМЦ.Наименование работает нормально, но СправочникТМЦ.Родитель ничего не получаем.
1 Гефест
 
30.11.11
12:51
СправочникТМЦ.Родитель.Наименование
2 Ёпрст
 
30.11.11
12:51
(0) СправочникТМЦ.Родитель.Наименование, если что
3 maxstore
 
30.11.11
12:57
Точно, спасибо!
4 maxstore
 
30.11.11
14:38
Подскажите, пожалуйста, как получить значение реквизита ОЛЕ объекта с типом Перечисление?

Например, СправочникТМЦ.БазЕдиница, где БазЕдиница, соответственно реквизит перечисление
5 maxstore
 
30.11.11
14:48
Я так понимаю, что можно получить в переменную значение перечисления, напр.

ЕдИзмеренияШтуки = v77.Перечисление.Единицы.шт;

и потом сравнить

Если СправочникТМЦ.БазЕдиница = ЕдИзмеренияШтуки Тогда
....

Но даже, если так будет работать, что если в перечислении единица более 20 значений, не создавать же 20 переменных и потом 20 сравнений, чтобы найти нужное значение..
6 Шапокляк
 
30.11.11
14:52
(5) А Индекс() у перечисления не поможет?
7 maxstore
 
30.11.11
15:08
(6) Имеете ввиду СправочникТМЦ.БазЕдиница.Индекс()?

Такого метода нет у объекта в базе из которой получаем этот самый объект OLE
8 maxstore
 
30.11.11
15:26
Текущие выводы:

Просто получить значение реквизита справочника с типом Перечисление - не получится.

Сравнивать на оно это или нет, приходится с каждым значением перечисления и столько раз, сколько этих значений предыдущий программист напридумал.

Получается громоздкий код, типа такого

<kod>
           Если СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.шт Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("шт",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("шт",Истина);
               КонецЕсли;                
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.кг Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("кг",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("кг",Истина);
               КонецЕсли;    
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.комплект Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("комплект",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("комплект",Истина);
               КонецЕсли;
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.тонна Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("тонна",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("тонна",Истина);
               КонецЕсли;
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.вагон Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("вагон",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("вагон",Истина);
               КонецЕсли;
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.литр Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("литр",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("литр",Истина);
               КонецЕсли;
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.бутылка Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("бутылка",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("бутылка",Истина);
               КонецЕсли;
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.грамм Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("грамм",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("грамм",Истина);
               КонецЕсли;
               
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.упаковка Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("упаковка",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("упаковка",Истина);
               КонецЕсли;
               
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.ящик Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("ящик",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("ящик",Истина);
               КонецЕсли;
               
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.пачка Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("пачка",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("пачка",Истина);
               КонецЕсли;
               
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.блок Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("блок",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("блок",Истина);
               КонецЕсли;
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.коробка Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("коробка",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("коробка",Истина);
               КонецЕсли;
               
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.контейнер Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("контейнер",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("контейнер",Истина);
               КонецЕсли;
               
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.поддон Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("поддон",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("поддон",Истина);
               КонецЕсли;
               
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.цистерна Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("цистерна",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("цистерна",Истина);
               КонецЕсли;
               
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.метр Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("метр",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("метр",Истина);
               КонецЕсли;
               
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.километр Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("километр",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("километр",Истина);
               КонецЕсли;
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.квадрметр Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("квадрметр",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("квадрметр",Истина);
               КонецЕсли;
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.кубометр Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("кубометр",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("кубометр",Истина);
               КонецЕсли;
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.экземпляр Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("экземпляр",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("экземпляр",Истина);
               КонецЕсли;
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.киловаттчас Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("киловаттчас",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("киловаттчас",Истина);
               КонецЕсли;
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.место Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("место",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("место",Истина);
               КонецЕсли;
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.погонныйметр Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("погонныйметр",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("погонныйметр",Истина);
               КонецЕсли;
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.грн Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("грн",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("грн",Истина);
               КонецЕсли;
           ИначеЕсли СправочникТМЦ.БазЕдиница = v77.Перечисление.Единицы.час Тогда
               Если НЕ Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("час",Истина).Пустая() Тогда
                   ЕдИз = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("час",Истина);
               КонецЕсли;
           КонецЕсли;

</kod>

Возможно есть более удобное и лаконичное решение.
9 maxstore
 
30.11.11
16:27
Строковое значение реквизита с типом перечисления можно получить методом Идентификатор()

Напр.
<kod>
Значение = Справочник.Перечисление.Идентификатор();
</kod>

Как всегда, все просто
10 Шапокляк
 
01.12.11
09:54
(7) Ну... не до такой степени
ИндексОлеБазы=Перечисление.БазЕдиницы.индекс(ВашЭлементСправочникаТМЦПролученныйОлей.БазЕдиница) - в подключенной базе
У себя ТакоеТоЗначениеПеречисления=Перечисления.БазЕдиницы.Получить(ИндексОлеБазы)
как-то так
11 Шапокляк
 
01.12.11
09:58
+(10) но ваш способ (9) лучше
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn