1C-CodeКак сделать → Как сравнить две таблицы значений

Как сравнить две таблицы значений в 1С

Через соответствие по ключу: одну разложить, вторую пройти. Сравнение перебором «каждая с каждой» на реальных объёмах не работает.

Код

// ключ — то, что делает строку уникальной
Ключ = Строка -> Строка.Номенклатура; // здесь: одна колонка

Было = Новый Соответствие;
Для Каждого Стр Из ТЗ1 Цикл
	Было.Вставить(Стр.Номенклатура, Стр);
КонецЦикла;

Для Каждого Стр Из ТЗ2 Цикл
	Прежняя = Было.Получить(Стр.Номенклатура);
	Если Прежняя = Неопределено Тогда
		// строка появилась
	ИначеЕсли Прежняя.Количество <> Стр.Количество Тогда
		// строка изменилась
	КонецЕсли;
	Было.Удалить(Стр.Номенклатура);
КонецЦикла;
// всё, что осталось в «Было», — строки, которых больше нет

Что здесь важно

1. Приём с удалением из соответствия — половина решения

Удаляя обработанные ключи, вы в конце получаете ровно те строки, которые исчезли. Без этого пришлось бы проходить первую таблицу второй раз.

2. Ключ из нескольких колонок — строкой

Если строку определяет пара «товар + склад», собирайте ключ склейкой: Строка(Товар) + "|" + Строка(Склад). Разделитель обязателен, иначе разные пары дадут одинаковый ключ.

3. Перебор двумя циклами — квадрат

Две таблицы по тысяче строк дают миллион сравнений. Через соответствие это два прохода по тысяче. Разница на глаз: минуты против мгновения.

Где обычно спотыкаются

Если обе таблицы получены запросами, сравнивать их в памяти обычно не надо вовсе: положите обе во временные таблицы через ПОМЕСТИТЬ и сравните полным соединением прямо в запросе. База сделает это лучше и быстрее.

Задача на это. Прочитать приём и применить его — разные умения. В тренажёре есть задача «Что изменилось между двумя списками»: вернуть сразу три ответа — что появилось, что изменилось и что исчезло — за два прохода, а не перебором каждой строки с каждой. Решение проверяется скрытыми тестами, в том числе на краевых случаях, о которых в условии не сказано.

Решить задачу

Разобраться глубже

Другие вопросы

Как получить остатки на дату запросом в 1С Как программно провести документ в 1С Как избавиться от запроса в цикле в 1С Как добавить колонку в таблицу значений программно Как свернуть таблицу значений Как найти строку в таблице значений Как выгрузить колонку таблицы значений в массив Как превратить массив в таблицу значений Как передать таблицу значений с сервера на клиент Как отобрать строки в таблице значений Как отсортировать таблицу значений Как записать движения регистра накопления программно Чем регистр остатков отличается от регистра оборотов Как контролировать остатки при проведении документа Как добавить реквизит расширением конфигурации Какие бывают соединения в запросе 1С и чем отличаются Как выгрузить таблицу значений в Excel Чем дерево значений отличается от таблицы значений Как задать условное оформление таблицы на форме