|
v7: Изменить ID в справочнике | ☑ | ||
---|---|---|---|---|
0
Ефремов
13.01.21
✎
07:31
|
Добрый день, коллеги!
Получил сообщение о переполнении внутренних идентификаторов (поле ID) в справочнике. Некоторые записи я удалю и сожму таблицу. Но хотел и изменить ID. Записи в справочнике не связанные с другими справочниками, - поэтому особых проблем нет. Но вот открыть dbf файл для доступа к полю ID из 1с не получается. Подскажите, пожалуйста, как открыть справочник методами работы с dbf файлами из 1с7.7 ? Или другой способ изменения поля ID ? |
|||
1
ДенисЧ
13.01.21
✎
07:34
|
Создай новую базу и перелей туда данные, создавая новые объекты и не привязываясь к ИД.
Или переходи на 8ку, там такая проблема пока не предвидится... |
|||
2
Ефремов
13.01.21
✎
07:48
|
Спасибо. Конфигурация для вспомогательных целей. Написана давно. Практически, вся самописанная. Переход на 8-ку - неприемлемо по трудоемкости.
Я, конечно, попробую выгрузку и загрузку данных. Но когда-то я пробовал такой метод. Он не изменил ID и процесс выгрузки и загрузки базы выполнялся очень долго. |
|||
3
ДенисЧ
13.01.21
✎
07:55
|
(2) Не выгрузку-загрузку. А именно перенос. Например, через КД или самописные.
Выгрузка-загрузка ИД сохраняет, если эклер не изменяет. |
|||
4
ДенисЧ
13.01.21
✎
07:56
|
Ну а если уж идти по пути смены ид... Файлы базы 1с нужно открывать из другой базы. Из неё самой - вряд ли получится. И да, процесс поиска и замены этих ид по времени займёт вряд ли меньше времени, чем перенос в новую.
|
|||
5
Mikeware
13.01.21
✎
08:06
|
добавь УРБД, пропиши ИД базы. или измени. и наступит счастье
|
|||
6
ДенисЧ
13.01.21
✎
08:12
|
(5) Так урбд эе ид таскает, а они у него переполнены...
|
|||
7
Mikeware
13.01.21
✎
08:19
|
(6) иды уникальны в пределах ида базы.
|
|||
8
Ефремов
13.01.21
✎
08:20
|
Может, есть недокументированная функция обращения к полю ID?
|
|||
9
ДенисЧ
13.01.21
✎
08:21
|
(7) Ви таки хочите сказать, что если справочник улетит по урбд - у него будет другой ид?
Позвольте Вам не поверить. (8) Нет. |
|||
10
Mikeware
13.01.21
✎
08:21
|
(8) и что тебе нужно от этой функции?
|
|||
11
Андрей_Андреич
naïve
13.01.21
✎
08:26
|
(9) Так есть еще префикс базы неиспользуемый - аж 3 разряда в ИД
|
|||
12
Mikeware
13.01.21
✎
08:29
|
(9) куда "улетит"?
id - это собственно сам ид как чар(6) и дбсигн как чар(3) если он создавался в базе без уурбд, максимальный будет "ZZZZZZ ", при смене сигна базы с пустой на, например, SGN новый ид создастся " 1SGN" |
|||
13
Mikeware
13.01.21
✎
08:30
|
(11) во! "префикс базы"! хотя скорее, он суффикс. не помню уж как он там правильно называется
|
|||
14
Mikeware
13.01.21
✎
08:39
|
(9) почему нет? ЗначениеВСтрокуВнутр, ну и _IdToStr()/_StrToId(), и строковые функции - "а-а-а вот, овощи там, рожь — вот это всё"©...
(8) http://my1c-archive.narod.ru/knowhow/get_id.html |
|||
15
ДенисЧ
13.01.21
✎
08:40
|
(14) А обратно?
|
|||
16
Mikeware
13.01.21
✎
08:45
|
(15) а что ты хочешь сделать обратно? Фарш невозможно провернуть назад!©
|
|||
17
ДенисЧ
13.01.21
✎
08:47
|
(16) Я хочу? Я же не совсем больной, я просто недообследованный )))
|
|||
18
trdm
13.01.21
✎
08:47
|
(1) Можно и без новой БД обойтись.
Проосто добавить новый справочник с такой-же структурой, можно его сделать банальным копи-пасте. Обработкой перебросить данные из актуальных позиций. Прибить старый, переименовать новый. Все. |
|||
19
Mikeware
13.01.21
✎
08:49
|
(17) ну, хороший хирург всегда поможет плохому танцору...
|
|||
20
trdm
13.01.21
✎
08:52
|
+(18) Поскольку:
(0) >Записи в справочнике не связанные с другими справочниками, - поэтому особых проблем нет. |
|||
21
Ефремов
13.01.21
✎
09:07
|
(10) Доступ к полю ID справочника.
(18) Хороший вариант. Но пользователи, без админа БД, не смогут его самостоятельно реализовать. |
|||
22
Ефремов
13.01.21
✎
09:08
|
Я сейчас делаю обработку переноса данных в архивную таблицу. И хотелось бы одновременно изменить ID в рабочей.
|
|||
23
trdm
13.01.21
✎
09:26
|
(21) А пользователь и не должен. Прогер сможет.
|
|||
24
Ефремов
13.01.21
✎
09:59
|
(18) Как Вы думаете, можно обойтись без копирования индексного файла промежуточного справочника, если потом переиндексировать базы в конфигураторе? Все равно надо будет сжимать файлы dbf.
|
|||
25
Mikeware
13.01.21
✎
10:00
|
(20) ТКВ.
ведь можно обойтись без всякого копирования... (21) ну и зачем вам этот доступ? что вы им делать будете? |
|||
26
MWWRuza
гуру
13.01.21
✎
10:32
|
(0) Получил сообщение о переполнении внутренних идентификаторов (поле ID) в справочнике.
Позвольте полюбопытствовать... Это-ж сколько у Вас там записей в этом справочнике? |
|||
27
Salimbek
13.01.21
✎
10:32
|
(24) А для чего вам этот справочник и его ИД? Он (этот справочник) где-то используется? Если да, то в этом самом "где-то" записан именно ИД элемента справочника. И если вы этот самый ИД поменяете, то в вашем документе появится волшебное "Объект не найден". Так что если хотите менять, то надо в транзакции (я бы делал прямыми запросами через SQL) 1) нашли все объекты, где есть этот элемент; 2) поменяли ИД у элемента на НовыйИД; 3) поменяли везде в объектах ИД на НовыйИД; 4) Перешли к следующему элементу.
(12) Т.е. используется 36-ричная система и 6 знаков, т.е. у автора 2 млрд 176 млн записей в этом справочнике? Сурово. |
|||
28
Salimbek
13.01.21
✎
10:32
|
(26) 36^6 = 2 176 782 336
|
|||
29
MWWRuza
гуру
13.01.21
✎
10:37
|
Получается, справочник "пустой", в смысле структуры... Без реквизитов, с минимальной длиной наименования(или вообще без него) и т.п.,. иначе уже давно все встало бы из-за размеров ДБФки...
|
|||
30
MWWRuza
гуру
13.01.21
✎
10:39
|
Это я к чему - может просто глюк, и нет там такого?
|
|||
31
trdm
13.01.21
✎
10:59
|
(24) Да зачем его копировать?
из (18) уточнение: 1. (в конфигураторе:) Добавить новый справочник с такой-же структурой, можно его сделать банальным копи-пасте. На старом справочнике становишся, ctrl+insert и тут-же Shift+insert. 2. Обработкой перебросить данные из актуальных позиций. На этот момент у тебя в конфе 2 справочника. Перебираешь страрый, добавляешь в новый. 3. (в конфигураторе:) Прибить старый (удалением ветки в метаданных), переименовать новый, присвоив идентификатор старого. Все. |
|||
32
trdm
13.01.21
✎
10:59
|
Ну и само собой все это на копии для начала.
|
|||
33
trdm
13.01.21
✎
10:59
|
С архивами и т.п.
|
|||
34
trdm
13.01.21
✎
11:01
|
(25) ТКВ?
|
|||
35
Mikeware
13.01.21
✎
11:07
|
(34) Традиционный Китайский Вопрос - "анахуа?"©
|
|||
36
Ёпрст
13.01.21
✎
11:21
|
Странно, врят ли в сам файл дбф столько записей уместится, быстрее файл будет 2 гига, чем id справочника переполнится.
|
|||
37
Ёпрст
13.01.21
✎
11:21
|
(0)Размер таблички справочника какой хоть ?
|
|||
38
Ефремов
13.01.21
✎
11:31
|
(31) Спасибо за разъяснение.
(27) Используется чисто для отчетов. С другими справочниками не связан. (25) Хотел изменить содержимое поля ID. Когда-то я так делал, но внешней программкой. Сейчас лень писать на FOX или C#. (26) Приличного обозначения количества записей назвать затрудняюсь, только матерное... Каждый месяц добавляется по 500К записей. Возможно, можно обойтись только переносом записей в архивную таблицу, без изменения ID - если 1с ругается на размер файла. Но хотел одновременно и ID поправить. (30) Я давно хотел сделать обработку удаления записей из этого справочника, но, как всегда, не нашел времени, пока база не рухнула. Сейчас пользователи кругами ходят и не пристают с другими работами. (36) Если часто удалять записи, то может и переполнится ID. Вначале записи удалялись. Потом сделал перезапись актуальных записей на неактуальные. (37) 2 145 298 354 байт |
|||
39
Djelf
13.01.21
✎
11:31
|
(0) Инициализируешь Центральную базу, даешь префикс.
По факто он конечно будет постфикс, но это не важно. Нумерация пойдет новая, т.е. не " 2Б ", а " 2БЦБ". |
|||
40
Ёпрст
13.01.21
✎
11:42
|
(38) дык ты уже уперся в максимальный размер дбф файла, больше туда уже не запихнешь. Тут только в скуль базу положить, или заместо справочника пользовать табличку в скульлайте, например
|
|||
41
Ефремов
13.01.21
✎
11:54
|
(40) Не знаю такого слова: "скуль".
Я и так переписываю записи в другую таблицу, а ту чищу. |
|||
42
ДенисЧ
13.01.21
✎
11:55
|
"Не знаю такого слова: "скуль"."
А, ты из тех, кто называет это "сикуэль":? |
|||
43
trdm
13.01.21
✎
12:01
|
(40) не поможет.
|
|||
44
Ефремов
13.01.21
✎
12:02
|
(42) SQL ?
|
|||
45
Mikeware
13.01.21
✎
12:04
|
(39) им не нужно решение, им надо потрахаться...
|
|||
46
Ёпрст
13.01.21
✎
13:34
|
(43) почему? В скуле просто потом префикс иб добавит и по-новой ид..зато не будет упираться в размер дбф
|
|||
47
Mikeware
13.01.21
✎
13:55
|
(46) ну как вариант (если хочется отстаться в файловой), поставить префикс, и убить старые неиспользуемые элементы справочника. сколько там делов, минут на 10 же?
|
|||
48
Ёпрст
13.01.21
✎
14:03
|
(47) ну да, можно и так..только каждый раз искатт потом неиспользуемые..тоска
|
|||
49
Mikeware
13.01.21
✎
14:37
|
(48) по идее, напейсать робота - пусть сам ползает да удаляет... да и за 1 раз ему еще на пяток лет хватит, а потом всё это все равно сдохнет...
|
|||
50
Вафель
13.01.21
✎
14:40
|
можно же писать из другой базы 1с
|
|||
51
Mikeware
13.01.21
✎
14:41
|
(50) да решений-то дофига. было бы желание...
|
|||
52
Arbuz
13.01.21
✎
18:00
|
Эээ... Что-то тут не то. И каков же в таком случае размер одной записи? байт - пол-байта?
|
|||
53
MWWRuza
гуру
13.01.21
✎
23:26
|
+(52) Во, во... Я об этом еще в (29)(30) написал...
|
|||
54
Cthulhu
14.01.21
✎
00:14
|
НЕ НАДО МЕНЯТЬ В БАЗЕ. каждый Ид надо менять во всей базе данных одномоментно. безошибочнее (и, наверное,быстрее) это будет сделать через выгрузку-замену-загрузку. текстовых редакторов с возможностью выполнять замены в больших файлах хватает, выгрузка в распакованном виде это текст, ну и патч ромикса вам в помощь...
|
|||
55
Ефремов
14.01.21
✎
05:31
|
(52) 1с ругалась на размер, хотя в сообщении говорила про индексы.
Перенес данные в архивную таблицу, сжал файлы и все заработало. Но изменить ID все равно хочется. Спасибо всем принявшим участие. |
|||
56
Ефремов
14.01.21
✎
09:50
|
(31) Да, с предположением о копировании я поторопился - в файлах поля SPххххх не совпадают.
|
|||
57
trdm
14.01.21
✎
10:07
|
(56) Понятное дело не совпадут.
|
|||
58
Mikeware
14.01.21
✎
10:46
|
(56) (57) а что мешает поменять?
соотношение-то однозначное. |
|||
59
trdm
14.01.21
✎
10:54
|
(56) прямой доступ без парсера 1С++ не оговаривался.
|
|||
60
Ефремов
11.02.21
✎
11:40
|
Изменил ID так:
ПолноеИмяФайла = КаталогИБ() + "SC27225.DBF"; Если фс.СуществуетФайл(ПолноеИмяФайла) = 0 Тогда Сообщить("Файл: " + ПолноеИмяФайла + " не найден.", "!"); Возврат; КонецЕсли; // **** РАБОТА С ФАЙЛАМИ DBF ЧЕРЕЗ ADODB.RecordSet *** АДО = СоздатьОбъект("ADODB.Connection"); СтрокаСоединения = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + КаталогИБ() + ";Extended Properties=DBASE IV;"; Если 0 = АДО.Open(СтрокаСоединения) Тогда Предупреждение("Операция: СоздатьОбъект(''ADODB.Connection'') не выполнена."); Возврат; КонецЕсли; // *** Константы *** adoPenForvardOnli = 0; adLockOptimistic = 3; adLockPessimistic = 2; rs = CreateObject("ADODB.Recordset"); rs.ActiveConnection = АДО; rs.Source = "SC27225.DBF"; rs.CursorType = adoPenForvardOnli; rs.LockType = adLockPessimistic; Попытка rs.Open(); Исключение Предупреждение("Не смог открыть файл SC27225.DBF. Возможно, база открыта монопольно."); Возврат; КонецПопытки; инд = 0; Пока rs.EOF = 0 Цикл инд = инд + 1; ИД = СокрЛП(_IdToStr(инд)); Состояние("Прочитано: " + инд + " записей. Старый индекс: " + rs.Fields("id").Value + ". Новый индекс: " + ИД); rs.Update("id", ИД); rs.MoveNext(); КонецЦикла; rs.Close(); АДО.Close(); Надо, конечно, еще было индексный файл открыть, но тогда дольше будет программа работать. И так 22 минуты понадобилось на моем компе. |
|||
61
Ефремов
11.02.21
✎
11:42
|
Долго не отвечал, т.к. был занят другой, срочной работой.
|
|||
62
Злопчинский
11.02.21
✎
11:50
|
(60) что-то у меня это вызывает сомнение...
|
|||
63
Mikeware
11.02.21
✎
11:53
|
(62) тебе сомневаться - не лень? :-)
забей... |
|||
64
Ефремов
11.02.21
✎
11:53
|
(62) Я реально изменил ID.
|
|||
65
Ефремов
11.02.21
✎
11:54
|
Может, кому то пригодится.
|
|||
66
Ефремов
11.02.21
✎
11:56
|
(60) Замечание: в программу надо заходить не монопольно.
|
|||
67
Mikeware
11.02.21
✎
11:56
|
(65) Едет эстонец по дороге на телеге, видит лежит дохлая ворона,
он со свойственной им практичностью кладет ее в мешок и говорит: ( с акцентом) Может пригодится. проходит год, едет тот же эстонец по той же дороге. подъезжает к тому месту где в прошлом году подобрал ворону, открывает мешок, вытряхивает из него все то, что осталось от вороны, и с тем же акцентом говорит (не пригодилось) © |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |