Изменить идентификатор объекта |
Я |
31.08.12 — 16:59
А можно каким-то образом изменить идентификатор объекта? Конкретно мне надо — документа! Вообще где он? как его прочитать? и поменять… ))
1 — 31.08.12 — 17:00
нет
2 — 31.08.12 — 17:01
Можно.
3 — 31.08.12 — 17:01
Но не нужно
4 — 31.08.12 — 17:02
(1)(2)(3) +1 
5 — 31.08.12 — 17:03
(0) Идентификатор = Объект
Замена идентификатора = Поиск и замена значений
6 — 31.08.12 — 17:15
нет… идентификатор не равно объект… мне нужно прочитать гуид объекта… неужели нет способа??
7 — 31.08.12 — 17:17
(6) Опиши задачу целиком.
8 — 31.08.12 — 17:18
гуид — загугли тут или в любой типовой
9 — 31.08.12 — 17:20
ДокументСсылка.<Имя документа>.УникальныйИдентификатор (DocumentRef.<Имя документа>.UUID)
ДокументСсылка.<Имя документа> (DocumentRef.<Имя документа>)
УникальныйИдентификатор (UUID)
Синтаксис:
УникальныйИдентификатор()
Возвращаемое значение:
Тип: УникальныйИдентификатор.
Описание:
Получает уникальный идентификатор ссылки.
Ссылка может быть получена из уникального идентификатора с помощью метода менеджера ПолучитьСсылку.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
См. также:
ДокументМенеджер, метод ПолучитьСсылку
10 — 31.08.12 — 17:21
(7) при загрузке данных из ЗУП в БП, а именно документа «Отражение зарплаты в регл. учете» документ за август создается, а за февраль удаляется. я попробовал изменить гуид в хмл-е и сработало! видимо каким-то образом совпали гуиды документов за февраль и август (не пойму каким) хочу убедиться что я прав… для этого мне надо прочитать гуиды этих докумнетов
11 — 31.08.12 — 17:21
(9) ООО! спасибо!
12 — 31.08.12 — 17:32
(10) Значит, что кто-то сильно умный в ЗУПе взял февральский документ и изменил ему период на август.
13 — 31.08.12 — 17:38
(0) Можно, создать другой объект с нужным гуид, затем обработкой Поиск и замена дублирующихся элементов справочников объединить их.
Вот только с предопределенными объектами это не проходит… Кто знает как это сделать средствами 1С? (менять в скуле рискованно)
14 — 31.08.12 — 17:40
(12) теоретически, возможно… но, если честно, не совсем понимаю, как это могло произойти…
15 — 31.08.12 — 17:42
(14) заходишь в документ, меняешь, записываешь
16 — 31.08.12 — 17:45
(15) да не… не в том дело… просто как бы какой смысл им так делать?…
17 — 31.08.12 — 17:55
(16) у нас пару раз в месяц такое происходит.
Бухи поняли, что гораздо быстрее вводить документ, если скопировать старый и в нем поменять всего несколько полей.
Теперь внимание: если бух случайно вместо кнопки «копировать» нажмет кнопку «открыть», (а это ему как два пальца об асфальт) получается твоя ситуация.
Ответ он всегда на поверхности.
18 — 31.08.12 — 18:01
(17) а че вы дали тьокам права на вольности с доками прошлого, отчаянные финские парни? При хорошей организации прав такие финты можно делать только в текущем дне, все что было вчера, а тем более в прошлом месяце — извините прочти кучу сообщений о запретах, последствиях, ответься 10 раз — «Да, я не дура и вполне адекватна, сохранить» и только потом позволить изменить что-то в «старом доке»
19 — 31.08.12 — 18:05
(18) эти доки не старые. Может даже сегодняшние.
20 — 31.08.12 — 18:08
(18) и в принципе, если например типовая 1С-ка у клиента, вы за свои деньги будете ему эти запреты вставлять?
21 — 31.08.12 — 18:10
поиск и замена дублей
22 — 31.08.12 — 20:47
(21) А с предопределенными объектами как?
23 — 31.08.12 — 20:56
(22) Никак. Гуид предопределенного элемента прописан внутри конфигурации и его не изменить. Проводил эксперимент — в скуле менял гуид предопределенного элемента. В результате после очередного сохранения конфигурации был создан еще 1 предопределенный элемент с таким же гуидом.
24 — 31.08.12 — 21:00
(23) Ключевое слово — «предопределённый»?
25 — 31.08.12 — 22:06
(23) «В результате после очередного сохранения конфигурации был создан еще 1 предопределенный элемент с таким же гуидом» — шалишь? Я еще допускаю одинаковый гуид для разных типов объектов, но в пределах одного типа это невозможно — гуид это ключ!
У меня при обмене баз, когда стоит синхронизация по гуид, такая хрень получается:
Ошибка при загрузке данных: {Обработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(4795)}: Ошибка записи объекта
ТипОбъекта = Виды контактной информации
Объект = Телефон физ.лица служебный
ОписаниеОшибки = Ошибка при вызове метода контекста (Записать): Ошибка при попытке вставки записи с неуникальным значением ссылки.
Microsoft OLE DB Provider for SQL Server: Нарушено «PK___Referen__AC8ED0C40F7C1D9B» ограничения PRIMARY KEY. Не удается вставить повторяющийся ключ в объект «dbo._Reference49». Повторяющееся значение ключа: (0xb9493d07ec2909514bd24a29a071e1b7).
HRESULT=80040E2F, SQLSrvr: SQLSTATE=23000, state=1, Severity=E, native=2627, line=1
«Гуид предопределенного элемента прописан внутри конфигурации» — если сам не пропишешь, типа:
Процедура ЗаполнитьПредопределенныхПартнеров() Экспорт
// СправочникОбъект = Справочники.Партнеры.НашеПредприятие.ПолучитьОбъект(); // возмем из базы Кайрос. 10.01.2012 МВ.
СправочникСсылка = Справочники.Партнеры.ПолучитьСсылку(Новый УникальныйИдентификатор(«97403c2a-4260-481c-8835-1ea87e51a4aa»));
СправочникОбъект = СправочникСсылка.ПолучитьОбъект();
Если СправочникОбъект = Неопределено Тогда
СправочникОбъект = Справочники.Партнеры.НашеПредприятие.СоздатьЭлемент();
СправочникОбъект.УстановитьСсылкуНового(СправочникСсылка);
КонецЕсли;
СправочникОбъект.ДатаРегистрации = Дата(1980, 1, 1);
Попытка
СправочникОбъект.Записать();
Исключение
Сообщить(«Не удалось записать партнера НашеПредприятие» + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;
И то, это помогает для вновь создаваемой базы. Если предопределенный объект пришел с обновлением, то задать ему нужный гуид таким методом не получается. Может кто-то как-то исхитрился менять на нужный гуид?
26 — 01.09.12 — 22:20
Я чего-то не очень понимаю, зачем менять GUID у объекта ?
Ведь он используется для определения ссылок на сам объект. То есть замена GUID приведёт к созданию другого объекта, но с такими же данными внутри. То есть будет равносильно DELETE+CREATE.
Или вы и все ссылки на ваш объект хотите поменять ?
27 — 02.09.12 — 00:01
(26) Необходимости менять гуид нет никогда. Желание его поменять возникает у тех кто ищет простой способ все исправить и не искать истинных причин инцидента.
(22) Почти то же самое, в конфиге создается второй предопределенный элемент, с первого все ссылки в базе перешиватся все на второй, первый предопределнный элемент уничтожается в конфиге. Второй переименовывается в то же имя что было у первого
28 — 02.09.12 — 00:31
(27) Не — один раз возникала необходимость подмены GUID из-за того, что в двух разных базах нужно было сделать один и тот же объект, когда там было уже два объекта — пришлось просто делать замену GUID во всех ссылках.
29 — 02.09.12 — 00:46
(28) ну так то да, но сшивание двух баз это все таки не то чтобы подмена гуидов, а наполнение одной базы объектами другой и потом замена ссылок по базе.
А тут не замена одного объекта на другой, а именно смена гуида как цель
30 — 02.09.12 — 00:58
(29) Если в SQL, то как раз просто замена GUID-а, но так обычно не делают.
31 — 03.09.12 — 09:04
(27) Будет время, попробую этот метод.
(30) Если это справочник Виды контактной информации (как в моем примере (25))большого риска нет это сделать SQL, а если это например, Управленческая организация, которая используется в документах большого периода… у кого есть опыт замены GUID-а прямо в SQL?
32 — 03.09.12 — 09:30
(31) Теоретически, ничего сложного: через метаданные получить таблицы, где могут быть ссылки на элемент, получить имена этих таблиц в SQL и сделать замену.
На инфостарте есть пример.
33 — 03.09.12 — 09:35
Сорри, а какой смысл работы в SQL «напрямую»? Скорость? Но это — нештатная ситуация и алгоритм — «одноразовый». Если замена GUID-ов используется в штатном режиме работы — это бред.
Mikhail Volkov
34 — 03.09.12 — 12:39
(33) Для предопределенных объектов штатный режим не подходит. Если только предложенный (27), но тоже далеко не штатный.
Время прочтения
4 мин
Просмотры 4.2K
При возникновении необходимости миграции с одной конфигурации поставщика на другую, либо при обновлении доработанной конфигурации, если Поставщик позднее добавил тот объект, что был у нас добавлен самостоятельно, может оказаться, что старый и новый объекты имеют разные внутренние идентификаторы. При сравнении/объединении конфигураций видно, что старый документ не находит соответствие с новым, так как у них различные внутренние идентификаторы метаданных, а при загрузке (обновлении) новой конфигурации поставщика старый документ удаляется вместе со всеми введенными документами.

Существует несколько вариантов решения данной проблемы:
А. Перенос удалившихся документов после обновления конфигурации в новый объект метаданных с помощью правил обмена (данный способ рекомендует использовать 1С);
Б. Использование правил настройки сравнения/объединения конфигураций. При этом можно настроить соответствие между старым и новым объектом метаданных. В пользовательской базе останется старый объект (со старым УИДом), а при сравнении/объединении он будет модифицироваться изменениями нового объекта поставщика. Но при этом объект останется со старым УИДом и на поддержку не встанет.
В. Начать использовать новый объект конфигурации поставщика, перекинув в него все данные из старого объекта путем замены УИДов. При этом конфигурацию можно поставить на поддержку, использовать автоматическое обновление, кроме того, не требуется осуществлять как таковой перенос данных. Исключается риск получить неполный перенос данных, битые ссылки и т.д. При данной методике данные вообще не изменяются.
Разберем подробно вариант «В».
- Для того, чтобы стало возможно перекидывание УИДов, необходимо сделать одинаковыми количество и типы реквизитов старого и нового объектов метаданных. Важно, чтобы любому из реквизитов (табличных частей и т.д.) старого документа соответствовал реквизит нового документа с точно таким же типом данных. При этом названия реквизитов значения не имеют. Для проверки был создан тестовый документ с несколькими реквизитами разных типов, в том числе ссылочных, и с табличной частью в первой, «старой» конфигурации. Было создано несколько объектов этого документа с заполненными данными. Во второй, «новой» конфигурации был создан другой документ (не скопирован, а именно заново создан), количество и типы реквизитов — одинаковые:
- Далее базу со старыми документами требуется сравнить/объединить с новой конфигурацией, добавить новый документ, не удаляя при этом старый. Запускаем обновление конфигурации базы данных, чтобы изменения полностью применились и не было отличий основной конфигурации и конфигурации базы данных. В итоге после объединения в базе должны появиться два вида документов: старый, с заполненными данными, и новый — пустой. При этом, повторюсь, реквизиты документов должны полностью совпадать по типам данных.
- Теперь выгрузим конфигурацию в XML-файлы, чтобы удобно было находить все интересующие нас УИДы:
- Открываем файл «старого» документа (ivi_ТестовыйДокументУКФ.xml), ищем и фиксируем УИДы его самого и всех его реквизитов и табличных частей:
УИД документа:
УИД реквизита:
Табличная часть также имеет свой УИД:
- Далее делаем тоже самое для «нового” документа.
- В итоге получается два списка, для старого и нового объектов:
- Теперь, зная УИДы,, отправляемся в базу данных для их замены.
https://its.1c.ru/db/metod8dev/content/1798/hdoc — статья на ИТС с подробным описанием структуры хранения данных в БД.
Нас интересует таблица Params, в которой расположены соответствия между объектами конфигурации 1С и таблицами базы MS SQL. Данные соответствий хранятся в текстовом формате, упакованном алгоритмом Deflate:
- Выгружаем из таблицы Params двоичные данные файла с именем DBNames:
Через SQL Management studio данные выгружаются в формате HEX, где каждый символ кодируется двумя шестнадцатеричными знаками, так как выгружается в текстовом виде. Для дальнейшей работы с данными их необходимо преобразовать из формата HEX в формат BIN. Подойдет любой конвертер HEX to BIN. Я использовал конвертер https://tomeko.net/online_tools/hex_to_file.php?lang=en
В итоге получили двоичный файл, по длине совпадающий с длиной поля в БД, 955126 байт. - Раскодируем полученный файл. Для раскодировки использовал обработку: https://infostart.ru/public/618906/
Распакованный DBNames выглядит следующим образом (слева — УИД 1С, далее — префикс и номер таблицы SQL):
- Наша задача – заменить УИДы 1С между старым и новым документами, не затрагивая при этом имена таблиц SQL.
На рисунке выше УИДы уже заменены. - Сохраняем файл и упаковываем (Inflate) его с помощью той же обработки, что использовали для распаковки (9)
- С помощью SQL-запроса помещаем новый файл в DBNames:
UPDATE [ukf_real_test].[dbo].[Params] SET [BinaryData] = (
SELECT *
FROM OPENROWSET(BULK N’C:DBNames-FM.dfl’, SINGLE_BLOB) tt) where [FileName] = ‘DBNames’.
Следующим запросом устанавливаем поле с длиной двоичных данных в правильное значение, чтобы не возникло внутренней ошибки в 1С при обращении к ним:
UPDATE [ukf_real_test].[dbo].[Params] SET [DataSize] = 954234 where [FileName] = ‘DBNames’; - Откроем конфигуратор 1С. Необходимо, чтобы 1С реструктуризировал данные измененного документа. Для этого необходимо внести любое изменение в состав или значения реквизитов и сохранить, обновив конфигурацию базы данных.
- После реструктуризации запускаем 1С в режиме предприятия.
Все данные из „старого“ документа перешли в „новый“:
Состояние документов и ссылки рабочие.
База 1С обновляется, реструктуризируется без ошибок.
При загрузке новой конфигурации старый документ, в котором уже нет объектов, удаляется, а все документы остаются в новом.
Данная статья описывает лишь принцип работы с данными. Осуществлять вручную подмену УИДов, в особенности для объектов с большим числом реквизитов, — достаточно трудоемко и имеет смысл автоматизировать данный процесс.
Содержание
УИД или уникальный идентификатор
Описание
УИД это определенное значение, однозначно идентифицирующее объект ссылочного типа данных, другими словами, это и есть ссылка уникальная в рамках одной конкретно взятой таблицы, например у справочника номенклатура. УИД есть у любого объекта имеющего ссылочный тип данных, из синтаксис помощника следует, что УИД имеет следующий вид: «XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX», где Х — символы обозначающие шестнадцатеричное число. Прочитать какой текущий уникальный идентификатор существует у ссылки можно с помощью метода УникальныйИдентификатор() например:
КонтрагентПетров = Справочники.Контрагенты.НайтиПоНаименованию(«Петров Иван Сергеевич»); УИД = КонтрагентПетров. УникальныйИдентификатор();
Использование своего УИД при создании объекта
Изменить УИД у существующего объекта, штатными средствами встроенного языка нельзя. Зато можно при создании нового объекта указать свой УИД. Для этого нужно сделать несколько действий:
-
Сгенерировать значение типа УИД, используя нужную нам строку(или не используя, как вам будет удобно)
СтрокаGUID = "a763cfbb-f94f-4c67-8e13-0e96a3a7f353"; НовыйGUID = Новый УникальныйИдентификатор(СтрокаGUID); //или просто НовыйGUID = Новый УникальныйИдентификатор;
-
Получить ссылку из уже существующего УИД, нужного нам типа:
СсылкаСНовымКлиентом = Справочники.Клиенты.ПолучитьСсылку(НовыйGUID);
-
Установить эту ссылку новому объекту
НовыйКлиент = Справочник.Клиенты.СоздатьЭлемент(); НовыйКлиент.УстановитьСсылкуНововго(СсылкаСНовымКлиентом);
Подсказка. Если мы создаем УИД из конкретно взятой строки, то мы можем получить УИД существующего объекта и следовательно в шаге два получить не новую ссылку, а вполне себе существующую. В таком случае при записи объекта полученного в шаге три, система сообщит о том, что не может записать объект с неуникальной ссылкой. Зато получение ссылки по строковому идентификтору, очень удобно использовать при синхронизации между разнородными системами(не 1С) или между разными базами.
Ссылки
Только авторизованные участники могут оставлять комментарии.
-
Возникла необходимость изменить внутренний идентификатор элемента справочники. Возможно ли это сделать?
-
Offline
wolf3d
Опытный в 1С- Регистрация:
- 5 мар 2011
- Сообщения:
- 83
- Симпатии:
- 0
- Баллы:
- 26
вв=справочники.товар.получитьобъект(); вв.код="новый мега код"; вв.записать();
оно?
-
Offline
shurikvz
Модераторы
Команда форума
Модератор- Регистрация:
- 1 окт 2009
- Сообщения:
- 8.547
- Симпатии:
- 344
- Баллы:
- 104
Для чего?
Подробней опишите что случилось, и в связи с чем вы хотите его поменять.
-
Offline
n.s.gnedash
Опытный в 1С
Команда форума- Регистрация:
- 15 авг 2010
- Сообщения:
- 1.383
- Симпатии:
- 6
- Баллы:
- 29
ты изменил Код , элемента, а имелся ввиду UUID
-
Offline
uza
1С, VBA (EXCEL), VB (.NET + WEB)- Регистрация:
- 10 июл 2007
- Сообщения:
- 1.845
- Симпатии:
- 1
- Баллы:
- 29
Ну прямо вот так менять UUID элементов справочников или документов из под 1С нам недозволенно.
Оно и логчично. т.к. этот UUID «торчит» ключом, связывающим одни таблицы с другими (табличные части, ссылки на справочники)
Но если ну ооооооооочень надо надежно менять UUID (что я себе слабо представляю), то можно:
0) Снимаем резеврную копию БД.
1) Создаем новые элемент справочника.
2) Ищем ссылка на исходный элемент.
3) «Перекидываем» эти ссылки на новый элемент.
4) Перепроверяем что не осталось ссылок на старый эл-т.
5) Удаляем старый элемент. -
Offline
wolf3d
Опытный в 1С- Регистрация:
- 5 мар 2011
- Сообщения:
- 83
- Симпатии:
- 0
- Баллы:
- 26
ы)
а я всегда считал что код в справочнике и есть uuid -
Offline
uza
1С, VBA (EXCEL), VB (.NET + WEB)- Регистрация:
- 10 июл 2007
- Сообщения:
- 1.845
- Симпатии:
- 1
- Баллы:
- 29
Поздравляю! Осталось еще системный блок назвать процессором а монитор компьютером
Или ой… я сейчас разбил еще одно представление о мире?
А по дипломам то посмотришь — все как один «инженер-программист», и сотку хотят «на старте»…
-
Offline
uza
1С, VBA (EXCEL), VB (.NET + WEB)- Регистрация:
- 10 июл 2007
- Сообщения:
- 1.845
- Симпатии:
- 1
- Баллы:
- 29
UUID но это еще не КЛЮЧ просто в 1С primary key’ем выступает поле, формирующееся UUIDными значениями.
А вот КОД справочника — это всего-лишь реквизит. Не ключ, хотя может тоже формироваться UUID’ами.
Ключ не может быть «задвоен» — определение, йопта. А вот код в справочнике — может. Даже если установлен контроль уникальности (могу показать как этого достигнуть… с пляской, однако). Но ведь 1С при этом не начинает пуатать Иванова И.И. с ООО Бармаглот… Потому как ключ, первичный ключ — от шаловливых ручек программистов из БД доступен только для чтения.
А вот поменять руками прямым запросом к MS SQL, например можно. Потому как 1С при создании БД не создает диаграм, через котоыре бы и контролировались уникальности ключей на уровне СУБД. Вот однако поменять то вы поменяете, а вот как отработать ссылки на этот элемент справочника, я слабо представляю. Т.к. помимо «открытых» ссылок через реквизиты таблиц СУБД, ссылки могут еще храниться в BLOB’овых полях — структура которых обработке простым запросом «в два притопа» не поддается.В прочем для чего я это все объясняю? Да, КОД — ключ и UUID, а монитор = компьютер.
-
Offline
wolf3d
Опытный в 1С- Регистрация:
- 5 мар 2011
- Сообщения:
- 83
- Симпатии:
- 0
- Баллы:
- 26
дружищще, что ж ты такой агрессивный то?)
думаю что про базы данных я знаю немного поболее тебя ибо писал их еще на асме в далеком 91 году), когда ни фокса и даже клиппера несуществовало(правда уже непомню кто из них первый вышел))))
применительно к 1с-ке — никогда не заморачивался кодами — потому как нафиг не нужно для тех задач которые я решаю
как сказал один мой товарищ — идеальных защит нет
отличная защита, это такая защита, которую проще купить, чем сломатьа по топику — 90% топикстартеров немогут внятно правильно описать проблему — поэтому был дан самый простой вариант ответа — и заметь я не написал что это именно тот ответ который нужен, а показал пример и задал вопрос — ОНО?
и еще заметь — от топик стартера кроме первого больше нет вопросов)))зы. у меня нет диплома, но меня тоже бесят когда моник компом зовут и тд.
- Похожие темы
-
- Ответов:
- 3
- Просмотров:
- 1.332
При использовании распределенных БД часто возникает проблема «Задвоения» элементов или наоборот, «Объект не найден».
Данная обработка позволит вам установить произвольный GUID для существующих объектов.
При замене GUID объекта обработка изменяет GUID по ссылкам во всех связанных объектах.
Принцип работы с обработкой:
1) В поле «Элемент» указываем объект базы, у которого мы хотим поменять GUID.
Поле «Тек ГУИД» заполняется GUID-ом выбранного элемента.
2) В поле «Нов ГУИД» вводим GUID который мы хотим задать для этого элемента.
3) Указываем строку подключения для базы данных.
Важно. Поскольку обработка происходит на сервере, то строки подключения различаются для х64 и х32 сервера приложений.
4) Тип алгоритма:
«Медленная» замена, с отображением таблиц – При поиске на каждый подходящий реквизит выполняется 3 запроса к MS SQL серверу, при этом выводится информация о таблицах и количествах замены.
Быстрая замена – замена всех значений происходит хранимой процедурой, за одно обращение к MS SQL серверу, однако таблицы для замены определяются при помощи «НайтиПоСсылкам». (Быстрее первого способа, но минимум информации)
Быстрая замена, везде, включая движения документа– замена всех значений происходит хранимой процедурой, за одно обращение к MS SQL серверу. В процессе замены мы пытаемся заменить ссылку в любом подходящем по типу поле в БД. Таким образом, ссылки будут замещаться и в движениях документов и в итогах.
Самый опасный способ! Но мы ведь смелые, без бэкапов ощущения не те (сарказм).
В этом случае желательно сделать тестирование и полный пересчет итогов. А в случае режима «слияния» объектов пересчет вообще обязателен.
5) Для современных релизов платформы у пользователя, под которым осуществляется запуск обработки, необходимо в конфигураторе снять галочку «Защита от опасных действий» в противном случае 1с отказывается полноценно работать с COM-объектами.
Возможен режим «Слияния» объектов.
Предположим, у нас есть 2 элемента справочника с одинаковыми наименованиями и мы хотим, что бы это стал 1 элемент. Можно запустить обработку с поиском и заменой значений, а можно запустить мою обработку.
Выбираем 1 из элементов, «Нов GUID» делаем равным GUID-у второго элемента, отмечаем галочку «Не менять ссылку».
Таким образом во всех вхождениях первого элемента будет изменена ссылка на второй элемент, а у самого элемента GUID не поменяется после этого, помечаем к удалению первый элемент за ненадобностью.












Или ой… я сейчас разбил еще одно представление о мире?