Сбой в РИБ-обмене УТ11 из-за блокировки периода
Клиент обнаружил, что при блокировании периода от изменений перестает работать обмен с РИБ. Если блокировку снять, то все работает. Но это плохо для расчета себестоимости — она начинает перерасчитываться всегда от начала блокировки.
Причем ошибка не проявляла себя — просто писалось, что в транзакции уже происходили ошибки:
Ошибка при вызове метода контекста (ЗакончитьЧтение)
{ОбщийМодуль.РасчетСебестоимостиПрикладныеАлгоритмы.Модуль(1805)}:Запрос.Выполнить();
{ОбщийМодуль.ОбменДаннымиУТ.Модуль(536)}:Возврат РасчетСебестоимостиПрикладныеАлгоритмы.СоздатьЗаданиеКРасчетуСебестоимостиПриОбменеДанными(ПолученныеДанные);
{ПланОбмена.Полный.МодульОбъекта(333)}:ОбменДаннымиУТ.СоздатьЗаданиеКРасчетуСебестоимостиПриОбменеДанными(ДанныеДляПерерасчета);
{ПланОбмена.Полный.МодульОбъекта(137)}:ПослеЗагрузкиДанных();
{Обработка.КонвертацияОбъектовРаспределенныхИнформационныхБаз.МодульОбъекта(232)}:ЧтениеСообщения.ЗакончитьЧтение();
{Обработка.КонвертацияОбъектовРаспределенныхИнформационныхБаз.МодульОбъекта(79)}:ПрочитатьФайлСообщенияОбмена(Отказ, ЧтениеXML, ЗагрузитьТолькоПараметры, ЗагрузитьМетаданные, СообщениеОбОшибке);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(5077)}:ОбработкаОбменаДанными.ВыполнитьЗагрузкуДанных(Отказ, ТолькоПараметры, СообщениеОбОшибке);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(8736)}:ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, СообщениеОбмена);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(8889)}:ВыполнитьОбменДаннымиЧерезФайловыйРесурс(СтруктураНастроекОбмена);
{Справочник.СценарииОбменовДанными.Форма.ФормаЭлемента.Форма(418)}:ОбменДаннымиСервер.ВыполнитьОбменДаннымиПоСценариюОбменаДанными(Отказ, Объект.Ссылка, Индекс);
[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
Ошибка при выполнении обработчика - 'ПередЗаписью'
по причине:
Ошибка при вызове метода контекста (Выполнить)
[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
Ошибка выполнения запроса
по причине:
В данной транзакции уже происходили ошибки!
Блокировка — это не дата запрета изменений, это регистр сведений НастройкаБлокировкиОтИзменений, дополнительный механизм контроля УТ11.
Я поискал, где встречается НастройкаБлокировкиОтИзменений, но мне это ничего не дало.
Решил отладить загрузку от точки и получил срабатывание по ошибке в модуле менеджера регистра ЗаданияКРасчетуСебестоимости в процедуре СоздатьЗаписьРегистра:

Набор записей как раз был на декабрь 2024, потому что этот период был заблокирован от изменений, я и предположил, что проблема здесь.

Само создание записей перерасчета себестоимости вызывается из модуля плана обмена Полный:

Стек выглядит так:

Ошибка:
Ошибка при вызове метода контекста (Записать)
{РегистрСведений.ЗаданияКРасчетуСебестоимости.МодульМенеджера(107)}:НаборЗаписей.Записать(Истина);
{РегистрСведений.ЗаданияКРасчетуСебестоимости.МодульМенеджера(156)}:СоздатьЗаписьРегистра(
{ОбщийМодуль.РасчетСебестоимостиПрикладныеАлгоритмы.Модуль(1876)}:РегистрыСведений.ЗаданияКРасчетуСебестоимости.СоздатьЗаписиРегистраПоДаннымВыборки(Запрос.Выполнить().Выбрать());
{ОбщийМодуль.ОбменДаннымиУТ.Модуль(536)}:Возврат РасчетСебестоимостиПрикладныеАлгоритмы.СоздатьЗаданиеКРасчетуСебестоимостиПриОбменеДанными(ПолученныеДанные);
{ПланОбмена.Полный.МодульОбъекта(333)}:ОбменДаннымиУТ.СоздатьЗаданиеКРасчетуСебестоимостиПриОбменеДанными(ДанныеДляПерерасчета);
{ПланОбмена.Полный.МодульОбъекта(137)}:ПослеЗагрузкиДанных();
{Обработка.КонвертацияОбъектовРаспределенныхИнформационныхБаз.МодульОбъекта(232)}:ЧтениеСообщения.ЗакончитьЧтение();
{Обработка.КонвертацияОбъектовРаспределенныхИнформационныхБаз.МодульОбъекта(79)}:ПрочитатьФайлСообщенияОбмена(Отказ, ЧтениеXML, ЗагрузитьТолькоПараметры, ЗагрузитьМетаданные, СообщениеОбОшибке);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(5077)}:ОбработкаОбменаДанными.ВыполнитьЗагрузкуДанных(Отказ, ТолькоПараметры, СообщениеОбОшибке);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(8736)}:ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, СообщениеОбмена);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(8889)}:ВыполнитьОбменДаннымиЧерезФайловыйРесурс(СтруктураНастроекОбмена);
{Справочник.СценарииОбменовДанными.Форма.ФормаЭлемента.Форма(418)}:ОбменДаннымиСервер.ВыполнитьОбменДаннымиПоСценариюОбменаДанными(Отказ, Объект.Ссылка, Индекс);
[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
Не удалось записать: "Задания к расчету себестоимости"!
[ОшибкаХранимыхДанных]
Решил сделать, что если запись регистра происходит по стеку из процедуры СоздатьЗаданиеКРасчетуСебестоимостиПриОбменеДанными, тогда не выдавать ошибку, игнорировать такие задания. Надеясь, что создание записей не вызывается в фоновом режиме, ведь отлаживал я все это в ключе РежимОтладки.
Вносим доработки в модуль менеджера регистра сведений ЗаданияКРасчетуСебестоимости:
&ИзменениеИКонтроль("СоздатьЗаписьРегистра") Процедура дор_СоздатьЗаписьРегистра(ПериодЗадания, ДокументЗадания, Организация, НомерЗадания, ИзмененыДанныеДляПартионногоУчетаВерсии21) ... Запись.НомерЗадания = НомерЗадания; #Вставка Попытка #КонецВставки НаборЗаписей.Записать(Истина); #Вставка Исключение ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); //Если ошибка возникла при обмене РИБ, игнорируем ее Если Найти(ТекстОшибки, ".СоздатьЗаданиеКРасчетуСебестоимостиПриОбменеДанными") = 0 Тогда ВызватьИсключение ТекстОшибки; КонецЕсли; КонецПопытки #КонецВставки КонецЦикла; ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ВызватьИсключение ТекстОшибки; КонецПопытки; КонецПроцедуры
Но это не помогло, далее в функции СоздатьЗаданиеКРасчетуСебестоимостиПриОбменеДанными модуля РасчетСебестоимостиПрикладныеАлгоритмы возникала ошибка в этом запросе:

Видимо, сбой транзакции записи рушил всю транзакцию обмена.
Поэтому решил вообще не создавать задания к пересчету себестоимости по обмену, пусть себестоимость пересчитывают при закрытии месяца. Расширяю модуль РасчетСебестоимостиПрикладныеАлгоритмы:
&Вместо("СоздатьЗаданиеКРасчетуСебестоимостиПриОбменеДанными") Функция дор_СоздатьЗаданиеКРасчетуСебестоимостиПриОбменеДанными(ПолученныеДанные) //Не вызываем, это конфликтует с блокировкой периода от изменений Возврат Истина; Результат = ПродолжитьВызов(ПолученныеДанные); Возврат Результат; КонецФункции
Вообще, открыл для себя новую вещь — даже если файл РИБ загружен, может быть ошибка, если 1С не выполняет сопутствующие действия и файл будет считаться не загруженным, даже если он грузится без проблем. Это серьезный недочет диагностики РИБ от типовых 1С.
Среда: УТ 11.5.22.92. Объем 1 час.




Свежие комментарии