Решение проблемы параллельного регистра денежных средств УНФ
Клиент хотел, чтобы у него был параллельный основному регистру денежных средств регистр, но в разрезе подразделений.
Создал такой регистр:

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


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

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

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