Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0
День добрый! Подскажите, подключаюсь к базе 1С через СОМконнектор, делаю запрос к РС, в РС есть реквизит "СостояниеВагона" - Перечисление. Когда выгружаю запрос в таблицу значений, то на месте СостояниеВагона получается ComОбъект, как мне в таком случае найти нужное мне перечисление в базе приемнике и подставить его?
КЧ = Новый КвалификаторыЧисла(6,3); ОписаниеТиповЧ = Новый ОписаниеТипов("Число",,,КЧ);
ТЗДанныеИсточник.Колонки.Добавить("Период",,"Период",); ТЗДанныеИсточник.Колонки.Добавить("НомерВагона",,"Номер вагона",); ТЗДанныеИсточник.Колонки.Добавить("ПрибытияВагона",,"Прибытие вагона",); ТЗДанныеИсточник.Колонки.Добавить("УстановкаПодВыгрузку",,"Установка под выгрузку",); ТЗДанныеИсточник.Колонки.Добавить("ОкончаниеВыгрузки",,"Окончание выгрузки",); ТЗДанныеИсточник.Колонки.Добавить("ПрибытиеДокументовПослеДекларирования",,"Прибытие документов после декларирования",); ТЗДанныеИсточник.Колонки.Добавить("ПрибытиеИнструкцийВОтправкуПОРПВ",,"Прибытие инструкций в отправку ПОР ПВ",); ТЗДанныеИсточник.Колонки.Добавить("УстановкаПодПогрузку",,"Установка под погрузку",); ТЗДанныеИсточник.Колонки.Добавить("ПрибытиеДокументовПослеТаможирования",,"Прибытие документов после таможирования",); ТЗДанныеИсточник.Колонки.Добавить("ВозвратПВстКраматорск",,"Возврат ПВ ст.",); ТЗДанныеИсточник.Колонки.Добавить("СостояниеВагона",,"Состояние вагона",); ТЗДанныеИсточник.Колонки.Добавить("Ответственный",,"Ответственный",); ТЗДанныеИсточник.Колонки.Добавить("ПринадлежностьВагона",,"Принадлежность вагона",); ТЗДанныеИсточник.Колонки.Добавить("НоменклатураПрибытие",,"Номенклатура прибытие",); ТЗДанныеИсточник.Колонки.Добавить("НоменклатураОтправка",,"Номенклатура отправка",); ТЗДанныеИсточник.Колонки.Добавить("ВесПоПрибытию",ОписаниеТиповЧ,"Вес по прибытию");
Для Каждого Строка Из ТаблицаДанныхИсточникСОМОбъект Цикл СтрокаТЗ = ТЗДанныеИсточник.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаТЗ,Строка,,); КонецЦикла;
КЧ = Новый КвалификаторыЧисла(6,3); ОписаниеТиповЧ = Новый ОписаниеТипов("Число",,,КЧ);
ТЗДанныеИсточник.Колонки.Добавить("Период",,"Период",); ТЗДанныеИсточник.Колонки.Добавить("НомерВагона",,"Номер вагона",); ТЗДанныеИсточник.Колонки.Добавить("ПрибытияВагона",,"Прибытие вагона",); ТЗДанныеИсточник.Колонки.Добавить("УстановкаПодВыгрузку",,"Установка под выгрузку",); ТЗДанныеИсточник.Колонки.Добавить("ОкончаниеВыгрузки",,"Окончание выгрузки",); ТЗДанныеИсточник.Колонки.Добавить("ПрибытиеДокументовПослеДекларирования",,"Прибытие документов после декларирования",); ТЗДанныеИсточник.Колонки.Добавить("ПрибытиеИнструкцийВОтправкуПОРПВ",,"Прибытие инструкций в отправку ПОР ПВ",); ТЗДанныеИсточник.Колонки.Добавить("УстановкаПодПогрузку",,"Установка под погрузку",); ТЗДанныеИсточник.Колонки.Добавить("ПрибытиеДокументовПослеТаможирования",,"Прибытие документов после таможирования",); ТЗДанныеИсточник.Колонки.Добавить("ВозвратПВстКраматорск",,"Возврат ПВ ст.",); ТЗДанныеИсточник.Колонки.Добавить("СостояниеВагона",,"Состояние вагона",); ТЗДанныеИсточник.Колонки.Добавить("Ответственный",,"Ответственный",); ТЗДанныеИсточник.Колонки.Добавить("ПринадлежностьВагона",,"Принадлежность вагона",); ТЗДанныеИсточник.Колонки.Добавить("НоменклатураПрибытие",,"Номенклатура прибытие",); ТЗДанныеИсточник.Колонки.Добавить("НоменклатураОтправка",,"Номенклатура отправка",); ТЗДанныеИсточник.Колонки.Добавить("ВесПоПрибытию",ОписаниеТиповЧ,"Вес по прибытию");
Для Каждого Строка Из ТаблицаДанныхИсточникСОМОбъект Цикл СтрокаТЗ = ТЗДанныеИсточник.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаТЗ,Строка,,); КонецЦикла;
//Поиск ссылок на объекты Если СтрокаДанных.ПринадлежностьВагона.Description <> "" Тогда
ПоискПринадлежностьВагона = Справочники.ПринадлежностьВагонов.НайтиПоНаименованию(СтрокаДанных.ПринадлежностьВагона.Description,Истина); Если Не ПоискПринадлежностьВагона.Пустая() Тогда СтрокаДанных.ПринадлежностьВагона = ПоискПринадлежностьВагона; Иначе обПринадлежностьВагона = Справочники.ПринадлежностьВагонов.СоздатьЭлемент(); обПринадлежностьВагона.Наименование = СтрокаДанных.ПринадлежностьВагона.Description; обПринадлежностьВагона.Записать(); СтрокаДанных.ПринадлежностьВагона = обПринадлежностьВагона; КонецЕсли; КонецЕсли;
Если СтрокаДанных.НоменклатураПрибытие.Description <> "" Тогда
ПоискНоменклатураПрибытие = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.НоменклатураПрибытие.Description,Истина); Если Не ПоискНоменклатураПрибытие.Пустая() Тогда СтрокаДанных.НоменклатураПрибытие = ПоискНоменклатураПрибытие; Иначе обНоменклатура = Справочники.Номенклатура.СоздатьЭлемент(); обНоменклатура.Наименование = СтрокаДанных.НоменклатураПрибытие.Description; обНоменклатура.Записать(); СтрокаДанных.НоменклатураПрибытие = обНоменклатура; КонецЕсли; КонецЕсли;
Если СтрокаДанных.НоменклатураОтправка.Description <> "" Тогда ПоискНоменклатураОтправка = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.НоменклатураОтправка.Description,Истина); Если Не ПоискНоменклатураОтправка.Пустая() Тогда СтрокаДанных.НоменклатураОтправка = ПоискНоменклатураОтправка; Иначе обНоменклатура = Справочники.Номенклатура.СоздатьЭлемент(); обНоменклатура.Наименование = СтрокаДанных.НоменклатураОтправка; обНоменклатура.Записать(); СтрокаДанных.НоменклатураОтправка = обНоменклатура; КонецЕсли; КонецЕсли;
Получилось прочитать название значения перечисления в базе источнике. Как теперь его сравнивать с тем значением которое я считал? Крыша едет не спеша....
КЧ = Новый КвалификаторыЧисла(6,3); ОписаниеТиповЧ = Новый ОписаниеТипов("Число",,,КЧ);
ТЗДанныеИсточник.Колонки.Добавить("Период",,"Период",); ТЗДанныеИсточник.Колонки.Добавить("НомерВагона",,"Номер вагона",); ТЗДанныеИсточник.Колонки.Добавить("ПрибытияВагона",,"Прибытие вагона",); ТЗДанныеИсточник.Колонки.Добавить("УстановкаПодВыгрузку",,"Установка под выгрузку",); ТЗДанныеИсточник.Колонки.Добавить("ОкончаниеВыгрузки",,"Окончание выгрузки",); ТЗДанныеИсточник.Колонки.Добавить("ПрибытиеДокументовПослеДекларирования",,"Прибытие документов после декларирования",); ТЗДанныеИсточник.Колонки.Добавить("ПрибытиеИнструкцийВОтправкуПОРПВ",,"Прибытие инструкций в отправку ПОР ПВ",); ТЗДанныеИсточник.Колонки.Добавить("УстановкаПодПогрузку",,"Установка под погрузку",); ТЗДанныеИсточник.Колонки.Добавить("ПрибытиеДокументовПослеТаможирования",,"Прибытие документов после таможирования",); ТЗДанныеИсточник.Колонки.Добавить("ВозвратПВстКраматорск",,"Возврат ПВ ст.",); ТЗДанныеИсточник.Колонки.Добавить("СостояниеВагона",,"Состояние вагона",); ТЗДанныеИсточник.Колонки.Добавить("Ответственный",,"Ответственный",); ТЗДанныеИсточник.Колонки.Добавить("ПринадлежностьВагона",,"Принадлежность вагона",); ТЗДанныеИсточник.Колонки.Добавить("НоменклатураПрибытие",,"Номенклатура прибытие",); ТЗДанныеИсточник.Колонки.Добавить("НоменклатураОтправка",,"Номенклатура отправка",); ТЗДанныеИсточник.Колонки.Добавить("ВесПоПрибытию",ОписаниеТиповЧ,"Вес по прибытию");
//В этом цикле нужно подставлять наименование перечисления и искать его в базе приемнике //КАК ЭТО СДЕЛАТЬ? Для Каждого Строка Из ТаблицаДанныхИсточникСОМОбъект Цикл СтрокаТЗ = ТЗДанныеИсточник.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаТЗ,Строка,,); КонецЦикла;
//Поиск ссылок на объекты Если СтрокаДанных.ПринадлежностьВагона.Description <> "" Тогда
ПоискПринадлежностьВагона = Справочники.ПринадлежностьВагонов.НайтиПоНаименованию(СтрокаДанных.ПринадлежностьВагона.Description,Истина); Если Не ПоискПринадлежностьВагона.Пустая() Тогда СтрокаДанных.ПринадлежностьВагона = ПоискПринадлежностьВагона; Иначе обПринадлежностьВагона = Справочники.ПринадлежностьВагонов.СоздатьЭлемент(); обПринадлежностьВагона.Наименование = СтрокаДанных.ПринадлежностьВагона.Description; обПринадлежностьВагона.Записать(); СтрокаДанных.ПринадлежностьВагона = обПринадлежностьВагона; КонецЕсли; КонецЕсли;
Если СтрокаДанных.НоменклатураПрибытие.Description <> "" Тогда
ПоискНоменклатураПрибытие = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.НоменклатураПрибытие.Description,Истина); Если Не ПоискНоменклатураПрибытие.Пустая() Тогда СтрокаДанных.НоменклатураПрибытие = ПоискНоменклатураПрибытие; Иначе обНоменклатура = Справочники.Номенклатура.СоздатьЭлемент(); обНоменклатура.Наименование = СтрокаДанных.НоменклатураПрибытие.Description; обНоменклатура.Записать(); СтрокаДанных.НоменклатураПрибытие = обНоменклатура; КонецЕсли; КонецЕсли;
Если СтрокаДанных.НоменклатураОтправка.Description <> "" Тогда ПоискНоменклатураОтправка = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДанных.НоменклатураОтправка.Description,Истина); Если Не ПоискНоменклатураОтправка.Пустая() Тогда СтрокаДанных.НоменклатураОтправка = ПоискНоменклатураОтправка; Иначе обНоменклатура = Справочники.Номенклатура.СоздатьЭлемент(); обНоменклатура.Наименование = СтрокаДанных.НоменклатураОтправка; обНоменклатура.Записать(); СтрокаДанных.НоменклатураОтправка = обНоменклатура; КонецЕсли; КонецЕсли;
Но я бы дополнительно посоветовал сохранять найденные соответствия в какой-то кэш и если в нем не найдено, то лезть в БазаИсточник за данными
Что делает вот это "КомОбъект = Строка [ИмяПеречисления];" ? /Вылетает ошибка/
Пишу так:
//Запищем данные в ТЗ Для Каждого Строка Из ТаблицаДанныхИсточникСОМОбъект Цикл
СтрокаТЗ = ТЗДанныеИсточник.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТЗ,Строка,,); ИмяПеречисления = "СостояниеВагонов"; КомОбъект = Строка[ИмяПеречисления]; //ОШИБКА Поле объекта не обнаружено (СостояниеВагонов)
//Запищем данные в ТЗ Для Каждого Строка Из ТаблицаДанныхИсточникСОМОбъект Цикл СтрокаТЗ = ТЗДанныеИсточник.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаТЗ,Строка,,); ИмяПеречисления = "СостояниеВагонов"; КомОбъект = Строка.СостояниеВагона;
ИндексПеречисления = БазаИсточник.Перечисления[ИмяПеречисления].Индекс(КомОбъект); //РУГАЕТСЯ ВОТ ТУТ ИмяЗначениеПеречисления = БазаИсточник.Метаданные().Перечисления[ИмяПеречисления].EnumValues.Get(ИндексПеречисления).Name; ЗначениеПеречисления = Перечисления[ИмяПеречисления][ИмяЗначениеПеречисления]; СтрокаТЗ[ИмяПеречисления] = ЗначениеПеречисления;
КонецЦикла;
Описание ошики: ИндексПеречисления = БазаИсточник.Перечисления[ИмяПеречисления].Индекс(КомОбъект); по причине: Произошла исключительная ситуация (1C:Enterprise 8.3.4.408): Несоответствие типов (параметр номер '1')
ПОЛУЧИЛОСЬ!СПАСИБО!
//Запищем данные в ТЗ Для Каждого Строка Из ТаблицаДанныхИсточникСОМОбъект Цикл СтрокаТЗ = ТЗДанныеИсточник.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаТЗ,Строка,,);
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!