Как выполнить повторный перенос данных в 1С:ЗУП 3.1 и исправить ошибку «Предопределенный элемент не уникален»?

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

Переход со старых версий программ (например, «Зарплата и Кадры 7.7» или «Зарплата и управление персоналом 2.5») на актуальную редакцию 1С:Зарплата и Управление Персоналом 3.1 (ЗУП 3.1) часто преподносит неприятные сюрпризы. Типичный сценарий: первоначальный перенос уже выполнен, в новой базе заведены и проведены документы за первые месяцы года (начисления, больничные, отпуска), но вдруг обнаруживается системная ошибка в перенесенных данных — например, задвоение сумм, дней или часов у сотрудников-совместителей.

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

В этой статье мы подробно разберем, как правильно организовать повторный перенос данных без потери текущих документов и как быстро исправить технический конфликт уникальности предопределенных элементов в платформе «1С:Предприятие 8.3».

Часть 1. Стратегия повторного переноса данных без потери ручного ввода

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

Рассмотрим оптимальный пошаговый алгоритм решения этой задачи:

  1. Создание тестовой копии: Все операции обязательно проводим на копии рабочей базы №1.
  2. Подготовка чистой базы (база №2): Выполняем корректный повторный перенос данных из старой программы в абсолютно чистую базу. Проверяем, что в ней данные по совместителям перенеслись корректно, без задвоений.
  3. Точечное обновление регистров: Вместо переноса документов целиком, мы можем обновить только проблемные движения. Для этого воспользуемся обработкой «Загрузка данных из табличного документа» или напишем простую обработку на встроенном языке 1С, которая перенесет движения по конкретным регистрам (например, по регистру накопления ДанныеОНачисленияхДляРасчетаСреднегоЗаработкаОбщий) из корректной базы №2 в рабочую базу №1.
  4. Использование XML-обмена для документов переноса: Если ручных изменений в самих документах ПереносДанных в базе №1 не было, их можно обновить из базы №2 с помощью обработки ВыгрузкаЗагрузкаДанныхXML. При этом важно настроить выгрузку так, чтобы переносились только конкретные документы ПереносДанных по UUID (уникальным идентификаторам), избегая перезаписи справочников и настроек программы.

Часть 2. Почему возникает ошибка «Предопределенный элемент не уникален»?

Если для исправления данных вы воспользовались обработкой ВыгрузкаЗагрузкаДанныхXML, при первой же попытке изменить настройки расчета зарплаты (например, установить флажок «Применение почасовой оплаты») система заблокирует действие и выдаст ошибку уникальности предопределенного элемента.

Выясним причину этого поведения платформы. Начиная с версии «1С:Предприятие 8.3», механизм работы с предопределенными данными был кардинально изменен:

Обратите внимание: в конфигураторе список предопределенных элементов для планов видов расчета в ЗУП 3.1 часто выглядит пустым. Это связано с тем, что программа создает и связывает эти элементы программно при первом запуске или обновлении информационной базы.

Часть 3. Пошаговая методика поиска дублирующих предопределенных элементов

Проанализируем структуру базы данных, чтобы понять, где именно произошло задвоение. Как правило, в ЗУП 3.1 при переносах данных дублируются элементы в следующих объектах:

Для быстрого поиска дублей воспользуемся «Консолью запросов». Нам необходимо выявить записи, у которых заполнено поле ИмяПредопределенныхДанных, но количество ссылок на них превышает единицу. Разберем пример запроса для справочника показателей расчета зарплаты:


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

Аналогичные запросы выполним для таблиц ПланВидовРасчета.Начисления и Справочник.ВидыИспользованияРабочегоВремени. Если запрос вернул строки, мы нашли корень проблемы. Теперь перейдем к исправлению.

Часть 4. Программное исправление дублей предопределенных элементов

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

Разберем, как написать простую обработку для этой операции. Создадим внешнюю обработку и в модуле объекта выполним следующий код:


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

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

Часть 5. Слияние элементов и окончательная очистка базы данных

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

Выполним следующие шаги:

  1. Откроем рабочую базу в режиме «1С:Предприятие».
  2. Перейдем в раздел Администрирование — Обслуживание — Поиск и удаление дублей.
  3. В поле «Искать в» выберем наш проблемный справочник или план видов расчета (например, Показатели расчета зарплаты).
  4. Настроим правила поиска (достаточно искать по совпадению наименования).
  5. В списке найденных дублей система покажет два элемента. Проанализируем их: один из них остался предопределенным (возле его иконки будет отображаться специальный значок-шарик), а второй — теперь обычный элемент.
  6. Назначим «Оригиналом» тот элемент, который остался предопределенным. Второму элементу сопоставим статус «Дубль».
  7. Нажмем кнопку «Заменить все ссылки и удалить дубли».

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

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

Как предотвратить подобные проблемы при будущих обменах?

Чтобы избежать подобных ситуаций при переносе данных, рекомендуем придерживаться простых правил:

← На главную