Решение проблемы параллельного регистра денежных средств УНФ

Клиент хотел, чтобы у него был параллельный основному регистру денежных средств регистр, но в разрезе подразделений.

Создал такой регистр:

Прописал при записи основного регистра копирование в параллельный:

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

Сделал соответствующий отчет для клиента.

Но часто возникала проблема — при обновлении слетали движения, пришлось даже написать обработку для их восстановления:


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

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

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

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

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

Я даже в последний раз обновил вручную, но видимо, движения прописываются в документах, а не в регистре, в итоге они опять слетели.

В итоге пришло простое решение — можно добавить документы в расширение и прописать в разделе движения их регистраторами по параллельному регистру:

Прописал для всех документов, являющиеся регистратором основного регистра «Денежные средства»:

И все заработало! Без изменения основной конфигурации и, соответственно, правил для Обновлятора.

Среда: УНФ 3.0.11.169

fixin

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

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

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

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