При разработке на платформе 1С:Предприятие часто возникает задача отследить, какие именно реквизиты объекта были изменены пользователем в процессе редактирования формы. Особенно остро этот вопрос встает в обычных формах, где интерфейс напрямую связан с данными объекта. Давайте разберем, существуют ли штатные механизмы для этой задачи и как реализовать надежное сравнение данных.
Важно понимать, что в платформе 1С отсутствует универсальный метод, который «из коробки» вернет массив измененных полей. Это обусловлено тем, что объект в памяти — это динамическая структура. Платформа 1С оптимизирована для записи изменений в базу данных путем транзакционного сохранения всего объекта. Ей не требуется фиксировать «список изменений» на уровне платформы для успешной записи. Разработчикам, сталкивающимся с необходимостью сравнения «Объект vs Ссылка», приходится реализовывать логику сопоставления самостоятельно.
Рассмотрим несколько подходов, которые помогут нам реализовать функционал сравнения данных, сохраняя производительность системы.
Если элементы на форме привязаны к реквизитам объекта, мы можем использовать библиотеку стандартных подсистем БСП или собственные функции для сравнения данных. Суть метода заключается в формировании двух наборов данных (текущего состояния объекта и данных, полученных по ссылке) и их поэлементного сопоставления.
Для реализации этого метода:
ОбщегоНазначения.КоллекцииИдентичны (из БСП) для проверки соответствия коллекций.Этот способ эффективен, если нам нужно просто понять, изменился ли объект в целом. Однако для получения списка конкретных полей придется обходить реквизиты в цикле:
// Пример логики сравнения реквизитов
Для Каждого Реквизит Из Метаданные.Справочники.ВашСправочник.Реквизиты Цикл
ИмяПоля = Реквизит.Имя;
Если Объект[ИмяПоля] <> СсылкаНаОбъект[ИмяПоля] Тогда
СписокИзменений.Добавить(ИмяПоля);
КонецЕсли;
КонецЦикла;
Если в вашей конфигурации подключена подсистема версионирования, вы можете обратиться к ней. Новая версия объекта в БСП создается только тогда, когда были зафиксированы изменения. Это отличный способ делегировать проверку подсистеме, которая уже умеет определять «разницу» (diff) между версиями.
Важное примечание: При работе с базами данных большого объема (гигантские справочники или документы), учитывайте, что создание лишних версий может негативно сказаться на размере базы данных. В таких случаях старайтесь ограничить список объектов, подлежащих версионированию.
Это один из самых надежных методов для обычных форм. Мы можем «запомнить» состояние объекта в момент открытия формы.
Разберем алгоритм по шагам:
ПриОткрытии создаем скрытую переменную формы (например, ИсходныйОбъект) и сохраняем туда копию объекта с помощью метода Скопировать().Объект с ИсходныйОбъект.При реализации сравнения необходимо учитывать следующие нюансы:
Ссылка1 <> Ссылка2) корректно, но если объект ссылается на другой объект, который также был изменен, вы получите «ложное» срабатывание о том, что изменилось поле, хотя изменилось содержимое связанного объекта.Подводя итог, можно сказать, что универсальной «одной кнопки» для решения данной задачи в 1С нет. Лучшим практическим решением является создание собственной процедуры сравнения, которая проходит по списку контролируемых реквизитов и фиксирует факт расхождения значений с данными в базе. Такой подход обеспечивает максимальную гибкость и контроль над производительностью вашего решения.