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