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

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

Перейти к публикации

Комментарии
1. Юрий Былинкин (ardn) 75 04.05.14 21:10 Сейчас в теме
Прикольно!
Возможно стоит добавить еще детализацию показателей по измерениям, например номенклатура или склад. Поясню: в документе заменили одну позицию номенклатуры другой с той же ценой, сумма не поменялась. Изменили склад - сумма также не изменилась.
А вообще - отлично!
2. Сергей (ildarovich) 5112 05.05.14 13:32 Сейчас в теме
Забыл сказать, что на мысль использовать данный подход для сравнения движений документов в двух базах меня натолкнула статья Сравнение двух строк. Функция. А то, что метод дихотомии является популярным методом поиска ошибок, подтверждается, например, в статье Теория поиска ошибок :).
3. Сергей (ildarovich) 5112 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) 135 07.05.14 15:18 Сейчас в теме
"На фиг 1" интересно пишется )))
6. Сергей (ildarovich) 5112 07.05.14 16:41 Сейчас в теме
7. Сергей (ildarovich) 5112 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) 5112 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) 5112 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) 5112 10.05.14 11:43 Сейчас в теме
(12) MadMix, давайте разжевывать до конца...
Если функция унимодальна (отличие только одно), то при дихотомии на одной итерации потребуется ОДНО вычисление функции - делим интервал надвое и проверяем (сравниваем обороты) правый интервал: если отличие есть, выбираем в качестве следующего его, иначе - берем левый интервал. Так что вычислений функции - 10.
И про это
Проблема с поиском всех отличий тоже решается достаточно просто
тоже поподробнее, пожалуйста.
14. Сергей (ildarovich) 5112 10.05.14 12:08 Сейчас в теме
(12) Ну и вообще, чтобы спор не был голословным, может быть предложите свою функцию для сравнения двух строк методом золотого сечения? Это простая задача из статьи http://infostart.ru/public/174530/. Можно будет сравнить быстродействие не на словах, а на деле. В комментарии http://forum.infostart.ru/forum24/topic80332/message852380/#message852380 есть обработка, куда сможете вложить свою функцию. Мне кажется, при попытке применить золотое сечение к этой задаче на практике, сразу станет ясно "той ли системы ваши гранаты".
15. Максим Кузнецов (Makushimo) 150 12.05.14 12:56 Сейчас в теме
Жееесть -))
Ребята, ваш спор - это жесть ;-))
16. анд гру (agrustny) 18 15.05.14 23:34 Сейчас в теме
(15) Нормальный спор, мягкий вполне себе. Только студента куда-то след простыл, когда его попросили показать домашнее задание...
17. Артур Аюханов (artbear) 870 19.05.14 20:42 Сейчас в теме
(0) Хорошая обработка, давным-давно я также делал аналогичную работу (есть в профиле).
Но у тебя ИМХО намного мощнее, лучше и удобнее получилось.
Молодец.
Спасибо!
18. Сергей (ildarovich) 5112 20.05.14 16:14 Сейчас в теме
19. Сергей (ildarovich) 5112 28.05.14 09:08 Сейчас в теме
Появилась еще одна обработка для решения той же задачи: Сравнение оборотно-сальдовой ведомости двух баз и поиск различий в операциях (проводках документов). Разница в том, что там сначала строится ОСВ, а потом находятся различия путем последовательного сравнения проводок по счету. Минус такого подхода - в бОльших затратах времени, а плюс - в том, что используемые формы отчетов имеют привычный вид. Также там упоминается обработка, взятая за основу: http://infostart.ru/public/167127/.
Предлагаемая здесь обработка фактически работает не со всей ОСВ, а с ее последней итоговой строчкой (хотя можно отбирать счета и показатели). Поэтому идеальная обработка все же должна быть разделена: первая должна сравнивать обороты за весь период в развороте по всем счетам и измерениям, а вторая - дихотомией находить собственно причины расхождений по ранее определенным измерениям. Иначе можно не заметить изменения аналитики в проводках.
...
В коллекцию ссылок еще отчет по той же теме: Сравнение регистров бухгалтерии с копией базы для БП 2.0 на платформе 8.2.
AlexanderKai; +1 Ответить
20. г. Казань Рустем Гумеров (Rustig) 795 03.07.14 13:59 Сейчас в теме
(0) да, это тоже сильно! отличная статья
21. Роман С (Dach) 93 13.08.14 19:27 Сейчас в теме
Ваш отчет на регистрах накопления в ЗУП 2.5 не работает. Скрин ошибки http://itmages.ru/image/view/1843779/69e9f753
22. Сергей (ildarovich) 5112 13.08.14 19:46 Сейчас в теме
(21) Dach, все работает и дело не в конфигурации. Этот отчет принципиально требует заданного интервала анализа, а вы его не задали - отчету нечего делить пополам, вот он и вылетает. Нужно будет вставить проверку на непустые значения!
23. Роман С (Dach) 93 13.08.14 22:55 Сейчас в теме
(22) ildarovich, ясно... в недрах отчета не ковырялся, скажите, он сравнивает результаты, хранящиеся в виртуальных таблицах остатков и оборотов или сам агрегирует суммы? Потому что в ситуации, когда в одной из баз кривые итоги... далее можно не продолжать....
24. Сергей (ildarovich) 5112 14.08.14 10:37 Сейчас в теме
(23) Dach, отчет работает с виртуальными регистрами, а они уже агрегируют суммы. Внутри интервалов хранения итогов (месяц) работа с виртуальными регистрами будет опираться не только на сами итоги, но и на движения.
Основное назначение отчета - очень быстро найти и показать места разницы в оборотах. Он не должен быть единственным инструментам контроля. Хотя бы потому, что не контролирует замену аналитики в проводках. Если в одной из баз кривые итоги, отчет все равно покажет расхождения, но для определения первопричины итоги нужно будет пересчитать.
25. юрий гулидов (gull22) 82 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) 5112 24.09.14 09:14 Сейчас в теме
(25) gull22, у меня эта ошибка не воспроизводится. Попробуйте на форме перевыбрать сравниваемый регистр - похоже, не обновился список сравниваемых показателей. А сравниваемые базы данных имеют одинаковые конфигурации?
27. юрий гулидов (gull22) 82 30.09.14 14:10 Сейчас в теме
Наверное настройки неправильно делал, подошел более вдумчиво, все получилось. Спасибо за труды
28. Juliett (JuliettT) 5 21.07.15 12:24 Сейчас в теме
А Бухгалтерия предприятия 3.0 и УТ 10.3 можно будет через нее сравнивать?
29. Сергей (ildarovich) 5112 21.07.15 13:15 Сейчас в теме
(28) JuliettT, нет, нельзя. Сравниваются только конфигурации, имеющие одинаковые регистры. По измерениям и ресурсам. Кажется, таких регистров в БП 3.0 и УТ нет.

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

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

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

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

При таких условиях берется период не в заданных значения, а за всю историю регистра.
Этого не понял. Условие
Период МЕЖДУ &От И &До
как раз и служит для ограничения области поиска значениями "От" и "До", которые все время сужаются (рекурсивно), что приводит к нахождению минимального интервала, содержащего расхождения.
(34) Кажется, что данную обработку взять за основу сравнения через xml будет не удобно. Все же она основана на серии уточняющихся запросов к двум "живым" базам. Если одна база в оффлайн, то то, что получается из итогов регистра (обороты на анализируемом интервале) придется эмулировать, выгрузив все движения, хотя ... попробуйте.
36. v i (vis_tmp) 27 12.03.17 11:21 Сейчас в теме
Интересная вещь - попробую!
37. Сергей Петров (snisni2) 21.04.17 14:29 Сейчас в теме
Отчет - шедевр! Отличный код и эффективность. Автору респект и уважуха!! :) Применил для сверки бух.счетов при переходе с УПП на ERP (имя регистра бухгалтерии, измерений и ресурсов совпали), плюс немного доработал для соответствия документов и добавил сравнение по счетам проводок.
Оставьте свое сообщение