Как организовать общие процедуры для разных баз 1С:Бухгалтерия в рамках одной сети?

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

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

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

Способ 1. Использование конфигурации второго поставщика

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

Разберем этот процесс по шагам:

  1. Создаем новую пустую конфигурацию в отдельной базе. Назовем её, например, «ОбщаяФункциональность».
  2. В этой конфигурации создаем только те объекты, которые должны быть общими для всех 100 баз. В первую очередь это общие модули, в которых будут располагаться нужные процедуры и функции (например, модуль ОбщийМодульИнтеграцияССервисами).
  3. Настраиваем свойства конфигурации, указываем имя поставщика (например, «НашаКомпания») и создаем файлы поставки конфигурации (меню Конфигурация -> Распределение конфигурации -> Создать файлы поставки и обновления конфигурации).
  4. В каждой из 100 рабочих баз заходим в конфигуратор и выполняем сравнение/объединение с созданным файлом поставки (.cf). Платформа предложит поставить конфигурацию на поддержку второго поставщика.
  5. При изменении общего кода мы правим его только в нашей центральной базе «ОбщаяФункциональность», выпускаем новый файл обновления (.cfu или .cf) и накатываем его на все 100 баз.

Преимущества: Полный контроль над метаданными, стабильность работы, корректная поддержка синтаксического контроля при разработке, стандартный механизм трехстороннего сравнения при обновлениях от фирмы «1С».

Способ 2. Разработка общего расширения конфигурации и его пакетная загрузка

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

Главная сложность здесь — как быстро и безболезненно обновить расширение во всех 100 базах. Править вручную в 100 конфигураторах не придется, если автоматизировать этот процесс.

Для автоматизации можно использовать запуск платформы 1С из командной строки. Напишем скрипт автоматического обновления расширения. Команда для пакетной загрузки расширения выглядит следующим образом:


"C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8.exe" DESIGNER /F "ПутьКБазе" /N "Администратор" /P "Пароль" /UpdateExtension -Extension "ИмяРасширения" -File "C:\Distr\OurExtension.cfe" /UpdateDBCfg

Проанализируем параметры этой команды:

Для массового запуска этого процесса по всем базам отлично подойдет утилита «Обновлятор-1С». В ней есть встроенная возможность пакетного управления расширениями: вы указываете один актуальный файл расширения, список баз, и утилита сама поочередно подключается к базам, завершает сеансы пользователей, делает резервные копии, обновляет расширение и запускает базы обратно.

Способ 3. Внешние обработки и динамическое обновление через БСП

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

В типовых конфигурациях на базе БСП (Библиотеки Стандартных Подсистем) есть справочник ДополнительныеОтчетыИОбработки. Мы можем хранить наш общий код в процедурах внешней обработки, но как доставлять её обновления в базы?

Рассмотрим вариант автоматического обновления двоичных данных обработки внутри баз при их запуске:

  1. Кладем файл внешней обработки (например, CommonLogic.epf) в общую сетевую папку, доступную всем базам.
  2. В рабочих базах (например, через небольшое локальное расширение или подписку на событие при начале работы системы) пишем код, который проверяет дату изменения файла в сети или версию обработки.
  3. Если версия в сети новее, программа программно обновляет элемент справочника ДополнительныеОтчетыИОбработки, заменяя хранящиеся там двоичные данные.

Пример кода для программного обновления внешней обработки в базе:


СсылкаНаОбработку = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоРеквизиту("ИмяОбъекта", "ОбщиеПроцедурыОбмена");
Если ЗначениеЗаполнено(СсылкаНаОбработку) Тогда
    ОбъектОбработки = СсылкаНаОбработку.ПолучитьОбъект();
    ДвоичныеДанныеФайла = Новый ДвоичныеДанные("\\server\share\CommonLogic.epf");
    ОбъектОбработки.ХранилищеОбработки = Новый ХранилищеЗначения(ДвоичныеДанныеФайла, Новый СжатиеДанных(9));
    ОбъектОбработки.Записать();
КонецЕсли;

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

Способ 4. Динамическая загрузка кода через HTTP-сервис

Если в локальной сети есть возможность поднять внутренний веб-сервер, можно применить подход с динамическим получением кода. Это продвинутый аналог схемы «из текстового файла», которая использовалась в 1С 7.7.

Прямой запуск кода «на лету» в 1С 8.3 возможен с использованием функции Выполнить(). Мы можем хранить весь общий алгоритм в виде текстового файла на веб-сервере или в одной «мастер-базе» и получать его по HTTP.

Посмотрим на пример реализации в клиент-серверном коде:


Функция ПолучитьИВыполнитьОбщийКод(ПараметрыАлгоритма) Экспорт
    Соединение = Новый HTTPСоединение("192.168.1.100", 80, "User", "Password");
    Запрос = Новый HTTPЗапрос("/api/get_code?name=ProcessExcel");
    
    Попытка
        Ответ = Соединение.Получить(Запрос);
        Если Ответ.КодСостояния = 200 Тогда
            ТекстКода = Ответ.ПолучитьТелоКакСтроку();
            // В переменной ТекстКода находится BSL-код
            Выполнить(ТекстКода); 
        Иначе
            ВызватьИсключение "Ошибка получения общего кода с сервера!";
        КонецЕсли;
    Исключение
        ЗаписатьЛогОшибки(ОписаниеОшибки());
    КонецПопытки;
КонецФункции

Важно: Данный метод следует использовать с осторожностью, так как использование Выполнить() усложняет отладку программного кода и накладывает ограничения на использование локальных переменных (все параметры нужно передавать через структуру или объявлять их глобально внутри контекста исполнения).

Способ 5. Архитектура с выделенной «мастер-базой» и Web-сервисами (REST API)

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

Вместо распространения кода мы можем создать одну мастер-базу (или центральный сервис), которая будет предоставлять HTTP-сервисы для остальных баз.

Схема взаимодействия выглядит так:

  1. Локальная база считывает «сырые» данные (например, строки из Excel) в универсальный формат (Массив Структур или JSON).
  2. Локальная база отправляет POST-запрос на центральный HTTP-сервис мастер-базы, передавая туда эти данные.
  3. Мастер-база принимает данные, выполняет над ними сложные расчеты, распределение, проверки (код которых мы правим только в этой мастер-базе).
  4. Мастер-база возвращает локальной базе готовый структурированный ответ: список документов, реквизитов, сумм и счетов учета, которые нужно создать.
  5. Локальная база получает готовый простой JSON-пакет и по стандартному, не меняющемуся алгоритму просто создает документы у себя.

Этот подход полностью решает проблему версионирования кода. Локальные базы становятся «тонкими клиентами» для ваших общих алгоритмов, а вся логика централизуется на одном сервере.

Какое решение выбрать?

Выбор конкретного метода зависит от квалификации команды разработки и инфраструктурных возможностей вашей сети:

← На главную