Доброго дня.

Кто-нибудь может подсказать как обстоят дела с транзакциями для Com-соединений?

Суть такова. Пилил хитрый обмен на базе типового УниверсальныйОбменДаннымиXML (2.7.1 версии) и потребовалось мне заливать данные напрямую в базу приемник, причем в транзакции ( то есть, если где-то при записи порции объектов навернулось, то откатить все внесенные изменения в рамках транзакции). Всё бы ничего, но если поднят флаг "Загружать в транзакции", то в обработке-приемнике в функции ВыполнитьДействияПередЧтениемДанных() открывается транзакция, но в ВыполнитьДействияПослеЗавершенияЧтенияДанных() уже закрыться не может - пишет "Транзакция не активна"

Соорудил тестовый стенд - база КА 1, платформа 8.3.11.2899. Набросал две обработки. Первая(ВнешняяОбработка1) лежит в конфигурациии имеет в модуле объекта всего две экспортные процедуры :

```1c
    процедура тест() экспорт
    НачатьТранзакцию();
    конецпроцедуры

    процедура тест2() экспорт
    ЗафиксироватьТранзакцию();
    конецпроцедуры
```

Вторая внешняя и поднимает ком-соединение до этой же базы, создает ранее описанную обработку и вызывает последовательно обе процедуры (мк - объект соединения):

```1c
    обр = мк.Обработки.ВнешняяОбработка1.Создать();
    обр.тест();
    обр.тест2();
```

что приводит к упомянутой ранее "Транзакция не активна". Если смотреть отладчиком, то после процедуры функция
```1c
    мк.ТранзакцияАктвивна()
```
 уже выдает ЛОЖЬ.

Как говорится, ЧЯДНТ? Есть ли жизнь на марсе транзакции в обработках под ком-соединениями?

Спасибо.

зы. к слову говоря, в некоторых своих проектах использовал явное открытие-закрытие транзакций, но в рамках вызова методов COMОбъекта соединения и усё работает.
---
все просто. транзакция начинается в модуле объекта (на сервере). Она активна ровно до момента возвращения с сервера.
Можете проверить:
В модуле формы команда:

```1c
    &НаКлиенте
    Процедура КомандаТестТранзакции(Команда)
    ТестТранзакции();
    ТестТранзакции2();
    КонецПроцедуры

    &НаСервере
    Процедура ТестТранзакции()
    НачатьТранзакцию();
    КонецПроцедуры

    &НаСервере
    Процедура ТестТранзакции2()
    Сообщить(ТранзакцияАктивна());
    КонецПроцедуры
```

Через СОМ работает похожим образом. Из клиента (внешнее соединение) вызывается серверная процедура и устанавливается транзакция. Далее возвращение на клиент (внешнее соединение) и вызов другой серверной процедуры. Транзакция завершается автоматически при выходе из первой серверной процедуры.

Для работы с транзакциями во внешнем соединении (внутри процедур транзакции не запускать):

```1c
    мк.НачатьТранзакцию();
    обр = мк.Обработки.ВнешняяОбработка1.Создать();
    обр.тест();
    обр.тест2();
    Если мк.ТранзакцияАктивна() Тогда
    мк.ЗафиксироватьТранзакцию();
    КонецЕсли;
```
---
все просто. транзакция начинается в модуле объекта (на сервере). Она активна ровно до момента возвращения с сервера.
Можете проверить:
В модуле формы команда:

```1c
    &НаКлиенте
    Процедура КомандаТестТранзакции(Команда)
    ТестТранзакции();
    ТестТранзакции2();
    КонецПроцедуры

    &НаСервере
    Процедура ТестТранзакции()
    НачатьТранзакцию();
    КонецПроцедуры

    &НаСервере
    Процедура ТестТранзакции2()
    Сообщить(ТранзакцияАктивна());
    КонецПроцедуры
```

Через СОМ работает похожим образом. Из клиента (внешнее соединение) вызывается серверная процедура и устанавливается транзакция. Далее возвращение на клиент (внешнее соединение) и вызов другой серверной процедуры. Транзакция завершается автоматически при выходе из первой серверной процедуры.

Для работы с транзакциями во внешнем соединении (внутри процедур транзакции не запускать):

```1c
    мк.НачатьТранзакцию();
    обр = мк.Обработки.ВнешняяОбработка1.Создать();
    обр.тест();
    обр.тест2();
    Если мк.ТранзакцияАктивна() Тогда
    мк.ЗафиксироватьТранзакцию();
    КонецЕсли;
```
---
Спасибо. Любопытно, так выходит, что УниверсальныйОбменДаннымиXML имеет ошибку в коде? Или оно функционировало когда-то там на более древних платформах?