Как получить уникальный идентификатор документа при записи в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки в среде «1С:Предприятие» перед программистом часто встает задача получения уникального идентификатора (GUID) документа или справочника непосредственно в момент его сохранения в базу данных. Это может потребоваться для интеграции со внешними информационными системами, логирования, связи с подчиненными сущностями или для передачи данных в другие программные модули.

Однако начинающие разработчики часто сталкиваются со сложностями, пытаясь использовать интуитивные, но несуществующие методы, такие как ПолучитьИдентификатор(). В этой статье мы подробно разберем, почему возникает подобная ошибка, как правильно получить уникальный идентификатор в обработчике ПриЗаписи(), а также рассмотрим важные архитектурные нюансы работы с новыми объектами и современные возможности платформы 1С.

Выясняем причину: почему возникает ошибка при вызове ПолучитьИдентификатор()?

При попытке вызвать метод ПолучитьИдентификатор() у прикладного объекта (будь то документ, справочник или бизнес-процесс) платформа 1С выдает ошибку о том, что данный метод не обнаружен. Причина проста: в программном интерфейсе объектных сущностей 1С такого метода не существует.

Эту функцию часто путают со специфическими методами мобильной платформы, механизмами сериализации XML/XDTO или свойствами элементов управления на управляемой форме. Для получения ссылки и ее внутреннего GUID в платформе «1С:Предприятие» используются совершенно другие стандартные механизмы.

Решение проблемы в обработчике ПриЗаписи()

В модуле объекта документа в обработчике события ПриЗаписи() транзакция записи уже открыта, и ссылка на документ в базе данных гарантированно существует (даже если этот документ записывается впервые в своей истории).

Для того чтобы получить уникальный идентификатор, нам достаточно обратиться к свойству Ссылка нашего объекта. Рассмотрим два основных способа решения этой задачи.

Способ 1. Получение ссылки напрямую

Если для ваших дальнейших алгоритмов достаточно самой ссылки (которая внутри платформы по сути и является носителем уникального идентификатора), вы можете использовать простое обращение к свойству:


Процедура ПриЗаписи(Отказ)
    // Ссылка уже сформирована и доступна
    ТекущаяСсылка = ЭтотОбъект.Ссылка;
    
    // Дальнейшая логика работы со ссылкой
КонецПроцедуры

Способ 2. Получение GUID (Уникального идентификатора)

Если вам требуется именно UUID (GUID) в виде специального объекта платформы или для последующего преобразования в текстовую строку, следует использовать метод УникальныйИдентификатор(), вызванный у ссылки:


Процедура ПриЗаписи(Отказ)
    // Получаем уникальный идентификатор объекта
    УникальныйИД = ЭтотОбъект.Ссылка.УникальныйИдентификатор();
    
    // Например, выведем его строковое представление в окно сообщений
    Сообщить(Строка(УникальныйИД));
КонецПроцедуры

Этот способ является наиболее наглядным, надежным и стандартным для экосистемы 1С.

Важный нюанс: как получить идентификатор до записи (в ПередЗаписью)?

Давайте проанализируем ситуацию, когда уникальный идентификатор необходим нам на более раннем этапе — в обработчике ПередЗаписью(). Для уже существующего (ранее записанного) документа свойство Ссылка заполнено. Но если пользователь создает новый документ, то в процедуре ПередЗаписью() свойство Ссылка все еще будет пустым, так как объект физически еще не создан в базе данных.

Что делать, если нам нужно получить уникальный идентификатор нового объекта заранее? Например, чтобы в этой же транзакции сформировать движения по регистрам или создать подчиненные записи в других справочниках. Для решения этой задачи мы можем применить механизм предустановки ссылки нового.

Разберем этот алгоритм по шагам:

  1. Проверяем, является ли объект новым при помощи метода ЭтоНовый().
  2. Генерируем новый системный уникальный идентификатор через конструктор Новый УникальныйИдентификатор().
  3. Создаем на его основе пустую ссылку нужного типа методом менеджера документа ПолучитьСсылку().
  4. Жестко закрепляем эту ссылку за текущим объектом с помощью метода УстановитьСсылкуНового().

Посмотрим на практический пример реализации этого механизма в модуле объекта:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    Если ЭтотОбъект.ЭтоНовый() Тогда
        
        // 1. Проверяем, не была ли ссылка уже установлена ранее (например, на форме)
        БудущаяСсылка = ЭтотОбъект.ПолучитьСсылкуНового();
        
        Если Не ЗначениеЗаполнено(БудущаяСсылка) Тогда
            // 2. Генерируем новый GUID
            НовыйGUID = Новый УникальныйИдентификатор();
            
            // 3. Формируем ссылку для нашего типа документа
            БудущаяСсылка = Документы.ПриходныйКассовыйОрдер.ПолучитьСсылку(НовыйGUID);
            
            // 4. Принудительно назначаем ссылку объекту
            ЭтотОбъект.УстановитьСсылкуНового(БудущаяСсылка);
        КонецЕсли;
        
        // Теперь мы можем заранее знать уникальный идентификатор нового документа
        НашИдентификатор = БудущаяСсылка.УникальныйИдентификатор();
        
    Иначе
        // Для уже записанного документа всё стандартно
        НашИдентификатор = ЭтотОбъект.Ссылка.УникальныйИдентификатор();
    КонецЕсли;
    
КонецПроцедуры

Использование данного подхода гарантирует, что при физической записи в базу данных документ получит именно этот зарезервированный идентификатор, и вы избежите ошибок дублирования ссылок.

Новые возможности платформы 1С (начиная с версии 8.3.22)

В рамках развития платформы разработчики «1С» регулярно добавляют полезные функции для оптимизации производительности. Ранее, если требовалось получить уникальные идентификаторы для целого списка документов в запросе, приходилось прибегать к выгрузке результата в таблицу значений и последующему обходу строк в цикле с вызовом метода УникальныйИдентификатор(), что негативно сказывалось на быстродействии при больших объемах данных.

Начиная с версии платформы 8.3.22, в язык запросов 1С и в язык выражений системы компоновки данных (СКД) была добавлена встроенная функция УникальныйИдентификатор(). Рассмотрим пример, как теперь можно быстро получить GUID документов прямо из базы данных с помощью запроса:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Ссылка КАК ДокументСсылка,
    |   УникальныйИдентификатор(Ссылка) КАК СтрокаИдентификатора
    |ИЗ
    |   Документ.РеализацияТоваровУслуг КАК Реализация";

РезультатЗапроса = Запрос.Выполнить();

Этот способ работает на уровне СУБД крайне эффективно и позволяет мгновенно получать текстовое представление GUID для сотен тысяч записей без лишних ресурсоемких преобразований на сервере приложений.

Взаимное преобразование GUID и строки

При обмене данными со сторонним ПО (веб-сайты, CRM-системы, внешние базы SQL) практически всегда требуется передавать идентификатор в виде обычной текстовой строки формата "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".

Рассмотрим, как выполнять конвертацию в обе стороны:

  1. Конвертация GUID в строку: для этого достаточно использовать стандартную функцию Строка(), передав в нее уникальный идентификатор.
    
    // Текстовый вид: "e1c0b310-2b1e-11eb-8113-00155d013e02"
    СтрокаGUID = Строка(ЭтотОбъект.Ссылка.УникальныйИдентификатор());
    
  2. Конвертация строки обратно в ссылку 1С: для этого мы сначала инициализируем объект УникальныйИдентификатор из строки, а затем получаем ссылку через менеджер соответствующего документа.
    
    // Восстанавливаем ссылку из текстового представления
    СтрокаGUID = "e1c0b310-2b1e-11eb-8113-00155d013e02";
    НовыйGUID = Новый УникальныйИдентификатор(СтрокаGUID);
    
    СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(НовыйGUID);
    

Таким образом, мы детально разобрали все возможные варианты работы с уникальными идентификаторами документов при их записи в системе «1С:Предприятие». Использование правильных методов платформы избавит ваш код от ошибок и сделает алгоритмы интеграции и логирования простыми и надежными.

← На главную