При интеграции двух информационных баз 1С через механизм COM-соединения программисты часто сталкиваются с ситуацией, когда простые типы данных (строки, числа) передаются без проблем, но при попытке получить значение перечисления возникает ошибка «Метод объекта не обнаружен». Это происходит потому, что значение перечисления во внешней базе передается как COMОбъект, и попытки вызвать у него стандартные методы текущей базы или некорректное обращение к глобальному контексту внешней базы приводят к остановке выполнения кода.
В этой статье мы подробно разберем, как правильно извлечь строковый идентификатор перечисления из другой базы, проанализируем ошибки в синтаксисе и рассмотрим несколько альтернативных способов решения задачи.
Рассмотрим ситуацию, когда мы подключаемся к базе-источнику через V83.COMConnector. Основная ошибка, которую совершают разработчики (как показано в сообщениях темы), заключается в попытке вызвать методы преобразования типов у вложенных свойств объекта соединения, например, через Олеобъект.База.xmlstring().
Проанализируем причину неудачи: метод XMLString (или в русской локализации XMLСтрока) является методом глобального контекста. При работе через COM-соединение (COMConnector) этот метод должен вызываться непосредственно у основного объекта соединения, а не у объектов метаданных или ссылок.
Метод XMLString возвращает внутреннее имя значения перечисления, как оно задано в конфигураторе. Это именно то, что нужно для поиска аналогичного значения в базе-приемнике. Рассмотрим правильный алгоритм действий.
Предположим, у нас есть объект ОлеСоединение, через который мы получили ссылку на номенклатуру во внешней базе. Нам нужно получить ее ставку НДС. Разберем по шагам:
XMLString непосредственно у объекта соединения.Пример правильного кода:
// Устанавливаем соединение (предположим, оно уже создано как ОлеСоединение)
СтавкаНДС_ОЛЕ = ОбьектИзВнешнейБазы.СтавкаНДС;
// ВАЖНО: вызываем метод у объекта СОЕДИНЕНИЯ, а не у 'База' или 'СтавкаНДС'
ИмяСтавки = ОлеСоединение.XMLString(СтавкаНДС_ОЛЕ);
// Теперь ищем значение в нашей текущей базе по полученному имени
СтавкаНДС_Наша = Перечисления.СтавкиНДС[ИмяСтавки];
Почему это работает? В 1С системные перечисления поддерживают XML-сериализацию. Метод XMLString возвращает текстовое представление значения, которое совпадает с его именем в конфигураторе. Это избавляет от необходимости перебирать метаданные вручную.
Если по каким-то причинам работа со строками кажется вам ненадежной (хотя в случае с перечислениями это не так), можно использовать порядковый номер (индекс) значения. В 1С индексы значений перечислений в COM-базе и текущей базе будут совпадать, если состав перечислений идентичен.
Рассмотрим, как реализовать этот подход:
// Получаем индекс значения во внешней базе
ИндексЗначения = ОлеСоединение.Перечисления.СтавкиНДС.Индекс(ОбьектИзВнешнейБазы.СтавкаНДС);
// Получаем значение по этому же индексу в текущей базе
СтавкаНДС_Наша = Перечисления.СтавкиНДС.Получить(ИндексЗначения);
Этот метод считается одним из самых быстрых, так как исключает строковые операции и поиск в коллекции по ключу. Однако он требует строгой уверенности в том, что порядок значений в конфигураторах обеих баз абсолютно одинаков.
Если метод XMLString недоступен или возвращает некорректные данные (например, при работе с очень старыми версиями платформы), мы можем обратиться к метаданным внешней базы напрямую. Проанализируем, как это сделать:
Имя.Пример кода:
СтавкаНДС_ОЛЕ = ОбьектИзВнешнейБазы.СтавкаНДС;
МенеджерОЛЕ = ОлеСоединение.Перечисления.СтавкиНДС;
// Получаем имя через метаданные внешней базы
ИмяЗначения = ОлеСоединение.Метаданные.Перечисления.СтавкиНДС.ЗначенияПеречисления.Получить(МенеджерОЛЕ.Индекс(СтавкаНДС_ОЛЕ)).Имя;
СтавкаНДС_Наша = Перечисления.СтавкиНДС[ИмяЗначения];
Хотя этот метод более громоздкий, он наглядно показывает структуру взаимодействия с COM-объектами и может быть полезен, если вам нужно получить не только имя, но и, например, синоним или другие свойства метаданных.
При реализации обмена данными через COM-соединение, обратите внимание на следующие моменты, которые часто становятся причиной ошибки Метод объекта не обнаружен:
XMLString пишется именно так (латиницей), если вы обращаетесь к нему через COM. В некоторых конфигурациях вызов русской версии XMLСтрока может не сработать.V83.COMConnector и V83.Application. У COMConnector нет визуального интерфейса и многих методов «клиентского» глобального контекста. Метод XMLString является методом самого объекта связи.XMLString от Null или неопределенного значения во внешней базе также может привести к ошибке.Выясним, является ли метод XMLString «костылем», как обсуждалось в теме. На самом деле — нет. Это стандартный механизм платформы 1С для получения строкового идентификатора, поддерживающего сериализацию. Сериализация перечислений не менялась с версии 8.0, поэтому данный подход является максимально стабильным и рекомендованным для использования в задачах интеграции.
Используя приведенные выше рекомендации, вы сможете эффективно передавать данные между базами 1С, избегая ошибок обращения к методам COM-объектов.