Преобразоваие типов в 1С

По проекту пришла задача, в которой нужно было через СОМ-соединение с одной базы бухгалтерии в другую перекинуть остатки по счетам. В принципе такие задачи ранее решал и эта задача тоже мне показалась легкой. Но пришло время реализации … В очередной раз убеждаюсь, что неожиданность в 1С может вылезти откуда угодно.

Основная проблема по задаче — что счет может иметь для аналитики несколько субконто, а соответственно и произвольній набор типов значений, и эти субконто жестко не прописаны для счета (по крайней мере не все). Приходя через СОМ, значения не инициализированы в текущей базе, даже если УИД одинаков. Поэтому пришлось более детально поковирять тему преобразования типов с помощью XML. Собственно о некоторых секретах я расскажу в этой статье.

Вот основные функции, которые для этого используются. Напомню, что 1С поддерживает сериализацию объектов — т.е., в нашем случае, объект с одной базы через XML-сериализацию по СОМ можно получить в другой.
Функции:

  1. XMLDataType — это унифицированный тип данных, который содержит в себе сам тип и URI пространства имен. В дальнейшем нам понадобится;
  2. XMLString(<Значение>) — получает XML представление для любого значения;
  3. XMLValue(<Тип>, <СтрокаXML>) — превращает строкуXML (п. 2) в значение указанного типа;
  4. XMLType(<Тип>) — делает превращение из обычного типа в XMLDataType;
  5. XMLTypeOf(<Значение>) — получает из указанного значения XMLDataType;
  6. FromXMLType(<ТипXML>) — делает обратное преобразование из XMLDataType в Тип конкретной базы;

Вот все нужные функции. Все они также доступны через внешнее соединение. Далее задача и способ ее решения.

Задача: с помощью СОМ-соединение с базы А в базу Б следует передать значение (базы А и Б идентичны по структуре). Заранее тип значения нам неизвестно (поскольку субконто жестко не указаны), а соответственно и получить именно значение проблематично.

Способ решения:  Дополнительная переменная КОМ — это СОМ-соединение в базе Б с базой А. Для начала нам нужно получить XMLDataType полученного значения. Из него получить тип значения в базе Б. Затем получить XML представление значения и из всего получить значение в базе Б.

Код

1
2
3
4
5
ИмяТипаКОМ = КОМ.XMLТипЗнч(ЗначениеКОМ).ИмяТипа; //получаем имя тип значенияКОМ
ТипДанных = Новый ТипДанныхXML(ИмяТипаКОМ, ""); //получаем ТипДанныхXML по имени типа ЗначенияКОМ - 
//для типов 1С URI пространства имен указывать не надо
НашТип = FromXMLType(ТипДанных); //получаем наш тип
НашеЗначение = XMLЗначение(НашТип, КОМ.XMLСтрока(ЗначениеКОМ)); //в завершении получаем значение


Причем преобразования значений и типов можно делать как в таком направлении, так и в обратном.

На этом все. Основная мысль изложена, хоть и немного сумбурно)