БСП в 1С

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

Коротко

БСП (библиотека стандартных подсистем) — это набор готовых подсистем от «1С», встраиваемый в конфигурацию. Основная точка входа для прикладного кода — общие модули: универсальные ОбщегоНазначения и ОбщегоНазначенияКлиентСервер, а также модули конкретных подсистем вроде Пользователи или РаботаСФайлами.

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

Что такое БСП в 1С

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

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

Отдельная особенность: БСП не описана в синтакс-помощнике платформы. Источник истины по сигнатурам — комментарии перед экспортными функциями в самих модулях библиотеки, а также поставляемая документация к версии БСП.

Как устроена библиотека: подсистемы и общие модули

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

В выгрузке конфигурации подсистемы удобнее всего опознавать по именам общих модулей: имя модуля начинается с имени подсистемы. Например, к работе с файлами относятся РаботаСФайлами, РаботаСФайламиКлиент, РаботаСФайламиКлиентСервер, РаботаСФайламиПереопределяемый, РаботаСФайламиСлужебный и ещё около десятка модулей; к дополнительным реквизитам и сведениям — УправлениеСвойствами, УправлениеСвойствамиКлиент, УправлениеСвойствамиПовтИсп, УправлениеСвойствамиПереопределяемый, УправлениеСвойствамиСлужебный.

Масштаб стоит представлять заранее. В выгрузке конфигурации «Управление торговлей» каталог CommonModules содержит 2872 общих модуля (библиотека плюс прикладной код конфигурации). Модуль ОбщегоНазначения в этой выгрузке — 11155 строк, ОбщегоНазначенияКлиентСервер — 4855 строк, СтандартныеПодсистемыСервер — 6320 строк. Без понимания правил именования ориентироваться в таком объёме невозможно, поэтому с них и начнём.

Принцип именования общих модулей БСП

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

  • Без суффикса (ОбщегоНазначения, Пользователи) — серверный модуль: Сервер = Истина, клиент выключен, прямой вызов с клиента невозможен.
  • Клиент (ОбщегоНазначенияКлиент) — только клиентский контекст: работа с формами, диалогами, оповещениями.
  • КлиентСервер (ОбщегоНазначенияКлиентСервер) — доступен и на сервере, и на клиенте. Здесь лежат функции без обращения к базе: работа с коллекциями, строками, датами, проверки параметров.
  • ВызовСервера (ОбщегоНазначенияВызовСервера) — серверный модуль с флагом Вызов сервера: его экспортные функции можно вызвать из клиентского кода, каждый вызов — обращение к серверу.
  • ПовтИсп (СтандартныеПодсистемыПовтИсп) — включено повторное использование возвращаемых значений (на время сеанса или вызова). Результат кешируется по набору параметров, поэтому такие функции обязаны быть детерминированными и не иметь побочных эффектов.
  • Переопределяемый (ОбщегоНазначенияПереопределяемый) — штатная точка расширения. Библиотека вызывает его процедуры сама, а внедренец пишет в них свой код. Именно сюда попадают ПриОпределенииОбщихПараметровБазовойФункциональности, ПриДобавленииОбработчиковУстановкиПараметровСеанса и подобные обработчики.
  • Служебный (ПользователиСлужебный) — внутренняя реализация подсистемы. Его код заключён в область #Область СлужебныйПрограммныйИнтерфейс и предназначен только для самой библиотеки.
  • Локализация, УТ и подобные — модули адаптации: локализованная или конфигурационная надстройка над подсистемой.

Суффиксы комбинируются: РаботаСФайламиСлужебныйКлиентСервер — служебный модуль, доступный в обоих контекстах, РаботаСФайламиСлужебныйПовтИсп — служебный с кешированием. Читать имя нужно слева направо: подсистема, затем статус интерфейса, затем контекст исполнения.

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

ОбщегоНазначения: серверные функции, которые нужны чаще всего

Модуль ОбщегоНазначения — самый используемый модуль библиотеки. Его главная прикладная ценность — чтение реквизитов по ссылке одним запросом, без чтения объекта целиком.

// Один реквизит по ссылке
ДатаДок = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаДок, "Дата");

// Несколько реквизитов за один запрос — возвращается структура
Реквизиты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
    СсылкаДок, "Дата, Номер, Контрагент, Проведен");

Если Реквизиты.Проведен Тогда
    Сообщить(Реквизиты.Контрагент);
КонецЕсли;

// Таблица значений в массив структур
МассивСтрок = ОбщегоНазначения.ТаблицаЗначенийВМассив(Товары);
ЗначенияРеквизитовОбъекта
Ссылкассылка на объект
Реквизитыстрока через запятую, массив или структура
ВыбратьРазрешенныеучитывать права доступа
КодЯзыкаязык мультиязычных реквизитов
Структура

Разница между чтением реквизита и чтением объекта критична в циклах и обработках больших выборок: подробный разбор с замерами — в статье о ЗначениеРеквизитаОбъекта и ЗначенияРеквизитовОбъекта. Про преобразование табличной части в массив структур и его применение — в статье о ТаблицаЗначенийВМассив.

ОбщегоНазначенияКлиентСервер: коллекции, строки и даты

В ОбщегоНазначенияКлиентСервер собраны функции, которым не нужна база данных, поэтому один и тот же вызов работает и в модуле формы, и в серверной процедуре.

// Обернуть значение в массив (типовой параметр отбора)
Отбор.Вставить("Организация",
    ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Организация));

// Убрать дубли из массива
Уникальные = ОбщегоНазначенияКлиентСервер.СвернутьМассив(МассивКонтрагентов);

// Безопасное чтение ключа структуры
Комментарий = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(
    Параметры, "Комментарий", "");

// Строка в дату: пустая строка даёт Дата(1, 1, 1)
ДатаЗначение = ОбщегоНазначенияКлиентСервер.СтрокаВДату(СтрокаИзФайла);
СвойствоСтруктуры
Структураструктура или соответствие
Ключимя искомого свойства
ЗначениеПоУмолчаниюрезультат, если ключа нет
Произвольный

Такие функции экономят не столько строки, сколько ошибки: ЗначениеВМассиве убирает ручное создание массива под каждый отбор, СвойствоСтруктуры — проверку Свойство() перед каждым обращением. Детальные разборы: ЗначениеВМассиве и работа с массивами, структуры и соответствия в БСП, преобразование строки в дату.

Модули подсистем: пользователи, файлы, дополнительные реквизиты

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

// Пользователи: текущий пользователь сеанса
Автор = Пользователи.АвторизованныйПользователь(); // может быть внешним пользователем
Автор = Пользователи.ТекущийПользователь();        // только СправочникСсылка.Пользователи

Если Пользователи.ЭтоПолноправныйПользователь() Тогда
    // ветка для администратора
КонецЕсли;

// РаботаСФайлами: содержимое присоединённого файла
Данные = РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаНаФайл);

// УправлениеСвойствами: значения дополнительных реквизитов объектов
Значения = УправлениеСвойствами.ЗначенияСвойств(МассивОбъектов);
ДвоичныеДанныеФайла
ПрисоединенныйФайлссылка на присоединённый файл
ВызыватьИсключениереакция на отсутствие данных
ДвоичныеДанные

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

Как быстро найти нужную функцию БСП

Синтакс-помощник здесь не поможет, поэтому работает другой порядок действий:

  1. Определить подсистему по задаче: файлы — РаботаСФайлами, доп. реквизиты — УправлениеСвойствами, пользователи — Пользователи, общее — ОбщегоНазначения.
  2. Открыть модуль без суффикса или с суффиксом КлиентСервер и смотреть только область #Область ПрограммныйИнтерфейс: всё, что вне её, — не для прикладного кода.
  3. Прочитать комментарий перед функцией: в БСП он оформлен по стандарту и содержит описание параметров и тип возвращаемого значения. Это и есть замена справки.
  4. Если модуль неизвестен — искать по глобальному поиску конфигуратора или по выгрузке в файлы: имена функций в библиотеке говорящие, поиск по фрагменту («Реквизит», «Массив», «Файл») почти всегда попадает в цель.

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

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

Как узнать версию БСП в конкретной базе

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

Версия = СтандартныеПодсистемыСервер.ВерсияБиблиотеки();
Сообщить("Версия БСП: " + Версия); // например, "3.1.10.х"

// Сравнение версий — штатной функцией библиотеки
Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Версия, "3.1.5.0") >= 0 Тогда
    // ветка для новых версий
КонецЕсли;
ВерсияБиблиотеки
без параметровверсия встроенной БСП
Строка

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

Чего нельзя делать с библиотекой

БСП — внешняя зависимость с собственным циклом обновления. Из этого следуют жёсткие ограничения.

  • Нельзя править модули библиотеки. При обновлении БСП модуль приедет в новой редакции, и правка либо потеряется, либо превратится в конфликт объединения, который придётся разбирать вручную по каждому обновлению. Нужное поведение добавляется через модули с суффиксом Переопределяемый или через расширение конфигурации.
  • Нельзя вызывать модули с суффиксом Служебный. Это внутренняя реализация: сигнатуры и сам факт существования функции меняются между версиями без предупреждения. Если нужная возможность есть только в служебном модуле — значит, её публичный аналог либо в другом модуле, либо в другой версии библиотеки.
  • Нельзя обращаться к неэкспортным процедурам и к коду вне области #Область ПрограммныйИнтерфейс, даже если технически вызов проходит.
  • Нельзя переносить куски кода библиотеки в свои модули. Копия перестаёт обновляться вместе с БСП и со временем начинает вести себя иначе, чем оригинал.
  • Нельзя класть в ПовтИсп-модули функции с побочными эффектами. Результат кешируется, и повторный вызов просто не выполнится.

Частые ошибки при работе с БСП

  • Вызов серверного модуля с клиента. ОбщегоНазначения — серверный модуль без флага «Вызов сервера»; с клиента доступны ОбщегоНазначенияКлиент, ОбщегоНазначенияКлиентСервер и ОбщегоНазначенияВызовСервера.
  • Правка модуля библиотеки «на пару строк». Конфигурация снимается с поддержки или получает вечный конфликт при обновлении БСП.
  • Вызов служебного модуля, найденного поиском. Работает сегодня и падает после обновления библиотеки.
  • Чтение объекта ради одного реквизита. Ссылка.ПолучитьОбъект() в цикле вместо ЗначенияРеквизитовОбъекта — типовая причина медленной обработки.
  • Функция с побочным эффектом в ПовтИсп-модуле. Второй вызов вернёт закешированный результат, и действие не выполнится.
  • Самописный дубль библиотечной функции. Свой «СвернутьМассив» рядом с библиотечным — лишний код и расхождение в поведении на граничных случаях.
  • Код под чужую версию БСП. Перед использованием редкой функции стоит сверить версию библиотеки в базе.

Частые вопросы про БСП в 1С

Что означают суффиксы в именах общих модулей БСП?

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

Как узнать версию БСП, встроенной в конфигурацию?

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

Можно ли дорабатывать модули библиотеки стандартных подсистем?

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

Тарифы

ИИ Консоль кода 1С

Лайт

Бесплатно
≈ 1,5 млн токенов

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно

Старт

1990 руб. в месяц
≈ 10 млн токенов

Для индивидуального использования

Выбрать тариф

Продвинутый

Популярный выбор
3990 руб. в месяц
≈ 25 млн токенов

Для интенсивного использования или команд

  • До 15 конфигураций
  • Встроенный агент запросов 1С
  • Свои подписки Codex, Claude и любые OpenAI-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка
Выбрать тариф