При разделении учета на управленческий (например, в отраслевой конфигурации 1С:Автосервис или 1С:УНФ) и регламентированный (1С:Бухгалтерия предприятия) часто возникает ситуация, когда первичные документы выписываются одновременно в обеих системах. В оперативной базе оформляются продажи товаров и заказ-наряды на услуги автосервиса, а в бухгалтерской — реализация прочих услуг или поступления. Нередко бухгалтерия требует обеспечить единую непрерывную хронологию и строго сквозную нумерацию счетов-фактур между всеми информационными базами.
Разберем детально законодательные требования к нумерации, организационные пути решения и технические способы реализации единого механизма присвоения номеров.
Прежде чем приступать к доработке конфигураций, проанализируем нормативную базу:
Тем не менее, если сквозная нумерация является жестким внутренним регламентом компании, рассмотрим варианты ее реализации.
Самый надежный и не требующий программных доработок способ — правильное выстраивание бизнес-процесса:
АС и БП). Это сохраняет стандартную автонумерацию платформы «1С:Предприятие 8» и полностью исключает коллизии при переносе документов.Если требуется строго единый числовой счетчик для двух независимых баз, простейшим техническим решением является использование общего текстового файла в сетевой папке. Чтобы избежать выдачи одного и того же номера разным пользователям при одновременной записи, файл временно переименовывается (блокируется), после чего в него записывается обновленный номер.
Посмотрим на пример функции получения очередного номера:
Функция ПолучитьНовыйНомер(Отказ) Экспорт
ОбщийФайлДляДвухБаз = "D:\Exchange\NUM.TXT";
ЗаблокированныйОбщийФайл = "D:\Exchange\NUM.TX_";
ПоследнийНомер = 0;
ЗахваченФайл = Ложь;
// Пытаемся захватить файл путем монопольного переименования
Для ПопыткаЗахвата = 1 По 100 Цикл
Если НайтиФайлы(ОбщийФайлДляДвухБаз) <> Неопределено Тогда
Попытка
ПереместитьФайл(ОбщийФайлДляДвухБаз, ЗаблокированныйОбщийФайл);
ЗахваченФайл = Истина;
Прервать;
Исключение
// Файл занят другим процессом, ожидаем освобождения
КонецПопытки;
КонецЕсли;
КонецЦикла;
Если НЕ ЗахваченФайл Тогда
Отказ = Истина;
Сообщить("Не удалось захватить файл нумератора с номерами.");
Возврат 0;
КонецЕсли;
// Считываем последний номер
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(ЗаблокированныйОбщийФайл, КодировкаТекста.ANSI);
СтрокаНомера = Текст.ПолучитьСтроку(Текст.КоличествоСтрок());
Попытка
ПоследнийНомер = Число(СтрокаНомера) + 1;
Исключение
Сообщить("Ошибка вычисления нового номера.");
Отказ = Истина;
КонецПопытки;
// Записываем обновленный номер и возвращаем файл на место
Текст.Очистить();
Текст.ДобавитьСтроку(Формат(ПоследнийНомер, "ЧГ="));
Текст.Записать(ЗаблокированныйОбщийФайл, КодировкаТекста.ANSI);
ПереместитьФайл(ЗаблокированныйОбщийФайл, ОбщийФайлДляДвухБаз);
Возврат ПоследнийНомер;
КонецФункции
Альтернативным и более устойчивым файловым механизмом является работа с таблицей DBF через встроенный объект платформы XBase. Метод ОткрытьФайл() позволяет проверить доступность ресурса без необходимости ручного переименования файлов в файловой системе:
Открыта() возвращает Истина, если файл успешно захвачен, и Ложь, если он занят другой транзакцией.Записать() и закрываем файл методом ЗакрытьФайл().В современных конфигурациях наиболее надежным подходом является реализация собственного HTTP-сервиса на стороне мастер-базы (как правило, 1С:Бухгалтерии предприятия):
GET /get_next_number.HTTPСоединение.При внедрении единого нумератора важно учитывать следующие особенности платформы 1С:
ПриУстановкеНовогоНомера или в обработчике ПередЗаписью, но строго до входа в тяжелые транзакционные блокировки.