К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как сделать библиотеку в 1С

Как создать библиотеку в 1С: общие модули, подсистемы, поставка конфигурации, интеграция с БСП. Пошаговая инструкция с примерами кода и типичными ошибками.

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

Правильно оформленная библиотека экономит время: код пишется один раз, тестируется один раз, а подключается в десятки проектов. Неправильно оформленная — превращается в источник конфликтов при обновлении типовых конфигураций, потому что её объекты пересекаются с объектами поставщика или ломаются при изменении платформы.

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

Выбор формата: модуль, подсистема или конфигурация-поставка

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

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

Сравнение вариантов

Один общий модуль

Подходит для простых утилит без хранения данных. Ограничение: нельзя хранить состояние и настройки в базе.

Подсистема из нескольких объектов

Подходит для прикладных механизмов внутри одного проекта. Ограничение: перенос в другую конфигурацию делается вручную через сравнение-объединение.

Отдельная конфигурация с поставкой

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

Создание общего модуля — ядра библиотеки

Откройте конфигуратор, в дереве конфигурации найдите ветку «Общие» → «Общие модули» и добавьте новый объект. Имя давайте с префиксом библиотеки, чтобы избежать конфликтов: например, «МБ_РаботаСФайлами», где «МБ» — краткий код вашей библиотеки. Префикс — главная защита от совпадения имён при внедрении в типовые конфигурации.

В свойствах модуля установите флажки контекста исполнения. Для серверной логики включите «Сервер» и «Вызов сервера», если модуль должен быть доступен с клиента. Флажок «Клиент (управляемое приложение)» ставьте только для модулей, реально работающих на клиенте. Флажок «Привилегированный режим» включайте осознанно: он отключает проверку прав доступа, и ошибка в таком модуле открывает доступ к данным без ограничений.

Внутри модуля разделите код на области: программный интерфейс (экспортные процедуры), служебный программный интерфейс (для связи модулей библиотеки между собой) и служебные процедуры (внутренняя реализация, без экспорта). Это стандарт структуры, принятый в библиотеке стандартных подсистем.

#Область ПрограммныйИнтерфейс

// Преобразует строку в формат, безопасный для имени файла.

//

// Параметры:

// ИсходнаяСтрока - Строка - произвольный текст.

//

// Возвращаемое значение:

// Строка - безопасное имя файла.

//

Функция БезопасноеИмяФайла(ИсходнаяСтрока) Экспорт

Результат = ИсходнаяСтрока;

Недопустимые = "\/:*?""<>|";

Для Н = 1 По СтрДлина(Недопустимые) Цикл

Результат = СтрЗаменить(Результат, Сред(Недопустимые, Н, 1), "_");

КонецЦикла;

Возврат Результат;

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

#КонецОбласти

Организация нескольких модулей и подсистемы

Когда функций становится много, разделите их по модулям с суффиксами, отражающими контекст: «МБ_Файлы» (сервер), «МБ_ФайлыКлиент» (клиент), «МБ_ФайлыВызовСервера» (прокси для вызова с клиента), «МБ_ФайлыПовтИсп» (модуль с повторным использованием возвращаемых значений для кэширования). Такое соглашение сразу показывает, где исполняется код.

Модуль с повторным использованием — отдельный инструмент оптимизации. В его свойствах установите «Повторное использование возвращаемых значений» в значение «На время вызова» или «На время сеанса». Функции, возвращающие неизменные данные (константы, настройки), помещайте туда — платформа закэширует результат и не будет выполнять запрос повторно. Не помещайте туда функции, читающие изменяемые данные: кэш вернёт устаревшее значение.

Для визуальной группировки создайте подсистему: ветка «Общие» → «Подсистемы». Включите в неё все объекты библиотеки через кнопку настройки состава. Подсистема не влияет на исполнение кода, но упрощает навигацию, настройку прав и выгрузку объектов при переносе.

Порядок создания подсистемы
  1. 1
    Создайте общие модули с префиксом библиотеки
  2. 2
    Добавьте подсистему в ветке Общие → Подсистемы
  3. 3
    Включите в состав подсистемы все объекты библиотеки
  4. 4
    Проверьте права: создайте роль с доступом к объектам библиотеки
  5. 5
    Обновите конфигурацию базы данных и проверьте вызов функций из внешней обработки

Хранение настроек и данных библиотеки

Если библиотеке нужны настройки, не храните их в константах типовой конфигурации — при обновлении они могут конфликтовать. Создайте собственные объекты с тем же префиксом: константу «МБ_Настройки» (можно типа «ХранилищеЗначения» для сериализации структуры) или регистр сведений «МБ_НастройкиОбмена».

Для списков значений, которые администратор редактирует вручную, подойдёт собственный справочник. Для фиксации событий — журнал регистрации платформы (через «ЗаписьЖурналаРегистрации») или собственный регистр сведений, если записи нужно показывать пользователю в интерфейсе.

Интеграция с типовой конфигурацией

Библиотека редко живёт отдельно: её вызывают из документов, обработок и отчётов. Чтобы не править типовые модули, используйте подписки на события — создайте подписку на «ПриЗаписи» или «ОбработкаПроведения» нужных документов и укажите обработчик в своём модуле. Подписка — новый объект, она не меняет типовой код.

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

Если вы внедряете библиотеку в конфигурацию на базе БСП, изучите её соглашения: модули с суффиксом «Переопределяемый» предназначены именно для точек расширения. Заполнение таких модулей — штатный способ интеграции, поддерживаемый поставщиком.

Перед внедрением библиотеки в рабочую базу проверьте её на копии в режиме совместимости той версии платформы, что используется в проекте. Конструкции, работающие в свежей версии, могут не скомпилироваться в более старой.
ПЗ
Практическое замечание

Поставка и обновление библиотеки

Для переноса библиотеки между проектами создайте пустую конфигурацию, перенесите в неё все объекты библиотеки и настройте поставку: меню «Конфигурация» → «Поставка конфигурации» → «Настройка поставки». Укажите поставщика, версию и состав объектов. Затем создайте файл поставки (.cf) — его внедряют в целевую конфигурацию через «Сравнить, объединить с конфигурацией из файла».

Ведите нумерацию версий и журнал изменений хотя бы в текстовом файле внутри общего макета. При обновлении библиотеки в проекте вы должны точно знать, какая версия стоит сейчас и что изменилось. Добавьте функцию «ВерсияБиблиотеки()» в программный интерфейс — она позволит проверять версию программно, например при запуске обновления данных.

bsl
Функция ВерсияБиблиотеки() Экспорт
	Возврат "1.0.3.12";
КонецФункции

Если библиотека добавляет объекты метаданных (регистры, справочники), предусмотрите обработчик обновления: при первом запуске новой версии он должен заполнить начальные данные. Размещайте такой код в модуле с суффиксом «ОбновлениеДанных» и вызывайте его из штатного механизма обновления конфигурации или из регламентного задания.

Проверка результата и типичные ошибки

После создания библиотеки проверьте её в изоляции: создайте внешнюю обработку, вызовите каждую экспортную функцию с корректными и заведомо ошибочными параметрами. Библиотека не должна «падать» с необработанным исключением — ошибки либо обрабатывайте с записью в журнал регистрации, либо вызывайте явно через «ВызватьИсключение» с понятным текстом.

Контрольные точки

Как проверить результат

Компиляция модулей
Норма

Конфигурация обновляется без ошибок, модули компилируются во всех включённых контекстах

Тревожный признак

Ошибки компиляции в клиентском или серверном контексте

Конфликты имён
Норма

Объекты библиотеки имеют уникальный префикс, объединение с типовой проходит без совпадений

Тревожный признак

Предупреждения о совпадении имён при объединении

Права доступа
Норма

Пользователь с ролью библиотеки выполняет функции без ошибок доступа

Тревожный признак

Ошибка 'Нарушение прав доступа' при штатном вызове

Типичные ошибки
01
Модули без префикса — при внедрении в типовую возникают конфликты имён и код перестаёт компилироваться
02
Привилегированный режим без необходимости — открывает доступ к данным в обход ролей
03
Экспорт служебных процедур — внешний код начинает зависеть от внутренней реализации, и любой рефакторинг ломает проект
04
Хранение настроек в типовых константах — конфликты при обновлении конфигурации
05
Функции с повторным использованием, читающие изменяемые данные — пользователи видят устаревшие значения
Итог

Что важно запомнить

Библиотека строится на общих модулях с уникальным префиксом, документированным программным интерфейсом и собственными объектами хранения. Интеграция — через подписки и переопределяемые модули, распространение — через файл поставки с версионированием.

Частые вопросы

Можно ли сделать библиотеку без изменения конфигурации?

Частично. Внешние обработки и отчёты (.epf, .erf) позволяют выносить код за пределы конфигурации и подключать его через механизм дополнительных отчётов и обработок БСП. Но общие модули, подписки и собственные регистры требуют изменения конфигурации.

Чем библиотека отличается от расширения конфигурации?

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

Как назвать модули, если префикс уже занят?

Проверьте дерево конфигурации поиском по имени перед выбором префикса. Используйте 2–4 символа, связанных с названием библиотеки или компании. Полное совпадение имён недопустимо — платформа не даст создать объект с существующим именем, но при объединении конфигураций совпадение приведёт к слиянию модулей.

Нужно ли писать библиотеку по стандартам БСП, если конфигурация самописная?

Формально нет, но структура с областями «ПрограммныйИнтерфейс», «СлужебныйПрограммныйИнтерфейс» и «СлужебныеПроцедурыИФункции» проверена практикой и упрощает сопровождение. Если в будущем возможен переход на БСП, соблюдение соглашений сэкономит время на адаптацию.

Как обновить библиотеку в рабочей базе без остановки работы?

Обновление объектов метаданных требует монопольного доступа, поэтому полную замену выполняйте в нерабочее время. Минимизируйте риски: сделайте резервную копию, проверьте объединение на копии базы, а обработчики обновления данных проектируйте так, чтобы они корректно отрабатывали при повторном запуске.

Можно ли защитить код библиотеки от просмотра?

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