gifts2017

Сравнение элементов справочников двух баз по COM соединению. Теперь на управляемых формах.

Опубликовал ediks (ediks) в раздел Обработки - Обработка справочников

Сравнение идентичности элементов справочников по выбранным реквизитам в двух базах по COM соединению. Обработка может запускаться в режиме обычного и управляемого приложения.

После переноса данных в новую базу возникла задача сравнить справочники между исходной и новой базами. Какие-то элементы не были перенесены по ссылкам, у каких-то элементов за время переноса изменились какие-либо реквизиты и т.д и т.п. В результате родилась эта обработка. Элементы ищутся по UUID и сравниваются по выбранным реквизитам. Частично код заимствован (функции поиска COM объектов) из аналогичной публикации http://infostart.ru/public/21382/ , за что автору огромное спасибо (плюс я поставил Laughing).

Подробности можно узнать из встроенной справки и/или посмотреть код обработки. Код открыт и комментирован, поэтому в обработку легко можно добавить, например, сравнение документов.

Управляемые формы не используют процедуры и функции из модуля объекта. Ни одна процедура из модуля объекта не пострадала Laughing

10.12.2010 Вер. 1.0.2

1) Добавлена возможность соединения с базами на платформе 8.2

2) Исправлена ошибка при выборе справочника, содержащего табличные части.

3) Косметические изменения.

 19.02.2011 Вер.1.0.3

1) Исправлена ошибка при выборке реквизитов справочников.

2) Исправлена ошибка - отсутствовала процедура "СообщитьИнформациюПользователю". Перенесена из общего модуля в модуль объекта.

19.02.2011 Вер. 1.0.4

1) Косметические изменения.

 10.04.2012 Вер.1.0.2 УФ

1) добавлена возможность запуска режиме УФ

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

Наименование Файл Версия Размер
Сравнение справочников в разных базах УФ 189
.epf 47,79Kb
10.04.12
189
.epf 47,79Kb Скачать
Сравнение справочников в двух базах 508
.epf 31,28Kb
10.04.12
508
.epf 31,28Kb Скачать

См. также

Contragent+ 5.0 от 2 500
Подписаться Добавить вознаграждение
Комментарии
1. OBEH (OBEH) 08.12.10 13:23
"Идентичность" - Это код и наименование в справочниках разных конф?
2. ediks (ediks) 08.12.10 21:49
(1)Я вроде написал, что сравнение идет по выбранным реквизитам. Кнопка "Настройка" открывает форму выбора реквизитов.
3. OBEH (OBEH) 09.12.10 15:11
(2)Я еще не смотрел обработку. Просто вопрос возник.
Если, например, по коду можно, то дело стоящее.
А если, например, одна база на платформе 8.1, а другая база на платформе 8.2?
И еще. Идея. Мне кажется, коль пошла такая пьянка, может быть стоит добавить
на форму кнопку, которая формирует отчет по несовпадающим элементам?
4. ediks (ediks) 09.12.10 17:01
(3)

1) Сравнение идет в том числе и по коду, если он используется у справочника и если он выбран для сравнения.
2) Добавить поддержку 8.2 достаточно легко - в списке выбора нужно добавить 8.2 так, как это сделано для 8.1. Но основное предназначение обработки - сравнение элементов справочников для баз, являющихся родственными. Например, в новую базу переносили данные и нужно проверить несовпадающие элементы.
3) В табличную часть выводятся только несовпадения. Во встроенной справке это описано. Если в контестном меню выбрать пункт "Вывести список", то получим отчет по несовпадениям. В моем случае я выводил коды несовпадающих элементов и перегружал их из исходной базы.
5. OBEH (OBEH) 09.12.10 17:47
(4)Ну, так скоро и будет, переходы на "родственные" базы, но 8.1 на 8.2
Я так думаю, к новому году все потянутся на 8.2
6. OBEH (OBEH) 09.12.10 18:45
Поверил человеку. А тут, оказывается, с 8.2 не работает
7. OBEH (OBEH) 09.12.10 19:02
Переконвертировал под 8.2. Вроде, заработало.
Вот только шаг счетчика, наверное, надо бы на больших объемах ставить, например, 100
А то тормозит очень на выводе строки счетчика. Неужели не встречался с такой пакостью ни разу?
8. OBEH (OBEH) 09.12.10 19:06
Во! Рухнула задача по ошибке "Недостаточно памяти".
Примерно, на 40 тысяче записи.
И чего делать?
9. ediks (ediks) 09.12.10 20:40
(6) Насчет 8.2: я написал что нужно сделать на форме - добавить в список выбора строку 8.2. И ничего не нужно конвертировать - из под 8.1 прекрасно соединяется с 8.2.
(7) Процесс вывода занимает сравнительно небольшое время по сравнению с поиском COM объектов. Но код открыт - все в твоих руках.
(8) Попробуй уменьшить число сравниваемых реквизитов или задать фильтры в отборе. По умолчанию, сравнивается по всем реквизитам. Соответственно, если справочник содержит много реквизитов, то выборка получается очень большая. На 8 гигах оперативки при минимальном количестве сравниваемых реквизитов (1 - :D ) удавалось сравнить справочник договоров в 500-600 тыс. записей.
10. OBEH (OBEH) 10.12.10 09:29
(9)У меня не получилось установить выбор на 8.2
Там показывалось только 8.1(по умолчанию) и 8.0
8.2, вообще, даже вручную, не проходит. Тем более "прекрасно" не соединяется с 8.2
Процесс вывода можешь сам проверить, установив шаг, например, сто.
Будешь удивлен.
Количество сравниваемых реквизитов я сделал два - Код и Наименование.
Меньше нет смысла, а больше не надо.
По поводу того, что все в моих руках - конечно, могу код править,
но, пока не вижу смысла большого
11. ediks (ediks) 10.12.10 10:56
(10) Добавлять в список выбора 8.2 нужно в режиме конфигуратора.
12. Yuri (Virsy) 10.12.10 12:48
Выпала ошибка при сравнении реквизитов табличной части справочника:
{ВнешняяОбработка.СравнениеСправочниковВРазныхБазах(32)}: Ошибка при установке значения атрибута контекста (Текст): {(41, 14)}: Поле не найдено "Справочники.НомерСтроки"
Справочники.<<?>>НомерСтроки,
Построитель.Текст = СформироватьТекстЗапроса(1, КоличествоВВыборке);
по причине:
{(41, 14)}: Поле не найдено "Справочники.НомерСтроки"
Справочники.<<?>>НомерСтроки,
13. ediks (ediks) 10.12.10 12:55
(12) Табличные части не сравниваются. Это описано во встроенной справке.
14. Yuri (Virsy) 10.12.10 13:16
(13) тогда неплохо бы их не добавлять в список реквизитов
15. ediks (ediks) 10.12.10 14:19
(14) Был такой глюк :D . Исправился. Спасибо за наводку.
16. Алексей Северянин (Ledokol-alt) 09.02.11 20:14
Ешчо один "глюк": когда есть две табличные части, например "Образование" и "ДопОбразование", то в этом куске
//
// выкусим наименования табличных частей
Для каждого ТабличнаяЧасть Из Метаданные.Справочники[ТипОбъекта].ТабличныеЧасти Цикл
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ТабличнаяЧасть.Имя + ".", "");
КонецЦикла;

//
в слове "ДопОбразование." он обрезает "Образование." и потом ругается на слово "Доп":

{(25, 14)}: Поле не найдено "Справочники.Доп"
Справочники.<<?>>Доп

Т.е. не совсем корректный подход к определению реквизитов. Почему бы просто не перебрать реквизиты метаданных?
17. Алексей Северянин (Ledokol-alt) 09.02.11 20:17
А вообще качал в надежде что обрабатывает табличные части..
18. v_id (v_id) 19.02.11 12:13
{ВнешняяОбработка.СравнениеСправочниковВРазныхБазах(583)}: Метод объекта не обнаружен (СообщитьИнформациюПользователю)
ОбщегоНазначения.СообщитьИнформациюПользователю("Количество записей внешней базы: " + Количество);

8.1 Две УТ 10.3
19. ediks (ediks) 19.02.11 17:13
(16) Спасибо за наводку. Вроде исправил.
Насчет корректности подхода: простой перебор реквизитов по метаданным не дает таких реквизитов, как Владелец, Родитель, Код, Наименование, Пометка удаления, Предопределенный и т.д. Соответственно, их наличие необходимо анализировать дополнительно. Мне показалось это несколько неудобным.
Конструктор запроса делает этот анализ за меня, корректно выбирая все реквизиты.
20. ediks (ediks) 19.02.11 17:20
(18) Исправил этот глюк. Действительно, в УТ нет такой процедуры. Спасибо, что подсказали.
21. v_id (v_id) 19.02.11 19:42
Я конечно придираюсь, но "1" и "-1" не очень наглядно, может использовать раскраску типа зеленый есть в текущей нет в копии, красный наоборот?
22. ediks (ediks) 19.02.11 23:12
(21) Добавил "цветовую дифференциацию штанов строк" :D , попросту говоря, раскраску. А вообще я сразу делаю отбор по реквизиту "Свертка", вывожу список и копирую отобранные коды в какую-нибудь обработку обмена.
23. Олег Крапивный (powerpc) 22.09.11 09:51
А для сравнения документов можно сделать такую же обработку ? Особенно необходимо для сравнения выгрузки УТ в Бухгалтерию. Спасибо заранее
24. София (pantera190) 23.09.11 13:50
25. slav4ek (slav4ek) 19.10.11 08:23
26. bar_s (bar_s) 20.11.11 16:28
27. Вася Иванов (RTA) 24.01.12 11:22
кто может дать на нее прямую ссылку?
28. rasswet (rasswet) 11.04.12 12:35
обычная форма. где там закладка "расхождения"? или таковой нет?
выбрал справочник валюты. в настройках указал "код, наименование" в итоге три строки с одной базы под ними три строки с другой базы, это не наглядно.
29. ediks (ediks) 11.04.12 13:00
(28)
1) В обычной форме нет закладки "Расхождения" - данные выводятся в табличной части ниже, под отбором.
2) Каждая строка идентифицируется полем ГУИД и свертка. -1 означает, что объект находится во внешней базе. Соответственно, у Вас получается, что элементы справочника различаются, например, по полю ГУИД, если у них одинаковые код и наименование. Это возможно, например, если в базах элементы заводились вручную.

В управляемой форме то же самое, но нет раскраски строк.
31. lees lees (lees) 14.05.12 15:41
Спасибо! В хозяйстве пригодилось. Еще б была возможность сравнивать 8 с 7.7, тогда было б ваще круть.
32. www2007 (www2007) 23.10.12 17:32
Спасибо, пригодилось, и времени сэкономило немало... Полезная вещь..
33. Andre Skorik (SkorikA) 10.01.13 09:17
Ошибочка:
{ВнешняяОбработка.СравнениеСправочниковВРазныхБазах.МодульОбъекта(60)}: Ошибка при вызове метода контекста (Добавить)
Построитель.Отбор.Добавить("Владелец",, "Владелец");
по причине:
Недопустимое значение параметра (параметр номер '1')
Я так понимаю, если справочник подчинен владельцу и его не выбрал - то не работает?
34. ediks (ediks) 10.01.13 10:31
(33) Попробовал воспроизвести ошибку - не получилось. Не могли бы Вы подробнее описать условия возникновения ошибки: какая конфигурация, какой справочник, в какой момент возникает (при выборе типа объекта, при нажатии на кнопку "Настройка" и т.д.)?
Светлый ум; +1 Ответить
35. Константин Куликов (Светлый ум) 05.05.16 13:36
{ВнешняяОбработка.СравнениеСправочниковВРазныхБазах.МодульОбъекта(577)}: Ошибка при установке значения атрибута контекста (Текст)
КомПостроитель.Текст = СформироватьТекстЗапроса(-1, КоличествоВВыборке);
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.2.19.121): {(18, 14)}: Поле не найдено "Справочники.ФактическийАдресУдалить"
Справочники.<<?>>ФактическийАдресУдалить,
36. Константин Куликов (Светлый ум) 05.05.16 14:10
(35) Светлый ум,

Ошибка возникала при работе с Розница 1.0 --> БП 2.0
(сравнение справочника Контрагенты)

Поправил текст процедуры и заработало:
Функция СформироватьТекстЗапроса(пСвертка = 1, пКоличествоВВыборке = 0)

	Если НЕ ЗначениеЗаполнено(ТипОбъекта) Тогда	Возврат "" КонецЕсли;
	
	УсловиеПоКоличеству = ?(пКоличествоВВыборке = 0, "", "ПЕРВЫЕ " + Формат(пКоличествоВВыборке, "ЧГ=0"));
	ТекстЗапроса = 
	"ВЫБРАТЬ " + УсловиеПоКоличеству + "
	|	" + пСвертка + " КАК Свертка,
	|	Выразить("""" КАК Строка(36)) КАК ГУИД, Справочники.Ссылка КАК Ссылка, ";
	Для каждого СтрокаТЧ Из РеквизитыОбъекта Цикл
		
		Если Не Прав(СтрокаТЧ.Имя,7)= "Удалить" 
			И Не СтрокаТЧ.Имя = "БанковскиеРеквизиты"
			И Не СтрокаТЧ.Имя = "ГруппаПолучателейСкидки" 
			И Не СтрокаТЧ.Имя = "ПодписьДолжность" 
			И Не СтрокаТЧ.Имя = "ПодписьФИО"
			И Не СтрокаТЧ.Имя = "ГоловнаяОрганизация"  Тогда	
			
			Если СтрокаТЧ.Пометка Тогда
				ТекстЗапроса = ТекстЗапроса + "
				|	Справочники." + СтрокаТЧ.Имя + ",";
			КонецЕсли;
		КонецЕсли;
		
	КонецЦикла; 
	ТекстЗапроса = ЛЕВ(ТекстЗапроса, СтрДлина(ТекстЗапроса) - 1) + "
	|ИЗ
	|	Справочник." + ТипОбъекта + " КАК Справочники";
	
	Возврат ТекстЗапроса;

КонецФункции // СформироватьТекстЗапроса()
...Показать Скрыть