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

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

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

Почему нет «волшебной» стандартной функции?

Важно понимать, что в платформе 1С отсутствует универсальный метод, который «из коробки» вернет массив измененных полей. Это обусловлено тем, что объект в памяти — это динамическая структура. Платформа 1С оптимизирована для записи изменений в базу данных путем транзакционного сохранения всего объекта. Ей не требуется фиксировать «список изменений» на уровне платформы для успешной записи. Разработчикам, сталкивающимся с необходимостью сравнения «Объект vs Ссылка», приходится реализовывать логику сопоставления самостоятельно.

Разбор методов решения задачи

Рассмотрим несколько подходов, которые помогут нам реализовать функционал сравнения данных, сохраняя производительность системы.

1. Сравнение коллекций реквизитов

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

Для реализации этого метода:

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

Этот способ эффективен, если нам нужно просто понять, изменился ли объект в целом. Однако для получения списка конкретных полей придется обходить реквизиты в цикле:


// Пример логики сравнения реквизитов
Для Каждого Реквизит Из Метаданные.Справочники.ВашСправочник.Реквизиты Цикл
    ИмяПоля = Реквизит.Имя;
    Если Объект[ИмяПоля] <> СсылкаНаОбъект[ИмяПоля] Тогда
        СписокИзменений.Добавить(ИмяПоля);
    КонецЕсли;
КонецЦикла;

2. Использование механизмов версионирования

Если в вашей конфигурации подключена подсистема версионирования, вы можете обратиться к ней. Новая версия объекта в БСП создается только тогда, когда были зафиксированы изменения. Это отличный способ делегировать проверку подсистеме, которая уже умеет определять «разницу» (diff) между версиями.

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

3. Метод «Снимка состояния» при открытии формы

Это один из самых надежных методов для обычных форм. Мы можем «запомнить» состояние объекта в момент открытия формы.

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

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

Технические рекомендации по производительности

При реализации сравнения необходимо учитывать следующие нюансы:

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

← На главную