Сбой в РИБ-обмене УТ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 час.

image_pdfimage_print

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *