6 июля 2019 г.

1CОшибка "код справочника стал неуникальным"

Последнее время чаще стала вылезать ошибка "код справочника стал неуникальным" при обновлении, в принципе особых проблем она не доставляет, но раздражает.
В ручную перебирать справочник очень муторно, поэтому я накидал простенький запрос, который выявляет совпадение кода при разных ссылках (на примере справочника ДоговорыКонтрагентов):


ВЫБРАТЬ
 ДоговорыКонтрагентов.Ссылка,
 ДоговорыКонтрагентов1.Ссылка КАК Ссылка1,
 ДоговорыКонтрагентов.Код,
 ДоговорыКонтрагентов1.Код КАК Код1
ИЗ
 Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов1
  ПО ДоговорыКонтрагентов.Код = ДоговорыКонтрагентов1.Код
   И ДоговорыКонтрагентов.Ссылка <> ДоговорыКонтрагентов1.Ссылка




Кому интересно код всей обработки:

Процедура КнопкаВыполнитьНажатие(Кнопка)
 ВыполнитьПоискДублей(ЭлементыФормы.СписокТиповОбъекта.Значение);
КонецПроцедуры

Процедура ПриОткрытии()
 МассивТиповОбъектов=Метаданные.Справочники;
 ЭлементыФормы.СписокТиповОбъекта.СписокВыбора.Очистить();
 Для каждого СтрокаМассива из МассивТиповОбъектов Цикл 
  ЭлементыФормы.СписокТиповОбъекта.СписокВыбора.Добавить(СтрокаМассива.Имя, СтрокаМассива.Синоним);
 КонецЦикла;
 ЭлементыФормы.СписокТиповОбъекта.Значение = 0;
КонецПроцедуры

Функция  ВыполнитьПоискДублей(НаимновениеОбъекта)
 НаимновениеОбъектаРасш="Справочник."+НаимновениеОбъекта;
 Запрос = Новый Запрос;
 Запрос.Текст = 
  "ВЫБРАТЬ
  | ОбъектОбработки.Ссылка КАК СсылкаЛев,
  | ОбъектОбработки1.Ссылка КАК СсылкаПрав,
  | ОбъектОбработки.Код Как КодЛев,
  | ОбъектОбработки1.Код КАК КодПрав
  |ИЗ
  | "+НаимновениеОбъектаРасш+" КАК ОбъектОбработки
  |  ВНУТРЕННЕЕ СОЕДИНЕНИЕ "+НаимновениеОбъектаРасш+" КАК ОбъектОбработки1
  |  ПО ОбъектОбработки.Код = ОбъектОбработки1.Код
  |   И ОбъектОбработки.Ссылка <> ОбъектОбработки1.Ссылка";
 
 РезультатЗапроса = Запрос.Выполнить();
 
 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
 
 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
  // Вставить обработку выборки ВыборкаДетальныеЗаписи
  Сообщить(Строка(""+ВыборкаДетальныеЗаписи.СсылкаЛев+" "+ВыборкаДетальныеЗаписи.СсылкаПрав+" "+ВыборкаДетальныеЗаписи.КодЛев+" "+ВыборкаДетальныеЗаписи.КодПрав+""));
  ЭлементыДубляКода.Добавить(ВыборкаДетальныеЗаписи.СсылкаПрав,ВыборкаДетальныеЗаписи.СсылкаПрав);
 КонецЦикла;
КонецФункции

Процедура ОсновныеДействияФормыОбновитьКоды(Кнопка)
 Для Каждого СтрокаСпискаЭлементов Из ЭлементыДубляКода Цикл 
  ОбъектСписка=СтрокаСпискаЭлементов.Значение.ПолучитьОбъект();
  СтарыйКод=ОбъектСписка.Код;
  ОбъектСписка.УстановитьНовыйКод();
  Сообщить("Меняем код "+СтарыйКод+" на "+ОбъектСписка.Код);
  Попытка
   ОбъектСписка.Записать();
  Исключение
   Сообщить(ОписаниеОшибки());
  КонецПопытки;
 КонецЦикла;
КонецПроцедуры

На форме кнопки Выполнить и "ОбновитьКоды", и список выбора "СписокТиповОбъекта"
Префикс она не ставит.

Скачать готовую обработку
Работать на копии.

1 комментарий: