Показать форму своей сохранённой задачи по ссылке

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

Одна собственная запись подтверждена до просмотра; ссылка получает настоящий редактор этой записи, не новый объект; модальный просмотр без транзакции и строго ограниченная очистка после закрытия.

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

Полный модуль обычной формы ЗапускФормы85, обычный толстый клиент Windows, собственный новый пустой стенд УчебныеФормыСсылок85.

Подготовка

  1. Новая пустая конфигурация УчебныеФормыСсылок85 на платформе8.5.1.1343. Основной режим Обычное приложение, толстый клиент Windows; не рабочая УТ/КА/УНФ/БП.

  2. Один пользователь и один сеанс нового учебного стенда, без фоновых обработок, обмена и других открытых редакторов. Код не является универсальным конкурентным алгоритмом удаления рабочих данных.

  3. УчебнаяЗадача85: номер Строка9 с автонумерацией, Наименование100. УчебныйПроцесс85: номер Строка9 с автонумерацией, Задача=УчебнаяЗадача85; карта Старт → Опыт85 → Финиш без адресации/вложенных точек.

  4. У обоих видов Маркер85 Строка36 и Текст85 Строка100. Исследуемый вид перед опытом пуст; чужие ссылки не запрашиваются и не используются.

  5. Модуль исследуемого объекта содержит только отдельный полный ПередЗаписью из дополнительных блоков. Он разрешает только первую запись нового объекта с собственным маркером из ДополнительныеСвойства; запись существующего редактора запрещена.

  6. Модули менеджеров, точки, второго вида и прочие обработчики/подписки пустые. Удаление собственного учебного оригинала не должно вызывать сторонних внешних действий.

  7. Задачи → УчебнаяЗадача85 → Формы: мастером создайте обычную форму объекта Паспорт85. Основной реквизит мастера переименуйте в Запись85, не добавляйте второй реквизит и не снимайте признак основного. Точный тип ЗадачаОбъект.УчебнаяЗадача85.

  8. В Паспорт85 покажите Дата, Номер, Маркер85, Текст85 и имя задачи при наличии; все поля только для просмотра. Удалите стандартные панели и команды записи, удаления, выполнения задачи и старта процесса.

  9. Одна обычная кнопка ЗакончитьПросмотр85: Нажатие=ЗакончитьПросмотр85. Вставьте отдельный полный модуль Просмотр сохранённой записи и назначьте ПередЗакрытием; стандартное сохранение при закрытии отключено.

  10. Обработки → ЗапускФормы85 → обычная форма Форма: ПодтверждаюПустойСтенд85 и Занято85 Булево исходно Ложь; Итог85 Строка неограниченной длины только для просмотра.

  11. Основной код целиком в модуль обычной формы запуска без клиент-серверных директив. Обычная кнопка ПросмотретьСвоюЗапись85: Нажатие=ПросмотретьСвоюЗапись85, параметр Кнопка.

  12. F7 и обновление только своего стенда. runtimeVerifiedScenarios=0: 1С, DB-запись/удаление, показ/закрытие окна здесь не выполнялись.

  13. После согласия будущий ручной опыт записывает один реальный объект в своей короткой транзакции. Только после подтверждённой фиксации ссылка используется для получения формы.

  14. Окно модальное, но транзакция к этому времени завершена. Подтвердите просмотр собственной кнопкой или закройте крестиком; это разные результаты, не выбор бизнес-ссылки.

  15. После закрытия код вновь проверяет собственную неактивную запись, её исходную версию/номер/данные и удаляет только её в отдельной короткой транзакции. Это непосредственное необратимое удаление, допустимое лишь в данном новом пустом стенде.

  16. Если собственная форма не закрылась или данные перестали соответствовать своему опыту, очистка не выполняется. Итог содержит свой UUID/маркер для ручной проверки учебного стенда; рабочие записи не удаляются.

  17. Не используйте сохранённые ссылки предыдущих уроков или произвольный объект пользователя. Нет маршрута, почты, сети, печати, файлов, архива или новой резервной копии.

Процедура ПросмотретьСвоюЗапись85(Кнопка)
    Если Не ПодтверждаюПустойСтенд85 Тогда
        ВызватьИсключение "Только новый собственный пустой стенд УчебныеФормыСсылок85 с согласием";
    КонецЕсли;
    Если ТекущийРежимЗапуска() <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Тогда
        ВызватьИсключение "Нужен обычный толстый клиент Windows";
    КонецЕсли;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Нужна платформа8.5.1.1343; нельзя использовать чужую транзакцию";
    КонецЕсли;
    Если Занято85 Тогда
        ВызватьИсключение "Дождитесь закрытия собственного опыта";
    КонецЕсли;
    ВыборкаДо = Задачи.УчебнаяЗадача85.Выбрать();
    Если ВыборкаДо.Следующий() Тогда
        ВызватьИсключение "Исследуемый собственный вид должен быть пустым";
    КонецЕсли;
    Маркер = Строка(Новый УникальныйИдентификатор);
    Идентификатор = Новый УникальныйИдентификатор;
    СвояСсылка = Задачи.УчебнаяЗадача85.ПолучитьСсылку(Идентификатор);
    Если СвояСсылка.ПолучитьОбъект() <> Неопределено Тогда
        ВызватьИсключение "Плановая идентичность уже занята; чужую запись не используем";
    КонецЕсли;
    Занято85 = Истина;
    СозданаСвояЗапись = Ложь;
    МожноОчищать = Истина;
    СвояФорма = Неопределено;
    ВерсияОригинала = Неопределено;
    НомерОригинала = Неопределено;
    РезультатПросмотра = Неопределено;
    ОшибкаОпыта = "";
    ОшибкаОчистки = "";
    Попытка
        Оригинал = Задачи.УчебнаяЗадача85.СоздатьЗадачу();
        Оригинал.УстановитьСсылкуНового(СвояСсылка);
        Оригинал.Дата = Дата(2026, 10, 9, 10, 0, 0);
        Оригинал.Маркер85 = Маркер;
        Оригинал.Текст85 = "Сохранённый учебный оригинал";
        Оригинал.Наименование = "Просмотр сохранённой своей задачи";
        Оригинал.ДополнительныеСвойства.Вставить("РазрешениеПервойЗаписи85", Маркер);
        НачатьТранзакцию();
        Попытка
            Оригинал.Записать();
            ЗафиксироватьТранзакцию();
            СозданаСвояЗапись = Истина;
        Исключение
            Если ТранзакцияАктивна() Тогда
                ОтменитьТранзакцию();
            КонецЕсли;
            ВызватьИсключение;
        КонецПопытки;
        Проверенный = СвояСсылка.ПолучитьОбъект();
        Если Проверенный = Неопределено Тогда
            ВызватьИсключение "Подтверждённая запись не существует";
        КонецЕсли;
        Если ТипЗнч(Проверенный) <> Тип("ЗадачаОбъект.УчебнаяЗадача85") Тогда
            ВызватьИсключение "Подтверждённая запись имеет не свой объектный тип";
        КонецЕсли;
        ВерсияОригинала = Проверенный.ВерсияДанных;
        НомерОригинала = Проверенный.Номер;
        ПроверитьСвоюЗапись85(Проверенный, СвояСсылка, Маркер, ВерсияОригинала, НомерОригинала);
        Ключ = Маркер + "-stored-preview";
        СвояФорма = СвояСсылка.ПолучитьФорму("Паспорт85", , Ключ);
        Если СвояФорма = Неопределено Тогда
            ВызватьИсключение "Собственная форма сохранённой записи не создана";
        КонецЕсли;
        Если СвояФорма.КлючУникальности <> Ключ Тогда
            ВызватьИсключение "Получена не отдельная собственная форма";
        КонецЕсли;
        Если ТипЗнч(СвояФорма.Запись85) <> Тип("ЗадачаОбъект.УчебнаяЗадача85") Тогда
            ВызватьИсключение "Основной реквизит формы не содержит свой ожидаемый объект";
        КонецЕсли;
        ПроверитьСвоюЗапись85(СвояФорма.Запись85, СвояСсылка, Маркер, ВерсияОригинала, НомерОригинала);
        СвояФорма.АвтоЗаголовок = Ложь;
        СвояФорма.Заголовок = "Существующая собственная запись " + СвояФорма.Запись85.Номер;
        Если ТранзакцияАктивна() Тогда
            ВызватьИсключение "Нельзя держать транзакцию во время модального просмотра";
        КонецЕсли;
        РезультатПросмотра = СвояФорма.ОткрытьМодально();
        Если РезультатПросмотра <> Неопределено И РезультатПросмотра <> "Просмотрено" Тогда
            ВызватьИсключение "Неожиданный результат просмотра; это не выбранная бизнес-ссылка";
        КонецЕсли;
        Проверенный = СвояСсылка.ПолучитьОбъект();
        Если Проверенный = Неопределено Тогда
            ВызватьИсключение "Своя запись исчезла во время просмотра";
        КонецЕсли;
        ПроверитьСвоюЗапись85(Проверенный, СвояСсылка, Маркер, ВерсияОригинала, НомерОригинала);
    Исключение
        ОшибкаОпыта = ОписаниеОшибки();
    КонецПопытки;
    Если СвояФорма <> Неопределено Тогда
        Попытка
            СвояФорма.Закрыть();
        Исключение
            МожноОчищать = Ложь;
            ОшибкаОчистки = "Не удалось закрыть свою форму: " + ОписаниеОшибки();
        КонецПопытки;
    КонецЕсли;
    Если СозданаСвояЗапись И МожноОчищать Тогда
        Попытка
            Если ТранзакцияАктивна() Тогда
                ВызватьИсключение "Перед собственной очисткой не должно быть чужой транзакции";
            КонецЕсли;
            НачатьТранзакцию();
            Попытка
                Проверенный = СвояСсылка.ПолучитьОбъект();
                Если Проверенный <> Неопределено Тогда
                    ПроверитьСвоюЗапись85(Проверенный, СвояСсылка, Маркер, ВерсияОригинала, НомерОригинала);
                    Проверенный.Удалить();
                КонецЕсли;
                ЗафиксироватьТранзакцию();
            Исключение
                Если ТранзакцияАктивна() Тогда
                    ОтменитьТранзакцию();
                КонецЕсли;
                ВызватьИсключение;
            КонецПопытки;
            Если СвояСсылка.ПолучитьОбъект() <> Неопределено Тогда
                ВызватьИсключение "Собственная запись осталась после очистки";
            КонецЕсли;
        Исключение
            ОшибкаОчистки = ОшибкаОчистки + " " + ОписаниеОшибки();
        КонецПопытки;
    КонецЕсли;
    Занято85 = Ложь;
    Если ОшибкаОпыта <> "" Или ОшибкаОчистки <> "" Тогда
        Итог85 = ОшибкаОпыта + " " + ОшибкаОчистки + "; свой UUID: " + Строка(Идентификатор) + "; маркер: " + Маркер;
        ВызватьИсключение Итог85;
    КонецЕсли;
    Если РезультатПросмотра = "Просмотрено" Тогда
        Итог85 = "Просмотр своей сохранённой записи подтверждён отдельной кнопкой. Своя запись удалена после закрытия.";
    Иначе
        Итог85 = "Окно закрыто без подтверждения просмотра. Своя запись удалена после закрытия.";
    КонецЕсли;
КонецПроцедуры

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

УчебныеФормыСсылок85 → Задачи → УчебнаяЗадача85 → Модуль объекта

Полный модуль собственного объекта: однопараметровый ПередЗаписью разрешает только новый экземпляр со своим маркером, существующий редактор не сохраняется.

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

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

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

Процедура ЗакончитьПросмотр85(Кнопка)
    Закрыть("Просмотрено");
КонецПроцедуры

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
КонецПроцедуры

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

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

  2. Незанятая собственная ссылка назначается настоящему новому объекту. Свой маркер разрешает ровно первую запись; успешная транзакция фиксируется до получения формы.

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

  4. ПолучитьФорму вызывается на подтверждённой ссылке с явным Паспорт85 и отдельным ключом. Проверяются Неопределено, ключ и настоящий основной реквизит Запись85.

  5. Запись85 должен содержать существующий собственный объект, не новый черновик. На его номер опирается диагностический заголовок; поля только для просмотра.

  6. ОткрытьМодально вызывается только без активной транзакции. Строка Просмотрено означает подтверждение собственной кнопкой, Неопределено — закрытие без подтверждения.

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

  8. Очистка допускается лишь при подтверждённой собственной записи и успешном закрытии формы. Внутри отдельной транзакции принадлежность/неактивность проверяется перед Удалить.

  9. После удаления проверяется отсутствие собственного объекта. При неуспехе не обещается универсальная очистка: выводятся точные собственные UUID/маркер и ошибка.

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

  1. Форма содержит существующую свою запись: Запись85.ЭтоНовый=Ложь, ссылка/маркер/дата/текст совпали.

  2. Форма имеет отдельный ключ и диагностический заголовок с реальным номером своей записи.

  3. При своей кнопке итог сообщает подтверждённый просмотр; крестик не засчитывается подтверждением.

  4. Во время модального просмотра нет активной транзакции; редактор не может записывать существующий объект.

  5. Очистка касается только собственной неизменённой неактивной записи после закрытия; после неё ПолучитьОбъект=Неопределено.

  6. При ошибке закрытия/несовпадении данных нет удаления чужого или изменённого объекта, сохранены диагностика и занятость снята.

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

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

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

  1. Ссылочный ПолучитьФорму работает с существующей записью, объектный — с экземпляром в памяти, менеджерский может создать форму нового объекта. Эти три источника формы не взаимозаменяемы.

  2. ПолучитьФорму не является Открыть: сначала возвращается форма, потом отдельно вызывается ОткрытьМодально. Все параметры здесь точные собственные, имя формы не угадывается.

  3. Основной Запись85 создаётся мастером и получает существующий объект платформой. Не подменяйте его структурой, дополнительным неосновным реквизитом или новым черновиком.

  4. Ключ участвует в выборе экземпляра формы; UUID ключа не является ссылкой базы. Идентичность основной записи проверяется отдельно.

  5. Нельзя держать транзакцию на время ожидания пользователя в модальном окне. Создание и очистка имеют две отдельные короткие транзакции; просмотр между ними.

  6. ДополнительныеСвойства разрешает собственную первую запись объекта в памяти, но не сохраняет разрешение в базе. Существующий объект ПередЗаписью всё равно отказывает.

  7. ПередЗаписью имеет один параметр Отказ и вызывается системой. Отказ=Истина запрещает запись и вызывает исключение; не вставляйте сюда сигнатуру формы.

  8. ПередЗакрытием обычной формы имеет два параметра. СтандартнаяОбработка=Ложь не отменяет закрытие; для рабочего редактора такой подход мог бы терять изменения.

  9. Просмотр не выполняет задачу и не стартует процесс. Флаги только читаются, поля readonly, интерактивные команды удалены.

  10. Удалить — прямое необратимое удаление без проверки ссылочной целостности, не пометка удаления. Здесь только одна собственная неактивная запись в новом пустом стенде, никогда рабочая ссылка.

  11. Если фиксация первой записи не подтверждена, код не считает объект безопасно созданным для очистки. Ошибка содержит свои диагностические идентификаторы, не обещание успешного удаления.

  12. Если собственная форма не закрылась, удалять открытую запись код не будет. При аварии клиента/питания автоматическая очистка не гарантируется.

  13. Нельзя распространять очистку на другие UUID или выбирать все записи для удаления. Проверяются точная своя ссылка, маркер, содержимое, дата, исходные версия/номер и отсутствие исполнения.

  14. Статическая сверка не доказывает реальное сохранение, окно или удаление. runtimeVerifiedScenarios=0, 1С/GUI/базы здесь не запускались.

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

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

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

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

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