Где взять GUID контрагента в 1С и как им пользоваться в обменах
Содержание
Уникальный идентификатор клиента в 1С — это GUID ссылки на элемент справочника «Контрагенты» (в УТ 11 и ERP — ещё и «Партнёры»). Быстрее всего его получить так: откройте карточку клиента, нажмите Shift+F11 («Получить ссылку») и скопируйте строку вида e1cib/data/Справочник.Контрагенты?ref=…. Последние 32 символа — это и есть идентификатор, только в служебном порядке байтов. Строку в привычном формате xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx даёт метод УникальныйИдентификатор().
Обычная ситуация: программист сайта или CRM просит «ID клиента из 1С», чтобы заказы падали на нужного контрагента, а не создавали двойника. Код справочника тут не подходит — он меняется при перенумерации. Нужен GUID: он один на всю жизнь элемента и одинаков во всех копиях базы.
Что такое GUID контрагента и чем он отличается от кода и ИНН
Каждый элемент справочника и каждый документ в 1С:Предприятии 8.3 получает при записи 128-битный уникальный идентификатор. Платформа хранит его в поле ссылки. Пользователь его не видит и вручную поменять не может.
У клиента в базе обычно три «номера», и их часто путают:
| Признак | Пример | Уникален? | Меняется? | Для чего |
|---|---|---|---|---|
| Код справочника | 00-000123 | В пределах базы (если включён контроль) | Да, при перенумерации и в другой базе | Поиск человеком, печатные формы |
| ИНН / КПП | 7701234567 / 770101001 | Нет: у филиалов ИНН общий, бывают дубли | Редко | Сопоставление при обмене, отчётность |
| GUID ссылки | 3f2504e0-4f89-11d3-9a0c-0305e82c3301 | Да, глобально | Никогда | Интеграции, обмены, связь с внешними системами |
📌 Что важно запомнить про GUID:
- 🔒 он назначается один раз и не меняется при правке наименования, ИНН или кода;
- 📦 он сохраняется при выгрузке и загрузке базы через
.dt, при копировании базы файлом; - 🆕 у скопированного элемента («Скопировать» в списке) будет новый GUID — это другой объект;
- 🗑️ после удаления элемента и создания «такого же» GUID будет другим, и внешние системы этого клиента уже не узнают.
Если внешняя система хранит у себя код 1С вместо GUID, первая же перенумерация справочника сломает связь. Договаривайтесь с интеграторами сразу о GUID.
Как узнать идентификатор клиента в 1С из интерфейса программы
В типовых конфигурациях (БП 3.0, УТ 11, КА, ERP) отдельного поля «GUID» в карточке контрагента нет. Но платформа даёт навигационную ссылку, а в ней идентификатор зашит.
Способ 1. Навигационная ссылка
- Откройте карточку клиента в справочнике контрагентов.
- Нажмите
Shift+F11или значок ссылки в заголовке формы. - В окне «Получить ссылку» скопируйте строку.
Ссылка выглядит так:
e1cib/data/Справочник.Контрагенты?ref=9a0c0305e82c330111d34f893f2504e0
Строка после ref= — это 16 байт идентификатора в том виде, в каком они лежат в базе. Для пользователя её достаточно: переслав её коллеге, вы откроете у него ровно этого клиента в той же базе или её копии.
Способ 2. Как перевести ref в обычный GUID
Байты в навигационной ссылке переставлены. Чтобы получить стандартную запись GUID из 32 символов ref, соберите группы так:
| Часть GUID | Символы из ref | В примере |
|---|---|---|
| 1-я (8 символов) | с 25-го по 32-й | 3f2504e0 |
| 2-я (4) | с 21-го по 24-й | 4f89 |
| 3-я (4) | с 17-го по 20-й | 11d3 |
| 4-я (4) | с 1-го по 4-й | 9a0c |
| 5-я (12) | с 5-го по 16-й | 0305e82c3301 |
Итог: 3f2504e0-4f89-11d3-9a0c-0305e82c3301. Это то же правило, что применяется к полю _IDRRef в SQL (ниже).
Код и ИНН в списке
Если на самом деле нужен не GUID, а код, добавьте колонку в список: Ещё → Изменить форму, отметьте поле «Код». ИНН в списке контрагентов БП 3.0 виден по умолчанию.
Что можно увидеть в Конфигураторе и в режиме отладки
Конфигуратор показывает метаданные, а не данные. В свойствах справочника «Контрагенты» видно длину и тип кода, автонумерацию, контроль уникальности — то есть понятно, можно ли полагаться на код как на ключ. GUID конкретного клиента в дереве метаданных не найти.
Посмотреть идентификатор элемента в Конфигураторе можно только через отладку:
- Запустите базу из Конфигуратора в режиме отладки (
F5). - Поставьте точку останова в модуле, где доступна ссылка на контрагента (например, в обработчике формы элемента или в своей внешней обработке).
- Когда выполнение остановится, откройте «Вычислить выражение» (
Shift+F9) и введите:
Строка(Объект.Ссылка.УникальныйИдентификатор())
⚠️ Отладку и правку модулей делайте на копии базы. В рабочей базе изменение конфигурации потребует обновления структуры, а это монопольный доступ и остановка работы пользователей.
Ещё одна функция Конфигуратора пригодится для SQL: имена таблиц хранения. Их возвращает ПолучитьСтруктуруХраненияБазыДанных() — пример в разделе про SQL.
Получение УИД клиента кодом и через консоль запросов
Язык запросов 1С не умеет вывести GUID строкой — в результате будет представление ссылки (наименование). Поэтому консоль запросов используют, чтобы найти нужную ссылку, а GUID получают одной строкой кода.
Запрос: найти клиента по ИНН
ВЫБРАТЬ
Контрагенты.Ссылка КАК Ссылка,
Контрагенты.Наименование КАК Наименование,
Контрагенты.ИНН КАК ИНН,
Контрагенты.КПП КАК КПП
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.ИНН = &ИНН
И НЕ Контрагенты.ПометкаУдаления
Код: выгрузить GUID всех найденных
Этот фрагмент можно выполнить во внешней обработке или в консоли кода с серверным контекстом:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.Наименование КАК Наименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН";
Запрос.УстановитьПараметр("ИНН", "7701234567");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
GUID = Строка(Выборка.Ссылка.УникальныйИдентификатор());
Сообщить(Выборка.Наименование + ": " + GUID);
КонецЦикла;
Выгрузить GUID всех клиентов в файл
Интеграторы обычно просят не один идентификатор, а таблицу «ИНН — название — GUID» для первичной загрузки. Её удобно сделать внешней обработкой: в Конфигураторе Файл → Новый → Внешняя обработка, добавьте форму и серверную процедуру. Внешнюю обработку
можно открыть в рабочей базе через Файл → Открыть, если у пользователя есть право на интерактивное открытие внешних обработок.
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.Наименование КАК Наименование,
| Контрагенты.ИНН КАК ИНН
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| НЕ Контрагенты.ЭтоГруппа
| И НЕ Контрагенты.ПометкаУдаления");
Запись = Новый ЗаписьТекста("C:\Temp\clients.csv", КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку("ИНН;Наименование;GUID");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Запись.ЗаписатьСтроку(СтрШаблон("%1;%2;%3",
Выборка.ИНН, Выборка.Наименование,
Строка(Выборка.Ссылка.УникальныйИдентификатор())));
КонецЦикла;
Запись.Закрыть();
Файл ложится на компьютер, где выполняется код. В клиент-серверной базе серверная процедура пишет файл на сервер 1С, а не на рабочее место — учтите это при выборе пути. Группы справочника отсечены условием ЭтоГруппа: у групп тоже есть GUID, но внешней системе они обычно не нужны.
Обратная задача: найти клиента по GUID
УИД = Новый УникальныйИдентификатор("3f2504e0-4f89-11d3-9a0c-0305e82c3301");
Ссылка = Справочники.Контрагенты.ПолучитьСсылку(УИД);
Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
Сообщить("Клиента с таким идентификатором в базе нет");
Иначе
Сообщить("Найден: " + Ссылка.Наименование);
КонецЕсли;
ПолучитьСсылку() вернёт ссылку всегда, даже если такого элемента нет. Без проверки через ПолучитьОбъект() (или запросом) вы получите «битую» ссылку и запишете её в документ.
Создать клиента с заранее известным GUID
Когда клиент заводится во внешней системе первым, GUID можно передать в 1С и создать элемент именно с ним:
Новый = Справочники.Контрагенты.СоздатьЭлемент();
Новый.УстановитьСсылкуНового(Справочники.Контрагенты.ПолучитьСсылку(УИД));
Новый.Наименование = "ООО Ромашка";
Новый.Записать();
Так и сайт, и 1С с первого дня знают клиента под одним ключом.
GUID клиента в базе SQL: таблица и перестановка байтов
В клиент-серверной базе справочник хранится в таблице вида _Reference123, ссылка — в колонке _IDRRef типа binary(16) (в PostgreSQL — bytea). Номер таблицы свой в каждой конфигурации.
Узнать имя таблицы
Имена = Новый Массив;
Имена.Добавить("Справочник.Контрагенты");
Структура = ПолучитьСтруктуруХраненияБазыДанных(Имена);
Для Каждого Стр Из Структура Цикл
Если Стр.Назначение = "Основная" Тогда
Сообщить(Стр.ИмяТаблицыХранения);
КонецЕсли;
КонецЦикла;
MS SQL: вывести GUID в стандартном виде
SELECT t._Description AS name,
LOWER(SUBSTRING(h,25,8) + '-' + SUBSTRING(h,21,4) + '-' +
SUBSTRING(h,17,4) + '-' + SUBSTRING(h,1,4) + '-' +
SUBSTRING(h,5,12)) AS guid
FROM (
SELECT _Description, CONVERT(varchar(32), _IDRRef, 2) AS h
FROM dbo._Reference123
) AS t;
PostgreSQL
SELECT _description AS name,
substring(h from 25 for 8) || '-' || substring(h from 21 for 4) || '-' ||
substring(h from 17 for 4) || '-' || substring(h from 1 for 4) || '-' ||
substring(h from 5 for 12) AS guid
FROM (
SELECT _description, encode(_idrref, 'hex') AS h
FROM _reference123
) AS t;
Только чтение и лучше на копии базы. Запись в таблицы 1С напрямую через SQL обходит проверки платформы, ломает ссылочную целостность и не поддерживается фирмой-разработчиком. Если нужно что-то менять — делайте это через встроенный язык.
Идентификатор клиента в обмене данными и интеграциях
Обмены между базами 1С
В типовых обменах на БСП (БП ↔ УТ, БП ↔ ЗУП, обмены через EnterpriseData) объекты сначала сопоставляются по GUID. Если пришёл клиент с GUID, которого в базе нет, программа ищет его по реквизитам — для контрагентов обычно это ИНН и КПП. Нашла — запоминает соответствие «чужой GUID ↔ наш элемент» в служебном регистре, и дальше связь держится уже по нему.
Отсюда практическое правило: перед первой синхронизацией двух баз, где клиенты заводились независимо, выполните сопоставление данных в мастере настройки синхронизации (Администрирование → Синхронизация данных). Несопоставленные строки свяжите вручную — иначе получите дубли.
Сайт, CRM, маркетплейсы
Для внешних систем GUID — самый надёжный ключ. Через стандартный интерфейс OData клиент адресуется прямо по нему:
/odata/standard.odata/Catalog_Контрагенты(guid'3f2504e0-4f89-11d3-9a0c-0305e82c3301')
В ответе GUID лежит в поле Ref_Key. Перед этим справочник нужно включить в состав публикуемых через OData.
Храните во внешней системе GUID, а ИНН используйте как запасной ключ для первого сопоставления. Код 1С — только для отображения людям.
Ошибки с идентификатором клиента и как их исправить
Частые вопросы
Совпадает ли GUID клиента в копии базы?
.dt, копирование каталога файловой базы или резервная копия SQL сохраняют все идентификаторы без изменений.