Сравнение документов в 1С 8.3: как найти различия
Содержание
Способ сравнения зависит от того, что перед вами. Один и тот же документ в двух состояниях «до и после правки» сравнивают через историю изменений (версионирование объектов). Два разных документа одного вида сличают вручную рядом или выгружают их табличные части в один отчёт. А если нужно сверить десятки полей автоматически — пишут короткую обработку, которая обходит реквизиты через метаданные.
Ниже — все рабочие варианты: от встроенного механизма версий до программного сравнения объектов и разбора ситуации в распределённой базе (РИБ). Пути меню приведены для 1С 8.3 (интерфейс «Такси»), конфигурация «1С:Бухгалтерия 3.0»; в ЗУП 3.1 и УТ 11 логика та же, меняется только раздел.
Встроенный механизм: сравнение версий документа
Единственный штатный инструмент сравнения данных в типовых конфигурациях — версионирование объектов (оно же «История изменений»). Он хранит снимки документа при каждой записи и позволяет наглядно сравнить любые две версии.
Сначала механизм нужно включить:
- Откройте
Администрирование → Общие настройки. - Разверните группу «История изменений» и нажмите ссылку настройки версионируемых объектов.
- В списке найдите нужный вид документа (например, «Реализация товаров и услуг») и задайте режим — обычно «Версионировать при записи».
- Сохраните настройку.
Версии копятся только с момента включения механизма. Для документов, записанных до того, как вы включили версионирование, истории не будет — сравнивать будет нечего.
Когда механизм работает, откройте документ и в меню «Еще» (или в командной панели) выберите «История изменений». Откроется список версий с датой, автором и комментарием.
Выделите две строки с зажатым Ctrl и нажмите «Сравнить версии». 1С построит отчёт, где изменённые реквизиты шапки подсвечены, а в табличных частях видно, какие строки добавлены, удалены или отредактированы. Это и есть самый быстрый ответ на вопрос «что поменялось в документе».
В отчёте сравнения столбец «Было / Стало» показывает старое и новое значение рядом — удобно, когда правок много и нужно найти конкретную.
Из того же списка версий одну версию можно открыть целиком кнопкой «Открыть версию» — она показывает документ таким, каким он был на выбранный момент, не меняя текущих данных. Это выручает, когда нужно не столько сравнить две версии между собой, сколько вспомнить, как документ выглядел до серии правок.
В настройках версионирования у каждого объекта есть режим хранения: версионировать при любой записи или только при проведении. Если документ часто перепроводят автоматически (например, при групповых операциях), выбирайте проведение — иначе версий накопится слишком много и среди них трудно будет найти содержательное изменение.
Два разных документа: сличаем вручную
Для двух самостоятельных документов штатной кнопки «сравнить» в типовых конфигурациях нет — версионирование работает в пределах одного объекта. Поэтому действуют проще.
Откройте оба документа в отдельных окнах. В «Такси» окна можно расположить рядом: перетащите одно из них за заголовок к краю экрана, второе — к противоположному. Теперь шапки и таблицы видны одновременно, и расхождения в контрагенте, договоре, сумме или ставке НДС бросаются в глаза.
Этот способ оправдан, когда документов два и строк немного. Как только таблиц становится больше десятка строк, глазами сверять ненадёжно — переходите к отчёту.
Отдельный частый случай — документы, созданные копированием друг из друга. У них совпадает почти всё, а различаются обычно дата, номер и один-два поля, которые правили руками. Начинайте сверку именно с них: контрагент, договор, склад, дата. Если эти поля совпали, а суммы разошлись — причина чаще всего в табличной части или в ценах, подтянутых на разные даты.
Сравнение табличных частей: где прячутся различия
Чаще всего документы расходятся не в шапке, а в табличной части — в составе номенклатуры, количестве, ценах или счетах учёта. Чтобы не сверять строки вручную, соберите обе таблицы в один универсальный отчёт.
Откройте Отчёты → Универсальный отчёт, в качестве источника выберите табличную часть нужного документа (например, «Реализация товаров и услуг → Товары»), в отборе укажите оба документа и выведите номенклатуру с суммами. Две колонки сумм рядом сразу покажут, где позиции не совпали.
На что смотреть при сверке таблиц:
- 📊 Количество строк. Разное число строк — верный признак, что состав отличается.
- 🔢 Порядок строк. Одна и та же номенклатура может стоять на разных позициях — сравнивайте по товару, а не по номеру строки.
- 💱 Цены и суммы. Расхождение на копейки обычно означает разные настройки округления или ручную правку суммы.
- 🧾 Счета учёта и ставки НДС. Эти колонки заполняются по правилам учёта и легко разъезжаются, если у документов разные даты или контрагенты.
Проведённый и непроведённый документы в карточке могут выглядеть одинаково, а различаться движениями по регистрам. Если сравниваете результат проведения — смотрите не карточку, а регистры (кнопка «ДтКт» или «Движения документа»).
Программное сравнение объектов для разработчиков
Когда полей много, а сверять нужно регулярно, поле в поле обходят кодом. Идея простая: берём метаданные документа, перебираем реквизиты и сравниваем значения двух ссылок. Такой код удобно положить во внешнюю обработку или выполнить в консоли.
Процедура СравнитьДокументы(Ссылка1, Ссылка2)
МетаданныеДок = Ссылка1.Метаданные();
// Реквизиты шапки
Для Каждого Реквизит Из МетаданныеДок.Реквизиты Цикл
Имя = Реквизит.Имя;
Значение1 = Ссылка1[Имя];
Значение2 = Ссылка2[Имя];
Если Значение1 <> Значение2 Тогда
Сообщить(СтрШаблон("Реквизит «%1»: было %2, стало %3",
Имя, Строка(Значение1), Строка(Значение2)));
КонецЕсли;
КонецЦикла;
// Число строк в табличных частях
Для Каждого ТЧ Из МетаданныеДок.ТабличныеЧасти Цикл
Строк1 = Ссылка1[ТЧ.Имя].Количество();
Строк2 = Ссылка2[ТЧ.Имя].Количество();
Если Строк1 <> Строк2 Тогда
Сообщить(СтрШаблон("Таблица «%1»: строк %2 и %3",
ТЧ.Имя, Строк1, Строк2));
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Обращение Ссылка1[Имя] читает реквизит по строковому имени прямо из ссылки, а МетаданныеДок.Реквизиты и .ТабличныеЧасти дают полный список полей — ничего не нужно прописывать руками, код подойдёт для любого вида документа.
Для построчного сравнения табличных частей выгрузите обе в таблицы значений методом Выгрузить() и сверьте по ключевым колонкам (номенклатура, характеристика). Писать это универсально сложнее, поэтому для разового разбора часто хватает сравнения по числу строк и общей сумме.
Числа и значения в сообщения подставляйте через СтрШаблон, а не склеивайте оператором + — так не придётся вручную приводить типы и форматировать.
Если код писать не хочется, те же данные достаёт запрос в консоли. Он выбирает строки обоих документов в одну выборку, и расхождения видны сразу:
ВЫБРАТЬ
Товары.Ссылка КАК Документ,
Товары.Номенклатура,
Товары.Количество,
Товары.Сумма
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
ГДЕ
Товары.Ссылка В (&Документ1, &Документ2)
УПОРЯДОЧИТЬ ПО
Товары.Номенклатура, Документ
Сгруппируйте результат по номенклатуре — и строки, которые есть только в одном документе, окажутся без пары. Имя таблицы Документ.РеализацияТоваровУслуг.Товары подставьте под свой вид документа и его табличную часть.
Как сравнить движения двух проведённых документов
Проведённые документы могут иметь одинаковые реквизиты, но давать разный результат — разные проводки и движения по регистрам. Карточка этого не покажет, сравнивать нужно движения.
У каждого документа откройте движения кнопкой «ДтКт» (бухгалтерские проводки) или командой «Движения документа» — она выводит записи по всем регистрам, которые затронул документ. Поставьте два окна рядом и сверьте суммы по счетам и регистрам.
Когда движений много, соберите их в один отчёт. Подойдёт отчёт по проводкам или движениям регистра с отбором по регистратору: укажите в отборе оба документа, и проводки встанут друг под другом с группировкой по счёту. Расхождение по конкретному счёту сразу бросится в глаза.
Если один документ проведён, а второй — нет, движений у второго не будет вообще. Это не различие в данных, а разное состояние: перед сравнением убедитесь, что оба проведены.
Расхождения в распределённой базе (РИБ)
В РИБ один и тот же документ существует в нескольких узлах, и расхождение чаще всего — результат коллизии: объект изменили в двух узлах между сеансами обмена.
Ключевое правило типового обмена: при коллизии приоритет у главного узла. Если документ правили и в центральной базе, и в периферийной, после обмена «победит» версия главного узла, а правки подчинённого будут перезаписаны. Это штатное поведение, а не ошибка.
Чтобы увидеть, чем версии отличались до перезаписи, заранее включите версионирование в обоих узлах. Тогда после обмена вы сможете открыть «Историю изменений» и сравнить версию, пришедшую по обмену, с той, что была локально.
Полезно сверить и дату документа с границей последовательности или датой запрета редактирования: если документ в подчинённом узле попал в закрытый период, его правки могут не примениться не из-за коллизии, а из-за запрета изменения данных. Это два разных механизма, и путать их не стоит — коллизия решается приоритетом узла, а запрет периода снимается только изменением даты запрета.
Не пытайтесь «чинить» расхождение повторной выгрузкой всей базы или пересозданием узла без необходимости — это долгая операция, которая остановит обмен для всех. Сначала разберитесь с конкретным документом через его версии.
Внешние обработки и другие инструменты
Помимо штатных средств, для сравнения применяют:
- Внешние обработки сравнения объектов. Готовые обработки с профильных площадок умеют сопоставлять два объекта поле в поле и строить отчёт. Проверяйте их на копии базы: сторонний код может менять данные.
- Выгрузку в табличный документ. Печатную форму или табличную часть каждого документа сохраняют в файл и сравнивают во внешнем редакторе таблиц.
- Запрос к базе. Разработчик выгружает реквизиты обоих документов одним запросом и сравнивает колонки в консоли запросов — быстрее, чем открывать карточки. Консоль запросов есть и как внешняя обработка, и во многих типовых конфигурациях — в разделе для администратора или специалиста.
Отдельно стоит развеять частую путаницу. Режим «Сравнить, объединить» в Конфигураторе сравнивает конфигурации (файлы .cf), а не документы-данные. Для сравнения введённых пользователем документов он не применяется.
Типичные ошибки при сравнении
- ❌ Ждут историю, которой нет. Версионирование включили вчера, а сравнить хотят документ позапрошлого месяца — старых версий программа не хранит задним числом.
- ❌ Настроили версионирование не на тот объект. В списке версионируемых объектов отметили один вид документа, а сравнивают другой. Проверьте, что нужный вид включён.
- ❌ Сравнивают документы разных видов как равные. У Счёта и Реализации общие только базовые реквизиты; полное сравнение невозможно по определению.
- ❌ Смотрят карточку вместо движений. Два документа выглядят одинаково, но дают разные проводки из-за даты или учётной политики — различие видно только в регистрах.
- ❌ В РИБ надеются на правки подчинённого узла. По умолчанию они будут перезаписаны главным узлом при обмене.