Глобальный контекст.МонопольныйРежим

Методы · ExclusiveMode

Определяет, используется ли в данный момент монопольный режим работы с информационной базой.

Синтаксис

МонопольныйРежим()

Примеры платформы

Если МонопольныйРежим() Тогда
Иначе
    Предупреждение(НСтр("ru = 'Для выполнения обработки необходим монопольный режим!';
        | en = 'Exclusive mode is needed in order to execute the processing!'"), 10);
КонецЕсли;
Полное описание, параметры и ограничения

Глобальный контекст.МонопольныйРежим (Global context.ExclusiveMode)

Глобальный контекст (Global context)

МонопольныйРежим (ExclusiveMode)

Доступен, начиная с версии 8.0.

Синтаксис:
МонопольныйРежим()
Возвращаемое значение:
Тип: Булево.
Истина - монопольная блокировка была установлена на текущую область данных сеанса или текущая область данных является подобластью монопольно заблокированной этим же сеансом области; Ложь - в противном случае.
Для режима запуска "Мобильное приложение (сервер)" результат всегда Истина.
Описание:

Определяет, используется ли в данный момент монопольный режим работы с информационной базой.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.

Пример:

Если МонопольныйРежим() Тогда
// Выполнить обработку

Иначе
Предупреждение(НСтр("ru = 'Для выполнения обработки необходим монопольный режим!';
| en = 'Exclusive mode is needed in order to execute the processing!'"), 10);
КонецЕсли;

См. также:
Глобальный контекст, метод УстановитьМонопольныйРежим

Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

Свой встроенный binary-store: шесть фаз политики, реальные own пакеты и проверка содержимого

Не формальные setters: полностью собственная новая client-server IB, единственный каталог и шесть собственных4..16KiB payload. Настройки native manager отдельно от ХранилищеЗначения, четыре placement enum, ReadOnly сохраняет IB writes и scoped native database+storage size. Никаких S3/upload/backup/restore/очисток.

Где и как запускать

Полный серверный server-call общий модуль УчебныеДвоичные85. Только own new client-server localhost:1541/ref UUID IB на8.5.1.1343, один actual administrator, one catalog/three exact fields, manual optimized-storage prerequisite;6real own records. CLIENT отдельно full managed form module.

Подготовка

  1. Сначала вручную подготовьте отдельную новую client-server учебную базу на своей локальной VM/своем localhost:1541 cluster, не копию production и не общий сервер. Выберите вариант установленной8.5.1.1343, где native GetBinaryDataStorageAvailability=True. Если он False, урок честно отказывает; не обходите edition/license ограничения.

  2. Сами создайте новый canonical nonzero UUID marker и зарегистрируйте только собственную IB с Ref=Уч85Двоичные_<UUID>. В списке баз задайте строку строго Srvr="localhost:1541";Ref="Уч85Двоичные_<UUID>";. Метод ConnectionString возвращает как зарегистрировано: другой порядок/порт/пробелы/дополнительные параметры даже своего адреса безопасно отвергаются. UUID-marker имени не является realIBUUID; строка соединения никогда не выводится.

  3. Конфигуратор → новая конфигурация → имя УчебныеДвоичные85. Никаких типовых справочников/документов/регистров/внешних источников/подписок/регламентных заданий/общих реквизитов/расширений. Встроенное storage изначально Запретить, native состав пуст, внешних storage0. Код не приспосабливает существующую рабочую базу.

  4. Конфигуратор → Справочники → Добавить → УчебныеПакеты85, Иерархический=Нет, код строковый36, Автонумерация=Нет, наименование100. Добавьте ровно три реквизита: КлючОпыта Строка36, Фаза Число(2,0) неотрицательное, Данные ХранилищеЗначения единственного типа. Табличных частей0, модуль объекта/обработчики записи пустые. Это вручную создаваемая собственная учебная metadata schema, не реально внесенные автором изменения.

  5. Создайте ровно одного собственного реального пользователя IB Уч85Двоичные_<тот жеUUIDmarker>, с уникальным actualIBUUID, административными правами и правом монопольного режима только в этой учебной базе. CurrentUser и списокactualIBUsers проверяются. Никакого privileged impersonation/сервисных пользователей/установленных разделителей нет; права контролирует native платформа.

  6. Обязательная отдельная ручная подготовка администратора: предварительно включите оптимизированное хранение двоичных данных в БД способом, документированным именно для вашей установленной поставки8.5.1.1343/ее средства администрирования. Native SetDataCopiesPlacementMode прямо требует его и иначе выдает ОшибкаСоединенияСБазойДанных. В экспортированной native справке не найден BSLsetter этой настройки; здесь не выдумывается его имя, CLIflag или меню. Если эта prerequisite не подтверждена владельцем стенда по документации своей поставки — не запускайте опыт. Данная предварительная настройка не заменяет включение встроенного storage менеджером.

  7. Конфигуратор → Общие → Общие модули → УчебныеДвоичные85: Сервер/Вызов сервера=Да, Клиент/Привилегированный/Глобальный=Нет. Вставьте SERVER целиком. Storage manager только сервер; наличие глобального size-метода на клиенте не переносит native setters в client context.

  8. Создайте свою внешнюю обработку с управляемой формой, строковыми реквизитами МеткаСвоейБазы36 и Подтверждение100 и командой ВыполнитьОпыт. Вставьте supporting CLIENT целиком. Никакого автостарта/HTTP/UI upload/file dialogs или фонового расписания нет.

  9. Войдите под единственным своим администратором, закройте прочие свои сеансы, конфигуратор и фоновые задания. Native exclusive lock устанавливается только если возможно; чужие сеансы не завершаются и блокировки не снимаются принудительно. Общих реквизитов нет, поэтому области разделения не заданы.

  10. Перед запуском каталог пуст, режим storage Запретить, состав0, external storage0. Введите свой marker и сначала неправильное подтверждение: данные не должны создаться. Затем сознательно введите СВОЙ ПУСТОЙ СТЕНД ДВОИЧНЫЕ85 и нажмите один раз. После ошибки/обрыва не повторяйте: собственные настройки/записи могли сохраниться частично.

  11. Опыт создаст новый ownnonce и six real own catalog objects. Payload формируется только из nonce/номерафазы/256строк книги3×250=750 в памяти, UTF8 безBOM, bounded4..16KiB, ValueStorage безcompression. Ни чужие файлы, ни произвольный client payload/metadataID/SQL не принимаются.

  12. Фазы1..4 последовательно устанавливают четыре native placement mode и проверяют getter, затем реально записывают новый own object и читают отдельно через real saved ref.GetObject/ValueStorage.Get. Проверяются own passport/тип/размер/SHA256. РежимCopyOnRead может копировать при чтении: такой read не обещан физически read-only; созданные свои storage copies не являются backup files.

  13. Фаза5 устанавливает storage.ТолькоЧтение и все равно пишет еще один actual IBobject: native это разрешает и направляет новые binary values в БД. Фаза6 снова ReadAndWrite, но composition.DontUse только для own attribute, и еще одна real IBwrite/read. Состав берет actual metadata реквизита, не каталог целиком, не string и не runtime ValueStorage.

  14. Все шесть сохраненных own objects затем повторно читаются/хешируются. Size API вызывается с пустым search-area array и include=[actual own catalog metadata], exclude=[]: не вся база и не все разделители. Результат — совокупные table+storage bytes, не суммаpayload/размерbackup/списокblob location; величина после не обязана равняться6×payload или строго возрастать.

  15. На успешном завершении настройки сознательно остаются enabled/ReadAndWrite/default=false/threshold2048/composition.Use own attribute/CopyOnWrite, а свои шесть записей сохраняются. Не выключайте storage/не удаляйте его физические файлы: это не миграция оставшихся blobs обратно в БД. Exclusive0→1→0 принадлежит только этому сеансу; при ошибке снимается лишь собственная блокировка, если native снятие завершилось, без автоматического rollback policy/data.

  16. Нельзя проверять failover остановкой production/локального storage process, менять внешние storage, делать backup/restore/ClearUnusedSpace или удалять файлы. Авторские проверки статические/native; реальная 1С/cluster/SQL/storage/UI/files/network не запускались и никаких backups не создано.

Функция ВыполнитьСвойОпытДвоичных85(МеткаСвоейБазы, Подтверждение) Экспорт
    ПроверитьСвоюБазуДвоичных85(МеткаСвоейБазы);
    Если Подтверждение <> "СВОЙ ПУСТОЙ СТЕНД ДВОИЧНЫЕ85" Тогда
        ВызватьИсключение "Настройки собственного хранилища и данные не изменены";
    КонецЕсли;
    Если МонопольныйРежим() Или ПривилегированныйРежим() Тогда
        ВызватьИсключение "Чужой монопольный/привилегированный контекст не принимается";
    КонецЕсли;
    Выборка = Справочники.УчебныеПакеты85.Выбрать();
    Если Выборка.Следующий() Тогда
        ВызватьИсключение "Свой новый каталог уже содержит данные; повтор запрещен";
    КонецЕсли;
    Если Не ХранилищеДвоичныхДанных.ПолучитьДоступностьХранилищаДвоичныхДанных() Тогда
        ВызватьИсключение "Этот вариант платформы не поддерживает встроенное binary-store. Опыт не запускается";
    КонецЕсли;
    Если ХранилищеДвоичныхДанных.ПолучитьРежимИспользованияХранилищаДвоичныхДанных() <> РежимИспользованияХранилищаДвоичныхДанных.Запретить
        Или ХранилищеДвоичныхДанных.ПолучитьСоставХранимыхДанных().Количество() <> 0
        Или ВнешниеХранилищаДвоичныхДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен новый own стенд с выключенным встроенным storage, пустым составом и без внешних storage";
    КонецЕсли;
    КлючОпыта = Строка(Новый УникальныйИдентификатор);
    Протокол = Новый Массив;
    РазмерДо = ПолучитьРазмерТолькоСвоегоКаталога85();
    Попытка
        УстановитьМонопольныйРежим(Истина);
        Если Не МонопольныйРежим() Тогда
            ВызватьИсключение "Монопольный доступ собственного сеанса не подтвержден";
        КонецЕсли;
        ПроверитьСвоюБазуДвоичных85(МеткаСвоейБазы);
        Выборка = Справочники.УчебныеПакеты85.Выбрать();
        Если Выборка.Следующий() Или ВнешниеХранилищаДвоичныхДанных.Количество() <> 0
            Или ХранилищеДвоичныхДанных.ПолучитьРежимИспользованияХранилищаДвоичныхДанных() <> РежимИспользованияХранилищаДвоичныхДанных.Запретить
            Или ХранилищеДвоичныхДанных.ПолучитьСоставХранимыхДанных().Количество() <> 0 Тогда
            ВызватьИсключение "После own exclusive получения начальное пустое состояние изменилось; ничего не перенастраиваем";
        КонецЕсли;
        ХранилищеДвоичныхДанных.УстановитьРежимИспользованияХранилищаДвоичныхДанных(РежимИспользованияХранилищаДвоичныхДанных.Разрешить);
        Если ХранилищеДвоичныхДанных.ПолучитьРежимИспользованияХранилищаДвоичныхДанных() <> РежимИспользованияХранилищаДвоичныхДанных.Разрешить Тогда
            ВызватьИсключение "Own enabled mode не подтвержден";
        КонецЕсли;
        ХранилищеДвоичныхДанных.УстановитьМинимальныйРазмерЗаписываемыхДанных(1024);
        Если ХранилищеДвоичныхДанных.ПолучитьМинимальныйРазмерЗаписываемыхДанных() <> 2048 Тогда
            ВызватьИсключение "Native clamp минимального порога1024→2048 не подтвердился";
        КонецЕсли;
        ХранилищеДвоичныхДанных.УстановитьМинимальныйРазмерЗаписываемыхДанных(2048);
        ХранилищеДвоичныхДанных.УстановитьРежимЧтенияЗаписиХранилищаДвоичныхДанных(РежимЧтенияЗаписиХранилищаДвоичныхДанных.ЧтениеИЗапись);
        Если ХранилищеДвоичныхДанных.ПолучитьРежимЧтенияЗаписиХранилищаДвоичныхДанных() <> РежимЧтенияЗаписиХранилищаДвоичныхДанных.ЧтениеИЗапись Тогда
            ВызватьИсключение "Own storage read/write не подтвержден";
        КонецЕсли;
        ХранилищеДвоичныхДанных.УстановитьИспользованиеКакХранилищаПоУмолчанию(Истина);
        Если Не ХранилищеДвоичныхДанных.ПолучитьИспользованиеКакХранилищаПоУмолчанию() Тогда
            ВызватьИсключение "Own default=true не подтвержден";
        КонецЕсли;
        ХранилищеДвоичныхДанных.УстановитьИспользованиеКакХранилищаПоУмолчанию(Ложь);
        Если ХранилищеДвоичныхДанных.ПолучитьИспользованиеКакХранилищаПоУмолчанию() Тогда
            ВызватьИсключение "Own default=false не подтвержден";
        КонецЕсли;
        УстановитьТолькоСвойСостав85(ИспользованиеХраненияВХранилищеДвоичныхДанных.Использовать);
        Режимы = Новый Массив;
        Режимы.Добавить(РежимРазмещенияКопийДанныхВХранилищеДвоичныхДанных.РазмещениеКопийДанныхВХранилищеПриЗаписиВБазуДанных);
        Режимы.Добавить(РежимРазмещенияКопийДанныхВХранилищеДвоичныхДанных.РазмещениеКопийДанныхВХранилищеПриЧтенииИзБазыДанных);
        Режимы.Добавить(РежимРазмещенияКопийДанныхВХранилищеДвоичныхДанных.РазмещениеДанныхТолькоВХранилище);
        Режимы.Добавить(РежимРазмещенияКопийДанныхВХранилищеДвоичныхДанных.РазмещениеДанныхВХранилищеИВБазеДанныхПриНедоступностиХранилища);
        Для Номер = 0 По Режимы.Количество() - 1 Цикл
            Режим = Режимы[Номер];
            Если ТипЗнч(Режим) <> Тип("РежимРазмещенияКопийДанныхВХранилищеДвоичныхДанных") Тогда
                ВызватьИсключение "Нужен настоящий native enum placement mode";
            КонецЕсли;
            ХранилищеДвоичныхДанных.УстановитьРежимРазмещенияКопийДанныхВХранилищеДвоичныхДанных(Режим);
            Если ХранилищеДвоичныхДанных.ПолучитьРежимРазмещенияКопийДанныхВХранилищеДвоичныхДанных() <> Режим Тогда
                ВызватьИсключение "Placement-mode own roundtrip не совпал. Проверьте ручную предварительную optimized-storage настройку своей базы";
            КонецЕсли;
            Протокол.Добавить(ЗаписатьИПрочитатьСвойПакет85(КлючОпыта, Номер + 1, Строка(Режим)));
        КонецЦикла;
        ХранилищеДвоичныхДанных.УстановитьРежимРазмещенияКопийДанныхВХранилищеДвоичныхДанных(
            РежимРазмещенияКопийДанныхВХранилищеДвоичныхДанных.РазмещениеКопийДанныхВХранилищеПриЗаписиВБазуДанных);
        ХранилищеДвоичныхДанных.УстановитьРежимЧтенияЗаписиХранилищаДвоичныхДанных(РежимЧтенияЗаписиХранилищаДвоичныхДанных.ТолькоЧтение);
        Если ХранилищеДвоичныхДанных.ПолучитьРежимЧтенияЗаписиХранилищаДвоичныхДанных() <> РежимЧтенияЗаписиХранилищаДвоичныхДанных.ТолькоЧтение Тогда
            ВызватьИсключение "Storage read-only mode отдельно не подтвержден";
        КонецЕсли;
        Протокол.Добавить(ЗаписатьИПрочитатьСвойПакет85(КлючОпыта, 5, "StorageReadOnly: IB write permitted"));
        ХранилищеДвоичныхДанных.УстановитьРежимЧтенияЗаписиХранилищаДвоичныхДанных(РежимЧтенияЗаписиХранилищаДвоичныхДанных.ЧтениеИЗапись);
        УстановитьТолькоСвойСостав85(ИспользованиеХраненияВХранилищеДвоичныхДанных.НеИспользовать);
        Протокол.Добавить(ЗаписатьИПрочитатьСвойПакет85(КлючОпыта, 6, "Own metadata attribute: DontUse"));
        УстановитьТолькоСвойСостав85(ИспользованиеХраненияВХранилищеДвоичныхДанных.Использовать);
        Если ХранилищеДвоичныхДанных.ПолучитьРежимИспользованияХранилищаДвоичныхДанных() <> РежимИспользованияХранилищаДвоичныхДанных.Разрешить
            Или ХранилищеДвоичныхДанных.ПолучитьМинимальныйРазмерЗаписываемыхДанных() <> 2048
            Или ХранилищеДвоичныхДанных.ПолучитьИспользованиеКакХранилищаПоУмолчанию()
            Или ХранилищеДвоичныхДанных.ПолучитьРежимЧтенияЗаписиХранилищаДвоичныхДанных() <> РежимЧтенияЗаписиХранилищаДвоичныхДанных.ЧтениеИЗапись
            Или ХранилищеДвоичныхДанных.ПолучитьРежимРазмещенияКопийДанныхВХранилищеДвоичныхДанных()
                <> РежимРазмещенияКопийДанныхВХранилищеДвоичныхДанных.РазмещениеКопийДанныхВХранилищеПриЗаписиВБазуДанных Тогда
            ВызватьИсключение "Согласованная own final policy отдельно не подтверждена";
        КонецЕсли;
        ПроверитьВсеСвоиШестьПакетов85(КлючОпыта);
        РазмерПосле = ПолучитьРазмерТолькоСвоегоКаталога85();
        Если Протокол.Количество() <> 6 Или РазмерПосле < 0 Тогда
            ВызватьИсключение "Own report ограничен шестью фазами и неотрицательным native size";
        КонецЕсли;
    Исключение
        Если МонопольныйРежим() Тогда
            УстановитьМонопольныйРежим(Ложь);
        КонецЕсли;
        ВызватьИсключение "Own опыт мог оставить настройки/данные частично. Монопольная блокировка снята, если native снятие завершилось; режимов/данных автоматически не откатываем, запуск не повторять";
    КонецПопытки;
    УстановитьМонопольныйРежим(Ложь);
    Если МонопольныйРежим() Тогда
        ВызватьИсключение "Own exclusive lock не снята; не объявляем завершение";
    КонецЕсли;
    Возврат Новый Структура("Ключ,Фазы,РазмерДо,РазмерПосле", КлючОпыта, Протокол, РазмерДо, РазмерПосле);
КонецФункции

Процедура УстановитьТолькоСвойСостав85(Хранение)
    Если Не МонопольныйРежим() Или ВнешниеХранилищаДвоичныхДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен собственный exclusive-сеанс без других storage";
    КонецЕсли;
    Состав = Новый СоставХранимыхДанныхХранилищаДвоичныхДанных;
    Состав.Добавить(Метаданные.Справочники.УчебныеПакеты85.Реквизиты.Данные, Хранение);
    ХранилищеДвоичныхДанных.УстановитьСоставХранимыхДанных(Состав);
    СвежийСостав = ХранилищеДвоичныхДанных.ПолучитьСоставХранимыхДанных();
    Если СвежийСостав.Количество() <> 1 Тогда
        ВызватьИсключение "Own состав должен содержать ровно один собственный attribute";
    КонецЕсли;
    Элемент = СвежийСостав.Получить(0);
    Если Элемент.Метаданные <> Метаданные.Справочники.УчебныеПакеты85.Реквизиты.Данные Или Элемент.Хранение <> Хранение Тогда
        ВызватьИсключение "Состав вернулся с чужим metadata или неправильным location flag";
    КонецЕсли;
КонецПроцедуры

Функция ЗаписатьИПрочитатьСвойПакет85(КлючОпыта, Фаза, Режим)
    Если Не МонопольныйРежим() Или Фаза < 1 Или Фаза > 6 Тогда
        ВызватьИсключение "Own payload создается только в шести фазах одного своего exclusive опыта";
    КонецЕсли;
    Данные = ПолучитьСвойPayload85(КлючОпыта, Фаза);
    Элемент = Справочники.УчебныеПакеты85.СоздатьЭлемент();
    Элемент.Код = Строка(Новый УникальныйИдентификатор);
    Элемент.Наименование = КлючОпыта + "|" + Строка(Фаза);
    Элемент.КлючОпыта = КлючОпыта;
    Элемент.Фаза = Фаза;
    Элемент.Данные = Новый ХранилищеЗначения(Данные);
    Элемент.Записать();
    Свежий = Элемент.Ссылка.ПолучитьОбъект();
    ПроверитьСвойПакет85(Свежий, КлючОпыта, Фаза);
    Возврат Новый Структура("Фаза,Режим,БайтовPayload,ХешPayload,Ссылка", Фаза, Режим, Данные.Размер(),
        Base64Строка(ХешироватьСвойPayload85(Данные)), Строка(Свежий.Ссылка));
КонецФункции

Функция ПолучитьСвойPayload85(КлючОпыта, Фаза)
    UUIDКлюча = Новый УникальныйИдентификатор(КлючОпыта);
    Если КлючОпыта <> Строка(UUIDКлюча) Или UUIDКлюча = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")
        Или Фаза < 1 Или Фаза > 6 Тогда
        ВызватьИсключение "Нужен собственный canonical nonzero nonce и phase1..6";
    КонецЕсли;
    Текст = КлючОпыта + "|" + Строка(Фаза) + "|";
    Для Номер = 1 По 256 Цикл
        Текст = Текст + Строка(Номер) + ":Книга3×250=750;";
    КонецЦикла;
    Данные = ПолучитьДвоичныеДанныеИзСтроки(Текст, КодировкаТекста.UTF8, Ложь);
    Если Данные.Размер() < 4096 Или Данные.Размер() > 16384 Тогда
        ВызватьИсключение "Own bounded binary payload должен быть4..16KiB без чтения файлов";
    КонецЕсли;
    Возврат Данные;
КонецФункции

Функция ХешироватьСвойPayload85(Данные)
    Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
    Хеширование.Добавить(Данные);
    Возврат Хеширование.ХешСумма;
КонецФункции

Процедура ПроверитьСвойПакет85(Свежий, КлючОпыта, Фаза)
    Если Свежий = Неопределено Или Свежий.КлючОпыта <> КлючОпыта Или Свежий.Фаза <> Фаза
        Или Свежий.Наименование <> КлючОпыта + "|" + Строка(Фаза) Или Свежий.ПометкаУдаления
        Или ТипЗнч(Свежий.Данные) <> Тип("ХранилищеЗначения") Тогда
        ВызватьИсключение "Actual own object passport не совпал";
    КонецЕсли;
    Прочитанные = Свежий.Данные.Получить();
    Ожидаемые = ПолучитьСвойPayload85(КлючОпыта, Фаза);
    Если ТипЗнч(Прочитанные) <> Тип("ДвоичныеДанные") Или Прочитанные.Размер() <> Ожидаемые.Размер()
        Или Base64Строка(ХешироватьСвойPayload85(Прочитанные)) <> Base64Строка(ХешироватьСвойPayload85(Ожидаемые)) Тогда
        ВызватьИсключение "Actual own fresh payload length/SHA256 не совпал";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьВсеСвоиШестьПакетов85(КлючОпыта)
    Выборка = Справочники.УчебныеПакеты85.Выбрать();
    Фазы = Новый Массив;
    Пока Выборка.Следующий() Цикл
        Если Фазы.Количество() >= 6 Или Выборка.КлючОпыта <> КлючОпыта Или Фазы.Найти(Выборка.Фаза) <> Неопределено Тогда
            ВызватьИсключение "В своем sole catalog есть чужие/дублированные/лишние данные";
        КонецЕсли;
        ПроверитьСвойПакет85(Выборка.Ссылка.ПолучитьОбъект(), КлючОпыта, Выборка.Фаза);
        Фазы.Добавить(Выборка.Фаза);
    КонецЦикла;
    Если Фазы.Количество() <> 6 Тогда
        ВызватьИсключение "Own six phases после финальной настройки не подтвердились";
    КонецЕсли;
КонецПроцедуры

Функция ПолучитьРазмерТолькоСвоегоКаталога85()
    Включить = Новый Массив;
    Включить.Добавить(Метаданные.Справочники.УчебныеПакеты85);
    Размер = ПолучитьРазмерДанныхБазыДанныхИХранилищаДвоичныхДанных(Новый Массив, Включить, Новый Массив);
    Если ТипЗнч(Размер) <> Тип("Число") Или Размер < 0 Тогда
        ВызватьИсключение "Native size собственных таблиц+storage должен быть неотрицательным числом байтов";
    КонецЕсли;
    Возврат Размер;
КонецФункции

Процедура ПроверитьСвоюБазуДвоичных85(МеткаСвоейБазы)
    ПроверитьСвойПустойСтенд();
    UUIDМетки = Новый УникальныйИдентификатор(МеткаСвоейБазы);
    Если МеткаСвоейБазы <> Строка(UUIDМетки) Или UUIDМетки = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда
        ВызватьИсключение "Own ref marker должен быть каноническим ненулевым UUID, не realIBUUID";
    КонецЕсли;
    ОжидаемоеСоединение = "Srvr=""localhost:1541"";Ref=""Уч85Двоичные_" + МеткаСвоейБазы + """;";
    Если СтрокаСоединенияИнформационнойБазы() <> ОжидаемоеСоединение Тогда
        ВызватьИсключение "Допускается только exact own localhost:1541/ref connection, без file/prod/других параметров. Строка соединения не выводится";
    КонецЕсли;
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если Пользователи.Количество() <> 1 Или Текущий = Неопределено Тогда
        ВызватьИсключение "Нужен единственный real собственный IBUser";
    КонецЕсли;
    Если Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор
        Или Текущий.Имя <> "Уч85Двоичные_" + МеткаСвоейБазы Тогда
        ВызватьИсключение "Real current own IBUser не подтвержден";
    КонецЕсли;
    Мета = Метаданные.Справочники.УчебныеПакеты85;
    Если Мета.Имя <> "УчебныеПакеты85" Или Мета.Иерархический Или Мета.ТабличныеЧасти.Количество() <> 0
        Или Мета.Реквизиты.Количество() <> 3 Или Метаданные.Боты.Количество() <> 0
        Или Метаданные.Константы.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0
        Или Мета.Реквизиты.Данные.Тип.Типы().Количество() <> 1
        Или Мета.Реквизиты.КлючОпыта.Тип.Типы().Количество() <> 1 Или Мета.Реквизиты.Фаза.Тип.Типы().Количество() <> 1
        Или Не Мета.Реквизиты.Данные.Тип.СодержитТип(Тип("ХранилищеЗначения"))
        Или Не Мета.Реквизиты.КлючОпыта.Тип.СодержитТип(Тип("Строка"))
        Или Не Мета.Реквизиты.Фаза.Тип.СодержитТип(Тип("Число")) Тогда
        ВызватьИсключение "Нужна только own exact catalog schema с тремя реквизитами и без разделителей/служебных данных опыта";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 1 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры
Полный модуль собственной управляемой формы: one-shot запуск и bounded отчет

Собственная внешняя обработка → Управляемая форма → Модуль формы.

Модуль управляемой формы, клиент только выводит own отчет; native storage setters и ValueStorage ctor остаются серверными.

Перем ОпытНачат85;

&НаКлиенте
Процедура ВыполнитьОпыт(Команда)
    Если ОпытНачат85 = Истина Тогда
        ВызватьИсключение "Повтор запрещен: storage policy/свои записи могли уже измениться";
    КонецЕсли;
    ОпытНачат85 = Истина;
    Протокол = ВыполнитьНаСервере85();
    Сообщить("Own nonce: " + Протокол.Ключ + "; шесть фаз проверены чтением/SHA256. Это не physical-placement proof");
    Для Каждого Фаза Из Протокол.Фазы Цикл
        Сообщить("Фаза " + Строка(Фаза.Фаза) + ": " + Фаза.Режим + "; own payload " + Строка(Фаза.БайтовPayload) + "байт; SHA256(base64)=" + Фаза.ХешPayload);
    КонецЦикла;
    Сообщить("Размер только своего каталога, native tables+storage bytes: до=" + Строка(Протокол.РазмерДо) + ", после=" + Строка(Протокол.РазмерПосле));
    Сообщить("Это не размер отдельных физически размещенных blobs/backup и не тест отказоустойчивости. Own записи сохранены, storage оставлен включенным; exclusive lock снята");
КонецПроцедуры

&НаСервере
Функция ВыполнитьНаСервере85()
    Возврат УчебныеДвоичные85.ВыполнитьСвойОпытДвоичных85(МеткаСвоейБазы, Подтверждение);
КонецФункции

Разбор по шагам

  1. До изменений guard проверяет exactCF/version, one local client-server Ref/marker, one actualIBUser, three typed own catalog fields, отсутствие других данных/разделителей/расширений и externalstores0.

  2. Административные действия отличаются от ValueStorage constructor: только native глобальный ХранилищеДвоичныхДанных manager изменяет настройки всей собственной базы. ValueStorage хранит значение и сам не выбирает физический сервер/путь.

  3. Exclusive context первоначально0, затем native1 внутри Try и последовательно0 success/catch. Native невозможность установки не обходится termination чужих сеансов.

  4. Enable создает storage при отсутствии, threshold1024 clamps2048 и это подтверждается getter; default true/false переключается только пока свой каталог пуст, затем own attribute composition explicitly controls записи.

  5. Placement enum четырех фаз readonly/native, свойства не присваиваются. Каждый setter имеет настоящий аргумент нужного типа и отдельный getter; missing optimized prerequisite не подменяется invented setter.

  6. Six own records имеют реальные сохраненные ссылки, own nonce/phase/name, binary data4..16KiB и свежие проверенныеSHA256. StandardCode новый UUID — собственный код, не fake reference identity.

  7. Native ReadOnly не приводит к учебному ожиданию исключения при IBwrite: пятая запись успешно читается в собственномpreparedruntime. Это native-described behavior, не измеренная нами запись физическихDB страниц.

  8. Composition содержит actual own Данные attribute и useflag. Возвращаемые Item.Metadata/Location readonly только сверяются. Objects already mapped другим storage native rejects; ownfixtureexternal0/emptycomposition это исключает в подготовке, не подменяет migration.

  9. Scoped size uses3native arguments and onlyownmetadata include. Не заявляется равенствоphysicalbytes=payloadbytes, storegrowth, отказоустойчивость или runtime вашего сервера.

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

  1. Actual own six saved refs после записи читаются отдельно; паспорта,4..16KiB размеры иSHA256 совпадают для всех фаз, включая ReadOnly/DontUse.

  2. После native exclusive acquisition заново проверяется пустой own каталог/disabled storage/emptycomposition/external0 до первой мутации, чтобы предварительное чтение не стало ошибочной защитой от изменения состояния.

  3. SetMinWrite1024 подтвердил native2048 clamp. Все четыре placement getter совпали с заданными native enum, финальный storage enabled/ReadAndWrite/defaultfalse/owncomposition.Use.

  4. Фаза5 IBwrite не ожидает исключения: exact native ReadOnly page прямо разрешает сохранение новыхbinarydata вБД независимо от включенияstore.

  5. Scope размера явно own catalog через include metadata, search=[]/exclude=[]; возвращены числабайтов, не полныетаблицы чужойбазы или обещанное равенствоpayloadbytes.

  6. Exclusive lock принадлежит только своему сеансу и снимаетсяsuccess/catch, еслиnative release успешен; policy/данные не объявляются откатившимися при ошибке.

Ожидаемый результат

При самостоятельном успешном запуске полностью подготовленного собственного стенда отчет содержит6фаз, реальные ownpayload размеры/SHA256 и scoped native table+storage bytes до/после. Все6own records сохранены, финальная policy оставленаenabled, exclusive снята. Проверка содержимого не доказывает физическое размещение каждого байта/failover. Здесь runtime0, не живой результат вашей базы.

На что обратить внимание

  1. У менеджера нет native constructor: он доступен через readonly глобальное свойство ХранилищеДвоичныхДанных, только на сервере. Не присваивайте глобальное свойство и не создавайте Новый МенеджерХранилищаДвоичныхДанных.

  2. Client-server/local/address marker иmetadata guard — страховки, не доказательство ownership чужого server instance. Новый собственный выделенный кластер/IB по подготовке обязателен.

  3. SupportAvailability говорит о поддержке варианта платформы, не successful storage connectivity/current mode/optimizedDB. Ее True не доказывает все prerequisites.

  4. Native placement setter требует optimized DB binary storage, которое готовит владелец по точной своей документации. Здесь BSLsetter/CLIflag отсутствует честно; при неподтвержденной prerequisite опыт не готов к запуску.

  5. MinSize1024 не является допустимым физическим порогом: native clamps к2048. Payload bound и ValueStorage безcompression позволяют не ошибиться на меньшемcompressed value, но точный serialized overhead не измерялся.

  6. ReadOnly storage не делает IB/каталог readonly: writes идут в БД. Не превращайте режим в access-control или защиту документов от записи.

  7. CopyOnWrite хранит данные в storage и служебной таблице; CopyOnRead пишет в служебную таблицу и синхронно копирует при первом read. DataPlacementToStorageOnly поnative чтению также имеет попыткуfallback из служебной таблицы при ошибке, но само имя не обещает существование полнойDBкопии.

  8. DataPlacementToStorageAndDatabaseOnInaccessibleStorage при невозможностиstore-write пишетвDB; это не гарантия всех старыхblobs вDB и не проведенный failover test. Недоступность специально не создается.

  9. Один metadata attribute нельзя одновременно включить в состав разныхstore. Не копируйте состав из чужой production или не переименовывайте существующий storage: здесь они отсутствуют заранее.

  10. Policy setters/DB writes не обещаны одной общей транзакцией. Отмена собственного exclusive lock не откатывает policy, сохраненныеobjects или storagecopies; никаких автоматических реставраций/повторов.

  11. Size API может быть дорогим, не учитывает историюданных ирасширения, учитывает только доступныечтению данные. Свой малыйcatalog нужен для ограниченного учебного scope; результат не является physical-location/backup proof.

  12. Финальное enabled оставлено сознательно: отключениеstorage после StorageOnly не равно миграцииpayloadвDB. Delete files/cleanup/backups не входят в код и не выполнялись при подготовкеурока.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Изменить и восстановить три настройки своего поискового стенда

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

Где и как запускать

Полный серверный общий модуль УчебныйПолнотекстовыйПоиск своей отдельной учебной базы.

Подготовка

  1. Используйте только отдельную собственную конфигурацию УчебнаяКонфигурацияСинтаксиса с собственным справочником УчебныеТовары. Включите использование полнотекстового поиска у справочника и Наименование в своей учебной конфигурации.

  2. Вручную создайте ровно три товара: Учебномаяк Книга, Учебномаяк Ручка, Учебномаяк Коробка. Код урока не создаёт и не записывает эти товары. Маркер Учебномаяк нужен, чтобы не искать реальные сведения.

  3. Создайте серверный общий модуль УчебныйПолнотекстовыйПоиск с флагом Сервер, вставьте весь модуль выбранного урока. Из серверного обработчика своей учебной обработки вызовите УчебныйПолнотекстовыйПоиск.ВыполнитьПример().

  4. Сначала вручную разрешите поиск и обновите индекс своей учебной базы либо используйте отдельный урок обновления. Для опытов поиска индекс должен быть актуален, пользователь должен иметь чтение всех трёх собственных товаров.

  5. Для административных уроков нужен единственный пользователь УчебныйПользовательСинтаксиса, право Администрирование, монопольный сеанс без разделителей данных. В этих уроках используется только Версия1; Версия2 требует отдельной подготовки поискового сервера.

  6. Первый запуск административного урока делайте с пустым подтверждением. Не используйте рабочую базу или копию с реальными данными. Обслуживание меняет индекс/настройки и может занимать время, но не должно подменяться удалением товаров.

Процедура ВыполнитьПример(Подтверждение = "") Экспорт
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если Пользователи.Количество() <> 1 ИЛИ Текущий = Неопределено Тогда
        ВызватьИсключение "Для удаления истории нужна отдельная база с одним учебным пользователем";
    КонецЕсли;
    Если Текущий.Имя <> "УчебныйПользовательСинтаксиса" Тогда
        ВызватьИсключение "Войдите только под собственным учебным пользователем";
    КонецЕсли;
    Если НЕ МонопольныйРежим() Тогда
        ВызватьИсключение "Сначала вручную откройте свою учебную базу монопольно";
    КонецЕсли;
    Если ПолнотекстовыйПоиск.ПолучитьВерсиюПолнотекстовогоПоиска() <> ВерсияПолнотекстовогоПоиска.Версия1 Тогда
        ВызватьИсключение "Этот административный опыт рассчитан только на собственный стенд Версия1";
    КонецЕсли;
    Если Подтверждение <> "МЕНЯЮ НАСТРОЙКИ ТОЛЬКО МОЕГО УЧЕБНОГО ПОИСКА" Тогда
        Сообщить("Подтверждение отсутствует; настройки не менялись");
        Возврат;
    КонецЕсли;
    Старые = Новый Структура;
    Старые.Вставить("Задания", ПолнотекстовыйПоиск.ПолучитьКоличествоЗаданийИндексирования());
    Старые.Вставить("Размер", ПолнотекстовыйПоиск.ПолучитьМаксимальныйРазмерИндексируемыхДанных());
    Старые.Вставить("СоставныеСлова", ПолнотекстовыйПоиск.ПолучитьРежимРазделенияСоставныхСлов());
    Попытка
        ПолнотекстовыйПоиск.УстановитьКоличествоЗаданийИндексирования(1);
        ПолнотекстовыйПоиск.УстановитьМаксимальныйРазмерИндексируемыхДанных(1048576);
        ПолнотекстовыйПоиск.УстановитьРежимРазделенияСоставныхСлов(РежимРазделенияСоставныхСлов.НеИспользовать);
        Сообщить(ПолнотекстовыйПоиск.ПолучитьКоличествоЗаданийИндексирования() = 1);
        Сообщить(ПолнотекстовыйПоиск.ПолучитьМаксимальныйРазмерИндексируемыхДанных() = 1048576);
        Сообщить(ПолнотекстовыйПоиск.ПолучитьРежимРазделенияСоставныхСлов() = РежимРазделенияСоставныхСлов.НеИспользовать);
    Исключение
        ОшибкаНастройки = ОписаниеОшибки();
        ОшибкиВозврата = ВосстановитьСвоиНастройки(Старые);
        Если ОшибкиВозврата <> "" Тогда
            ВызватьИсключение ОшибкаНастройки + Символы.ПС + ОшибкиВозврата;
        КонецЕсли;
        ВызватьИсключение ОшибкаНастройки;
    КонецПопытки;
    ОшибкиВозврата = ВосстановитьСвоиНастройки(Старые);
    Если ОшибкиВозврата <> "" Тогда
        ВызватьИсключение "Не все исходные настройки восстановлены:" + Символы.ПС + ОшибкиВозврата;
    КонецЕсли;
    Сообщить(ПолнотекстовыйПоиск.ПолучитьКоличествоЗаданийИндексирования() = Старые.Задания);
    Сообщить(ПолнотекстовыйПоиск.ПолучитьМаксимальныйРазмерИндексируемыхДанных() = Старые.Размер);
    Сообщить(ПолнотекстовыйПоиск.ПолучитьРежимРазделенияСоставныхСлов() = Старые.СоставныеСлова);
КонецПроцедуры

Функция ВосстановитьСвоиНастройки(СтарыеНастройки)
    Ошибки = Новый Массив;
    Попытка
        ПолнотекстовыйПоиск.УстановитьКоличествоЗаданийИндексирования(СтарыеНастройки.Задания);
    Исключение
        Ошибки.Добавить("Задания: " + ОписаниеОшибки());
    КонецПопытки;
    Попытка
        ПолнотекстовыйПоиск.УстановитьМаксимальныйРазмерИндексируемыхДанных(СтарыеНастройки.Размер);
    Исключение
        Ошибки.Добавить("Размер: " + ОписаниеОшибки());
    КонецПопытки;
    Попытка
        ПолнотекстовыйПоиск.УстановитьРежимРазделенияСоставныхСлов(СтарыеНастройки.СоставныеСлова);
    Исключение
        Ошибки.Добавить("Составные слова: " + ОписаниеОшибки());
    КонецПопытки;
    Возврат СтрСоединить(Ошибки, Символы.ПС);
КонецФункции

Разбор по шагам

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

  2. До первого setter сохранить все три прежних значения. Установить 1 задание, 1 МиБ данных, не разделять составные слова.

  3. Проверить прочитанные значения. На файловой базе лимит заданий сохраняется, но дополнительные фоновые задания индексирования не запускаются.

  4. Вернуть каждый исходный параметр независимо. При ошибке одной настройки продолжить попытки возврата остальных и сообщить все ошибки.

  5. Это опыт настроек, не нагрузочный тест и не проверка эффективности нового поиска. Индекс в этом уроке не обновляется.

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

  1. При успехе шесть булевых проверок Истина: три новых параметра и три восстановленных.

  2. Восстановление подтверждается повторным чтением. При ошибке появляется исключение с параметрами, которые вернуть не удалось.

Ожидаемый результат

Полный пример ограниченных административных настроек с явным восстановлением и честной обработкой ошибок.

На что обратить внимание

  1. Максимальный размер задаётся в байтах, а не в количестве товаров. Слишком маленький лимит исключает крупные данные из индекса.

  2. Значение 1 не доказывает использование отдельного фонового процесса на файловой базе.

  3. Возврат настройки не гарантирует восстановление уже изменённого индекса; этот опыт специально не выполняет индексацию между изменениями.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.