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