СтрокаГруппировкиДинамическогоСписка

Типы · DynamicListGroupRow

Описывает строку группировки динамического списка.

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

СтрокаГруппировкиДинамическогоСписка (DynamicListGroupRow)

СтрокаГруппировкиДинамическогоСписка (DynamicListGroupRow)

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

Свойства:
ИмяГруппировки (GroupName)
Ключ (Key)
РодительскаяГруппировка (ParentGrouping)

Описание:

Описывает строку группировки динамического списка.

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.

См. также:
СтрокаГруппировкиДинамическогоСписка, свойство РодительскаяГруппировка

Использование в версии:

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

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

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

Свой список складов и карта: реальные строки, оформление, группировки и два профиля формы

В собственной пустой CF literal списокA/B/C и memory карта содержат2/3/5 наборов. Native server callback проверяет реальные строки/ячеечное оформление; команда отличает group row от склада, проверяетB3 и строит собственную карту с подсветкой без записей в базу.

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

1С8.5.1.1343 Windows, thin managed Такси; MAIN полностью в собственной ОбщаяФорма.КартаСкладов85. Event633 server без контекста exact3 без Элемент; map factories/server layout только server, client RowData/GroupRow только из собственной таблицы. Actual runtime0.

Подготовка

  1. Только собственная Windows VM/учебная среда. Вручную создайте новую пустую файловую ИБ C:\1c-labs\OwnWarehouseMap85_a4536051-2ab1-43da-827a-fd3e7f77bd76\IB, CF УчебнаяКартаСкладов85; платформа8.5.1.1343, управляемое приложение, тонкий клиент, интерфейс Такси, совместимость НеИспользовать. Это инструкция, здесь actual1С/CF/DB/UI/network/OS/fixtures/runtime0.

  2. UUID a4536051-2ab1-43da-827a-fd3e7f77bd76 — только собственная метка пути/данных, не UUID ИБ. Native File-строка должна точно совпасть с guard; никакой нормализации, Srvr/Ref или ослабления проверки. Не используйте текущие УТ/КА/УНФ/БП/скопированную рабочую CF.

  3. Единственная роль Карта85ПолныеПрава имеет Администрирование для native ПолучитьПользователей, использование двух своих commons и одной формы. Единственный пользователь ИБ Карта85Ученик с этой ролью: actual authenticated UUID сравнивается с единственным native user-array entry. Никаких лицензий/секретов/чужих пользователей код не читает.

  4. CF содержит ровно одну общую форму КартаСкладов85 и два общих модуля КартаСтенд85/КартаДанные85. Прикладных справочников, документов, регистров, отчетов, обработок, заданий, разделителей, внешних источников и расширений нет. Одна собственная сессия. Код не выполняет DBwrites и не создаёт эти metadata автоматически.

  5. Оба commons: Сервер=True; КлиентУправляемоеПриложение=False; КлиентОбычноеПриложение=False; ВызовСервера=False; Глобальный=False; Привилегированный=False; повторное использование НеИспользовать. В КартаСтенд85 вставьте полностью GUARD, в КартаДанные85 полностью MEMORY. Их вызывают только server form routines/native server callback.

  6. ОбщаяФорма.КартаСкладов85 — управляемая общая форма без основного прикладного реквизита. Реквизиты: Список85 ДинамическийСписок, Карта85 ГеографическаяСхема, ВыбранныйКод85 Строка1, Широкий85 Булево(False), Остановка85 Булево(False), Статус85 Строка1000. Дополнительные реквизиты СохраняемыеДанные=False, пользователь не редактирует code/flags/map; карта хранит native сериализуемый тип.

  7. Создайте группу Страницы85 вида Страницы; внутри страницы СписокСтраница85 и КартаСтраница85. На первой ТаблицаФормы Склады85, ПутьКДанным=Список85. Показывайте все6 собственных колонок Код85/Регион85/Количество85/Широта85/Долгота85/Метка85 с точными соответствующими путями данных. Количество85 обязательно видима. Таблица только для чтения, без стандартных создания/записи/удаления/копирования прикладных объектов.

  8. На второй странице ПолеФормы КартаПоле85: Вид=ПолеГеографическойСхемы, ПутьКДанным=Карта85. Это настоящая metadata factory managed geo extension, не конструктор расширения. Не привязывайте ordinary поле или другое scalar значение. Статус85 показывайте отдельным только-чтение полем.

  9. Группа Команды85 вида КоманднаяПанель находится вне страниц и содержит ровно две собственные команды Показать85 и ИзменитьПрофиль85. Действие команды → одноимённая процедура(Команда), кнопка → собственная команда. Group factory определяет CommandBar extension; страницы получают Pages extension своим видом. Никакого native callback вручную.

  10. Вставьте целиком FORM. Native ПриСозданииНаСервере(Отказ,СтандартнаяОбработка)2 назначьте в событии формы. Таблица Склады85 → ПриПолученииДанныхНаСервере → СкладыПриПолученииДанныхНаСервере85(ИмяЭлемента,Настройки,Строки)3. Это специальное event633: &НаСервереБезКонтекста, НЕТ generic первого Элемент. ПриАктивизацииСтроки359 не назначается: из него запрещены context server RPC и изменения вызывающих сервер свойств.

  11. Первый server OnCreate сам задаёт literal UNION ALL запрос3 строк без ИЗ/ссылок на таблицы БД, пустую ОсновнаяТаблица и native группировку по Регион85. Не создавайте ключи из порядкового номера/кода: actual key callback берется из KeyAndValue, а current row из настоящей таблицы. Пользовательские настройки автоматически не сохраняются; не подменяйте source/query.

  12. В модуль управляемого приложения вставьте полностью APPLICATION с native ПриНачалеРаботыСистемы0. Вручную обновите свою конфигурацию и запустите свой тонкий Windows-клиент Такси. Actual создание/запуск/кнопки здесь не выполнялись. Сервер guard проверяет реальное КлиентскоеПриложение.ТекущийВариантИнтерфейса(), полученное из global readonly ClientApplication11223, а не ручной параметр профиля.

  13. В callback коллекция Строки существует только до выхода из event633. Не сохраняйте её/строки/оформления в globals/requisites и не обращайтесь позже. Batch может содержать1..3 detail rows, не группировки; это не доказательство полной выборки или GUI-visible всех3. Оформляются только реально видимые native ячейки Количество85, scalar данные строк не изменяются.

  14. Исходник содержит полностью copyable literal query и native Map factory: свои A/North/2/55/37, B/North/3/55.1/37.2, C/South/5/55.2/37.4. Реальных складов/географии/продаж нет. NewSchema→Layers.Add(pointType)→Objects.Add→GeographicCoordinates, series.Count/GetValue читают native2/3/5, итог10. Карта не скачивает слой/файл и не печатается.

  15. Выберите видимую leaf строкуB, затем настоящую команду Показать85. Native client RowData3468 возвращает actual DataFormStruct либо отсутствие. Client копирует только6 scalar полей; server независимо сравнивает все типы и own значения до нового candidateMap. ПодсветкаB — наша color policy, НЕ native selectedGeoObject; native quantityB3 и общий итог10 проверяются до и после form assignment.

  16. При выборе группировки команда показывает bounded actual native ancestry: GroupName/opaque Key/Parent. Arbitrary Key не считается строкой склада/фильтром, имя не угадывается из поля группировки, Parent не объявляется всегда Undefined. Группировка не изменяет карту; выберите именно leaf. Отсутствие строки/неизвестный код/неверная метка/изменённые числа вызывают честный отказ.

  17. Две реальные server layout policies: поле шириной36/60 символов, высотой12/20 строк; максимумы48/80 символов с AutoMax=False, stretch False/True, output Запретить, своя рамка, Left/Right command alignment, Top/Left tabs. Native MaxHeight10729 тоже задаётся в символах — это не те же единицы, что Height8683. Max0 означал бы неограниченность, здесь явно положительные max. Readback props не доказывает renderer/pixels. Такси нужен BorderColor8712: в интерфейсе8.5 этот цвет не применяется; version8.5-only AppearanceMode14085 и mobile-only свойства намеренно исключены.

  18. Проверьте самостоятельно настоящий B3/итог10, source/profile readback и UI на обеих страницах. Проверки здесь статические, не компилятор1С и не render proof. При ошибке callback обработка прекращается исключением; form commands дополнительно sticky-stop client+server. Изменение UI может быть частичным, не atomic/rollback. Код не снимает stop, не выполняет retry/cleanup/backups. Отчёт об успешном runtime до ручного протокола запрещён.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    КартаСтенд85.ПроверитьСвойСтенд85();
    ПроверитьСвоиЭлементы85();
    Список85.ПроизвольныйЗапрос = Истина;
    Список85.ОсновнаяТаблица = "";
    Список85.ДинамическоеСчитываниеДанных = Ложь;
    Список85.АвтоматическоеСохранениеПользовательскихНастроек = Ложь;
    Список85.ТекстЗапроса = КартаДанные85.ТекстСвоиСклады85();
    Если Список85.Группировка.Элементы.Количество() <> 0 Тогда
        Отказ = Истина;
        ВызватьИсключение "Неожиданная исходная группировка своего нового списка.";
    КонецЕсли;
    Группа = Список85.Группировка.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
    Группа.Поле = Новый ПолеКомпоновкиДанных("Регион85");
    Группа.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
    Группа.Использование = Истина;
    Если Список85.ОсновнаяТаблица <> "" Или Не Список85.ПроизвольныйЗапрос
        Или Список85.ДинамическоеСчитываниеДанных Или Список85.АвтоматическоеСохранениеПользовательскихНастроек
        Или Список85.ТекстЗапроса <> КартаДанные85.ТекстСвоиСклады85()
        Или Список85.Группировка.Элементы.Количество() <> 1
        Или Строка(Группа.Поле) <> "Регион85" Или Не Группа.Использование Тогда
        Отказ = Истина;
        ВызватьИсключение "Actual list settings не совпали с собственной literal подготовкой.";
    КонецЕсли;
    ВыбранныйКод85 = "";
    Карта85 = КартаДанные85.СоздатьКарту85(ВыбранныйКод85);
    КартаДанные85.ПроверитьКарту85(Карта85, ВыбранныйКод85);
    ПрименитьПрофиль85(Ложь);
    Статус85 = "Три своих склада:2+3+5=10. Выберите leaf-строкуB и нажмите Показать85.";
КонецПроцедуры

&НаСервере
Процедура ПроверитьСвоиЭлементы85()
    КартаСтенд85.ПроверитьСвойСтенд85();
    ПолеКарты = Элементы.Найти("КартаПоле85");
    Панель = Элементы.Найти("Команды85");
    Страницы = Элементы.Найти("Страницы85");
    Таблица = Элементы.Найти("Склады85");
    Если ТипЗнч(ПолеКарты) <> Тип("ПолеФормы") Или ТипЗнч(Панель) <> Тип("ГруппаФормы")
        Или ТипЗнч(Страницы) <> Тип("ГруппаФормы") Или ТипЗнч(Таблица) <> Тип("ТаблицаФормы") Тогда
        ВызватьИсключение "Не совпали actual own form-control factories.";
    КонецЕсли;
    Если ПолеКарты.Имя <> "КартаПоле85" Или ПолеКарты.Вид <> ВидПоляФормы.ПолеГеографическойСхемы
        Или ПолеКарты.ПутьКДанным <> "Карта85" Или Панель.Имя <> "Команды85"
        Или Панель.Вид <> ВидГруппыФормы.КоманднаяПанель Или Страницы.Имя <> "Страницы85"
        Или Страницы.Вид <> ВидГруппыФормы.Страницы Или Таблица.Имя <> "Склады85"
        Или Таблица.ПутьКДанным <> "Список85" Тогда
        ВызватьИсключение "Изменён own control type/name/view/data path; чужие элементы не меняем.";
    КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Процедура СкладыПриПолученииДанныхНаСервере85(ИмяЭлемента, Настройки, Строки)
    КартаСтенд85.ПроверитьСвойСтенд85();
    Если ИмяЭлемента <> "Склады85" Или ТипЗнч(Настройки) <> Тип("НастройкиКомпоновкиДанных")
        Или ТипЗнч(Строки) <> Тип("СтрокиДинамическогоСписка") Тогда
        ВызватьИсключение "Не совпали actual native source event633 и типы его3 аргументов.";
    КонецЕсли;
    Если Строки.Количество() < 1 Или Строки.Количество() > 3 Тогда
        ВызватьИсключение "Недопустимое количество полученных собственных detail rows.";
    КонецЕсли;
    Увиденные = Новый Соответствие;
    Для Каждого Пара Из Строки Цикл
        СтрокаСписка = Строки.Получить(Пара.Ключ);
        Если ТипЗнч(СтрокаСписка) <> Тип("СтрокаДинамическогоСписка") Или СтрокаСписка <> Пара.Значение Тогда
            ВызватьИсключение "Actual native key→row source не совпал.";
        КонецЕсли;
        Данные = СтрокаСписка.Данные;
        Проверенные = КартаДанные85.ПроверитьСтроку85(Данные);
        Если Увиденные.Получить(Проверенные.Код85) <> Неопределено Тогда
            ВызватьИсключение "Повтор собственной detail строки в actual callback batch.";
        КонецЕсли;
        Увиденные.Вставить(Проверенные.Код85, Истина);
        Оформления = СтрокаСписка.Оформление;
        Если ТипЗнч(Оформления) <> Тип("ОформленияЯчеекДинамическогоСписка") Или Оформления.Количество() < 1 Тогда
            ВызватьИсключение "Нет actual visible cell appearances.";
        КонецЕсли;
        ЕстьКоличество = Ложь;
        Посчитано = 0;
        Для Каждого ПараОформления Из Оформления Цикл
            Посчитано = Посчитано + 1;
            Если ПараОформления.Ключ = "Количество85" Тогда
                ЕстьКоличество = Истина;
            КонецЕсли;
        КонецЦикла;
        Если Посчитано <> Оформления.Количество() Или Не ЕстьКоличество Тогда
            ВызватьИсключение "Количество85 должно быть настоящей видимой колонкой собственной таблицы.";
        КонецЕсли;
        Оформление = Оформления.Получить("Количество85");
        Если ТипЗнч(Оформление) <> Тип("ОформлениеЯчейкиДинамическогоСписка") Тогда
            ВызватьИсключение "Не получено actual native оформление количества.";
        КонецЕсли;
        ИмяПараметра = Новый ПараметрКомпоновкиДанных("ЦветФона");
        Доступный = Оформление.ДоступныеПараметры.НайтиПараметр(ИмяПараметра);
        Если Доступный = Неопределено Или Не Доступный.ТипЗначения.СодержитТип(Тип("Цвет")) Тогда
            ВызватьИсключение "Actual доступный параметр ЦветФона не поддерживает Цвет.";
        КонецЕсли;
        ЦветКоличество = ?(Проверенные.Количество85 >= 3, Новый Цвет(223, 241, 227), Новый Цвет(240, 245, 250));
        Оформление.УстановитьЗначениеПараметра(ИмяПараметра, ЦветКоличество);
        РеальныйПараметр = Оформления.Получить("Количество85").НайтиЗначениеПараметра(ИмяПараметра);
        Если РеальныйПараметр = Неопределено Или Не РеальныйПараметр.Использование
            Или РеальныйПараметр.Значение <> ЦветКоличество Тогда
            ВызватьИсключение "Fresh actual cell appearance readback не совпал.";
        КонецЕсли;
        КартаДанные85.ПроверитьСтроку85(Строки.Получить(Пара.Ключ).Данные);
    КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура Показать85(Команда)
    Если Остановка85 Или ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда <> Команды.Показать85 Тогда
        ВызватьИсключение "Нужна собственная команда незаблокированной формы.";
    КонецЕсли;
    Попытка
        Текущая = Элементы.Склады85.ТекущаяСтрока;
        Если ТипЗнч(Текущая) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда
            Путь = "";
            Глубина = 0;
            Группировка = Текущая;
            Пока Группировка <> Неопределено Цикл
                Если ТипЗнч(Группировка) <> Тип("СтрокаГруппировкиДинамическогоСписка") Или Глубина >= 4 Тогда
                    ВызватьИсключение "Неожиданная actual group ancestry; arbitrary key не интерпретируем как склад.";
                КонецЕсли;
                ИмяГруппы = Группировка.ИмяГруппировки;
                КлючГруппы = Группировка.Ключ;
                Если ТипЗнч(ИмяГруппы) <> Тип("Строка") Или ПустаяСтрока(ИмяГруппы) Или СтрДлина(ИмяГруппы) > 100 Тогда
                    ВызватьИсключение "Недопустимое actual native имя группировки.";
                КонецЕсли;
                Путь = Путь + ?(Глубина = 0, "", " ← ") + ИмяГруппы + ":" + Лев(Строка(КлючГруппы), 80);
                Глубина = Глубина + 1;
                Группировка = Группировка.РодительскаяГруппировка;
            КонецЦикла;
            Статус85 = "Выбрана группировка, не склад. Карта сохраняется. Actual path: " + Путь;
            Возврат;
        КонецЕсли;
        Если ТипЗнч(Текущая) <> Тип("Число") Тогда
            ВызватьИсключение "Выберите actual leaf строку своего списка, не отсутствующую или чужую ссылку.";
        КонецЕсли;
        Данные = Элементы.Склады85.ДанныеСтроки(Текущая);
        Если ТипЗнч(Данные) <> Тип("ДанныеФормыСтруктура") Тогда
            ВызватьИсключение "Native RowData вернул отсутствие строки, не fabricate данные.";
        КонецЕсли;
        Передача = Новый Структура;
        Для Каждого Имя Из СтрРазделить("Код85,Регион85,Количество85,Широта85,Долгота85,Метка85", ",") Цикл
            Значение = Неопределено;
            Если Не Данные.Свойство(Имя, Значение) Тогда
                ВызватьИсключение "Не получено собственное actual поле " + Имя;
            КонецЕсли;
            Передача.Вставить(Имя, Значение);
        КонецЦикла;
        ПоказатьНаСервере85(Новый ФиксированнаяСтруктура(Передача));
    Исключение
        Остановка85 = Истина;
        Статус85 = "СТОП: исход последней операции проверяет человек; повтор не разрешён.";
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаСервере
Процедура ПоказатьНаСервере85(Передача)
    Если Остановка85 Тогда
        ВызватьИсключение "Форма остановлена.";
    КонецЕсли;
    Попытка
        КартаСтенд85.ПроверитьСвойСтенд85();
        ПроверитьСвоиЭлементы85();
        КартаДанные85.ПроверитьКарту85(Карта85, ВыбранныйКод85);
        Проверенные = КартаДанные85.ПроверитьСтроку85(Передача);
        Кандидат = КартаДанные85.СоздатьКарту85(Проверенные.Код85);
        КартаДанные85.ПроверитьКарту85(Кандидат, Проверенные.Код85);
        Карта85 = Кандидат;
        ВыбранныйКод85 = Проверенные.Код85;
        КартаДанные85.ПроверитьКарту85(Карта85, ВыбранныйКод85);
        Статус85 = "Склад " + Проверенные.Код85 + ": " + Строка(Проверенные.Количество85) + "; полный native итог10. Подсветка — наша политика цвета, не native selection.";
    Исключение
        Остановка85 = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

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

&НаСервере
Процедура ПрименитьПрофиль85(Широкий)
    Если Остановка85 Или ТипЗнч(Широкий) <> Тип("Булево") Тогда
        ВызватьИсключение "Форма остановлена либо передан неизвестный профиль.";
    КонецЕсли;
    Попытка
        КартаСтенд85.ПроверитьСвойСтенд85();
        ПроверитьСвоиЭлементы85();
        КартаДанные85.ПроверитьКарту85(Карта85, ВыбранныйКод85);
        ПолеКарты = Элементы.КартаПоле85;
        ПолеКарты.АвтоМаксимальнаяВысота = Ложь;
        ПолеКарты.АвтоМаксимальнаяШирина = Ложь;
        ПолеКарты.Вывод = ИспользованиеВывода.Запретить;
        ПолеКарты.Высота = ?(Широкий, 20, 12);
        ПолеКарты.Ширина = ?(Широкий, 60, 36);
        ПолеКарты.МаксимальнаяВысота = ?(Широкий, 80, 48);
        ПолеКарты.МаксимальнаяШирина = ?(Широкий, 80, 48);
        ПолеКарты.РастягиватьПоВертикали = Широкий;
        ПолеКарты.РастягиватьПоГоризонтали = Широкий;
        ПолеКарты.ЦветРамки = ?(Широкий, Новый Цвет(90, 110, 130), Новый Цвет(150, 165, 180));
        Панель = Элементы.Команды85;
        Панель.ГоризонтальноеПоложение = ?(Широкий, ГоризонтальноеПоложениеЭлемента.Право, ГоризонтальноеПоложениеЭлемента.Лево);
        Страницы = Элементы.Страницы85;
        Страницы.ОтображениеСтраниц = ?(Широкий, ОтображениеСтраницФормы.ЗакладкиСлеваГоризонтально, ОтображениеСтраницФормы.ЗакладкиСверху);
        ПолеКарты = Элементы.КартаПоле85;
        Панель = Элементы.Команды85;
        Страницы = Элементы.Страницы85;
        ПроверитьСвоиЭлементы85();
        Если ПолеКарты.АвтоМаксимальнаяВысота Или ПолеКарты.АвтоМаксимальнаяШирина
            Или ПолеКарты.Вывод <> ИспользованиеВывода.Запретить
            Или ПолеКарты.Высота <> ?(Широкий, 20, 12) Или ПолеКарты.Ширина <> ?(Широкий, 60, 36)
            Или ПолеКарты.МаксимальнаяВысота <> ?(Широкий, 80, 48) Или ПолеКарты.МаксимальнаяШирина <> ?(Широкий, 80, 48)
            Или ПолеКарты.РастягиватьПоВертикали <> Широкий Или ПолеКарты.РастягиватьПоГоризонтали <> Широкий
            Или ПолеКарты.ЦветРамки <> ?(Широкий, Новый Цвет(90, 110, 130), Новый Цвет(150, 165, 180))
            Или Панель.ГоризонтальноеПоложение <> ?(Широкий, ГоризонтальноеПоложениеЭлемента.Право, ГоризонтальноеПоложениеЭлемента.Лево)
            Или Страницы.ОтображениеСтраниц <> ?(Широкий, ОтображениеСтраницФормы.ЗакладкиСлеваГоризонтально, ОтображениеСтраницФормы.ЗакладкиСверху) Тогда
            ВызватьИсключение "Fresh actual controls readback профиля не совпал.";
        КонецЕсли;
        КартаДанные85.ПроверитьКарту85(Карта85, ВыбранныйКод85);
        Широкий85 = Широкий;
    Исключение
        Остановка85 = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры
GUARD — полный серверный scope своей CF/пользователя/Такси

Своя CF → Общие → Общие модули → КартаСтенд85 → Модуль.

Неглобальный непривилегированный server-only ОбщийМодуль.КартаСтенд85, ВызовСервера=False; global native ClientApplication доступен Server, exact authenticated own user.

Процедура ПроверитьСвойСтенд85() Экспорт
    Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnWarehouseMap85_a4536051-2ab1-43da-827a-fd3e7f77bd76\IB"";" Тогда
        ВызватьИсключение "Нужна новая собственная файловая ИБ с точным именем и адресом.";
    КонецЕсли;
    Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или КлиентскоеПриложение.ТекущийВариантИнтерфейса() <> ВариантИнтерфейсаКлиентскогоПриложения.Такси Тогда
        ВызватьИсключение "Разрешена только платформа8.5.1.1343, отсутствие совместимости и Такси.";
    КонецЕсли;
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0
        Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
        Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0
        Или Метаданные.Отчеты.Количество() <> 0 Или Метаданные.Обработки.Количество() <> 0
        Или Метаданные.ОбщиеФормы.Количество() <> 1 Или Метаданные.ОбщиеФормы.Найти("КартаСкладов85") = Неопределено
        Или Метаданные.ОбщиеМодули.Количество() <> 2 Или Метаданные.ОбщиеМодули.Найти("КартаСтенд85") = Неопределено
        Или Метаданные.ОбщиеМодули.Найти("КартаДанные85") = Неопределено Тогда
        ВызватьИсключение "Нужна своя пустая CF с одной указанной формой и двумя своими модулями.";
    КонецЕсли;
    Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0 Тогда
        ВызватьИсключение "В собственном стенде расширений быть не должно.";
    КонецЕсли;
    Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Если Пользователь = Неопределено Или Пользователи.Количество() <> 1 Тогда
        ВызватьИсключение "Нужен один реальный собственный пользователь ИБ.";
    КонецЕсли;
    Если Пользователь.Имя <> "Карта85Ученик" Или Пользователи[0].Имя <> Пользователь.Имя
        Или Пользователи[0].УникальныйИдентификатор <> Пользователь.УникальныйИдентификатор Тогда
        ВызватьИсключение "Не совпал actual UUID единственного аутентифицированного пользователя.";
    КонецЕсли;
КонецПроцедуры
MEMORY — полный literal source, own scalar validator и native map factory/readback

Своя CF → Общие → Общие модули → КартаДанные85 → Модуль.

Неглобальный непривилегированный server-only ОбщийМодуль.КартаДанные85, ВызовСервера=False. Только память, реальные native GeoSchema/Layer/Points/Series; ни DBwrites, ни GeoSchema.Update thick-only.

Функция СвоиСклады85() Экспорт
    КартаСтенд85.ПроверитьСвойСтенд85();
    Склады = Новый ТаблицаЗначений;
    Склады.Колонки.Добавить("Код85", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(1)));
    Склады.Колонки.Добавить("Регион85", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(5)));
    Склады.Колонки.Добавить("Количество85", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(3, 0, ДопустимыйЗнак.Неотрицательный)));
    Склады.Колонки.Добавить("Широта85", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(6, 1)));
    Склады.Колонки.Добавить("Долгота85", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(6, 1)));
    Склады.Колонки.Добавить("Метка85", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(36)));
    Для Индекс = 0 По 2 Цикл
        Запись = Склады.Добавить();
        Запись.Код85 = ?(Индекс = 0, "A", ?(Индекс = 1, "B", "C"));
        Запись.Регион85 = ?(Индекс < 2, "North", "South");
        Запись.Количество85 = ?(Индекс = 0, 2, ?(Индекс = 1, 3, 5));
        Запись.Широта85 = 55 + Индекс / 10;
        Запись.Долгота85 = 37 + Индекс / 5;
        Запись.Метка85 = "a4536051-2ab1-43da-827a-fd3e7f77bd76";
    КонецЦикла;
    Возврат Склады;
КонецФункции

Функция ТекстСвоиСклады85() Экспорт
    КартаСтенд85.ПроверитьСвойСтенд85();
    Возврат "ВЫБРАТЬ ВЫРАЗИТЬ(""A"" КАК СТРОКА(1)) КАК Код85,
    | ВЫРАЗИТЬ(""North"" КАК СТРОКА(5)) КАК Регион85,
    | ВЫРАЗИТЬ(2 КАК ЧИСЛО(3,0)) КАК Количество85,
    | ВЫРАЗИТЬ(55 КАК ЧИСЛО(6,1)) КАК Широта85,
    | ВЫРАЗИТЬ(37 КАК ЧИСЛО(6,1)) КАК Долгота85,
    | ВЫРАЗИТЬ(""a4536051-2ab1-43da-827a-fd3e7f77bd76"" КАК СТРОКА(36)) КАК Метка85
    |ОБЪЕДИНИТЬ ВСЕ
    |ВЫБРАТЬ ВЫРАЗИТЬ(""B"" КАК СТРОКА(1)), ВЫРАЗИТЬ(""North"" КАК СТРОКА(5)),
    | ВЫРАЗИТЬ(3 КАК ЧИСЛО(3,0)), ВЫРАЗИТЬ(55.1 КАК ЧИСЛО(6,1)), ВЫРАЗИТЬ(37.2 КАК ЧИСЛО(6,1)),
    | ВЫРАЗИТЬ(""a4536051-2ab1-43da-827a-fd3e7f77bd76"" КАК СТРОКА(36))
    |ОБЪЕДИНИТЬ ВСЕ
    |ВЫБРАТЬ ВЫРАЗИТЬ(""C"" КАК СТРОКА(1)), ВЫРАЗИТЬ(""South"" КАК СТРОКА(5)),
    | ВЫРАЗИТЬ(5 КАК ЧИСЛО(3,0)), ВЫРАЗИТЬ(55.2 КАК ЧИСЛО(6,1)), ВЫРАЗИТЬ(37.4 КАК ЧИСЛО(6,1)),
    | ВЫРАЗИТЬ(""a4536051-2ab1-43da-827a-fd3e7f77bd76"" КАК СТРОКА(36))";
КонецФункции

Функция ПроверитьСтроку85(Данные) Экспорт
    КартаСтенд85.ПроверитьСвойСтенд85();
    Если ТипЗнч(Данные) <> Тип("ДанныеФормыСтруктура") И ТипЗнч(Данные) <> Тип("ФиксированнаяСтруктура") Тогда
        ВызватьИсключение "Ожидаются реальные данные своей leaf-строки либо её собственный scalar snapshot.";
    КонецЕсли;
    Склады = СвоиСклады85();
    Код = Неопределено;
    Если Не Данные.Свойство("Код85", Код) Или ТипЗнч(Код) <> Тип("Строка") Тогда
        ВызватьИсключение "В native данных отсутствует строковый свой код.";
    КонецЕсли;
    СвойСклад = Склады.Найти(Код, "Код85");
    Если СвойСклад = Неопределено Тогда
        ВызватьИсключение "Чужой код склада не принимается.";
    КонецЕсли;
    Для Каждого Колонка Из Склады.Колонки Цикл
        Значение = Неопределено;
        Если Не Данные.Свойство(Колонка.Имя, Значение)
            Или ТипЗнч(Значение) <> ТипЗнч(СвойСклад[Колонка.Имя])
            Или Значение <> СвойСклад[Колонка.Имя] Тогда
            ВызватьИсключение "Не совпало собственное typed значение " + Колонка.Имя;
        КонецЕсли;
    КонецЦикла;
    Возврат Новый ФиксированнаяСтруктура("Код85,Регион85,Количество85,Широта85,Долгота85,Метка85",
        СвойСклад.Код85, СвойСклад.Регион85, СвойСклад.Количество85, СвойСклад.Широта85, СвойСклад.Долгота85, СвойСклад.Метка85);
КонецФункции

Функция СоздатьКарту85(ВыбранныйКод) Экспорт
    КартаСтенд85.ПроверитьСвойСтенд85();
    Склады = СвоиСклады85();
    Если ТипЗнч(ВыбранныйКод) <> Тип("Строка")
        Или (ВыбранныйКод <> "" И Склады.Найти(ВыбранныйКод, "Код85") = Неопределено) Тогда
        ВызватьИсключение "Нельзя подсветить неизвестный склад.";
    КонецЕсли;
    Схема = Новый ГеографическаяСхема;
    Схема.Проекция = ТипПроекцииГеографическойСхемы.ЦилиндрическаяРавноудаленнаяПроекция;
    Слой = Схема.Слои.Добавить("СвоиСклады85", Тип("ТочечныйОбъектГеографическойСхемы"));
    Слой.Текст = "Три вымышленных склада";
    Слой.Видимость = Истина;
    Слой.РазрешитьВыбор = Ложь;
    Серия = Слой.Серии.Добавить("Количество85");
    Серия.Текст = "Количество учебных наборов";
    Серия.ТипОтображения = ТипОтображенияСерииСлояГеографическойСхемы.Текст;
    Серия.Формат = "ЧДЦ=0;ЧГ=0";
    Для Каждого Склад Из Склады Цикл
        Точка = Слой.Объекты.Добавить();
        Точка.Значение = Склад.Код85;
        Точка.Координаты = Новый ГеографическиеКоординаты(Склад.Широта85, Склад.Долгота85, 0);
        Точка.Видимость = Истина;
        Точка.ТипОтрисовки = ТипОтображенияТочечногоОбъектаГеографическойСхемы.Маркер;
        Точка.Маркер = ТипМаркераГеографическойСхемы.БольшойКруг;
        Точка.Цвет = ?(Склад.Код85 = ВыбранныйКод, Новый Цвет(220, 105, 20), Новый Цвет(35, 110, 180));
        Точка.ОтображатьДанные = Истина;
        Слой.УстановитьЗначение(Точка, Серия, Склад.Количество85);
    КонецЦикла;
    ПроверитьКарту85(Схема, ВыбранныйКод);
    Возврат Схема;
КонецФункции

Процедура ПроверитьКарту85(Схема, ВыбранныйКод) Экспорт
    КартаСтенд85.ПроверитьСвойСтенд85();
    Склады = СвоиСклады85();
    Если ТипЗнч(Схема) <> Тип("ГеографическаяСхема")
        Или Схема.Проекция <> ТипПроекцииГеографическойСхемы.ЦилиндрическаяРавноудаленнаяПроекция
        Или Схема.Слои.Количество() <> 1 Тогда
        ВызватьИсключение "Не совпала своя actual географическая схема.";
    КонецЕсли;
    Слой = Схема.Слои.Получить(0);
    Если Слой.Имя <> "СвоиСклады85" Или Слой.ТипОбъектов <> Тип("ТочечныйОбъектГеографическойСхемы")
        Или Слой.Объекты.Количество() <> 3 Или Слой.Серии.Количество() <> 1
        Или Не Слой.Видимость Или Слой.РазрешитьВыбор Тогда
        ВызватьИсключение "Изменён состав или режим своего слоя.";
    КонецЕсли;
    Серия = Слой.Серии.Получить(0);
    Если Серия.Имя <> "Количество85" Или Серия.ТипОтображения <> ТипОтображенияСерииСлояГеографическойСхемы.Текст
        Или Серия.Формат <> "ЧДЦ=0;ЧГ=0" Тогда
        ВызватьИсключение "Изменена собственная actual серия.";
    КонецЕсли;
    Всего = 0;
    Для Индекс = 0 По 2 Цикл
        Точка = Слой.Объекты.Получить(Индекс);
        Склад = Склады.Получить(Индекс);
        Если ТипЗнч(Точка) <> Тип("ТочечныйОбъектГеографическойСхемы")
            Или Точка.Слой <> Слой Или Точка.Значение <> Склад.Код85
            Или Точка.Координаты.Широта <> Склад.Широта85 Или Точка.Координаты.Долгота <> Склад.Долгота85
            Или Точка.Координаты.Высота <> 0 Или Не Точка.Видимость Или Не Точка.ОтображатьДанные
            Или Точка.ТипОтрисовки <> ТипОтображенияТочечногоОбъектаГеографическойСхемы.Маркер
            Или Точка.Маркер <> ТипМаркераГеографическойСхемы.БольшойКруг
            Или Точка.Цвет <> ?(Склад.Код85 = ВыбранныйКод, Новый Цвет(220, 105, 20), Новый Цвет(35, 110, 180)) Тогда
            ВызватьИсключение "Изменены actual данные/координаты/подсветка своей точки.";
        КонецЕсли;
        ЧислоСерии = Слой.ПолучитьЗначение(Точка, Серия);
        Если ТипЗнч(ЧислоСерии) <> Тип("ЗначениеСерииСлояГеографическойСхемы")
            Или ЧислоСерии.Объект <> Точка Или ЧислоСерии.Серия <> Серия
            Или ТипЗнч(ЧислоСерии.Значение) <> Тип("Число") Или ЧислоСерии.Значение <> Склад.Количество85 Тогда
            ВызватьИсключение "Native value readback своей серии не совпал.";
        КонецЕсли;
        Всего = Всего + ЧислоСерии.Значение;
    КонецЦикла;
    Если Всего <> 10 Тогда
        ВызватьИсключение "Сумма реально прочитанных native значений не равна10.";
    КонецЕсли;
КонецПроцедуры
APPLICATION — полный штатный старт собственной managed формы

Своя CF → Открыть модуль управляемого приложения → весь APPLICATION.

Модуль управляемого приложения, thin client, native ПриНачалеРаботыСистемы0; не ручной callback.

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

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

  1. Вручную подготовьте собственную CF/форму/два модуля по полным metadata выше. После будущего штатного OnCreate actual список группируется по региону и собственная native карта получает3 точки/серия2,3,5→10.

  2. При реальном получении строк платформа сама вызовет event633. Actual keys→native Rows.Get→typed scalar whitelist; native visible appearances.Count/Get→available ЦветФона→SetParameter и fresh native readback. Поддерживается частичный batch, source numbers неизменны.

  3. Выберите строку группировки и нажмите Показать85: native GroupName/opaqueKey/Parent дают диагностический путь, но не выдуманный код склада. Карта не меняется. Выберите leafB и нажмите ту же реальную команду.

  4. Client RowData actual own row→6scalar snapshot→server own typed comparison; новый native кандидат полностью проверяется, затем назначается форме и читается повторно. B подсвечен, его серия3, общий прочитанный native итог10.

  5. Нажмите ИзменитьПрофиль85: server применяет explicit own geometry/output/frame/alignment/tabs, повторно берет native controls для readback. Map3points/coordinates/series/highlight повторно проверяется. Повторная команда возвращает компактный профиль без изменения данных.

  6. При неправильном source/типе/коде/значении/форме/профиле прекращайте ручной тест. Client+server command catches сохраняют stop и повторно выбрасывают ошибку; нет автоматического rollback UI или DB writes. Сохраните свой ручной протокол отдельно.

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

  1. Статически: PRIMARY24 только реально использующиеся scope; whole4BSL/core/all5native и exact installed raw, callbacks/context/readonly/arity/factories/whitespace/case/masked aliases. Не BSL compiler/runtime proof.

  2. Вручную: actual callback keys не guessed indices; 1..3 detailrows, no saved native Rows references; Count/Get только visibleQty; fresh native parameter readback и unchanged typed scalar source.

  3. Вручную: native GroupRow не считается leaf; unknown opaque group key не фильтрует карту, реальный Parent chain ограничен4. Native RowData отсутствие не заменяется literal структурой.

  4. Вручную: native Map3points/полные координаты/flags/цвет/серия2,3,5→10, после B native value3 и неизменная сумма10; before/candidate/fresh-form readback. Not native geo selection/pixel proof.

  5. Вручную: оба профиля fresh native property values верны; Height строки, Width/MaxHeight/MaxWidth символы, output policy не права доступа/шифрование; actual source/map unchanged после layout.

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

Ожидаемый будущий ручной результат: три вымышленных склада2+3+5=10, реальные native cell appearance, group-vs-leaf различены, B подсвечен при native значении3/итоге10; два профиля формы без DBwrites. RuntimeVerified=False; actual1C/CF/GUI/DB/network/files/OS0, backups0.

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

  1. У native event633 нет generic первого Элемент. Rows/Data/Appearances допустимы только на сервере в этом callback и живут только во время него; частичный batch не выдаётся за все строки UI.

  2. RO containers Data/Appearance и коллекции не присваиваются; меняется native own child оформление, не standard source реквизиты и не базовые scalar значения.

  3. GroupRow.Key arbitrary, не гарантирован String/Structure/Array. Данный урок только показывает bounded actual diagnostic path, не строит по opaque ключу SQL/отбор/новый reference. Native parent Undefined не угадывается.

  4. Native RowData client-only и может вернуть Undefined. Не вызывайте из server common/OnActivateRow context RPC; команда читает actual текущую строку и server отдельно сверяет scalar whitelist.

  5. NewGeoSchema и layer.Add available server, но GeoSchema.Update4106 thick-only: сервер/тонкий клиент его не использует. Нет Show/PNG/print/OS artifacts. Перенос старого thick кода запрещён.

  6. Рамка managed geo BorderColor8712 не применяется в интерфейсеVersion8.5: только own actualTaxi guard. CommandBar.AppearanceMode14085 и mobile current-row/page-state/display-importance не добавлены ради coverage.

  7. Geometry props описывают политику размещения, не координаты карты и не измеренный renderer. MaxHeight chars vs Height rows прямо различены. Fresh parent controls/readback не утверждает одинаковый физический размер на любом DPI/шрифте.

  8. Native quantity series values не служат доказательством реального склада/продажи; это созданные в памяти own literals. Выделение цветом — политика приложения, не географическая native selection.

  9. UI assignment/layout может быть частичным. Catch+stop+rethrow не обещает atomicity, rollback или синхронизацию каждого свойства клиента при ошибке. Не повторяйте автоматически, не ослабляйте guard.

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

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

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

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

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