При переносе данных из БП в ЕРП справочник контрагенты переносился 2 раза: Контрагенты -> Партнеры и Контрагенты -> Контрагенты. В последствии нужно было связать партнера с контрагентом через реквизит Контрагенты.Партнер. Привожу следующий код:
Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| Партнеры.Ссылка КАК Партнер
| ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Партнеры КАК Партнеры
| ПО Контрагенты.Наименование = Партнеры.Наименование
|ДЛЯ ИЗМЕНЕНИЯ
| Справочник.Контрагенты";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Счетчик = 0;
НачатьТранзакцию();
Попытка
КонтрагентыСсылка = Выборка.Контрагент;
КонтрагентОбъект = КонтрагентыСсылка.ПолучитьОбъект();
ПартнерыСсылка = Выборка.Партнер;
Сообщить ("Партнер: "+ КонтрагентыСсылка.Партнер);
Сообщить (ПартнерыСсылка);
КонтрагентОбъект.Партнер = ПартнерыСсылка;
КонтрагентОбъект.Записать();
Счетчик = Счетчик + 1;
Если Счетчик % 100 = 0 Тогда
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
Сообщить ("Не записан" + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Все работает, но криво. После каждого элемента происходит ошибка с транзакцией. И транзакция начинается снова, до 100 элементов она не доходит. В чем может быть проблема?
Зачем здесь транзакции?
Зачем транзакция внутри цикла?
Если транзакция внутри цикла, то какой смысл в этом куске кода?
Если Счетчик % 100 = 0 Тогда
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
КонецЕсли;
Ведь после него ты всегда в любом случае делаешь
ЗафиксироватьТранзакцию();
То есть пытаешься зафиксировать транзакцию даже в том случае, когда только что её открыл (если Счетчик % 100 = 0) и ещё ничего не сделал.
Разберись с началом и завершением транзакций. Чего ты хочешь и зачем оно тебе надо.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс