ТаблицыДляИзмененияСхемыЗапроса.Удалить

Методы · Delete

Удаляет элемент из коллекции.

Синтаксис

Удалить(<Индекс>)
Полное описание, параметры и ограничения

ТаблицыДляИзмененияСхемыЗапроса.Удалить (QuerySchemaTablesForUpdate.Delete)

ТаблицыДляИзмененияСхемыЗапроса (QuerySchemaTablesForUpdate)

Удалить (Delete)

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

Синтаксис:
Удалить(<Индекс>)
Параметры:

<Индекс> (обязательный)
Тип: Число.
Индекс удаляемого элемента.
Описание:

Удаляет элемент из коллекции.

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

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

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

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

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

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

Список ДЛЯ ИЗМЕНЕНИЯ: свой источник, индекс, удаление и восстановление в толстом клиенте

В собственной схеме физического источника редактируем только список FOR UPDATE, сравниваем его с отдельным флагом, семь раз заново разбираем сформированный текст. Ни чтение данных, ни реальные блокировки не выполняются.

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

Полный модуль собственной управляемой формы: только толстый клиент управляемого приложения, все процедуры НаКлиенте, запроса данных и запуска в1С нет.

Подготовка

  1. Создайте НОВУЮ отдельную учебную базу, не копию рабочей, на точно8.5.1.1343. Имя конфигурации УчебныеПараметрыТаблицы85, совместимость Не использовать. Один собственный независимый регистр сведений УчебнаяИстория85, периодичность В пределах секунды; измерение КодТовара: Строка3; ресурс Цена: Число12,2; без реквизитов и обработчиков. Других прикладных объектов, расширений базы/сеанса, подписок и заданий нет.

  2. Создайте свою новую внешнюю обработку УчебныйСписокДляИзменения85 с управляемой Формой. В форме команда/кнопка Выполнить, действие Выполнить; реквизиты не нужны. Вставьте ВЕСЬ приведённый код прямо в модуль формы. Общий серверный модуль для этого урока не используется. Другие модули своей конфигурации вручную пусты.

  3. Выберите именно толстый клиент управляемого приложения. В Конфигураторе настройте Отладка → Параметры → запуск 1С:Предприятия в толстом клиенте с управляемым приложением; название пункта может зависеть от интерфейса. До запуска проверьте выбранный тип клиента. Тонкий, веб-клиент и обычное приложение исключены директивами компиляции; неподходящий клиент получает понятное исключение до создания схемы.

  4. Вне активного опыта сохраните свою конфигурацию, завершите прежний собственный сеанс без транзакции; Конфигурация → Обновить конфигурацию базы данных (F7), дождитесь успеха. Затем свежий собственный толстый управляемый клиент и откройте свою обработку. Здесь 1С/F7 не запускались.

  5. ОператорВыбратьСхемыЗапроса.ТаблицыДляИзменения по установленной справке доступно только толстому клиенту, хотя сама коллекция и некоторые соседние свойства доступны ещё на сервере. Поэтому ВСЕ функции и процедуры этого модуля находятся на клиенте внутри правильной ветки; перенести этот код в серверный общий модуль нельзя.

&НаКлиенте
Процедура Выполнить(Команда)
#Если ТолстыйКлиентУправляемоеПриложение Тогда
    ВыполнитьПример();
    Сообщить("Список таблиц FOR UPDATE изменён и восстановлен только в собственной схеме");
#Иначе
    ВызватьИсключение "Этот урок доступен только в толстом клиенте управляемого приложения";
#КонецЕсли
КонецПроцедуры

#Если ТолстыйКлиентУправляемоеПриложение Тогда
&НаКлиенте
Процедура ВыполнитьПример()
    ПроверитьСвойМинимальныйСтенд();
    ПроверитьСвойРегистр();
    Схема = Новый СхемаЗапроса;
    Схема.РежимКомпоновкиДанных = Ложь;
    Схема.УстановитьТекстЗапроса("ВЫБРАТЬ История.КодТовара КАК КодТовара, История.Цена КАК Цена
    |ИЗ РегистрСведений.УчебнаяИстория85 КАК История");
    Оператор = ПолучитьСвойОператор(Схема);
    ПроверитьСвойСписок(Оператор, Ложь, "");
    ПроверитьПовторныйРазбор(Схема, Ложь, "");
    Источник = Оператор.Источники.Получить(0);
    Список = Оператор.ТаблицыДляИзменения;
    Оператор.ВыбиратьДляИзменения = Истина;
    Добавленный = Список.Добавить(Источник);
    Если ТипЗнч(Добавленный) <> Тип("ТаблицаДляИзмененияСхемыЗапроса")
        Или ТипЗнч(Добавленный.ИмяТаблицы) <> Тип("Строка") Или Добавленный.ИмяТаблицы = "" Тогда
        ВызватьИсключение "Добавить по своему источнику должен вернуть реальное именованное описание";
    КонецЕсли;
    СвоёИмя = Добавленный.ИмяТаблицы;
    ПроверитьСвойСписок(Оператор, Истина, СвоёИмя);
    ПроверитьПовторныйРазбор(Схема, Истина, СвоёИмя);
    Если Список.Индекс(Добавленный) <> 0 Тогда
        ВызватьИсключение "Перед удалением нужен фактический индекс собственного элемента";
    КонецЕсли;
    Список.Удалить(0);
    ПроверитьСвойСписок(Оператор, Истина, "");
    Оператор.ВыбиратьДляИзменения = Ложь;
    ПроверитьСвойСписок(Оператор, Ложь, "");
    ПроверитьПовторныйРазбор(Схема, Ложь, "");
    Оператор.ВыбиратьДляИзменения = Истина;
    ПоИмени = Список.Добавить(СвоёИмя);
    ПроверитьСвойСписок(Оператор, Истина, СвоёИмя);
    Если ПоИмени <> Список.Получить(0) Тогда
        ВызватьИсключение "Добавить по сохранённому собственному имени должен вернуть текущий элемент";
    КонецЕсли;
    ПроверитьПовторныйРазбор(Схема, Истина, СвоёИмя);
    Список.Очистить();
    ПроверитьСвойСписок(Оператор, Истина, "");
    Оператор.ВыбиратьДляИзменения = Ложь;
    ПроверитьСвойСписок(Оператор, Ложь, "");
    ПроверитьПовторныйРазбор(Схема, Ложь, "");
    Восстановленный = Список.Добавить(Источник);
    Оператор.ВыбиратьДляИзменения = Истина;
    ПроверитьСвойСписок(Оператор, Истина, СвоёИмя);
    Если Восстановленный <> Список.Найти(СвоёИмя) Тогда
        ВызватьИсключение "Восстановленное собственное описание должно находиться по имени";
    КонецЕсли;
    ПроверитьПовторныйРазбор(Схема, Истина, СвоёИмя);
    Список.Очистить();
    Оператор.ВыбиратьДляИзменения = Ложь;
    ПроверитьСвойСписок(Оператор, Ложь, "");
    ПроверитьПовторныйРазбор(Схема, Ложь, "");
    Сообщить("Фактическое имя собственного источника для списка: " + СвоёИмя);
    Сообщить("Добавление по источнику/имени, индекс, поиск, удаление, очистка и восстановление проверены; запрос не выполнялся");
КонецПроцедуры

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

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

&НаКлиенте
Функция ПолучитьСвойОператор(Схема)
    Если Схема.РежимКомпоновкиДанных Или Схема.ПакетЗапросов.Количество() <> 1 Тогда
        ВызватьИсключение "Нужна одна собственная обычная схема";
    КонецЕсли;
    Выбор = Схема.ПакетЗапросов.Получить(0);
    Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Или Выбор.Операторы.Количество() <> 1 Тогда
        ВызватьИсключение "Нужен один собственный запрос выбора и оператор";
    КонецЕсли;
    Оператор = Выбор.Операторы.Получить(0);
    Если ТипЗнч(Оператор) <> Тип("ОператорВыбратьСхемыЗапроса") Или Оператор.Источники.Количество() <> 1 Тогда
        ВызватьИсключение "Нужен один собственный источник";
    КонецЕсли;
    Источник = Оператор.Источники.Получить(0);
    Таблица = Источник.Источник;
    Если ТипЗнч(Таблица) <> Тип("ТаблицаСхемыЗапроса")
        Или НРег(Таблица.ИмяТаблицы) <> НРег("РегистрСведений.УчебнаяИстория85")
        Или Таблица.Псевдоним <> "История" Тогда
        ВызватьИсключение "Только свой физический источник История, без виртуальных или вложенных таблиц";
    КонецЕсли;
    Возврат Оператор;
КонецФункции

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

&НаКлиенте
Процедура ПроверитьПовторныйРазбор(Схема, Включено, Имя)
    Текст = Схема.ПолучитьТекстЗапроса();
    Если ТипЗнч(Текст) <> Тип("Строка") Или Текст = "" Тогда
        ВызватьИсключение "Нужен реально сформированный текст собственной схемы";
    КонецЕсли;
    Повторная = Новый СхемаЗапроса;
    Повторная.РежимКомпоновкиДанных = Ложь;
    Повторная.УстановитьТекстЗапроса(Текст);
    ПовторныйОператор = ПолучитьСвойОператор(Повторная);
    ПроверитьСвойСписок(ПовторныйОператор, Включено, Имя);
КонецПроцедуры
#КонецЕсли

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

  1. Создать обычную собственную СхемаЗапроса по полному тексту. Проверить один пакетный запрос, один оператор, один физический источник РегистрСведений.УчебнаяИстория85 с псевдонимом История. Нет виртуального среза, вложенного запроса, чужой таблицы или данных базы.

  2. Исходное состояние: ВыбиратьДляИзменения=Ложь и список пуст. Проверить его, сформировать текст и повторно разобрать самостоятельной схемой. Число элементов списка не является самостоятельным доказательством значения флага.

  3. Включить флаг и Добавить по реальному ИсточникСхемыЗапроса текущего оператора. Сохранить фактическое строковое readonly ИмяТаблицы возвращённого элемента. Код не выдумывает, как платформа отформатирует техническое имя: оно дальше проверяется через поиск и независимый повторный разбор с тем же собственным физическим источником.

  4. Проверить тип элемента, точное сохранённое имя, Индекс=0, Получить(0) и Найти по этому имени. Сформировать текст и новой схемой проверить тот же флаг, список, имя и исходный собственный источник. Это проверка реальной сериализуемой структуры, не только успешного getter.

  5. Удалить принимает ЧИСЛОВОЙ индекс, не объект: после проверки фактического индекса вызвать Удалить(0). Не обращаться к удалённому описанию после удаления. Остаётся флаг Истина при пустом списке; сразу выключить его и повторно разобрать текст без FOR UPDATE. Одно удаление элемента не отключает флаг.

  6. Добавить заново по сохранённому собственному строковому имени — второй native-вариант метода. Проверить, что возвращён текущий элемент списка, и повторно разобрать текст. Имя существует в своём операторе; не передаётся случайное имя отсутствующей таблицы.

  7. Очистить удаляет только элементы своего списка в памяти. Явно проверить ещё включённый флаг, затем выключить его и проверить новой схемой. Восстановить элемент по всё ещё живому собственному источнику, снова проверить поиск и повторный разбор.

  8. В конце оставить список пустым и флаг Ложь, проверить финальный самостоятельный разбор. Обе родительские схемы остаются живыми при работе с дочерними объектами; элементы разных схем не перемещаются. Ни один сформированный текст не передаётся объекту Запрос и не выполняется.

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

  1. Будущий результат: семь независимых повторных разборов проверили режим без FOR UPDATE и режим с одной реальной собственной таблицей. Поиск и индекс возвращают именно текущий элемент, удаление/очистка не меняют данные регистра. Финальное состояние — Ложь и пустой список.

  2. После добавления/восстановления показано фактическое собственное имя таблицы для списка. Не обещается побайтовое совпадение отступов/регистра ключевых слов сформированного текста. Проверяются структура, собственный источник, флаг, тип/имя/число элементов и соответствие поиска/индекса.

  3. Будущий отрицательный контроль: вне опыта изменить только ожидание псевдонима в ПолучитьСвойОператор с История на НеверныйИсточник; сохранить/F7 до свежего толстого сеанса. Проверка источника должна отказать, даже если список имеет правильное число элементов. Вернуть ожидание, снова F7 до нового сеанса. Здесь контроль не запускался.

  4. В тонком/веб-клиенте команда должна отказать без создания недоступных классов, поскольку соответствующая ветка кода исключена компиляцией. Ни этот клиентский контроль, ни толстый клиент здесь не запускались; runtimeVerifiedScenarios=0.

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

Полный собственный пример разбирает оба варианта Добавить, числовое удаление и очистку списка, readonly-имя и отдельный флаг с независимым повторным разбором на каждом значимом переходе.

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

  1. Пустой список при флаге Истина не равен отсутствию ДЛЯ ИЗМЕНЕНИЯ. Если такой текст реально выполнить, он может относиться ко всем источникам; здесь пустые промежуточные состояния не выполняются, а финальный флаг выключен.

  2. Редактирование списка схемы не является записью в регистр или установкой блокировки. Реальные блокировки требуют отдельной подготовки/транзакции/режима и ранее разобраны отдельным уроком; в этом упражнении Запрос.Выполнить и транзакции отсутствуют.

  3. ИмяТаблицы readonly; таблице списка ничего не присваивается. Источник собственной схемы остаётся живым, но удалённый элемент списка не используется после удаления/очистки. Восстановление создаёт новый элемент, а не оживляет старый объект.

  4. Удалить принимает индекс Число. Индекс принимает ТаблицаДляИзмененияСхемыЗапроса; Найти принимает строковое имя. Это три разных аргумента, которые нельзя менять местами.

  5. Native-свойство ТаблицыДляИзменения доступно только толстому клиенту. Доступность класса коллекции на сервере не расширяет доступность пути к нему. Препроцессор и директивы НаКлиенте оставлены в полном модуле; тонкий или серверный контекст не заявляется рабочим.

  6. BSL, клиентская форма, сериализация и блокировки в1С не исполнялись. Статические API-проверки и Python-модель не являются запуском в платформе. Исходные рабочие конфигурации и базы не менялись.

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

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

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

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

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