Предложение УНИЧТОЖИТЬ

Язык запросов

Синтаксис и применение Предложение УНИЧТОЖИТЬ в платформе 1С:Предприятие. Описание и примеры кода.

Полное описание, параметры и ограничения

Предложение УНИЧТОЖИТЬ

Для удаления временной таблицы из менеджера временных таблиц следует воспользоваться ключевым словом языка запроса УНИЧТОЖИТЬ, после которого указывается имя уничтожаемой таблицы. Например:

УНИЧТОЖИТЬ ВременнаяТаблица

В случае если уничтожаемой таблицы не существует, будет выдана ошибка.

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

Дополнить свою временную таблицу, проверить индексы и технические ключи, затем удалить

Три позиции и дополнение из двух строк дают пять собственных записей. Один индекс и два набора индексов не задают порядок строк и не заменяют проверку бизнес-дублей; автонумерация создаёт отдельный ключ только новой временной таблицы.

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

Полный серверный модуль своего учебного стенда 8.5.1.1343, совместимость Не использовать. Только пять собственных позиций, приватный менеджер и значения памяти; рабочие источники, файлы и сеть не используются. Здесь не запускался.

Подготовка

  1. В отдельной учебной базе 8.5.1.1343 создайте общий модуль УчебныйЯзык: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь. Клиентские и внешнее соединение отключены; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать.

  2. Вставьте весь приведённый текст в этот общий модуль. ВыполнитьПример — экспортная точка входа; остальные процедуры и функции располагаются рядом, а не внутри неё.

  3. В своей внешней учебной обработке создайте управляемую форму, команду Выполнить и кнопку. Клиентский обработчик Выполнить(Команда) вызывает свою процедуру ВыполнитьНаСервере(); она имеет директиву &НаСервереБезКонтекста и одну строку УчебныйЯзык.ВыполнитьПример();. Это серверный вызов общего модуля, а не разрешение клиенту прямо обращаться к серверной библиотеке.

  4. Все товары, количества и строки придуманы в этом модуле. Запись документов, подключение к чужой базе, файлы, сеть и печать не используются. В рабочие общие модули текст не вставляйте.

  5. HTML только показывает BSL. Код в 1С не запускался; перечисленные результаты и отрицательные опыты проверяйте самостоятельно в собственном стенде.

  6. Корневой режим совместимости своей учебной конфигурации — Не использовать. Совместимость проверяет код; на старой совместимости новые конструкции не обещаются.

  7. Метаданные товаров, документов и регистров не нужны: все числа/строки создаются модулем. Вставьте также три вспомогательные процедуры/функции из полного текста.

  8. Не передавайте существующий менеджер временных таблиц. Новый приватный Менеджер создаётся самим уроком и содержит только его три таблицы.

  9. Контрольные позиции: номера 1..5, регионы 1,1,2,2,1, коды 10,10,20,10,30, количества 2,3,1,4,5. Не запускайте фрагменты вразнобой: создание предшествует ДОБАВИТЬ и УНИЧТОЖИТЬ.

Процедура ВыполнитьПример() Экспорт
    Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
        ВызватьИсключение "Нужен собственный учебный стенд без старого режима совместимости";
    КонецЕсли;
    Первый = СоздатьСвойИсточник();
    Дополнение = СоздатьСвойИсточник();
    ДобавитьСвоюПозицию(Первый, 3, 2, 20, 1);
    ДобавитьСвоюПозицию(Первый, 1, 1, 10, 2);
    ДобавитьСвоюПозицию(Первый, 2, 1, 10, 3);
    ДобавитьСвоюПозицию(Дополнение, 4, 2, 10, 4);
    ДобавитьСвоюПозицию(Дополнение, 5, 1, 30, 5);
    Если Первый.Количество() <> 3 Или Дополнение.Количество() <> 2 Тогда
        ВызватьИсключение "Изменился состав собственных источников";
    КонецЕсли;
    Ожидаемые = Первый.Скопировать();
    Для Каждого Позиция Из Дополнение Цикл
        ДобавитьСвоюПозицию(Ожидаемые, Позиция.СвойНомер, Позиция.Регион, Позиция.Код, Позиция.Количество);
    КонецЦикла;
    Менеджер = Новый МенеджерВременныхТаблиц;
    Попытка
        Если Менеджер.Таблицы.Количество() <> 0 Тогда
            ВызватьИсключение "Новый собственный менеджер должен быть пустым";
        КонецЕсли;
        Запрос = Новый Запрос;
        Запрос.МенеджерВременныхТаблиц = Менеджер;
        Запрос.Текст = "ВЫБРАТЬ Начальные.СвойНомер КАК СвойНомер,
        |Начальные.Регион КАК Регион, Начальные.Код КАК Код, Начальные.Количество КАК Количество
        |ПОМЕСТИТЬ ВТСвойОдинИндекс
        |ИЗ &Первый КАК Начальные
        |ИНДЕКСИРОВАТЬ ПО Код;
        |
        |ВЫБРАТЬ Начальные.СвойНомер КАК СвойНомер,
        |Начальные.Регион КАК Регион, Начальные.Код КАК Код, Начальные.Количество КАК Количество
        |ПОМЕСТИТЬ ВТСвоиНаборыИндексов
        |ИЗ &Первый КАК Начальные
        |ИНДЕКСИРОВАТЬ ПО НАБОРАМ ((СвойНомер) УНИКАЛЬНО, (Регион, Код))";
        Запрос.УстановитьПараметр("Первый", Первый);
        Запрос.ВыполнитьПакет();
        Если Менеджер.Таблицы.Количество() <> 2 Тогда
            ВызватьИсключение "Не созданы две свои временные таблицы";
        КонецЕсли;
        Запрос.Текст = "ВЫБРАТЬ Дополнительные.СвойНомер КАК СвойНомер,
        |Дополнительные.Регион КАК Регион, Дополнительные.Код КАК Код,
        |Дополнительные.Количество КАК Количество
        |ДОБАВИТЬ ВТСвоиНаборыИндексов
        |ИЗ &Дополнение КАК Дополнительные";
        Запрос.УстановитьПараметр("Дополнение", Дополнение);
        Запрос.Выполнить();
        Запрос.Текст = "ВЫБРАТЬ СвойНомер, Регион, Код, Количество
        |ИЗ ВТСвойОдинИндекс УПОРЯДОЧИТЬ ПО СвойНомер";
        ИсходнаяКопия = Запрос.Выполнить().Выгрузить();
        ПроверитьСвоиСтроки(ИсходнаяКопия, Первый);
        Запрос.Текст = "ВЫБРАТЬ СвойНомер, Регион, Код, Количество
        |ИЗ ВТСвоиНаборыИндексов УПОРЯДОЧИТЬ ПО СвойНомер";
        ВсеПозиции = Запрос.Выполнить().Выгрузить();
        ПроверитьСвоиСтроки(ВсеПозиции, Ожидаемые);
        Если ВсеПозиции.Количество() <> 5 Или ВсеПозиции.Итог("Количество") <> 15 Тогда
            ВызватьИсключение "Не подтверждены пять своих позиций и сумма 15";
        КонецЕсли;
        Для Индекс = 0 По ВсеПозиции.Количество() - 1 Цикл
            Если ВсеПозиции[Индекс].СвойНомер <> Индекс + 1 Тогда
                ВызватьИсключение "Явный порядок по собственному номеру не подтверждён";
            КонецЕсли;
        КонецЦикла;
        Запрос.Текст = "ВЫБРАТЬ СвойНомер, Регион, Код, Количество
        |ИЗ ВТСвоиНаборыИндексов
        |ГДЕ Регион = &Регион И Код = &Код
        |УПОРЯДОЧИТЬ ПО СвойНомер";
        Запрос.УстановитьПараметр("Регион", 1);
        Запрос.УстановитьПараметр("Код", 10);
        Срез = Запрос.Выполнить().Выгрузить();
        ПроверитьСвоиСтроки(Срез, Первый.НайтиСтроки(Новый Структура("Регион,Код", 1, 10)));
        Если Срез.Количество() <> 2 Или Срез.Итог("Количество") <> 5 Тогда
            ВызватьИсключение "Не подтверждён свой срез 1/10";
        КонецЕсли;
        Запрос.Текст = "ВЫБРАТЬ Код КАК Код, КОЛИЧЕСТВО(*) КАК Строк, СУММА(Количество) КАК Количество
        |ИЗ ВТСвоиНаборыИндексов
        |СГРУППИРОВАТЬ ПО Код УПОРЯДОЧИТЬ ПО Код";
        ПоКодам = Запрос.Выполнить().Выгрузить();
        Если ПоКодам.Количество() <> 3 Тогда
            ВызватьИсключение "Ожидались три собственных кода";
        КонецЕсли;
        Если ПоКодам[0].Код <> 10 Или ПоКодам[0].Строк <> 3 Или ПоКодам[0].Количество <> 9
            Или ПоКодам[1].Код <> 20 Или ПоКодам[1].Строк <> 1 Или ПоКодам[1].Количество <> 1
            Или ПоКодам[2].Код <> 30 Или ПоКодам[2].Строк <> 1 Или ПоКодам[2].Количество <> 5 Тогда
            ВызватьИсключение "Не подтверждён полный состав собственных групп";
        КонецЕсли;
        Сообщить("Код 10 повторяется в трёх строках: уникальный индекс собственного номера не убирает эти позиции");
        Запрос.Текст = "ВЫБРАТЬ Позиции.СвойНомер КАК СвойНомер,
        |Позиции.Регион КАК Регион, Позиции.Код КАК Код, Позиции.Количество КАК Количество,
        |АВТОНОМЕРЗАПИСИ() КАК ТехническийКлюч
        |ПОМЕСТИТЬ ВТСвоиТехническиеКлючи
        |ИЗ ВТСвоиНаборыИндексов КАК Позиции";
        Запрос.Выполнить();
        Запрос.Текст = "ВЫБРАТЬ СвойНомер, Регион, Код, Количество, ТехническийКлюч
        |ИЗ ВТСвоиТехническиеКлючи УПОРЯДОЧИТЬ ПО СвойНомер";
        Технические = Запрос.Выполнить().Выгрузить();
        ПроверитьСвоиСтроки(Технические, Ожидаемые);
        Для Каждого СтрокаРезультата Из Технические Цикл
            Если ТипЗнч(СтрокаРезультата.ТехническийКлюч) <> Тип("Число") Тогда
                ВызватьИсключение "Автонумерация не вернула числовой технический ключ";
            КонецЕсли;
        КонецЦикла;
        Запрос.Текст = "ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Строк,
        |КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ТехническийКлюч) КАК Ключей
        |ИЗ ВТСвоиТехническиеКлючи";
        Ключи = Запрос.Выполнить().Выгрузить();
        Если Ключи.Количество() <> 1 Тогда
            ВызватьИсключение "Не получена своя контрольная строка ключей";
        КонецЕсли;
        Если Ключи[0].Строк <> 5 Или Ключи[0].Ключей <> 5 Тогда
            ВызватьИсключение "Не подтверждена уникальность пяти собственных технических ключей";
        КонецЕсли;
        Если Менеджер.Таблицы.Количество() <> 3
            Или Менеджер.Таблицы.Найти("ВТСвойОдинИндекс") = Неопределено
            Или Менеджер.Таблицы.Найти("ВТСвоиНаборыИндексов") = Неопределено
            Или Менеджер.Таблицы.Найти("ВТСвоиТехническиеКлючи") = Неопределено Тогда
            ВызватьИсключение "Нельзя удалять неподтверждённые собственные таблицы";
        КонецЕсли;
        Запрос.Текст = "УНИЧТОЖИТЬ ВТСвойОдинИндекс;
        |УНИЧТОЖИТЬ ВТСвоиНаборыИндексов;
        |УНИЧТОЖИТЬ ВТСвоиТехническиеКлючи";
        Запрос.ВыполнитьПакет();
        Если Менеджер.Таблицы.Количество() <> 0
            Или Менеджер.Таблицы.Найти("ВТСвоиНаборыИндексов") <> Неопределено Тогда
            ВызватьИсключение "Удаление собственных временных таблиц не подтверждено";
        КонецЕсли;
        Если Первый.Количество() <> 3 Или Дополнение.Количество() <> 2 Тогда
            ВызватьИсключение "Собственные исходные коллекции неожиданно изменились";
        КонецЕсли;
    Исключение
        Менеджер.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Менеджер.Закрыть();Сообщить(Технические.Количество() = 5);
    Сообщить("Выгруженные значения сохранились; свой менеджер закрыт и больше не используется");
КонецПроцедуры

Функция СоздатьСвойИсточник()
    Источник = Новый ТаблицаЗначений;
    ЧисловойТип = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(5, 0, ДопустимыйЗнак.Неотрицательный));
    Источник.Колонки.Добавить("СвойНомер", ЧисловойТип);
    Источник.Колонки.Добавить("Регион", ЧисловойТип);
    Источник.Колонки.Добавить("Код", ЧисловойТип);
    Источник.Колонки.Добавить("Количество", ЧисловойТип);
    Возврат Источник;
КонецФункции

Процедура ДобавитьСвоюПозицию(Источник, СвойНомер, Регион, Код, Количество)
    Позиция = Источник.Добавить();
    Позиция.СвойНомер = СвойНомер;
    Позиция.Регион = Регион;
    Позиция.Код = Код;
    Позиция.Количество = Количество;
КонецПроцедуры

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

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

  1. Создать свои типизированные таблицы: первая содержит позиции 3,1,2, дополнение 4,5. Все четыре поля — Число 5,0. Порядок ввода специально отличается от СвойНомер.

  2. Скопировать ожидаемый полный состав в памяти и создать НОВЫЙ приватный менеджер. Никакой существующий менеджер формы или отчёта сюда не передаётся.

  3. Пакетом создать две независимые таблицы. Первая имеет один индекс по Коду; вторая — уникальный индекс по СвойНомер и составной по Регион,Код. Все индексируемые поля входят в выборку.

  4. ДОБАВИТЬ направляет две дополнительные строки только во вторую таблицу. Структура и типы совпадают; поле перед ДОБАВИТЬ имеет явный псевдоним Количество.

  5. Выгрузить обе таблицы: первая остаётся с тремя строками, вторая имеет пять и сумму 15. Полный состав четырёх полей каждой позиции проверяется, не только количество.

  6. УПОРЯДОЧИТЬ ПО СвойНомер задаёт порядок явно. Наличие индекса и порядок исходной таблицы не принимаются за гарантию порядка результата.

  7. Отбор Регион=1 и Код=10 даёт позиции 1,2 и количество 5. По всем регионам Код=10 встречается трижды и даёт 9: техническая уникальность номера не устраняет бизнес-повторения.

  8. Создать третью временную таблицу из пяти позиций. АВТОНОМЕРЗАПИСИ используется только отдельным полем списка выборки при ПОМЕСТИТЬ, не при ДОБАВИТЬ и не внутри выражения.

  9. Выгрузить полный состав и проверить число строк/различных числовых технических ключей: 5/5. Не предполагать начальный ключ или соответствие ключа товару, собственному номеру, UUID либо номеру документа.

  10. Проверить три имени в коллекции своего менеджера до удаления. УНИЧТОЖИТЬ пакетом удаляет только эти три собственные таблицы; отсутствие подтверждается количеством ноль и Найти=Неопределено.

  11. Закрыть свой менеджер при успехе и ошибке. После закрытия не обращаться к нему; ранее выгруженная ТаблицаЗначений из пяти строк остаётся значением памяти.

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

  1. Исходная копия содержит три позиции, дополненная пять; количества по позициям 1..5 равны 2,3,1,4,5, сумма 15.

  2. Срез 1/10 содержит две конкретные позиции и сумму 5. Группы кодов 10,20,30 имеют числа строк 3,1,1 и количества 9,1,5.

  3. Техническая таблица сохраняет все пять исходных позиций и имеет пять разных числовых ключей; никакого заданного соответствия ключ→товар нет.

  4. До удаления три своих имени найдены; после удаления таблиц ноль. Исходные коллекции остаются 3 и 2, выгруженная техническая таблица после закрытия содержит 5.

  5. Проверки в коде вызывают исключение при несовпадении содержимого; индексы не объявляются измеренным ускорением.

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

Новичок получает законченный жизненный цикл собственных временных таблиц, проверяет добавление, состав, выборки и технические ключи, затем видит границу между удалением временной таблицы и сохранённой выгрузкой.

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

  1. ДОБАВИТЬ не пересоздаёт таблицу и не заменяет её данные. Повторение запроса ещё раз добавит ещё две строки; этот модуль создаёт новый менеджер при каждом запуске.

  2. Индекс, в том числе УНИКАЛЬНО, не используйте для проверки уникальности бизнес-данных: справка предупреждает о различиях СУБД. Здесь уникальные СвойНомер известны заранее, а повторяющийся Код проверяется отдельно.

  3. Несколько индексов расходуют ресурсы и не доказывают ускорение на пяти строках. Для реальной оптимизации нужны измерения на своём объёме и составе запросов.

  4. АВТОНОМЕРЗАПИСИ нельзя использовать вне списка выборки, внутри выражения, при запросе без формирования временной таблицы или с ОБЪЕДИНИТЬ на верхнем уровне.

  5. УНИЧТОЖИТЬ отсутствующей таблицы вызывает ошибку. Не повторяйте удаление после успешного пакета и не заменяйте свой менеджер существующим менеджером рабочего отчёта.

  6. Закрыть удаляет оставшиеся таблицы, но не позволяет дальнейшую работу с этим менеджером. Выгруженные значения и исходные коллекции в памяти — другие объекты.

  7. Пример сверяется с точной 8.5.1.1343 без старого режима совместимости. Python-тесты проверяют текст/фикстуры и контракты, не выполнение запросов в 1С.

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

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

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

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

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