Как организовать единую нумерацию для Счета, Реализации и Счет-фактуры в 1С:Бухгалтерии?

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

В практике автоматизации бизнес-процессов часто возникает требование от отделов продаж: обеспечить, чтобы пакет документов по одной сделке (Счет на оплату, Акт/Накладная и Счет-фактура) имел одинаковый номер. С точки зрения «чистой» методологии 1С и бухгалтерского учета, это не является обязательным требованием, и разные виды документов обычно имеют независимые нумераторы. Однако, для удобства коммуникации с клиентами («Оплатите счет №500 по акту №500»), такая задача ставится программистам регулярно.

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

Постановка задачи и анализ ограничений

Суть задачи, которую мы решаем: существует некое автоматизированное рабочее место (АРМ) менеджера или специальный документ «Договор-заявка». При нажатии кнопки пользователь хочет программно создать сразу три документа:

  1. Счет на оплату покупателю.
  2. Реализацию (акт, накладная, УПД).
  3. Счет-фактуру выданный.

Для оптимизации этого процесса часто используется пакетное формирование накладных и счетов-фактур на основании счета покупателю, что позволяет избежать ручного ввода данных. Главное условие: номера всех трех документов должны совпадать. Если номер 105 присвоен Реализации, то и Счет, и СФ должны быть №105.

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

В некоторых случаях стандартная логика может быть изменена, например, когда требуется нумерация счетов-фактур и документов реализации по дате создания. Если мы просто попытаемся программно присвоить Док.Номер = "0000-000105", система может либо перезаписать его при записи, либо выдать ошибку неуникальности.

Стратегия 1: Использование общего нумератора (Изменение метаданных)

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

Как это сделать:

  1. Заходим в Конфигуратор.
  2. В дереве метаданных находим ветку «Нумераторы» и создаем новый, например, НумераторПродаж.
  3. Находим документы РеализацияТоваровУслуг, СчетНаОплатуПокупателю, СчетФактураВыданный.
  4. В свойствах каждого из этих документов выбираем наш НумераторПродаж.

Плюсы подхода: Сквозная нумерация поддерживается платформой. Минусы подхода: Вы меняете типовую структуру метаданных. Кроме того, Счет №6 после Реализации №5 нарушит условие «одинаковых номеров», так как они будут идти последовательно, а не синхронно.

Стратегия 2: Программный контроль и "Ведущий" документ

Более гибкий подход — это программное назначение номера в момент создания. Нам необходимо выбрать «Ведущий» документ (обычно это Реализация), а остальные документы (Счет и СФ) сделаем «Ведомыми» — для этого подойдёт настройка правил создания связанных документов.

Шаг 1. Использование уникального префикса

Чтобы автоматически созданные документы не конфликтовали с ручным вводом, выделите для них отдельное пространство номеров. Для этого удобно использовать готовое расширение, которое обеспечит установку префикса у документов по условию.

Например, если организация имеет префикс «МС», то обычные документы будут «МС00-00001». Документы по заявкам могут иметь префикс «МСДЗ-00001». В более специфических случаях может потребоваться префикс даты в номерах счетов и реализаций или даже полная замена, когда используется дата вместо префикса документа.

Шаг 2. Перехват установки номера

В БП 3.0 механизм нумерации срабатывает в момент записи. Чтобы вмешаться в этот процесс, лучше всего использовать расширение конфигурации, реализующее алгоритм, при котором происходит автоматическая установка номера счета-фактуры как у реализации.

В событии ПриУстановкеНовогоНомера мы можем отказаться от стандартной генерации:


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

КонецПроцедуры

Шаг 3. Алгоритм создания пакета документов (Кнопка менеджера)

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


Процедура СоздатьПакетДокументов(ДанныеЗаявки)
    
    УстановитьПривилегированныйРежим(Истина);
    НачатьТранзакцию();
    
    Попытка
        
        // 1. Создаем и записываем Реализацию
        НовРеализация = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
        // ... заполнение ...
        НовРеализация.УстановитьНовыйНомер(ЭтотОбъект.Организация.Префикс + "ДЗ-"); 
        НовРеализация.Записать(РежимЗаписиДокумента.Проведение);
        
        ЗафиксированныйНомер = НовРеализация.Номер;
        
        // 2. Создаем Счет-фактуру
        НовСчетФактура = Документы.СчетФактураВыданный.СоздатьДокумент();
        НовСчетФактура.ДокументОснование = НовРеализация.Ссылка;
        НовСчетФактура.Номер = ЗафиксированныйНомер;
        
        НовСчетФактура.ОбменДанными.Загрузка = Истина; 
        НовСчетФактура.Записать(РежимЗаписиДокумента.Запись);
        НовСчетФактура.ОбменДанными.Загрузка = Ложь;
        НовСчетФактура.Записать(РежимЗаписиДокумента.Проведение);
        
        // 3. Создаем Счет на оплату
        НовСчет = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
        НовСчет.Номер = ЗафиксированныйНомер;
        НовСчет.ОбменДанными.Загрузка = Истина;
        НовСчет.Записать(РежимЗаписиДокумента.Запись);
        
        ЗафиксироватьТранзакцию();
        
    Исключение
        ОтменитьТранзакцию();
        Сообщить("Не удалось создать пакет документов: " + ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

Проблема занятого номера и как её решить

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

Вариант с УПД (Универсальный передаточный документ)

Если организация перейдет на использование УПД (статус 1), то потребность в синхронизации номеров между Реализацией и Счетом-фактурой отпадет автоматически. В этом случае номер Счета-фактуры фактически равен номеру Реализации, и вам останется только синхронизировать номер Счета на оплату с номером УПД.

Резюме

Для реализации единой нумерации в БП 3.0 наиболее эффективным является следующий подход:

  1. Выделите отдельную серию номеров через префикс для автоматических документов.
  2. В процедуре создания используйте Транзакцию.
  3. Используйте ОбменДанными.Загрузка = Истина при первой записи зависимых документов, либо внедрите расширение с программным перехватом номера.
← На главную