Имя: Пароль:
1C
1C 7.7
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) Едет эстонец по дороге на телеге, видит лежит дохлая ворона,
он со свойственной им практичностью кладет ее в мешок и говорит:
( с акцентом) Может пригодится.
проходит год, едет тот же эстонец по той же дороге. подъезжает
к тому месту где в прошлом году подобрал ворону, открывает мешок,
вытряхивает из него все то, что осталось от вороны, и с тем же
акцентом говорит (не пригодилось)
©
Ошибка? Это не ошибка, это системная функция.