В процессе разработки в среде «1С:Предприятие» перед программистом часто встает задача получения уникального идентификатора (GUID) документа или справочника непосредственно в момент его сохранения в базу данных. Это может потребоваться для интеграции со внешними информационными системами, логирования, связи с подчиненными сущностями или для передачи данных в другие программные модули.
Однако начинающие разработчики часто сталкиваются со сложностями, пытаясь использовать интуитивные, но несуществующие методы, такие как ПолучитьИдентификатор(). В этой статье мы подробно разберем, почему возникает подобная ошибка, как правильно получить уникальный идентификатор в обработчике ПриЗаписи(), а также рассмотрим важные архитектурные нюансы работы с новыми объектами и современные возможности платформы 1С.
При попытке вызвать метод ПолучитьИдентификатор() у прикладного объекта (будь то документ, справочник или бизнес-процесс) платформа 1С выдает ошибку о том, что данный метод не обнаружен. Причина проста: в программном интерфейсе объектных сущностей 1С такого метода не существует.
Эту функцию часто путают со специфическими методами мобильной платформы, механизмами сериализации XML/XDTO или свойствами элементов управления на управляемой форме. Для получения ссылки и ее внутреннего GUID в платформе «1С:Предприятие» используются совершенно другие стандартные механизмы.
В модуле объекта документа в обработчике события ПриЗаписи() транзакция записи уже открыта, и ссылка на документ в базе данных гарантированно существует (даже если этот документ записывается впервые в своей истории).
Для того чтобы получить уникальный идентификатор, нам достаточно обратиться к свойству Ссылка нашего объекта. Рассмотрим два основных способа решения этой задачи.
Способ 1. Получение ссылки напрямую
Если для ваших дальнейших алгоритмов достаточно самой ссылки (которая внутри платформы по сути и является носителем уникального идентификатора), вы можете использовать простое обращение к свойству:
Процедура ПриЗаписи(Отказ)
// Ссылка уже сформирована и доступна
ТекущаяСсылка = ЭтотОбъект.Ссылка;
// Дальнейшая логика работы со ссылкой
КонецПроцедуры
Способ 2. Получение GUID (Уникального идентификатора)
Если вам требуется именно UUID (GUID) в виде специального объекта платформы или для последующего преобразования в текстовую строку, следует использовать метод УникальныйИдентификатор(), вызванный у ссылки:
Процедура ПриЗаписи(Отказ)
// Получаем уникальный идентификатор объекта
УникальныйИД = ЭтотОбъект.Ссылка.УникальныйИдентификатор();
// Например, выведем его строковое представление в окно сообщений
Сообщить(Строка(УникальныйИД));
КонецПроцедуры
Этот способ является наиболее наглядным, надежным и стандартным для экосистемы 1С.
Давайте проанализируем ситуацию, когда уникальный идентификатор необходим нам на более раннем этапе — в обработчике ПередЗаписью(). Для уже существующего (ранее записанного) документа свойство Ссылка заполнено. Но если пользователь создает новый документ, то в процедуре ПередЗаписью() свойство Ссылка все еще будет пустым, так как объект физически еще не создан в базе данных.
Что делать, если нам нужно получить уникальный идентификатор нового объекта заранее? Например, чтобы в этой же транзакции сформировать движения по регистрам или создать подчиненные записи в других справочниках. Для решения этой задачи мы можем применить механизм предустановки ссылки нового.
Разберем этот алгоритм по шагам:
ЭтоНовый().Новый УникальныйИдентификатор().ПолучитьСсылку().УстановитьСсылкуНового().Посмотрим на практический пример реализации этого механизма в модуле объекта:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ЭтотОбъект.ЭтоНовый() Тогда
// 1. Проверяем, не была ли ссылка уже установлена ранее (например, на форме)
БудущаяСсылка = ЭтотОбъект.ПолучитьСсылкуНового();
Если Не ЗначениеЗаполнено(БудущаяСсылка) Тогда
// 2. Генерируем новый GUID
НовыйGUID = Новый УникальныйИдентификатор();
// 3. Формируем ссылку для нашего типа документа
БудущаяСсылка = Документы.ПриходныйКассовыйОрдер.ПолучитьСсылку(НовыйGUID);
// 4. Принудительно назначаем ссылку объекту
ЭтотОбъект.УстановитьСсылкуНового(БудущаяСсылка);
КонецЕсли;
// Теперь мы можем заранее знать уникальный идентификатор нового документа
НашИдентификатор = БудущаяСсылка.УникальныйИдентификатор();
Иначе
// Для уже записанного документа всё стандартно
НашИдентификатор = ЭтотОбъект.Ссылка.УникальныйИдентификатор();
КонецЕсли;
КонецПроцедуры
Использование данного подхода гарантирует, что при физической записи в базу данных документ получит именно этот зарезервированный идентификатор, и вы избежите ошибок дублирования ссылок.
В рамках развития платформы разработчики «1С» регулярно добавляют полезные функции для оптимизации производительности. Ранее, если требовалось получить уникальные идентификаторы для целого списка документов в запросе, приходилось прибегать к выгрузке результата в таблицу значений и последующему обходу строк в цикле с вызовом метода УникальныйИдентификатор(), что негативно сказывалось на быстродействии при больших объемах данных.
Начиная с версии платформы 8.3.22, в язык запросов 1С и в язык выражений системы компоновки данных (СКД) была добавлена встроенная функция УникальныйИдентификатор(). Рассмотрим пример, как теперь можно быстро получить GUID документов прямо из базы данных с помощью запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка КАК ДокументСсылка,
| УникальныйИдентификатор(Ссылка) КАК СтрокаИдентификатора
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация";
РезультатЗапроса = Запрос.Выполнить();
Этот способ работает на уровне СУБД крайне эффективно и позволяет мгновенно получать текстовое представление GUID для сотен тысяч записей без лишних ресурсоемких преобразований на сервере приложений.
При обмене данными со сторонним ПО (веб-сайты, CRM-системы, внешние базы SQL) практически всегда требуется передавать идентификатор в виде обычной текстовой строки формата "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".
Рассмотрим, как выполнять конвертацию в обе стороны:
Строка(), передав в нее уникальный идентификатор.
// Текстовый вид: "e1c0b310-2b1e-11eb-8113-00155d013e02"
СтрокаGUID = Строка(ЭтотОбъект.Ссылка.УникальныйИдентификатор());
УникальныйИдентификатор из строки, а затем получаем ссылку через менеджер соответствующего документа.
// Восстанавливаем ссылку из текстового представления
СтрокаGUID = "e1c0b310-2b1e-11eb-8113-00155d013e02";
НовыйGUID = Новый УникальныйИдентификатор(СтрокаGUID);
СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(НовыйGUID);
Таким образом, мы детально разобрали все возможные варианты работы с уникальными идентификаторами документов при их записи в системе «1С:Предприятие». Использование правильных методов платформы избавит ваш код от ошибок и сделает алгоритмы интеграции и логирования простыми и надежными.