Имя: Пароль:
 
1C
1С v8
Ошибка при обмене: конфликт блокировок
0 zak555
 
20.03.19
12:19
есть база ут 10.3.50.3 под sql
есть БП во фрещше

делаю синхронизацию, возникает ошибка

Конфликт блокировок при выполнении транзакции:
Microsoft SQL Server Native Client 11.0: Превышено время ожидания запроса на блокировку.
HRESULT=80040E31, SQLSrvr: SQLSTATE=HYT00, state=31, Severity=10, native=1222, line=1

куда копать ?
1 zak555
 
20.03.19
12:28
ругается на РС кэш программных интерфейсов
2 zak555
 
20.03.19
12:45
какой-то код странный


    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ТаблицаКэша.ДатаОбновления КАК ДатаОбновления,
        |    ТаблицаКэша.Данные КАК Данные,
        |    ТаблицаКэша.ТипДанных КАК ТипДанных
        |ИЗ
        |    РегистрСведений.КэшПрограммныхИнтерфейсов КАК ТаблицаКэша
        |ГДЕ
        |    ТаблицаКэша.Идентификатор = &Идентификатор
        |    И ТаблицаКэша.ТипДанных = &ТипДанных";
    Идентификатор = Идентификатор;
    Запрос.УстановитьПараметр("Идентификатор", Идентификатор);
    Запрос.УстановитьПараметр("ТипДанных", ТипДанных);
    
    НачатьТранзакцию();
    
    ОшибкаУстановкиБлокировки = Ложь;
    
    Попытка
        
        СтруктураКлюча = Новый Структура("Идентификатор, ТипДанных", Идентификатор, ТипДанных);
        Ключ = РегистрыСведений.КэшПрограммныхИнтерфейсов.СоздатьКлючЗаписи(СтруктураКлюча);
        Попытка
            ЗаблокироватьДанныеДляРедактирования(Ключ);
        Исключение
            // Данные уже обновляются из другого сеанса
            ОшибкаУстановкиБлокировки = Истина;
            ВызватьИсключение;
        КонецПопытки;
        
        Блокировка = Новый БлокировкаДанных;
        ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.КэшПрограммныхИнтерфейсов");
        ЭлементБлокировки.УстановитьЗначение("Идентификатор", Идентификатор);
        ЭлементБлокировки.УстановитьЗначение("ТипДанных", ТипДанных);
        Блокировка.Заблокировать();
        
        Результат = Запрос.Выполнить();
        
        // Убедимся что данные требуют обновления
        Если НЕ Результат.Пустой() Тогда
            Выборка = Результат.Выбрать();
            Выборка.Следующий();
            Если НЕ ЗаписьКэшаВерсийУстарела(Выборка) Тогда
                // Данные актуальны
                ОтменитьТранзакцию();
                Возврат;
            КонецЕсли;
        КонецЕсли;
        
        Набор = РегистрыСведений.КэшПрограммныхИнтерфейсов.СоздатьНаборЗаписей();
        
        Набор.Отбор.Идентификатор.Установить(Идентификатор);
        Набор.Отбор.ТипДанных.Установить(ТипДанных);
        
        Запись = Набор.Добавить();
        Запись.Идентификатор = Идентификатор;
        Запись.ТипДанных = ТипДанных;
        Запись.ДатаОбновления = ТекущаяУниверсальнаяДата();
        
        Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Или Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда
        
            Данные = ПодготовитьДанныеКэшаВерсий(ТипДанных, ПараметрыПолучения);
            Запись.Данные = Новый ХранилищеЗначения(Данные);
            
        Иначе
            
            Набор.ДополнительныеСвойства.Вставить("ПараметрыПолучения", ПараметрыПолучения);
            
        КонецЕсли;
        
        Набор.Записать();
        
        ЗафиксироватьТранзакцию();
3 zak555
 
20.03.19
12:45
создали уже запись , потом пытаюсь ещё раз записать с теми же ключами
4 GreyK
 
20.03.19
12:58
(0) Предупреждений по синхронизации нет?
5 zak555
 
20.03.19
13:13
даже при попытке проверить подключение такая же ошибка
6 zak555
 
20.03.19
13:25
какая логика в коде из 2 ?
7 aleks_default
 
20.03.19
13:42
(6)Дату обновления меняют
8 aleks_default
 
20.03.19
13:44
Хотя код конечно говно
9 aleks_default
 
20.03.19
13:49
Транзакцию отменять надо если результат запроса пустой, если попытка блокировки не удалась(хотя зачем она здесь ума не приложу). А здесь ее фиксируют в конце  вне зависимости от результата записи Вот тебе ошибки ожидания заверщения транзакции и выдает
10 aleks_default
 
20.03.19
13:51
Если ПодготовитьДанныеКэшаВерсий никаких записей в базу данных не делает, то транзакция здесь вообще нахер не нужна
11 zak555
 
20.03.19
13:56
сейчас в РС всё пусто
12 zak555
 
20.03.19
13:59
(10) есть данные
13 zak555
 
20.03.19
14:04
Ключ = РегистрыСведений.КэшПрограммныхИнтерфейсов.СоздатьКлючЗаписи(СтруктураКлюча);

уже создаёт запись без ХЗ, которую блокирует
14 aleks_default
 
20.03.19
14:04
Набор.ДополнительныеСвойства.Вставить("ПараметрыПолучения", ПараметрыПолучения);
Загляни в модуль набора записей регистра. Видимо там еще какая-то обработка делается перед записью набора. Может там зависает.
15 aleks_default
 
20.03.19
14:05
(14)Или подписка
16 aleks_default
 
20.03.19
14:08
(13)Это не запись в базу данных, это ключ записи, которая еще не записана. Типа как объект документа.
17 zak555
 
20.03.19
14:09
(16) данные пишет, но не фиксирует транзакцию
18 zak555
 
20.03.19
14:13
(14)

Процедура ПередЗаписью(Отказ, Замещение)
    
    // Проверка значения свойства ОбменДанными.Загрузка отсутствует по причине того, что ограничения,
    // накладываемые данным кодом, не должны обходить установкой этого свойства равным Истина
    // (на стороне кода, который выполняет попытку записи в данный регистр).
    //
    // Данный регистр не должен входить в любые обмены или операции выгрузки / загрузки данных при включенном
    // разделении по областям данных.
    
    ТребуетсяКонтроль = ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных();
    
    Если ТребуетсяКонтроль Тогда
        
        ПараметрыПолучения = Неопределено;
        Если Не ДополнительныеСвойства.Свойство("ПараметрыПолучения", ПараметрыПолучения) Тогда
            
            ВызватьИсключение НСтр("ru = 'При записи данных в регистр сведений КэшПрограммныхИнтерфейсов из сеансов
                                    |с включенным разделением требуется передавать параметры получения данных для кэша
                                    |интерфейсов в дополнительном свойстве набора записей ПараметрыПолучения!'");
            
        КонецЕсли;
        
        Для Каждого Запись Из ЭтотОбъект Цикл
            
            Данные = ОбщегоНазначения.ПодготовитьДанныеКэшаВерсий(
                Запись.ТипДанных, ПараметрыПолучения);
            Запись.Данные = Новый ХранилищеЗначения(Данные);
            
        КонецЦикла;
        
        ТаблицаКонтроля = ЭтотОбъект.Выгрузить();
        
    КонецЕсли;
    
КонецПроцедуры
19 zak555
 
20.03.19
14:59
закоментил всё, что связано с транзакциями -- в РС появились записи
20 zak555
 
20.03.19
15:00
теперь новая беда
в базе Бух 3.0 не найдена настройка с узлом УТ
21 zak555
 
20.03.19
15:00
в УТ же нет РС псевдонимы узлов
Основная теорема систематики: Новые системы плодят новые проблемы.