1C-Code → Как сделать → Как сравнить две таблицы значений
Через соответствие по ключу: одну разложить, вторую пройти. Сравнение перебором «каждая с каждой» на реальных объёмах не работает.
// ключ — то, что делает строку уникальной
Ключ = Строка -> Строка.Номенклатура; // здесь: одна колонка
Было = Новый Соответствие;
Для Каждого Стр Из ТЗ1 Цикл
Было.Вставить(Стр.Номенклатура, Стр);
КонецЦикла;
Для Каждого Стр Из ТЗ2 Цикл
Прежняя = Было.Получить(Стр.Номенклатура);
Если Прежняя = Неопределено Тогда
// строка появилась
ИначеЕсли Прежняя.Количество <> Стр.Количество Тогда
// строка изменилась
КонецЕсли;
Было.Удалить(Стр.Номенклатура);
КонецЦикла;
// всё, что осталось в «Было», — строки, которых больше нет
Удаляя обработанные ключи, вы в конце получаете ровно те строки, которые исчезли. Без этого пришлось бы проходить первую таблицу второй раз.
Если строку определяет пара «товар + склад», собирайте ключ склейкой: Строка(Товар) + "|" + Строка(Склад). Разделитель обязателен, иначе разные пары дадут одинаковый ключ.
Две таблицы по тысяче строк дают миллион сравнений. Через соответствие это два прохода по тысяче. Разница на глаз: минуты против мгновения.
Если обе таблицы получены запросами, сравнивать их в памяти обычно не надо вовсе: положите обе во временные таблицы через ПОМЕСТИТЬ и сравните полным соединением прямо в запросе. База сделает это лучше и быстрее.
Задача на это. Прочитать приём и применить его — разные умения. В тренажёре есть задача «Что изменилось между двумя списками»: вернуть сразу три ответа — что появилось, что изменилось и что исчезло — за два прохода, а не перебором каждой строки с каждой. Решение проверяется скрытыми тестами, в том числе на краевых случаях, о которых в условии не сказано.