ПРЕДСТАВЛЕНИЕССЫЛКИ: представить свою настоящую ссылку и сохранить нессылочные типы

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

Единственная собственная запись001/OWN-A имеет стандартное представление по наименованию. Запрос сохраняет исходную ссылку и отдельно проверяет строковое представление, число7, строкуKEEP и Null.

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

Полный серверный общий модуль УчебныйЯзык только новой собственной пустой конфигурации УчебныеПредставления85 на 8.5.1.1343. Предоставленный BSL будущего ручного опыта временно записывает только свой минимальный fixture и откатывает обе ветви. BSL/запросы/откат здесь не выполнялись.

Подготовка

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

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

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

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

  5. Создайте НОВУЮ отдельную пустую учебную базу, не копию приложения, на 8.5.1.1343. Имя конфигурации УчебныеПредставления85; совместимость отключена. Единственный сеанс, без фоновых/регламентных заданий, расширений базы/сеанса, подписок, общих реквизитов, регистров, планов, задач и бизнес-процессов. Нужны права читать/создавать/изменять только свои учебные объекты и read-only списки расширений; ошибки прав не считаются результатом опыта.

  6. Справочники → УчебныеПодписи85: Иерархический=Нет, владельцев нет, Тип кода=Строка, Длина кода=3, Длина наименования=20, Автонумерация=Нет, Основное представление=В виде наименования. Собственные реквизиты, табчасти и предопределённые элементы отсутствуют. В модуле объекта и модуле менеджера текст полностью пустой, в том числе обработчики получения полей/представления.

  7. Документы → УчебныйПакет85: Проведение=Запретить, движений и собственных реквизитов нет, Тип номера=Строка, Длина номера=8, Автонумерация=Нет. Единственная табчасть Строки85: Позиция — только Строка(20), переменная длина; Количество — только Число(4,0), неотрицательный. Проверка заполнения обоих реквизитов=Не проверять. Все объектные/менеджерские модули и формы документа пусты.

  8. Другие модули конфигурации/сеанса/приложения и обработчики оставьте пустыми. Native прямо говорит, что МодульОбъекта/МодульМенеджера в BSL всегда имеют значение Неопределено; из этого нельзя доказать пустой текст. Поэтому пустота модулей проверяется читателем в новом Конфигураторе, а не ложным сравнением этих свойств с Неопределено. Здесь Конфигуратор/1С не запускаются.

  9. Guard проверяет схему, основной вид представления, ФиксированныйМассив предопределённых имён=пустой, массивы расширений трёх native источников=пустые и отсутствие изменений метаданных расширениями в сеансе. Отдельные пустые модули/формы — обязательное ручное условие, не обещание такого guard.

  10. Основной код целиком заменяет свой серверный общий модуль УчебныйЯзык со всеми помощниками на уровне модуля. Для следующего урока замените его целиком, не склеивайте одноимённые экспортные точки. Каждый модуль создаёт только собственный минимальный fixture этого урока; заранее вручную записи не создавайте.

  11. После подготовки метаданных и полного модуля выполните Конфигурация → Обновить конфигурацию базы данных (F7). Запускайте свою внешнюю обработку в новом сеансе этой учебной базы. Само сохранение текста в Конфигураторе не обновляет конфигурацию базы данных.

  12. Новая собственная внешняя обработка УчебныйПускПредставленияСсылки85 → управляемая Форма → команда Выполнить с одноимённым действием и кнопкой; остальные модули пусты. Полный отдельный модуль формы:

    &НаКлиенте
    Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
    Сообщить("Собственный опыт проверен; его учебные записи отменены");
    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура ВыполнитьНаСервере()
    УчебныйЯзык.ВыполнитьПример();
    КонецПроцедуры

  13. Это не опыт только в памяти: предоставленный BSL будущего ручного запуска содержит собственные Записать внутри собственной транзакции, но никогда не ЗафиксироватьТранзакцию/Проведение/Удалить. До неё запрещена активная чужая транзакция и проверена пустота трёх собственных источников. После обеих ветвей отката проверяются завершение транзакции и Число0 записей всех трёх источников. Здесь код и база не исполнялись/не менялись.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойСтендПредставлений();
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция запрещена";
    КонецЕсли;
    ПроверитьОтсутствиеСвоихЗаписей();
    НачатьТранзакцию();
    Попытка
        ПроверитьСвоиПоляПодписи("001", "A");
        ПроверитьСвоиПоляПодписи("999", "12345678901234567890");
        ПроверитьОтклонениеСвоихПолейПодписи(Неопределено, "OWN-A");
        ПроверитьОтклонениеСвоихПолейПодписи(7, "OWN-A");
        ПроверитьОтклонениеСвоихПолейПодписи("001", 7);
        ПроверитьОтклонениеСвоихПолейПодписи("001", "");
        ПроверитьОтклонениеСвоихПолейПодписи("001", "123456789012345678901");
        ПроверитьОтклонениеСвоихПолейПодписи("01", "OWN-A");
        Подпись = СоздатьСвоюПодпись("001", "OWN-A");
        ОжиданияИсточника = Новый Массив;
        ОжиданияИсточника.Добавить(Новый Структура("Ссылка,Код,Наименование", Подпись, "001", "OWN-A"));
        ПроверитьСвоюИсходнуюПодпись(ОжиданияИсточника);
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ &Подпись КАК Ссылка,
            |    ПРЕДСТАВЛЕНИЕССЫЛКИ(&Подпись) КАК Представление,
            |    ПРЕДСТАВЛЕНИЕССЫЛКИ(7) КАК Число,
            |    ПРЕДСТАВЛЕНИЕССЫЛКИ(""KEEP"") КАК Текст,
            |    ПРЕДСТАВЛЕНИЕССЫЛКИ(NULL) КАК Пустое";
        Запрос.УстановитьПараметр("Подпись", Подпись);
        Ожидания = Новый Массив;
        Ожидания.Добавить(Новый Структура("Ссылка,Представление,Число,Текст,Пустое", Подпись, "OWN-A", 7, "KEEP", Null));
        Поля = Новый Массив;
        Поля.Добавить("Ссылка");
        Поля.Добавить("Представление");
        Поля.Добавить("Число");
        Поля.Добавить("Текст");
        Поля.Добавить("Пустое");
        Таблица = Запрос.Выполнить().Выгрузить();
        ПроверитьСвоюПолнуюТаблицу(Таблица, Ожидания, Поля, Истина);
        ПроверитьСвоюИсходнуюПодпись(ОжиданияИсточника);
        Сообщить("Ссылка сохранилась; представление OWN-A строковое; 7 осталось Число, KEEP Строка, Null Null");
    Исключение
        Если ТранзакцияАктивна() Тогда
            ОтменитьТранзакцию();
        КонецЕсли;
        ПроверитьОтсутствиеСвоихЗаписей();
        ВызватьИсключение;
    КонецПопытки;
    ОтменитьТранзакцию();
    ПроверитьОтсутствиеСвоихЗаписей();
    Сообщить("Собственный минимальный fixture отменён; все три своих источника пусты");
КонецПроцедуры

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

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

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

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

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

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

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

Процедура ПроверитьСвоюИсходнуюПодпись(Ожидания)
    Проверка = Новый Запрос;
    Проверка.Текст = "ВЫБРАТЬ Под.Ссылка КАК Ссылка, Под.Код КАК Код, Под.Наименование КАК Наименование
    |ИЗ Справочник.УчебныеПодписи85 КАК Под УПОРЯДОЧИТЬ ПО Под.Код ВОЗР";
    Поля = Новый Массив;
    Поля.Добавить("Ссылка");
    Поля.Добавить("Код");
    Поля.Добавить("Наименование");
    ПроверитьСвоюПолнуюТаблицу(Проверка.Выполнить().Выгрузить(), Ожидания, Поля, Истина);
КонецПроцедуры
УчебныйПускПредставленияСсылки85.Форма

Собственная новая внешняя обработка УчебныйПускПредставленияСсылки85 → управляемая Форма → Модуль

Отдельный полный клиентский/серверный модуль формы; серверная процедура без контекста вызывает УчебныйЯзык.ВыполнитьПример(). Не смешивать с общим модулем.

&НаКлиенте
Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
    Сообщить("Собственный опыт проверен; его учебные записи отменены");
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
    УчебныйЯзык.ВыполнитьПример();
КонецПроцедуры

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

  1. Подготовить именно новый собственный стенд и полный серверный модуль. Guard до действий проверяет версию8.5.1.1343, имена, состав метаданных и все заданные квалификаторы/представление.

  2. ПолучитьИменаПредопределенных возвращает ФиксированныйМассив имён, заданных в конфигурации; проверить его тип/нулевой размер. Это не чтение или поиск записей рабочего справочника.

  3. Native источники расширений — БазаДанных,СеансАктивные,СеансОтключенные. Получить без отбора возвращает массив соответствующего источника; все три должны быть пусты, изменения метаданных расширениями тоже отсутствуют. Модули вручную подготовлены пустыми: их BSL-свойства всегда Неопределено.

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

  5. Минимальный fixture — только один собственный элемент справочника001/OWN-A. Документы и их строки не создаются. Две границы/шесть плохих вводов проверяют свои типы и длины до СоздатьЭлемент/Записать.

  6. До записи проверяется вид ОсновноеПредставление=ВВидеНаименования, а предопределённых имён нет. Пустой модуль менеджера не содержит ОбработкаПолученияПредставления или ОбработкаПолученияПолейПредставления; иначе стандартное представление не обещается.

  7. После настоящего Записать получить readonly Ссылка, проверить собственный ссылочный тип/непустоту. Полный исходный запрос до проекции сверяет Ссылка,Код,Наименование с независимой структурой ожидания.

  8. Передать свою ссылку отдельным параметром Подпись; запрос без ИЗ выбирает одну строку. Первая колонка сохраняет ссылку для проверки идентичности, вторая применяет ПРЕДСТАВЛЕНИЕССЫЛКИ к ней.

  9. Native: если результат выражения — ссылка, функция возвращает строковое представление; в остальных случаях возвращает значение параметра. Поэтому7 остаётся Число7,KEEP остаётся СтрокаKEEP,NULL остаётся Null.

  10. Полностью сверить пять колонок/одну строку: собственная ссылка,OWN-A,7,KEEP,Null. Сравнение Null идёт только по точному типу, не обычным равенством с Null; значение ссылки сравнивается с реально созданной своей ссылкой.

  11. Повторно сверить все три исходных поля справочника. Не предполагать существование его записи после rollback и не получать представление пустой/неподготовленной ссылки.

  12. Все запросы/выгрузки/проверки собственных исходников и проекций идут до rollback. При успехе отменить свою транзакцию и проверить пустоту; при ошибке отменить активную свою транзакцию, проверить пустоту и повторно возбудить исключение.

  13. Отдельный будущий ручной аварийный опыт: в своей учебной копии полного модуля после первого вызова ПроверитьСвоиИсходныеДокументы либо ПроверитьСвоюИсходнуюПодпись внутри основной процедуры, уже после записей, временно вставьте ВызватьИсключение "Учебная авария после собственных записей";. Повторный запуск должен завершиться исключением без зелёных сообщений. В отладчике проверьте завершение своей транзакции и три нулевых счётчика после отмены. Затем уберите только вставленную строку. Обычные плохие вводы ловятся локально до записи и не проверяют этот внешний аварийный путь; здесь такой опыт не выполнялся.

  14. Форма запуска полностью дана отдельно от общего модуля. Python моделирует только фиксированные данные и ожидания, не запускает BSL/запросы/откат в 1С.

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

  1. Полная строка: (собственная записанная ссылка,OWN-A,7,KEEP,Null); типы СправочникСсылка.УчебныеПодписи85/Строка/Число/Строка/Null.

  2. Исходная ссылка в первом поле тождественна своему записанному элементу, стандартное имя точно OWN-A;7 не строка"7",Null не Неопределено и не пустая строка.

  3. До/после проекции поля Ссылка,Код001,НаименованиеOWN-A имеют те же значения/типы; другие прикладные записи не создаются.

  4. Шесть плохих вводов отклоняются до создания, две границы принимаются. После обеих ветвей отката нет записей своего справочника, документа и табчасти.

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

Функция для ссылок показана на существующем в собственном опыте элементе со стандартным именем, не подменяя число и Null строковыми представлениями.

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

  1. МодульОбъекта и МодульМенеджера в native всегда Неопределено: сравнение с ним не доказывает пустоту текста. Пустые модули/формы, единственный сеанс и новая база — обязательные условия ручной подготовки.

  2. Предопределённые имена относятся к конфигурации, не равны списку записанных данных. Расширения проверяются read-only; код не подключает, отключает и не удаляет их.

  3. Запись нужна только в предоставленном будущем BSL собственного нового стенда. Здесь 1С/BSL/SQL не запускались, создание и отмена записей не заявляются.

  4. Python моделирует только фиксированные данные/полный состав и логику подготовки/отката. Direct HBK доказывает текст native, а не фактическое исполнение в 1С.

  5. Если сама ОтменитьТранзакцию или последующая проверка пустоты вызывает исключение, сохранение первоначальной диагностики не гарантируется: наружу может выйти ошибка отмены/проверки. Зелёного завершения нет; сначала разберите эту ошибку и проверьте состояние своего стенда. Урок не обещает успешный rollback при сбое самого механизма отмены.

  6. Только указанная raw-тема является новой привязкой. Поддерживающие UNION/поля вложенного результата/ORDER BY/COUNT уже не прибавляются к покрытию.

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

  8. Встроенная функция читает представление только собственной реально записанной ссылки. Адрес без записи, представление пустой ссылки и локализованное представление документа здесь не используются.

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

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

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

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

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