Как можно сравнить две таблицы значений и вывести различия?
Подскажите пожалуйста, есть две таблицы значений, одинаковые колонки "Номенклатура" и "Количество"
Нужно их сравнить и если есть расхождения то вывести в третью.
То есть в какой-то может не быть номенклатуры или разные количество
Можно ли их сравнить?
Нужно их сравнить и если есть расхождения то вывести в третью.
То есть в какой-то может не быть номенклатуры или разные количество
Можно ли их сравнить?
ТЗПриходныйОрдер = Новый ТаблицаЗначений;
ТЗПриходныйОрдер.Колонки.Добавить("Номенклатура");
ТЗПриходныйОрдер.Колонки.Добавить("Количество");
//ТЗРасходныйОрдер = Новый ТаблицаЗначений;
//ТЗРасходныйОрдер.Колонки.Добавить("Номенклатура");
//ТЗРасходныйОрдер.Колонки.Добавить("Количество");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПриходныйОрдерНаТоварыТовары.Номенклатура КАК Номенклатура,
| СУММА(ПриходныйОрдерНаТоварыТовары.Количество) КАК Количество
|ИЗ
| Документ.ПриходныйОрдерНаТовары.Товары КАК ПриходныйОрдерНаТоварыТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриходныйОрдерНаТовары КАК ПриходныйОрдерНаТовары
| ПО ПриходныйОрдерНаТоварыТовары.Ссылка = ПриходныйОрдерНаТовары.Ссылка
|ГДЕ
| ПриходныйОрдерНаТовары.Распоряжение = &Перемещение
| И ПриходныйОрдерНаТовары.Проведен
|
|СГРУППИРОВАТЬ ПО
| ПриходныйОрдерНаТоварыТовары.Номенклатура";
Запрос.УстановитьПараметр("Перемещение",Перемещение);
ТЗПриходный = Запрос.Выполнить().Выгрузить();
Для Каждого Стр ИЗ ТЗПриходный Цикл
А = ТЗПриходныйОрдер.Добавить();
А.Номенклатура = Стр.Номенклатура;
А.Количество = Стр.Количество;
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СвязанныеДокументы.Ссылка КАК Ссылка
|ИЗ
| КритерийОтбора.СвязанныеДокументы(&Значение) КАК СвязанныеДокументы
|ГДЕ
| СвязанныеДокументы.Ссылка.Проведен
| И СвязанныеДокументы.Ссылка Ссылка Документ.РасходныйОрдерНаТовары";
Запрос.УстановитьПараметр("Значение", Перемещение);
ТЗРасходный = Запрос.Выполнить().Выбрать();
Пока ТЗРасходный.Следующий() Цикл
Для Каждого Стр ИЗ ТЗРасходный.Ссылка.ОтгружаемыеТовары Цикл
А = ТЗПриходныйОрдер.Добавить();
А.Номенклатура = Стр.Номенклатура;
А.Количество = Стр.Количество;
КонецЦикла;
КонецЦикла;
ТЗПриходныйОрдер.Свернуть("Номенклатура","Количество");
ПоказатьПо теме из базы знаний
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
Сделайте один запрос, в первом пакете получите значения и поместите их в ВТ. Во втором пакете аналогично со второй таблицей. Потом в третьем пакете через объединить ВТ склеиваете. Используете ЕСТЬNULL для возможных отсутствующих значений. Затем сравниваете количество(из первой таблицы) с количеством во второй
|ВЫБРАТЬ
| ПриходныйОрдерНаТоварыТовары.Номенклатура КАК Номенклатура,
| СУММА(ПриходныйОрдерНаТоварыТовары.Количество) КАК Количество
|ИЗ
| Документ.ПриходныйОрдерНаТовары.Товары КАК ПриходныйОрдерНаТоварыТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриходныйОрдерНаТовары КАК ПриходныйОрдерНаТовары
| ПО ПриходныйОрдерНаТоварыТовары.Ссылка = ПриходныйОрдерНаТовары.Ссылка
| Поместить ВТ1
|ГДЕ
| ПриходныйОрдерНаТовары.Распоряжение = &Перемещение
| И ПриходныйОрдерНаТовары.Проведен
|
|СГРУППИРОВАТЬ ПО
| ПриходныйОрдерНаТоварыТовары.Номенклатура;
|
|//////////////////////////////////////////////////////////// ///////////////////
|
|АНАЛОГИЧНО ПОЛУЧАЕТЕ ДЛЯ ТОГО С ЧЕМ СРАВНИВАЕТЕ
| Поместить ВТ2
|
|////////////////////////////////////////////////////////
|ВЫБРАТЬ
|ВТ1.Номенклатура
|ВТ1.Количество КАК КОЛИЧЕТВО1
|0 КАК КОЛИЧЕСТВО2
| ИЗ ВТ1 КАК ВТ1
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
|ВТ2.Номенклатура
|0,
|ВТ2.Количество
| ИЗ ВТ2 КАК ВТ2
Показать
(2)Пытаюсь получить запросом данные своей ТЗ, но вываливается на ошибке
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|Заказы.Номенклатура,
|СУММА(Заказы.Количество) КАК Количество
|ПОМЕСТИТЬ Заказы
|ИЗ
|ТЗПриходныйОрдер КАК Заказы
|ГДЕ
|Заказы.Ссылка = &Таблица
|СГРУППИРОВАТЬ ПО
|Заказы.Номенклатура";
Запрос.УстановитьПараметр("Таблица",ТЗПриходныйОрдер);
ТЗ = Запрос.Выполнить().Выгрузить()
Показать
(6)
ну и где тут Ссылка?
ТЗПриходныйОрдер = Новый ТаблицаЗначений;
ТЗПриходныйОрдер.Колонки.Добавить("Номенклатура");
ТЗПриходныйОрдер.Колонки.Добавить("Количество");
|Заказы.Ссылка = &Таблица
|СГРУППИРОВАТЬ ПО
|Заказы.Номенклатура";
Запрос.УстановитьПараметр("Таблица",ТЗПриходныйОрдер);
ну и где тут Ссылка?
(14) Хорошо. Предлагаю такой вариант без таблиц:
Запрос.Текст = "ВЫБРАТЬ
| ПриходныйОрдерНаТоварыТовары.Номенклатура КАК Номенклатура,
| СУММА(ПриходныйОрдерНаТоварыТовары.Количество) КАК Количество1,
| 0 КАК Количество2
|ПОМЕСТИТЬ ВТ_Сводная
|ИЗ
| Документ.ПриходныйОрдерНаТовары.Товары КАК ПриходныйОрдерНаТоварыТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПриходныйОрдерНаТовары КАК ПриходныйОрдерНаТовары
| ПО ПриходныйОрдерНаТоварыТовары.Ссылка = ПриходныйОрдерНаТовары.Ссылка
|ГДЕ
| ПриходныйОрдерНаТовары.Распоряжение = &Перемещение
| И ПриходныйОрдерНаТовары.Проведен
|
|СГРУППИРОВАТЬ ПО
| ПриходныйОрдерНаТоварыТовары.Номенклатура
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| РасходныйОрдерНаТоварыОтгружаемыеТовары.Номенклатура,
| 0,
| СУММА(РасходныйОрдерНаТоварыОтгружаемыеТовары.Количество)
|ИЗ
| КритерийОтбора.СвязанныеДокументы(&Значение) КАК СвязанныеДокументы
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходныйОрдерНаТовары.ОтгружаемыеТовары КАК РасходныйОрдерНаТоварыОтгружаемыеТовары
| ПО ВЫРАЗИТЬ(СвязанныеДокументы.Ссылка КАК Документ.РасходныйОрдерНаТовары).Ссылка = РасходныйОрдерНаТоварыОтгружаемыеТовары.Ссылка
|ГДЕ
| СвязанныеДокументы.Ссылка.Проведен
| И СвязанныеДокументы.Ссылка ССЫЛКА Документ.РасходныйОрдерНаТовары
|
|СГРУППИРОВАТЬ ПО
| РасходныйОрдерНаТоварыОтгружаемыеТовары.Номенклатура";
Показать
(24) Там же всё расписано:
"Второе уточнение автоматически приводит к тому, что в таблице всегда будут одна или более колонок, значение (комбинация значений) в которых будут уникальными и могут служить идентификатором строки. Такую колонку (набор колонок) можно называть ключом: простым в случае одной колонки или составным в более сложном случае. А еще лучше, по аналогии с регистрами, упомянутые колонки называть измерениями таблицы, а оставшиеся – ресурсами."
Жаль, что даже после такого масштабного исследования, остаются приверженцы сравнения ТЗ в запросе.
"Второе уточнение автоматически приводит к тому, что в таблице всегда будут одна или более колонок, значение (комбинация значений) в которых будут уникальными и могут служить идентификатором строки. Такую колонку (набор колонок) можно называть ключом: простым в случае одной колонки или составным в более сложном случае. А еще лучше, по аналогии с регистрами, упомянутые колонки называть измерениями таблицы, а оставшиеся – ресурсами."
Жаль, что даже после такого масштабного исследования, остаются приверженцы сравнения ТЗ в запросе.
(25) Получил такую таблицу на выходе используя метод
Функция РазницаТаблицЗначений(Таблица0, Таблица1, Измерения) Экспорт
Отбор = Новый Структура(Измерения);
Ресурсы = Новый Массив;
Для ИндексКолонки = 0 По Таблица0.Колонки.Количество() - 1 Цикл
Если НЕ Отбор.Свойство(Таблица0.Колонки[ИндексКолонки].Имя) Тогда
Ресурсы.Добавить(ИндексКолонки)
КонецЕсли
КонецЦикла;
Таблица1.Колонки.Добавить("Знак", Новый ОписаниеТипов("Число"));
Таблица1.ЗаполнитьЗначения(1, "Знак");
НовыйИндекс = Таблица1.Индексы.Добавить(Измерения);
Разница = Таблица1.СкопироватьКолонки();
Для Каждого Строка0 Из Таблица0 Цикл
ЗаполнитьЗначенияСвойств(Отбор, Строка0);
Строки1 = Таблица1.НайтиСтроки(Отбор);
Если Строки1.Количество() = 0 Тогда
ЗаполнитьЗначенияСвойств(Разница.Добавить(), Строка0)
Иначе
Строка1 = Строки1[0];
Для Каждого Ресурс Из Ресурсы Цикл
Если Строка0[Ресурс] <> Строка1[Ресурс] Тогда
ЗаполнитьЗначенияСвойств(Разница.Добавить(), Строка0);
ЗаполнитьЗначенияСвойств(Разница.Добавить(), Строка1);
Прервать
КонецЕсли
КонецЦикла;
Строка1.Знак = 0
КонецЕсли
КонецЦикла;
Для Каждого Строка1 Из Таблица1.НайтиСтроки(Новый Структура("Знак", 1)) Цикл
ЗаполнитьЗначенияСвойств(Разница.Добавить(), Строка1);
КонецЦикла;
Таблица1.Колонки.Удалить("Знак");
Таблица1.Индексы.Удалить(НовыйИндекс);
Возврат Разница
КонецФункции
ПоказатьПрикрепленные файлы:
Функция КоллекцияРазличаются(ТЗ1,ТЗ2,ИсключаемыеКолонки="") Экспорт
ИсклКол=СтрокаВМассив(ИсключаемыеКолонки);
Если ТЗ1.Количество()<>ТЗ2.Количество() Тогда
Если ТЗ1.Количество()=1 И ТЗ2.Количество()=0 Тогда
Для К=0 По ТЗ1.Количество()-1 Цикл
Стр1=ТЗ1[К];
Для М=0 По ТЗ1.Колонки.Количество()-1 Цикл
Имя=ТЗ1.Колонки[М].Имя;
Если ИсклКол.Найти(Имя)<>Неопределено Тогда
Продолжить;
КонецЕсли;
Если ЗначениеЗаполнено(Стр1[Имя]) Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Ложь;
ИначеЕсли ТЗ1.Количество()=0 И ТЗ2.Количество()=1 Тогда
Для К=0 По ТЗ2.Количество()-1 Цикл
Стр2=ТЗ2[К];
Для М=0 По ТЗ1.Колонки.Количество()-1 Цикл
Имя=ТЗ1.Колонки[М].Имя;
Если ИсклКол.Найти(Имя)<>Неопределено Тогда
Продолжить;
КонецЕсли;
Если ЗначениеЗаполнено(Стр2[Имя]) Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецЕсли;
Для К=0 По ТЗ1.Количество()-1 Цикл
Стр1=ТЗ1[К];
Стр2=ТЗ2[К];
Для М=0 По ТЗ1.Колонки.Количество()-1 Цикл
Имя=ТЗ1.Колонки[М].Имя;
Если ИсклКол.Найти(Имя)<>Неопределено Тогда
Продолжить;
КонецЕсли;
Если Стр1[Имя]<>Стр2[Имя] Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Ложь;
КонецФункции
Показать