База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как программно вычесть две таблицы значений по ключам в 1С?
- В этой теме 1 ответ, 2 участника, последнее обновление 2 месяца, 3 недели назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
21 сентября 2025 в 7:15 #33469
Имеются таблицы значений Таблица 1 и Таблица 2 с колонками Организация, Подразделение, Количество. Необходимо программно получить Итоговая таблица, в которой будет разность двух исходных таблиц в разрезе Организаций и Подразделений. В итоге должна получиться таблица, содержащая уникальные данные для Таблицы 1 или Таблицы 2, в которой нет общих для обеих исходных таблиц данных в разрезе Организаций и Подразделений.
-
21 сентября 2025 в 7:15 #33470
Функционально задача сводится к вычислению разности двух таблиц значений по ключу (Организация, Подразделение), при этом учитывается Количество, и в итоговой таблице должны остаться только те строки, которые есть в одной из таблиц, но отсутствуют в другой (сравнение по Организация + Подразделение).
Для решения можно использовать алгоритм с объединением таблиц и сверткой с подсчетом разницы, как в классическом способе сравнения таблиц значений.
Пример кода на 1С:
1C Функция ПолучитьРазностьТаблиц(Таблица1, Таблица2) Экспорт // Ключевые колонки для сравнения Ключи = "Организация,Подразделение"; ИмяКолонкиСверки = "__Сверка__"; // Копируем Таблицу1, добавляем колонку для сверки и заполняем -1 ТаблРезультат = Таблица1.Скопировать(); Если Не ТаблРезультат.Колонки.Найти(ИмяКолонкиСверки) Тогда ТаблРезультат.Колонки.Добавить(ИмяКолонкиСверки, Новый ОписаниеТипов("Число")); КонецЕсли; ТаблРезультат.ЗаполнитьЗначения(-1, ИмяКолонкиСверки); // Добавляем строки из Таблица2 с +1 в колонке сверки Для Каждого Строка Из Таблица2 Цикл НоваяСтрока = ТаблРезультат.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); НоваяСтрока[ИмяКолонкиСверки] = 1; КонецЦикла; // Свертываем таблицу по ключам, суммируя колонку сверки и Количество // Для Количество нужно суммирование, для ключей группировка ТаблРезультат.Свернуть(Ключи, "Количество," + ИмяКолонкиСверки); // Оставляем только строки, где сумма сверки не равна 0 (т.е. уникальные) ИтоговаяТаблица = Новый ТаблицаЗначений; // Добавляем колонки из исходных таблиц (Организация, Подразделение, Количество) Для Каждого Колонка Из ТаблРезультат.Колонки Цикл Если Колонка.Имя ИмяКолонкиСверки Тогда ИтоговаяТаблица.Колонки.Добавить(Колонка.Имя, Колонка.Тип); КонецЕсли; КонецЦикла; Для Каждого Строка Из ТаблРезультат Цикл Если Строка[ИмяКолонкиСверки] 0 Тогда НоваяСтрока = ИтоговаяТаблица.Добавить(); Для Каждого Колонка Из ИтоговаяТаблица.Колонки Цикл НоваяСтрока[Колонка.Имя] = Строка[Колонка.Имя]; КонецЦикла; КонецЕсли; КонецЦикла; Возврат ИтоговаяТаблица; КонецФункцииОбъяснение:
— В колонке `__Сверка__` для строк из первой таблицы ставим -1, для второй +1.
— Объединяем обе таблицы.
— Свертываем по ключам (Организация, Подразделение), суммируя Количество и колонку сверки.
— Если сумма в колонке сверки равна 0 — значит строки с таким ключом есть в обеих таблицах, их исключаем.
— В итоговую таблицу попадают только уникальные строки с разницей по ключам.Таким образом, итоговая таблица содержит только те Организации и Подразделения, которые есть либо в первой, либо во второй таблице, но не в обеих одновременно, с суммированным количеством.
Рекомендую посмотреть здесь: https://infostart.ru/1c/articles/375490/
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.