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

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

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

Разберем подробно, почему у строк табличной части нет системного GUID и какими способами можно реализовать надежную идентификацию позиций.

Почему у строки табличной части нет системного GUID

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

На физическом уровне в СУБД строки табличной части идентифицируются связкой двух полей: уникальным идентификатором документа-владельца (_IDRRef) и номером строки (_LineNo). Платформа не создает отдельных скрытых GUID для каждой строки.

Важно различать временные и постоянные идентификаторы:

  1. Временный идентификатор формы: В управляемых формах у элементов коллекции (ДанныеФормыКоллекция) есть методы вроде ПолучитьИдентификатор() или НайтиПоИдентификатору(). Однако эти идентификаторы являются динамическими, существуют только в рамках текущего сеанса работы формы и не сохраняются в базе данных. При повторном открытии документа они пересчитываются заново.
  2. Постоянный идентификатор: Если вам требуется связывать строки с записями регистров, подчиненными табличными частями или выгружать данные во внешние сервисы, идентификатор необходимо явно хранить в базе данных.

Способ 1. Использование реквизита с типом «УникальныйИдентификатор»

Рассмотрим самый прямой способ — создание собственного реквизита в табличной части для хранения GUID.

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

  1. Откроем конфигуратор и найдем нужный документ.
  2. В табличной части добавим новый реквизит (например, ИдентификаторСтроки).
  3. В качестве типа данных укажем УникальныйИдентификатор (или Строка с длиной 36 символов).
  4. В модуле объекта или модуле формы обеспечим автозаполнение этого реквизита.

Посмотрим на пример кода в событии ПередЗаписью модуля объекта:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	
	// Пройдем по всем строкам табличной части Товары
	Для Каждого СтрокаТЧ Из Товары Цикл
		// Если GUID еще не заполнен (или равен пустому GUID)
		Если НЕ ЗначениеЗаполнено(СтрокаТЧ.ИдентификаторСтроки) Тогда
			СтрокаТЧ.ИдентификаторСтроки = Новый УникальныйИдентификатор;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Вызов конструктора Новый УникальныйИдентификатор создает новый глобально уникальный 128-битный идентификатор (UUID/GUID). Этот вариант гарантирует уникальность строки не только в рамках текущего документа, но и во всех информационных базах.

Способ 2. Использование численного ключа связи (подход БСП и типовых решений)

Проанализируем архитектуру типовых конфигураций (например, Управление торговлей, ERP, Комплексная автоматизация) или Библиотеки Стандартных Подсистем (БСП). В них вместо 16-байтового GUID часто применяется целочисленный идентификатор — КлючСвязи или КодСтроки с типом Число(10, 0).

Почему разработчики типовых решений отдают преимущество числовому ключу?

  1. Экономия памяти: Числовое поле занимает существенно меньше места в базе данных и индексах СУБД.
  2. Быстродействие: Соединение таблиц по числовому полю в SQL-запросах выполняется быстрее, чем по 16-байтовому или строковому GUID.
  3. Достаточная уникальность: В рамках одного документа числа от 1 и выше полностью обеспечивают связывание главной табличной части с подчиненными таблицами (например, связывание номенклатуры с ее серийными номерами или скидками).

Рассмотрим пример алгоритма заполнения числового ключа связи перед записью документа:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	
	// Определим максимальный существующий код строки
	МаксимальныйКод = 0;
	Для Каждого СтрокаТЧ Из Товары Цикл
		Если СтрокаТЧ.КлючСвязи > МаксимальныйКод Тогда
			МаксимальныйКод = СтрокаТЧ.КлючСвязи;
		КонецЕсли;
	КонецЦикла;
	
	// Присвоим уникальные коды новым строкам
	Для Каждого СтрокаТЧ Из Товары Цикл
		Если СтрокаТЧ.КлючСвязи = 0 Тогда
			МаксимальныйКод = МаксимальныйКод + 1;
			СтрокаТЧ.КлючСвязи = МаксимальныйКод;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Альтернативные варианты идентификации

Выясним, какие еще варианты можно использовать в специфических сценариях:

Резюме: Если вам необходима гарантированная глобальная уникальность между разными системами — создавайте реквизит ТЧ с типом УникальныйИдентификатор и заполняйте его вызовом Новый УникальныйИдентификатор. Если идентификация нужна только внутри документа для связи таблиц между собой — используйте числовой КлючСвязи.

← На главную