Потеря данных регистра накопления после обновления Обновлятором

Я сделал клиенту параллельный к регистру ДенежныеСредства регистр дор_ДенежныеСредства, где учитывал денежные средства в разрезе подразделений:

Заметил, что регистр постоянно слетает при обновлениях. Слетает частично, из-за того, что у него пропадает часть регистраторов:

Обновлятор умеет объединять только с приоритетом текущей конфигурации или новой конфигурации. Нет опции — сохранять регистраторы в документах.

Поэтому если какой-то документ меняется, у него восстанавливается типовой список регистраторов, если режим объединения «с приоритетом новой конфигурации». А использовать приоритет текущей конфигурации нельзя, иначе будет плохо с обновлением.

Но от использования Обновлятора не отказался. Хотя конечно, хорошо, что у меня регистр простой, а если бы был сложный?

Пришлось написать обработку по восстановлению движений:

Код простой:


&НаСервере
Процедура ВосстановитьДвиженияНаСервере()
	З = Новый Запрос(
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	Т.Регистратор КАК Регистратор,
	|	Т.Период КАК Период
	|ИЗ
	|	РегистрНакопления.ДвиженияДенежныхСредств КАК Т
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.дор_ДенежныеСредства КАК ТД
	|		ПО Т.Регистратор = ТД.Регистратор
	|ГДЕ
	|	ТД.Регистратор ЕСТЬ NULL
	|	И Т.Период МЕЖДУ &ДАта1 И КОНЕЦПЕРИОДА(&Дата2, ДЕНЬ)
	|
	|УПОРЯДОЧИТЬ ПО
	|	Т.Период");  
	З.УстановитьПараметр("Дата1", Дата1);
	З.УстановитьПараметр("Дата2", Дата2);
	Выборка = З.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		СформироватьДвиженияПоРегистратору(Выборка.Регистратор);
	КонецЦикла;                              
	Сообщить(Выборка.Регистратор);
	
КонецПроцедуры

Процедура СформироватьДвиженияПоРегистратору(ТекРегистратор);
	
	НЗИсх = РегистрыНакопления.ДенежныеСредства.СоздатьНаборЗаписей();
	НЗИсх.Отбор.Регистратор.Значение = ТекРегистратор;
	НЗИсх.Отбор.Регистратор.Использование = истина;
	НЗИсх.Прочитать();
	
	НЗ = РегистрыНакопления.дор_ДенежныеСредства.СоздатьНаборЗаписей();
	НЗ.Отбор.Регистратор.Значение = ТекРегистратор;
	НЗ.Отбор.Регистратор.Использование = истина;
	
	НЗ.Загрузить(НЗИсх.Выгрузить());              
	
	Если НЗ.Количество() > 0 Тогда
		
		Подразделение = Неопределено;
		МД = Метаданные.НайтиПоТипу(типЗнч(ТекРегистратор));
		Если ОбщегоНазначения.ЕстьРеквизитОбъекта("Подразделение", МД) Тогда
			Подразделение = ТекРегистратор.Подразделение;
		ИначеЕсли ОбщегоНазначения.ЕстьРеквизитОбъекта("ПодразделениеЗатраты", МД) Тогда
			Подразделение = ТекРегистратор.ПодразделениеЗатраты;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Подразделение) Тогда
			Для Каждого МЗ ИЗ НЗ Цикл
				МЗ.Подразделение = Подразделение;
			КонецЦикла;
		КонецЕсли;    
		
	КонецЕсли;
	
	НЗ.Записать();

КонецПроцедуры

&НаКлиенте
Процедура ВосстановитьДвижения(Команда)
	ВосстановитьДвиженияНаСервере();
КонецПроцедуры

Она оптимизирована. Если движения уже есть, то на этапе запроса еще их пропускает.

Раньше я делал через выгрузку/загрузку данных XML из копии базы, но этот метод проще, не нужна исходная база.

UPD: Уточнил у Милькина, автора Обновлятора, у него есть решение этой проблемы. Можно указать, как объединять отдельные объекты.

Среда: УНФ 3.0.10.126 Объем: 0.8 час

fixin

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

Читайте также:

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

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