Версия для печати темы (https://pro1c.org.ua/index.php?s=044502d28f38ec2905d9ebe090ab9c67&showtopic=20450)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Обмен данными через СОМConnector

Автор: kosalex 28.10.14, 9:56

День добрый!
Подскажите, подключаюсь к базе 1С через СОМконнектор, делаю запрос к РС, в РС есть реквизит "СостояниеВагона" - Перечисление. Когда выгружаю запрос в таблицу значений, то на месте СостояниеВагона получается ComОбъект, как мне в таком случае найти нужное мне перечисление в базе приемнике и подставить его?

Автор: Petre 28.10.14, 9:59

Получить строку его имени, найти соответствующее в базе-клиенте.

Автор: Ardi 28.10.14, 9:59

http://pro1c.org.ua/index.php?showtopic=218

Автор: kosalex 28.10.14, 12:05

Цитата(Petre @ 28.10.14, 9:59) *
Получить строку его имени, найти соответствующее в базе-клиенте.


Имею вот такой код:
СОМСоединение = Новый COMОбъект("V83.ComConnector");
Сервер = "***";
ИмяБазы = "***";
Пользователь = "***";
Пароль = "***";
СтрокаПодключения = "Srvr = '" + Сервер + "';" + "Ref = '" + ИмяБазы + "';" + "Usr = '" + Пользователь + "';" + "Pwd = '" + Пароль + "';";

БазаИсточник = СОМСоединение.Connect(СтрокаПодключения);
БазаИсточник_Запрос = БазаИсточник.Newobject("Запрос");

ТекстЗапроса = "ВЫБРАТЬ
|    ПростойВагона.Период,
|    ПростойВагона.НомерВагона,
|    ПростойВагона.ПрибытияВагона,
|    ПростойВагона.УстановкаПодВыгрузку,
|    ПростойВагона.ОкончаниеВыгрузки,
|    ПростойВагона.ПрибытиеДокументовПослеДекларирования,
|    ПростойВагона.ПрибытиеИнструкцийВОтправкуПОРПВ,
|    ПростойВагона.УстановкаПодПогрузку,
|    ПростойВагона.ОкончаниеПогрузки,
|    ПростойВагона.ПрибытиеДокументовПослеТаможирования,
|    ПростойВагона.ВозвратПВст,
|    ПростойВагона.ВесПоПрибытию,
|    ПростойВагона.Ответственный,
|    ПростойВагона.СостояниеВагона,
|    ПростойВагона.ПринадлежностьВагона,
|    ПростойВагона.НоменклатураПрибытие,
|    ПростойВагона.НоменклатураОтправка
|ИЗ
|    РегистрСведений.ПростойВагона КАК ПростойВагона";

БазаИсточник_Запрос.Текст = ТекстЗапроса;

ТаблицаДанныхИсточникСОМОбъект = БазаИсточник_Запрос.Выполнить().Выгрузить();
СОМСоединение = Неопределено;
    
ТЗДанныеИсточник = Новый ТаблицаЗначений;

КЧ = Новый КвалификаторыЧисла(6,3);
ОписаниеТиповЧ = Новый ОписаниеТипов("Число",,,КЧ);

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




Для Каждого Строка Из ТаблицаДанныхИсточникСОМОбъект Цикл
    СтрокаТЗ = ТЗДанныеИсточник.Добавить();
    ЗаполнитьЗначенияСвойств(СтрокаТЗ,Строка,,);
КонецЦикла;


Как получить имя? Если можно, то на моем примере

Если написать вот так:
ЭлементПеречисленияИсточникГруженый = БазаИсточник.Перечисления.СостояниеВагонов.Груженый.Метаданные().Имя
, то получаю имя самого перечисления, а не имя его значения

Автор: Ardi 28.10.14, 12:28

http://pro1c.org.ua/redirect.php?http://www.forum.mista.ru/topic.php?id=517668

Автор: kosalex 29.10.14, 18:37

Помогите пожалуйста, никак не получается....(((

Как получить наименование перечисления с базе источнике?

Пишу так:

ЭлементПеречисленияИсточникГруженый = XMLСтрока(БазаИсточник.Перечисления.СостояниеВагонов.Груженый);
ЭлементПеречисленияИсточникПорожний = XMLСтрока(БазаИсточник.Перечисления.СостояниеВагонов.Порожний);


Ошибка!


Пишу так:
ЭлементПеречисленияИсточникГруженый = БазаИсточник.Перечисления.СостояниеВагонов.Груженый.Метаданные().Имя
, то получаю имя самого перечисления, а мне нужно имя его значения.

Плиз! Подскажите...

Автор: alex040269 30.10.14, 8:02

Сообщить(БазаИсточник.Перечисления.СостояниеВагонов.Индекс(БазаИсточник.Перечисления.СостояниеВагонов.Порожний))


ЭлементПеречисленияИсточникПорожний = БазаИсточник.XMLСтрока(БазаИсточник.Перечисления.СостояниеВагонов.Порожний)

Автор: Batchir 30.10.14, 10:45

ИндексПеречисления = База.Перечисления [ИмяПеречисления] .Индекс(КомОбъект);
ИмяЗначенияПеречисления = База.Метаданные().Перечисления[ИмяПеречисления].EnumValues.Get(ИндексПеречисления).Name;
ЗначениеПеречисления = Перечисления[ИмяПеречисления] [ИмяЗначенияПеречисления];

Автор: kosalex 30.10.14, 13:39


Автор: Batchir 30.10.14, 14:40

Для Каждого Строка Из ТаблицаДанныхИсточникСОМОбъект Цикл
    СтрокаТЗ = ТЗДанныеИсточник.Добавить();
    ЗаполнитьЗначенияСвойств(СтрокаТЗ,Строка,,);

    ИмяПеречисления = "СостояниеВагона";
    КомОбъект = Строка [ИмяПеречисления];
    
    ИндексПеречисления = БазаИсточник .Перечисления [ИмяПеречисления] .Индекс(КомОбъект);
    ИмяЗначенияПеречисления = БазаИсточник .Метаданные().Перечисления[ИмяПеречисления].EnumValues.Get(ИндексПеречисления).Name;
    ЗначениеПеречисления = Перечисления[ИмяПеречисления] [ИмяЗначенияПеречисления];

    СтрокаТЗ [ИмяПеречисления] = ЗначениеПеречисления;

КонецЦикла;


Как-то так.

Но я бы дополнительно посоветовал сохранять найденные соответствия в какой-то кэш и если в нем не найдено, то лезть в БазаИсточник за данными

Автор: kosalex 30.10.14, 15:11

Цитата(Batchir @ 30.10.14, 14:40) *
Для Каждого Строка Из ТаблицаДанныхИсточникСОМОбъект Цикл
    СтрокаТЗ = ТЗДанныеИсточник.Добавить();
    ЗаполнитьЗначенияСвойств(СтрокаТЗ,Строка,,);

    ИмяПеречисления = "СостояниеВагона";
    КомОбъект = Строка [ИмяПеречисления];
    
    ИндексПеречисления = БазаИсточник .Перечисления [ИмяПеречисления] .Индекс(КомОбъект);
    ИмяЗначенияПеречисления = БазаИсточник .Метаданные().Перечисления[ИмяПеречисления].EnumValues.Get(ИндексПеречисления).Name;
    ЗначениеПеречисления = Перечисления[ИмяПеречисления] [ИмяЗначенияПеречисления];

    СтрокаТЗ [ИмяПеречисления] = ЗначениеПеречисления;

КонецЦикла;


Как-то так.

Но я бы дополнительно посоветовал сохранять найденные соответствия в какой-то кэш и если в нем не найдено, то лезть в БазаИсточник за данными




Что делает вот это "КомОбъект = Строка [ИмяПеречисления];" ? /Вылетает ошибка/

Пишу так:
//Запищем данные в ТЗ
Для Каждого Строка Из ТаблицаДанныхИсточникСОМОбъект Цикл
        
СтрокаТЗ = ТЗДанныеИсточник.Добавить();

    ЗаполнитьЗначенияСвойств(СтрокаТЗ,Строка,,);
    ИмяПеречисления = "СостояниеВагонов";
    КомОбъект = Строка[ИмяПеречисления]; //ОШИБКА  Поле объекта не обнаружено (СостояниеВагонов)    
    
    ИндексПеречисления = БазаИсточник.Перечисления[ИмяПеречисления].Индекс(КомОбъект);
    ИмяЗначениеПеречисления = БазаИсточник.Метаданные().Перечисления[ИмяПеречисления].EnumValues.Get(ИндексПеречисления).Name;
    ЗначениеПеречисления = Перечисления[ИмяПеречисления][ИмяЗначениеПеречисления];
    СтрокаТЗ[ИмяПеречисления] = ЗначениеПеречисления;

    
КонецЦикла;



Нашол что не так, вот код:
//Запищем данные в ТЗ
Для Каждого Строка Из ТаблицаДанныхИсточникСОМОбъект Цикл
    СтрокаТЗ = ТЗДанныеИсточник.Добавить();
    ЗаполнитьЗначенияСвойств(СтрокаТЗ,Строка,,);
    ИмяПеречисления = "СостояниеВагонов";
    КомОбъект = Строка.СостояниеВагона;
    
    ИндексПеречисления = БазаИсточник.Перечисления[ИмяПеречисления].Индекс(КомОбъект); //РУГАЕТСЯ ВОТ ТУТ
    ИмяЗначениеПеречисления = БазаИсточник.Метаданные().Перечисления[ИмяПеречисления].EnumValues.Get(ИндексПеречисления).Name;
    ЗначениеПеречисления = Перечисления[ИмяПеречисления][ИмяЗначениеПеречисления];
    СтрокаТЗ[ИмяПеречисления] = ЗначениеПеречисления;
    
КонецЦикла;



Описание ошики:
ИндексПеречисления = БазаИсточник.Перечисления[ИмяПеречисления].Индекс(КомОбъект);
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.3.4.408): Несоответствие типов (параметр номер '1')


ПОЛУЧИЛОСЬ!СПАСИБО!

//Запищем данные в ТЗ
Для Каждого Строка Из ТаблицаДанныхИсточникСОМОбъект Цикл
    СтрокаТЗ = ТЗДанныеИсточник.Добавить();
    ЗаполнитьЗначенияСвойств(СтрокаТЗ,Строка,,);
    
    ИмяПеречисления = "СостояниеВагонов";
    КомОбъект = Строка.СостояниеВагона;
    
    Попытка
    ИндексПеречисления = БазаИсточник.Перечисления[ИмяПеречисления].Индекс(КомОбъект);
    ИмяЗначениеПеречисления = БазаИсточник.Метаданные().Перечисления[ИмяПеречисления].EnumValues.Get(ИндексПеречисления).Name;
    ЗначениеПеречисления = Перечисления[ИмяПеречисления][ИмяЗначениеПеречисления];
    СтрокаТЗ.СостояниеВагона = ЗначениеПеречисления;
    Исключение
    Продолжить;
    КонецПопытки;
    
КонецЦикла;


Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua