Расширение элементов управления, расположенных в форме.Значение

Свойства · Value

Предоставляет доступ к значению, которое редактируется в элементе управления. Тип значения зависит от типа элемента управления, предоставившего значение.

Полное описание, параметры и ограничения

Расширение элементов управления, расположенных в форме.Значение (Extension for controls located in a form.Value)

Расширение элементов управления, расположенных в форме (Extension for controls located in a form)

Значение (Value)

Доступен, начиная с версии 8.0.

Использование:
Чтение и запись.
Описание:
Предоставляет доступ к значению, которое редактируется в элементе управления. Тип значения зависит от типа элемента управления, предоставившего значение.
Доступность:

Толстый клиент.

Примечание:
Только для элементов управления, поддерживающих связь с данными.
ЗАМЕЧАНИЕ. При установке поля ввода или табличного поля в качестве владельца формы, свойство становится недоступно.
Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

Колонки источника и видимые колонки обычного списка: свой профиль и реальные выбранные строки

Полный отдельный ordinary стенд с тремя своими документами2/200,3/300,5/500. Native factory создаёт собственную форму списка; урок объясняет Source.Columns≠GUI.Columns, AutoDeleteFalse/True, строковый source.Delete и плановую перестройку только собственного layout. Native событие доставляет настоящие currentrow/currentdata; SQL-паспорт не подменяет UI-проверку.

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

Windows8.5.1.1343, толстый клиент, обычное приложение/обычные формы, новая собственная файловая ИБ. MAIN — полная собственная ordinary форма-контроллер; actual child metadata Документ.Уч85Профиль.Форма.ФормаСписка с основным реквизитом ДокументСписок.Уч85Профиль и обычным ТабличноеПоле. Не managed DynamicList. Здесь только исходники/статические проверки, actual1C/DB/UI/files/network0.

Подготовка

  1. В собственной Windows VM вручную подготовьте НОВУЮ пустую файловую ИБ C:\1c-labs\OwnList85_8d18bc25-d53c-45eb-a8f8-4b14b9c6c682\IB, CF Уч85ПрофилиСписка, Основной режим запуска Обычное приложение. Платформа8.5.1.1343, толстый клиент. Не используйте УТ/КА/УНФ/БП/рабочие базы/старую CF предыдущего урока. Здесь ничего не создаётся и не запускается.

  2. Ровно один собственный пользователь Уч85Список_8d18bc25. В новой CF создайте роль Уч85Стенд с Администрирование для native чтения массива пользователей, чтением/добавлением/изменением своего Уч85Профиль; назначьте её только этому собственному пользователю. Не выдавайте права в рабочих ИБ. COMMON сверяет настоящий native current user и Users[0] при Count1, включая typed UUID; никаких UUID placeholders/ручной подстановки нет.

  3. Метка8d18bc25-d53c-45eb-a8f8-4b14b9c6c682 — не native UUID ИБ. Сценарий получает новый native UUID при запуске, пользователь — реальный UUID текущей авторизации. UUID самой ИБ не измеряется. Guard адреса требует exact File строки; если она иная, остановитесь и проверьте фактический адрес, не ослабляйте сравнение подстрокой.

  4. В CF только один документ Уч85Профиль, проведение Запретить, автонумерация строкового номера. Реквизиты Метка85/Пользователь85/Сценарий85 Строка36, Количество Число3,0, Сумма Число15,2, Описание85 Строка100. Дата стандартная включает время. Модуль объекта оставьте пустым: нет собственных обработчиков, движений и реальных регистров. Не добавляйте другие документы/справочники/регистры/задания/обмены/расширения/разделители.

  5. В Общих модулях создайте Уч85СписокСтенд: КлиентОбычноеПриложение=True, Сервер=False, Глобальный=False, Привилегированный=False, повторное использование Не использовать. Вставьте целиком COMMON. Native UserManager доступен здесь именно в толстом клиенте; не переносите его вызовы в тонкий клиент. Код читает только known собственный стенд и проверяет реальные saved ссылки/UUID/данные.

  6. В Документ.Уч85Профиль → Формы мастером создайте ОБЫЧНУЮ ФормаСписка; назначьте основной формой списка. Основной реквизит Список имеет тип ДокументСписок.Уч85Профиль. Это реальный metadata source native расширения формы списка документов, не общая форма с переименованной переменной и не managed ДинамическийСписок.

  7. В ordinary ФормаСписка подготовьте один ТабличноеПоле с именем Список и Данные=Список, ТолькоПросмотр=True. Перед сохранением metadata удалите ВСЕ его GUI-колонки в Конфигураторе: первоначальный GUI Count0 — явная подготовка этого известного собственного layout. Список-source и таблица имеют одинаковое имя, но код проверяет native metadata type плюс actual value identity/data-binding/control identity, а не только имена.

  8. Форму списка сделайте только для просмотра: не добавляйте команды создания/редактирования/удаления/проведения/пометки удаления и автонаполняемые командные панели. Свои saved данные изменяет только явная команда контроллера до открытия списка. Readonly-control не абсолютная защита от произвольного административного кода; одна собственная сессия и известная CF обязательны.

  9. В модуль этой ФормаСписка вставьте LIST_FORM. Назначьте форме native ПередОткрытием(Отказ,СтандартнаяОбработка)2. Для ТабличноеПоле.Список событие ПриАктивизацииСтроки назначьте СписокПриАктивизацииСтроки(Элемент): base native event имеет0 параметров, ordinary extension добавляет первый Элемент, поэтому handler1. Не вызывайте этот обработчик вручную. ПодготовитьСвойПоказ85 — собственная обычная Export процедура инициализации, не native событие.

  10. Создайте обычную общую форму Уч85ПрофилиСписка, без основного прикладного реквизита, с реквизитами СогласиеНаСвоиТриЗаписи85 Булево и Статус85 Строка1000. Флажок согласия доступен, поле Статус85 только для просмотра. Вставьте MAIN/CONTROLLER целиком. Он хранит actual свежий child-instance из manager.GetListForm, не ищет чужие формы и не конструирует абстрактные КолонкиСписка.

  11. В этой общей форме создайте4 обычные кнопки: СоздатьСвоиТри85, ПоказатьСемантикуУдаления85, ПерестроитьСвойМакет85, ПроверитьИтог85. Native Нажатие у Кнопка имеет0 параметров; ordinary extension добавляет первый Элемент, значит свяжите их Нажатие с одноимённой процедурой(Элемент). Это не managed command handler и не ручной callback.

  12. В Модуль обычного приложения вставьте APPLICATION с native ПриНачалеРаботыСистемы0. Оно проверяет пустоту и открывает именно свою общую форму через native ПолучитьОбщуюФорму. CF и формы сохраните/проверьте/запустите сами; actual compile/UI здесь0.

  13. Убедитесь вручную: пустая таблица документов, одна сессия, один actual пользователь, нужная роль, точный File адрес, только свой документ/CF, GUI metadata initially0. Первое действие создаст ровно3 собственных записи с явным согласием. Частичная запись оставляет unknown flag и сохранённые свои данные для проверки человеком; автоматических очисток/повторов/отмены транзакции/backup нет.

  14. GUI КолонкаТабличногоПоля.Данные — StringRW, имя source column. Source КолонкаСписка.Имя readonly. Не копируйте legacy пример с GUI.Значение на объект колонки: актуальная native TableBoxColumn использует Данные. Поле ТабличноеПоле.Данные связывает переменную основного реквизита через ordinary control-extension, .Значение возвращает actual native список; этот field никогда не используется владельцем окна.

  15. Явный свой source whitelist8: Ссылка,Дата,Номер,Количество,Сумма,Метка85,Пользователь85,Сценарий85. GUI4: Дата,Номер,Количество,Сумма. Ссылку и UUID держим в source для проверки delivered currentdata, но не показываем пользователю как редактируемые поля. Список.Колонки readonly factory→collection; нельзя присвоить новый абстрактный объект списку.

  16. Настройка времени own list — именно НастройкаПериода, не СтандартныйПериод из managed/СКД. Его native ctor0 даёт обе границы БезОграничения; код проверяет фактические пустые GetDateFrom/GetDateTo и назначает field.СтандартныйПериод ДО Открыть. Это гарантируемое raw contract ожидание, actual список ещё не запускался; не оставляйте default текущий месяц, скрывающий январские учебные документы.

  17. Native ПараметрТекущаяСтрока получает свою сохранённую ссылку3/300 до открытия. Raw позиционирование происходит только при open/reopen, не при любом последующем присваивании. После открытия сами щёлкните все свои2,3,5; SQL-count3 не считается доказательством того, что GUI их отобразил или native event доставил.

  18. В текущие3 записи входят даты02/03/04.01.2026 с00:00, количества2/3/5, суммы200/300/500 и свои описания. COMMON читает реальную таблицу по typed refs и UUID и сверяет Qty10/Sum1000. Отбор.Add/Delete/GetAvailableFields для DocumentList.Filter нативно НЕ доступны; их намеренно нет в PRIMARY/коде и они не подменяются похожим standalone Отбор.

  19. AutoDeleteFalse означает: удаление видимой GUI-колонки сохраняет её source-column. AutoDeleteTrue на том же actual source-column означает: native удаление собственной связанной GUI-колонки удаляет source-column тоже. Это не удаление реквизита metadata или записей документа. Source.Columns.Удалить принимает String name; GUI.Columns.Удалить принимает index либо actualGUIColumn, не наоборот.

  20. Reset разрешён лишь этому созданному целиком собственному child-instance/knownwhitelist/order/bindings и независимым данным3/10/1000. Вначале phase flag, все8 source.AutoDelete=False, потом ownGUI.Clear0, проверка GUI0/source8, ownSource.Clear0, проверка source0, только затем плановый Set8/Add4. После ошибки не выполняется blindrestore/retry/cleanup; ноль — явное проверенное промежуточное собственное состояние, не произвольная пустота.

  21. Данные native текущей строки не кэшируйте между профилями. LIST_FORM берёт свежие .ТекущаяСтрока/.ТекущиеДанные в настоящем событии; MAIN сравнивает actual form/control/data identities, concrete types, ownDocRef/UUID/values с отдельным DB-readback. Во время layout перехода событие не засчитывается; после каждого профиля нужны три реальных ручных выбора заново.

  22. Статические tests моделируют ошибки и сверяют source/API/raw8.5, но не заменяют BSL compiler/GUI-протокол. Ожидаемые результаты source9→8/native AutoDelete/currentrow/currentdata/0→8/4 должны быть подтверждены вручную в этом собственном стенде. Здесь actual writes/UI/1C/OS/network/files provisioning0; authored файлы урока не являются готовой CF.

Перем СвояФорма85;
Перем СвойСписок85;
Перем СвоеПоле85;
Перем СвоиСсылки85;
Перем Сценарий85;
Перем ЗапускНачат85;
Перем НеизвестныйИсход85;
Перем МеняемМакет85;
Перем Этап85;
Перем ДоставленныеСтроки85;

Процедура СоздатьСвоиТри85(Элемент)
    Если Не СогласиеНаСвоиТриЗаписи85 Или ЗапускНачат85 = Истина Тогда
        ВызватьИсключение "Нужно явное согласие на три собственные записи; повторное создание запрещено.";
    КонецЕсли;
    Уч85СписокСтенд.ПроверитьПустоту85();
    Паспорт = Уч85СписокСтенд.ПаспортСтенда85();
    ЗапускНачат85 = Истина;
    НеизвестныйИсход85 = Истина;
    МеняемМакет85 = Истина;
    Идентификатор = Новый УникальныйИдентификатор;
    Сценарий85 = Строка(Идентификатор);
    СвоиСсылки85 = Новый Массив;
    ДоставленныеСтроки85 = Новый Массив;
    Для Индекс = 0 По 2 Цикл
        Уч85СписокСтенд.ПрочитатьСвоиДанные85(Сценарий85, СвоиСсылки85);
        Количество = ?(Индекс = 0, 2, ?(Индекс = 1, 3, 5));
        Документ = Документы.Уч85Профиль.СоздатьДокумент();
        Документ.Дата = Дата(2026, 1, 2 + Индекс);
        Документ.Метка85 = Паспорт.Метка;
        Документ.Пользователь85 = Паспорт.Пользователь;
        Документ.Сценарий85 = Сценарий85;
        Документ.Количество = Количество;
        Документ.Сумма = Количество * 100;
        Документ.Описание85 = "Своя строка " + Строка(Количество);
        Документ.Записать(РежимЗаписиДокумента.Запись);
        Если Документ.ЭтоНовый() Или Документ.Ссылка.Пустая() Тогда
            ВызватьИсключение "Не получена реальная сохранённая ссылка, исход нельзя подменять ожидаемым.";
        КонецЕсли;
        СвоиСсылки85.Добавить(Документ.Ссылка);
        Уч85СписокСтенд.ПрочитатьСвоиДанные85(Сценарий85, СвоиСсылки85);
    КонецЦикла;
    КлючФормы = Новый УникальныйИдентификатор;
    СвояФорма85 = Документы.Уч85Профиль.ПолучитьФормуСписка("ФормаСписка", ЭтаФорма, КлючФормы);
    Если СвояФорма85 = Неопределено Или ТипЗнч(СвояФорма85) <> Тип("Форма")
        Или СвояФорма85.ВладелецФормы <> ЭтаФорма Тогда
        ВызватьИсключение "Нет собственного свежего ordinary list-instance из native manager factory.";
    КонецЕсли;
    СвойСписок85 = СвояФорма85.Список;
    СвоеПоле85 = СвояФорма85.ЭлементыФормы.Список;
    ПроверитьИсточник85();
    Если СвоеПоле85.Колонки.Количество() <> 0 Тогда
        ВызватьИсключение "В подготовленной своей форме GUI-колонки первоначально пустые; чужой layout не заменяем.";
    КонецЕсли;
    СвояФорма85.ПодготовитьСвойПоказ85(Сценарий85, СвоиСсылки85);
    СвойСписок85.Колонки.Установить("Ссылка,Дата,Номер,Количество,Сумма,Метка85,Пользователь85,Сценарий85");
    ПроверитьКолонкиИсточника85(Ложь);
    ДобавитьЧетыреВидимые85();
    Период = Новый НастройкаПериода;
    Если Период.ПолучитьДатуНачала() <> Дата(1, 1, 1) Или Период.ПолучитьДатуОкончания() <> Дата(1, 1, 1) Тогда
        ВызватьИсключение "Native новый период должен быть без ограничений, иначе учебные январские строки могут скрыться.";
    КонецЕсли;
    СвоеПоле85.СтандартныйПериод = Период;
    СвоеПоле85.РазрешитьНастройкуПериода = Ложь;
    СвояФорма85.ПараметрТекущаяСтрока = СвоиСсылки85[1];
    Если СвояФорма85.ПараметрТекущаяСтрока <> СвоиСсылки85[1] Тогда
        ВызватьИсключение "Не назначена собственная начальная ссылка3/300 до открытия формы.";
    КонецЕсли;
    Этап85 = 0;
    НеизвестныйИсход85 = Ложь;
    МеняемМакет85 = Ложь;
    СвояФорма85.Открыть();
    Статус85 = "В ИБ реально три свои строки10/1000. В отдельном native списке вручную выберите2,3,5 для проверки доставки.";
КонецПроцедуры

Процедура ПроверитьИсточник85()
    Уч85СписокСтенд.ПрочитатьСвоиДанные85(Сценарий85, СвоиСсылки85);
    Если ТипЗнч(СвойСписок85) <> Тип("ДокументСписок.Уч85Профиль")
        Или СвояФорма85.Список <> СвойСписок85 Или СвоеПоле85 <> СвояФорма85.ЭлементыФормы.Список
        Или ТипЗнч(СвоеПоле85) <> Тип("ТабличноеПоле") Или СвоеПоле85.Данные <> "Список"
        Или СвоеПоле85.Значение <> СвойСписок85 Или Не СвоеПоле85.ТолькоПросмотр Тогда
        ВызватьИсключение "Не совпал реальный metadata-source/own table/value-binding, не alias по имени переменной.";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьКолонкиИсточника85(СОписанием)
    Имена = СтрРазделить("Ссылка,Дата,Номер,Количество,Сумма,Метка85,Пользователь85,Сценарий85", ",");
    Если СвойСписок85.Колонки.Количество() <> Имена.Количество() + ?(СОписанием, 1, 0) Тогда
        ВызватьИсключение "Изменён полный собственный набор колонок источника, лишние колонки не удаляем.";
    КонецЕсли;
    Для Индекс = 0 По Имена.Количество() - 1 Цикл
        Колонка = СвойСписок85.Колонки.Получить(Индекс);
        Если ТипЗнч(Колонка) <> Тип("КолонкаСписка") Или Колонка.Имя <> Имена[Индекс]
            Или СвойСписок85.Колонки.Найти(Имена[Индекс]) <> Колонка Тогда
            ВызватьИсключение "Индекс/readonly Name/Find actual source-column не совпали с своим полным whitelist.";
        КонецЕсли;
    КонецЦикла;
    Если СОписанием Тогда
        КолонкаОписания = СвойСписок85.Колонки.Получить(8);
        Если КолонкаОписания.Имя <> "Описание85" Или СвойСписок85.Колонки.Найти("Описание85") <> КолонкаОписания Тогда
            ВызватьИсключение "Девятая source-колонка не собственное Описание85.";
        КонецЕсли;
    Иначе
        Если СвойСписок85.Колонки.Найти("Описание85") <> Неопределено Тогда
            ВызватьИсключение "Описание85 неожиданно осталось в источнике.";
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Процедура ДобавитьЧетыреВидимые85()
    Если СвоеПоле85.Колонки.Количество() <> 0 Тогда
        ВызватьИсключение "Создание своих GUI-колонок допустимо только после проверенного пустого собственного layout.";
    КонецЕсли;
    Имена = СтрРазделить("Дата,Номер,Количество,Сумма", ",");
    Для Каждого Имя Из Имена Цикл
        Колонка = СвоеПоле85.Колонки.Добавить(Имя, Имя);
        Колонка.Данные = Имя;
        Колонка.ТолькоПросмотр = Истина;
        Если Колонка.Данные <> Имя Тогда
            ВызватьИсключение "GUI.Данные не связан с реальной собственной source-column.";
        КонецЕсли;
    КонецЦикла;
    ПроверитьВидимые85(Ложь);
КонецПроцедуры

Процедура ПроверитьВидимые85(СОписанием)
    Имена = СтрРазделить("Дата,Номер,Количество,Сумма", ",");
    Если СвоеПоле85.Колонки.Количество() <> 4 + ?(СОписанием, 1, 0) Тогда
        ВызватьИсключение "Чужая или неожиданная GUI-колонка: весь layout не чистим.";
    КонецЕсли;
    Для Индекс = 0 По 3 Цикл
        Колонка = СвоеПоле85.Колонки.Получить(Индекс);
        Если Колонка.Имя <> Имена[Индекс] Или Колонка.Данные <> Имена[Индекс]
            Или Не Колонка.ТолькоПросмотр Или СвоеПоле85.Колонки.Найти(Имена[Индекс]) <> Колонка Тогда
            ВызватьИсключение "Собственная GUI-позиция/data binding/readonly-control изменены.";
        КонецЕсли;
    КонецЦикла;
    Если СОписанием Тогда
        Описание = СвоеПоле85.Колонки.Получить(4);
        Если Описание.Имя <> "Описание85" Или Описание.Данные <> "Описание85" Тогда
            ВызватьИсключение "Дополнительная GUI-колонка не своё Описание85.";
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Процедура ПринятьСвоюСтроку85(ФормаИсточник, ЭлементИсточник, Ссылка, Данные) Экспорт
    Если МеняемМакет85 = Истина Или НеизвестныйИсход85 = Истина Тогда
        Возврат;
    КонецЕсли;
    Если ФормаИсточник <> СвояФорма85 Или ЭлементИсточник <> СвоеПоле85
        Или ТипЗнч(Ссылка) <> Тип("ДокументСсылка.Уч85Профиль")
        Или ТипЗнч(Данные) <> Тип("ТекущиеДанныеСписка")
        Или Ссылка <> СвоеПоле85.ТекущаяСтрока Тогда
        ВызватьИсключение "Native delivery не от своих actual form/control/row/currentdata.";
    КонецЕсли;
    ПроверитьИсточник85();
    СвежиеДанные = СвоеПоле85.ТекущиеДанные;
    Если ТипЗнч(СвежиеДанные) <> Тип("ТекущиеДанныеСписка")
        Или СвежиеДанные.Ссылка <> Данные.Ссылка Или СвежиеДанные.Количество <> Данные.Количество
        Или СвежиеДанные.Сумма <> Данные.Сумма Или СвежиеДанные.Сценарий85 <> Данные.Сценарий85 Тогда
        ВызватьИсключение "Native текущие значения изменились между доставкой и чтением; стабильную identity wrapper не предполагаем.";
    КонецЕсли;
    Таблица = Уч85СписокСтенд.ПрочитатьСвоиДанные85(Сценарий85, СвоиСсылки85);
    Индекс = СвоиСсылки85.Найти(Ссылка);
    Если Индекс = Неопределено Тогда
        ВызватьИсключение "Ссылка не принадлежит своим реальным трём документам.";
    КонецЕсли;
    Сохранено = Таблица[Индекс];
    Если Данные.Ссылка <> Сохранено.Ссылка Или Данные.Количество <> Сохранено.Количество
        Или Данные.Сумма <> Сохранено.Сумма Или Данные.Дата <> Сохранено.Дата
        Или Данные.Номер <> Сохранено.Номер Или Данные.Метка85 <> Сохранено.Метка85
        Или Данные.Пользователь85 <> Сохранено.Пользователь85 Или Данные.Сценарий85 <> Сохранено.Сценарий85 Тогда
        ВызватьИсключение "Actual native currentdata, а не DB-расчёт, отличается от независимой собственной строки.";
    КонецЕсли;
    Если СвойСписок85.Колонки.Найти("Описание85") <> Неопределено И Данные.Описание85 <> Сохранено.Описание85 Тогда
        ВызватьИсключение "Source-only hidden Описание85 не прочиталось как реальное значение своего документа.";
    КонецЕсли;
    Если ДоставленныеСтроки85.Найти(Ссылка) = Неопределено Тогда
        ДоставленныеСтроки85.Добавить(Ссылка);
    КонецЕсли;
    Статус85 = "Native строка " + Строка(Данные.Количество) + "/" + Строка(Данные.Сумма)
        + "; доставлено разных своих ссылок " + Строка(ДоставленныеСтроки85.Количество()) + ". DB10/1000 проверяется отдельно.";
КонецПроцедуры

Процедура ПоказатьСемантикуУдаления85(Элемент)
    Если Этап85 <> 0 Или НеизвестныйИсход85 = Истина Или МеняемМакет85 = Истина
        Или ДоставленныеСтроки85.Количество() <> 3 Тогда
        ВызватьИсключение "Сначала native событие должно реально доставить все свои2,3,5; повтор/partial layout запрещён.";
    КонецЕсли;
    ПроверитьИсточник85();
    ПроверитьКолонкиИсточника85(Ложь);
    ПроверитьВидимые85(Ложь);
    НеизвестныйИсход85 = Истина;
    МеняемМакет85 = Истина;
    КолонкаИсточника = СвойСписок85.Колонки.Добавить("Описание85", Ложь);
    Если КолонкаИсточника.АвтоУдаление Или КолонкаИсточника.Имя <> "Описание85" Тогда
        ВызватьИсключение "Native source.Add не вернул своё имя/AutoDeleteFalse.";
    КонецЕсли;
    GUIКолонка = СвоеПоле85.Колонки.Добавить("Описание85", "Своё описание");
    GUIКолонка.Данные = "Описание85";
    GUIКолонка.ТолькоПросмотр = Истина;
    ПроверитьКолонкиИсточника85(Истина);
    ПроверитьВидимые85(Истина);
    Если КолонкаИсточника.АвтоУдаление Или СвойСписок85.Колонки.Найти("Описание85") <> КолонкаИсточника Тогда
        ВызватьИсключение "Перед первым GUI-delete своё source identity/AutoDeleteFalse неожиданно изменено.";
    КонецЕсли;
    СвоеПоле85.Колонки.Удалить(GUIКолонка);
    ПроверитьВидимые85(Ложь);
    ПроверитьКолонкиИсточника85(Истина);
    Если СвойСписок85.Колонки.Найти("Описание85") <> КолонкаИсточника Тогда
        ВызватьИсключение "При AutoDeleteFalse источник должен сохранить своё описание после GUI-delete.";
    КонецЕсли;
    КолонкаИсточника.АвтоУдаление = Истина;
    Если Не КолонкаИсточника.АвтоУдаление Тогда
        ВызватьИсключение "AutoDeleteTrue не установлен на actual own source-column.";
    КонецЕсли;
    GUIКолонка = СвоеПоле85.Колонки.Добавить("Описание85", "Своё описание");
    GUIКолонка.Данные = "Описание85";
    GUIКолонка.ТолькоПросмотр = Истина;
    ПроверитьВидимые85(Истина);
    Если Не КолонкаИсточника.АвтоУдаление Или СвойСписок85.Колонки.Найти("Описание85") <> КолонкаИсточника Тогда
        ВызватьИсключение "Перед вторым GUI-delete своё source identity/AutoDeleteTrue неожиданно изменено.";
    КонецЕсли;
    СвоеПоле85.Колонки.Удалить(GUIКолонка);
    ПроверитьВидимые85(Ложь);
    ПроверитьКолонкиИсточника85(Ложь);
    СвойСписок85.Колонки.Добавить("Описание85", Ложь);
    ПроверитьКолонкиИсточника85(Истина);
    СвойСписок85.Колонки.Удалить("Описание85");
    ПроверитьКолонкиИсточника85(Ложь);
    ПроверитьИсточник85();
    СвойСписок85.Обновить();
    Этап85 = 1;
    НеизвестныйИсход85 = Ложь;
    МеняемМакет85 = Ложь;
    ДоставленныеСтроки85.Очистить();
    Статус85 = "AutoDeleteFalse сохранил source-column, True удалил её вместе с GUI; source.Delete принимает имя. Вручную опять выберите свои2,3,5.";
КонецПроцедуры

Процедура ПерестроитьСвойМакет85(Элемент)
    Если Этап85 <> 1 Или НеизвестныйИсход85 = Истина Или МеняемМакет85 = Истина
        Или ДоставленныеСтроки85.Количество() <> 3 Тогда
        ВызватьИсключение "Нужна реальная доставка своих строк после предыдущего профиля; повтор и partial запрещены.";
    КонецЕсли;
    ПроверитьИсточник85();
    ПроверитьКолонкиИсточника85(Ложь);
    ПроверитьВидимые85(Ложь);
    НеизвестныйИсход85 = Истина;
    МеняемМакет85 = Истина;
    Для Индекс = 0 По 7 Цикл
        Колонка = СвойСписок85.Колонки.Получить(Индекс);
        Колонка.АвтоУдаление = Ложь;
        Если Колонка.АвтоУдаление Тогда
            ВызватьИсключение "Перед сбросом GUI своё source-column сохранение не подтверждено.";
        КонецЕсли;
    КонецЦикла;
    СвоеПоле85.Колонки.Очистить();
    Если СвоеПоле85.Колонки.Количество() <> 0 Тогда
        ВызватьИсключение "Свои GUI-колонки не стали пустыми, source.clear не разрешён.";
    КонецЕсли;
    ПроверитьКолонкиИсточника85(Ложь);
    СвойСписок85.Колонки.Очистить();
    Если СвойСписок85.Колонки.Количество() <> 0 Тогда
        ВызватьИсключение "Собственный source.Clear не дал пустой набор; перестройку не продолжаем.";
    КонецЕсли;
    ПроверитьИсточник85();
    СвойСписок85.Колонки.Установить("Ссылка,Дата,Номер,Количество,Сумма,Метка85,Пользователь85,Сценарий85");
    ПроверитьКолонкиИсточника85(Ложь);
    ДобавитьЧетыреВидимые85();
    СвойСписок85.Обновить();
    ПроверитьИсточник85();
    Этап85 = 2;
    НеизвестныйИсход85 = Ложь;
    МеняемМакет85 = Ложь;
    ДоставленныеСтроки85.Очистить();
    Статус85 = "Планово перестроен только полностью свой layout0→8source/4GUI, не очищены документы. Вручную ещё раз выберите2,3,5.";
КонецПроцедуры

Процедура ПроверитьИтог85(Элемент)
    Если Этап85 <> 2 Или НеизвестныйИсход85 = Истина Или МеняемМакет85 = Истина
        Или ДоставленныеСтроки85.Количество() <> 3 Тогда
        ВызватьИсключение "Нет полной реальной доставки собственных строк после перестройки.";
    КонецЕсли;
    ПроверитьИсточник85();
    ПроверитьКолонкиИсточника85(Ложь);
    ПроверитьВидимые85(Ложь);
    Статус85 = "Полный own protocol: actual native delivery2/200,3/300,5/500; DB3records/qty10/sum1000; source8/GUI4.";
КонецПроцедуры
COMMON — полный паспорт собственных реальных saved данных

Своя CF Уч85ПрофилиСписка → Общие → Общие модули → Уч85СписокСтенд → Модуль.

КлиентОбычноеПриложение=True/Сервер=False; thick-only currentUsers factory/readQuery, никакого actual запуска.

Функция ПаспортСтенда85() Экспорт
    Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnList85_8d18bc25-d53c-45eb-a8f8-4b14b9c6c682\IB"";" Или Метаданные.Документы.Количество() <> 1 Или Метаданные.Документы.Найти("Уч85Профиль") = Неопределено Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.Справочники.Количество() <> 0 Тогда
        ВызватьИсключение "Допустим только собственный новый файловый стенд с одним своим документом без регистров.";
    КонецЕсли;
    Если Метаданные.Документы.Уч85Профиль.Проведение <> Метаданные.СвойстваОбъектов.Проведение.Запретить Тогда
        ВызватьИсключение "Учебные документы этого отдельного стенда не проводятся.";
    КонецЕсли;
    Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Если Текущий = Неопределено Или Пользователи.Количество() <> 1 Тогда
        ВызватьИсключение "Нужен один подготовленный собственный пользователь с административным правом чтения списка пользователей.";
    КонецЕсли;
    Если Текущий.Имя <> "Уч85Список_8d18bc25"
        Или Пользователи[0].Имя <> Текущий.Имя
        Или Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
        ВызватьИсключение "Current native user не совпал с единственным фактическим пользователем своей ИБ.";
    КонецЕсли;
    Возврат Новый Структура("Метка,Пользователь", "8d18bc25-d53c-45eb-a8f8-4b14b9c6c682", Строка(Текущий.УникальныйИдентификатор));
КонецФункции

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

Функция ПрочитатьСвоиДанные85(Сценарий, Ссылки) Экспорт
    Паспорт = ПаспортСтенда85();
    Если ТипЗнч(Ссылки) <> Тип("Массив") Или Ссылки.Количество() > 3
        Или ТипЗнч(Сценарий) <> Тип("Строка") Или СтрДлина(Сценарий) <> 36 Тогда
        ВызватьИсключение "Нужны собственные реальные ссылки и UUID текущего запуска.";
    КонецЕсли;
    Идентификатор = Новый УникальныйИдентификатор(Сценарий);
    Если НРег(Строка(Идентификатор)) <> НРег(Сценарий) Тогда
        ВызватьИсключение "UUID сценария повреждён.";
    КонецЕсли;
    Счетчик = Новый Запрос("ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Число ИЗ Документ.Уч85Профиль");
    Проверка = Счетчик.Выполнить().Выбрать();
    Если Не Проверка.Следующий() Или Проверка.Число <> Ссылки.Количество() Тогда
        ВызватьИсключение "Количество реальных документов изменено, частичная запись не исправляется автоматически.";
    КонецЕсли;
    Запрос = Новый Запрос(
        "ВЫБРАТЬ П.Ссылка, П.Дата, П.Номер, П.Количество, П.Сумма, П.Описание85,
        | П.Метка85, П.Пользователь85, П.Сценарий85, П.Проведен, П.ПометкаУдаления
        |ИЗ Документ.Уч85Профиль КАК П
        |ГДЕ П.Метка85 = &Метка И П.Пользователь85 = &Пользователь И П.Сценарий85 = &Сценарий
        |УПОРЯДОЧИТЬ ПО П.Количество");
    Запрос.УстановитьПараметр("Метка", Паспорт.Метка);
    Запрос.УстановитьПараметр("Пользователь", Паспорт.Пользователь);
    Запрос.УстановитьПараметр("Сценарий", Сценарий);
    Данные = Запрос.Выполнить().Выгрузить();
    Если Данные.Количество() <> Ссылки.Количество() Тогда
        ВызватьИсключение "Не совпали фактические собственные UUID в сохранённых документах.";
    КонецЕсли;
    ИтогКоличество = 0;
    ИтогСумма = 0;
    Для Индекс = 0 По Данные.Количество() - 1 Цикл
        СтрокаДанных = Данные[Индекс];
        Количество = ?(Индекс = 0, 2, ?(Индекс = 1, 3, 5));
        Если ТипЗнч(Ссылки[Индекс]) <> Тип("ДокументСсылка.Уч85Профиль")
            Или Ссылки[Индекс].Пустая() Или СтрокаДанных.Ссылка <> Ссылки[Индекс]
            Или СтрокаДанных.Дата <> Дата(2026, 1, 2 + Индекс)
            Или СтрокаДанных.Количество <> Количество Или СтрокаДанных.Сумма <> Количество * 100
            Или ПустаяСтрока(СтрокаДанных.Номер) Или СтрокаДанных.Описание85 <> "Своя строка " + Строка(Количество)
            Или СтрокаДанных.Проведен Или СтрокаДанных.ПометкаУдаления Тогда
            ВызватьИсключение "Независимый паспорт реальной строки отличается от своей подготовки.";
        КонецЕсли;
        ИтогКоличество = ИтогКоличество + СтрокаДанных.Количество;
        ИтогСумма = ИтогСумма + СтрокаДанных.Сумма;
    КонецЦикла;
    Если Данные.Количество() = 3 И (ИтогКоличество <> 10 Или ИтогСумма <> 1000) Тогда
        ВызватьИсключение "Суммы собственных трёх документов не10/1000.";
    КонецЕсли;
    Возврат Данные;
КонецФункции
LIST_FORM — actual native ordinary document list и настоящее rowevent1

Своя CF → Документы → Уч85Профиль → Формы → ordinary ФормаСписка → Модуль.

Main Список:ДокументСписок.Уч85Профиль actual ordinary metadata; BeforeOpen2/rowActivate1 на толстом клиенте, не managed aliases.

Перем СвойСценарий85;
Перем СвоиСсылки85;
Перем Подготовлено85;

Процедура ПодготовитьСвойПоказ85(Сценарий, Ссылки) Экспорт
    Если Подготовлено85 = Истина Или ТипЗнч(Список) <> Тип("ДокументСписок.Уч85Профиль")
        Или ТипЗнч(Ссылки) <> Тип("Массив") Или Ссылки.Количество() <> 3 Тогда
        ВызватьИсключение "Инициализация допустима только один раз для actual собственного metadata document list.";
    КонецЕсли;
    Уч85СписокСтенд.ПрочитатьСвоиДанные85(Сценарий, Ссылки);
    СвойСценарий85 = Сценарий;
    СвоиСсылки85 = Ссылки;
    Подготовлено85 = Истина;
КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    Если Подготовлено85 <> Истина Или ЭтаФорма.ВладелецФормы = Неопределено
        Или ТипЗнч(ЭтаФорма.ВладелецФормы) <> Тип("Форма")
        Или ТипЗнч(Список) <> Тип("ДокументСписок.Уч85Профиль")
        Или ЭлементыФормы.Список.Данные <> "Список"
        Или ЭлементыФормы.Список.Значение <> Список
        Или Не ЭлементыФормы.Список.ТолькоПросмотр
        Или ЭтаФорма.ПараметрТекущаяСтрока <> СвоиСсылки85[1] Тогда
        Отказ = Истина;
        ВызватьИсключение "Форму открывает только свой подготовленный owner; default metadata positioning ещё не исполнено.";
    КонецЕсли;
    Уч85СписокСтенд.ПрочитатьСвоиДанные85(СвойСценарий85, СвоиСсылки85);
КонецПроцедуры

Процедура СписокПриАктивизацииСтроки(Элемент)
    Если Подготовлено85 <> Истина Или Элемент <> ЭлементыФормы.Список Тогда
        ВызватьИсключение "Native row event пришёл не от своего подготовленного TableBox.";
    КонецЕсли;
    Данные = Элемент.ТекущиеДанные;
    Если Данные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    ЭтаФорма.ВладелецФормы.ПринятьСвоюСтроку85(ЭтаФорма, Элемент, Элемент.ТекущаяСтрока, Данные);
КонецПроцедуры
APPLICATION — полный собственный ordinary старт

Своя CF → Модуль обычного приложения.

Native ordinary ПриНачалеРаботыСистемы0/ПолучитьОбщуюФорму/Форма.Открыть after own empty scope.

Процедура ПриНачалеРаботыСистемы()
    Уч85СписокСтенд.ПроверитьПустоту85();
    Форма = ПолучитьОбщуюФорму("Уч85ПрофилиСписка");
    Форма.Открыть();
КонецПроцедуры

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

  1. В новой собственной пустой ИБ запустите свой толстый ordinary клиент. Launcher появился только после exact File/CF/единственный current+UsersUUID/pustota guards. Отметьте СогласиеНаСвоиТриЗаписи85, затем СоздатьСвоиТри85 один раз.

  2. MAIN перед каждым native document.Write сверяет собственные ранее сохранённые0/1/2 записи и ссылки; native СоздатьДокумент создаёт именно свой непроводимый объект. После каждого write новая фактическая ссылка добавляется только при ЭтоНовый=False/nonempty и независимом saved readback. После третьего — real count3, Qty10/Sum1000. При partial ошибка прекращает урок без автоудаления.

  3. Native manager.GetListForm3 создаёт свежую собственную ordinary списочную форму с owner=этот launcher и freshUUIDkey. MAIN проверяет actual source type, child/source/table binding identities, preparedGUI0, заменяет целиком known собственные source columns на8 и создаёт отдельно4 GUI columns с native Данные binding.

  4. До Open назначены native НастройкаПериода без ограничений и ПараметрТекущаяСтрока=своя сохранённая3/300. Native BeforeOpen2 support подтвердит реальный main DocList и independent own rows. Ожидаемое первоначальное выделение3/300 проверьте вручную; это не выполненный здесь результат.

  5. В списке вручную выберите2/200,3/300,5/500. Настоящий rowevent handler1 берёт delivered currentdata; MAIN не вычисляет эти значения вместо UI, а сравнивает их с независимыми saved rows/refs/date/number/UUID. Пока все3 different actual refs не доставлены, следующая команда запрещена.

  6. В launcher ПоказатьСемантикуУдаления85: source.Add Описание85 withFalse →source9 и GUI5. Native GUI.Delete(actual own column) →GUI4/source9. Same source.AutoDelete=True +проверенная новая ownGUI association+GUIdelete →GUI4/source8. Отдельный source.AddFalse/Delete("Описание85") подтверждает именно строковую сигнатуру source.Delete; DB3/10/1000 всё время прежний.

  7. После профиля опять щёлкните2/3/5, реально повторно доставьте currentdata. Исчезновение source Description проверяется FindUndefined/Count8; не считайте изменение одного SQL count доказательством GUI association.

  8. ПерестроитьСвойМакет85: snapshot guards before any setters, unknown/layout flags. После отключенияAutoDelete своих8, GUI.Clear→0/source8, Source.Clear→0 при прежних DB3/10/1000. Только доказанный own intermediate0 позволяет planned Set8/Add4; любая ошибка оставляет процесс остановленным без blindrollback.

  9. После rebuild снова реально выберите2/3/5 и нажмите ПроверитьИтог85. Expected source8/GUI4, три настоящие события собственных ссылок и прежний независимый DB3/10/1000. Задача не меняла saved документы после первоначальных3 writes, не печатала/экспортировала/удаляла данные.

  10. Зафиксируйте ручной протокол либо точный отказ; сохранённые собственные3 записи оставьте для человека. Следующий запуск в непустой ИБ намеренно откажет, не создаст дубликаты и не выполнит cleanup. Actual protocol здесь ещё отсутствует: только static source.

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

  1. Статически:15 unique PRIMARY/main uses, source factory+ordinary metadata binding, five native checkers0 mismatches, exactraw8.5 source/columns/readonly/event1/period/ManagerUsers contracts. Старые frozen workspace sources SHA неизменны.

  2. Вручную: wrong path/config/user/usersUUID/count/preexisting data/source/control/layout/deliveredref/UUID →отказ до очередной допустимой own операции, никакого foreign write/перезапуска/очистки. Admin/read-only поля не объявляются абсолютной security.

  3. Вручную: real DB3 records own typed refs, marker/realUserUUID/freshScenarioUUID, dates0:00, qty2+3+5=10, amount200+300+500=1000 до и после каждого layout. Unknown partial не превращается в ожидаемые данные.

  4. Вручную: source8/GUI4 действительно разные collections; AutoDeleteFalse GUIdelete keeps source9, True deletes sourceDescription→8; sourceDelete("Описание85")String не GUIobject/index. Column.Name readonly, actual column.Data binding подтверждён.

  5. Вручную: native callback1 реально доставляет concrete currentDataList values иactualDocRef всех3ownrows; сравнениеQuery не выдаётся за факт отображения. InitialCurrentRow только приopen/reopen, period actualownНастройкаПериодаNoBounds.

  6. Вручную: clear only fullyowned layout, snapshot/whitelist/flags до изменений; GUI0/source8→source0→source8/GUI4 при прежнемDB3/10/1000. Native callbacks вручную не запускаются; после каждого профиля требуется свежая реальная delivery всех3 строк.

  7. Публикационные tests различают authored source и published exact own id/keys/code; root не переписывается из этого урока. Все реальные1C/DB/UI/OS/network/provisioning/backup действия здесь0.

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

Ожидаемый ручной результат:3 своих документов10/1000, один whollyowned ordinary список source8/GUI4, доказанные native различия AutoDelete и три реально доставленные выбранные строки после каждого профиля. В этой работе этот runtime результат не выполнялся: authoredsource/static only.

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

  1. ДокументСписок.<Имя> — ordinary native список, не managed ДинамическийСписок. Native manager.GetListForm3 — реальный источник формы; type/name совпадение переменных без factory/metadata/value identity доказательством не считается.

  2. Source.Columns readonly property даёт изменяемую collection; Column.Name readonly. GUI.Column.Данные связывает source-column, а не native GUI.Значение из legacy примера.

  3. Source.Set(String CSV) replaces whole source columns; GUI layout автоматически не создаётся. Source.Delete(StringName) отличается от GUI.Delete(IndexOrActualColumn).

  4. AutoDeleteFalse/True относится к source-column при удалении соответствующей GUI-column, не к удалению metadata/документов. Не присваивайте ожидаемый Count вместо фактического native readback.

  5. ПараметрТекущаяСтрока делает positioning приopen/reopen; currentdata читается после реальной активации, не сразу из обещанного parameter assignment. Rowevent base0+ordinaryfirstElement1; manual callback запрещён.

  6. Native ТекущиеДанные readonly и зависят от SOURCE columns. Не путайте скрытое source поле с видимой GUI колонкой и не кэшируйте старую selection между source changes.

  7. Native поле.СтандартныйПериод ordinary принимает НастройкаПериода, НЕ одноимённый managed СтандартныйПериод. Fresh ctor0 даётNoBounds; GetDateFrom/GetDateTo actualemptydate, startup historical rows не спрятаны текущим месяцем.

  8. Отбор.Add/Delete/GetAvailableFields rawnative запрещены для DocumentList.Filter. Не применяйте standalone API к похожему owner ради покрытия; в уроке этих calls нет.

  9. Whole Clear только whollyowned freshinstance сownknownstate. Порядок GUI.Clear before source.Clear и exact0 before planned restore нужен; arbitrary чужой source/reset/автоматический rollback после partial недопустим.

  10. Три real native writes выполняет только вручную запущенный authored сценарий с согласия в новой собственной ИБ. После partial/exception unknown flag и реальные saved данные остаются для проверки, без retries/delete/backups.

  11. Native CurrentUser UUID — UUID пользователя, не базы/маркер пути. СписокUsers1 и matching currentUUID устраняют placeholders, но дают administrative read contract только собственному подготовленному толстому клиенту.

  12. Readonly control и guards не защита от произвольного административного кода/других сессий/unknown CF. Только собственная known пустая CF/oneuser/onesession без регистров/расширений/jobs.

  13. СуммаQuery1000 не доказывает GUI отображение илиcallbackdelivery. Delivered data сравниваются отдельно с native actual table/currentrow identity иindependent saved data; без3 разных реальных событий следующая фаза не запускается.

  14. Python synthetic tests/native static checks не BSLcompiler/работающая1C. Field-value identity/AutoDelete/repaint/currentdata delivery/period и GUIzero transitions нужно подтвердить вручную; в этой работе runtime0.

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

Обычная форма: связать комментарий, назначить обработчики и своё меню

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

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

Полный модуль собственной обычной формы УчебныеЭлементы85 → Обработки → Уч85Комментарий → Карточка. Толстый обычный клиент; не выполнялся.

Подготовка

  1. Общая основа семейства УчебныеЭлементы85: новая отдельная файловая база 8.5.1.1343, русский встроенный язык, совместимость Не использовать. Этот вариант запускается как Обычное приложение в толстом клиенте Windows, не в тонком/управляемом клиенте. Не переносите сюда Элементы/ПутьКДанным или серверные директивы управляемого варианта флажков.

  2. В новом собственном стенде нет расширений, подписок и фоновых обработчиков. Обработки → Уч85Комментарий → обычная основная форма Карточка. Только реквизиты формы Комментарий Строка(100), Подсказка Строка(300), СчетчикРучныхИзменений Число(5,0), неотрицательный. Реквизитов объекта обработки и прикладных данных для записи нет.

  3. Поля ввода Комментарий и Подсказка связаны с одноимёнными реквизитами формы. Подсказка ТолькоПросмотр=Да. В порядке обхода сначала Комментарий, затем Подсказка, далее кнопки. Оба поля принадлежат своей форме; не устанавливайте их владельцем другой формы.

  4. Отдельная командная панель МенюКомментария — собственное контекстное меню, изначально пустое, АвтоЗаполнение=Нет. Код создаёт только свою кнопку ВставитьОбразец. Не передавайте панель рабочей формы или её чужую коллекцию кнопок.

  5. Кнопки Заполнить, АвтоМеню, СвоеМеню, БезОбработчика, СОбработчиком, Проверить: действия одноимённых процедур *Нажатие. ПриОткрытии формы → ПриОткрытии. Основной блок — полный модуль обычной формы; обработчики динамических действий имеют Экспорт и стандартный параметр своего элемента/кнопки.

  6. F7 и обновление только своего нового стенда. Откройте свою обработку через стандартный список обработок толстого обычного клиента. Здесь подготовка и UI не выполнялись, runtimeVerifiedScenarios=0.

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

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

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

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

Процедура КомментарийИзменился(Элемент) Экспорт
    ПроверитьСвойСтенд();
    СчетчикРучныхИзменений = СчетчикРучныхИзменений + 1;
    ПоказатьСвоеСостояние();
КонецПроцедуры

Процедура АвтоМенюНажатие(Кнопка)
    ПроверитьСвойСтенд();
    Поле = ЭлементыФормы.Комментарий;
    Панель = ЭлементыФормы.МенюКомментария;
    Панель.ИсточникДействий = Поле;
    Панель.АвтоЗаполнение = Истина;
    Поле.АвтоКонтекстноеМеню = Истина;
    ПоказатьСвоеСостояние();
КонецПроцедуры

Процедура СвоеМенюНажатие(Кнопка)
    ПроверитьСвойСтенд();
    НастроитьСвоеМеню();
    ПоказатьСвоеСостояние();
КонецПроцедуры

Процедура БезОбработчикаНажатие(Кнопка)
    ПроверитьСвойСтенд();
    ЭлементыФормы.Комментарий.УстановитьДействие("ПриИзменении", Неопределено);
    ПоказатьСвоеСостояние();
КонецПроцедуры

Процедура СОбработчикомНажатие(Кнопка)
    ПроверитьСвойСтенд();
    ЭлементыФормы.Комментарий.УстановитьДействие("ПриИзменении", Новый Действие("КомментарийИзменился"));
    ПоказатьСвоеСостояние();
КонецПроцедуры

Процедура ПроверитьНажатие(Кнопка)
    ПроверитьСвойСтенд();
    ПоказатьСвоеСостояние();
КонецПроцедуры

Процедура ПоказатьСвоеСостояние()
    Подсказка = СтрШаблон("Комментарий=%1; ручных изменений=%2; авто-меню=%3; имя=%4",
        Комментарий, СчетчикРучныхИзменений, ЭлементыФормы.Комментарий.АвтоКонтекстноеМеню,
        ЭлементыФормы.Комментарий.Имя);
КонецПроцедуры

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

  1. Расширение возникает у реального элемента управления, расположенного в обычной форме. Поле.Имя проверяет, что найден именно свой Комментарий. Имя не переименовывается: native-замечание разрешает запись имени лишь при совместимости Версия8_3_5 и ниже, а здесь НеИспользовать.

  2. Данные — имя связанной переменной, не значение комментария. Значение — её редактируемое значение. Присвоение через поле проверяется чтением реального реквизита Комментарий.

  3. У связанного поля ТипЗначения readonly. Код только проверяет СодержитТип(Строка), не присваивает новый ОписаниеТипов. Запись этого свойства разрешена для несвязанных элементов, чего данный опыт не делает.

  4. УстановитьДействие получает объект Действие, не строку имени процедуры как в управляемой форме. ПолучитьДействие подтверждает назначенный тип; реальные процедуры формы экспортные. БезОбработчика назначает Неопределено, СОбработчиком возвращает своё действие.

  5. ПриИзменении поля ввода относится к пользовательскому изменению с завершением редактирования. Программное присвоение Значение не должно считаться таким событием: Заполнить явно обновляет подпись, но не увеличивает счётчик ручных изменений.

  6. ИзменяетДанные=True установлено у кнопки локального заполнения. Это характеристика UI, не вызов записи базы и не проверка прав. КнопкаПоУмолчанию=True означает Ctrl+Enter, не обычный Enter.

  7. АвтоКонтекстноеМеню=False включает собственное КонтекстноеМеню с действием ВставитьОбразец. АвтоМеню разрешает стандартное меню поля и назначает это поле источником автоматически заполняемой своей панели. СвоеМеню возвращает ручной вариант и свою единственную кнопку.

  8. ПервыйВГруппе относится к группе обхода клавишами управления курсором. ПропускатьПриВводе=True у Подсказка пропускает её по Enter, но не по Tab. Это не одно и то же свойство и не запрет доступа к полю.

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

  1. Будущий ручной тест: открыть собственную карточку. Проверить Комментарий=Самовывоз, счётчик 0, имя Комментарий, тип реквизита Строка.

  2. Заполнить кнопкой, Ctrl+Enter и командой собственного контекстного меню. Комментарий должен стать Доставка: согласовать адрес; счётчик не растёт только из-за программного присвоения.

  3. Вручную заменить комментарий и перейти на другой элемент. С установленным обработчиком счётчик увеличивается. БезОбработчика → ручной ввод → Проверить: значение меняется, счётчик не увеличивается. СОбработчиком возвращает подсчёт будущих изменений.

  4. АвтоМеню и СвоеМеню: проверить настоящее контекстное меню по правой кнопке мыши. Стандартный состав зависит от состояния поля/клиента; ручное меню содержит только свою ВставитьОбразец.

  5. Сравнить обход Enter и Tab для readonly Подсказка, Ctrl+Enter для Заполнить. Не объявлять видимый текст доказательством всех клавиатурных событий.

  6. Закрыть собственную карточку и открыть заново: локальный комментарий снова Самовывоз, счётчик 0. При возможном вопросе о локальной модификации не сохранять никакой объект: в уроке нет записи базы.

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

Будущий опыт связывает своё поле с локальным реквизитом, отличает пользовательское событие от программного заполнения и показывает ручное/автоматическое меню. Данные только в форме; запуск не выполнялся.

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

  1. Это обычная форма Форма/ЭлементыФормы, не управляемая УправляемаяФорма/Элементы. Одноимённые экспортные расширения и расширения менеджера тестирования не являются этим API.

  2. При установке поля ввода/табличного поля владельцем формы свойства данного расширения недоступны. Не используйте здесь внешний элемент-владелец.

  3. Имя не записываем при совместимости НеИспользовать. У связанного поля ТипЗначения только читаем. Не переносите общий заголовок Чтение и запись без условий из примечаний.

  4. Динамические действия требуют объекта Действие, экспортного обработчика именно этой формы и правильных параметров события. В модуль управляемой формы этот код не копируется.

  5. ИзменяетДанные не означает Записать. Очищается только коллекция своей панели, не чужое меню. Здесь нет сети, файлов, печати, удаления или записи предметных данных.

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

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

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

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

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