gifts2017

Компаратор оборотов в информационных базах

Опубликовал Сергей (ildarovich) в раздел Отчеты - Анализ учета

Простой, универсальный, удобный и очень быстрый инструмент для сравнения оборотов в двух информационных базах через COM-соединение. В отчете на указанном интервале поиска выделяются все интервалы, на которых обороты по заданному регистру различаются. Это делается методом половинного деления. В этих интервалах показываются регистраторы, имеющие различающиеся обороты. Универсальность достигается возможностью выбора контролируемого регистра (включая регистр бухгалтерии), набора учитываемых при сравнении ресурсов выбранного регистра, отбора по организации и возможностью задания списка контролируемых счетов.

Игра «найди 10 отличий» тренирует внимательность, находчивость и зрительную память, но быстро надоедает, когда дело касается сравнения информационных баз системы «1С: Предприятие».   Тем не менее, на практике такая задача возникает чаще, чем хотелось. В наиболее типичном случае приходится выяснять причины почему-то изменившихся в прошлом периоде оборотов некоторого счета или регистра. 

Обычно все начинается со слов: - Вчера (на прошлой неделе, в прошлом месяце) этот отчет показывал другие цифры! – Разберитесь, что произошло!

Самый надежный способ разобраться – это развернуть эталонную копию базы и сравнить ее с рабочей. Причем наиболее прямой и быстрый путь – это сравнение не содержания отдельных документов, а итогов их проведения в целом. Если суммарные итоги проведения документов на некотором интервале  совпадают, этот интервал можно исключить из рассмотрения, сосредоточившись на оставшейся части интервала поиска. Доказано, что выгодней всего использовать на каждом шаге половинное деление интервала неопределенности.   Из-за высокой эффективности именно половинное деление (дихотомия) применяется при ручном поиске причин расхождений. Предлагаемый отчет является автоматизированной разновидностью поиска расхождений в оборотах методом половинного деления.

На фиг.1 показано основная страница формы отчета.

Основная страница формы

На этой странице можно выбрать контролируемый регистр (включая регистр бухгалтерии). Список регистров для выбора заполняется автоматически по метаданным конфигурации. Также можно выбрать контролируемые ресурсы регистра. Именно обороты этих ресурсов участвуют в сравнении. В случае, когда ни один ресурс не выбран, контролируются все ресурсы регистра. Если регистр имеет измерение «организация», можно указать организацию,  по которой будет делаться отбор при сравнении. Если организация не задана, то отбор не делается и проверка идет по всем организациям. Для регистра бухгалтерии можно уточнить список контролируемых счетов. Если список пустой, то будут контролироваться все счета.

Предполагается, что в сравнении участвуют родственные конфигурации – названия регистров и контролируемых ресурсов должны совпадать.  Хотя принципиальных ограничений для сравнения этим методом оборотов по разноименным регистрам и ресурсам и не родственным конфигурациям нет, для простоты управления отчетом такая возможность пока не задействована.

Результат сравнения представляет собой дерево значений. Верхний уровень дерева содержит список максимально узких интервалов отличающихся оборотов. Каждая ветвь результата сравнения соответствует одному интервалу расхождений оборотов и выводится в две строки. В первой отражены обороты по соответствующим ресурсам для текущей базы, а во второй – обороты в подсоединенной базе. При раскрытии ветви дерева, соответствующей одному интервалу, показывается список регистраторов в текущем интервале с их оборотами в обеих базах. Показываются не все регистраторы интервала, а только те, обороты которых в двух  базах различаются. Регистратор текущей базы можно открыть прямо из отчета.

На фиг.2 показана страница для настройки подключения ко второй базе.

Страница настройки подключения

Параметры подключения не обязательно записывать вручную. Их можно задать, выбрав базу для подключения из списка зарегистрированных баз.

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

Также можно предложить использовать эталонную «теневую» базу с правами только на чтение, обновляемую после закрытия периода. В сочетании с данным отчетом это образует надежную самоконтролируемую учетную систему.   

Основное достоинство отчета: высокая скорость работы. Она тем выше, чем ближе анализируемая база к эталонной. Даже очень большая база проверяется таким методом за несколько секунд.

Также можно отметить, что отчет позволяет сосредоточиться на контроле только существенных изменений в базе данных, не давая «ложных тревог» и оставляя без внимания второстепенные изменения, не повлиявшие на значения основных показателей.

P.S.: Просьба сообщать в комментариях о найденных в отчете ошибках и неудобствах, если они будут замечены. 

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Отчет "Компаратор оборотов"
.erf 32,00Kb
13.05.14
111
.erf 2014051310 32,00Kb 111 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Юрий Былинкин (ardn) 04.05.14 21:10
Прикольно!
Возможно стоит добавить еще детализацию показателей по измерениям, например номенклатура или склад. Поясню: в документе заменили одну позицию номенклатуры другой с той же ценой, сумма не поменялась. Изменили склад - сумма также не изменилась.
А вообще - отлично!
2. Сергей (ildarovich) 05.05.14 13:32
Забыл сказать, что на мысль использовать данный подход для сравнения движений документов в двух базах меня натолкнула статья Сравнение двух строк. Функция. А то, что метод дихотомии является популярным методом поиска ошибок, подтверждается, например, в статье Теория поиска ошибок :).
3. Сергей (ildarovich) 05.05.14 13:40
(1) ardn, это хорошее предложение - сделать настраиваемый фильтр по всем измерениям анализируемого регистра. - Подумаю над этим.
4. Андрей Киреев (FractonKireyev) 07.05.14 09:53
Идея шикарная. Автору - мои аплодисменты.
Но в методике по описанию сразу сразу несколько проблемных моментов:

1. Интервал сравнения оборотов - 1 месяц. Документ перенесён с 10-го числа на 20-е. При сравнении оборотов за 1 месяц ничего не произошло (документ не поменял период сравнения оборотов). Но другой документ за 5-е число поменял обороты.
При этом в пределах месяца получаем одну ошибку (на 1 копейку от документа за 5-е число), а при поиске этого документа делим интервал пополам и в каждом интервале получаем ошибку на много тысяч (от перенесённого документа). А если нет документа с изменёнными оборотами за 5-е число - то перенос документа с 10-го на 20-е вообще никак не обнаруживается.

2. Давным давно, много десятилетий назад на заре компьютеризации нашей цивилизации, было доказано, что в подобных поисковых системах с точки зрения производительности гораздо выгодней делить интервал не пополам, а по методу золотого сечения.
5. Сергей JesteR (JesteR) 07.05.14 15:18
"На фиг 1" интересно пишется )))
6. Сергей (ildarovich) 07.05.14 16:41
7. Сергей (ildarovich) 07.05.14 16:51
(4) По порядку
1) Отчет показывает все эти изменения в достаточно понятном виде. В демо-базе БП в феврале 2009 оказались как раз документы в этих датах и были внесены указанные изменения. Вот, что показал отчет. Все вроде бы логично и проблемы не видно.

2) Здесь Вы путаете с методом поиска экстремума функции, где "замер" показывает не наличие-отсутствие искомого объекта на интервале поиска, а значения функции (их нужно два), которые затем сравниваются, чтобы было понятно с какой стороны экстремум и куда идти. А бинарный поиск - это немного другое. Да просто попробуйте сыграть в "угадай число" с ответами "больше-меньше" и самая эффективная стратегия родится сама собой.
V.Nikonov; +1 Ответить
8. т т (MadMix) 08.05.14 12:24
(4) FractonKireyev,

1) Здесь сравниваются итоги, поэтому можно придумать много подобных ситуаций. Например, отличающиеся реквизиты в движениях или изменение суммы документа и ввод сторнирующих эти изменения проводок в том же месяце. Достоверность принесена в жертву скорости работы.
Если нужно полное сравнение движений, проще выгрузить движения в табличный документ в одинаковом виде и сравнить через "сравнение файлов" или любую другую DIFF-программу.

2) Если я правильно помню, метод золотого сечения предпочитают методу дихотомии, потому что для него на каждом шаге нужно вычислять значение функции в одной новой точке, а не в двух, как при дихотомии. В данном случае, значение функции - остатки на границах периода, которые платформа берет из таблицы итогов (по крайней мере, по месяцам), что наоборот выгоднее по производительности, чем получение остатков на произвольную точку внутри месяца, как будет при делении по золотому сечению. Внутри же месяца действительно выгоднее будет использовать золотое сечение.

UPD: внутри месяца будет быстрее сразу сравнивать таблицы движений, так как они все равно будут использоваться при расчете остатков на произвольную дату внутри месяца.
9. Сергей (ildarovich) 09.05.14 23:25
(8) MadMix,
1) Все так, но я бы сказал, что в жертву скорости работы принесена не достоверность, а полнота контроля. Полноту можно увеличить, если контролировать итоги, развернутые по измерениям.
2) Метод золотого сечения здесь совершенно не причем. Значения функции в нем вычисляются для поиска точки, в которой функция достигает максимума (или минимума). Как это связать со сравнением оборотов? Предлагаете искать максимум или минимум чего?
То есть золотое сечение - для совершенно другой задачи, хотя по структуре методы похожи.
То, что рассчитанные итоги не помогают определять сумму оборотов внутри месяца - это так. Но все равно метод дихотомии будет быстрее и внутри месяца, когда отличий сравнительно мало. Потому, что вместо построчного сравнения больших таблиц, перегоняемых из базу в базу, мы сравниваем несколько контрольных сумм, получаемые двумя запросами.
Это как сравнить два гигабайтных файла, хранящихся на разных компьютерах. Можно их сравнить побайтно, передав файлы по сети. Это долго. А можно рассчитать и сравнить только контрольные суммы файлов.
10. т т (MadMix) 10.05.14 09:34
(9) ildarovich, здесь функцию можно представить как дискретную функцию:
f(x) = 1, когда есть отличия между оборотами в базах за период от НачалоПериода до НачалоПериода + x;
иначе f(x) = 0.
Поэтому вполне можно применять любые методы поиска экстремума.
11. Сергей (ildarovich) 10.05.14 10:34
(10) MadMix, метод золотого сечения требует, чтобы функция была УНИМОДАЛЬНОЙ. А предлагаемый метод находит любое количество отличий.

Но пусть даже отличие только одно...
Пусть начальный отрезок [0, 1]. Отличие в точке 0.001. Выберем х1 < х2 по правилу золотого сечения. f(x1) = 1, f(х2) = 1. По методу золотого сечения нужно будет взять в качестве следующего интервала [0, x2]? А по здравому смыслу [0, х1]! Дихотомия сузит интервал неопределенности до 0.001 за десять шагов, а золотое сечение - за 15 шагов (1.618 ^ 15 = 1363).
12. т т (MadMix) 10.05.14 11:24
(11) ildarovich, окей, попробую разжевать. Метод дихотомии позволяет найти отличия за наименьшее число итераций, что отнюдь не означает максимальную скорость. Метод золотого сечения позволяет сократить число вычислений значения функции (именно это занимает наибольшее время, как правило).

В вашем же примере - при дихотомии нужно будет вычислить значение функции 19 раз (по 2 раза на каждой итерации и 1 раз на первом шаге). При использовании золотого сечения - только 15 раз.

Проблема с поиском всех отличий тоже решается достаточно просто.
13. Сергей (ildarovich) 10.05.14 11:43
(12) MadMix, давайте разжевывать до конца...
Если функция унимодальна (отличие только одно), то при дихотомии на одной итерации потребуется ОДНО вычисление функции - делим интервал надвое и проверяем (сравниваем обороты) правый интервал: если отличие есть, выбираем в качестве следующего его, иначе - берем левый интервал. Так что вычислений функции - 10.
И про это
Проблема с поиском всех отличий тоже решается достаточно просто
тоже поподробнее, пожалуйста.
14. Сергей (ildarovich) 10.05.14 12:08
(12) Ну и вообще, чтобы спор не был голословным, может быть предложите свою функцию для сравнения двух строк методом золотого сечения? Это простая задача из статьи http://infostart.ru/public/174530/. Можно будет сравнить быстродействие не на словах, а на деле. В комментарии http://forum.infostart.ru/forum24/topic80332/message852380/#message852380 есть обработка, куда сможете вложить свою функцию. Мне кажется, при попытке применить золотое сечение к этой задаче на практике, сразу станет ясно "той ли системы ваши гранаты".
15. Максим Кузнецов (Makushimo) 12.05.14 12:56
Жееесть -))
Ребята, ваш спор - это жесть ;-))
16. анд гру (agrustny) 15.05.14 23:34
(15) Нормальный спор, мягкий вполне себе. Только студента куда-то след простыл, когда его попросили показать домашнее задание...
17. Артур Аюханов (artbear) 19.05.14 20:42
(0) Хорошая обработка, давным-давно я также делал аналогичную работу (есть в профиле).
Но у тебя ИМХО намного мощнее, лучше и удобнее получилось.
Молодец.
Спасибо!
19. Сергей (ildarovich) 28.05.14 09:08
Появилась еще одна обработка для решения той же задачи: Сравнение оборотно-сальдовой ведомости двух баз и поиск различий в операциях (проводках документов). Разница в том, что там сначала строится ОСВ, а потом находятся различия путем последовательного сравнения проводок по счету. Минус такого подхода - в бОльших затратах времени, а плюс - в том, что используемые формы отчетов имеют привычный вид. Также там упоминается обработка, взятая за основу: http://infostart.ru/public/167127/.
Предлагаемая здесь обработка фактически работает не со всей ОСВ, а с ее последней итоговой строчкой (хотя можно отбирать счета и показатели). Поэтому идеальная обработка все же должна быть разделена: первая должна сравнивать обороты за весь период в развороте по всем счетам и измерениям, а вторая - дихотомией находить собственно причины расхождений по ранее определенным измерениям. Иначе можно не заметить изменения аналитики в проводках.
...
В коллекцию ссылок еще отчет по той же теме: Сравнение регистров бухгалтерии с копией базы для БП 2.0 на платформе 8.2.
AlexanderKai; +1 Ответить
20. г. Казань Рустем Гумеров (Rustig) 03.07.14 13:59
(0) да, это тоже сильно! отличная статья
21. Роман С (Dach) 13.08.14 19:27
Ваш отчет на регистрах накопления в ЗУП 2.5 не работает. Скрин ошибки http://itmages.ru/image/view/1843779/69e9f753
22. Сергей (ildarovich) 13.08.14 19:46
(21) Dach, все работает и дело не в конфигурации. Этот отчет принципиально требует заданного интервала анализа, а вы его не задали - отчету нечего делить пополам, вот он и вылетает. Нужно будет вставить проверку на непустые значения!
23. Роман С (Dach) 13.08.14 22:55
(22) ildarovich, ясно... в недрах отчета не ковырялся, скажите, он сравнивает результаты, хранящиеся в виртуальных таблицах остатков и оборотов или сам агрегирует суммы? Потому что в ситуации, когда в одной из баз кривые итоги... далее можно не продолжать....
24. Сергей (ildarovich) 14.08.14 10:37
(23) Dach, отчет работает с виртуальными регистрами, а они уже агрегируют суммы. Внутри интервалов хранения итогов (месяц) работа с виртуальными регистрами будет опираться не только на сами итоги, но и на движения.
Основное назначение отчета - очень быстро найти и показать места разницы в оборотах. Он не должен быть единственным инструментам контроля. Хотя бы потому, что не контролирует замену аналитики в проводках. Если в одной из баз кривые итоги, отчет все равно покажет расхождения, но для определения первопричины итоги нужно будет пересчитать.
25. юрий гулидов (gull22) 28.08.14 15:22
Ну вот, только губу раскатаешь:
{ВнешнийОтчет.КомпараторОборотов.МодульОбъекта(213)}: Поле объекта не обнаружено (СуммаОборотДт1)
Результат.Строки[0][Колонка.Имя + Суффикс] = Результат.Строки[0][Колонка.Имя + Суффикс] + Таблица[0][Колонка.Имя]

Комплексная автоматизация, редакция 1.1 (1.1.50.1)
1С:Предприятие 8.2 (8.2.19.106)
26. Сергей (ildarovich) 24.09.14 09:14
(25) gull22, у меня эта ошибка не воспроизводится. Попробуйте на форме перевыбрать сравниваемый регистр - похоже, не обновился список сравниваемых показателей. А сравниваемые базы данных имеют одинаковые конфигурации?
27. юрий гулидов (gull22) 30.09.14 14:10
Наверное настройки неправильно делал, подошел более вдумчиво, все получилось. Спасибо за труды
28. Juliett (JuliettT) 21.07.15 12:24
А Бухгалтерия предприятия 3.0 и УТ 10.3 можно будет через нее сравнивать?
29. Сергей (ildarovich) 21.07.15 13:15
(28) JuliettT, нет, нельзя. Сравниваются только конфигурации, имеющие одинаковые регистры. По измерениям и ресурсам. Кажется, таких регистров в БП 3.0 и УТ нет.

То есть обработке всегда нужно знать, что с чем сравнивать. Когда конфигурации совпадают или близки, то этот вопрос решается сам собой: сравниваются одноименные регистры, измерения и ресурсы.
А если конфигурации разные, то нужно еще придумать, как задать соответствие объектов для сравнения.
30. Дмитрий Воробьев (vde69) 23.12.15 12:12
1. не верно распознает параметры подключения к 8.3
2. для серверных баз имя сервера не корректно вместо myServ заполняет Srvr="myServ ";
3. имя базы в лишних кавычках
4. нет события при ошибки COM соединения
5. ошибки типа - Поле объекта не обнаружено (СуммаОборотДт1)

дальше пока не дошел
31. Сергей (ildarovich) 23.12.15 12:51
(30) vde69, спасибо, обратной связи по этой обработке не было, а она нужна. Ошибки буду поправлять. Сам этой обработкой пользуюсь довольно часто, считаю ее очень эффективной из-за заложенных принципов. Есть версия под УФ, но большого интереса не увидел и поэтому выкладывать пока не стал. Обход ошибки 5 - перевыбор регистра в поле формы.
32. Сергей (serggo) 20.02.16 01:41
(31), можете для 3.0 выложить? )
33. Александр Араптанов (flex81) 08.03.16 23:02
Там у вас ошибочка при сборке запроса. Который вы гоняите в процедуре Дихотомия. Посмотрите условия:
ГДЕ Период МЕЖДУ &От И &До И Организация = &Организация И (СчетДт В (&СчетаУчета))...

При таких условиях берется период не в заданных значения, а за всю историю регистра.

Так и не понял - как вы передаете в Результат значения регистраторов?
34. Александр Араптанов (flex81) 08.03.16 23:04
Хотел переделать, чтобы в качестве сравнения использовался xml файл из базы. Нужно когда не могу подключить базы, разные платформы и т.п. При переходе с 82 на 83 например.
35. Сергей (ildarovich) 09.03.16 11:23
(33) flex81,
ГДЕ Период МЕЖДУ &От И &До И Организация = &Организация И (СчетДт В (&СчетаУчета))...

При таких условиях берется период не в заданных значения, а за всю историю регистра.
Этого не понял. Условие
Период МЕЖДУ &От И &До
как раз и служит для ограничения области поиска значениями "От" и "До", которые все время сужаются (рекурсивно), что приводит к нахождению минимального интервала, содержащего расхождения.
(34) Кажется, что данную обработку взять за основу сравнения через xml будет не удобно. Все же она основана на серии уточняющихся запросов к двум "живым" базам. Если одна база в оффлайн, то то, что получается из итогов регистра (обороты на анализируемом интервале) придется эмулировать, выгрузив все движения, хотя ... попробуйте.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа