Получение и сравнение перечисления через COM соединение

1. Black Cat 32 22.04.16 16:49 Сейчас в теме
Добрый день !
Делаю перегрузку реализаций и поступлений из УТ 11.2 в БП 2.0 через COM. Обработка запускается в БП. Нужно получить значение перечисления "ТипыНалогообложенияНДС", применяемого в документе поступления. Конструкция вида:
Если ДокумИст.НалогообложениеНДС = COMБаза.Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС Тогда
  НовыйДокум.УчитыватьНДС=Истина;
Иначе
  НовыйДокум.УчитыватьНДС=Ложь;
КонецЕсли;

Не работает. Всегда выдает ложь.
COMБаза - собственно УТ 11, подключенная через COM к БП.
НовыйДокум - пустой документ поступление в БП.
ДокумИст - документ поступления переданный по COM из УТ 11/
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Boneman 298 22.04.16 16:58 Сейчас в теме
(1) Black Cat, там по индексу надо сравнивать
4. Denis_CFO 48 22.04.16 16:59 Сейчас в теме
(1) Black Cat, вот так попробуйте:
XMLString(COMБаза.Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС) = "Облагается"
rusakov1969; ivangrant; alec_kr; +3 Ответить
5. sssss_aaaaa_2011 22.04.16 17:02 Сейчас в теме
(1) Black Cat, так и должно быть. Через COM передаются только примитивные типы (число и строка), а не ссылки на метаданные.
6. Boneman 298 22.04.16 17:03 Сейчас в теме
(1) Black Cat,
вот тебе пример реализации,
переделай себе
Функция ОпределитьЮрФизЛицо(ЭлементОле)


	ИндексОле = БазаДанныхРарус.Перечисления.ФормыСобственности.Индекс(ЭлементОле.ФормаСобственности);
	ЭтоЮрЛицо = (ИндексОле = БазаДанныхРарус.Перечисления.ФормыСобственности.Индекс(БазаДанныхРарус.Перечисления.ФормыСобственности.ЮридическоеЛицо));
	ЮрФизЛицо = ?(ЭтоЮрЛицо, Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо, Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо);
	Возврат ЮрФизЛицо;
	
	
КонецФункции
Показать
triton_tver; biimmap; ivangrant; Andy_NTG; gglvov; Alex_Bratushka; +6 Ответить
8. Denis_CFO 48 22.04.16 17:07 Сейчас в теме
(6) Boneman, это работает, когда две конфигурации одинаковые... (значения перечисления) а у ТС определенно разные...
9. Boneman 298 22.04.16 17:11 Сейчас в теме
(8) Denis_CFO, они не могут быть одинаковые.
Для того индекс значения и вычисляем - он является примитивным типом, спокойно передается по оле,
и дальше последней строкой определяем результат, в зависимости от индекса.

Хоть 100 вариантов там будет,
пример не для тупого копипаста приведен, а для того чтобы понять как это работает.
В моем случае - там всего 2 значения, 0 и 1.
10. Denis_CFO 48 22.04.16 17:13 Сейчас в теме
(9) Boneman, Ну звиняй тогда, значит у меня не получилось, попробую ещё. Обычно вытаскиваю значение перечисления в виде строки и им пользуюсь. Никогда не подводило.
12. Boneman 298 22.04.16 17:16 Сейчас в теме
(10) Denis_CFO, строкой тоже можно,
только это не совсем универсально. Переименуют название и перестанет работать.
Даже в (7) ссылка на ИТС, там официальные примеры именно по индексам.
13. утюгчеловек 38 23.04.16 15:11 Сейчас в теме
(12) Boneman,
Не согласен с тем, что это не универсально. Пример:
В Базе 1 в перечислении ТипыНалогообложенияНДС объявлено два значения ПродажаОблагаетсяНДС и ПродажаНеОблагаетсяНДС
В Базе 2 в перечислении ТипыНалогообложенияНДС тоже объявлено два значения, но в другом порядке.
Какой вариант сравнит верно - по индексу или по строке?

Пример 2:
В Базе 1 в перечислении ТипыНалогообложенияНДС объявлено два значения "ПродажаОблагаетсяНДС" и "ПродажаНеОблагаетсяНДС"
В Базе 2 в перечислении ТипыНалогообложенияНДС тоже объявлено два значения: "ПродажаНДС" и "ПродажаБезНДС"
Стоит ли доверять сравнению по индексу, или лучше выбросить исключение? Ведь нет стропроцентной уверенности, что сопоставление будет корректным? А что если в перечислении в базе 2 - более двух значений?

(1) Black Cat, конечно зависит от того одинаковые ли версии конфигурации. И если да, то вариант по индексу подойдет. Но вдруг одна база шагнет на версию дальше чем вторая - и возникнут различия в названии объектов метаданных и/или синонимов? Считаю что правильнее будет как-то так:

Если Строка(ДокумИст.НалогообложениеНДС) = COMБаза.String(COMБаза.Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС) Тогда
  НовыйДокум.УчитыватьНДС=Истина;
ИначеЕсли Строка(ДокумИст.НалогообложениеНДС) = COMБаза.String(COMБаза.Перечисления.ТипыНалогообложенияНДС.ПродажаНЕОблагаетсяНДС) Тогда
  // ...
Иначе
  ВызватьИсключение "непредвиденное значение реквизита";
КонецЕсли;
Slypower; ir-ish-ka; +2 Ответить
11. Boneman 298 22.04.16 17:13 Сейчас в теме
(8) Denis_CFO, в моем примере, это выдержка из выгрузки, из отраслевой конфы автосалона, переписанной на 90% в типовую бухню.
Ничего там идентичного в конфигурациях нет.
7. dmitrichenko.ivan 6 22.04.16 17:05 Сейчас в теме
Соединитель = Новый COMОбъект("V8.COMConnector");
Соединение = Соединитель.connect("File=c:\InfoBaseDirectory");
ЭлементПеречисления = Соединение.Справочники.Справочник1.НайтиПоКоду(1).Реквизит1;
ВозможныеЗначения = ЭлементПеречисления.Метаданные().ЗначенияПеречисления;
НомерЭлементаПеречисления = ВозможныеЗначения.Индекс(ВозможныеЗначения.Найти(Соединение.XMLString(ЭлементПеречисления)));
Если НомерЭлементаПеречисления = 0 Тогда
    Сообщить("ЗначениеПеречисления1");
ИначеЕсли НомерЭлементаПеречисления = 1 Тогда
    Сообщить("ЗначениеПеречисления2");
КонецЕсли;
Показать


http://its.1c.ru/db/metod8dev/content/2261/hdoc
3. ipoloskov 164 22.04.16 16:59 Сейчас в теме
Я использовал функцию COMБаза.Перечисления.ТипыНалогообложенияНДС.Индекс(Значение_Перечисления)
Manticor; Boneman; +2 Ответить
14. Black Cat 32 29.04.16 12:50 Сейчас в теме
Всем спасибо за помощь !
Сделал вот таким способом:
Если (COMБаза.XMLСтрока(ДокумV8Ист.НалогообложениеНДС) = "ПродажаОблагаетсяНДС") Тогда
			НовыйДокум.УчитыватьНДС=Истина;
		Иначе
			НовыйДокум.УчитыватьНДС=Ложь;
		КонецЕсли;
dunaev.anton; ab_initio; mi13; HaIIpuKoJIe; Xo66ut; abrams_n; fedel_lozovski; maxos1978; Diamante; join2us; Manticor; +11 Ответить
15. SV6 05.09.19 13:15 Сейчас в теме
Решение куда проще и изящней
Сравнение = мВнешниеСоеденение.NewObject("СравнениеЗначений");
Если Сравнение.Сравнить(мВнешниеСоеденение.Справочники.Организации.НайтиПоКоду("000000001"), мВнешниеСоеденение.Справочники.Организации.НайтиПоКоду("000000001"))=0 Тогда
  Сообщить("А равны ведь, епта!");
КонецЕсли;


откопал тут
https://forum.mista.ru/topic.php?id=805694
Mallok; Slypower; fedel_lozovski; vadim.semyonov.rzn; vladnet; +5 Ответить
16. mcgoen 22.01.24 14:24 Сейчас в теме
Если перечисления идентичны, то подойдет такой вариант:
КОМСоединение.Перечисления.ВашеПеречислениеВДругойБазе[XMLСтрока(ПеречислениеИзВашейБазы)];

По сути в квадратных скобках передается наименование перечисления без пробелов, например
Перечисления.Статусы["КОтгрузке"]
, что программой будет воспринято как
Перечисления.Статусы.КОтгрузке
- это очень удобно и быстро
17. user1880116 22.01.24 14:50 Сейчас в теме
(16)
это очень удобно и быстро
Итак, мы получили ответ на вопрос, заданный всего 5 лет назад. Кто же побъет этот рекорд монументальности размышлений?
18. mcgoen 24.01.24 06:44 Сейчас в теме
(17)
Вопросы и ответы на форуме не имеют срока давности, многие гуглят информацию и попадают в эту ветку, как и я, когда искал решение.
19. user1880116 24.01.24 08:30 Сейчас в теме
(18)
не имеют срока давности
И ни платформа у нас не меняется ни законодательство, решения не устаревают и методология неизменна. Да и типовые никто не исправляет. Всё так.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот