Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
18 мая 2024, 22:10

Изменение непериодического подчиненного регистра сведений РИБ

Автор Romeo8044, 09 сен 2015, 15:50

0 Пользователей и 1 гость просматривают эту тему.

Romeo8044

Ребята есть проблема. Существует регистр сведений в который переносится ссылка на несуществующий объект. Регистр сведений подчинен регистратору, а поскольку регистратор - бытая ссылка , то невозможно просто зайти в него и его распровести. Запустить механизм тестирования и исправления тоже нельзя. Ввиду других ограничений.
Вопрос как перебрать записи регистра сведений и удалить все с битыми ссылками?
Вот так не работает - пустая выборка:
    кНабор = РегистрыСведений.СведенияОВыплатахРаботникамОрганизацийПоПлатежнымВедомостям.СоздатьНаборЗаписей();
    кНабор.Прочитать();
я так понимаю с этими регистрами нужно работать через отбор, но у регистра нет ни одного ресурса, только регистратор и два измерения. Т.е. отбор по регистратору который не существует нельзя сделать. Так как же подчистить регистр?

vitasw

Ну, и это логически. Для РС, подчиненных регистратору отбор доступен только по регистратору.
Я бы попробовал запросом извлечь регистраторы по этому РС. В выборке по запросу наваял бы что-то типа

МассивБитыхСсылок=Новый ММассив;
Пока Выборка.Следующий() Цикл
    Попытка
        ДокОб=Выборка.Регистратор.ПолучитьОбъект();
    Исключение
        МассивБитыхСсылок.Добавить(Выборка.Регистратор);
    КонецПопытки
КонецЦикла;

Ну а дальше дело техники. Перебираем массив, очищаем набор по битой ссылке.

Romeo8044

Делаю так:
   Физлицо = Справочники.ФизическиеЛица.НайтиПоКоду("О000000029");
   Запрос = Новый Запрос;
   ЗАпрос.Текст = "ВЫБРАТЬ
   |   СведенияОВыплатахРаботникамОрганизацийПоПлатежнымВедомостям.Физлицо,
   |   СведенияОВыплатахРаботникамОрганизацийПоПлатежнымВедомостям.Ведомость,
   |   СведенияОВыплатахРаботникамОрганизацийПоПлатежнымВедомостям.Регистратор
   |ИЗ
   |   РегистрСведений.СведенияОВыплатахРаботникамОрганизацийПоПлатежнымВедомостям КАК СведенияОВыплатахРаботникамОрганизацийПоПлатежнымВедомостям";
   //ЗАпрос.УстановитьПараметр("Физлицо",Физлицо);
   рез = запрос.Выполнить().Выгрузить();
   Для каждого Стр из рез Цикл   
      Если Стр.Физлицо = Физлицо Тогда
         темп = РегистрыСведений.СведенияОВыплатахРаботникамОрганизацийПоПлатежнымВедомостям.СоздатьНаборЗаписей();
         темп.Отбор.Регистратор.Установить(Стр.Регистратор);   
         темп.Прочитать();   
         Для каждого стр2 из темп цикл
            стр2.Регистратор=ДокументОснование.Ссылка;
         КонецЦикла;     
         Сообщить("Есть!");
      КонецЕСли;
   КонецЦикла;
   темп.Записать(Истина);
Но почему то запись в регистре не меняется. Хочу на конкретном человеке проверить... Может чего-то очевидного под конец дня не вижу.... Подскажите почему не проходят изменения по регистру.
Добавлено: 09 сен 2015, 16:29


ДокументОснование это то на что нужно поменять битую ссылку...

vitasw

Потому что нефиг пилить сук, на котором сидишь.

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СведенияОВыплатахРаботникамОрганизацийПоПлатежнымВедомостям.Регистратор
|ИЗ
| РегистрСведений.СведенияОВыплатахРаботникамОрганизацийПоПлатежнымВедомостям КАК СведенияОВыплатахРаботникамОрганизацийПоПлатежнымВедомостям
|ГДЕ
| СведенияОВыплатахРаботникамОрганизацийПоПлатежнымВедомостям.Сотрудник.Физлицо = &Физлицо";

Запрос.УстановитьПараметр("Физлицо", Физлицо);

Результат = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = Результат.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
БитаяСсылка=Ложь;
Попытка
ОбъектРегистратор=ВыборкаДетальныеЗаписи.Регистратор.ПолучитьОбъект(); //?тут надо как-то однозначно определять битость ссылки
Исключение
БитаяСсылка=Истина;
КонецПопытки;

Если Не БитаяСсылка Тогда
Продолжить;
КонецЕсли;

НаборЧтение=РегистрыСведений.СведенияОВыплатахРаботникамОрганизацийПоПлатежнымВедомостям.СоздатьНаборЗаписей();
НаборЧтение.Отбор.Регистратор.Установить(ВыборкаДетальныеЗаписи.Регистратор);
НаборЧтение.Прочитать();

НаборЗапись=РегистрыСведений.СведенияОВыплатахРаботникамОрганизацийПоПлатежнымВедомостям.СоздатьНаборЗаписей();
НаборЗапись.Отбор.Регистратор.Установить(Основание);
НаборЗапись.Прочитать();

Для каждого ЗаписьЧтение Из НаборЧтение Цикл
НоваяЗапись=НаборЗапись.Добавить();
ЗаполнитьЗначенияСвойств(НоваяЗапись,ЗаписьЧтение;
НоваяЗапись.Регистратор=Основание;
КонецЦикла;

НаборЧтение.Очистить();
НаборЧтение.Записать(Истина);

НаборЗапись.Записать(Истина);


КонецЦикла;

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск