При разработке конфигураций и интеграции с внешними системами часто возникает необходимость однозначно идентифицировать каждую позицию в документе. Однако разработчики, привыкшие работать с объектами 1С через метод Ссылка.УникальныйИдентификатор(), сталкиваются с тем, что для отдельных строк табличных частей аналогичного стандартного метода не существует.
Разберем подробно, почему у строк табличной части нет системного GUID и какими способами можно реализовать надежную идентификацию позиций.
В архитектуре платформы 1С:Предприятие строка табличной части не является самостоятельным ссылочным объектом (в отличие от справочника или документа). Она существует только в составе своего объекта-владельца.
На физическом уровне в СУБД строки табличной части идентифицируются связкой двух полей: уникальным идентификатором документа-владельца (_IDRRef) и номером строки (_LineNo). Платформа не создает отдельных скрытых GUID для каждой строки.
Важно различать временные и постоянные идентификаторы:
ДанныеФормыКоллекция) есть методы вроде ПолучитьИдентификатор() или НайтиПоИдентификатору(). Однако эти идентификаторы являются динамическими, существуют только в рамках текущего сеанса работы формы и не сохраняются в базе данных. При повторном открытии документа они пересчитываются заново.Рассмотрим самый прямой способ — создание собственного реквизита в табличной части для хранения GUID.
Разберем по шагам, как это реализовать:
ИдентификаторСтроки).УникальныйИдентификатор (или Строка с длиной 36 символов).Посмотрим на пример кода в событии ПередЗаписью модуля объекта:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Пройдем по всем строкам табличной части Товары
Для Каждого СтрокаТЧ Из Товары Цикл
// Если GUID еще не заполнен (или равен пустому GUID)
Если НЕ ЗначениеЗаполнено(СтрокаТЧ.ИдентификаторСтроки) Тогда
СтрокаТЧ.ИдентификаторСтроки = Новый УникальныйИдентификатор;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Вызов конструктора Новый УникальныйИдентификатор создает новый глобально уникальный 128-битный идентификатор (UUID/GUID). Этот вариант гарантирует уникальность строки не только в рамках текущего документа, но и во всех информационных базах.
Проанализируем архитектуру типовых конфигураций (например, Управление торговлей, ERP, Комплексная автоматизация) или Библиотеки Стандартных Подсистем (БСП). В них вместо 16-байтового GUID часто применяется целочисленный идентификатор — КлючСвязи или КодСтроки с типом Число(10, 0).
Почему разработчики типовых решений отдают преимущество числовому ключу?
Рассмотрим пример алгоритма заполнения числового ключа связи перед записью документа:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Определим максимальный существующий код строки
МаксимальныйКод = 0;
Для Каждого СтрокаТЧ Из Товары Цикл
Если СтрокаТЧ.КлючСвязи > МаксимальныйКод Тогда
МаксимальныйКод = СтрокаТЧ.КлючСвязи;
КонецЕсли;
КонецЦикла;
// Присвоим уникальные коды новым строкам
Для Каждого СтрокаТЧ Из Товары Цикл
Если СтрокаТЧ.КлючСвязи = 0 Тогда
МаксимальныйКод = МаксимальныйКод + 1;
СтрокаТЧ.КлючСвязи = МаксимальныйКод;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Выясним, какие еще варианты можно использовать в специфических сценариях:
ИдентификаторДокумента + "_" + НомерСтроки). Однако стоит учитывать: при пересортировке строк в документе такой вычисляемый ключ изменится.Резюме: Если вам необходима гарантированная глобальная уникальность между разными системами — создавайте реквизит ТЧ с типом УникальныйИдентификатор и заполняйте его вызовом Новый УникальныйИдентификатор. Если идентификация нужна только внутри документа для связи таблиц между собой — используйте числовой КлючСвязи.