КолонкиСписка.Добавить

Методы · Add

Добавляет колонку в список.

Синтаксис

Добавить(<Колонка>, <Автоудаление>)

Примеры платформы

Список.Колонки.Добавить("Код");
ЭлементыФормы.Список.Колонки.Вставить(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.

Подготовка

  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.

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

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

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

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

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