Осуществляет поиск менеджера копии по его имени.
Синтаксис
Найти(<ИмяКопии>)Полное описание, параметры и ограничения
МенеджерКопийБазыДанных.Найти (DatabaseCopiesManager.Find)
МенеджерКопийБазыДанных (DatabaseCopiesManager)
Найти (Find)
Доступен, начиная с версии 8.3.14 (в режиме совместимости с версией 8.3.14 и последующими).
Синтаксис:
Найти(<ИмяКопии>)
Параметры:
<ИмяКопии> (обязательный)
Тип: Строка.
Имя копии.
Возвращаемое значение:
Тип: МенеджерКопииБазыДанных.
Описание:
Осуществляет поиск менеджера копии по его имени.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.3.14 (в режиме совместимости с версией 8.3.14 и последующими).
Методическая информация
Практические примеры
Собственная SQL-копия: состав, дочерние поля, период и проверка готовности
Полный учебный процесс с новым собственным серверным источником 1С и новой пустой базой PostgreSQL. Состав копии — не резервный архив: это API репликации и запросов. Во время авторства ни база данных, ни резервная копия не создавались.
Где и как запускать
Полный серверный общий модуль УчебныеКопии85 новой собственной клиент-серверной CF, отдельно полный модуль формы и SQL/psql подготовка. Ни один блок не выполнялся в текущей работе.
Подготовка
Нужны отдельная собственная Windows VM, собственный локальный кластер 1С 8.5.1.1343 с действительными правами и лицензией, новая пустая клиент-серверная база. Именуйте CF УчебнаяКопияSQL85, единственный пользователь Уч85Копия с правом АдминистрированиеДанных. Используйте совместимость НеИспользовать/8.5, без расширений, подписок, заданий и сохраненных копий. Не берите исходную рабочую базу или ее резервную копию.
В новой CF ровно два неиерархических справочника Книги85,Проверка85. Каждый: реквизит Метка Строка36. Книги85 дополнительно Подробности Строка неограниченной длины, Данные ХранилищеЗначения, табличная часть Строки с Количество Число9.0. Пустые модули объектов, без иных обработчиков. Стандартное Наименование используется как название книги.
Ровно один независимый периодический регистр сведений Количество85, периодичность День, измерение Метка Строка36 и ресурс Количество Число9.0; пустой модуль. До создания опыта все три таблицы пусты. Полный seed-код создает только Уч85Книга,Уч85Проверка и строку собственного UUID/09.10.2026/3; нет случайного существующего объекта.
На той же VM создайте отдельный PostgreSQL instance с listen_addresses=localhost, port=15485, без production базы или внешних маршрутов. Из своего psql администратора в этом новом instance вручную выполните SQL/psql блок ниже, один раз. Создается только роль/БД уч85copy; \password интерактивно задает собственный секрет, его нет в коде/командной строке/логах. Существующие role/db не заменяются.
Это PostgreSQL target, не информационная база1С. Роль уч85copy владеет только этим своим пустым target, не имеет прав на другие пользовательские БД. Никто другой не использует target. Проверку нового пустого target сделайте человеком до запуска; код не угадывает владельца и не перехватывает уже используемую копию.
Создайте серверный общий модуль УчебныеКопии85 и вставьте весь основной BSL. Создайте свою внешнюю обработку/управляемую форму, реквизиты ПарольSQL85,Подтверждение85,ПодтверждениеОбновления85,ИмяКопии85,Метка85 Строка. ПарольSQL85 режим пароля, ИмяКопии85/Метка85 только просмотр. Вставьте отдельный полный модуль формы; команды Создать85,Обновить85,Проверить85 свяжите с одноименными действиями.
Укажите действительный свой target пароль, подтверждение МОЯ ПУСТАЯ SQL КОПИЯ НА LOCALHOST. Создать85 вызывается ровно один раз: общий модуль до seed отказывает непустым данным/существующим копиям; имя собственной копии строится из нового UUID и сохраняется в сообщении до изменений. При частичном исходе нет повторного seed и нет автоматического удаления.
Нормальная дальнейшая последовательность: собственный состав/поля/период → Записать → новое Найти/readback → явное подтверждение ОБНОВИТЬ МОЮ SQL КОПИЮ и Обновить85 → Проверить85. Код не вызывает Delete копии/DB, DROP, TRUNCATE, SetCopyUse, смену версии глобальной репликации или фоновые задания.
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 2 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 1 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвойCopyСтенд85()
ПроверитьСвойПустойСтенд();
Если ПользователиИнформационнойБазы.ТекущийПользователь().Имя <> "Уч85Копия" Тогда
ВызватьИсключение "Нужен собственный единственный пользователь Уч85Копия";
КонецЕсли;
Если Метаданные.Справочники.Найти("Книги85") = Неопределено Или Метаданные.Справочники.Найти("Проверка85") = Неопределено
Или Метаданные.РегистрыСведений.Найти("Количество85") = Неопределено Тогда
ВызватьИсключение "Нужна точная собственная metadata схема";
КонецЕсли;
КонецПроцедуры
Функция КоличествоСвоихДанных85()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Количество ИЗ Справочник.Книги85
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ Справочник.Проверка85
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ РегистрСведений.Количество85";
Строки = Запрос.Выполнить().Выгрузить();
Возврат Строки.Итог("Количество");
КонецФункции
Процедура СоздатьСвоиИсходныеДанные85(Метка)
Если КоличествоСвоихДанных85() <> 0 Тогда
ВызватьИсключение "Исходная новая учебная база должна быть пустой до собственного seed";
КонецЕсли;
Книга = Справочники.Книги85.СоздатьЭлемент();
Книга.Наименование = "Уч85Книга";
Книга.Метка = Метка;
Книга.Подробности = "Собственный пример без неограниченной истории и секретов";
Книга.Данные = Новый ХранилищеЗначения("own:" + Метка);
Позиция = Книга.Строки.Добавить();
Позиция.Количество = 3;
Книга.Записать();
Проверка = Справочники.Проверка85.СоздатьЭлемент();
Проверка.Наименование = "Уч85Проверка";
Проверка.Метка = Метка;
Проверка.Записать();
Набор = РегистрыСведений.Количество85.СоздатьНаборЗаписей();
Набор.Отбор.Метка.Установить(Метка);
Набор.Прочитать();
Если Набор.Количество() <> 0 Тогда
ВызватьИсключение "Собственный UUID регистра уже существует";
КонецЕсли;
Запись = Набор.Добавить();
Запись.Период = Дата(2026, 10, 9);
Запись.Метка = Метка;
Запись.Количество = 3;
Набор.Записать(Ложь);
Если КоличествоСвоихДанных85() <> 3 Тогда
ВызватьИсключение "Три собственные исходные записи не подтверждены";
КонецЕсли;
КонецПроцедуры
Процедура НастроитьСобственныйСостав85(Копия)
Состав = Копия.Состав;
Если Состав.Количество() <> 0 Тогда
ВызватьИсключение "Новый собственный план должен иметь пустой состав";
КонецЕсли;
Книги = Состав.Вставить(0, Метаданные.Справочники.Книги85);
Контроль = Состав.Вставить(0, Метаданные.Справочники.Проверка85);
Состав.Сдвинуть(Контроль, 1);
Если Состав.Индекс(Книги) <> 0 Или Состав.Получить(1) <> Контроль Или Состав.Найти(Метаданные.Справочники.Книги85) <> Книги Тогда
ВызватьИсключение "Порядок настоящих объектов своего состава неверен";
КонецЕсли;
Состав.Удалить(Контроль);
Состав.Очистить();
Книги = Состав.Вставить(0, Метаданные.Справочники.Книги85);
Остатки = Состав.Вставить(1, Метаданные.РегистрыСведений.Количество85);
Если Состав.Количество() <> 2 Или Книги.Метаданные <> Метаданные.Справочники.Книги85 Или Остатки.Метаданные <> Метаданные.РегистрыСведений.Количество85 Тогда
ВызватьИсключение "В копии только свой каталог книг и собственный регистр";
КонецЕсли;
Копия.ИспользованиеПрочихПолей = ИспользованиеПоляЭлементаСоставаКопииБазыДанных.Использовать;
Копия.ИспользованиеСтрокНеограниченнойДлины = ИспользованиеПоляЭлементаСоставаКопииБазыДанных.НеИспользовать;
Копия.ИспользованиеХранилищЗначений = ИспользованиеПоляЭлементаСоставаКопииБазыДанных.НеИспользовать;
Копия.ИспользованиеТабличныхЧастей = ИспользованиеПоляЭлементаСоставаКопииБазыДанных.Использовать;
Книги.ИспользованиеПрочихПолей = ИспользованиеПоляЭлементаСоставаКопииБазыДанных.Авто;
Книги.ИспользованиеСтрокНеограниченнойДлины = ИспользованиеПоляЭлементаСоставаКопииБазыДанных.НеИспользовать;
Книги.ИспользованиеХранилищЗначений = ИспользованиеПоляЭлементаСоставаКопииБазыДанных.НеИспользовать;
Книги.ИспользованиеТабличныхЧастей = ИспользованиеПоляЭлементаСоставаКопииБазыДанных.Использовать;
Поля = Книги.Поля;
ПолеМетки = Поля.Найти("Метка");
ПолеСтрок = Поля.Найти("Строки");
Если ПолеМетки = Неопределено Или ПолеСтрок = Неопределено Тогда
ВызватьИсключение "Собственные metadata поля состава не создались";
КонецЕсли;
Если Поля.Количество() = 0 Или Поля.Получить(Поля.Индекс(ПолеМетки)) <> ПолеМетки Или ПолеМетки.Имя <> "Метка" Тогда
ВызватьИсключение "Индекс/имя собственного поля состава неверны";
КонецЕсли;
ПолеМетки.Использование = ИспользованиеПоляЭлементаСоставаКопииБазыДанных.Использовать;
ПолеСтрок.Использование = ИспользованиеПоляЭлементаСоставаКопииБазыДанных.Использовать;
ПолеКоличества = ПолеСтрок.Поля.Найти("Количество");
Если ПолеКоличества = Неопределено Тогда
ВызватьИсключение "Нет собственного дочернего поля табличной части";
КонецЕсли;
ПолеКоличества.Использование = ИспользованиеПоляЭлементаСоставаКопииБазыДанных.Использовать;
Если Не ПолеМетки.ПолучитьТекущееИспользование() Или Не ПолеКоличества.ПолучитьТекущееИспользование() Тогда
ВызватьИсключение "Рассчитанное использование own полей не подтверждено";
КонецЕсли;
Остатки.Отбор.Период.Установить(Дата(2026, 10, 9));
Остатки.Отбор.Период.ВидСравнения = ВидСравнения.БольшеИлиРавно;
Если Не Остатки.Отбор.Период.Использование Или Остатки.Отбор.Период.Значение <> Дата(2026, 10, 9)
Или Остатки.Отбор.Период.ВидСравнения <> ВидСравнения.БольшеИлиРавно Тогда
ВызватьИсключение "Поддерживаемый native отбор Период только собственного регистра не подтвержден";
КонецЕсли;
КонецПроцедуры
Функция СоздатьСобственныйПлан85(ПарольSQL, Подтверждение) Экспорт
ПроверитьСвойCopyСтенд85();
Если Подтверждение <> "МОЯ ПУСТАЯ SQL КОПИЯ НА LOCALHOST" Или ТипЗнч(ПарольSQL) <> Тип("Строка") Или ПарольSQL = "" Тогда
ВызватьИсключение "Нужны собственная новая VM/SQL база и ее действительный пароль";
КонецЕсли;
Если КопииБазыДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нельзя создавать опыт рядом с существующей чужой копией";
КонецЕсли;
Метка = Строка(Новый УникальныйИдентификатор);
Имя = "Уч85_" + СтрЗаменить(Метка, "-", "_");
Сообщить("Сохраните собственное имя плана и UUID: " + Имя + " / " + Метка);
СоздатьСвоиИсходныеДанные85(Метка);
Копия = КопииБазыДанных.Добавить(Имя, ТипРепликацииКопииБазыДанных.Стандартная, ТипСУБДКопииБазыДанных.PostgreSQL,
"localhost:15485", "уч85copy", "уч85copy", ПарольSQL, Ложь);
ПарольSQL = "";
Если Копия.Имя <> Имя Или Копия.ТипРепликации <> ТипРепликацииКопииБазыДанных.Стандартная
Или Копия.ТипСУБД <> ТипСУБДКопииБазыДанных.PostgreSQL Или Копия.ИспользоватьВстроенныйДатаАкселератор Тогда
ВызватьИсключение "Паспорт своего нового SQL плана не совпал";
КонецЕсли;
Копия.СерверБазыДанных = "localhost:15485";
Копия.БазаДанных = "уч85copy";
Копия.ПользовательБазыДанных = "уч85copy";
Копия.СоздатьБазуДанных = Ложь;
Если Копия.СерверБазыДанных <> "localhost:15485" Или Копия.БазаДанных <> "уч85copy" Или Копия.ПользовательБазыДанных <> "уч85copy"
Или Копия.СоздатьБазуДанных Или Копия.ВариантХраненияДанныхДатаАкселератора <> ВариантХраненияДанныхДатаАкселератора.ВОперативнойПамятиИНаДиске Тогда
ВызватьИсключение "Своя локальная существующая target база не подтверждена";
КонецЕсли;
Если Копия.ПарольПользователяБазыДанных = "" Тогда
ВызватьИсключение "Свой target пароль не задан; значение не выводится";
КонецЕсли;
НастроитьСобственныйСостав85(Копия);
Копия.Записать();
Прочитанная = КопииБазыДанных.Найти(Имя);
Если Прочитанная = Неопределено Или Прочитанная.Имя <> Имя Или Прочитанная.БазаДанных <> "уч85copy" Или Прочитанная.Состав.Количество() <> 2 Тогда
ВызватьИсключение "Сохранение своего плана не подтверждено; automatic retry отсутствует";
КонецЕсли;
Возврат Новый Структура("ИмяКопии,Метка", Имя, Метка);
КонецФункции
Функция ПолучитьСвоюКопию85(Имя)
ПроверитьСвойCopyСтенд85();
Если ТипЗнч(Имя) <> Тип("Строка") Или Лев(Имя, 5) <> "Уч85_" Или СтрДлина(Имя) <> 41 Или КопииБазыДанных.Количество() <> 1 Тогда
ВызватьИсключение "Нужна единственная собственная копия с сохраненным UUID именем";
КонецЕсли;
Копия = КопииБазыДанных.Найти(Имя);
Если Копия = Неопределено Тогда
ВызватьИсключение "Свое имя не найдено; чужой первый элемент не выбирается";
КонецЕсли;
Если Копия.Имя <> Имя Или Копия.СерверБазыДанных <> "localhost:15485" Или Копия.БазаДанных <> "уч85copy"
Или Копия.ПользовательБазыДанных <> "уч85copy" Или Копия.СоздатьБазуДанных Тогда
ВызватьИсключение "Свое target назначение изменилось";
КонецЕсли;
Возврат Копия;
КонецФункции
Процедура ОбновитьСвоюКопию85(Имя, Подтверждение) Экспорт
Копия = ПолучитьСвоюКопию85(Имя);
Если Подтверждение <> "ОБНОВИТЬ МОЮ SQL КОПИЮ" Тогда
ВызватьИсключение "Обновление реально переносит только собственные учебные данные";
КонецЕсли;
КопииБазыДанных.Обновить(Копия, Ложь, 1);
Сообщить("Вызов собственного обновления завершился; готовность и readback проверяются отдельной командой");
КонецПроцедуры
Функция ПроверитьСвоюГотовность85(Имя) Экспорт
Копия = ПолучитьСвоюКопию85(Имя);
Информация = Копия.ПолучитьИнформациюОКопии();
Если ТипЗнч(Информация) <> Тип("Массив") Или Информация.Количество() = 0 Тогда
Возврат Ложь;
КонецЕсли;
ВсеГотовы = Истина;
Для Каждого Состояние Из Информация Цикл
Если Состояние.СерверБазыДанных <> "localhost:15485" Тогда
ВызватьИсключение "Неожиданный сервер своего экземпляра копии";
КонецЕсли;
Если Состояние.КоличествоТаблицДляНачальногоОбновления <> 0 Или Состояние.КоличествоТранзакцийДляТекущегоОбновления <> 0
Или Состояние.ВыполняетсяОбработкаДанныхДатаАкселератором Или Состояние.ОбновляемыеДанные <> Неопределено
Или Состояние.ОшибкаОбновления <> Неопределено Или Состояние.ОшибкаПричиныОтключения <> Неопределено
Или Состояние.ПричинаОтключения <> Неопределено Или Состояние.СостояниеКопии <> СостояниеКопииБазыДанных.Включена
Или Состояние.СостояниеОбновления <> СостояниеОбновленияКопииБазыДанных.ЗавершеноУспешно Тогда
ВсеГотовы = Ложь;
КонецЕсли;
Если Состояние.ОжидаемоеВремяВыполнения = Неопределено Тогда
Сообщить("Прогноз для своей копии пока отсутствует");
ИначеЕсли Состояние.ОжидаемоеВремяВыполнения < 0 Тогда
ВызватьИсключение "Недопустимый native прогноз";
КонецЕсли;
КонецЦикла;
Если Копия.ПолучитьВремяОбновленияДанных() = Дата(1, 1, 1) Тогда
ВсеГотовы = Ложь;
КонецЕсли;
Возврат ВсеГотовы;
КонецФункции
Процедура ПроверитьКопиюЗапросом85(Имя, Метка) Экспорт
Если Имя <> "Уч85_" + СтрЗаменить(Метка, "-", "_") Или Не ПроверитьСвоюГотовность85(Имя) Тогда
ВызватьИсключение "Свое UUID имя/готовность копии не подтверждены";
КонецЕсли;
Запрос = Новый Запрос;
Используемые = Запрос.ИспользуемыеКопииБазыДанных;
Если Используемые.Количество() <> 0 Тогда
ВызватьИсключение "Новый запрос должен иметь пустое собственное назначение копий";
КонецЕсли;
Используемая = Используемые.Добавить(Имя);
Если Используемые.Количество() <> 1 Или Используемые.Получить(0) <> Используемая Или Используемая.Имя <> Имя Тогда
ВызватьИсключение "Своё назначение копии запросу не подтверждено";
КонецЕсли;
Запрос.Текст = "ВЫБРАТЬ К.Метка, К.Наименование ИЗ Справочник.Книги85 КАК К ГДЕ К.Метка = &Метка";
Запрос.УстановитьПараметр("Метка", Метка);
Результат = Запрос.Выполнить().Выгрузить();
Если Результат.Количество() <> 1 Или Результат[0].Метка <> Метка Или Результат[0].Наименование <> "Уч85Книга" Тогда
ВызватьИсключение "Readback собственных данных запроса не совпал";
КонецЕсли;
Используемые.Очистить();
Если Используемые.Количество() <> 0 Тогда
ВызватьИсключение "Очистка лишь назначения своего запроса не подтверждена";
КонецЕсли;
Сообщить("Запрос с собственным назначением копии вернул свой товар; физический план/источник выполнения отдельно не доказан");
КонецПроцедуры
PostgreSQL/psql: новая собственная роль и пустой target
Вручную в собственном новом PostgreSQL localhost:15485 instance. \password — psql meta-command, неSQLи неBSL.
Вручную в собственном новом PostgreSQL localhost:15485 instance. \password — psql meta-command, неSQLи неBSL.
CREATE ROLE "уч85copy" LOGIN;
\password уч85copy
CREATE DATABASE "уч85copy" OWNER "уч85copy";
Полный модуль своей управляемой формы
Реквизиты ПарольSQL85/подтверждения/ИмяКопии85/Метка85, команды Создать85/Обновить85/Проверить85.
Реквизиты ПарольSQL85/подтверждения/ИмяКопии85/Метка85, команды Создать85/Обновить85/Проверить85.
&НаКлиенте
Процедура Создать85(Команда)
Попытка
СоздатьНаСервере85();
Исключение
Сообщить("Создание не подтверждено. Повторять автоматически нельзя; сохраните собственный UUID из сообщений");
КонецПопытки;
ПарольSQL85 = "";
КонецПроцедуры
&НаСервере
Процедура СоздатьНаСервере85()
Если ИмяКопии85 <> "" Тогда
ВызватьИсключение "Собственный опыт уже начат";
КонецЕсли;
Данные = УчебныеКопии85.СоздатьСобственныйПлан85(ПарольSQL85, Подтверждение85);
ИмяКопии85 = Данные.ИмяКопии;
Метка85 = Данные.Метка;
ПарольSQL85 = "";
КонецПроцедуры
&НаКлиенте
Процедура Обновить85(Команда)
ОбновитьНаСервере85();
КонецПроцедуры
&НаСервере
Процедура ОбновитьНаСервере85()
УчебныеКопии85.ОбновитьСвоюКопию85(ИмяКопии85, ПодтверждениеОбновления85);
КонецПроцедуры
&НаКлиенте
Процедура Проверить85(Команда)
ПроверитьНаСервере85();
КонецПроцедуры
&НаСервере
Процедура ПроверитьНаСервере85()
УчебныеКопии85.ПроверитьКопиюЗапросом85(ИмяКопии85, Метка85);
КонецПроцедуры
Разбор по шагам
Новая CF, версия, пользователь, ровно два справочника и один регистр, отсутствие иной бизнес-метадаты и расширений проверяются до записей. Подготовка создает три свои записи с UUID. Весь опыт только в новой собственной исходной и целевой базе, не в production.
Добавить менеджера копий вызывается с точными параметрами: localhost:15485, база уч85copy, роль уч85copy, свой пароль и СоздатьБазуДанных=Ложь. Это уже подготовленная пустая SQL-база, не произвольное несуществующее имя. Пароль нигде не отображается; это не шифрование сохраненных настроек.
Состав сначала упражняет настоящие Вставить двух metadata объектов/Сдвинуть/Индекс/Получить/Найти; Удалить/Очистить меняют только новый состав до его записи. Затем окончательный состав — свой каталог книг и свой периодический регистр. Проверка85 не входит в финальную копию.
Readonly Метаданные/Pоля/Состав не назначаются. Настройки использования четырех классов полей задаются копии и элементу; обычные поля/табличная часть разрешены, неограниченная строка/Хранилище исключены. Поля создаются автоматически; Найти/Количество/Индекс/Получить работают с собственным native полем Метка.
ПолеСтрок.Поля — реальная вложенная коллекция дочерних полей табличной части Строки. Количество разрешено отдельно. ПолучитьТекущееИспользование возвращает рассчитанное Булево, не одно лишь заданное значение enum.
Отбор native поддержан именно для периодического регистра. Сначала Установить даты09.10.2026, затем ВидСравнения=БольшеИлиРавно, потому что Установить сбрасывает вид в Равно. Нельзя выставлять такой отбор на справочнике или выдумывать произвольное поле UUID в составе копии.
Записать сохраняет свое описание копии, но не доказывает готовность данных. Найти/readback проверяют собственное имя/target/число элементов. Позже Обновить(Копия,Ложь,1) выполняет явное обновление только этого сохраненного плана; он сам отказывает уже используемой другими target базе, переключения владельца нет.
ПолучитьИнформациюОКопии возвращает Массив экземпляров, не одиночный объект. Все 11 readonly-полей используются для решения о готовности: очереди, обслуживание, обновляемая метадата, ошибки и причина отключения, состояния, свой сервер, необязательный прогноз. Пустой массив и Неопределено в прогнозе не подменяются готовностью.
ПолучитьВремяОбновленияДанных дает Дата, не Булево. Начальный нулевой момент и неготовое состояние препятствуют проверочному запросу. Неопределено у ОжидаемоеВремяВыполнения означает отсутствие статистики, а не ноль секунд и не обещанное время завершения.
Новый Запрос содержит собственную коллекцию ИспользуемыеКопииБазыДанных. Добавить/Получить/Количество подтверждают имя существующей своей копии; параметризованный UUID запрос проверяет одну Книгу. Очистить снимает только назначение этого запроса, не удаляет копию/SQL базу.
Назначение copy запросу и совпадение данных не являются доказательством физического SQL плана или отсутствия fallback к основной базе. Эти границы названы явно; точный источник выполнения требует отдельно разрешенных диагностик/плана, не фиктивной green-check.
Как проверить результат
До создания исходные данные пусты и существующих копий нет. После подготовки — три собственные записи; сохраните UUID и имя. Повтор Создать85 должен отказать без дополнительной подготовки или копии. Исключение после частичной записи не вызывает автоповтор или автоудаление.
Состав в памяти: вставили два объекта метаданных, переместили контрольный на индекс 1, проверили индексы. Удаление и очистка до Записать не затрагивают SQL-базу. После окончательной настройки ровно Книги85 и Количество85, исключены Подробности и Данные, включена вложенная Строки.Количество.
Начальное обновление, непустые очереди, ошибка, причина отключения, нулевая дата или пустая информация не дают успеха. При успешном собственном обновлении очереди пусты, состояние ЗавершеноУспешно и Включена, время обновления ненулевое.
Запросу назначено свое реальное сохраненное имя копии, параметр содержит свой UUID, результат — ровно одна Уч85Книга. Не называйте это доказанным физическим чтением PostgreSQL без диагностики источника или плана.
Права целевой роли ограничены собственной базой. Неверный пароль, порт или несуществующая база дают отказ без CreateDatabase. Не исправляйте ошибку заменой на чужую целевую базу или SetCopyUse.
В этой работе 1С, PostgreSQL, сеть и создание копии не запускались. Будущий положительный запуск разрешается владельцем только на собственном стенде; текущие проверки статические.
Ожидаемый результат
Своему маленькому источнику соответствует точный план репликации в подготовленную собственную SQL-базу: состав, вложенные поля, период, сохранение описания, явное обновление, мониторинг готовности и проверка данных запроса. Ни чужая целевая база, ни резервный архив, ни физический источник запроса не объявляются подтвержденными.
На что обратить внимание
Ни 1С, ни SQL, ни файлы копий здесь не создавались и не запускались. runtimeVerifiedScenarios=0. Пример репликации БД — будущая ручная учебная задача, не команда резервного копирования текущей рабочей базы.
Native УстановитьИспользованиеБазыДанныхКопииЭтойКопией потенциально меняет владельца целевой базы. Контексты возвращаемого объекта информации об использовании и enum в установленной справке противоречивы; в этом уроке метод не вызывается и в PRIMARY не включен. Обновляется только свой новый target; ошибка занятости не обходится.
Native Состав.Добавить описан неоднозначно: общий пример передает метаданные, описание параметра говорит ЭлементСостава. Здесь используется точно описанный Вставить(index,metadata), а Добавить не приписывается нерелевантному вызову. Его ключ остается непокрытым до доказательства.
МенеджерКопииБазыДанных.ПарольПользователяБазыДанных — native RW. Проверяется лишь пустота, секрет не выводится. Пароль целевой базы хранится платформой для последующих обновлений; очищенная форма не удаляет этот секрет. Роль ограничена своей БД и VM, маска не шифрует память.
Не меняются глобальная версия репликации, владельцы других копий и production. Удалить состава до Записать — не DELETE исходных объектов. Очистить используется только в новом плане и назначении своего запроса. Ни SQL DROP, ни CopyManager.Delete нет.
Проверка готовности строгая: законченная порция не равна полному ЗавершеноУспешно. Внешнее изменение целевой базы или неизвестный исход требуют ручной диагностики своего UUID. Нет обещания полного автоматического отката уже зафиксированных исходных данных или описания.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Список двух копий запроса: вставка, поиск, перестановка и два способа удаления
Собственная новая 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 и Состав.Добавить не вызываются. Состав задается точным Вставить с объектом своих метаданных. При внешнем вмешательстве/неизвестном исходе нет обещания полного автоматического отката описаний; нет массового удаления.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.