Как разрешить дублирование номера документа в 1С и избежать ошибки уникальности?

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

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

Различие между техническим номером и номером для печати

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

  1. Служебный номер документа: Строка, которая используется платформой для уникальной идентификации объекта в базе данных, связи документов и корректной работы индексов.
  2. Номер для печати (или номер приказа): Текстовое поле, которое выводится в печатные формы (Т-1, Т-6 и т.д.). Именно сюда зачастую нужно вписать значение вроде «362-к».

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

Изменение свойств метаданных в Конфигураторе

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

  1. Откройте «Конфигуратор» и найдите нужный вид документа.
  2. Перейдите на закладку «Нумерация».
  3. Найдите свойство «Контроль уникальности». Если снять эту галочку, платформа перестанет проверять наличие документов с таким же номером при записи.

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

Программный обход контроля через «ОбменДанными.Загрузка»

Существует технический способ записать документ с любым номером, даже если контроль уникальности включен. Для этого используется свойство объекта ОбменДанными.Загрузка. Рассмотрим пример кода:


НовыйДокумент = Документы.ПриказНаОтпуск.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Номер = "362-к"; // Допустим, такой номер уже есть
НовыйДокумент.ОбменДанными.Загрузка = Истина;
НовыйДокумент.Записать();

Разберем, что происходит в этот момент. Установка флага Загрузка = Истина сообщает системе, что данные поступают из внешнего источника и их нужно «просто положить в базу», минуя большинство проверок. Важно понимать последствия:

Как справедливо отмечено в обсуждении, если попытаться провести такой документ обычным способом (нажав кнопку в интерфейсе), система может снова выдать ошибку уникальности или заблокировать проведение, так как флаг Загрузка работает только в момент выполнения конкретной транзакции записи.

Использование префиксов как административное решение

Если вы хотите избежать внесения правок в код и сохранить типовую конфигурацию на поддержке, мы рекомендуем использовать механизм префиксов. В 1С номер часто формируется по шаблону [Префикс][Номер]. Если в базе ведется учет по нескольким организациям, добавление префикса организации (например, «ОФ-» и «ТД-») позволяет иметь документы с одинаковой цифровой частью, но разными строковыми представлениями.

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

Корректировка перед записью (программный метод)

Чтобы автоматизировать процесс и не заставлять пользователя вручную менять номера, можно использовать обработчик события ПередЗаписью в модуле объекта. Проанализируем пример логики, которая проверяет уникальность и модифицирует номер:


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

Основные риски и «Большая ЖОПУ»

Вернемся к предупреждению из сообщений форума. Почему опытные разработчики предостерегают от бездумного отключения контроля уникальности? Выясним причины:

Итоговые рекомендации

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

  1. Проверьте наличие поля «Номер приказа» (или аналогичного): Это самый правильный путь. Оставьте системный номер 1С для программы, а свой номер пишите в доп. реквизит.
  2. Используйте префиксы: Попробуйте добавить буквенный индекс организации или подразделения. Это решит проблему уникальности законным путем.
  3. Оцените периодичность: Убедитесь, что ошибка не вызвана попыткой использовать номер из прошлого года, если установлена периодичность «Год».
  4. Крайний случай — отключение контроля: Если иные методы не подходят, снимите галочку контроля уникальности в Конфигураторе, но обязательно проверьте правила обмена с другими базами.

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

← На главную