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

Все работает, но криво. После каждого элемента происходит ошибка с транзакцией. И транзакция начинается снова, до 100 элементов она не доходит. В чем может быть проблема?
1 Dmitrii
 
гуру
06.03.23
13:32
Зачем здесь транзакции?
Зачем транзакция внутри цикла?
Если транзакция внутри цикла, то какой смысл в этом куске кода?

Если Счетчик % 100 = 0 Тогда
  ЗафиксироватьТранзакцию();
  НачатьТранзакцию();
КонецЕсли;

Ведь после него ты всегда в любом случае делаешь

ЗафиксироватьТранзакцию();

То есть пытаешься зафиксировать транзакцию даже в том случае, когда только что её открыл (если Счетчик % 100 = 0) и ещё ничего не сделал.
Разберись с началом и завершением транзакций. Чего ты хочешь и зачем оно тебе надо.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс