Добавляет колонку в список.
Синтаксис
Добавить(<Колонка>, <Автоудаление>)Примеры платформы
Список.Колонки.Добавить("Код");
ЭлементыФормы.Список.Колонки.Вставить(1,"Код").Значение = "Код";Полное описание, параметры и ограничения
КолонкиСписка.Добавить (ListColumns.Add)
КолонкиСписка (ListColumns)
Добавить (Add)
Доступен, начиная с версии 8.0.
Синтаксис:
Добавить(<Колонка>, <Автоудаление>)
Параметры:
<Колонка> (обязательный)
Тип: Строка.
Имя колонки списка. Зависит от прикладного объекта.
<Автоудаление> (необязательный)
Тип: Булево.
Разрешает удалять колонку, если данная колонка была удалена табличным полем.
Значение по умолчанию: Ложь.
Возвращаемое значение:
Тип: КолонкаСписка.
Описание:
Добавляет колонку в список.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Пример:
// Добавим в список справочника, с которым связано табличное поле,
// колонку с кодом элемента:
Список.Колонки.Добавить("Код");
// Для показа кода в табличном поле, вставим в него
// колонку с индексом 1, отображающую колонку "Код" из
// списка справочника:
ЭлементыФормы.Список.Колонки.Вставить(1,"Код").Значение = "Код";
Использование в версии:
Доступен, начиная с версии 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.
Подготовка
В собственной Windows VM вручную подготовьте НОВУЮ пустую файловую ИБ C:\1c-labs\OwnList85_8d18bc25-d53c-45eb-a8f8-4b14b9c6c682\IB, CF Уч85ПрофилиСписка, Основной режим запуска Обычное приложение. Платформа8.5.1.1343, толстый клиент. Не используйте УТ/КА/УНФ/БП/рабочие базы/старую CF предыдущего урока. Здесь ничего не создаётся и не запускается.
Ровно один собственный пользователь Уч85Список_8d18bc25. В новой CF создайте роль Уч85Стенд с Администрирование для native чтения массива пользователей, чтением/добавлением/изменением своего Уч85Профиль; назначьте её только этому собственному пользователю. Не выдавайте права в рабочих ИБ. COMMON сверяет настоящий native current user и Users[0] при Count1, включая typed UUID; никаких UUID placeholders/ручной подстановки нет.
Метка8d18bc25-d53c-45eb-a8f8-4b14b9c6c682 — не native UUID ИБ. Сценарий получает новый native UUID при запуске, пользователь — реальный UUID текущей авторизации. UUID самой ИБ не измеряется. Guard адреса требует exact File строки; если она иная, остановитесь и проверьте фактический адрес, не ослабляйте сравнение подстрокой.
В CF только один документ Уч85Профиль, проведение Запретить, автонумерация строкового номера. Реквизиты Метка85/Пользователь85/Сценарий85 Строка36, Количество Число3,0, Сумма Число15,2, Описание85 Строка100. Дата стандартная включает время. Модуль объекта оставьте пустым: нет собственных обработчиков, движений и реальных регистров. Не добавляйте другие документы/справочники/регистры/задания/обмены/расширения/разделители.
В Общих модулях создайте Уч85СписокСтенд: КлиентОбычноеПриложение=True, Сервер=False, Глобальный=False, Привилегированный=False, повторное использование Не использовать. Вставьте целиком COMMON. Native UserManager доступен здесь именно в толстом клиенте; не переносите его вызовы в тонкий клиент. Код читает только known собственный стенд и проверяет реальные saved ссылки/UUID/данные.
В Документ.Уч85Профиль → Формы мастером создайте ОБЫЧНУЮ ФормаСписка; назначьте основной формой списка. Основной реквизит Список имеет тип ДокументСписок.Уч85Профиль. Это реальный metadata source native расширения формы списка документов, не общая форма с переименованной переменной и не managed ДинамическийСписок.
В ordinary ФормаСписка подготовьте один ТабличноеПоле с именем Список и Данные=Список, ТолькоПросмотр=True. Перед сохранением metadata удалите ВСЕ его GUI-колонки в Конфигураторе: первоначальный GUI Count0 — явная подготовка этого известного собственного layout. Список-source и таблица имеют одинаковое имя, но код проверяет native metadata type плюс actual value identity/data-binding/control identity, а не только имена.
Форму списка сделайте только для просмотра: не добавляйте команды создания/редактирования/удаления/проведения/пометки удаления и автонаполняемые командные панели. Свои saved данные изменяет только явная команда контроллера до открытия списка. Readonly-control не абсолютная защита от произвольного административного кода; одна собственная сессия и известная CF обязательны.
В модуль этой ФормаСписка вставьте LIST_FORM. Назначьте форме native ПередОткрытием(Отказ,СтандартнаяОбработка)2. Для ТабличноеПоле.Список событие ПриАктивизацииСтроки назначьте СписокПриАктивизацииСтроки(Элемент): base native event имеет0 параметров, ordinary extension добавляет первый Элемент, поэтому handler1. Не вызывайте этот обработчик вручную. ПодготовитьСвойПоказ85 — собственная обычная Export процедура инициализации, не native событие.
Создайте обычную общую форму Уч85ПрофилиСписка, без основного прикладного реквизита, с реквизитами СогласиеНаСвоиТриЗаписи85 Булево и Статус85 Строка1000. Флажок согласия доступен, поле Статус85 только для просмотра. Вставьте MAIN/CONTROLLER целиком. Он хранит actual свежий child-instance из manager.GetListForm, не ищет чужие формы и не конструирует абстрактные КолонкиСписка.
В этой общей форме создайте4 обычные кнопки: СоздатьСвоиТри85, ПоказатьСемантикуУдаления85, ПерестроитьСвойМакет85, ПроверитьИтог85. Native Нажатие у Кнопка имеет0 параметров; ordinary extension добавляет первый Элемент, значит свяжите их Нажатие с одноимённой процедурой(Элемент). Это не managed command handler и не ручной callback.
В Модуль обычного приложения вставьте APPLICATION с native ПриНачалеРаботыСистемы0. Оно проверяет пустоту и открывает именно свою общую форму через native ПолучитьОбщуюФорму. CF и формы сохраните/проверьте/запустите сами; actual compile/UI здесь0.
Убедитесь вручную: пустая таблица документов, одна сессия, один actual пользователь, нужная роль, точный File адрес, только свой документ/CF, GUI metadata initially0. Первое действие создаст ровно3 собственных записи с явным согласием. Частичная запись оставляет unknown flag и сохранённые свои данные для проверки человеком; автоматических очисток/повторов/отмены транзакции/backup нет.
GUI КолонкаТабличногоПоля.Данные — StringRW, имя source column. Source КолонкаСписка.Имя readonly. Не копируйте legacy пример с GUI.Значение на объект колонки: актуальная native TableBoxColumn использует Данные. Поле ТабличноеПоле.Данные связывает переменную основного реквизита через ordinary control-extension, .Значение возвращает actual native список; этот field никогда не используется владельцем окна.
Явный свой source whitelist8: Ссылка,Дата,Номер,Количество,Сумма,Метка85,Пользователь85,Сценарий85. GUI4: Дата,Номер,Количество,Сумма. Ссылку и UUID держим в source для проверки delivered currentdata, но не показываем пользователю как редактируемые поля. Список.Колонки readonly factory→collection; нельзя присвоить новый абстрактный объект списку.
Настройка времени own list — именно НастройкаПериода, не СтандартныйПериод из managed/СКД. Его native ctor0 даёт обе границы БезОграничения; код проверяет фактические пустые GetDateFrom/GetDateTo и назначает field.СтандартныйПериод ДО Открыть. Это гарантируемое raw contract ожидание, actual список ещё не запускался; не оставляйте default текущий месяц, скрывающий январские учебные документы.
Native ПараметрТекущаяСтрока получает свою сохранённую ссылку3/300 до открытия. Raw позиционирование происходит только при open/reopen, не при любом последующем присваивании. После открытия сами щёлкните все свои2,3,5; SQL-count3 не считается доказательством того, что GUI их отобразил или native event доставил.
В текущие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 Отбор.
AutoDeleteFalse означает: удаление видимой GUI-колонки сохраняет её source-column. AutoDeleteTrue на том же actual source-column означает: native удаление собственной связанной GUI-колонки удаляет source-column тоже. Это не удаление реквизита metadata или записей документа. Source.Columns.Удалить принимает String name; GUI.Columns.Удалить принимает index либо actualGUIColumn, не наоборот.
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; ноль — явное проверенное промежуточное собственное состояние, не произвольная пустота.
Данные native текущей строки не кэшируйте между профилями. LIST_FORM берёт свежие .ТекущаяСтрока/.ТекущиеДанные в настоящем событии; MAIN сравнивает actual form/control/data identities, concrete types, ownDocRef/UUID/values с отдельным DB-readback. Во время layout перехода событие не засчитывается; после каждого профиля нужны три реальных ручных выбора заново.
Статические 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ПрофилиСписка");
Форма.Открыть();
КонецПроцедурыРазбор по шагам
В новой собственной пустой ИБ запустите свой толстый ordinary клиент. Launcher появился только после exact File/CF/единственный current+UsersUUID/pustota guards. Отметьте СогласиеНаСвоиТриЗаписи85, затем СоздатьСвоиТри85 один раз.
MAIN перед каждым native document.Write сверяет собственные ранее сохранённые0/1/2 записи и ссылки; native СоздатьДокумент создаёт именно свой непроводимый объект. После каждого write новая фактическая ссылка добавляется только при ЭтоНовый=False/nonempty и независимом saved readback. После третьего — real count3, Qty10/Sum1000. При partial ошибка прекращает урок без автоудаления.
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.
До Open назначены native НастройкаПериода без ограничений и ПараметрТекущаяСтрока=своя сохранённая3/300. Native BeforeOpen2 support подтвердит реальный main DocList и independent own rows. Ожидаемое первоначальное выделение3/300 проверьте вручную; это не выполненный здесь результат.
В списке вручную выберите2/200,3/300,5/500. Настоящий rowevent handler1 берёт delivered currentdata; MAIN не вычисляет эти значения вместо UI, а сравнивает их с независимыми saved rows/refs/date/number/UUID. Пока все3 different actual refs не доставлены, следующая команда запрещена.
В 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 всё время прежний.
После профиля опять щёлкните2/3/5, реально повторно доставьте currentdata. Исчезновение source Description проверяется FindUndefined/Count8; не считайте изменение одного SQL count доказательством GUI association.
ПерестроитьСвойМакет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.
После rebuild снова реально выберите2/3/5 и нажмите ПроверитьИтог85. Expected source8/GUI4, три настоящие события собственных ссылок и прежний независимый DB3/10/1000. Задача не меняла saved документы после первоначальных3 writes, не печатала/экспортировала/удаляла данные.
Зафиксируйте ручной протокол либо точный отказ; сохранённые собственные3 записи оставьте для человека. Следующий запуск в непустой ИБ намеренно откажет, не создаст дубликаты и не выполнит cleanup. Actual protocol здесь ещё отсутствует: только static source.
Как проверить результат
Статически: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 неизменны.
Вручную: wrong path/config/user/usersUUID/count/preexisting data/source/control/layout/deliveredref/UUID →отказ до очередной допустимой own операции, никакого foreign write/перезапуска/очистки. Admin/read-only поля не объявляются абсолютной security.
Вручную: real DB3 records own typed refs, marker/realUserUUID/freshScenarioUUID, dates0:00, qty2+3+5=10, amount200+300+500=1000 до и после каждого layout. Unknown partial не превращается в ожидаемые данные.
Вручную: source8/GUI4 действительно разные collections; AutoDeleteFalse GUIdelete keeps source9, True deletes sourceDescription→8; sourceDelete("Описание85")String не GUIobject/index. Column.Name readonly, actual column.Data binding подтверждён.
Вручную: native callback1 реально доставляет concrete currentDataList values иactualDocRef всех3ownrows; сравнениеQuery не выдаётся за факт отображения. InitialCurrentRow только приopen/reopen, period actualownНастройкаПериодаNoBounds.
Вручную: clear only fullyowned layout, snapshot/whitelist/flags до изменений; GUI0/source8→source0→source8/GUI4 при прежнемDB3/10/1000. Native callbacks вручную не запускаются; после каждого профиля требуется свежая реальная delivery всех3 строк.
Публикационные 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.
На что обратить внимание
ДокументСписок.<Имя> — ordinary native список, не managed ДинамическийСписок. Native manager.GetListForm3 — реальный источник формы; type/name совпадение переменных без factory/metadata/value identity доказательством не считается.
Source.Columns readonly property даёт изменяемую collection; Column.Name readonly. GUI.Column.Данные связывает source-column, а не native GUI.Значение из legacy примера.
Source.Set(String CSV) replaces whole source columns; GUI layout автоматически не создаётся. Source.Delete(StringName) отличается от GUI.Delete(IndexOrActualColumn).
AutoDeleteFalse/True относится к source-column при удалении соответствующей GUI-column, не к удалению metadata/документов. Не присваивайте ожидаемый Count вместо фактического native readback.
ПараметрТекущаяСтрока делает positioning приopen/reopen; currentdata читается после реальной активации, не сразу из обещанного parameter assignment. Rowevent base0+ordinaryfirstElement1; manual callback запрещён.
Native ТекущиеДанные readonly и зависят от SOURCE columns. Не путайте скрытое source поле с видимой GUI колонкой и не кэшируйте старую selection между source changes.
Native поле.СтандартныйПериод ordinary принимает НастройкаПериода, НЕ одноимённый managed СтандартныйПериод. Fresh ctor0 даётNoBounds; GetDateFrom/GetDateTo actualemptydate, startup historical rows не спрятаны текущим месяцем.
Отбор.Add/Delete/GetAvailableFields rawnative запрещены для DocumentList.Filter. Не применяйте standalone API к похожему owner ради покрытия; в уроке этих calls нет.
Whole Clear только whollyowned freshinstance сownknownstate. Порядок GUI.Clear before source.Clear и exact0 before planned restore нужен; arbitrary чужой source/reset/автоматический rollback после partial недопустим.
Три real native writes выполняет только вручную запущенный authored сценарий с согласия в новой собственной ИБ. После partial/exception unknown flag и реальные saved данные остаются для проверки, без retries/delete/backups.
Native CurrentUser UUID — UUID пользователя, не базы/маркер пути. СписокUsers1 и matching currentUUID устраняют placeholders, но дают administrative read contract только собственному подготовленному толстому клиенту.
Readonly control и guards не защита от произвольного административного кода/других сессий/unknown CF. Только собственная known пустая CF/oneuser/onesession без регистров/расширений/jobs.
СуммаQuery1000 не доказывает GUI отображение илиcallbackdelivery. Delivered data сравниваются отдельно с native actual table/currentrow identity иindependent saved data; без3 разных реальных событий следующая фаза не запускается.
Python synthetic tests/native static checks не BSLcompiler/работающая1C. Field-value identity/AutoDelete/repaint/currentdata delivery/period и GUIzero transitions нужно подтвердить вручную; в этой работе runtime0.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.