Как заменить третий и четвертый символы в номере документа 1С: подробное руководство

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

В процессе работы с базами данных 1С пользователи и администраторы нередко сталкиваются с ситуацией, когда из-за некорректных настроек синхронизации или организационных изменений ломается сквозная нумерация документов. Например, вместо привычного номера БП00-000066 система начинает генерировать номера вида БПБП-000066. Когда таких документов накапливается сотни или тысячи, ручное исправление становится невозможным.

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

Почему в номерах документов появляется двойной префикс

Прежде чем приступать к массовому изменению данных в базе, нам необходимо понять физический смысл формирования номера в современных конфигурациях на базе Библиотеки стандартных подсистем (БСП). Формат номера жестко стандартизирован платформой и выглядит следующим образом: ААВВ-СС0000123.

Давайте проанализируем структуру этого шаблона:

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

Если для нашей организации задан префикс БП, а префикс информационной базы в настройках не указан, система автоматически подставит по умолчанию 00. В итоге мы получаем стандартный корректный номер БП00-000066.

Появление номеров вида БПБП-000066 однозначно указывает на то, что в настройках синхронизации данных был случайно или намеренно установлен префикс информационной базы, также равный БП. В результате слияния двух префиксов получился некорректный четырехсимвольный код.

Важное предупреждение: если мы просто переименуем старые документы программным путем, но оставим настройки базы прежними, то все новые документы по-прежнему будут создаваться с неверным префиксом БПБП-.... Поэтому перед запуском групповой обработки обязательно выполним предварительную настройку.

Шаг 1. Исправление настроек префикса в информационной базе

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

  1. Откроем раздел меню Администрирование и выберем пункт Синхронизация данных.
  2. Найдем поле с названием Префикс этой информационной базы.
  3. Если там указано значение БП, очистим его (сделаем пустым) либо заменим на стандартные 00.
  4. Сохраним настройки.

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

Шаг 2. Включение режима разработчика в групповом изменении реквизитов

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

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

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

Шаг 3. Написание безопасного кода для изменения номеров

Рассмотрим детально алгоритм изменения номера. В обсуждении на форуме предлагалось несколько вариантов кода. Один из них — функция СтрЗаменить():

Объект.Номер = СтрЗаменить(Объект.Номер, "БПБП-", "БП00-");

Этот способ кажется простым, но он имеет скрытые угрозы. Во-первых, если комбинация символов "БПБП-" случайно встретится в середине или конце номера (хотя это маловероятно, но теоретически возможно), то замена произойдет и там, нарушив структуру. Во-вторых, этот код жестко привязан к конкретным символам "БПБП". Если в базе есть документы от других организаций с префиксом "ХЗХЗ", данный код для них не сработает.

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

Давайте разберем этот алгоритм по шагам:

  1. С помощью функции Лев(Объект.Номер, 2) мы берем первые два символа номера (наш неизменяемый префикс организации "БП").
  2. Добавляем к ним статическую строку "00" (новые символы на замену).
  3. С помощью функции Сред(Объект.Номер, 5) мы вырезаем всю оставшуюся часть исходного номера, начиная с 5-го символа и до самого конца строки (включая дефис и цифровую часть).

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

Для безопасной и быстрой работы мы должны использовать режим загрузки данных. Напишем правильный программный код:


// Шаг 1. Точечно меняем 3-й и 4-й символы в номере документа
Объект.Номер = Лев(Объект.Номер, 2) + "00" + Сред(Объект.Номер, 5);

// Шаг 2. Включаем режим загрузки данных
// Это позволит записать документ мгновенно, без проверок проведения и лишних триггеров
Объект.ОбменДанными.Загрузка = Истина;

// Шаг 3. Записываем объект в режиме простой записи без проведения
Объект.Записать(РежимЗаписиДокумента.Запись);

Этот код отработает чрезвычайно быстро даже на огромных массивах данных, так как платформа пропустит все бизнес-проверки при записи объектов.

Шаг 4. Обязательное действие после замены — сброс кэша нумерации

Многие специалисты совершают критическую ошибку: успешно выполнив групповую обработку номеров, они сразу закрывают базу. Однако после массового изменения номеров документов в СУБД платформа 1С продолжает удерживать в оперативной памяти (кэшировать) старый максимальный номер (то есть "БПБП-000066").

При попытке пользователя создать первый же новый документ система обратится к закэшированному значению, попытается прибавить к нему единицу, сгенерирует некорректный номер или выдаст системную ошибку "Код/Номер не уникален".

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

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


// Сбрасываем кэш нумератора для конкретного типа документа
// Замените "РеализацияТоваровУслуг" на имя вашего документа по конфигуратору
ОбновитьНумерациюОбъектов(Метаданные.Документы.РеализацияТоваровУслуг);

Платформа просканирует таблицу базы данных, найдет реальный текущий максимальный номер (который теперь выглядит как БП00-000066) и начнет корректно и последовательно создавать новые документы с правильным префиксом без генерации ошибок уникальности.

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

← На главную