Имеем: две базы организации: торговля и бухгалтерия, в которых в реальном времени делаются реализации и выписываются счета-фактуры. Периодически из торговли документы передаются в бухгалтерию.
Задача: обеспечить единую сквозную нумерацию документов в хронологическом порядке, пробелы в нумерации допускаются, при этом оставлять ежедневный запас номеров для использования при загрузке сводных реализаций (между собственными компаниями).
Решение: создаем БД enumerator на MS SQL сервере, выполняем скрипт для создания таблиц и хранимых процедур. В таблицах хранится информация о виде счетчика, параметрах организации и строка подключения, значения счетчиков по датам.
Вносим изменения в конфигурацию 1с (все необходимое содержится в файле конфигурации, изменения вносились и тестировались на Управление торговлей 10.3 (8.1), Бухгалтерия предприятия 2.0 (8.2)). Пример написан для БД Торговли, для бухгалтерии необходимо переменной db_type присвоить значение 1 в обработке РаботаСНумератором, модуле формы справочника Организации и в процедуре ПриУстановкеНовогоНомераДокумента. Также нужно включить документ СчетФактураВыданный в подписку на событие ПриУстановкеНовогоНомераДокумента.
Установить четыре константы параметров подключения
Установить реквизит Организации Нумератор_СчетФактураВыданный. Заполнение и уникальность ИНН обязательно, по этому полю выполняется идентификация.
Заполнить начальные значения счетчика и дельты (ежедневный запас, прибавляемый к номеру для определения начального номера на текущую дату)
Действия выполнить в двух базах последовательно. В таблицу организаций в базе нумератора записывается информация о подключении для предотвращения поломки счетчика при развертывании (тестовой) копии баз. Необходимо помнить что строка подключения для файлового варианта у разных клиентов может быть разной, т.е. необходимо обеспечить чтобы у всех пользователей была одна строка подключения, иначе невозможно однозначно идентифицировать базу. В случае серверного варианта заносится имя базы на SQL сервере.
Работает это так: при возникновении у документа-подписчика события ПриУстановкеНовогоНомераДокумента вызывается хранимая процедура, которая проверяет переданную дату и при необходимости открывает новый период нумерации, увеличивая значение счетчика на прошлую дату на дельту. Затем найденное последнее значение увеличивается на 1, записывается в таблицу базы нумератора и возвращается в 1с. Если для периода нет свободных значений счетчика, генерируется исключение.
Надеюсь, кому-нибудь пригодится.