Содержит варианты хранения копии базы данных, размещаемой на Дата акселераторе.
Полное описание, параметры и ограничения
ВариантХраненияДанныхДатаАкселератора (DataAcceleratorDataStorageVariant)
ВариантХраненияДанныхДатаАкселератора (DataAcceleratorDataStorageVariant)
Доступен, начиная с версии 8.3.27.
Свойства:
ВОперативнойПамяти (RAM)
ВОперативнойПамятиИНаДиске (RAMAndDisk)
Описание:
Содержит варианты хранения копии базы данных, размещаемой на Дата акселераторе.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.3.27.
Методическая информация
Практические примеры
Список двух копий запроса: вставка, поиск, перестановка и два способа удаления
Собственная новая CF действительно создает два именованных описания копий встроенного Дата акселератора. Учебная задача — настроить и проверить список назначений запросу, отделяя его элементы от самих описаний копий; материализация данных и запрос по копиям здесь не выполняются.
Где и как запускать
Полный серверный общий модуль УчебныйПорядокКопий85 и полный модуль своей формы. Новые копии — свои описания собственного пустого каталога, не arbitrary имена и не рабочая/резервная база.
Подготовка
Создайте отдельную новую собственную клиент-серверную базу на своем локальном кластере 1С8.5.1.1343, CF УчебныйПорядокКопий85, совместимость НеИспользовать/8.5. Единственный пользователь Уч85Порядок с правом АдминистрированиеДанных. Включенный и поддерживаемый данным собственным кластером Дата акселератор нужен для будущего положительного ручного опыта. Ни этот кластер, ни описания копий здесь не создавались.
В собственной новой CF единственный неиерархический справочник Товары85 со стандартным Наименование, без дополнительных реквизитов/табличных частей. Таблица данных пуста. Нет документов, регистров, планов, внешних источников, расширений, подписок и регламентных заданий. Исходная рабочая база и действительные чужие копии не используются.
Перед опытом в этой CF нет ни одного описания копии. Код отказывает непустому каталогу или существующей коллекции. Встроенный вариант ВОперативнойПамяти указан явно: никаких внешних SQL серверов/баз, credentials, сетевых адресов или дисковых архивов не подставляется.
Создайте серверный общий модуль УчебныйПорядокКопий85; вставьте весь основной блок на уровень модуля. Полный factory создает два настоящих описания с одним новым UUID и разными суффиксами _A/_B; состав каждого задается точным Вставить(0,Метаданные.Справочники.Товары85), затем Записать и повторное Найти. Произвольные несуществующие имена копий не используются.
Собственная учебная обработка, управляемая форма: реквизит Подтверждение85 Строка, команда/кнопка ПроверитьПорядок85 с одноименным действием, полный модуль формы ниже. Введите МОИ ДВА УЧЕБНЫХ ОПИСАНИЯ КОПИЙ и запустите явно только на этом отдельном стенде. При открытии/закрытии форма ничего не создает и не удаляет.
До первого создания код показывает два будущих своих имени; сохраните их для ручной диагностики возможного частичного исхода. Сценарий сохраняет и в конце явно удаляет только два созданных им же описания. Это будущие административные операции собственной пустой базы; здесь нет 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);
КонецПроцедуры
Разбор по шагам
Guard проверяет состав собственной CF, одного собственного пользователя, ровно один собственный пустой каталог, отсутствие иной бизнес-метадаты/расширений. Коллекция копий изначально пуста, следовательно сценарий не выбирает случайный первый чужой менеджер.
Два manager factory вызова действительно создают свои описания. Для каждого точное имя с UUID, состав Товары85, встроенный Дата акселератор и RAM-вариант проверяются повторным поиском после Записать. Сохранение описания не объявляется обновлением или готовностью данных копии.
Новый Запрос содержит пустой native список ИспользуемыеКопииБазыДанных. Добавить настоящего имени А и Вставить(0,настоящего имени Б) дают два реальных ИспользуемаяКопияБазыДанных, порядок Б,А. Это элементы списка запроса, не МенеджерКопииБазыДанных.
Индекс принимает именно текущий элемент списка, не строку имени. Проверяется Б=0/А=1; Получить(0).Имя подтверждает Б. Найти принимает строковое имя настоящего описания и возвращает соответствующий ранее добавленный элемент А или Б.
Сдвинуть(НазначениеБ,1) перемещает настоящую Б из начала в конец, а не делает сдвиг0. Новый порядок А,Б подтвержден индексами обоих объектов и именами обеих позиций. Изменение списка не объявляется приоритетом физического планировщика.
Удалить(НазначениеБ) показывает объектный overload и оставляет А. Новая Вставить(1,ИмяБ) создает новый элемент Б; старый удаленный элемент повторно не используется. Удалить(0) показывает индексный overload и оставляет новую Б, ее индекс теперь0.
Очистить снимает назначения только с этого запроса. Сразу проверяется список0, но настоящих описаний по-прежнему2. Значит удаление элемента списка не подменяется удалением manager/БД/физических данных.
В конце оба своих описания снова проверены по точным сохраненным именам/составу/RAM-варианту. Удаляется только свой Б, затем свой А. Начальное0→создано2→финальное0 подтверждается количеством; никаких wildcard, foreach удаления всех менеджеров или чужих имен нет.
При исключении не выполняется автоматический общий cleanup или retry неизвестного создания/удаления. Два UUID имени уже сохранены человеком; сверка проводится только по ним на собственной базе. Успех выводится лишь после подтвержденного финального0.
Как проверить результат
Положительная статически описанная последовательность списка: пусто→Б,А→А,Б→А→Б→пусто. Для каждой стадии точные количество, имена и индексы проверяются кодом, не выводятся произвольные expected числа вместо вызова API.
После Очистить списка настоящих описаний2. После явного удаления собственных менеджеров0. Эти два момента различают Удалить списка и Удалить менеджера; имена обоих менеджеров известны с самого начала опыта.
Неправильная версия/пользователь/CF/расширения, непустой исходный каталог или хотя бы одно существующее описание дают отказ до первой административной записи.
При частичном неизвестном создании/удалении success нет и повтор не запускается автоматически. Проверяются только заранее показанные собственные UUID имена, а не все содержимое рабочего кластера.
Запрос.Выполнить не вызывается для нового маршрутизируемого запроса, Обновить копий также не вызывается. Положительный порядок коллекции не означает материализацию данных, распределенную готовность или физический приоритет источника.
В этой работе код не запускался в1С, Дата акселератор не создавался, ни одно описание/копия не сохранено и не удалено. runtimeVerifiedScenarios=0; будущий runtime опыт только отдельно владельцем на своем новом стенде.
Ожидаемый результат
Проверена полная учебная логика списка двух настоящих собственных описаний копий: объект/имя/индекс, вставка, сдвиг и оба способа удаления. В будущей положительной ветви собственные описания удаляются явно, а копирование данных и физический выбор источника не выдаются за проверенные.
На что обратить внимание
PRIMARY связывает пять методов списка и действительно использованный глобальный менеджер копий: его тип, Количество, Добавить, Найти и Удалить. Коллекция назначений запроса и глобальный менеджер — разные источники; вспомогательные API не получают чужие вызовы.
Записать/Удалить менеджера — настоящие административные операции будущей собственной базы. Они не должны выполняться на рабочей базе или с чужими менеджерами. Для положительного опыта требуется отдельный пустой стенд с поддержкой Дата акселератора и своими правами.
Список не содержит данные реплик, не материализует их и не обещает детерминированный приоритет SQL-планировщика. Именно поэтому новый запрос здесь не исполняется, Обновить не вызывается, ready status не выдумывается.
Native Find не описывает в данном методе явно исход отсутствия имени. Код ищет только реально присутствующие элементы и проверяет отсутствие после удаления количеством/Получить, а не придумывает неописанный negative-return контракт.
Вариант RAM не означает гарантии отсутствия всех служебных дисковых записей платформы. Авторство здесь не исполняло никаких native методов; резервных файлов и архивов не создавало. Работа поддерживающего процесса в будущем зависит от отдельно подготовленного собственного кластера.
Неоднозначные SetCopyUse и Состав.Добавить не вызываются. Состав задается точным Вставить с объектом своих метаданных. При внешнем вмешательстве/неизвестном исходе нет обещания полного автоматического отката описаний; нет массового удаления.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.