Возвращает количество табличных пространств.
Синтаксис
Количество()Полное описание, параметры и ограничения
МенеджерТабличныхПространствБазыДанных.Количество (DatabaseTablespacesManager.Count)
МенеджерТабличныхПространствБазыДанных (DatabaseTablespacesManager)
Количество (Count)
Доступен, начиная с версии 8.3.23.
Синтаксис:
Количество()
Возвращаемое значение:
Тип: Число.
Описание:
Возвращает количество табличных пространств.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.3.23.
Методическая информация
Практические примеры
Табличные пространства: два плана размещения и удаление своего пустого пространства
В новой выделенной серверной лаборатории запланировать отдельное размещение данных и индексов одного настоящего собственного справочника. Найти сохраненные планы, показать реальные имена и пути, затем удалить только третье совершенно пустое пространство и проверить весь набор.
Где и как запускать
Тонкий управляемый клиент собственного нового стенда 8.5.1.1343; все API табличных пространств выполняются в одном серверном вызове формы.
Подготовка
Это будущий опыт только в вашей НОВОЙ одноразовой Windows Server 2022 x86-64 VM. Вручную подготовьте отдельный лицензированный сервер 1С КОРП 8.5.1.1343, отдельную собственную службу PostgreSQL с патчем от 1С и НОВЫЙ выделенный кластер. Не новую базу в рабочем кластере: пространства PostgreSQL общие для всех его баз. Клиент, сервер 1С и PostgreSQL находятся на одной своей VM. Сейчас VM, службы, база и каталоги не создавались; 1С, SQL и установщики не запускались.
В официальных таблицах 1С, прочитанных 12.10.2026, для Windows Server 2022 указан PostgreSQL с патчем от 1С 17.10-2.1C x86-64. Установленный V8Update.htm 8.5.1.1343 подтверждает поддержку major PostgreSQL 17 x86-64, но не отдельную пару minor 17.10-2.1C/build 1343. Перед будущим опытом вручную подтвердите совместимость выбранного официального дистрибутива с конкретной платформой и ОС по его паспорту. Если подтверждения нет, стенд не подготовлен. Произвольную версию вместо этой комбинации не используйте. Таблицы: https://v8.1c.ru/tekhnologii/systemnye-trebovaniya-1s-predpriyatiya-8/subd/ и https://v8.1c.ru/tekhnologii/systemnye-trebovaniya-1s-predpriyatiya-8/subd/subd-postgresql/ .
Владелец будущего отдельного кластера вручную готовит собственное подключение 1С к СУБД с полномочием суперпользователя PostgreSQL, необходимым для создания пространства. Это не минимальные права и не предложение выдать их рабочему пользователю. Учетная запись СУБД не является учетной записью Windows службы. Полная роль 1С сама по себе не дает SQL или файловых прав. Для новой собственной базы задайте на сервере 1С имя информационной базы OwnedTablespaces85c171e640, а не только подпись записи списка запуска; не подключайте другие базы или пользователей.
В списке запуска своей базы используйте точную строку Srvr="localhost";Ref="OwnedTablespaces85c171e640";. На сервере от имени клиентского приложения СтрокаСоединенияИнформационнойБазы возвращает именно запись регистрации в клиенте; код проверяет тип Строка и полное совпадение. Другой допустимый формат, порядок параметров или имя дает отказ до менеджера, а не автоматическое исправление. Эта строка не доказывает владение или реальную настройку СУБД; same-VM/новый кластер готовятся вами вручную.
На постоянном NTFS диске своей VM вручную создайте три РАЗНЫХ новых пустых каталога C:\1CLabTablespaces85\c171e640-9da4-4b2d-966d-df2585a82067\Data, C:\1CLabTablespaces85\c171e640-9da4-4b2d-966d-df2585a82067\Index и C:\1CLabTablespaces85\c171e640-9da4-4b2d-966d-df2585a82067\Empty. Они вне основного каталога PostgreSQL, не на съемном/временном диске и не в чужих папках. Фактическая учетная запись ОС своей службы PostgreSQL должна владеть этими папками, иметь доступ к родительскому пути и запись в них; не предполагается имя postgres или пользователь рабочего стола. Не давайте службе запись в бинарные файлы. PostgreSQL не создает эти каталоги сам. Три SQL-пространства заранее не создавайте: это сделает код.
Создайте только свою новую пустую клиент-серверную ИБ, не File и не Дата акселератор. В свойствах конфигурации: Имя = УчебныеПространства85, Версия = owned-tablespaces85-c171e640-9da4-4b2d-966d-df2585a82067, ОсновнойРежимЗапуска = УправляемоеПриложение, РежимСовместимости = НеИспользовать, встроенный язык русский. РежимИспользованияТабличныхПространствБазыДанных должен фактически быть Использовать. Литерал версии и каталог обозначают выбранный стенд, не токен прав или доказательство владения.
Справочники → Добавить → УчебныеТовары85: без дополнительных реквизитов, табличных частей, обработчиков и прикладных записей. Создайте одну общую управляемую форму УчебныеПространства85 и одну роль УчебнаяПолная85 с консервативными полными правами только этой пустой лаборатории. Через Администрирование → Пользователи создайте своего единственного пользователя с этой ролью. Не добавляйте других объектов, общих реквизитов/разделителей, заданий, подписок, расширений, сервисов или обработчиков. После проверки конфигурации обновите только собственную новую конфигурацию БД: метаданные справочника должны соответствовать реальной собственной таблице.
Общие → Общие формы → УчебныеПространства85: реквизиты Согласие85 и Остановка85 типа Булево, Протокол85 типа Строка неограниченной длины. Согласие85 выведите флажком «Разрешаю создать два плана и удалить третье пустое пространство своей новой базы». Остановка85 скройте от редактирования, Протокол85 выведите многострочным полем только просмотра. Начальные значения редактора не требуются: фактически Остановка85 = Ложь проверяется кодом, согласие задаете вы. Программного сброса остановки нет.
В свойствах своей формы вручную задайте СохранениеДанныхВНастройках = НеИспользовать и АвтоматическоеСохранениеДанныхВНастройках = НеИспользовать как значения перечислений, не Булево. Создайте команду СоздатьПланы85 с действием СоздатьПланы85 и кнопку этой команды. В модуль формы вставьте основной код целиком; параметр Команда оставьте. Других событий формы связывать не нужно. Конфигурация → Открыть модуль управляемого приложения: вставьте полный отдельный блок «УправляемоеПриложение» ниже.
После обновления своей базы закройте ее Конфигуратор и все остальные соединения, запустите один тонкий клиент своего стенда. Штатное начало работы только открывает форму: не создает пространства, не читает их и не меняет планы. Имена LabData85, LabIndex85, LabEmpty85 должны быть свободны во всем собственном выделенном кластере; код дополнительно проверяет полный доступный набор. Маркеры и проверка метаданных не доказывают лицензирование, совместимость minor, служебные права или отсутствие внешних подключений: это ваша ручная подготовка.
Прочитайте предупреждение перед согласием: создание пространств может изменять СУБД и файлы, Записать сохраняет планы, Удалить выполняется немедленно. После успеха два плана намеренно остаются. После ошибки могут остаться частичные изменения; повтор, автоматическое восстановление и удаление для очистки запрещены. Не выполняйте опыт в базе с реальными данными и не удаляйте каталоги работающего кластера.
Включите Согласие85 и один раз нажмите СоздатьПланы85. Клиент захватывает настоящее исходное Булево, снимает флажок и устанавливает остановку ДО обращения к серверу. Сервер проверяет захваченное значение вместе с уже остановленной формой до обращения к менеджеру. Это однократный протокол собственной кнопки, не защита от поддельных RPC. После успеха или ошибки повтор в той же форме запрещен; не обходите остановку и не переоткрывайте форму ради повторной попытки.
&НаСервере
Процедура ПроверитьСтенд85(Знач ИсходноеСогласие)
Если ТипЗнч(ИсходноеСогласие) <> Тип("Булево") Или Не ИсходноеСогласие
Или ТипЗнч(Согласие85) <> Тип("Булево") Или Согласие85
Или ТипЗнч(Остановка85) <> Тип("Булево") Или Не Остановка85
Или ТипЗнч(Протокол85) <> Тип("Строка") Тогда
ВызватьИсключение "Нужно исходное согласие, уже потребленное своей клиентской командой";
КонецЕсли;
Соединение = СтрокаСоединенияИнформационнойБазы();
Если ТипЗнч(Соединение) <> Тип("Строка")
Или Соединение <> "Srvr=""localhost"";Ref=""OwnedTablespaces85c171e640"";" Тогда
ВызватьИсключение "Нужна точная регистрация своей серверной базы на той же учебной VM";
КонецЕсли;
Если Метаданные.ОсновнойРежимЗапуска <> РежимЗапускаКлиентскогоПриложения.УправляемоеПриложение Или Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или Метаданные.РежимИспользованияТабличныхПространствБазыДанных <> РежимИспользованияТабличныхПространствБазыДанных.Использовать Или ИмяФормы <> "ОбщаяФорма.УчебныеПространства85" Тогда
ВызватьИсключение "Нужна только собственная новая серверная лаборатория с разрешенными пространствами";
КонецЕсли;
Если Метаданные.Справочники.Количество() <> 1 Или Метаданные.Справочники.Найти("УчебныеТовары85") = Неопределено
Или Метаданные.ОбщиеФормы.Количество() <> 1 Или Метаданные.ОбщиеФормы.Найти("УчебныеПространства85") = Неопределено
Или Метаданные.Роли.Количество() <> 1 Или Метаданные.Роли.Найти("УчебнаяПолная85") = Неопределено
Или Метаданные.Документы.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0
Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0
Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0 Тогда
ВызватьИсключение "Нужны только свой справочник, форма и роль без посторонних объектов и обработчиков";
КонецЕсли;
Описание = Метаданные.Справочники.Найти("УчебныеТовары85");
Если Описание.Реквизиты.Количество() <> 0 Или Описание.ТабличныеЧасти.Количество() <> 0 Тогда
ВызватьИсключение "У собственного справочника не должно быть дополнительных реквизитов или табличных частей";
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПроверитьПространство85(Пространство, НужноеИмя)
Если ТипЗнч(Пространство) <> Тип("МенеджерТабличногоПространстваБазыДанных")
Или ТипЗнч(НужноеИмя) <> Тип("Строка") Тогда
ВызватьИсключение "Не получен настоящий менеджер собственного пространства";
КонецЕсли;
Если ТипЗнч(Пространство.Имя) <> Тип("Строка") Или Пространство.Имя <> НужноеИмя
Или ТипЗнч(Пространство.ПутьДоПространства) <> Тип("Строка") Или Пространство.ПутьДоПространства = "" Тогда
ВызватьИсключение "Не совпало собственное имя или не получен фактический путь";
КонецЕсли;
Возврат Пространство.ПутьДоПространства;
КонецФункции
&НаСервере
Функция СнимокПространств85(Менеджеры)
Если ТипЗнч(Менеджеры) <> Тип("МенеджерТабличныхПространствБазыДанных") Тогда
ВызватьИсключение "Нужен менеджер из настоящего глобального свойства";
КонецЕсли;
Количество = Менеджеры.Количество();
Если ТипЗнч(Количество) <> Тип("Число") Или Количество < 0 Тогда
ВызватьИсключение "Не получено фактическое количество пространств";
КонецЕсли;
Снимок = Новый Соответствие;
Для Каждого Пространство Из Менеджеры Цикл
Если ТипЗнч(Пространство) <> Тип("МенеджерТабличногоПространстваБазыДанных") Тогда
ВызватьИсключение "В полном наборе есть значение не того типа";
КонецЕсли;
Если ТипЗнч(Пространство.Имя) <> Тип("Строка") Или Пространство.Имя = ""
Или ТипЗнч(Пространство.ПутьДоПространства) <> Тип("Строка")
Или Снимок.Получить(Пространство.Имя) <> Неопределено Тогда
ВызватьИсключение "Неполный или неоднозначный набор имен и путей";
КонецЕсли;
Снимок.Вставить(Пространство.Имя, Пространство.ПутьДоПространства);
КонецЦикла;
Если Снимок.Количество() <> Количество Или Менеджеры.Количество() <> Количество Тогда
ВызватьИсключение "Количество изменилось во время чтения полного набора";
КонецЕсли;
Возврат Снимок;
КонецФункции
&НаСервере
Процедура СравнитьНаборы85(Ожидаемый, Фактический)
Если ТипЗнч(Ожидаемый) <> Тип("Соответствие") Или ТипЗнч(Фактический) <> Тип("Соответствие")
Или Ожидаемый.Количество() <> Фактический.Количество() Тогда
ВызватьИсключение "Не совпало полное количество пространств";
КонецЕсли;
Для Каждого Пара Из Ожидаемый Цикл
Путь = Фактический.Получить(Пара.Ключ);
Если ТипЗнч(Пара.Ключ) <> Тип("Строка") Или ТипЗнч(Пара.Значение) <> Тип("Строка")
Или ТипЗнч(Путь) <> Тип("Строка") Или Путь <> Пара.Значение Тогда
ВызватьИсключение "Изменился путь или пропало пространство исходного полного набора";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПроверитьСостав85(Состав, ОписаниеТоваров, НужноеКоличество)
Если ТипЗнч(Состав) <> Тип("СоставТабличногоПространстваБазыДанных")
Или ТипЗнч(НужноеКоличество) <> Тип("Число") Или (НужноеКоличество <> 0 И НужноеКоличество <> 1) Тогда
ВызватьИсключение "Нужен настоящий состав и ожидаемое количество 0 или 1";
КонецЕсли;
ФактическоеКоличество = Состав.Количество();
Если ТипЗнч(ФактическоеКоличество) <> Тип("Число") Или ФактическоеКоличество <> НужноеКоличество Тогда
ВызватьИсключение "Не совпал полный состав собственного пространства";
КонецЕсли;
Если НужноеКоличество = 1 Тогда
НайденныйЭлемент = Состав.Найти(ОписаниеТоваров);
Если ТипЗнч(НайденныйЭлемент) <> Тип("ЭлементСоставаТабличногоПространстваБазыДанных") Тогда
ВызватьИсключение "Не найден настоящий элемент по собственным метаданным";
КонецЕсли;
Если ТипЗнч(НайденныйЭлемент.Метаданные) <> ТипЗнч(ОписаниеТоваров)
Или НайденныйЭлемент.Метаданные <> ОписаниеТоваров Тогда
ВызватьИсключение "Состав содержит не свой справочник";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция СоздатьПланыНаСервере85(Знач ИсходноеСогласие)
ПроверитьСтенд85(ИсходноеСогласие);
ОписаниеТоваров = Метаданные.Справочники.Найти("УчебныеТовары85");
ПолноеИмяТоваров = ОписаниеТоваров.ПолноеИмя();
Если ТипЗнч(ПолноеИмяТоваров) <> Тип("Строка") Или ПолноеИмяТоваров <> "Справочник.УчебныеТовары85" Тогда
ВызватьИсключение "Не получено полное имя собственного справочника";
КонецЕсли;
Менеджеры = ТабличныеПространстваБазыДанных;
Исходный = СнимокПространств85(Менеджеры);
Было = Исходный.Количество();
Если Исходный.Получить("LabData85") <> Неопределено Или Исходный.Получить("LabIndex85") <> Неопределено
Или Исходный.Получить("LabEmpty85") <> Неопределено Тогда
ВызватьИсключение "Учебные имена уже заняты: никаких пространств не создавали";
КонецЕсли;
Данные = Менеджеры.Добавить("LabData85", "C:\1CLabTablespaces85\c171e640-9da4-4b2d-966d-df2585a82067\Data");
ПутьДанных = ПроверитьПространство85(Данные, "LabData85");
Индексы = Менеджеры.Добавить("LabIndex85", "C:\1CLabTablespaces85\c171e640-9da4-4b2d-966d-df2585a82067\Index");
ПутьИндексов = ПроверитьПространство85(Индексы, "LabIndex85");
СоставДанных = Данные.ИзмененныйСоставДанных;
СоставИндексов = Индексы.ИзмененныйСоставИндексов;
ПроверитьСостав85(СоставДанных, ОписаниеТоваров, 0);
ПроверитьСостав85(СоставИндексов, ОписаниеТоваров, 0);
ПроверитьСостав85(Данные.ИзмененныйСоставИндексов, ОписаниеТоваров, 0);
ПроверитьСостав85(Индексы.ИзмененныйСоставДанных, ОписаниеТоваров, 0);
Элемент = Новый ЭлементСоставаТабличногоПространстваБазыДанных;
Элемент.Метаданные = ОписаниеТоваров;
КопияДанных = СоставДанных.Добавить(Элемент);
КопияИндексов = СоставИндексов.Добавить(Элемент);
Если ТипЗнч(КопияДанных) <> Тип("ЭлементСоставаТабличногоПространстваБазыДанных")
Или ТипЗнч(КопияИндексов) <> Тип("ЭлементСоставаТабличногоПространстваБазыДанных") Тогда
ВызватьИсключение "Добавить не вернул настоящие копии элементов";
КонецЕсли;
Если ТипЗнч(КопияДанных.Метаданные) <> ТипЗнч(ОписаниеТоваров) Или КопияДанных.Метаданные <> ОписаниеТоваров
Или ТипЗнч(КопияИндексов.Метаданные) <> ТипЗнч(ОписаниеТоваров) Или КопияИндексов.Метаданные <> ОписаниеТоваров Тогда
ВызватьИсключение "В возвращенных копиях не собственные метаданные";
КонецЕсли;
ПроверитьСостав85(СоставДанных, ОписаниеТоваров, 1);
ПроверитьСостав85(СоставИндексов, ОписаниеТоваров, 1);
Данные.Записать();
Индексы.Записать();
НайденныеДанные = Менеджеры.Найти("LabData85");
НайденныеИндексы = Менеджеры.Найти("LabIndex85");
ПланДанных = Менеджеры.НайтиПоИзмененномуСоставуДанных(ОписаниеТоваров);
ПланИндексов = Менеджеры.НайтиПоИзмененномуСоставуИндексов(ОписаниеТоваров);
Если ПроверитьПространство85(НайденныеДанные, "LabData85") <> ПутьДанных
Или ПроверитьПространство85(НайденныеИндексы, "LabIndex85") <> ПутьИндексов
Или ПроверитьПространство85(ПланДанных, "LabData85") <> ПутьДанных
Или ПроверитьПространство85(ПланИндексов, "LabIndex85") <> ПутьИндексов Тогда
ВызватьИсключение "Поиск не подтвердил оба настоящих собственных плана";
КонецЕсли;
ПроверитьСостав85(НайденныеДанные.ИзмененныйСоставДанных, ОписаниеТоваров, 1);
ПроверитьСостав85(НайденныеДанные.ИзмененныйСоставИндексов, ОписаниеТоваров, 0);
ПроверитьСостав85(НайденныеИндексы.ИзмененныйСоставИндексов, ОписаниеТоваров, 1);
ПроверитьСостав85(НайденныеИндексы.ИзмененныйСоставДанных, ОписаниеТоваров, 0);
ПроверитьСостав85(ПланДанных.ИзмененныйСоставДанных, ОписаниеТоваров, 1);
ПроверитьСостав85(ПланИндексов.ИзмененныйСоставИндексов, ОписаниеТоваров, 1);
ОжидаемыеПланы = Новый Соответствие;
Для Каждого Пара Из Исходный Цикл
ОжидаемыеПланы.Вставить(Пара.Ключ, Пара.Значение);
КонецЦикла;
ОжидаемыеПланы.Вставить("LabData85", ПутьДанных);
ОжидаемыеПланы.Вставить("LabIndex85", ПутьИндексов);
ПослеПланов = СнимокПространств85(Менеджеры);
СравнитьНаборы85(ОжидаемыеПланы, ПослеПланов);
Если ПослеПланов.Количество() <> Было + 2 Тогда
ВызватьИсключение "Не подтверждено увеличение N до N+2";
КонецЕсли;
Пустое = Менеджеры.Добавить("LabEmpty85", "C:\1CLabTablespaces85\c171e640-9da4-4b2d-966d-df2585a82067\Empty");
ПутьПустого = ПроверитьПространство85(Пустое, "LabEmpty85");
Пустое.Записать();
НайденноеПустое = Менеджеры.Найти("LabEmpty85");
Если ПроверитьПространство85(НайденноеПустое, "LabEmpty85") <> ПутьПустого Тогда
ВызватьИсключение "Не подтверждено собственное пустое пространство";
КонецЕсли;
ПроверитьСостав85(НайденноеПустое.ИзмененныйСоставДанных, ОписаниеТоваров, 0);
ПроверитьСостав85(НайденноеПустое.ИзмененныйСоставИндексов, ОписаниеТоваров, 0);
ПроверитьСостав85(НайденноеПустое.ИспользуемыйСоставДанных, ОписаниеТоваров, 0);
ПроверитьСостав85(НайденноеПустое.ИспользуемыйСоставИндексов, ОписаниеТоваров, 0);
ОжидаемыеСПустым = Новый Соответствие;
Для Каждого Пара Из ПослеПланов Цикл
ОжидаемыеСПустым.Вставить(Пара.Ключ, Пара.Значение);
КонецЦикла;
ОжидаемыеСПустым.Вставить("LabEmpty85", ПутьПустого);
СДобавленнымПустым = СнимокПространств85(Менеджеры);
СравнитьНаборы85(ОжидаемыеСПустым, СДобавленнымПустым);
Если СДобавленнымПустым.Количество() <> Было + 3 Тогда
ВызватьИсключение "Не подтверждено увеличение N+2 до N+3";
КонецЕсли;
Менеджеры.Удалить(Пустое);
Итог = СнимокПространств85(Менеджеры);
СравнитьНаборы85(ОжидаемыеПланы, Итог);
Если Итог.Количество() <> Было + 2 Тогда
ВызватьИсключение "Не подтвержден возврат N+3 к N+2";
КонецЕсли;
Возврат "Глава 1. " + ПолноеИмяТоваров + Символы.ПС
+ "План данных: " + ПланДанных.Имя + "; фактический путь: " + ПутьДанных + Символы.ПС
+ "План индексов: " + ПланИндексов.Имя + "; фактический путь: " + ПутьИндексов + Символы.ПС
+ "Глава 2. " + "LabEmpty85" + " удалено; исходные имена и пути сохранены." + Символы.ПС
+ "Количество: " + Строка(Было) + " → " + Строка(ПослеПланов.Количество())
+ " → " + Строка(СДобавленнымПустым.Количество()) + " → " + Строка(Итог.Количество())
+ ". Два плана оставлены. Физическое перемещение не выполнялось.";
КонецФункции
&НаКлиенте
Процедура СоздатьПланы85(Команда)
Если ТипЗнч(Согласие85) <> Тип("Булево") Или ТипЗнч(Остановка85) <> Тип("Булево")
Или Остановка85 Или Не Согласие85 Тогда
ВызватьИсключение "Нужно фактическое согласие на один опыт в новой лаборатории";
КонецЕсли;
Если ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда.Имя <> "СоздатьПланы85" Или Команда.Действие <> "СоздатьПланы85" Тогда
ВызватьИсключение "Нажмите собственную кнопку СоздатьПланы85";
КонецЕсли;
ИсходноеСогласие = Согласие85;
Согласие85 = Ложь;
Остановка85 = Истина;
Попытка
Протокол = СоздатьПланыНаСервере85(ИсходноеСогласие);
Если ТипЗнч(Протокол) <> Тип("Строка") Тогда
ВызватьИсключение "Не получен полностью проверенный строковый протокол";
КонецЕсли;
Протокол85 = Протокол;
Исключение
Согласие85 = Ложь;
Остановка85 = Истина;
Протокол85 = "Результат неизвестен. Пространства или планы могли остаться частично созданными. Новые чтения, повтор, восстановление и удаление для очистки запрещены.";
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыШтатно открыть собственную форму без операций с пространствами
Конфигурация → Открыть модуль управляемого приложения
Тонкий управляемый клиент
Процедура ПриНачалеРаботыСистемы()
#Если ТонкийКлиент Тогда
ОткрытьФорму("ОбщаяФорма.УчебныеПространства85");
#Иначе
ВызватьИсключение "Запускайте только тонкий управляемый клиент своего стенда";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Глава 1. Клиент проверяет настоящее согласие и свою команду, расходует согласие и останавливает форму до сервера. Сервер проверяет переданный исходный признак, уже остановленную форму, платформу, маркеры, собственную схему и разрешенный режим пространств.
Глобальное свойство ТабличныеПространстваБазыДанных дает настоящий менеджер. Перебор сохраняет все исходные имена и пути, а Количество проверяет полноту. Исходное N не предполагается равным нулю. При занятом учебном имени ничего нового не создается.
Добавить создает собственные LabData85 и LabIndex85 с подготовленными каталогами. Фактические пути удерживаются из результатов. Новый ЭлементСоставаТабличногоПространстваБазыДанных получает реальные метаданные УчебныеТовары85; составы возвращают копии добавленного элемента, и их метаданные проверяются.
У первого пространства ровно один объект в ИзмененныйСоставДанных, у второго ровно один в ИзмененныйСоставИндексов; противоположные составы пусты. Записать сохраняет оба плана без присваивания результата. Конфликт размещения вызывает остановку, а не очистку существующего пространства.
Найти по созданным именам и два поиска по измененным составам получают настоящие менеджеры. Их имена, удержанные пути и весь состав проверяются. Вывод показывает, куда запланированы данные и индексы своего справочника. Полный набор сохраняет все исходные пространства и содержит ровно N+2.
Глава 2. Создается и записывается только дополнительное LabEmpty85 без метаданных. Его имя и путь подтверждает Найти, а все четыре измененных/используемых состава имеют фактическое количество 0. Полное членство содержит ровно предыдущий набор плюс это пустое пространство: N+3.
Удалить получает только удержанный менеджер LabEmpty85 и вызывается отдельно, без результата. Свежий полный перебор должен точно совпасть с набором после двух планов: N+2, все исходные имена/пути и оба новых плана сохранены. Поиск уже отсутствующего имени не вызывается.
Как проверить результат
До нажатия кнопки нет операций с табличными пространствами. Без фактического согласия, с остановленной формой или чужой командой отказ наступает до серверного вызова.
В будущем положительном протоколе есть Справочник.УчебныеТовары85, фактические LabData85/LabIndex85 и их реальные пути. Имена и пути получены из найденных планов; это не заранее напечатанный список вместо поиска.
Если исходное количество было N, строка количества показывает N → N+2 → N+3 → N+2. Проверяется не только число: полный исходный набор имен и путей должен сохраниться, два плана остаются, LabEmpty85 отсутствует.
Удаление допускается только после четырех фактических нулей собственных составов. Непустой состав, иной объект метаданных, неверное имя, путь, количество или тип означает отказ, не успешный учебный результат.
Повторно нажмите кнопку в той же форме после положительного опыта: отказ должен произойти до нового RPC. При любой ошибке результат неизвестен и клиент сохраняет остановку даже при неизвестной обратной синхронизации; никаких дальнейших native чтений или восстановления нет.
Физическое применение планов, перемещение таблиц/индексов и фактическое используемое размещение не проверяются. Это ручные будущие наблюдения, а не уже выполненный запуск: сейчас 1С и СУБД не запускались.
Ожидаемый результат
Ожидаемый будущий результат: протокол показывает два проверенных плана одного собственного справочника и изменение N → N+2 → N+3 → N+2. Только новое пустое пространство удалено, все исходные имена/пути и оба плана сохранены. Это не доказательство физического перемещения или уже выполненного опыта.
На что обратить внимание
Нужны лицензия КОРП и поддерживаемая серверная СУБД. В File режиме и с Дата акселератором табличные пространства не поддерживаются. Произвольный PostgreSQL или рабочий кластер не заменяют подготовленную лабораторию.
МенеджерТабличныхПространствБазыДанных и менеджер отдельного пространства не имеют конструктора. Первый берется из глобального свойства, второй — из настоящих Добавить/Найти. Имена собственных пространств латинские, не более 16 символов и уникальны.
Найти по имени и по измененному составу объявляют возвращаемым типом менеджер, а не обещание Неопределено при отсутствии. Поэтому код ищет только реально созданные имена и свой записанный объект, а отсутствие после удаления доказывает полным перебором.
Метаданные элемента состава записываются, но свойства менеджера и возвращаемые ИспользуемыйСоставДанных/Индексов не изменяются. Добавить состава возвращает копию; искать в составе надо по настоящему объекту метаданных, не по элементу.
Записать сохраняет пространство и план, но не является доказанным вызовом физического применения. НайтиПоИспользуемомуСоставуДанных и НайтиПоИспользуемомуСоставуИндексов здесь не демонстрируются: точный документированный этап применения пока не установлен.
Удалить немедленно удаляет только пустое пространство. Код не удаляет исходные/default пространства или два плановых, не снимает монополию, не выполняет SQL и не обещает откат, восстановление после ошибки или защиту от конкурентного подключения.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.