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