Имя: Пароль:
1C
 
Как перебрать все данные всех регистров сведений.
0 AllJoke
 
24.03.11
17:04
День добрый. Вопрос собственно в теме. Делается чито для поиска битых ссылок в значениях того или иного регистра сведений. Т.е есть РегистрыСведений - штук 11, вот все их перебираем, перебираем их измерения, их ресурсы, их реквизиты и ищем ссылку в которой "Объект не найден". Кто нить что нить подобное делал?
1 zak555
 
24.03.11
17:06
выборка ?
2 tocaelectro
 
24.03.11
17:07
Тестирование и исправление
3 AllJoke
 
24.03.11
17:09
(1) В выборке придется явно указывать каждый регистр конфигурации. А я вот такое нашел:

Для Каждого РегистрСведений Из Метаданные.РегистрыСведений Цикл
НО!!! Там берутся только объекты, сами данные получить не могу допереть.
4 AllJoke
 
24.03.11
17:14
ну и что? нет никаких идей???
5 YouAreEmpty
 
24.03.11
17:15
(3)Можно сделать программный запрос с объединением данных регистра
6 AllJoke
 
24.03.11
17:16
(5) Ого! И каким же это макаром?
7 YouAreEmpty
 
24.03.11
17:18
(3) Для лазания конкретно по записями удаления их это тебе нужен объект вида РегистрСведенийНаборЗаписей.ИмяРегистра
8 AllJoke
 
24.03.11
17:19
(7) Да это я понимаю. Но как мне получить на каждый регистр сведений вот этот самый НаборЗаписей?
9 YouAreEmpty
 
24.03.11
17:20
Обходишь по метаданным регистры сведений и нужные поля добавляешь программно к тексту запроса, используя ключевое слово объединить все. Но это чтобы получить данные для изменения таких данных нужно лазить по наборам записей
10 YouAreEmpty
 
24.03.11
17:21
(8) Щас помозгуем:)
11 Maxus43
 
24.03.11
17:21
Для Каждого РегистрСведений Из Метаданные.РегистрыСведений Цикл

НаборЗаписеЙ = [РегистрСведений.Имя].СоздатьНаборЗаписей();
НаборЗаписей.Прочитать();
Для каждого ЗапИсь Из НаборЗаписей Цикл
.....

типа что-то
12 YouAreEmpty
 
24.03.11
17:22
Одного не пойму зачем это тебе? или у тебя свойство "Ведущее" не во всех измерениях выставлено?
13 Mitriy
 
24.03.11
17:22
(0) на инфост_арте (антимат... гы...) таких обработок вроде полно...
14 Mitriy
 
24.03.11
17:22
(12) у него ссылки в ресурсах, видать...
15 AllJoke
 
24.03.11
17:22
(9) "Идешь туда не знаю куда, искать то не знаю что" - я нифига не понял. Допустим Начинаю беребирать регистры сведений
Для Каждого РегистрСведений Из Метаданные.РегистрыСведений Цикл
       Сообщить("!");
       Для Каждого Измерения Из РегистрСведений.Измерения Цикл
           Если Строка(Измерения.Тип) = "Число"
               ИЛИ Строка(Измерения.Тип) = "Строка"
               ИЛИ Строка(Измерения.Тип) = "Дата"
               ИЛИ Строка(Измерения.Тип) = "Булево" Тогда
           Иначе
               
               Сообщить("!!");
           КонецЕсли;
       КонецЦикла;
       Для Каждого Ресурса Из РегистрСведений.Ресурсы Цикл
           Если Строка(Ресурса.Тип) = "Число"
               ИЛИ Строка(Ресурса.Тип) = "Строка"
               ИЛИ Строка(Ресурса.Тип) = "Дата"
               ИЛИ Строка(Ресурса.Тип) = "Булево" Тогда
           Иначе
               
               Сообщить("!!");
           КонецЕсли;
       КонецЦикла;
       
   КонецЦикла;

Вот что то в этом роде. НО!!! Если Измерение имеет тип СправочникСсылка.ФизическиеЛица? Как получить данные?
16 YouAreEmpty
 
24.03.11
17:22
(11) Тут проблема в том как от метаданных к объекту перейти
17 Maxus43
 
24.03.11
17:23
(12) А у тебя во всех это стоит?)
18 YouAreEmpty
 
24.03.11
17:24
(15) Ты лучше скажи нам конечную цель такого поиска, так может и решение оптимальней найдем
19 Maxus43
 
24.03.11
17:24
(15) Если ТипЗнч(Измерения) = Тип("СправочникСсылка.ФизЛица") Тогда
...
20 YouAreEmpty
 
24.03.11
17:25
(17) Ну вроде при контроле ссылочной целостности у он не удалит объект если на него есть ссылки даже в регистрах сведений,такая трабла может возникнуть либо при переносе данных либо при непосредственном удалении
21 YouAreEmpty
 
24.03.11
17:26
(19) Ага и так для каждого справочника в конфигурации, коих может быть под сотню
22 AllJoke
 
24.03.11
17:28
(18) Удалить записи регистров сведений, где ссылка = "Объект не найден".
И потом (11) впихнул этот код, ругается:
{Форма.Форма.Форма(170,17)}: Ожидается выражение
       НаборЗаписей =<<?>> [РегистрСведений.Имя].СоздатьНаборЗаписей(); (Проверка: Толстый клиент (обычное приложение))
23 YouAreEmpty
 
24.03.11
17:29
(22) А вас с восьмеркой вообще как?
24 AllJoke
 
24.03.11
17:31
(23) Начинания. Но это же он (11) посоветовал.
25 YouAreEmpty
 
24.03.11
17:31
Тестирование и исправление по идее само найдет и удалит ссылки на несуществующие объекты, может попробуете на копии прогнать?
26 YouAreEmpty
 
24.03.11
17:32
(24) Ну он в виде синтаксического шаблона:). Все таки попробуйте для начала тестирование и исправление, только на копии
27 Maxus43
 
24.03.11
17:33
(24) я ж не проверял) как то так должно быть...
(22) v8: Вопрос знатокам. Объект не найден в звпросе!

вникни
28 AllJoke
 
24.03.11
17:33
(25) Блин. А можно не прибегать к ТИИ??? Можно все таки программно, раз уж мы тут программеры.
29 МихаилМ
 
24.03.11
17:33
ищите на ин-стрте по "Объект не найден"

там есть обработки борьбы (выявления,удаления) с битыми ссылками
30 YouAreEmpty
 
24.03.11
17:33
И кстати откуда у вас в базе битые ссылки взялись?
31 Maxus43
 
24.03.11
17:34
32 Maxus43
 
24.03.11
17:37
нашёл?

Ниже дана программа для удаления записей регистров, у которых регистратор - битая ссылка, т.е. не существует в базе.


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


Процедура КнопкаВыполнитьНажатие(Кнопка)

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

   Для Каждого пРегистр из Метаданные.РегистрыНакопления Цикл
       УдалениеБитыхСсылок(пРегистр.Имя,РегистрыНакопления,"РегистрНакопления")
   КонецЦикла;
   
КонецПроцедуры
33 YouAreEmpty
 
24.03.11
17:38
Можно закрывать:)
34 AllJoke
 
24.03.11
17:38
Я все это читал. Там затрагивают регистраторы. А у меня режим записи всех регистров независимый.
35 Maxus43
 
24.03.11
17:39
(34) Ну проверяй не регистратор а измерения... Регистратор - такое же поле как и другие
36 Alexandr Puzakov
 
24.03.11
17:46
Все просто...
37 AllJoke
 
24.03.11
17:47
(36) Ты думаешь? Объясни.
(35) Ладно. Попробую. Уже конец рабочего дня. Отпишуь.
38 Alexandr Puzakov
 
24.03.11
17:49
(37) я не думаю, я знаю.
39 AllJoke
 
24.03.11
17:57
(38) Так поделись опытом.
40 PetrVV
 
24.03.11
17:58
http://infostart.ru/public/82878/ - скачай эту обработку, она поможет.
41 Alexandr Puzakov
 
24.03.11
18:07
(39) тут ничего сложного нет. Только запросом не пользуйся для получения данных, лучше выборкой. Если регистры большие, то 1Ска может упасть.

Проверить, существует  ли такое значение легко:

БитаяСсылка = Ложь;
Попытка
   ТекущееЗначение.ПолучитьОбъект();
Исключение
   БитаяСсылка = Истина;
КонецПопытки;
Попытка