ОбработкаРасшифровкиКомпоновкиДанных.На основании адреса данных расшифровки и источника доступных настроек

Конструкторы

Инициализирует обработку расшифровки адресом хранилища, из которого нужно получать данные расшифровки и источником доступных настроек.

Синтаксис

Новый ОбработкаРасшифровкиКомпоновкиДанных(<ДанныеРасшифровки>, <ИсточникДоступныхНастроек>)
Полное описание, параметры и ограничения

ОбработкаРасшифровкиКомпоновкиДанных.На основании адреса данных расшифровки и источника доступных настроек

ОбработкаРасшифровкиКомпоновкиДанных (DataCompositionDetailsProcess)

На основании адреса данных расшифровки и источника доступных настроек

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

Синтаксис:
Новый ОбработкаРасшифровкиКомпоновкиДанных(<ДанныеРасшифровки>, <ИсточникДоступныхНастроек>)
Параметры:

<ДанныеРасшифровки> (обязательный)
Тип: Строка.
Предоставляет исходные данные для обработки.

<ИсточникДоступныхНастроек> (обязательный)
Тип: ИсточникДоступныхНастроекКомпоновкиДанных.
Предоставляет источник доступных настроек.
Описание:

Инициализирует обработку расшифровки адресом хранилища, из которого нужно получать данные расшифровки и источником доступных настроек.

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

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

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

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

Создать свои данные расшифровки и открыть настоящее меню СКД на тонком клиенте

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

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

Полный модуль собственной управляемой общей формы: server fixture, клиентская команда меню, exported callback и очистка принадлежащего ей временного хранилища. В1С не запускался.

Подготовка

  1. НОВАЯ пустая отдельная конфигурация УчебноеМенюРасшифровки85 на8.5.1.1343, совместимость Не использовать, Русский, интерфейс Такси. Нет рабочих справочников, документов, регистров, общих реквизитов, расширений, подписок и заданий. Только свои формы/команда этого урока; модули вручную пустые до вставки приведённого кода.

  2. Конфигуратор → Общие формы → УчебнаяТаблицаТест85: реквизит МеткаСеанса Строка100, одиночное поле ввода МеткаСеанса с тем же путём и ТолькоПросмотр=Да; реквизит УчебныйДокумент типа ТабличныйДокумент, поле УчебнаяТаблица85 вида ПолеТабличногоДокумента с ПутьКДанным=УчебныйДокумент. Вставьте весь основной source-модуль этого урока; событие ПриСозданииНаСервере назначьте одноимённой процедуре.

  3. Общая команда ОткрытьУчебнуюТаблицу85: модуль ниже полностью открывает ОбщаяФорма.УчебнаяТаблицаТест85. Включите команду в интерфейс своей подсистемы УчебныеТесты85. Не создавайте похожую команду для рабочего отчёта. Будущая ручная подготовка: сохранить конфигурацию, обновить базу F7.

  4. Будущий ручной запуск ТОЛЬКО собственного стенда: первый отдельный тонкий клиент /TESTCLIENT -TPort15384, второй /TESTMANAGER. Собственный localhost-порт15384 заранее свободен и выделен только этому уроку; если выбран другой собственный порт, одинаково измените ручной ключ и конструктор. Здесь клиенты, порт и сетевое соединение не запускались.

  5. В своём /TESTCLIENT откройте ровно одну собственную форму общей командой. Скопируйте реально показанный МеткаСеанса UUID. В таблице обычным щелчком выберите только R2C1, ячейку Книга; не выделяйте диапазон или объединённый заголовок.

  6. Своя внешняя обработка УчебныйМенеджерТаблицы85 → новая управляемая Форма в /TESTMANAGER: реквизиты Согласие Булево, МеткаСеанса Строка100, Итог Строка1000. Видимые поля с этими путями, Итог ТолькоПросмотр=Да. Команда/кнопка ВыполнитьСвойТест, действие ВыполнитьСвойТест; ПриОткрытии назначьте одноимённой процедуре. Вставьте полный supporting-модуль УчебныйМенеджерТаблицы85, вставьте настоящую скопированную метку и подтвердите Согласие только своему тесту.

  7. В source-форме добавьте скрытые реквизиты СвояРасшифровка85 типа ИдентификаторРасшифровкиКомпоновкиДанных, АдресСвоейСхемы85 и АдресСвоихДанных85 Строка1000; не делайте для адресов полей ввода. Эти реквизиты заполняет только полный серверный fixture.

  8. Добавьте РезультатМеню85 Строка100 и ОткрытийМеню85 Число3.0 неотрицательное. Видимые одиночные поля с теми же именами/ПутьКДанным, ТолькоПросмотр=Да; у счётчика формат без дробной части и разделителей. Добавьте команду/кнопку ОткрытьСвоёМеню85, действие ОткрытьСвоёМеню85. Назначьте событие формы ПриЗакрытии одноимённой процедуре. Не назначайте кнопке generic ВыбратьИзСписка.

  9. Каждый опыт — новая своя source-форма с новым настоящим МеткаСеанса. Начальные результаты Не выбран и0 обязательны. Не нажимайте кнопку меню вручную до менеджера, не оставляйте другого открытого меню. После завершения закройте только свою source-форму: полный обработчик удаляет только два созданных ею значения временного хранилища.

  10. Сначала изучите и вставьте основной source-модуль формы, затем supporting-модуль общей команды открытия. Второй supporting-модуль — полный менеджер для автоматизированного опыта; не вставляйте его в source-форму. Для ручного изучения меню менеджер не обязателен: откройте свою форму, нажмите её ОткрытьСвоёМеню85 и выберите один из двух собственных пунктов; перед каждой попыткой нужна новая форма.

&НаКлиенте
Перем ОбработчикМеню85;

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ПроверитьСвойПустойСтенд();
    МеткаСеанса = Строка(Новый УникальныйИдентификатор);
    ЭтотОбъект.АвтоЗаголовок = Ложь;
    ЭтотОбъект.Заголовок = "Учебная таблица85 " + МеткаСеанса;
    Документ = Новый ТабличныйДокумент;
    Заголовок = Документ.Область(1, 1, 1, 2);
    Заголовок.Объединить();
    Заголовок.Текст = "Учебная таблица85";
    Документ.Область(2, 1).Текст = "Книга";
    Документ.Область(2, 2).Текст = "3";
    Документ.Область(3, 1).Текст = "Ручка";
    Документ.Область(3, 2).Текст = "1";
    Документ.Область(1, 1, 3, 2).ШиринаКолонки = 30;
    Документ.ТолькоПросмотр = Истина;
    Схема = Новый СхемаКомпоновкиДанных;
    Источник = Схема.ИсточникиДанных.Добавить();
    Источник.Имя = "СвояКнига85";
    Источник.ТипИсточникаДанных = "Local";
    Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    Набор.Имя = "СвояСтрока85";
    Набор.ИсточникДанных = Источник.Имя;
    Набор.АвтоЗаполнениеДоступныхПолей = Истина;
    Набор.Запрос = "ВЫБРАТЬ ""Книга"" КАК Наименование";
    Контроль = Новый Запрос(Набор.Запрос);
    Строки = Контроль.Выполнить().Выгрузить();
    Если Строки.Количество() <> 1 Или Строки[0].Наименование <> "Книга" Тогда
        ВызватьИсключение "Схема должна описывать собственную единственную книгу";
    КонецЕсли;
    Данные = Новый ДанныеРасшифровкиКомпоновкиДанных;
    ЗначенияПолей = Новый ЗначенияПолейРасшифровкиКомпоновкиДанных;
    ЗначениеПоля = ЗначенияПолей.Добавить();
    ЗначениеПоля.Поле = "Наименование";
    ЗначениеПоля.Значение = Строки[0].Наименование;
    Элемент = Данные.Элементы.Добавить(Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля"), Неопределено, ЗначенияПолей);
    СвояРасшифровка85 = Элемент.Идентификатор;
    Если ТипЗнч(СвояРасшифровка85) <> Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужен настоящий идентификатор добавленного элемента";
    КонецЕсли;
    Документ.Область(2, 1).Расшифровка = СвояРасшифровка85;
    ВладелецХранилища = Новый УникальныйИдентификатор(МеткаСеанса);
    АдресСвоейСхемы85 = ПоместитьВоВременноеХранилище(Схема, ВладелецХранилища);
    АдресСвоихДанных85 = ПоместитьВоВременноеХранилище(Данные, ВладелецХранилища);
    РезультатМеню85 = "Не выбран";
    ОткрытийМеню85 = 0;
    УчебныйДокумент = Документ;
    Элементы.УчебнаяТаблица85.Редактирование = Ложь;
    Элементы.УчебнаяТаблица85.Вывод = ИспользованиеВывода.Запретить;
    Элементы.УчебнаяТаблица85.РазрешитьНачалоПеретаскивания = Ложь;
    Элементы.УчебнаяТаблица85.РазрешитьПеретаскивание = Ложь;
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

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

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

&НаКлиенте
Процедура ПриЗакрытии()
    Если АдресСвоихДанных85 <> "" Тогда
        УдалитьИзВременногоХранилища(АдресСвоихДанных85);
        АдресСвоихДанных85 = "";
    КонецЕсли;
    Если АдресСвоейСхемы85 <> "" Тогда
        УдалитьИзВременногоХранилища(АдресСвоейСхемы85);
        АдресСвоейСхемы85 = "";
    КонецЕсли;
КонецПроцедуры
ОткрытьУчебнуюТаблицу85

Конфигуратор → Общие команды → ОткрытьУчебнуюТаблицу85 → Модуль

Полный модуль собственной общей команды с ОбработкаКоманды; не выполнялся.

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    ОткрытьФорму("ОбщаяФорма.УчебнаяТаблицаТест85");
КонецПроцедуры
УчебныйМенеджерТаблицы85

Своя внешняя обработка УчебныйМенеджерТаблицы85 → управляемая Форма → Модуль

Полный отдельный модуль формы менеджера тестирования собственного тонкого клиента и два полных supporting-модуля для создания/открытия своей таблицы. В1С не запускался.

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Согласие = Ложь;
    МеткаСеанса = "";
    Итог = "Сначала подготовьте свою таблицу и выберите только R2C1";
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвойСтенд()
    Если Не Согласие Тогда
        ВызватьИсключение "Разрешите только тест своей таблицы с выбором собственного меню, без редактирования, файлов и печати";
    КонецЕсли;
    UUIDМетки = Новый УникальныйИдентификатор(МеткаСеанса);
    Если Строка(UUIDМетки) <> МеткаСеанса Тогда
        ВызватьИсключение "Скопируйте фактическую метку своего открытого клиента тестирования";
    КонецЕсли;
КонецПроцедуры

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

&НаКлиенте
Процедура ПроверитьСвоюМатрицу(Поле)
    Если Поле.ПолучитьРазмерОбластиДанныхДокументаПоВертикали() <> 3
        Или Поле.ПолучитьРазмерОбластиДанныхДокументаПоГоризонтали() <> 2 Тогда
        ВызватьИсключение "Свой документ должен иметь последние данные в строке3 и колонке2";
    КонецЕсли;
    Если Поле.ПолучитьТекстОбласти("R1C1") <> "Учебная таблица85"
        Или Поле.ПолучитьТекстОбласти("R2C1") <> "Книга"
        Или Поле.ПолучитьТекстОбласти("R2C2") <> "3"
        Или Поле.ПолучитьТекстОбласти("R3C1") <> "Ручка"
        Или Поле.ПолучитьТекстОбласти("R3C2") <> "1" Тогда
        ВызватьИсключение "Все пять текстов собственной таблицы должны совпасть полностью";
    КонецЕсли;
    Объединение = Поле.ВходитВОбъединеннуюОбласть("R1C1");
    Если ТипЗнч(Объединение) <> Тип("Строка") Или Объединение <> "R1C1:R1C2" Тогда
        ВызватьИсключение "Заголовок должен входить именно в собственную объединённую область";
    КонецЕсли;
    Если Поле.ВходитВОбъединеннуюОбласть("R2C1") <> Неопределено Тогда
        ВызватьИсключение "Ячейка Книга не должна быть объединена";
    КонецЕсли;
    Если Поле.ТекущийРежимРедактирование() Тогда
        ВызватьИсключение "Не начинайте редактировать собственную таблицу этого урока";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьСвойТест(Команда)
    ПроверитьСвойСтенд();
    Приложение = Новый ТестируемоеПриложение("127.0.0.1", 15384);
    Поле = Неопределено;
    ИсходныйЛимит = Неопределено;
    СвояОбластьПодтверждена = Ложь;
    Ошибка = "";
    Итог = "Проверка ещё не завершена";
    Попытка
        Приложение.УстановитьСоединение();
        ИсходныйЛимит = Приложение.ПолучитьМаксимальноеВремяВыполненияДействия();
        Приложение.УстановитьМаксимальноеВремяВыполненияДействия(10);
        Поле = НайтиСвоюТаблицу(Приложение);
        ПроверитьСвоюМатрицу(Поле);
        Если Поле.ПолучитьАдресТекущейОбласти() <> "R2C1" Тогда
            ВызватьИсключение "До старта вручную выберите одну собственную ячейку Книга, R2C1";
        КонецЕсли;
        СвояОбластьПодтверждена = Истина;
        СвояФорма = Приложение.ПолучитьОбъект(Тип("ТестируемаяФорма"), "Учебная таблица85 " + МеткаСеанса, , 10);
        ОткрытьМеню = СвояФорма.ПолучитьОбъект(Тип("ТестируемаяКнопкаФормы"), , "ОткрытьСвоёМеню85", 10);
        РезультатМеню = СвояФорма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , "РезультатМеню85", 10);
        Счётчик = СвояФорма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , "ОткрытийМеню85", 10);
        Если РезультатМеню.ПолучитьПредставлениеДанных() <> "Не выбран"
            Или Счётчик.ПолучитьПредставлениеДанных() <> "0" Тогда
            ВызватьИсключение "Нужна новая собственная форма без прежнего выбора меню";
        КонецЕсли;
        ОткрытьМеню.Нажать();
        Поле.ВыполнитьВыборИзМенюРасшифровки("Своя книга85: подтвердить");
        Условие = Новый ОписаниеОповещения("СвойВыборМенюПодтверждён85", ЭтотОбъект, РезультатМеню);
        Если Не Приложение.ОжидатьСостояния(Условие, 5) Тогда
            ВызватьИсключение "Native callback не подтвердил именно свой дополнительный пункт";
        КонецЕсли;
        Если Счётчик.ПолучитьПредставлениеДанных() <> "1" Тогда
            ВызватьИсключение "Должно быть ровно одно открытие собственного меню";
        КонецЕсли;
        ПроверитьСвоюМатрицу(Поле);
    Исключение
        Ошибка = ОписаниеОшибки();
    КонецПопытки;
    Если СвояОбластьПодтверждена Тогда
        Попытка

            Поле.УстановитьТекущуюОбласть("R2C1");
            Если Поле.ПолучитьАдресТекущейОбласти() <> "R2C1" Тогда
                ВызватьИсключение "Не восстановлена подтверждённая исходная ячейка";
            КонецЕсли;
            ПроверитьСвоюМатрицу(Поле);
        Исключение
            Ошибка = Ошибка + " Восстановление собственной области: " + ОписаниеОшибки();
        КонецПопытки;
    КонецЕсли;
    Если ТипЗнч(ИсходныйЛимит) = Тип("Число") Тогда
        Попытка
            Приложение.УстановитьМаксимальноеВремяВыполненияДействия(ИсходныйЛимит);
        Исключение
            Ошибка = Ошибка + " Восстановление фактического лимита: " + ОписаниеОшибки();
        КонецПопытки;
    КонецЕсли;
    Попытка
        Приложение.РазорватьСоединение();
    Исключение
        Ошибка = Ошибка + " Разрыв собственного соединения: " + ОписаниеОшибки();
    КонецПопытки;
    Если Ошибка <> "" Тогда
        Итог = "Свой тест не завершён: " + Ошибка;
        ВызватьИсключение Итог;
    КонецЕсли;
    Итог = "Своё native-меню выбрано по полному заголовку, значение callback подтверждено; таблица, исходная область, лимит и соединение сохранены";
КонецПроцедуры

&НаКлиенте
Функция СвойВыборМенюПодтверждён85(ДополнительныеПараметры) Экспорт
    Возврат ДополнительныеПараметры.ПолучитьПредставлениеДанных() = "ПодтвержденаКнига85";
КонецФункции

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

  1. Схема описывает локальный константный запрос ВЫБРАТЬ "Книга" КАК Наименование. Полный fixture проверяет одну фактическую строку, затем создаёт ЗначенияПолейРасшифровкиКомпоновкиДанных. Поле у её элемента — именно Строка Наименование, не ПолеКомпоновкиДанных.

  2. Данные.Элементы.Добавить возвращает настоящий элемент полей; его readonly Идентификатор присваивается своей R2C1 и реквизиту формы. Это не вручную придуманный номер и не идентификатор чужого отчёта.

  3. Сервер сохраняет свои схему и данные во временном хранилище текущего source-сеанса. Отдельный новый UUID из МеткаСеанса — владелец сеансового хранения, НЕ настоящий UUID формы; поэтому автоматическое удаление при закрытии формы не обещается, полный ПриЗакрытии делает явную очистку своих адресов.

  4. На тонком клиенте конструкторы получают собственные адреса хранилища. Серверные коллекции расшифровки не создаются в модуле менеджера; адреса не передаются между /TESTCLIENT и /TESTMANAGER.

  5. Пустой массив Действия не разрешает стандартных действий. Два дополнительных пункта с разными значениями и заголовками переданы именно ПоказатьВыборДействия; ИспользоватьОсновноеДействие=Ложь. СписокЗначений служит источником native-меню, а не самостоятельным диалогом выбора.

  6. Менеджер нажимает собственную кнопку и только затем вызывает ВыполнитьВыборИзМенюРасшифровки по полному собственному заголовку. Не используется зависящий от состава меню индекс0. Callback имеет все три native-параметра и возвращает в readonly-поле ЗНАЧЕНИЕ выбранного дополнительного элемента.

  7. ОжидатьСостояния ограничен5секундами и требует именно ПодтвержденаКнига85. Старый результат запрещён исходной проверкой, число открытий должно стать1. Затем проверяется прежняя матрица, восстанавливаются собственная R2C1, фактический лимит и соединение.

  8. Два конструктора принимают СТРОКОВЫЕ адреса собственного source-сеанса: ИсточникДоступныхНастроекКомпоновкиДанных(АдресСвоейСхемы85) и ОбработкаРасшифровкиКомпоновкиДанных(АдресСвоихДанных85, ИсточникНастроек). Это отдельные overloads на основании URL/адреса, не конструкторы по серверным объектам и не HTTP URL.

  9. ОбработчикМеню85 — клиентская переменная полного модуля формы. Она удерживает настоящий объект ОбработкаРасшифровкиКомпоновкиДанных до завершения ПоказатьВыборДействия. Callback освобождает ссылку только после проверки собственной метки и обработки возвращённого дополнительного действия.

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

  1. Будущий результат: native-меню открыто ровно один раз, выбран собственный пункт Своя книга85: подтвердить, callback записал ПодтвержденаКнига85; все пять текстов таблицы прежние.

  2. Будущий отрицательный контроль: в менеджере замените выбираемый заголовок на точный второй Своя книга85: отказаться, откройте новую свою форму и скопируйте её новый UUID. Callback вернёт ОтказОтКниги85, проверка подтверждения должна завершиться ошибкой, а не принять любое непустое значение.

  3. Будущий контроль отсутствующего пункта: в менеджере измените заголовок на Несуществующий свой пункт85. Ошибка выбора не является успехом. Если своё меню осталось открытым, вручную нажмите Esc только в своей source-форме; затем закройте её для очистки собственных адресов и создайте новую для следующего опыта.

  4. runtimeVerifiedScenarios=0: ни menu UI, ни BSL, ни временное хранилище, ни локальное тестовое соединение здесь не запускались. Успех статических проверок не доказывает фактическое клиентское поведение меню.

  5. Будущий ручной опыт без менеджера: на новой своей форме подтвердить → РезультатМеню85=ПодтвержденаКнига85 и ОткрытийМеню85=1. На другой новой своей форме отказаться → ОтказОтКниги85 и1. Не изменяйте readonly-поля напрямую; результат должен записать только экспортный native callback. Закрытие каждой своей формы очищает только её собственные два адреса.

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

Полный source-модуль показывает собственное native-меню; callback различает подтверждение и отказ, адреса принадлежат своему сеансу и очищаются при закрытии своей формы

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

  1. runtimeVerifiedScenarios=0: BSL, UI, клиенты тестирования, соединения, файлы и печать здесь не запускались. Это полные исходники для будущего ручного опыта только на своём стенде.

  2. Нужен новый отдельный /TESTCLIENT только этого урока, не рабочая конфигурация и не общий тестовый клиент. Настоящий UUID копируется из своей формы; ни похожие имена, ни новый выдуманный UUID не заменяют подтверждение источника.

  3. У разных уроков одинаковые имена модулей/форм/процедур, но разные точные имена конфигураций. Каждый урок готовится отдельно; модули не склеивать.

  4. Меню должно уже быть открыто: один метод выбора сам его не создаёт. Если меню не открылось или пункт не найден, требуется ошибка теста; нельзя подставлять заранее готовое значение РезультатМеню85.

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

  6. Не разрешайте изменения адресов хранилища пользователем, не подставляйте произвольный адрес. Очистка касается только собственных двух значений, не файлов и не содержимого чужого сеанса. При аварийном завершении обработчик закрытия может не выполниться; UUID-владелец ограничивает оставшиеся данные концом source-сеанса.

  7. При ошибке выбора автоматическое нажатие Esc или закрытие произвольного окна не выполняется. Открытое своё меню может помешать cleanup проверки области; такие ошибки собираются в Итог, не маскируются. Ручное восстановление своего меню описано отдельно.

  8. Это пример дополнительного действия Подтвердить, не выполнение стандартного Расшифровать/Открыть/фильтра рабочего отчёта. Callback не вызывает рабочие документы, серверные записи или сеть.

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

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

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

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

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