При работе с системой 1С:Предприятие 8.3, особенно в задачах интеграции с внешними системами или при разработке сложной логики, нам часто требуется однозначно идентифицировать объекты базы данных, такие как элементы справочников или документы. Для этой цели в платформе 1С предусмотрен уникальный идентификатор, или GUID (Globally Unique Identifier).
В этой статье мы подробно рассмотрим, как получить этот идентификатор программным способом, разберем различные сценарии и предоставим примеры кода для работы с GUID, которые помогут вам эффективно решать задачи разработки.
Каждый ссылочный объект в 1С (справочник, документ, план видов характеристик и т.д.) имеет свой уникальный идентификатор. Этот идентификатор генерируется платформой автоматически при создании объекта и остается неизменным на протяжении всего жизненного цикла объекта в базе данных. Он является гарантией уникальности объекта не только в рамках одной базы, но и при обмене данными между разными базами 1С или другими системами — для этого подойдёт готовая система обмена данными между базами 1С.
Важно понимать, что в 1С существует несколько способов работы с идентификаторами, и их применение зависит от того, с каким представлением объекта мы взаимодействуем: с
Объектом
Ссылкой
Самый распространенный сценарий — это получение GUID для объекта, который уже существует в базе данных. В этом случае мы работаем с
Ссылкой
Для получения уникального идентификатора существующего элемента справочника или документа, нам необходимо обратиться к свойству
УникальныйИдентификатор()
Ссылке
Прежде чем получить GUID, нам нужно получить саму ссылку на объект. Это можно сделать различными способами, например, используя поиск по коду, наименованию или номеру. При работе со сложными структурами часто требуется не только GUID, но и получение значения реквизита по ссылке на любом уровне вложенности.
// Пример получения ссылки на элемент справочника "Номенклатура" по коду
СсылкаНаНоменклатуру = Справочники.Номенклатура.НайтиПоКоду("000000001");
// Пример получения ссылки на документ "РеализацияТоваровУслуг" по номеру и дате
СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("00000001", Дата("20230101"));
// Если у нас уже есть объект, мы можем получить его ссылку так:
ОбъектСправочника = Справочники.Мой Справочник.СоздатьЭлемент();
// ... заполняем свойства объекта ...
// После записи объекта, его ссылка будет доступна
// ОбъектСправочника.Записать();
// СсылкаОбъекта = ОбъектСправочника.Ссылка;
Мы видим, что сначала мы должны получить объект типа
Ссылка
СсылкаНаНоменклатуру
СсылкаНаДокумент
Неопределено
После того как у нас есть
Ссылка
УникальныйИдентификатор()
УникальныйИдентификатор
Если СсылкаНаНоменклатуру <> Неопределено Тогда
GUIDНоменклатуры = СсылкаНаНоменклатуру.УникальныйИдентификатор();
Сообщить("GUID номенклатуры: " + GUIDНоменклатуры);
Иначе
Сообщить("Номенклатура не найдена.");
КонецЕсли;
Если СсылкаНаДокумент <> Неопределено Тогда
GUIDДокумента = СсылкаНаДокумент.УникальныйИдентификатор();
Сообщить("GUID документа: " + GUIDДокумента);
Иначе
Сообщить("Документ не найден.");
КонецЕсли;
Результатом выполнения
УникальныйИдентификатор()
УникальныйИдентификатор
Когда нам нужно передать GUID во внешнюю систему или просто отобразить его в текстовом виде, мы должны преобразовать его в строку. Это делается с помощью стандартной функции 1С
Строка()
Если СсылкаНаНоменклатуру <> Неопределено Тогда
GUIDНоменклатуры = СсылкаНаНоменклатуру.УникальныйИдентификатор();
GUIDНоменклатурыСтрокой = Строка(GUIDНоменклатуры);
Сообщить("GUID номенклатуры как строка: " + GUIDНоменклатурыСтрокой);
КонецЕсли;
Таким образом, мы получим строковое представление GUID, которое можно легко использовать для интеграции или других задач, требующих текстового формата.
Ситуация несколько меняется, когда мы выполняем программное создание объектов, которые еще не записаны в базу данных. В этот момент у объекта еще нет постоянной ссылки, а следовательно, и постоянного уникального идентификатора. Для упрощения разработки при массовом создании данных часто применяется генерация кода по ссылке, которая позволяет быстро получить готовый фрагмент кода для создания объекта со всеми реквизитами.
Рассмотрим следующий пример:
НовыйЭлементСправочника = Справочники.МойСправочник.СоздатьЭлемент();
НовыйЭлементСправочника.Наименование = "Тестовый Элемент";
НовыйЭлементСправочника.Код = "000000002";
// Попытка получить GUID до записи
// GUIDДоЗаписи = НовыйЭлементСправочника.Ссылка.УникальныйИдентификатор(); // Это приведет к ошибке, так как Ссылка еще не существует
// Правильный способ: сначала записать объект, потом получить GUID из Ссылки
Попытка
НовыйЭлементСправочника.Записать();
GUIDПослеЗаписи = НовыйЭлементСправочника.Ссылка.УникальныйИдентификатор();
Сообщить("GUID нового элемента после записи: " + Строка(GUIDПослеЗаписи));
Исключение
Сообщить("Ошибка при записи нового элемента: " + ОписаниеОшибки());
КонецПопытки;
Мы выяснили, что до записи объекта в базу данных его
Ссылка
НовыйЭлементСправочника.Ссылка
Неопределено
Ссылка
Иногда возникает задача сгенерировать совершенно новый, еще не связанный ни с каким объектом в базе данных уникальный идентификатор. Это может быть полезно, например, для временной идентификации данных во внешней системе до их загрузки в 1С, или для создания уникальных ключей в промежуточных структурах данных.
Для этого в 1С используется конструктор
Новый УникальныйИдентификатор()
НовыйGUID = Новый УникальныйИдентификатор();
Сообщить("Сгенерирован новый GUID: " + Строка(НовыйGUID));
Мы должны понимать, что этот сгенерированный GUID не имеет никакого отношения к существующим объектам в базе 1С. Это просто случайный, глобально уникальный идентификатор, который может быть использован по вашему усмотрению.
Уникальные идентификаторы очень удобно использовать в запросах для поиска объектов. Например, если у нас есть строковое представление GUID, полученное из внешней системы, мы можем найти соответствующий объект в 1С. А если после поиска вам понадобится быстро внести изменения в найденный объект, в этом поможет универсальный редактор данных (УРД), позволяющий удобно править реквизиты и движения.
// Предположим, у нас есть строковый GUID, полученный извне
СтроковыйGUIDИзВне = "a1b2c3d4-e5f6-7890-1234-567890abcdef";
// Преобразуем строковый GUID в объект типа УникальныйИдентификатор
GUIDДляПоиска = Новый УникальныйИдентификатор(СтроковыйGUIDИзВне);
// Использование в запросе
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.УникальныйИдентификатор = &GUID";
Запрос.УстановитьПараметр("GUID", GUIDДляПоиска);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
НайденнаяСсылка = Выборка.Ссылка;
Сообщить("Номенклатура найдена по GUID: " + НайденнаяСсылка);
Иначе
Сообщить("Номенклатура с таким GUID не найдена.");
КонецЕсли;
Таким образом, мы эффективно используем GUID для однозначного поиска объектов, что особенно важно при синхронизации данных.
В ходе нашего анализа мы рассмотрели различные аспекты работы с уникальными идентификаторами (GUID) в 1С 8.3. Мы выяснили, что:
Ссылка.УникальныйИдентификатор()
Строка(GUID)
Новый УникальныйИдентификатор()
Мы настоятельно рекомендуем использовать GUID как основной способ идентификации объектов при синхронизации 1С с другими системами, так как это гарантирует максимальную надежность и уникальность идентификации — для этих задач есть универсальная выгрузка и загрузка данных с сопоставлением ссылок. Используя предоставленные примеры и объяснения, вы сможете уверенно решать задачи, связанные с уникальными идентификаторами в своих 1С-проектах.