Перед разработчиками 1С часто встает задача сравнить две иерархические структуры данных, например, два состава изделия (спецификации), и наглядно показать пользователю различия. В идеале это должно выглядеть как встроенный в платформу механизм "Сравнение и объединение конфигураций", где можно одновременно разворачивать узлы и видеть, какие элементы были добавлены, изменены или удалены. Рассмотрим, как реализовать подобный функционал, поскольку готового решения в платформе 1С для этого нет.
Проанализируем основные подходы к решению этой задачи, от самых простых до наиболее гибких и функциональных.
Это самый мощный и гибкий способ, который позволяет полностью воссоздать желаемое поведение. Он предполагает создание собственной управляемой формы, на которой будут размещены два элемента типа "Дерево" или "Таблица" (в режиме отображения иерархии), и реализацию логики сравнения и синхронизации.
Разберем по шагам, как это можно сделать.
Подготовка данных и алгоритм сравнения.
Ключевая задача — рекурсивно обойти оба дерева и построить объединенную структуру, в которой будет отмечен статус каждого элемента: "Не изменился", "Добавлен", "Удален" или "Изменен".
СтатусСравнения.Визуализация на форме.
После того как объединенное дерево готово, его можно отобразить на форме. Но для создания эффекта "бок о бок" нужно два элемента управления.
ПриАктивизацииСтроки для первого дерева. В этом обработчике получите уникальный идентификатор активной строки (например, значение из ключевой колонки).Элементы.ВтороеДерево.ТекущаяСтрока = НайденныйИдентификаторСтроки;ПередРазворачиванием, ПередСворачиванием), чтобы при раскрытии ветки в одном дереве она автоматически раскрывалась и во втором.Преимущества: полный контроль над внешним видом и поведением, максимальное удобство для пользователя.
Недостатки: высокая трудоемкость реализации.
Этот метод отлично подходит для быстрого получения отчета о различиях без сложной интерактивности. Идея заключается в использовании мощного механизма запросов для сравнения данных.
ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ (FULL OUTER JOIN) по ключевым полям.ВЫБРАТЬ запроса используйте конструкцию ВЫБОР ... КОГДА ... для определения статуса каждой строки:
ВЫБРАТЬ
ВЫБОР
КОГДА Таблица1.Ключ ЕСТЬ NULL ТОГДА "Добавлен"
КОГДА Таблица2.Ключ ЕСТЬ NULL ТОГДА "Удален"
КОГДА Таблица1.Значение <> Таблица2.Значение ТОГДА "Изменен"
ИНАЧЕ "Не изменился"
КОНЕЦ КАК Статус,
ЕСТЬNULL(Таблица1.Ключ, Таблица2.Ключ) КАК Ключ,
Таблица1.Значение КАК Значение1,
Таблица2.Значение КАК Значение2,
ЕСТЬNULL(Таблица1.Родитель, Таблица2.Родитель) КАК Родитель
ИЗ
ВТ_Дерево1 КАК Таблица1
ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Дерево2 КАК Таблица2
ПО Таблица1.Ключ = Таблица2.Ключ
Преимущества: быстрота реализации, не требует сложного программирования, использует стандартный мощный механизм.
Недостатки: результат представляет собой отчет, а не интерактивный инструмент с синхронной навигацией.
Этот способ подходит для быстрой проверки различий разработчиком, но не для конечного пользователя.
ЗначениеВСтрокуВнутр().Преимущества: очень просто и быстро в реализации.
Недостатки: требует внешнего ПО, неудобно для пользователя, результат не интегрирован в интерфейс 1С.
СравнениеФайлов (Толстый клиент)Платформа предоставляет механизм для сравнения файлов, который можно приспособить для нашей задачи, но с существенными ограничениями.
ТабличныйДокумент.НачатьГруппуСтрок, ЗакончитьГруппуСтрок)..mxl.СравнениеФайлов.ПоказатьРазличия(ПутьКФайлу1, ПутьКФайлу2).Преимущества: использует стандартный, узнаваемый пользователями интерфейс сравнения.
Недостатки: работает только в толстом клиенте, не обеспечивает интерактивного разворачивания узлов, требует предварительной генерации файлов.
Итог: для создания действительно удобного и функционального инструмента, отвечающего исходному запросу, наиболее подходящим является первый метод — разработка собственной формы. Если же требуется быстро получить отчет о расхождениях, то оптимальным выбором будет второй метод с использованием СКД.