Как удалить дубли в справочнике ПредопределенныеВариантыОтчетов при переходе в 1С:Фреш?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При переходе с локальных версий конфигураций (1С:Бухгалтерия, 1С:ЗУП и др.) в облачный сервис 1С:Фреш часто возникает специфическая ошибка на этапе выгрузки данных. Система сообщает о наличии дублей в справочнике Справочник.ПредопределенныеВариантыОтчетов. Сообщение об ошибке обычно выглядит так:

"У некоторых объектов Справочник.ПредопределенныеВариантыОтчетов: Основной дублируются поля: Отчет (Отчет) Ключ варианта (КлючВарианта). Рекомендуется выполнить удаление дублирующихся элементов."

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

Причины возникновения проблемы

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

  1. Некорректное обновление конфигурации. Если база обновлялась динамически или с пропусками релизов, старые идентификаторы предопределенных элементов могли не удалиться, а новые — добавиться.
  2. Конфликт расширений. Подключенные расширения могут переопределять варианты отчетов, создавая записи, конфликтующие с основными.
  3. Ошибки платформы при реструктуризации. Иногда механизм уникальности идентификаторов дает сбой, оставляя "битые" ссылки.

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

Способ 1. Использование режима "Обычное приложение" (для 1С:Бухгалтерия)

Это решение оказалось наиболее эффективным для пользователей 1С:Бухгалтерии 3.0. Суть метода заключается в использовании особенностей старого интерфейса (Обычное приложение), где контроль прав и доступность команд в стандартных обработках могут отличаться от управляемого интерфейса.

Разберем алгоритм действий пошагово:

  1. Создание технического пользователя.

    Зайдем в Конфигуратор. Перейдем в меню Администрирование — Пользователи. Создадим нового пользователя (например, "Админ_Обычный") и наделим его Полными правами.

  2. Настройка режима запуска.

    В свойствах этого пользователя на закладке "Прочие" найдем параметр Режим запуска. Установим значение Обычное приложение. Сохраним изменения.

  3. Запуск базы.

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

  4. Запуск обработки поиска дублей.

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

  5. Настройка поиска.

    В поле "Искать в..." выберем справочник Предопределенные варианты отчетов (для просмотра структуры удобно использовать универсальный редактор справочников). Запустим поиск.

  6. Удаление.

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

После успешного удаления закроем режим обычного приложения и вернемся в стандартный режим для проверки выгрузки.

Способ 2. Программное удаление (Универсальный метод)

Если первый способ не сработал (например, в конфигурации ЗУП 3.1 или если обработка не запускается), нам потребуется применить "грубую силу" — программное удаление с отключением системных проверок. Это безопасно, если мы точно знаем, что удаляем дубль.

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

Рассмотрим логику скрипта. Нам нужно найти проблемные элементы и удалить их, установив флаг ОбменДанными.Загрузка = Истина. Этот флаг говорит системе: "Я загружаю данные из другой базы, не проводи проверки, просто запиши или удали".

Сначала найдем дубли запросом. Выполним следующий код в консоли запросов или консоли кода, чтобы увидеть, что именно мы собираемся удалять:


// Текст запроса для поиска дублей по ключу и отчету
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Варианты.Отчет КАК Отчет,
    |	Варианты.КлючВарианта КАК КлючВарианта,
    |	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Варианты.Ссылка) КАК КоличествоДублей
    |ИЗ
    |	Справочник.ПредопределенныеВариантыОтчетов КАК Варианты
    |
    |СГРУППИРОВАТЬ ПО
    |	Варианты.Отчет,
    |	Варианты.КлючВарианта
    |
    |ИМЕЮЩИЕ
    |	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Варианты.Ссылка) > 1";

Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
    Сообщить("Найден дубль: " + Результат.Отчет + " / " + Результат.КлючВарианта);
КонецЦикла;

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

Разберем код удаления:


// ВАЖНО: Перед выполнением сделайте резервную копию базы!

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Варианты.Ссылка КАК Ссылка
    |ИЗ
    |	Справочник.ПредопределенныеВариантыОтчетов КАК Варианты
    |ГДЕ
    |	(Варианты.ПометкаУдаления = ИСТИНА
    |	ИЛИ Варианты.Предопределенный = ЛОЖЬ)
    // Дополнительное условие, чтобы не удалить лишнее, 
    // лучше удалять по конкретным идентификаторам, если их мало
    ";

Выборка = Запрос.Выполнить().Выбрать();

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

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


ОбъектВарианта.ОбменДанными.Загрузка = Истина;
ОбъектВарианта.УстановитьПометкуУдаления(Истина);
// А затем запустить штатное "Удаление помеченных объектов"

Способ 3. Особенности для ЗУП и Расширений

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

  1. Перейдем в раздел Администрирование — Печатные формы, отчеты и обработки — Расширения.
  2. Проверим, есть ли расширения, влияющие на отчеты. Попробуем временно отключить их (снять галочку "Активно").
  3. Повторим процедуру поиска и удаления дублей (штатными средствами или кодом из Способа 2).
  4. После удаления дублей включим расширения обратно. Важно проверить, что при активации расширения не создаются новые дубли. Если создаются — проблема в коде самого расширения, и его нужно доработать.

Способ 4. Тестирование и исправление

Иногда дубли являются следствием нарушения логической целостности базы данных на уровне таблиц. В этом случае "мягкие" методы не работают.

Запустим Конфигуратор и выполним процедуру "Тестирование и исправление" (меню Администрирование):

Внимание! Эту процедуру необходимо выполнять монопольно и только после создания резервной копии.

Финальная проверка

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

  1. Запустите обработку "Поиск дублей" в обычном режиме предприятия (Администрирование — Обслуживание — Корректировка данных).
  2. Убедитесь, что поиск по справочнику ПредопределенныеВариантыОтчетов не выдает результатов с одинаковыми ключевыми полями.
  3. Повторите попытку выгрузки данных для перехода в сервис (например, через обработку "Выгрузка данных для перехода в сервис").

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

← На главную