Как устранить задвоение предопределенных значений справочника «Виды контактной информации» в 1С:Управление торговлей 11.5?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

Задвоение предопределенных значений справочника Виды контактной информации в конфигурации 1С:Управление торговлей (УТ) 11.5 – это распространенная и достаточно сложная проблема, с которой могут столкнуться пользователи после обновлений или некорректных обменов данными. Эта ситуация приводит к нарушению корректного отображения и печати контактной информации контрагентов, организаций и других объектов, использующих данный справочник.

Давайте подробно рассмотрим причины возникновения этой проблемы и эффективные методы ее устранения, включая пошаговую методику, успешно примененную одним из пользователей, а также другие общепринятые подходы.

Причины возникновения задвоений предопределенных элементов

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

  1. Ошибки при обмене данными. Задвоение может произойти, если при обмене данными в режиме загрузки не проверяется уникальность предопределенного элемента в пределах информационной базы. Например, при переносе данных из аналогичной конфигурации без установки флага поиска существующих элементов в правилах переноса, система может создать новый элемент вместо того, чтобы найти и обновить уже существующий предопределенный.
  2. Глюки в процессе обновления. Иногда обновления конфигурации могут приводить к появлению двух действительно предопределенных элементов. Это часто связано с изменением уникальных идентификаторов (GUID) предопределенных элементов в новом релизе, что приводит к созданию новых элементов в базе данных вместо корректного обновления существующих.
  3. Некорректная работа служебных обработок. Пользовательские или даже служебные обработки, которые неверно ищут предопределенные элементы (например, по наименованию, а не по ИмяПредопределенныхДанных или GUID), могут создавать дубли, если не находят существующий элемент по заданным правилам.
  4. Проблемы с распределенными информационными базами (РИБ). Дублирование может возникнуть, если предопределенные элементы создаются в режиме ОбменДанными.Загрузка = Истина. В подчиненных узлах РИБ предопределенные элементы не создаются и не обновляются автоматически, а должны быть получены из центрального узла. Неправильная синхронизация или создание может привести к дублям.
  5. Некорректная настройка свойства "Обновление предопределенных данных". У объектов конфигурации есть специальное свойство, которое определяет поведение платформы при создании и обновлении предопределенных элементов. Если оно установлено в "Не обновлять автоматически" или произошла некорректная последовательность обновления, это может привести к проблемам с предопределенными данными.

КРИТИЧЕСКИ ВАЖНО: перед началом любых манипуляций с предопределенными элементами ОБЯЗАТЕЛЬНО сделайте полную резервную копию вашей информационной базы. Это позволит вернуться к исходному состоянию в случае непредвиденных проблем.

Общий подход к решению проблемы

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

  1. Его определение в конфигураторе (как часть метаданных).
  2. Сам элемент данных в информационной базе, который связан с определением через стандартный реквизит ИмяПредопределенныхДанных.

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

Методика устранения дублей и восстановления данных (по опыту автора темы)

Представленная ниже методика была успешно применена пользователем, столкнувшимся с данной проблемой. Она учитывает специфику, когда данные уже висят на задвоенных предопределенных элементах.

  1. Сброс предопределенности у всех элементов справочника

    На первом этапе нам необходимо "сбросить шарик", то есть снять признак предопределенности у всех элементов справочника Виды контактной информации. Это позволит нам временно управлять статусом предопределенности и избежать проблем при дальнейших операциях удаления или объединения. Это действие рекомендуется выполнять с помощью собственной обработки, чтобы иметь полный контроль над процессом и применить его ко всем элементам без удаления.

    Мы программно очищаем реквизит ИмяПредопределенныхДанных для каждого элемента справочника:

    
    &НаСервере
    Процедура СнятьПредопределенностьУВсехЭлементов()
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.ВидыКонтактнойИнформации";
        Результат = Запрос.Выполнить().Выбрать();
        Пока Результат.Следующий() Цикл
            Объект = Результат.Ссылка.ПолучитьОбъект();
            Если НЕ Объект.ИмяПредопределенныхДанных = "" Тогда
                Объект.ИмяПредопределенныхДанных = "";
                Объект.Записать();
            КонецЕсли;
        КонецЦикла;
    КонецПроцедуры
    

    После выполнения этой операции ни один элемент справочника не будет отображаться как предопределенный.

  2. Установка типа записи элемента для дублей

    В некоторых случаях, дублирующие элементы могли быть созданы без полной инициализации всех необходимых реквизитов, например, поля ТипКонтактнойИнформации. Если вы обнаружите, что у задвоенных элементов отсутствуют эти важные данные, вам потребуется с помощью той же обработки или отдельного скрипта установить правильный тип записи для каждого из таких дублей. Это необходимо для корректной работы системы и предотвращения ошибок при дальнейших действиях.

  3. Установка предопределенности для элементов, на которых висят данные

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

    Пример (концептуальный) как это может выглядеть, если мы знаем конкретный GUID или Ссылка дубля и его правильное предопределенное имя:

    
    &НаСервере
    Процедура УстановитьПредопределенностьДляДубляСДанными(СсылкаНаДубль, ИмяПредопределенногоЭлемента)
        Объект = СсылкаНаДубль.ПолучитьОбъект();
        // Проверяем, что на элемент действительно висят данные, прежде чем устанавливать предопределенность
        // Этот шаг требует дополнительного запроса или анализа, чтобы убедиться в наличии ссылок
        // Например: ЗапросСсылок = Новый Запрос; ЗапросСсылок.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 СсылкаНаОбъект ИЗ ССЫЛКИ_НА_ОБЪЕКТ ГДЕ Ссылка = &Элемент";
        // Если ЗапросСсылок.Выполнить().Пустой() Тогда
        //     Возврат; // На элементе нет ссылок
        // КонецЕсли;
    
        Если Объект.ИмяПредопределенныхДанных = "" И НЕ ИмяПредопределенногоЭлемента = "" Тогда
            Объект.ИмяПредопределенныхДанных = ИмяПредопределенногоЭлемента;
            Объект.Записать();
        КонецЕсли;
    КонецПроцедуры
    
  4. Тестирование и исправление (ТИИ)

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

    Важно: убедитесь, что ТИИ не удалит те элементы, которые вы только что программно пометили как предопределенные для сохранения данных. Если ТИИ предлагает удалить элементы, на которых висят ссылки, будьте осторожны. Возможно, потребуется несколько итераций или более точечное исправление.

  5. Установка предопределенности для правильных элементов

    После того как ТИИ отработало и, предположительно, удалило "лишние" предопределенные дубли, настало время установить предопределенность на те элементы, которые мы считаем "правильными" и на которые в итоге должны быть перенесены все значения адресов, телефонов и т.д. Эти элементы либо уже являются корректными предопределенными элементами (которые ТИИ не тронуло), либо это элементы, которые вы выбрали как целевые для консолидации данных. Используем аналогичный программный подход, как в шаге 3, но уже для "чистых" предопределенных элементов.

    
    &НаСервере
    Процедура УстановитьКорректнуюПредопределенность(СсылкаНаПравильныйЭлемент, ИмяПредопределенногоЭлемента)
        Объект = СсылкаНаПравильныйЭлемент.ПолучитьОбъект();
        Если Объект.ИмяПредопределенныхДанных = "" Тогда // Устанавливаем только если еще не помечен
            Объект.ИмяПредопределенныхДанных = ИмяПредопределенногоЭлемента;
            Объект.Записать();
        КонецЕсли;
    КонецПроцедуры
    
  6. Выгрузка адресных данных контрагентов и организаций в Excel

    На этом этапе, когда мы уверены, какие элементы справочника Виды контактной информации являются "правильными", а какие – "неправильными" дублями, необходимо подготовиться к переносу данных. Используйте стандартные средства выгрузки или специализированную обработку для выгрузки всей адресной информации контрагентов, организаций и других объектов в Excel. Это создаст временный буфер данных, который позволит нам восстановить связи после удаления дублей.

  7. Загрузка данных из Excel на правильные значения элементов справочника

    Заключительный шаг – загрузка данных из Excel обратно в информационную базу. При загрузке убедитесь, что вы указываете ссылки на "правильные" элементы справочника Виды контактной информации. Этот процесс может потребовать либо ручного сопоставления в процессе загрузки, либо написания специализированной обработки, которая будет переносить данные, используя "новые" или "правильные" ссылки на элементы справочника. Таким образом, мы перенесем все контактные данные на корректные предопределенные элементы, решая проблему "пустых" табличных частей контактной информации, о которой упоминал автор темы.

Дополнительные методы и рекомендации

Помимо пошаговой методики, существуют и другие подходы, которые могут быть полезны или использованы в комбинации с описанным выше:

  1. Использование типовой обработки "Поиск и удаление дублей"

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

    • Вам потребуется вручную отметить "оригинал", если программа автоматически выбирает новый элемент.
    • После объединения дублей следует воспользоваться обработкой "Удаление помеченных объектов" для окончательного удаления помеченных дублей.
    • Особенность: если дублирующий элемент *сам* является предопределенным (то есть имеет заполненное ИмяПредопределенныхДанных), эта обработка может работать некорректно или потребовать предварительного снятия предопределенности.
  2. Программное исправление свойства ИмяПредопределенныхДанных

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

    
    &НаСервере
    Процедура ВосстановитьПредопределенность(СсылкаНаЭлемент, КорректноеИмяПредопределенного)
        Объект = СсылкаНаЭлемент.ПолучитьОбъект();
        Если Объект.ИмяПредопределенныхДанных <> КорректноеИмяПредопределенного Тогда
            Объект.ИмяПредопределенныхДанных = КорректноеИмяПредопределенного;
            Попытка
                Объект.Записать();
            Исключение
                Сообщить("Не удалось восстановить предопределенность для элемента " + СсылкаНаЭлемент + ": " + ОписаниеОшибки());
            КонецПопытки;
        КонецЕсли;
    КонецПроцедуры
    
  3. Использование функций Библиотеки Стандартных Подсистем (БСП)

    БСП содержит полезные функции для работы с предопределенными элементами, которые могут автоматизировать часть процесса:

    • ВосстановитьПредопределенныеЭлементы: Эта функция создает недостающие предопределенные элементы с новыми уникальными идентификаторами, что полезно после отключения подчиненного узла РИБ или для автоматического восстановления отсутствующих элементов.
    • 
      // Пример: Восстановление отсутствующих предопределенных видов контактной информации
      МодульСтандартныеПодсистемы = ОбщийМодуль; // Укажите реальное имя общего модуля БСП
      МодульСтандартныеПодсистемы.ВосстановитьПредопределенныеЭлементы(Метаданные.Справочники.ВидыКонтактнойИнформации);
      
    • ОбновитьПредопределенныеЭлементы: Эта функция обновляет предопределенные элементы согласно правилам, заданным в модуле менеджера объекта. Может помочь в ситуации, когда предопределенные элементы существуют, но их свойства устарели.
    • 
      // Пример: Обновление предопределенных видов контактной информации
      МодульСтандартныеПодсистемы.ОбновитьПредопределенныеЭлементы(Метаданные.Справочники.ВидыКонтактнойИнформации);
      
    • Модуль УправлениеКонтактнойИнформацией: Содержит функции для работы с предопределенными видами контактной информации, такие как ПредопределенныеВидыКонтактнойИнформации, позволяющая получить список видов по имени, и другие функции для снятия признака предопределенности или обновления видов.
  4. Анализ журнала регистрации

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

  5. Восстановление из резервной копии

    Если другие методы не дают результата, а проблема критична и возникла недавно, восстановление базы данных из актуальной рабочей резервной копии является крайней, но порой единственной эффективной мерой. Это подчеркивает важность регулярного резервного копирования.

Важные нюансы работы с предопределенными элементами

Для успешного решения проблем с предопределенными элементами и их предотвращения, необходимо учитывать следующие особенности:

Решение проблемы задвоения предопределенных элементов требует комплексного подхода, глубокого понимания механики работы платформы 1С и готовности к программным манипуляциям. Следуя изложенным рекомендациям и применяя описанные методики, вы сможете восстановить корректную работу вашей информационной базы.

← На главную