ПРЕДСТАВЛЕНИЕ: получить свои подписи и проверить ограничение вложенности

Учебные задачи

Три собственные строки — название с кавычками, пустая строка и Ручка — становятся строковыми представлениями. Повторная ПРЕДСТАВЛЕНИЕ разрешена native, а использование её результата внутри другой функции проверяется отдельным плохим запросом.

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

Полный серверный общий модуль учебной базы 8.5.1.1343; свои явно типизированные источники и приватный менеджер временных таблиц. Здесь запросы в 1С не запускались; Python моделирует только фиксированные данные.

Подготовка

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

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

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

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

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

  6. Все функции и процедуры подготовки/проверки включены в модуль. Код подписи — целое 1..3, текст — Строка до 40 символов; числа не передаются как текст неявно.

  7. Точная пометка задана строкой. Не заменяйте её датой или числом, сохраняя прежние ожидания: это отдельный опыт форматирования.

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

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

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

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

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

  1. Создать свой источник с кодами 1..3 и единственной строковой колонкой Текст длиной 40. Полные данные: Книга "Азбука", пустая строка и Ручка. Подготовка проверяет типы и длину до добавления.

  2. Передать источник параметром и поместить в приватную ВТСобственныеПодписи. Ни метаданные документов, ни ссылки, ни чужие записи для этого узкого опыта не нужны.

  3. Нормальный запрос возвращает пять полей: код, исходный текст, его ПРЕДСТАВЛЕНИЕ, повторную ПРЕДСТАВЛЕНИЕ и представление отдельной собственной пометки.

  4. Native PRESENTATION принимает выражение любого типа и возвращает СТРОКА. Здесь входы намеренно только строки: точные ожидаемые тексты не зависят от национального оформления чисел, дат или ссылочных представлений.

  5. Кавычки являются частью своего значения Книга "Азбука" и не склеиваются с текстом запроса. Пустая строка остаётся отдельной исходной строкой код 2, а не исчезает из результата.

  6. Вложить ПРЕДСТАВЛЕНИЕ в ещё одну ПРЕДСТАВЛЕНИЕ: native прямо разрешает именно это исключение. Для строкового входа оба результата равны исходному тексту.

  7. Тип каждого из пяти полей проверяется уже во встроенном языке по выгруженному результату: код Число, остальные четыре поля Строка. Это не оборачивание функции ПРЕДСТАВЛЕНИЕ внутри ТИПЗНАЧЕНИЯ запроса.

  8. Отдельный намеренно плохой запрос использует ТИПЗНАЧЕНИЯ(ПРЕДСТАВЛЕНИЕ(...)). Нативный запрет вложенности в другие функции относится к этой записи и должен дать ошибку в будущем ручном опыте.

  9. Его отдельная Попытка охватывает только Выполнить намеренно плохого запроса и показывает фактическую ошибку. Ошибка создания типизированного источника или нормального запроса не будет принята за ожидаемую.

  10. Изменить пометку с Свои данные на После проверки и снова выполнить первоначальный нормальный запрос. Во всех трёх строках меняется только пятое поле, проверяемое полным составом.

  11. Повторно проверить исходный снимок с прежней пометкой; он не пересчитывается при изменении параметра. Исходная таблица сохраняет три строки.

  12. Закрыть приватный менеджер при успехе. Любое неожиданное исключение наружная Попытка сопровождает закрытием и повторным ВызватьИсключение; оно не превращается в успешный отчёт.

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

  1. Для каждого нормального снимка коды 1,2,3 и исходные тексты Книга "Азбука","",Ручка совпадают с обоими представлениями.

  2. Все поля результата проверяются: код числовой, четыре остальных строковые; пять колонок и три строки. Пустой текст код 2 должен иметь именно тип Строка.

  3. Первый снимок содержит пометку Свои данные во всех трёх строках, второй После проверки; повторная проверка первого сохраняет Свои данные.

  4. В будущей ручной 1С ожидается ошибка только намеренно запрещённой вложенности. Допустимое ПРЕДСТАВЛЕНИЕ(ПРЕДСТАВЛЕНИЕ(...)) и следующий нормальный запрос должны завершиться успешно.

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

Полный узкий опыт показывает строковый результат и реальное native ограничение функции без выдуманного локального формата чисел, дат или ссылки.

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

  1. Ограничение функции определяется native, а не фактом строкового возвращаемого типа. Даже если другая функция обычно принимает строку, результат ПРЕДСТАВЛЕНИЕ в неё вкладывать нельзя по этой странице справки.

  2. ПРЕДСТАВЛЕНИЕССЫЛКИ — отдельная функция с отдельным контрактом. Здесь настоящих ссылочных значений нет, поэтому её страница не получает этот урок.

  3. Представление числа или даты зависит от оформления платформы и национальных особенностей; этот опыт не закрепляет для них выдуманные точные строки.

  4. ПРЕДСТАВЛЕНИЕ не заменяет преобразование рабочей ссылки в объект и не подтверждает существование записи. В этом модуле используется только собственный текст.

  5. Текст предупреждения плохого запроса содержит фактический ОписаниеОшибки при будущем ручном запуске, а не фиктивный уже полученный результат.

  6. Python-проверки рассчитывают только полностью заданные строки и сверяют установленную справку. Они не исполняют ПРЕДСТАВЛЕНИЕ или ТИПЗНАЧЕНИЯ в движке 1С.

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

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

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

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

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