Находит в исходной строке все вхождения подстроки поиска и заменяет ее на подстроку замены.
Синтаксис
СтрЗаменить(<Строка>, <ПодстрокаПоиска>, <ПодстрокаЗамены>)Примеры платформы
Результат = СтрЗаменить(Номенклатура.Наименование, "_", " ");Полное описание, параметры и ограничения
Глобальный контекст.СтрЗаменить (Global context.StrReplace)
Глобальный контекст (Global context)
СтрЗаменить (StrReplace)
Доступен, начиная с версии 8.0.
Синтаксис:
СтрЗаменить(<Строка>, <ПодстрокаПоиска>, <ПодстрокаЗамены>)
Параметры:
<Строка> (обязательный)
Тип: Строка.
Исходная строка.
<ПодстрокаПоиска> (обязательный)
Тип: Строка.
Искомая подстрока.
<ПодстрокаЗамены> (обязательный)
Тип: Строка.
Подстрока, на которую будет заменена подстрока поиска.
Возвращаемое значение:
Тип: Строка.
Строка, полученная в результате замены.
Описание:
Находит в исходной строке все вхождения подстроки поиска и заменяет ее на подстроку замены.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Внимание: Данный метод не поддерживается при работе через COM-соединение
Пример:
Результат = СтрЗаменить(Номенклатура.Наименование, "_", " ");
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Собственная 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. Нет обещания полного автоматического отката уже зафиксированных исходных данных или описания.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Проверить обязательный маркер HTML-письма на собственном шаблоне
Шаблон обязан содержать &VerificationCode. Другие два маркера необязательны. На своих фиксированных строках показываем подстановку без генерации настоящего кода и без отправки.
Где и как запускать
Полный серверный общий модуль отдельной пустой УчебнаяКонфигурацияСинтаксиса. Только черновик в памяти; установка настроек и отправка отсутствуют.
Подготовка
Создайте отдельную пустую учебную конфигурацию с именем УчебнаяКонфигурацияСинтаксиса на 8.5.1.1343. Рабочая база и копия с действующими почтовыми секретами для этого урока не подходят.
Добавьте серверный общий модуль УчебнаяАутентификацияПочты: Сервер = Истина. Вставьте полный модуль одного урока, не только тело процедуры.
Своей серверной командой вызовите УчебнаяАутентификацияПочты.ВыполнитьПример(). Нужны права для чтения дополнительных настроек; код не включает привилегированный режим.
У типа нет конструктора Новый. Объект получаем штатным методом менеджера в своей пустой учебной базе и сразу заменяем все 18 свойств собственными значениями.
Доступ к менеджеру идёт через ДополнительныеНастройкиАутентификации. Ни один урок не вызывает УстановитьНастройкиАутентификацииЧерезЭлектроннуюПочту, не применяет черновик и не отправляет письмо.
Адреса используют example.invalid, пароль и токен — явно фиктивные учебные строки. Не подставляйте сюда действующие логины, пароли, токены или почтовые адреса.
В сообщения выводятся только проверки и собственные арифметические значения. Исходные значения настроек, пароли, токены и содержимое реальных писем не выводятся.
Это настройки почтовой аутентификации пользователей приложения, не обычный профиль отправки документов через ИнтернетПочта.
Запуск в 1С не проверен. Доставка, OAuth, TLS, права и фактическая аутентификация этим упражнением не тестируются.
Функция ПолучитьСобственныйЧерновик()
Настройки = ДополнительныеНастройкиАутентификации.ПолучитьНастройкиАутентификацииЧерезЭлектроннуюПочту();
Настройки.СпособАутентификацииЧерезЭлектроннуюПочту = СпособАутентификацииЧерезЭлектроннуюПочту.Нет;
Настройки.АдресСервераSMTP = "smtp.example.invalid";
Настройки.ПортSMTP = 465;
Настройки.ИспользоватьSSL = Истина;
Настройки.ПользовательSMTP = "guide-login";
Настройки.ПарольSMTP = "GUIDE-NOT-A-PASSWORD";
Настройки.ТокенДоступа = "";
Настройки.АутентификацияПоТокену = ИспользованиеАутентификацииИнтернетПочтыПоТокену.НеИспользовать;
Настройки.ТолькоЗащищеннаяАутентификацияSMTP = Ложь;
Настройки.Отправитель = "guide@example.invalid";
Настройки.ИмяОтправителя = "Учебное приложение";
Настройки.Заголовок = "Subject: Guide training only" + Символы.ВК + Символы.ПС;
Настройки.АлфавитКодаПодтверждения = "0123456789";
Настройки.ДлинаКодаПодтверждения = 8;
Настройки.СрокДействияКодаПодтверждения = 600;
Настройки.МаксимальноеКоличествоНеуспешныхПопытокПроверкиКодаПодтверждения = 3;
Настройки.ДлительностьБлокировкиЗапросаОбновленияКодаПодтверждения = 60;
Настройки.ТекстСообщенияHTML = "<p>&UserPresentation, учебный код: <strong>&VerificationCode</strong></p><p>&ApplicationPresentation</p>";
Возврат Настройки;
КонецФункции
Процедура ВыполнитьПример() Экспорт
Настройки = ПолучитьСобственныйЧерновик();
Шаблон = Настройки.ТекстСообщенияHTML;
Сообщить(СтрНайти(Шаблон, "&VerificationCode") > 0);
Сообщить(СтрНайти(Шаблон, "&UserPresentation") > 0);
Сообщить(СтрНайти(Шаблон, "&ApplicationPresentation") > 0);
СобственныйПредпросмотр = СтрЗаменить(Шаблон, "&VerificationCode", "DEMO1234");
СобственныйПредпросмотр = СтрЗаменить(СобственныйПредпросмотр, "&UserPresentation", "УчебныйПользователь");
СобственныйПредпросмотр = СтрЗаменить(СобственныйПредпросмотр, "&ApplicationPresentation", "УчебноеПриложение");
Сообщить(СтрНайти(СобственныйПредпросмотр, "DEMO1234") > 0);
Сообщить(СтрНайти(СобственныйПредпросмотр, "&VerificationCode") = 0);
Сообщить(СтрНайти(СобственныйПредпросмотр, "УчебноеПриложение") > 0);
КонецПроцедуры
Разбор по шагам
Берём собственный ТекстСообщенияHTML, не письмо действующего пользователя.
Маркер &VerificationCode обязателен, регистр и написание сохраняем. Это маркер платформы, а не автоматически корректная HTML-сущность.
На фиксированном образце заменяем три маркера своими значениями. DEMO1234 намеренно не цифровой код нашего алфавита: это только видимый текст макета.
Ручная подстановка иллюстрирует шаблон, но не повторяет весь механизм платформы и не отправляет подтверждение.
Если подставляются произвольные пользовательские имена, их нужно экранировать для текстового HTML-контекста. Здесь слова фиксированы и не содержат разметки.
В сообщения выводим только шесть проверок, не шаблон реального письма и не действующий код.
Как проверить результат
Ожидаются шесть Истина. В отладчике собственный предпросмотр содержит DEMO1234 и УчебноеПриложение, но не &VerificationCode.
Не считайте успешную подстановку доказательством отправки или возможности входа: метод установки и сетевые операции отсутствуют.
Ожидаемый результат
Точное имя обязательного параметра изучено на конкретном собственном HTML-шаблоне.
На что обратить внимание
Не заменяйте маркер &VerificationCode на &VerificationCode в настройке с ожиданием той же подстановки платформой.
DEMO1234 — фиктивный текст предпросмотра, не случайный код подтверждения и не допустимый код цифрового алфавита.
Не печатайте реальные коды, токены и письма в журнал регистрации или Сообщить.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.