При разработке механизмов отслеживания изменений в табличных частях документов разработчики часто сталкиваются с проблемой: как «привязаться» к конкретной строке так, чтобы эта связь не терялась после записи объекта или обновления формы? Рассмотрим, почему стандартные инструменты платформы не всегда справляются с этой задачей и как выйти из этой ситуации.
Многие разработчики ошибочно полагают, что свойство ИсходныйНомерСтроки или встроенные идентификаторы строк будут надежно фиксировать положение строки до самого момента записи. Однако, как показывает практика, при использовании метода ЗначениеВРеквизитФормы происходит полная синхронизация данных между объектом и формой. Платформа пересоздает коллекцию строк, что приводит к обновлению всех идентификаторов. В итоге, если вы сохраняли идентификатор «до» записи, то «после» он становится неактуальным.
Наиболее надежным и архитектурно правильным способом решения задачи является добавление дополнительного реквизита в структуру табличной части самого объекта. Давайте разберем, как это реализовать:
ИдентификаторСтроки (тип Строка, длина 36).Рассмотрим пример кода, который можно использовать в модуле формы:
&НаКлиенте
Процедура ТабличнаяЧастьПриНачалеДобавления(Элемент, Отказ, Копирование)
Элемент.ТекущиеДанные.ИдентификаторСтроки = Новый УникальныйИдентификатор;
КонецПроцедуры
Преимущества этого подхода:
ЗначениеВРеквизитФормы и РеквизитФормыВЗначение.Если внесение изменений в структуру метаданных конфигурации нежелательно (например, ввиду строгих требований типовой конфигурации), мы можем воспользоваться механизмом временного хранилища для фиксации состояния строк при открытии формы.
Алгоритм действий следующий:
ТаблицаЗначений.ПоместитьВоВременноеХранилище.Этот метод требует аккуратного управления данными: необходимо актуализировать состояние хранилища при каждом изменении (добавлении или удалении) строк пользователем.
Помните, что метод ЗначениеВРеквизитФормы — это мощный, но «тяжелый» инструмент. Он заменяет текущую коллекцию данных формы на новую. Именно поэтому любые попытки зафиксировать идентификаторы «снаружи» (в переменных модуля формы) терпят неудачу при вызове этого метода. Если вы хотите сохранить стабильность связей, старайтесь работать с коллекцией строк напрямую, используя методы объекта ДанныеФормыКоллекция.
Проанализировав ситуацию, мы пришли к выводу, что полагаться на встроенные свойства НомерСтроки или ИсходныйНомерСтроки для целей идентификации изменений опасно из-за их нестабильности после записи объекта. Лучшим решением для разработки сложных интерфейсов будет создание собственного поля УникальныйИдентификатор внутри табличной части. Это создаст надежный фундамент для любого алгоритма поиска изменений, будь то сравнение «до» и «после» или реализация сложной серверной логики обработки строк.