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