Как сравнить две табличные части документов в 1С: эффективные методы

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При разработке конфигураций на 1С часто возникает задача сравнения табличных частей двух документов. Например, когда один документ вводится на основании другого, но пользователь вносит изменения: добавляет позиции, удаляет их или меняет количество. Давайте разберем, как максимально просто и быстро автоматизировать этот процесс.

Метод свертки таблиц значений (для 1С 7.7)

Для старых версий платформы, таких как 1С 7.7, самым эффективным подходом является использование временной ТаблицыЗначений. Суть метода заключается в математическом сложении данных: мы добавляем количество из первого документа с положительным знаком, а из второго — с отрицательным. Если после такой операции номенклатура имеет нулевой остаток, значит, данные идентичны.

Рассмотрим пошаговый алгоритм реализации этого метода:

  1. Создаем объект ТаблицаЗначений.
  2. Выгружаем данные первого документа в таблицу.
  3. Перебираем строки второго документа, добавляя каждую позицию в эту же таблицу, но с отрицательным значением Количество.
  4. Выполняем метод Свернуть по полю Номенклатура.

Вот пример кода, который реализует данную логику:


ТЗ = СоздатьОбъект("ТаблицаЗначений");
Док1.ВыгрузитьТабличнуюЧасть(ТЗ, "Товар, Количество");
ТЗ.НоваяКолонка("Количество2", "Число", 15, 3);
Док2.ВыбратьСтроки();
Пока Док2.ПолучитьСтроку() = 1 Цикл
    ТЗ.НоваяСтрока();
    ТЗ.Товар = Док2.Товар;
    ТЗ.Количество2 = Док2.Количество;
КонецЦикла;
ТЗ.Свернуть("Товар", "Количество, Количество2");

После выполнения этого кода в ТЗ останутся только те позиции, где есть расхождения. Анализируя колонки Количество (из первого документа) и Количество2 (из второго), мы можем легко определить, где произошло увеличение, а где уменьшение или удаление товара.

Детализированный анализ расхождений

Чтобы результат был наглядным, мы можем вывести данные в отчет. Рассмотрим пример формирования печатной формы с разницей:


ТЗ.ВыбратьСтроки();
Таб = СоздатьОбъект("Таблица");
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
    ПечРазница = ТЗ.Количество - ТЗ.Количество2;
    Таб.ВывестиСекцию("Строка");
КонецЦикла;
Таб.Показать();

Этот подход позволяет визуализировать разницу между документами. Если в поле ПечРазница получается 0, значит, товар совпадает по количеству. Если число положительное — в первом документе было больше, если отрицательное — больше во втором (или позиция была добавлена).

Сравнение с использованием запросов (для 1С 8.х)

Если вы работаете на современных версиях платформы, использование циклов для перебора строк является менее производительным. В таких случаях лучше применять Запрос с использованием ПОЛНОГО СОЕДИНЕНИЯ (Full Join). Это позволяет объединить данные из двух источников по ключевым полям (Номенклатура и Серия), даже если записи существуют только в одном из них.

Рассмотрим структуру такого запроса:


ВЫБРАТЬ 
    Товары1.Номенклатура,
    ЕСТЬNULL(Товары1.Количество, 0) КАК Кол1,
    ЕСТЬNULL(Товары2.Количество, 0) КАК Кол2
ПОМЕСТИТЬ Итоговая
ИЗ Документ.Док1.Товары КАК Товары1
ПОЛНОЕ СОЕДИНЕНИЕ Документ.Док2.Товары КАК Товары2
ПО Товары1.Номенклатура = Товары2.Номенклатура
;
ВЫБРАТЬ * ИЗ Итоговая ГДЕ Кол1 <> Кол2

Использование функции ЕСТЬNULL критически важно: она преобразует пустое значение, возникшее при отсутствии товара в одном из документов, в 0, что делает возможным корректное математическое сравнение.

Ключевые советы при разработке

Проанализировав эти методы, вы сможете выбрать оптимальный вариант для вашей задачи, будь то классическая ТаблицаЗначений или мощный механизм Запросов. Совмещая эти инструменты, вы всегда добьетесь точности и наглядности в работе с данными 1С.

← На главную