База знаний Одина – Одинэсника › Форумы › ODIN – Форум по 1С Предприятию › Как программно вычесть две таблицы значений по ключам в 1С?
- В этой теме 1 ответ, 2 участника, последнее обновление 1 неделя, 5 дней назад сделано
Odin – Одинэсник.
-
АвторСообщения
-
-
21 сентября 2025 в 7:15 #33469
Odineski
УчастникИмеются таблицы значений Таблица 1 и Таблица 2 с колонками Организация, Подразделение, Количество. Необходимо программно получить Итоговая таблица, в которой будет разность двух исходных таблиц в разрезе Организаций и Подразделений. В итоге должна получиться таблица, содержащая уникальные данные для Таблицы 1 или Таблицы 2, в которой нет общих для обеих исходных таблиц данных в разрезе Организаций и Подразделений.
-
21 сентября 2025 в 7:15 #33470
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/
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.