Перетворення типів в 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Строка(ЗначениеКОМ)); //в завершении получаем значение


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

На цьому все. Основна думка викладена, хоч і трохи сумбурно)