Некоторые картинки не загружаются из РФ и РК, используйте VPN.

суббота, 6 июля 2019 г.

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

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


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




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

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

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

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

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

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

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

6 комментариев:

  1. Для Бухгалтерии обработка?

    ОтветитьУдалить
  2. Ошибка при вызове метода контекста (Выполнить)
    {ВнешняяОбработка.ПоискНеуникальныхКодовСправочника.Форма.Форма.Форма(30)}: РезультатЗапроса = Запрос.Выполнить();
    {ВнешняяОбработка.ПоискНеуникальныхКодовСправочника.Форма.Форма.Форма(3)}: ВыполнитьПоискДублей(ЭлементыФормы.СписокТиповОбъекта.Значение);
    по причине:
    {(9, 22)}: Поле не найдено "ОбъектОбработки.Код"
    ПО ОбъектОбработки.<>Код = ОбъектОбработки1.Код

    ОтветитьУдалить
    Ответы
    1. Чет в Вашем коде какая-то дичь:
      ПО ОбъектОбработки.<>Код = ОбъектОбработки1.Код

      Куска не хватает:
      ПО ОбъектОбработки.Код = ОбъектОбработки1.Код
      И ОбъектОбработки.Ссылка <> ОбъектОбработки1.Ссылка";

      Удалить
    2. это не код, это сообщения при выполнении вашей обработки, скачанной по ссылке...

      Удалить
    3. Проверил содержимое обработки, все корректно. Разве что нет проверки на наличие реквизита. Но проверить саму обработку не могу, так как нет под рукой базы на обычных формах.

      Удалить