ВариантХраненияДанныхДатаАкселератора

Типы · DataAcceleratorDataStorageVariant

Содержит варианты хранения копии базы данных, размещаемой на Дата акселераторе.

Полное описание, параметры и ограничения

ВариантХраненияДанныхДатаАкселератора (DataAcceleratorDataStorageVariant)

ВариантХраненияДанныхДатаАкселератора (DataAcceleratorDataStorageVariant)

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

Свойства:
ВОперативнойПамяти (RAM)
ВОперативнойПамятиИНаДиске (RAMAndDisk)

Описание:

Содержит варианты хранения копии базы данных, размещаемой на Дата акселераторе.

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

Сервер, толстый клиент, внешнее соединение.

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

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

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

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

Список двух копий запроса: вставка, поиск, перестановка и два способа удаления

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

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

Полный серверный общий модуль УчебныйПорядокКопий85 и полный модуль своей формы. Новые копии — свои описания собственного пустого каталога, не arbitrary имена и не рабочая/резервная база.

Подготовка

  1. Создайте отдельную новую собственную клиент-серверную базу на своем локальном кластере 1С8.5.1.1343, CF УчебныйПорядокКопий85, совместимость НеИспользовать/8.5. Единственный пользователь Уч85Порядок с правом АдминистрированиеДанных. Включенный и поддерживаемый данным собственным кластером Дата акселератор нужен для будущего положительного ручного опыта. Ни этот кластер, ни описания копий здесь не создавались.

  2. В собственной новой CF единственный неиерархический справочник Товары85 со стандартным Наименование, без дополнительных реквизитов/табличных частей. Таблица данных пуста. Нет документов, регистров, планов, внешних источников, расширений, подписок и регламентных заданий. Исходная рабочая база и действительные чужие копии не используются.

  3. Перед опытом в этой CF нет ни одного описания копии. Код отказывает непустому каталогу или существующей коллекции. Встроенный вариант ВОперативнойПамяти указан явно: никаких внешних SQL серверов/баз, credentials, сетевых адресов или дисковых архивов не подставляется.

  4. Создайте серверный общий модуль УчебныйПорядокКопий85; вставьте весь основной блок на уровень модуля. Полный factory создает два настоящих описания с одним новым UUID и разными суффиксами _A/_B; состав каждого задается точным Вставить(0,Метаданные.Справочники.Товары85), затем Записать и повторное Найти. Произвольные несуществующие имена копий не используются.

  5. Собственная учебная обработка, управляемая форма: реквизит Подтверждение85 Строка, команда/кнопка ПроверитьПорядок85 с одноименным действием, полный модуль формы ниже. Введите МОИ ДВА УЧЕБНЫХ ОПИСАНИЯ КОПИЙ и запустите явно только на этом отдельном стенде. При открытии/закрытии форма ничего не создает и не удаляет.

  6. До первого создания код показывает два будущих своих имени; сохраните их для ручной диагностики возможного частичного исхода. Сценарий сохраняет и в конце явно удаляет только два созданных им же описания. Это будущие административные операции собственной пустой базы; здесь нет actual1C, записи описаний, удаления копий, создания архивов или сети.

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

Процедура ПроверитьСвойНовыйСтенд85()
    ПроверитьСвойПустойСтенд();
    Если ПользователиИнформационнойБазы.ТекущийПользователь().Имя <> "Уч85Порядок" Тогда
        ВызватьИсключение "Нужен единственный собственный пользователь Уч85Порядок";
    КонецЕсли;
    Если Метаданные.Справочники.Найти("Товары85") = Неопределено Тогда
        ВызватьИсключение "Создайте собственный пустой каталог Товары85";
    КонецЕсли;
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Количество ИЗ Справочник.Товары85";
    Данные = Запрос.Выполнить().Выгрузить();
    Если Данные.Количество() <> 1 Или Данные[0].Количество <> 0 Тогда
        ВызватьИсключение "Исходный учебный каталог должен быть пустым";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьСвоёОписание85(Копия, Имя)
    Если Копия.Имя <> Имя Или Не Копия.ИспользоватьВстроенныйДатаАкселератор
        Или Копия.ВариантХраненияДанныхДатаАкселератора <> ВариантХраненияДанныхДатаАкселератора.ВОперативнойПамяти
        Или Копия.Состав.Количество() <> 1 Или Копия.Состав.Получить(0).Метаданные <> Метаданные.Справочники.Товары85 Тогда
        ВызватьИсключение "Собственное описание копии не совпало";
    КонецЕсли;
КонецПроцедуры

Процедура ВыполнитьСвоюПолитику85(Подтверждение) Экспорт
    ПроверитьСвойНовыйСтенд85();
    Если Подтверждение <> "МОИ ДВА УЧЕБНЫХ ОПИСАНИЯ КОПИЙ" Тогда
        ВызватьИсключение "Создание и последующее удаление двух своих описаний требуют явного подтверждения";
    КонецЕсли;
    Если КопииБазыДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Опыт нельзя выполнять рядом с существующими описаниями копий";
    КонецЕсли;
    Метка = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "_");
    ИмяА = "Уч85_" + Метка + "_A";
    ИмяБ = "Уч85_" + Метка + "_B";
    Сообщить("Сохраните два своих имени для диагностики: " + ИмяА + " / " + ИмяБ);
    Попытка
        КопияА = КопииБазыДанных.Добавить(ИмяА, ВариантХраненияДанныхДатаАкселератора.ВОперативнойПамяти);
        КопияА.Состав.Вставить(0, Метаданные.Справочники.Товары85);
        КопияА.Записать();
        КопияБ = КопииБазыДанных.Добавить(ИмяБ, ВариантХраненияДанныхДатаАкселератора.ВОперативнойПамяти);
        КопияБ.Состав.Вставить(0, Метаданные.Справочники.Товары85);
        КопияБ.Записать();
        Если КопииБазыДанных.Количество() <> 2 Тогда
            ВызватьИсключение "Нужно ровно два собственных новых описания";
        КонецЕсли;
        КопияА = КопииБазыДанных.Найти(ИмяА);
        КопияБ = КопииБазыДанных.Найти(ИмяБ);
        ПроверитьСвоёОписание85(КопияА, ИмяА);
        ПроверитьСвоёОписание85(КопияБ, ИмяБ);
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ Т.Наименование ИЗ Справочник.Товары85 КАК Т";
        Используемые = Запрос.ИспользуемыеКопииБазыДанных;
        Если Используемые.Количество() <> 0 Тогда
            ВызватьИсключение "Новый запрос должен иметь пустой собственный список";
        КонецЕсли;
        НазначениеА = Используемые.Добавить(КопияА.Имя);
        НазначениеБ = Используемые.Вставить(0, КопияБ.Имя);
        Если Используемые.Количество() <> 2 Или Используемые.Индекс(НазначениеБ) <> 0
            Или Используемые.Индекс(НазначениеА) <> 1 Или Используемые.Получить(0).Имя <> ИмяБ Тогда
            ВызватьИсключение "После вставки ожидается список Б, А";
        КонецЕсли;
        Если Используемые.Найти(КопияА.Имя) <> НазначениеА Или Используемые.Найти(КопияБ.Имя) <> НазначениеБ Тогда
            ВызватьИсключение "Поиск по двум настоящим собственным именам неверен";
        КонецЕсли;
        Используемые.Сдвинуть(НазначениеБ, 1);
        Если Используемые.Индекс(НазначениеА) <> 0 Или Используемые.Индекс(НазначениеБ) <> 1
            Или Используемые.Получить(0).Имя <> ИмяА Или Используемые.Получить(1).Имя <> ИмяБ Тогда
            ВызватьИсключение "Сдвиг на одну позицию должен дать список А, Б";
        КонецЕсли;
        Используемые.Удалить(НазначениеБ);
        Если Используемые.Количество() <> 1 Или Используемые.Получить(0) <> НазначениеА Или Используемые.Найти(ИмяА) <> НазначениеА Тогда
            ВызватьИсключение "Удаление по объекту должно оставить только назначение А";
        КонецЕсли;
        НовоеНазначениеБ = Используемые.Вставить(1, КопияБ.Имя);
        Используемые.Удалить(0);
        Если Используемые.Количество() <> 1 Или Используемые.Получить(0) <> НовоеНазначениеБ
            Или Используемые.Индекс(НовоеНазначениеБ) <> 0 Или Используемые.Найти(ИмяБ) <> НовоеНазначениеБ Тогда
            ВызватьИсключение "Удаление по индексу должно оставить новое назначение Б";
        КонецЕсли;
        Используемые.Очистить();
        Если Используемые.Количество() <> 0 Или КопииБазыДанных.Количество() <> 2 Тогда
            ВызватьИсключение "Очистка списка запроса не должна удалять описания копий";
        КонецЕсли;
        ПроверитьСвоёОписание85(КопииБазыДанных.Найти(ИмяА), ИмяА);
        ПроверитьСвоёОписание85(КопииБазыДанных.Найти(ИмяБ), ИмяБ);
        КопииБазыДанных.Удалить(КопияБ);
        КопииБазыДанных.Удалить(КопияА);
        Если КопииБазыДанных.Количество() <> 0 Тогда
            ВызватьИсключение "Собственные описания не удалены; неизвестный исход не считается успехом";
        КонецЕсли;
    Исключение
        ВызватьИсключение "Опыт не завершен. Сверьте только заранее сохраненные два собственных имени; автоматического повторения или удаления найденных чужих копий нет";
    КонецПопытки;
    Сообщить("Проверены два реальных описания и список БА→АБ→А→Б→пусто. Собственные описания удалены. Данные копий и физический выбор источника не проверялись");
КонецПроцедуры
Полный модуль собственной управляемой формы

Подтверждение85 Строка, команда ПроверитьПорядок85.

Подтверждение85 Строка, команда ПроверитьПорядок85.

&НаКлиенте
Процедура ПроверитьПорядок85(Команда)
    ПроверитьПорядокНаСервере85();
КонецПроцедуры

&НаСервере
Процедура ПроверитьПорядокНаСервере85()
    УчебныйПорядокКопий85.ВыполнитьСвоюПолитику85(Подтверждение85);
КонецПроцедуры

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

  1. Guard проверяет состав собственной CF, одного собственного пользователя, ровно один собственный пустой каталог, отсутствие иной бизнес-метадаты/расширений. Коллекция копий изначально пуста, следовательно сценарий не выбирает случайный первый чужой менеджер.

  2. Два manager factory вызова действительно создают свои описания. Для каждого точное имя с UUID, состав Товары85, встроенный Дата акселератор и RAM-вариант проверяются повторным поиском после Записать. Сохранение описания не объявляется обновлением или готовностью данных копии.

  3. Новый Запрос содержит пустой native список ИспользуемыеКопииБазыДанных. Добавить настоящего имени А и Вставить(0,настоящего имени Б) дают два реальных ИспользуемаяКопияБазыДанных, порядок Б,А. Это элементы списка запроса, не МенеджерКопииБазыДанных.

  4. Индекс принимает именно текущий элемент списка, не строку имени. Проверяется Б=0/А=1; Получить(0).Имя подтверждает Б. Найти принимает строковое имя настоящего описания и возвращает соответствующий ранее добавленный элемент А или Б.

  5. Сдвинуть(НазначениеБ,1) перемещает настоящую Б из начала в конец, а не делает сдвиг0. Новый порядок А,Б подтвержден индексами обоих объектов и именами обеих позиций. Изменение списка не объявляется приоритетом физического планировщика.

  6. Удалить(НазначениеБ) показывает объектный overload и оставляет А. Новая Вставить(1,ИмяБ) создает новый элемент Б; старый удаленный элемент повторно не используется. Удалить(0) показывает индексный overload и оставляет новую Б, ее индекс теперь0.

  7. Очистить снимает назначения только с этого запроса. Сразу проверяется список0, но настоящих описаний по-прежнему2. Значит удаление элемента списка не подменяется удалением manager/БД/физических данных.

  8. В конце оба своих описания снова проверены по точным сохраненным именам/составу/RAM-варианту. Удаляется только свой Б, затем свой А. Начальное0→создано2→финальное0 подтверждается количеством; никаких wildcard, foreach удаления всех менеджеров или чужих имен нет.

  9. При исключении не выполняется автоматический общий cleanup или retry неизвестного создания/удаления. Два UUID имени уже сохранены человеком; сверка проводится только по ним на собственной базе. Успех выводится лишь после подтвержденного финального0.

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

  1. Положительная статически описанная последовательность списка: пусто→Б,А→А,Б→А→Б→пусто. Для каждой стадии точные количество, имена и индексы проверяются кодом, не выводятся произвольные expected числа вместо вызова API.

  2. После Очистить списка настоящих описаний2. После явного удаления собственных менеджеров0. Эти два момента различают Удалить списка и Удалить менеджера; имена обоих менеджеров известны с самого начала опыта.

  3. Неправильная версия/пользователь/CF/расширения, непустой исходный каталог или хотя бы одно существующее описание дают отказ до первой административной записи.

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

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

  6. В этой работе код не запускался в1С, Дата акселератор не создавался, ни одно описание/копия не сохранено и не удалено. runtimeVerifiedScenarios=0; будущий runtime опыт только отдельно владельцем на своем новом стенде.

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

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

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

  1. PRIMARY связывает пять методов списка и действительно использованный глобальный менеджер копий: его тип, Количество, Добавить, Найти и Удалить. Коллекция назначений запроса и глобальный менеджер — разные источники; вспомогательные API не получают чужие вызовы.

  2. Записать/Удалить менеджера — настоящие административные операции будущей собственной базы. Они не должны выполняться на рабочей базе или с чужими менеджерами. Для положительного опыта требуется отдельный пустой стенд с поддержкой Дата акселератора и своими правами.

  3. Список не содержит данные реплик, не материализует их и не обещает детерминированный приоритет SQL-планировщика. Именно поэтому новый запрос здесь не исполняется, Обновить не вызывается, ready status не выдумывается.

  4. Native Find не описывает в данном методе явно исход отсутствия имени. Код ищет только реально присутствующие элементы и проверяет отсутствие после удаления количеством/Получить, а не придумывает неописанный negative-return контракт.

  5. Вариант RAM не означает гарантии отсутствия всех служебных дисковых записей платформы. Авторство здесь не исполняло никаких native методов; резервных файлов и архивов не создавало. Работа поддерживающего процесса в будущем зависит от отдельно подготовленного собственного кластера.

  6. Неоднозначные SetCopyUse и Состав.Добавить не вызываются. Состав задается точным Вставить с объектом своих метаданных. При внешнем вмешательстве/неизвестном исходе нет обещания полного автоматического отката описаний; нет массового удаления.

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

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

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

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

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