АВТОУПОРЯДОЧИВАНИЕ: заменить ссылку документа его датой и сверить полный порядок

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

Три собственных документа имеют даты08/06/07 октября, намеренно не совпадающие с порядком номеров. Ссылка УБЫВ с AUTOORDER и явная Дата УБЫВ должны дать одинаковые полностью проверенные строки.

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

Полный серверный общий модуль УчебныйЯзык только новой собственной пустой конфигурации УчебныеПредставления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 записей всех трёх источников. Здесь код и база не исполнялись/не менялись.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойСтендПредставлений();
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция запрещена";
    КонецЕсли;
    ПроверитьОтсутствиеСвоихЗаписей();
    НачатьТранзакцию();
    Попытка
        СвоиДокументы = Новый Массив;
        ОжиданияДокументов = Новый Массив;
        ОжиданияСтрок = Новый Массив;
        Объект = СоздатьСвойДокумент("OWN00001", Дата(2026, 10, 8, 12, 0, 0));
        СсылкаДокумента = ЗаписатьСвойДокумент(Объект);
        СвоиДокументы.Добавить(СсылкаДокумента);
        ОжиданияДокументов.Добавить(Новый Структура("Ссылка,Номер,Дата", СсылкаДокумента, "OWN00001", Дата(2026, 10, 8, 12, 0, 0)));
        Объект = СоздатьСвойДокумент("OWN00002", Дата(2026, 10, 6, 12, 0, 0));
        СсылкаДокумента = ЗаписатьСвойДокумент(Объект);
        СвоиДокументы.Добавить(СсылкаДокумента);
        ОжиданияДокументов.Добавить(Новый Структура("Ссылка,Номер,Дата", СсылкаДокумента, "OWN00002", Дата(2026, 10, 6, 12, 0, 0)));
        Объект = СоздатьСвойДокумент("OWN00003", Дата(2026, 10, 7, 12, 0, 0));
        СсылкаДокумента = ЗаписатьСвойДокумент(Объект);
        СвоиДокументы.Добавить(СсылкаДокумента);
        ОжиданияДокументов.Добавить(Новый Структура("Ссылка,Номер,Дата", СсылкаДокумента, "OWN00003", Дата(2026, 10, 7, 12, 0, 0)));
        ПроверитьСвоиИсходныеДокументы(ОжиданияДокументов, ОжиданияСтрок);
        Ожидания = Новый Массив;
        Ожидания.Добавить(Новый Структура("Номер,Дата", "OWN00001", Дата(2026, 10, 8, 12, 0, 0)));
        Ожидания.Добавить(Новый Структура("Номер,Дата", "OWN00003", Дата(2026, 10, 7, 12, 0, 0)));
        Ожидания.Добавить(Новый Структура("Номер,Дата", "OWN00002", Дата(2026, 10, 6, 12, 0, 0)));
        Поля = Новый Массив;
        Поля.Добавить("Номер");
        Поля.Добавить("Дата");
        Автоматический = Новый Запрос;
        Автоматический.Текст = "ВЫБРАТЬ Док.Номер КАК Номер, Док.Дата КАК Дата
            |ИЗ Документ.УчебныйПакет85 КАК Док ГДЕ Док.Ссылка В (&Документы)
            |УПОРЯДОЧИТЬ ПО Док.Ссылка УБЫВ
            |АВТОУПОРЯДОЧИВАНИЕ";
        Автоматический.УстановитьПараметр("Документы", СвоиДокументы);
        ТаблицаАвто = Автоматический.Выполнить().Выгрузить();
        ПроверитьСвоюПолнуюТаблицу(ТаблицаАвто, Ожидания, Поля, Истина);
        Контроль = Новый Запрос;
        Контроль.Текст = "ВЫБРАТЬ Док.Номер КАК Номер, Док.Дата КАК Дата
            |ИЗ Документ.УчебныйПакет85 КАК Док ГДЕ Док.Ссылка В (&Документы)
            |УПОРЯДОЧИТЬ ПО Док.Дата УБЫВ";
        Контроль.УстановитьПараметр("Документы", СвоиДокументы);
        ТаблицаКонтроля = Контроль.Выполнить().Выгрузить();
        ПроверитьСвоюПолнуюТаблицу(ТаблицаКонтроля, Ожидания, Поля, Истина);
        ПроверитьСвоиИсходныеДокументы(ОжиданияДокументов, ОжиданияСтрок);
        Сообщить("Полный автоматический и контрольный порядок: OWN00001/08,OWN00003/07,OWN00002/06 октября2026");
    Исключение
        Если ТранзакцияАктивна() Тогда
            ОтменитьТранзакцию();
        КонецЕсли;
        ПроверитьОтсутствиеСвоихЗаписей();
        ВызватьИсключение;
    КонецПопытки;
    ОтменитьТранзакцию();
    ПроверитьОтсутствиеСвоихЗаписей();
    Сообщить("Собственный минимальный 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 Тогда
            ВызватьИсключение "В новой собственной базе не должно быть записей: " + ИмяИсточника;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

  5. Минимальный fixture — три своих документа с пустыми табчастями и без элемента справочника. НомераOWN00001/OWN00002/OWN00003 имеют соответственно даты08/06/07.10.2026 12:00:00; все три даты различны.

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

  7. До проекции сверить все исходные Ссылка/Номер/Дата трёх документов по номеру и пустой полный источник Строки85. Не использовать случайный UUID или порядок создания ссылок как ожидаемую сортировку.

  8. Рабочее условие сортировки — именно Док.Ссылка УБЫВ, затем АВТОУПОРЯДОЧИВАНИЕ. Native заменяет ссылку документа полем стандартной сортировки — датой. Направление УБЫВ задано явно в условии, а не выводится из умолчания AUTOORDER.

  9. Результат должен иметь порядок08,07,06 октября: OWN00001,OWN00003,OWN00002. Проверить оба поля каждой строки, тип Строка/Дата и полный порядок, не только множество трёх номеров.

  10. Контрольный запрос не содержит AUTOORDER, он прямо сортирует Док.Дата УБЫВ. Независимо сравнить его полную выгрузку с теми же фиксированными ожиданиями. Уникальные даты устраняют неподтверждённые дополнительные ключи/ничьи.

  11. Повторно сверить весь исходный состав и отсутствие табличных строк. Ссылки-параметры не меняются между рабочим/контрольным запросами, исходники от сортировки не переписываются.

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

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

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

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

  1. Полные строки обоих результатов: (OWN00001,08.10.2026 12:00:00),(OWN00003,07.10.2026 12:00:00),(OWN00002,06.10.2026 12:00:00).

  2. Номер строго Строка, Дата строго Дата; два точных поля/три полные строки и порядок проверены отдельно у AUTOORDER и у контроля.

  3. Все Ссылка/Номер/Дата исходных трёх документов сохраняются; источник Строки85 пуст и элемент справочника не создаётся.

  4. До действий guard проверяет свою схему/версию/пустоту/расширения, запрещает чужую транзакцию. После успеха/ошибки собственные три документа отменены и все три источника пусты.

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

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

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

  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. Этот опыт использует ветвь native AUTOORDER при наличии УПОРЯДОЧИТЬ ПО. Ветки без этого предложения, с группировкой или ИТОГИ здесь не прикрепляются как дополнительные конструкции.

  8. Иерархического справочника нет, поэтому hierarchical_ordering не используется и не привязывается. Если даты равны, этот урок не обещает порядок равных строк без отдельного подтверждённого ключа.

  9. Обычный порядок самих ссылок без AUTOORDER не используется как контроль: native этого блока не задаёт конкретную последовательность UUID. Контроль сортирует только три свои разные даты.

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

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

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

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

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