Как программно изменить номер документа в 1С:Комплексная автоматизация и добавить индекс через слеш?

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

При разработке в расширениях для конфигураций типа «1С:Комплексная автоматизация» (КА) или «1С:ERP» программисты часто сталкиваются с задачей создания цепочки связанных документов. Одной из типичных задач является визуальное выделение таких документов путем добавления индекса к их номеру (например, через косую черту — «/1», «/2»). Однако стандартные механизмы нумерации 1С могут блокировать такие изменения или некорректно обрабатывать новые номера.

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

Разберем причину проблемы: ограничение разрядности номера

Первая и самая частая причина, по которой номер «не меняется» или «не записывается» в нужном формате, — это жесткое ограничение длины реквизита Номер в метаданных документа. Проанализируем ситуацию: в большинстве современных конфигураций длина номера составляет 11 символов. Если стандартный номер выглядит как УТ00-0000056, то в нем уже заняты все 11 позиций.

Когда мы пытаемся выполнить код:


НовДок.Номер = Строка(НовДок.Номер) + "/1";

Система получает строку длиной 13 символов. Поскольку реквизит Номер имеет фиксированную длину (например, 11), платформа 1С просто обрезает лишние символы справа при попытке записи. В итоге в базе остается всё тот же исходный номер, и создается впечатление, что код не сработал.

Решение 1: Программная корректировка длины (сокращение основной части)

Как выяснилось в ходе обсуждения, самым быстрым способом решения является «освобождение места» под индекс. Если нам нужно добавить /1, нам необходимо удалить два символа из основной части номера. Рассмотрим пример кода, который позволяет корректно сформировать номер с индексом:


Индекс = 1;
Для Каждого стр из Назначения Цикл
    НовДок = Документы.ЗаказПоставщику.СоздатьДокумент();
    ЗаполнитьЗначенияСвойств(НовДок, Объект.Ссылка);
    
    // Получаем текущий номер и обрезаем его, чтобы влез индекс
    // Например, если номер "000000001", берем первые 7-8 символов
    БазовыйНомер = Лев(Объект.Номер, СтрДлина(Объект.Номер) - 2); 
    НовДок.Номер = БазовыйНомер + "/" + Строка(Индекс);
    
    НовДок.Записать(РежимЗаписиДокумента.Проведение);
    Индекс = Индекс + 1;
КонецЦикла;

Важный момент: При таком подходе нужно быть осторожным с префиксами организации и информационной базы. Если вы просто удаляете символы слева, вы можете лишить документ уникальности в рамках распределенной информационной базы (РИБ).

Решение 2: Использование метода УстановитьНовыйНомер()

Для того чтобы система сама управляла нумерацией, но при этом учитывала ваш формат, можно воспользоваться методом УстановитьНовыйНомер(). Этот метод принимает параметр Префикс. Рассмотрим, как это применить для создания документов со слешем:


НовДок = Документы.ЗаказПоставщику.СоздатьДокумент();
ЗаполнитьЗначенияСвойств(НовДок, СсылкаНаОснование);
// Устанавливаем в качестве префикса основной номер со слешем
НовДок.УстановитьНовыйНомер(Строка(СсылкаНаОснование.Номер) + "/");
НовДок.Записать();

В этом случае система попытается найти в базе документы, номер которых начинается на УТ00-00001/, и автоматически присвоит следующий числовой индекс (1, 2, 3 и т.д.). Это более «чистый» способ с точки зрения платформы, так как он задействует стандартный механизм контроля уникальности.

Проблема «длинного префикса» и сбой автонумерации

Проанализируем ситуацию, которая может возникнуть после внедрения такой нумерации. Для 1С всё, что идет до последней цифры в номере, может быть воспринято как префикс. Если вы создаете номер УТ00-001/1, система может решить, что УТ00-001/ — это новый префикс.

Это может привести к двум последствиям:

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

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

Решение 3: Изменение представления документа (без смены номера)

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

В модуле менеджера документа можно прописать логику:


Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    // Добавляем к стандартному номеру индекс из доп. реквизита или связанного документа
    Представление = "Заказ поставщику № " + Данные.Номер + " [" + Данные.ИндексСвязи + "]";
КонецПроцедуры

Этот способ считается наиболее профессиональным в среде 1С, так как он сохраняет целостность данных и не создает проблем при обновлениях или обмене данными.

Заключение и рекомендации

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

Если же задача стоит в «связности» документов, рассмотрите использование реквизита ДокументОснование или стандартного механизма «Связанные документы» (БСП), который в КА реализован на высоком уровне и не требует модификации номеров.

← На главную