согласен с (4).
жаль, только поздно понял...
вот "заплатка":
вместо НайтиПоРавенствуРеквизитов надо вставить
вроде больше ничего не менял ( :-P )
------------------------------------------------------------------
///==============================================================================
function CheckAttrsForDifference(vLine, vStructForCompare)
for each item in vStructForCompare do
fieldName = item.Key;
if vLine[fieldName] <> item.value then
return true;
endIf;
endDo;
return false;
endFunction // CheckAttrsForDifference
///==============================================================================
Процедура НайтиПоРавенствуРеквизитов()
//СоколовЮВ+
structForCompare = new Структура;
attrStr = "";
ПостроительОтчета.Текст = ПолучитьТекстЗапросаДляПостроителя(РежимПоиска);
Если ЗначениеЗаполнено(ДопУсловие) Тогда
ПостроительОтчета.Текст = СтрЗаменить(ПостроительОтчета.Текст, "{ГДЕ", ДопУсловие + " {ГДЕ");
ТекстПоля = "";
ТекстСгруппировать = "";
Для Каждого ЭлементСписка Из СписокРеквизитовСправочника Цикл
Если Не ЭлементСписка.Пометка Тогда
Продолжить;
КонецЕсли;
ТекстПоля = ТекстПоля + Символы.ПС + "Спр1." + ЭлементСписка.Значение + ", ";
structForCompare.Insert(ЭлементСписка.Значение, "-");
attrStr = attrStr + ", " + ЭлементСписка.Значение;
КонецЦикла;
ПостроительОтчета.Текст = СтрЗаменить(ПостроительОтчета.Текст, "СГРУППИРОВАТЬ ПО", " СГРУППИРОВАТЬ ПО " + ТекстПоля);
ПостроительОтчета.Текст = СтрЗаменить(ПостроительОтчета.Текст, "ВЫБРАТЬ", "ВЫБРАТЬ " + ТекстПоля);
КонецЕсли;
//СоколовЮВ-
ПостроительОтчета.Выполнить();
мРезультатыПоиска = ПостроительОтчета.Результат.Выгрузить();
мРезультатыПоиска.Колонки.Добавить("НомерГруппы");
мРезультатыПоиска.Колонки.Добавить("Правильный", Новый ОписаниеТипов("Булево"));
мРезультатыПоиска.Колонки.Добавить("КоличествоСсылок");
мРезультатыПоиска.Сортировать("ЗначениеРеквизита" + attrStr);
ТаблицаГрупп.Очистить();
ЗначениеРеквизита = Неопределено;
ТекущаяГруппа = 0;
ЭлементовВГруппе = 0;
Для Каждого СтрокаПоиска ИЗ мРезультатыПоиска Цикл
Если (СтрокаПоиска.ЗначениеРеквизита <> ЗначениеРеквизита) or CheckAttrsForDifference(СтрокаПоиска, structForCompare) Тогда
for each item in structForCompare do
structForCompare.Insert(item.Key, СтрокаПоиска[item.Key]);
endDo;
ДобавитьНовуюГруппу(ТаблицаГрупп, ТекущаяГруппа, ЭлементовВГруппе, ЗначениеРеквизита);
ЗначениеРеквизита = СтрокаПоиска.ЗначениеРеквизита;
ТекущаяГруппа = ТекущаяГруппа + 1;
ЭлементовВГруппе = 0;
КонецЕсли;
СтрокаПоиска.НомерГруппы = -ТекущаяГруппа;
ЭлементовВГруппе = ЭлементовВГруппе + 1;
КонецЦикла;
ДобавитьНовуюГруппу(ТаблицаГрупп, ТекущаяГруппа, ЭлементовВГруппе, ЗначениеРеквизита);
ТаблицаГрупп.Сортировать("Количество");
ТекущаяГруппа = 1;
КолвоЭлементовКоллекции = ТаблицаГрупп.Количество();
Для ОбратныйИндекс = 1 По КолвоЭлементовКоллекции Цикл
ЭлементКоллекции = ТаблицаГрупп[КолвоЭлементовКоллекции - ОбратныйИндекс];
МассивСтрок = мРезультатыПоиска.НайтиСтроки(Новый Структура("НомерГруппы", -ЭлементКоллекции.НомерГруппы));
Если ЭлементКоллекции.Количество = 1 Тогда
Для каждого СтрокаГруппы ИЗ МассивСтрок Цикл
мРезультатыПоиска.Удалить(СтрокаГруппы);
КонецЦикла;
ТаблицаГрупп.Удалить(ЭлементКоллекции);
Иначе
Для каждого СтрокаГруппы ИЗ МассивСтрок Цикл
СтрокаГруппы.НомерГруппы = ТекущаяГруппа;
КонецЦикла;
ЭлементКоллекции.НомерГруппы = ТекущаяГруппа;
ТекущаяГруппа = ТекущаяГруппа + 1;
КонецЕсли;
КонецЦикла;
ТаблицаГрупп.Сортировать("Группа");
Если мРезультатыПоиска.Количество() > 0 Тогда
ВывестиГруппу(1);
КонецЕсли;
КонецПроцедуры
------------------------------------------------------------------
2-ой нюанс: не до конца исправлен косяк типовой обработки в части замены в регистрах бухгалтерии.
функция ВыполнитьЗаменуЭлементов
ЭтоДвижениеРегистраБухгалтерии = Метаданные.РегистрыБухгалтерии.Содержит(Движение);
ЕстьКорреспонденция = ЭтоДвижениеРегистраБухгалтерии и Параметры[Движение.Имя + "Корреспонденция"];
НаборЗаписей = Параметры.Объект.Движения[Движение.Имя];
НаборЗаписей.Прочитать();
НадоЗаписывать = Ложь;
ТаблицаНабора = НаборЗаписей.Выгрузить();
Для Каждого Измерение ИЗ Движение.Измерения Цикл
Если Измерение.Тип.СодержитТип(ТипЗнч(Ссылка)) Тогда
Если ЕстьКорреспонденция and (ТаблицаНабора.Columns.Find(Измерение.Имя) = undefined) Тогда
СтрокаТабЧасти = ТаблицаНабора.Найти(Ссылка, Измерение.Имя + "ДТ");
Пока СтрокаТабЧасти <> Неопределено Цикл
СтрокаТабЧасти[Измерение.Имя + "ДТ"] = ПравильныйЭлемент;
НадоЗаписывать = Истина;
СтрокаТабЧасти = ТаблицаНабора.Найти(Ссылка, Измерение.Имя + "ДТ");
КонецЦикла;
СтрокаТабЧасти = ТаблицаНабора.Найти(Ссылка, Измерение.Имя + "КТ");
Пока СтрокаТабЧасти <> Неопределено Цикл
СтрокаТабЧасти[Измерение.Имя + "КТ"] = ПравильныйЭлемент;
НадоЗаписывать = Истина;
СтрокаТабЧасти = ТаблицаНабора.Найти(Ссылка, Измерение.Имя + "КТ");
КонецЦикла;
Иначе
СтрокаТабЧасти = ТаблицаНабора.Найти(Ссылка, Измерение.Имя);
Пока СтрокаТабЧасти <> Неопределено Цикл
СтрокаТабЧасти[Измерение.Имя] = ПравильныйЭлемент;
НадоЗаписывать = Истина;
СтрокаТабЧасти = ТаблицаНабора.Найти(Ссылка, Измерение.Имя);
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Показать
Думаю, мои изменения здесь заметны без комментариев. Вот и ответ, тем кто спрашивает, почему я использую англ. язык.