Как правильно присвоить номер документу при загрузке данных в 1С:Предприятие?

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

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

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

Суть проблемы: почему документы загружаются без номеров?

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

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

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

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

Давайте посмотрим, как мы можем применить этот метод в рамках обмена данными, например, в обработчике «После загрузки» объекта документа в «Конвертации данных».

  1. Определяем момент вызова: Метод УстановитьНовыйНомер() следует вызывать после того, как все остальные данные документа (шапка, табличные части) уже заполнены, но до того, как мы окончательно записываем объект в базу. В обработчике «После загрузки» это идеальное место.
  2. Условие вызова: Обычно мы хотим присвоить новый номер только в том случае, если документ пришел без номера или с пустым номером. Это предотвращает перезапись уже существующих номеров, если по какой-то причине они были переданы в процессе обмена (хотя в обсуждаемой ситуации мы договорились не передавать номер).

Рассмотрим пример кода, который мы можем разместить в обработчике «После загрузки» для нашего объекта документа:


// Пример кода в обработчике "После загрузки" объекта документа в Конвертации данных
// Здесь "Объект" – это ссылка на созданный или найденный документ,
// который уже заполнен данными из источника.

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

// После установки номера, если требуется, можем выполнить дополнительные действия
// и записать объект в базу данных.
// Объект.Записать(); // Обычно это делается после всех манипуляций в обработчике.

При вызове Объект.УстановитьНовыйНомер() система 1С:Предприятие выполняет следующие действия:

  1. Проверяет настройки автонумерации для данного вида документа в метаданных.
  2. Определяет последний использованный номер для этого вида документа (с учетом периодичности, если она задана).
  3. Формирует новый порядковый номер.
  4. Применяет к нему все необходимые префиксы (о которых мы поговорим подробнее ниже).
  5. Присваивает сформированный номер документу.

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

Работа с префиксами и структурой номера документа

Вызов метода УстановитьНовыйНомер() — это только часть решения. Для полного понимания нам следует рассмотреть, как формируется номер документа в 1С, особенно с учетом префиксов.

Структура номера документа

Стандартная структура номера документа в 1С:Предприятие обычно состоит из 11 символов и включает в себя:

  1. Префикс организации (2 символа): Это двухсимвольный код, который задается в карточке организации. Если для организации префикс не указан, по умолчанию используются "00". Этот префикс позволяет легко идентифицировать, к какой организации относится документ.
  2. Префикс информационной базы (2 символа): Данный префикс используется, когда мы работаем с распределенными информационными базами (РИБ) или другими механизмами синхронизации данных. Его основная цель — предотвратить дублирование номеров документов, созданных в разных базах. Если обмен данными не используется, или настроен иначе, часто проставляются "00".
  3. Разделитель (1 символ): Обычно это дефис "-". Он отделяет префиксы от порядкового номера.
  4. Порядковый номер (6 символов): Это непосредственно порядковый номер документа, который заполняется с лидирующими нулями (например, "000001", "000002") для обеспечения корректной сортировки.

Таким образом, полный номер может выглядеть как "ОА01-000001", где "ОА" – префикс организации, "01" – префикс информационной базы.

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

Обработка префиксов методом УстановитьНовыйНомер() и БСП

Если мы работаем с конфигурацией, разработанной на базе Библиотеки стандартных подсистем (БСП), нам особенно повезло. В таких конфигурациях логика формирования префиксов и присвоения номеров уже детально проработана и реализована в общих модулях и подписках на события. Метод УстановитьНовыйНомер() в этом случае является "умным" и:

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

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

Настройка автоматической нумерации в метаданных

Для того чтобы метод УстановитьНовыйНомер() работал корректно, необходимо убедиться, что в метаданных нашей конфигурации для соответствующего объекта (документа, справочника, бизнес-процесса, задачи) настроена автоматическая нумерация. Основные настройки нумерации включают:

  1. Флажок "Автонумерация": Должен быть установлен для автоматического присвоения номеров.
  2. "Длина номера": Определяет максимальную длину порядкового номера. Обычно это 6 или более символов.
  3. "Контроль уникальности": Рекомендуется установить, чтобы система контролировала отсутствие дублирующихся номеров.
  4. "Периодичность": Мы можем настроить, с какой периодичностью номер будет сбрасываться и начинать отсчет заново. Например, "в пределах года" (нумерация сбрасывается 1 января каждого года) или "в пределах месяца" (сбрасывается 1 числа каждого месяца). Если периодичность не указана, нумерация будет сквозной.

Номер присваивается документу в момент его записи, и эти настройки определяют, как именно это произойдет.

Дополнительные аспекты и полезные функции

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

Отображение номера в печатных формах

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


// Пример использования функции НомерНаПечать в конфигурации с БСП
// Пусть ДокументСсылка - это ссылка на наш документ

// Получаем номер документа без префиксов и лидирующих нулей для печати
НомерДляПечати = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ДокументСсылка.Номер);

// Далее НомерДляПечати можно использовать в макете печатной формы
// Например, для документа с номером "ОА01-000015", НомерДляПечати будет "15"

Сбои в нумерации и их исправление

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

В некоторых типовых конфигурациях, например, в 1С:Бухгалтерии 3.0, существует сервис "Экспресс-проверка ведения учета". Этот инструмент может помочь выявить и исправить нарушения в нумерации различных документов, таких как кассовые документы и счета-фактуры, что является очень полезной функцией для поддержания порядка в базе.

Заключение

Мы выяснили, что для корректного присвоения номеров документам при программной загрузке данных в 1С:Предприятие необходимо явно вызывать метод Объект.УстановитьНовыйНомер() в обработчике «После загрузки». Этот подход, особенно эффективный в конфигурациях, использующих БСП, гарантирует, что номера документов будут формироваться с учетом всех правил, включая префиксы организации и информационной базы.

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

← На главную