При работе с двумя и более базами 1С, например, «Управление торговлей» (УТ) и «Бухгалтерия предприятия» (БП), часто возникает задача обеспечения единой нумерации документов. Эта проблема усложняется, если в одной из баз уже заведены документы, и планируется продолжать параллельный ввод новых документов в обеих системах. Рассмотрим, как можно подойти к решению этой непростой задачи, учитывая как типовые возможности 1С, так и нетиповые подходы.
В стандартных конфигурациях 1С для предотвращения дублирования номеров документов при обмене данными и в распределенных информационных базах (РИБ) активно применяются префиксы. Эти префиксы позволяют системе различать документы, созданные в разных организациях или в разных информационных базах. Существуют следующие виды префиксов:
УТ-000001, БП-000002).Если в одной из баз уже заведены документы, то после настройки префиксов новые документы будут получать номера с учетом этих префиксов (например, УТ_Док0001, БП_Док0001). Существующие документы при этом сохранят свои первоначальные номера. Этот механизм гарантирует уникальность номеров по всем базам, но не обеспечивает сквозную последовательную нумерацию. То есть, документ УТ_Док0005 и БП_Док0005 будут существовать независимо, и между ними могут быть пропущены номера с точки зрения общей последовательности.
Для унификации нумерации «задним числом» или для приведения ее к новому формату нам потребуется либо ручная корректировка номеров последних созданных документов, чтобы система продолжила нумерацию с нужного значения, либо использование специализированных обработок, таких как «Групповое изменение реквизитов» или написание собственного программного кода для перенумерации. Однако, перенумерация большого количества документов является сложной задачей, требующей осторожности для сохранения целостности данных и, возможно, перепроведения документов, после которого полезно автоматически сравнить бухгалтерские и налоговые проводки для контроля результата.
Достижение строгой сквозной и непрерывной нумерации между несколькими базами, где документы могут создаваться одновременно, является нетривиальной задачей и не всегда поддерживается типовым функционалом 1С без доработок. Стандартные механизмы, как мы уже отметили, ориентированы на обеспечение уникальности номеров с помощью префиксов, а не на абсолютную сквозную последовательность, когда создание документов происходит параллельно в разных системах.
Представим ситуацию: в УТ создается документ Док0005, а одновременно в БП — Док0005. При синхронизации типовой механизм разрешит конфликт путем добавления префикса или перезаписи, если это разрешено правилами. Но если нам нужна единая последовательность Док0005, Док0006, Док0007, независимо от того, в какой базе был создан документ, это требует координации в реальном времени, что выходит за рамки типовых возможностей.
В более сложных случаях, когда требуется жесткая единая нумерация, могут применяться следующие нетиповые решения. Они, как правило, потребуют изменения правил обмена или доработки конфигураций.
Этот подход предполагает, что перед записью нового документа в одной из баз происходит обращение к централизованному источнику (другой базе или специальной службе) для получения и резервирования следующего номера. Это может быть реализовано через веб-сервисы или прямое подключение (например, к SQL-серверу, если базы на одном сервере). Такой механизм обеспечивает централизованное выделение номеров.
УТ) перед записью документа вызывает веб-сервис Базы-приемника (например, БП или специально выделенной базы) с запросом следующего свободного номера. База-приемник выдает номер и регистрирует его как занятый. Затем База-источник использует этот номер для своего документа.Преимущества: Возможность достижения строгой последовательности номеров. Работает при относительно стабильной связи.
Недостатки:
Рассмотрим концептуальный пример кода для получения номера через веб-сервис. Представим, что у нас есть веб-сервис в одной из баз (или в отдельной), который умеет выдавать и резервировать номера:
// Пример кода в базе-источнике (например, УТ) перед записью документа
// Допустим, есть веб-сервис "НумерацияДокументов" в целевой базе (БП)
// Функция, вызываемая в модуле объекта документа
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ЭтоНовый() И Отказ = Ложь Тогда
// Проверяем, настроена ли единая нумерация для этого вида документа
// Например, можно хранить это в регистре сведений
Если ПараметрыСеанса.ИспользоватьЕдинуюНумерациюДляДокумента("РеализацияТоваровУслуг") Тогда
Попытка
// Создаем объект WS-прокси для обращения к веб-сервису
Прокси = Новый WSПрокси("http://адрес_вашего_вебсервиса_БП/ws/НумерацияДокументов?wsdl", "НумерацияДокументов", "НумерацияДокументовПорт");
// Вызываем метод веб-сервиса для получения и резервирования номера
ПолученныйНомер = Прокси.ПолучитьИЗарезервироватьНомер("РеализацияТоваровУслуг");
Если Не ПолученныйНомер = Неопределено Тогда
Номер = ПолученныйНомер; // Присваиваем полученный номер документу
Иначе
Отказ = Истина; // Не удалось получить номер, отменяем запись
Сообщить("Не удалось получить единый номер для документа. Запись отменена.");
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Ошибка обращения к веб-сервису нумерации: " + ОписаниеОшибки(), УровеньЖурналаРегистрации.Ошибка);
Отказ = Истина;
Сообщить("Произошла ошибка при получении номера. Обратитесь к администратору.");
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Пример кода в целевой базе (например, БП) в модуле веб-сервиса "НумерацияДокументов"
// Предполагается наличие регистра сведений "ЗарезервированныеНомераДокументов"
// с измерениями "ВидДокумента" и ресурсом "ПоследнийНомер".
Функция ПолучитьИЗарезервироватьНомер(ИмяВидаДокумента) Экспорт
// Используем блокировку данных для обеспечения атомарности операции
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ЗарезервированныеНомераДокументов");
ЭлементБлокировки.УстановитьЗначение("ВидДокумента", ИмяВидаДокумента);
Блокировка.УстановитьРежим(РежимБлокировкиДанных.Исключительный); // Исключительная блокировка
Попытка
Блокировка.Заблокировать(); // Заблокировать регистр на время получения номера
// Получаем последний номер для данного вида документа из регистра
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
| ЗарезервированныеНомераДокументов.ПоследнийНомер КАК ПоследнийНомер
|ИЗ
| РегистрСведений.ЗарезервированныеНомераДокументов КАК ЗарезервированныеНомераДокументов
|ГДЕ
| ЗарезервированныеНомераДокументов.ВидДокумента = &ВидДокумента";
Запрос.УстановитьПараметр("ВидДокумента", ИмяВидаДокумента);
Результат = Запрос.Выполнить().Выбрать();
ТекущийНомерЧислом = 0;
Если Результат.Следующий() Тогда
ТекущийНомерЧислом = Результат.ПоследнийНомер;
КонецЕсли;
// Вычисляем новый номер
НовыйНомерЧислом = ТекущийНомерЧислом + 1;
// Записываем новый номер в регистр
НаборЗаписей = РегистрыСведений.ЗарезервированныеНомераДокументов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ВидДокумента.Установить(ИмяВидаДокумента);
НаборЗаписей.Прочитать();
ЗаписьРС = Неопределено;
Если НаборЗаписей.Количество() = 0 Тогда
ЗаписьРС = НаборЗаписей.Добавить();
ЗаписьРС.ВидДокумента = ИмяВидаДокумента;
Иначе
ЗаписьРС = НаборЗаписей[0];
КонецЕсли;
ЗаписьРС.ПоследнийНомер = НовыйНомерЧислом;
НаборЗаписей.Записать(); // Записываем изменения
// Форматируем числовой номер в строку
Возврат "Док" + Формат(НовыйНомерЧислом, "ЧЦ=6; ЧВН=; ЧГ=0");
Исключение
ЗаписьЖурналаРегистрации("Ошибка резервирования номера через веб-сервис: " + ОписаниеОшибки(), УровеньЖурналаРегистрации.Ошибка);
Возврат Неопределено; // В случае ошибки возвращаем Неопределено
КонецПопытки;
КонецФункции
Можно создать отдельную «самодельную» базу данных (например, на основе SQL Server, PostgreSQL или даже простую текстовую базу), которая будет выступать в роли центрального генератора и хранителя номеров для всех синхронизируемых баз 1С. Базы 1С будут обращаться к этому внешнему источнику через механизмы внешних источников данных или ODBC/ADO-соединения для получения следующего номера.
Преимущества:
Недостатки:
Этот подход является наиболее простым и рекомендуемым с точки зрения минимизации доработок и рисков. Он требует изменения бизнес-процессов.
Суть: Мы определяем одну из баз (например, УТ) как основную точку ввода документов для определенных видов документов. Все первичные документы этих видов создаются только в этой базе. После создания и сохранения они выгружаются в другие базы (например, в БП) через типовую синхронизацию. Таким образом, нумерация полностью формируется в одной системе, и другие базы лишь получают готовые документы с уже присвоенными номерами.
Преимущества:
Недостатки:
Это оптимальное решение, если бизнес-процессы допускают такую централизацию ввода данных.
Стоит отметить, что в некоторых конфигурациях, например, в «1С:Документооборот», предусмотрены специальные механизмы — «нумераторы». Они позволяют гибко настраивать формат номера и вести единую сквозную нумерацию для нескольких видов документов в пределах одной информационной базы. Однако эти механизмы не решают задачу единой сквозной нумерации при одновременном вводе документов в разных синхронизируемых базах, поскольку их действие ограничено одной ИБ. При сбоях нумерации и появлении дублей в этой системе пригодится обработка для обновления нумераторов в 1С:Документооборот.
Типовая синхронизация 1С с использованием префиксов обеспечивает уникальность номеров документов в распределенной среде. Достижение единой, абсолютно сквозной и непрерывной нумерации при параллельном вводе документов в разных базах является сложной задачей. Она требует либо значительных нетиповых доработок (через веб-сервисы, внешние БД), либо изменения бизнес-процессов с централизацией ввода данных. Выбор оптимального решения всегда определяется реальными потребностями бизнеса, квалификацией команды и бюджетом проекта.