БСП 1С (библиотека стандартных подсистем) — набор готовых механизмов от фирмы «1С», на котором собраны современные типовые конфигурации: Бухгалтерия 3.0, УТ 11, КА 2, ERP 2, УНФ 3.0, Розница 3.0. Пользователи и права, меню «Печать», дополнительные реквизиты, внешние обработки, обновление базы — всё это БСП. Программист встречается с ней, когда дорабатывает типовую или пишет свою конфигурацию. Ниже карта подсистем для практика: какой модуль за что отвечает, что вызывать вместо самописного кода и как внедрять и обновлять библиотеку, не теряя доработки.
Формально БСП — отдельная конфигурация, которую 1С выпускает релизами. Сама по себе она не используется: нужные подсистемы переносят в прикладное решение сравнением и объединением. В поставку входят документация и демонстрационная конфигурация с примерами встраивания — лучший источник образцов кода для вашей версии.
Редакции на практике: 2.x (2.3, 2.4) — в давно не обновлявшихся базах, 3.0 и 3.1 — основа нынешних типовых, вышла и 3.2. Все работают на платформе 8.3, но минимальная версия платформы у каждого релиза своя. Поэтому запрос «БСП 1С 8.3» мало что уточняет: важен номер версии библиотеки в конкретной базе (как его узнать — в вопросах ниже).
По имени общего модуля БСП сразу понятно, где он выполняется и можно ли его трогать:
| Имя модуля | Где работает | Что с ним делать |
|---|---|---|
ОбщегоНазначения | сервер, внешнее соединение | вызывать из серверного кода |
ОбщегоНазначенияКлиент | клиент | вызывать из клиентских процедур формы |
ОбщегоНазначенияКлиентСервер | и клиент, и сервер | вызывать откуда угодно |
УправлениеПечатьюПереопределяемый | сервер | не вызывать, а дописывать: сюда кладут код своей конфигурации |
УправлениеДоступомСлужебный и прочие …Служебный | по-разному | не использовать: меняются между версиями без предупреждения |
Внутри модуля контракт — только область ПрограммныйИнтерфейс. Служебные области — для самой библиотеки, а методы из УстаревшиеПроцедурыИФункции пока работают, но могут исчезнуть.
| Подсистема | Главные модули | Что брать вместо своего кода |
|---|---|---|
| Базовая функциональность | ОбщегоНазначения, ОбщегоНазначенияКлиент, ОбщегоНазначенияКлиентСервер, СтроковыеФункцииКлиентСервер | чтение реквизитов по ссылке, сообщения с привязкой к полю, безопасное хранилище паролей, проверка наличия подсистемы |
| Пользователи | Пользователи, ПользователиКлиент | текущий пользователь как ссылка на справочник, проверка ролей и полных прав |
| Управление доступом | УправлениеДоступом, УправлениеДоступомПереопределяемый | ограничение на уровне записей (RLS) по организациям, контрагентам, складам; профили групп доступа |
| Свойства | УправлениеСвойствами, УправлениеСвойствамиКлиент | дополнительные реквизиты и сведения без изменения структуры объекта |
| Дополнительные отчеты и обработки | ДополнительныеОтчетыИОбработки | подключение внешних отчётов, обработок и печатных форм без снятия с поддержки |
| Печать | УправлениеПечатью, УправлениеПечатьюКлиент | меню «Печать», предпросмотр, пакетная печать, сохранение и отправка по почте |
| Подключаемые команды | ПодключаемыеКоманды, ПодключаемыеКомандыКлиент, ПодключаемыеКомандыКлиентСервер | единый вывод на форму команд печати, отчётов, заполнения и создания на основании |
| Длительные операции | ДлительныеОперации, ДлительныеОперацииКлиент | фоновые задания с ожиданием результата и прогрессом |
| Обновление версии ИБ | ОбновлениеИнформационнойБазы | обработчики, которые переводят данные на новую версию конфигурации |
Самые востребованные вызовы — в базовой функциональности и подсистеме «Пользователи». Ниже серверный общий модуль с задачами, которые часто пишут вручную, хотя в библиотеке они уже решены.
// Общий модуль «ПримерыВызововБСП»: флаг «Сервер», флаг «Вызов сервера» не ставить.
// Методы сверены с программным интерфейсом БСП 3.1; большинство есть и в 2.3–2.4.
// Имена документов, реквизитов и ролей условные — подставьте свои.
#Область ПрограммныйИнтерфейс
// Несколько реквизитов одним запросом, без чтения объекта целиком.
Функция ШапкаДокумента(ДокументСсылка) Экспорт
Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДокументСсылка,
"Дата, Номер, Организация, Контрагент, Проведен");
КонецФункции
// Один запрос на массив ссылок одного типа вместо ЗначениеРеквизитаОбъекта в цикле.
// Возвращает Соответствие: ключ — ссылка, значение — организация.
Функция ОрганизацииДокументов(МассивСсылок) Экспорт
Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъектов(МассивСсылок, "Организация");
КонецФункции
// Вызов из ОбработкаПроверкиЗаполнения модуля документа:
// ПримерыВызововБСП.ПроверитьКонтрагента(ЭтотОбъект, Отказ).
// Проверяем данные объекта, а не ссылку: у нового документа ссылка ещё пустая.
Процедура ПроверитьКонтрагента(ДокументОбъект, Отказ) Экспорт
Если Не ЗначениеЗаполнено(ДокументОбъект.Контрагент) Тогда
// Сообщение появится у поля «Контрагент» формы, Отказ станет Истина.
ОбщегоНазначения.СообщитьПользователю(НСтр("ru = 'Не указан контрагент.'"),
ДокументОбъект, "Контрагент", , Отказ);
КонецЕсли;
КонецПроцедуры
// Истина, если доступна хотя бы одна из ролей или у пользователя полные права.
Функция МожноСогласовыватьЗаявки() Экспорт
Возврат Пользователи.РолиДоступны("СогласованиеЗаявокНаОплату");
КонецФункции
// Автор — ссылка на справочник «Пользователи», а не пользователь информационной базы.
Процедура ЗаполнитьАвтора(ДокументОбъект) Экспорт
Если Не ЗначениеЗаполнено(ДокументОбъект.Автор) Тогда
ДокументОбъект.Автор = Пользователи.ТекущийПользователь();
КонецЕсли;
КонецПроцедуры
// Необязательная подсистема: модуль компилируется и в конфигурации без «Свойств».
// Возвращает таблицу значений с колонками Свойство и Значение.
Функция ДополнительныеРеквизитыОбъекта(Ссылка) Экспорт
Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
Возврат Неопределено;
КонецЕсли;
МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
Возврат МодульУправлениеСвойствами.ЗначенияСвойств(Ссылка, Истина, Ложь);
КонецФункции
// Токены внешних сервисов — в безопасное хранилище, а не в реквизиты и не в код.
Процедура СохранитьТокенСервиса(Владелец, Токен) Экспорт
УстановитьПривилегированныйРежим(Истина);
ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(Владелец, Токен, "ТокенAPI");
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Функция ТокенСервиса(Владелец) Экспорт
УстановитьПривилегированныйРежим(Истина);
Токен = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Владелец, "ТокенAPI");
УстановитьПривилегированныйРежим(Ложь);
Возврат Токен;
КонецФункции
#КонецОбласти
ЗначенияРеквизитовОбъекта делает один запрос и возвращает структуру. Обращение через точку (Ссылка.Организация) заставляет платформу прочитать объект целиком.ЗначениеРеквизитаОбъектов обрабатывает массив ссылок одного типа одним запросом и возвращает соответствие. ЗначениеРеквизитаОбъекта в цикле — это запрос на каждую строку.СообщитьПользователю с объектом и именем поля покажет сообщение у поля «Контрагент» и установит Отказ. На клиенте есть такой же метод в ОбщегоНазначенияКлиент.Пользователи.РолиДоступны принимает имена ролей через запятую и возвращает Истина, если доступна хотя бы одна из них или у пользователя полные права. Платформенная РольДоступна про полные права ничего не знает.ПодсистемаСуществует + ОбщийМодуль — обращение к необязательной подсистеме. Прямой вызов УправлениеСвойствами не скомпилируется там, где «Свойств» нет; для тиражных доработок это обязательный приём.В БСП пользователь — элемент справочника «Пользователи». Для реквизитов «Автор» и «Ответственный» берите Пользователи.ТекущийПользователь() на сервере или ПользователиКлиент.ТекущийПользователь() на клиенте. Платформенный ПользователиИнформационнойБазы.ТекущийПользователь() вернёт объект платформы, а не ссылку на справочник. Если в базе есть внешние пользователи, нужен Пользователи.АвторизованныйПользователь(): он вернёт ссылку на пользователя или внешнего пользователя.
Права пользователям выдают не ролями напрямую, а через профили и группы доступа. Как устроены роли в конфигурации на БСП, разобрано в статье про роли в 1С, а настройка прав со стороны администратора — в материале о правах доступа.
Чтобы новый документ «Заявка на оплату» подчинялся тем же правилам, что и типовые (пользователь видит только заявки своих организаций), в БСП 3.0 и новее описывают ограничение в модуле менеджера и регистрируют объект:
// 1. Модуль менеджера документа «ЗаявкаНаОплату» (БСП 3.0+, универсальное ограничение).
// СтандартныеПодсистемы.УправлениеДоступом
// Параметры:
// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
Ограничение.Текст =
"РазрешитьЧтениеИзменение
|ГДЕ
| ЗначениеРазрешено(Организация)
| И ЗначениеРазрешено(Контрагент)";
КонецПроцедуры
// Конец СтандартныеПодсистемы.УправлениеДоступом
// 2. Общий модуль УправлениеДоступомПереопределяемый: процедура уже есть, добавьте строку.
Процедура ПриЗаполненииСписковСОграничениемДоступа(Списки) Экспорт
// ... строки, которые там уже есть ...
Списки.Вставить(Метаданные.Документы.ЗаявкаНаОплату, Истина);
КонецПроцедуры
Кроме того, в ролях на документ задают шаблон ограничения #ДляОбъекта(""), а виды доступа «Организации» и «Контрагенты» должны существовать (в типовых они есть). В БСП 2.x механизм другой — наборы значений доступа и шаблоны #ПоЗначениям.
Подсистема «Свойства» даёт пользователю добавить к объекту новое поле без конфигуратора. Своему объекту для этого нужны табличная часть ДополнительныеРеквизиты, предопределённый набор свойств и вызовы УправлениеСвойствами в обработчиках формы — их проще скопировать из типовой формы той же версии. Прочитать значения в коде помогут УправлениеСвойствами.ЗначенияСвойств и УправлениеСвойствами.ЗначениеСвойства. Пользовательская сторона описана в статье о дополнительных реквизитах.
Своя форма предпросмотра и кнопки не нужны: в модуле менеджера описывают команды и процедуру Печать, остальное делает подсистема.
// Модуль менеджера документа «ЗаявкаНаОплату», БСП 3.1.
// Макет ПФ_MXL_ЗаявкаНаОплату с областью «Шапка».
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
// СтандартныеПодсистемы.Печать
// Параметры:
// КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ЗаявкаНаОплату";
КомандаПечати.Представление = НСтр("ru = 'Заявка на оплату'");
КомандаПечати.Порядок = 10;
КонецПроцедуры
// БСП 3.1: без этой процедуры ДобавитьКомандыПечати не вызывается.
// Параметры:
// НастройкиОбъекта - см. УправлениеПечатью.НастройкиПечатиОбъекта
//
Процедура ПриОпределенииНастроекПечати(НастройкиОбъекта) Экспорт
НастройкиОбъекта.ПриДобавленииКомандПечати = Истина;
КонецПроцедуры
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ЗаявкаНаОплату") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,
"ЗаявкаНаОплату", НСтр("ru = 'Заявка на оплату'"),
ТабличныйДокументЗаявок(МассивОбъектов, ОбъектыПечати), ,
"Документ.ЗаявкаНаОплату.ПФ_MXL_ЗаявкаНаОплату");
КонецЕсли;
КонецПроцедуры
// Конец СтандартныеПодсистемы.Печать
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ТабличныйДокументЗаявок(МассивОбъектов, ОбъектыПечати)
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЗаявкаНаОплату";
Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.ЗаявкаНаОплату.ПФ_MXL_ЗаявкаНаОплату");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Заявка.Ссылка КАК Ссылка,
| Заявка.Номер КАК Номер,
| Заявка.Дата КАК Дата,
| Заявка.Организация КАК Организация,
| Заявка.Контрагент КАК Контрагент,
| Заявка.СуммаДокумента КАК СуммаДокумента
|ИЗ
| Документ.ЗаявкаНаОплату КАК Заявка
|ГДЕ
| Заявка.Ссылка В (&МассивОбъектов)";
Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если ТабличныйДокумент.ВысотаТаблицы > 0 Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
ОбластьШапка.Параметры.Заполнить(Выборка);
ТабличныйДокумент.Вывести(ОбластьШапка);
// Граница документа в пачке: нужна, чтобы печатать и отправлять документы по одному.
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент,
НомерСтрокиНачало, ОбъектыПечати, Выборка.Ссылка);
КонецЦикла;
Возврат ТабличныйДокумент;
КонецФункции
#КонецОбласти
#КонецЕсли
Затем объект регистрируют как источник команд печати. В БСП 2.3–3.0 для этого служит процедура УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати, в актуальных версиях 3.1 — ПриОпределенииНастроекПечати того же модуля:
// Общий модуль УправлениеПечатьюПереопределяемый (БСП 3.1):
// процедура уже есть, добавьте строку.
Процедура ПриОпределенииНастроекПечати(НастройкиПечати) Экспорт
// ... строки, которые там уже есть ...
НастройкиПечати.ОбъектыПечати.Добавить(Метаданные.Документы.ЗаявкаНаОплату);
КонецПроцедуры
Без процедуры ПриОпределенииНастроекПечати в модуле менеджера регистрация не сработает: команды в меню не появятся. Детали сверьте с описанием процедур в своей версии.
Команды попадают на форму через подсистему «Подключаемые команды». В модуль формы добавляют стандартный набор обработчиков:
// Модуль формы документа, вариант для БСП 3.1. Имена обработчиков — как в типовых формах.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// СтандартныеПодсистемы.ПодключаемыеКоманды
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
// СтандартныеПодсистемы.ПодключаемыеКоманды
// Пересчитывает видимость команд для открытого документа.
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
// СтандартныеПодсистемы.ПодключаемыеКоманды
ПодключаемыеКомандыКлиент.ПослеЗаписи(ЭтотОбъект, Объект, ПараметрыЗаписи);
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры
// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры
&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
В БСП 3.0 клиентский обработчик другой: ПодключаемыеКомандыКлиент.ВыполнитьКоманду плюс серверный Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат). Поэтому фрагмент берите из типовой формы своей конфигурации.
Если конфигурацию менять нельзя, печатную форму или обработку оформляют внешним файлом и подключают через «Дополнительные отчеты и обработки». В модуле такого файла обязательна функция СведенияОВнешнейОбработке(). Как создать сам файл, описано в статье про внешние обработки.
.cf библиотеки. Отметки для объектов, перечисленных в инструкции, поправьте вручную.ПодсистемыКонфигурацииПереопределяемый.ПриДобавленииПодсистем подключите модуль своей конфигурации с её именем и версией. Проверьте, что в свойствах конфигурации заданы «Имя» и «Версия».// СтандартныеПодсистемы.Печать … // Конец СтандартныеПодсистемы.Печать находятся поиском; после обновления сверьте их с демонстрационной конфигурацией.ПриДобавленииПодсистемы модуля обновления конфигурации. Не увеличили версию — новый обработчик не выполнится. Исключение — обработчики с версией "*", они запускаются при каждом обновлении.Серверный модуль на клиенте. Вызов ОбщегоНазначения из процедуры &НаКлиенте даёт ошибку компиляции «Переменная не определена (ОбщегоНазначения)». Серверную часть выносят в функцию &НаСервереБезКонтекста:
&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
// Так нельзя: «Переменная не определена (ОбщегоНазначения)».
// ИНН = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Контрагент, "ИНН");
Если ЗначениеЗаполнено(Объект.Контрагент) Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю("ИНН: " + ИННКонтрагента(Объект.Контрагент));
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ИННКонтрагента(Контрагент)
Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Контрагент, "ИНН");
КонецФункции
НастройкиПечати.ОбъектыПечати или в модуле менеджера нет ПриОпределенииНастроекПечати. Во втором случае возможна ошибка «Метод объекта не обнаружен (ПриОпределенииНастроекПечати)».…Служебный и правки внутри БСП. После обновления метод переименуют или удалят, а правку затрёт объединение.РольДоступна вместо Пользователи.РолиДоступны. Администратор с полными правами не видит кнопку, хотя должен.ЗначениеРеквизитаОбъекта там, где включено ограничение на уровне записей. Если пользователь может не иметь доступа к объекту, передайте третьим параметром ВыбратьРазрешенные = Истина: для недоступной записи вернётся Неопределено вместо исключения.ПодключаемыеКоманды.ПриСозданииНаСервере или вызовов УправлениеСвойствами ошибки не будет — просто пропадут меню «Печать» или поля дополнительных реквизитов.В конфигураторе откройте общий модуль СтандартныеПодсистемыСервер и найдите функцию ВерсияБиблиотеки: она возвращает номер строкой, например «3.1.x.y». Из кода — тот же вызов СтандартныеПодсистемыСервер.ВерсияБиблиотеки().
Да, библиотека для этого и выпускается, на ней построены и многие отраслевые решения партнёров. Условия распространения указаны в материалах поставки — прочитайте их до начала тиражной разработки.
Нет. Версия библиотеки в Бухгалтерии, УТ или ERP определяется релизом самой конфигурации. Более новая БСП поверх типовой почти наверняка окажется несовместимой с её модулями.
Расширение видит общие модули основной конфигурации и может вызывать их программный интерфейс. Встроиться в переопределяемую процедуру можно аннотацией &После, не снимая конфигурацию с поддержки. Это основной способ дорабатывать типовые на БСП.
Внедрение БСП в свою конфигурацию, перенос доработок на новую версию библиотеки, ограничение доступа по организациям — задачи, где ошибки вылезают уже у пользователей. Если разбираться некогда, опишите задачу на 1c-only.ru: оценка бесплатная, ответ в течение рабочего дня. Направления работ перечислены на странице услуг по доработке 1С, отдельно — настройка прав доступа.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.