Как установить произвольный код справочника в 1С:ЗУП, игнорируя автоматические префиксы

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

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

Разбираем механику метода УстановитьНовыйКод()

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

Рассмотрим, что происходит "под капотом":

  1. Метод принимает строку-префикс.
  2. Платформа ищет в справочнике максимальный существующий код, который начинается с этого префикса.
  3. К найденному числовому окончанию прибавляется единица.
  4. Полученное значение устанавливается в качестве кода нового объекта.

Если в настройках вашей базы 1С:ЗУП указан префикс информационной базы (например, "ПР-"), то при вызове УстановитьНовыйКод("123") система попытается сформировать код вида "ПР-12300001". Именно это поведение часто принимают за "некорректную" работу метода, хотя он работает строго по заложенному алгоритму.

Почему ЗУП принудительно добавляет префиксы

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

Этот обработчик срабатывает всякий раз, когда вызывается УстановитьНовыйКод() или когда объект записывается впервые с пустым кодом. Программа выполняет следующие действия:

Даже если вы попытаетесь передать свой префикс в метод, обработчик в общем модуле ПрефиксацияОбъектовСобытия может перехватить управление и модифицировать итоговую строку, добавив туда системные символы. Это сделано для того, чтобы при обмене данными между разными базами (например, ЗУП и Бухгалтерия) коды объектов не пересекались.

Решение 1: Прямое присвоение в режиме загрузки

Если ваша задача — установить конкретный, "произвольный" код из внешнего источника (например, ID из старой системы), нам следует отказаться от использования метода УстановитьНовыйКод(). Вместо этого мы воспользуемся механизмом прямого присвоения свойства Код с одновременным отключением проверок.

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


// Создаем новый объект справочника
НовыйОбъект = Справочники.ФизическиеЛица.СоздатьЭлемент();

// Заполняем основные реквизиты
НовыйОбъект.Наименование = "Иванов Иван Иванович";

// Устанавливаем режим загрузки данных. 
// Это КРИТИЧЕСКИ ВАЖНО, чтобы подписки на события не изменили наш код при записи.
НовыйОбъект.ОбменДанными.Загрузка = Истина;

// Напрямую присваиваем нужный код
НовыйОбъект.Код = "ID_99999"; 

// Записываем объект
НовыйОбъект.Записать();

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

Решение 2: Двукратная запись (вариант для сложных случаев)

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

Проанализируем этот подход:

  1. Создаем и записываем объект со стандартным кодом (позволяем сработать всем подпискам).
  2. Снова открываем этот же объект, устанавливаем ОбменДанными.Загрузка = Истина.
  3. Меняем код на нужный и записываем еще раз.

Пример реализации:


Объект = Справочники.ФизическиеЛица.СоздатьЭлемент();
Объект.Наименование = "Петров Петр Петрович";
Объект.Записать(); // Здесь код будет "ПР-00001"

// Теперь меняем на произвольный
Объект.ОбменДанными.Загрузка = Истина;
Объект.Код = "СПЕЦ-777";
Объект.Записать();

Этот метод гарантирует, что все сопутствующие механизмы 1С:ЗУП отработают корректно, а итоговый код будет соответствовать вашим требованиям.

Важные предостережения и последствия

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

1. Нарушение автонумерации. Платформа 1С умеет автоматически увеличивать код только в том случае, если он заканчивается числом и имеет фиксированную структуру. Если вы начнете записывать коды вида "ABC/123" или просто произвольные строки разной длины, штатный механизм УстановитьНовыйКод() при создании элементов вручную может "сломаться". Пользователи начнут получать ошибки "Код не уникален", так как платформа не сможет вычислить следующее свободное число.

2. Длина кода. Всегда проверяйте длину поля Код в конфигураторе. Для справочника ФизическиеЛица она обычно составляет 10 символов. Если ваш "произвольный код" длиннее, он будет обрезан, что может привести к дублям.

3. Тип данных. Помните, что код — это строка. Если вы загружаете числа из Excel, обязательно преобразуйте их в строку без разделителей групп разрядов (не "12 345", а "12345"), иначе поиск и сортировка будут работать некорректно.

Резюме

Для решения проблемы с "некорректными" префиксами при загрузке в ЗУП:

  1. Не используйте УстановитьНовыйКод(), если вам нужно конкретное значение.
  2. Присваивайте значение напрямую в свойство Код.
  3. Всегда используйте ОбменДанными.Загрузка = Истина, чтобы подавить работу встроенных в конфигурацию подписок на события БСП.
  4. Следите за уникальностью и форматом кодов, чтобы не создать проблем пользователям при последующей ручной работе в базе.

Следуя этим правилам, вы сможете эффективно интегрировать внешние данные в 1С:ЗУП, сохраняя при этом целостность типовой конфигурации и чистоту её кода.

← На главную