Как настроить сквозную нумерацию счетов-фактур при параллельной работе в двух базах 1С?

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

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

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

Правовые и методологические аспекты нумерации счетов-фактур

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

  1. Легитимность префиксов: Согласно ст. 169 НК РФ и Постановлению Правительства РФ № 1137, налогоплательщики вправе применять буквенные и цифровые префиксы, а также составную нумерацию через разделители (например, для обособленных подразделений или различных видов деятельности).
  2. Отсутствие критичности хронологии: Нарушение хронологической последовательности номеров счетов-фактур или наличие пропусков в нумерации не может служить основанием для отказа в вычете НДС, если документ позволяет достоверно определить продавца, покупателя, наименование товаров или услуг, стоимость и сумму налога.

Тем не менее, если сквозная нумерация является жестким внутренним регламентом компании, рассмотрим варианты ее реализации.

Вариант 1. Организационное разделение и штатные префиксы

Самый надежный и не требующий программных доработок способ — правильное выстраивание бизнес-процесса:

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

Вариант 2. Внешний файловый нумератор с монопольной блокировкой

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

Посмотрим на пример функции получения очередного номера:


Функция ПолучитьНовыйНомер(Отказ) Экспорт

    ОбщийФайлДляДвухБаз     = "D:\Exchange\NUM.TXT";
    ЗаблокированныйОбщийФайл = "D:\Exchange\NUM.TX_";
    ПоследнийНомер           = 0;
    ЗахваченФайл             = Ложь;

    // Пытаемся захватить файл путем монопольного переименования
    Для ПопыткаЗахвата = 1 По 100 Цикл
        Если НайтиФайлы(ОбщийФайлДляДвухБаз) <> Неопределено Тогда
            Попытка
                ПереместитьФайл(ОбщийФайлДляДвухБаз, ЗаблокированныйОбщийФайл);
                ЗахваченФайл = Истина;
                Прервать;
            Исключение
                // Файл занят другим процессом, ожидаем освобождения
            КонецПопытки;
        КонецЕсли;
    КонецЦикла;

    Если НЕ ЗахваченФайл Тогда
        Отказ = Истина;
        Сообщить("Не удалось захватить файл нумератора с номерами.");
        Возврат 0;
    КонецЕсли;

    // Считываем последний номер
    Текст = Новый ТекстовыйДокумент;
    Текст.Прочитать(ЗаблокированныйОбщийФайл, КодировкаТекста.ANSI);
    СтрокаНомера = Текст.ПолучитьСтроку(Текст.КоличествоСтрок());

    Попытка
        ПоследнийНомер = Число(СтрокаНомера) + 1;
    Исключение
        Сообщить("Ошибка вычисления нового номера.");
        Отказ = Истина;
    КонецПопытки;

    // Записываем обновленный номер и возвращаем файл на место
    Текст.Очистить();
    Текст.ДобавитьСтроку(Формат(ПоследнийНомер, "ЧГ="));
    Текст.Записать(ЗаблокированныйОбщийФайл, КодировкаТекста.ANSI);
    ПереместитьФайл(ЗаблокированныйОбщийФайл, ОбщийФайлДляДвухБаз);

    Возврат ПоследнийНомер;

КонецФункции

Вариант 3. Использование таблиц DBF через объект XBase

Альтернативным и более устойчивым файловым механизмом является работа с таблицей DBF через встроенный объект платформы XBase. Метод ОткрытьФайл() позволяет проверить доступность ресурса без необходимости ручного переименования файлов в файловой системе:

  1. Открываем файл DBF в монопольном или разделяемом режиме с блокировкой записи.
  2. Свойство Открыта() возвращает Истина, если файл успешно захвачен, и Ложь, если он занят другой транзакцией.
  3. Считываем текущее числовое значение, увеличиваем на единицу, фиксируем методом Записать() и закрываем файл методом ЗакрытьФайл().

Вариант 4. Архитектурное решение через HTTP-сервис мастер-базы

В современных конфигурациях наиболее надежным подходом является реализация собственного HTTP-сервиса на стороне мастер-базы (как правило, 1С:Бухгалтерии предприятия):

  1. В конфигурации-мастере публикуется легковесный HTTP-сервис с методом GET /get_next_number.
  2. При создании счета-фактуры во второй базе (1С:Автосервис) отправляется синхронный HTTP-запрос через объект HTTPСоединение.
  3. Мастер-база резервирует номер во внутреннем регистре сведений с управляемой блокировкой и возвращает готовый номер клиенту.
  4. Преимущество подхода: отсутствие файловых зависаний в сетевых папках, поддержка работы через веб-сервер и централизованный аудит выданных номеров.

Ограничения платформы и предотвращение ошибок

При внедрении единого нумератора важно учитывать следующие особенности платформы 1С:

  1. Точка вызова: Получение номера необходимо размещать в подписке на событие ПриУстановкеНовогоНомера или в обработчике ПередЗаписью, но строго до входа в тяжелые транзакционные блокировки.
  2. Пропуски при отказе от сохранения: Если генерировать номер при открытии формы нового документа, а пользователь закроет форму без сохранения, в сквозной нумерации возникнет «дыра». Поэтому присваивать номер следует только в момент фактической записи или проведения документа.
  3. Таймауты блокировок: Вызовы внешних ресурсов (файлов, COM-соединений, HTTP-сервисов) не должны выполняться внутри транзакций СУБД, иначе любая задержка сети приведет к возникновению взаимных блокировок (Deadlocks) у других пользователей.
← На главную