Имя: Пароль:
1C
1С v8
Как удалить пустые записи из регистра сведений, подчиненного регистратору (файло
, ,
0 necro
 
09.12.14
10:20
Тема не нова: есть регистра сведений ЦеныНоменклатурыКонтрагентов, в котором имеется несколько пустых записей, то есть в которых не заполнен в том числе и регистратор. Как это получается - я не знаю, но сталкивался уже два раза и наверняка столкнусь еще. Основная проблема - конфигурацию невозможно обновить, так как "есть записи с одинаковым регистратором и номером строки". Что пробовал:
1. Удалить такие записи программно: невозможно, так как отбор набора записей по пустому регистратору не включается;
2. Проверку файла БД (chdbfl.exe): всё в порядке;
3. Тестирование и исправление: не удалось провести, не хватило памяти
То есть, остался вариант с удалением регистра и созданием его заново (есть на мисте), но мне кажется это уже перебор.

Есть ли какое-то нормальное решение проблемы?
1 Лефмихалыч
 
09.12.14
10:22
(0) не заполнен регистратор - это "объект не найден" или прямо пустая ссылка?
2 vicof
 
09.12.14
10:22
В скл перевести и напрямую убить в таблицах
3 necro
 
09.12.14
10:22
ЧТобы было понятнее:
<InformationRegisterRecordSet.ЦеныНоменклатурыКонтрагентов>
            <Filter>
                <Recorder>00000000-0000-0000-0000-000000000000</Recorder>
            </Filter>
            <Records>
                <Record>
                    <Recorder xsi:type="DocumentRef.УстановкаЦенНоменклатурыКонтрагентов">00000000-0000-0000-0000-000000000000</Recorder>
                    <Period>0001-01-01T00:00:00</Period>
                    <Active>false</Active>
                    <ТипЦен>00000000-0000-0000-0000-000000000000</ТипЦен>
                    <Номенклатура>00000000-0000-0000-0000-000000000000</Номенклатура>
                    <Договор>00000000-0000-0000-0000-000000000000</Договор>
                    <ЕдиницаИзмерения>00000000-0000-0000-0000-000000000000</ЕдиницаИзмерения>
                    <Валюта>00000000-0000-0000-0000-000000000000</Валюта>
                    <Цена>0</Цена>
                    <ЕстьВНаличииУЮриста>false</ЕстьВНаличииУЮриста>
                    <ОплатаДоставки/>
                    <ПроцентЗасора>0</ПроцентЗасора>
                    <НомерПротокола>0</НомерПротокола>
                </Record>
4 Cube
 
09.12.14
10:22
(0) "3. Тестирование и исправление: не удалось провести, не хватило памяти"
А ты не включай все галочки сразу...
5 pessok
 
09.12.14
10:22
добавить памяти и таки провести ТиИ. В целом, конечно, можно удалить регистр, сделать реструктуризацию (который опять таки не хватит памяти) а потом выполнить объединение, но ну его нафик, имхо
6 Maxus43
 
09.12.14
10:23
<Recorder>00000000-0000-0000-0000-000000000000</Recorder>

файловая даёт такое делать? скульная б ругнулась...
7 vicof
 
09.12.14
10:24
Сколько ж там гигов в файловой базе, что ТиИ падает?
8 necro
 
09.12.14
10:24
(4) Включаю проверку ссылочной целостности и ограничение времени 2 часа - не помогает.
9 Cube
 
09.12.14
10:24
(0) Выгрузи регистр в файл, удали ненужные записи в файле, очисти регистр в 1С, загрузи из файла.
Обработка на ИТС
10 necro
 
09.12.14
10:25
(9) обработка очистки регистра на ИТС? как называется?
11 Maxus43
 
09.12.14
10:26
записей сколько в регистре? вариант (9) норм, выгрузи в xml, прям там отбор при выгрузке можно сделать на не пустые
12 pessok
 
09.12.14
10:26
(6) нормально дает
    Набор = РегистрыСведений.СостояниеРаботниковОрганизаций.СоздатьНаборЗаписей();
    Набор.Отбор.Регистратор.Установить(Документы.ВозвратНаРаботуОрганизаций.ПустаяСсылка());
    Набор.Прочитать();
13 Maxus43
 
09.12.14
10:26
(10) очистка регистра - это просто СоздатьНаборЗаписей() и Записать() без отбора. Если много там - может сдохнуть...
14 Maxus43
 
09.12.14
10:27
(12) я про записать, а не про прочитать
15 Cube
 
09.12.14
10:27
(10) Обработка выгрузказагрудкаданныхxml, но она регистр не чистит, это делай другими средствами. В УПП, например, есть обработка Универс. обмен данными XML, там есть такая возможность.
16 pessok
 
09.12.14
10:29
(14) а, не вкурил, я думал, что посмотреть нельзя :)
17 Maxus43
 
09.12.14
10:30
автор, а чего ты говоришь что "отбор набора записей по пустому регистратору не включается", хотя вот в (12) норм. Кто то из вас врёт
18 pessok
 
09.12.14
10:32
+(17) и даже с NULL отрабатывает. другой вопрос - хз что там в наборе, не на чем такое проверить
19 necro
 
09.12.14
10:33
(17)
{Форма.Форма.Форма(239)}: Ошибка при вызове метода контекста (Записать)
НаборЗаписей.Записать();
по причине:
Ошибка записи! Не установлен отбор по регистратору (Регистр сведений: Цены номенклатуры контрагентов)
20 Лефмихалыч
 
09.12.14
10:33
(13) подчиненный регистр пустой набор без отбора по регистратору не запишет. Выгрузка-загрузка xml тоже не спасет, т.к. регистр подчиненный.
Тут либо в скуль грузить и там править, либо найти железяку, на которой ТИИ пройдет, либо при помощи tool_1cd.exe табличку полностью грохнуть, создать новую такую же и потом заполнить правильными данными из копии как раз уже выгрузкой-загрузкой xml.
21 Лефмихалыч
 
09.12.14
10:34
в общем, автор, я тебе сочувствую
22 pessok
 
09.12.14
10:35
(19) а в наборе что?
23 pessok
 
09.12.14
10:36
в смысле, как его читаешь?
24 Лефмихалыч
 
09.12.14
10:37
(23) он не читает, он пишет
25 pessok
 
09.12.14
10:37
(24) чтобы набор записать, его надо сначала прочитать
26 pessok
 
09.12.14
10:38
(24) если не надо полностью обнулить, ессно, но тут (20), да
27 ProxyInspector
 
09.12.14
10:39
А может быть в регистре временно поставить какую-нибудь галочку, чтобы давала удалять записи без регистратора? А потом вернуть обратно
28 Maxus43
 
09.12.14
10:39
(20) зачем сложности с tool_1cd и прочее? в конфигураторе удалить таблицу и всё, потом новую сделать (сравнением-объединением, чтоб идентификатор был такой же) - и загрузить
29 pessok
 
09.12.14
10:40
(27) не можно, к сожалению
30 Лефмихалыч
 
09.12.14
10:40
(26) ему читать бестолку - он уже всё прочитал (3)
задача у автора - удалить запись с пустым регистратором. Чтобы из регистра удалить запись, надо записать набор. Набор не запишется, пока не будет установлен непустой регистратор.
(28) или так, но это будут реструктуризаяца, а у него железо дохлое
31 pessok
 
09.12.14
10:41
(30) т.е. твердо при установке в качестве регистратора пустой ссылки или nulla не запишется? Просто не на чем проверить
32 Лефмихалыч
 
09.12.14
10:42
а чтобы идентификатор был гарантированно тот же, нужно загружать метаданные из xml. Если конфигурация поставщика не пустая, ИД может в итоге отличаться. но ты этого не заметишь, пока не включишь поддержку без возможности изменений, а это приведет опять к пересозданию
33 Лефмихалыч
 
09.12.14
10:42
(31) автор уже проверил (19)
34 pessok
 
09.12.14
10:42
(33) мы не знаем, что именно автор туда писал
35 Лефмихалыч
 
09.12.14
10:44
(34) у меня не сложилось впечатление, что автор способен перепутать жопу с пальцем
36 pessok
 
09.12.14
10:44
(35) согласен, конечно. но и на старуху, как известно
37 necro
 
09.12.14
10:59
(35) В общем, как бы там ни было, результат дает только
удаление регистра - сохранение конфы БД - загрузка старой конфы и опять сохранение - загрузка записей регистра.

База у меня, будь он неладна, естественно сидит на обмене, так что в прошлый раз я выгрузил регистр обменом а сейчас попробовал выгрузкой/загрузкой XML. Результат как будто одинаковый.

Средства редактирования таблиц в 1CD еще не изобрели?
38 pessok
 
09.12.14
11:00
(37) tool_1CD
39 AS_DANCE
 
09.12.14
11:05
А если собрать все эти записи, и привязать их к какому-либо документу.
Ну а потом уже вместе с доком удалить?
40 necro
 
09.12.14
11:06
(39) Регистр сведений, как известно - не ссылочный тип, и запись определяется именно набором измерений.
41 Лефмихалыч
 
09.12.14
11:12
(39) ну, да, как же мы раньше-то не догадались просто собрать и просто привести
42 necro
 
09.12.14
11:15
В любом случае, для меня осталось тайной, почему среди нескольких десятков одинаковых баз, в которые по идее уходят одинаковые цены, битые пока только две.
43 Лефмихалыч
 
09.12.14
11:18
(42) потому что битые данные не с обменом появились, а при отрубании липистричеств всяких во время транзакций. В файловой базе некому атомарность транзакции обеспечивать, кроме клиента
44 necro
 
09.12.14
11:20
(43) это да, есть у меня там база которая две недели на генераторе сидела и валилась каждый раз как документ печатали на лазерном принтере... Но файловая-то проверка молчит!
45 Лефмихалыч
 
09.12.14
11:26
(44) файловая проверка весьма условная штуковина. Она не умеет находить логические ошибки в данных. Если таблицы сами по себе не повреждены - то есть начинаются и заканчиваются правильными байтами, странички тоже не повреждены, то база считается исправной. Даже если во всех индексах дубли, в подчиненных регистрах сабж и что угодно еще с данными не так
46 Cube
 
09.12.14
12:04
(44) Ты (9) то попробовал?
47 necro
 
09.12.14
12:10
(46) Я не знаю, как очистить регистр.
48 pessok
 
09.12.14
12:31
(47) подчиненный регистратору - никак, в данном случае
49 necro
 
09.12.14
12:40
(48) раз люди советуют,  то наверное как-то можно
50 Cube
 
09.12.14
12:47
(47) Конфа какая? Про УПП я писал в (15)
51 Cube
 
09.12.14
12:47
(48) С чего это вдруг?
52 Phace
 
09.12.14
12:50
Я бы наверное, как уже писалось выше, попробовал все-таки воспользоваться Tool_1CD, меня она в свое время здорово спасла, помню выгружал проблемную таблицу в файл, что-то там делал, загружал обратно.
53 pessok
 
09.12.14
12:50
(49) единственно, как, вероятно, оно может сработать

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

ИЛИ
Набор.Отбор.Регистратор.Установить(Документы.ВозвратНаРаботуОрганизаций.ПустаяСсылка());
    Набор.Прочитать();
МассивЗаписей = Новый Массив;
Для Каждого Запись Из Набор
МассивЗаписей.Добавить(Запись);
КонецЦикла
Для Каждого ЭлЗапись Из МассивЗаписей Цикл
Набор.Удалить(ЭлЗапись )
КонецЦикла
54 necro
 
09.12.14
12:55
(50) В указанной обработке запись происходит менеджером записи, а не набором записи, точно не помню, кажется я так пробовал и тоже не получилось.
55 Cube
 
09.12.14
12:56
(54) Ай, блин, точно, там только объекты можно удалить и независимые РС...
Ну, тогда, гаси обработкой...
56 Cube
 
09.12.14
12:58
Попробуй просто выгрузить всю конфу в XML и загрузить в чистую конфу.
57 necro
 
09.12.14
12:58
(56) Да ну нафиг ) Она и так пять гигов ))
58 Cube
 
09.12.14
12:59
(57) А если записать набор с пустым регистратором?
59 pessok
 
09.12.14
13:00
(58) не запишет
60 Cube
 
09.12.14
13:00
Ну, тогда, пусть ТИИ делает частями.
61 pessok
 
09.12.14
13:01
вот кстати, а не пора ли замутить свертку базы то?
62 necro
 
09.12.14
13:05
(61) Увы, почти весь объем состоит из справочников
63 pessok
 
09.12.14
13:11
(62) (53) не помогло?
64 necro
 
09.12.14
13:34
(63) Даже не пробуя, могу предположить, что в первом варианте будет ошибка про несоответствие отбора, а во втором - про отсутствие отбора (при записи).
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший