Управлять отображением настоящих редакторов СКД и проверить фильтр1000→500→1000

Учебные задачи

Самостоятельный полный модуль своей обычной общей формы; настоящие native источники и полная проверка собственного счета.

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

Полный модуль ОбщаяФорма.РедакторСчета85, обычная форма толстого клиента.

Подготовка

  1. Вручную создайте НОВУЮ отдельную файловую ИБ по точному пути C:\1C85_OwnOrdinaryEditors\47a694a9-b495-4d06-9bcc-6d773cc319fd\Base. Это UUID-каталог учебного стенда, не идентификатор рабочей ИБ. Не используйте копию УТ/КА/УНФ/БП, клиент-серверную ИБ или рабочий сеанс. Здесь ничего не создавалось и 1С не запускалась.

  2. Конфигурация Уч85ОбычныеРедакторыСчета: основное приложение Обычное приложение, Режим совместимости Не использовать; платформа8.5.1.1343. Нет BSP, расширений, общих модулей, прикладных объектов и хранилищ. Создайте только одну роль УчебныйАдминистратор85: Администрирование для ПолучитьПользователей, использование своих общих форм и перечисления. Единственный пользователь с тем же именем получает эту роль; нет гостя/другого пользователя.

  3. Создайте Перечисление.ПозицияСчета85 и ровно3 значения В ЭТОМ ПОРЯДКЕ: Книга85 (синоним Книга), Бумага85 (синоним Бумага), Папка85 (синоним Папка). Форм перечисления нет. Это настоящие metadata enum-ссылки, не строки и не ранее существующие записи каталога.

  4. Создайте три Общие формы, вид Обычная: ОписаниеКолонки85, НастройкиПостроителя85, РедакторСчета85. Они не являются формами отчета и не используют поле/табличное поле в качестве владельца. Данные у всех показанных полей ввода и табличных полей оставьте пустыми: модуль задает настоящий native Значение, а не строку произвольного имени переменной.

  5. В выбранной форме добавьте реквизит Состояние85 Строка500 с полем только для просмотра. Все остальные источники существуют в переменных полного модуля и создаются заново ПриОткрытии. Источники не подгружаются из соседней карточки; общий модуль не нужен.

  6. Свяжите обычное событие формы ПриОткрытии с ПриОткрытии() без параметров. Для каждой названной обычной кнопки свяжите Нажатие с одноименной процедурой(Кнопка), ровно один native параметр. Не вызывайте эти события вручную и не передавайте Неопределено вместо кнопки.

  7. Вставьте полный основной модуль этой карточки в точную выбранную общую форму. Остальные две общие формы могут пока оставаться пустыми, если их уроки еще не установлены: они не вызываются и не предоставляют скрытых помощников. В модуле обычного приложения установите полный поддерживающий модуль этой карточки; он открывает только выбранную форму.

  8. Запускайте только собственную новую ИБ в ТОЛСТОМ клиенте с ОБЫЧНЫМ приложением. Сначала вручную проверьте строку соединения и имя пользователя. Guard обязан отказать при другом пути, версии, режиме совместимости, metadata составе или пользователе; guard не является обещанием защиты рабочего окружения от произвольного другого кода.

  9. Добавьте5 настоящих ТабличноеПоле: Структура85, Отбор85, Оформление85, ДоступныеПоля85, Результат85; кнопка СледующийЭтап85. Данные пусты. Структура85 получает ВЕСЬ объект НастройкиКомпоновкиДанных, НЕ его коллекцию Структура. Остальные редакторы получают ровно свои native коллекции от actual собственного компоновщика.

  10. Новая схема создается полностью в памяти: Local, один Object набор Счет85 с ИмяОбъекта Строки85, пять typed полей, одна детальная группировка и собственный enum-фильтр Книга85. Никакого DB query, параметрического редактора или неизвестной схемы нет.

  11. Политика ПриНедоступностиНастроек = ИзменятьДоступностьПоля изучается с настоящим ordinary корнем и current-data; конкретная визуальная деактивация не обещается без ручного UI теста. Именованные фильтр/оформление реально существуют, поэтому detailed flags имеют предмет отображения.

  12. FIELD5998 на ДоступныеПоля85 создает одно собственное ограничение Цена85.Доступность=False. Цена остается в исходных строках и выбранных полях результата; изменение доступных UI полей не подменяет СКД отбор.

Перем Начато85;
Перем СвоиСтроки85;
Перем СвояСхема85;
Перем СвойРедактор85;
Перем СвоиНастройки85;
Перем СвойОтбор85;
Перем СвоиДетали85;
Перем ИсходныйXML85;
Перем СхемаXML85;
Перем НастройкиXML85;
Перем ЭффективныеXML85;
Перем Этап85;
Перем НепроверенныйИсход85;

Процедура ПриОткрытии()
    ПроверитьСреду85();
    Если Начато85 <> Неопределено Тогда
        ВызватьИсключение "Нужен новый экземпляр собственной формы";
    КонецЕсли;
    Начато85 = Истина;
    СвоиСтроки85 = СтрокиСчета85(ЧисловойТип85());
    ПроверитьСтроки85(СвоиСтроки85, Ложь);
    ИсходныйXML85 = XML85(СвоиСтроки85);
    СвояСхема85 = Новый СхемаКомпоновкиДанных;
    Источник85 = СвояСхема85.ИсточникиДанных.Добавить();
    Источник85.Имя = "МояПамять85";
    Источник85.ТипИсточникаДанных = "Local";
    Набор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 = Детали85.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
    АвтоВыбор85.Использование = Истина;
    СвойРедактор85 = Новый КомпоновщикНастроекКомпоновкиДанных;
    ИсточникНастроек85 = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СвояСхема85);
    СвойРедактор85.Инициализировать(ИсточникНастроек85);
    СвойРедактор85.ЗагрузитьНастройки(СвояСхема85.НастройкиПоУмолчанию);
    СвоиНастройки85 = СвойРедактор85.Настройки;
    СвоиДетали85 = СвоиНастройки85.Структура.Получить(0);
    СвойОтбор85 = СвоиНастройки85.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    СвойОтбор85.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Код85");
    СвойОтбор85.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    СвойОтбор85.ПравоеЗначение = Перечисления.ПозицияСчета85.Книга85;
    СвойОтбор85.Представление = "Только собственная книга85";
    СвойОтбор85.Использование = Ложь;
    СвоеОформление85 = СвоиНастройки85.УсловноеОформление.Элементы.Добавить();
    СвоеОформление85.Представление = "Зеленая сумма85";
    СвоеОформление85.Использование = Истина;
    СвоеОформление85.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(220, 245, 220));
    Для Каждого Имя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("ДоступныеПоля85");
    ОграниченияПолей85 = ДоступныеПоля85.ОграниченияИспользования;
    Если ТипЗнч(ОграниченияПолей85) <> Тип("ОграниченияИспользованияДоступныхПолейКомпоновкиДанных") Или ОграниченияПолей85.Количество() <> 0 Тогда
        ВызватьИсключение "Нужна новая собственная коллекция ограничений именно ПОЛЕЙ";
    КонецЕсли;
    ОграничениеЦены85 = ОграниченияПолей85.Добавить();
    Если ТипЗнч(ОграничениеЦены85) <> Тип("ОграничениеИспользованияДоступногоПоляКомпоновкиДанных") Тогда
        ВызватьИсключение "Нативная фабрика должна вернуть ограничение поля";
    КонецЕсли;
    ОграничениеЦены85.Поле = Новый ПолеКомпоновкиДанных("Цена85");
    ОграничениеЦены85.Доступность = Ложь;
    Если ОграниченияПолей85.Количество() <> 1 Или Строка(ОграниченияПолей85.Получить(0).Поле) <> "Цена85"
        Или ОграниченияПолей85.Получить(0).Доступность Тогда
        ВызватьИсключение "Не сохранилось собственное ограничение редактора поля цены";
    КонецЕсли;
    Этап85 = 0;
    НепроверенныйИсход85 = Ложь;
    СхемаXML85 = XML85(СвояСхема85);
    НастройкиXML85 = XML85(СвоиНастройки85);
    ЭффективныеXML85 = XML85(СвойРедактор85.ПолучитьНастройки());
    ВывестиФактическийСчет85();
    Состояние85 = "1000. Выберите настоящий корень структуры и нажмите СледующийЭтап85. Цена скрыта только из списка доступных полей, не из исходных данных.";
КонецПроцедуры

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

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

Функция ОжидаемыеНастройки85(СтрокаXML85)
    Читатель85 = Новый ЧтениеXML;
    Читатель85.УстановитьСтроку(СтрокаXML85);
    Попытка
        Копия85 = СериализаторXDTO.ПрочитатьXML(Читатель85, Тип("НастройкиКомпоновкиДанных"));
    Исключение
        Читатель85.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Читатель85.Закрыть();
    Если ТипЗнч(Копия85) <> Тип("НастройкиКомпоновкиДанных") Или Копия85.Отбор.Элементы.Количество() <> 1 Тогда
        ВызватьИсключение "Не подтверждена настоящая XML копия своих настроек";
    КонецЕсли;
    КопияУсловия85 = Копия85.Отбор.Элементы.Получить(0);
    Если ТипЗнч(КопияУсловия85) <> Тип("ЭлементОтбораКомпоновкиДанных") Или КопияУсловия85.ПравоеЗначение <> Перечисления.ПозицияСчета85.Книга85 Тогда
        ВызватьИсключение "Копия должна содержать именно собственное условие enum";
    КонецЕсли;
    КопияУсловия85.Использование = Этап85 = 1;
    Возврат Копия85;
КонецФункции

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

Процедура ПроверитьСреду85()
    Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1C85_OwnOrdinaryEditors\47a694a9-b495-4d06-9bcc-6d773cc319fd\Base"";" Тогда
        ВызватьИсключение "Нужна собственная новая файловая учебная ИБ по точному пути";
    КонецЕсли;
    Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
        ВызватьИсключение "Не совпали версия, конфигурация или режим совместимости";
    КонецЕсли;
    Если Метаданные.ОбщиеФормы.Количество() <> 3 Или Метаданные.Перечисления.Количество() <> 1
        Или Метаданные.Роли.Количество() <> 1 Или Метаданные.Роли.Найти("УчебныйАдминистратор85") = Неопределено Тогда
        ВызватьИсключение "Нужны только три собственные общие формы, перечисление и учебная роль";
    КонецЕсли;
    Для Каждого ИмяФормы85 Из СтрРазделить("ОписаниеКолонки85,НастройкиПостроителя85,РедакторСчета85", ",") Цикл
        Если Метаданные.ОбщиеФормы.Найти(ИмяФормы85) = Неопределено Тогда
            ВызватьИсключение "Нет собственной общей формы";
        КонецЕсли;
    КонецЦикла;
    СвоеПеречисление85 = Метаданные.Перечисления.Найти("ПозицияСчета85");
    Если СвоеПеречисление85 = Неопределено Тогда
        ВызватьИсключение "Нет собственного перечисления";
    КонецЕсли;
    Имена85 = СтрРазделить("Книга85,Бумага85,Папка85", ",");
    Если СвоеПеречисление85.ЗначенияПеречисления.Количество() <> 3 Тогда
        ВызватьИсключение "Нужны ровно три собственных значения перечисления";
    КонецЕсли;
    Для Индекс85 = 0 По 2 Цикл
        Если СвоеПеречисление85.ЗначенияПеречисления.Получить(Индекс85).Имя <> Имена85[Индекс85] Тогда
            ВызватьИсключение "Изменился состав собственного перечисления";
        КонецЕсли;
    КонецЦикла;
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0
        Или Метаданные.Отчеты.Количество() <> 0 Или Метаданные.Обработки.Количество() <> 0
        Или Метаданные.ОбщиеМодули.Количество() <> 0 Или Метаданные.Константы.Количество() <> 0
        Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
        Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0
        Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0
        Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0
        Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0
        Или Метаданные.ХранилищаНастроек.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Прикладные объекты и хранилища в этом стенде запрещены";
    КонецЕсли;
    Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
        Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
        Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
        ВызватьИсключение "Расширения запрещены";
    КонецЕсли;
    Пользователь85 = ПользователиИнформационнойБазы.ТекущийПользователь();
    Пользователи85 = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Если Пользователь85 = Неопределено Или Пользователи85.Количество() <> 1 Тогда
        ВызватьИсключение "Нужен единственный реальный учебный пользователь";
    КонецЕсли;
    Если Пользователь85.Имя <> "УчебныйАдминистратор85"
        Или Пользователи85[0].УникальныйИдентификатор <> Пользователь85.УникальныйИдентификатор Тогда
        ВызватьИсключение "Не совпал собственный пользователь";
    КонецЕсли;
КонецПроцедуры

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

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

Функция СтрокиСчета85(ТипКоличества85)
    Строки85 = Новый ТаблицаЗначений;
    Строки85.Колонки.Добавить("Код85", Новый ОписаниеТипов("ПеречислениеСсылка.ПозицияСчета85"));
    Строки85.Колонки.Добавить("Название85", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(20)));
    Строки85.Колонки.Добавить("Количество85", ТипКоличества85);
    Денежный85 = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный));
    Строки85.Колонки.Добавить("Цена85", Денежный85);
    Строки85.Колонки.Добавить("Сумма85", Денежный85);
    Коды85 = Новый Массив;
    Коды85.Добавить(Перечисления.ПозицияСчета85.Книга85);
    Коды85.Добавить(Перечисления.ПозицияСчета85.Бумага85);
    Коды85.Добавить(Перечисления.ПозицияСчета85.Папка85);
    Для Индекс85 = 0 По 2 Цикл
        Строка85 = Строки85.Добавить();
        Строка85.Код85 = Коды85[Индекс85];
        Строка85.Название85 = Строка(Строка85.Код85);
        Строка85.Количество85 = Индекс85 + 2;
        Строка85.Цена85 = ?(Индекс85 = 0, 250, ?(Индекс85 = 1, 100, 50));
        Строка85.Сумма85 = Строка85.Количество85 * Строка85.Цена85;
    КонецЦикла;
    Возврат Строки85;
КонецФункции

Функция ЧисловойТип85()
    Возврат Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный));
КонецФункции

Функция XML85(Объект85)
    Писатель85 = Новый ЗаписьXML;
    Писатель85.УстановитьСтроку();
    СериализаторXDTO.ЗаписатьXML(Писатель85, Объект85);
    Возврат Писатель85.Закрыть();
КонецФункции

Процедура ПроверитьСтроки85(Результат85, ТолькоКнига85)
    Если ТипЗнч(Результат85) <> Тип("ТаблицаЗначений") Или Результат85.Колонки.Количество() <> 5
        Или Результат85.Количество() <> ?(ТолькоКнига85, 1, 3) Тогда
        ВызватьИсключение "Неверный тип или полный размер фактического счета";
    КонецЕсли;
    Для Каждого Имя85 Из СтрРазделить("Код85,Название85,Количество85,Цена85,Сумма85", ",") Цикл
        Если Результат85.Колонки.Найти(Имя85) = Неопределено Тогда
            ВызватьИсключение "Нет фактической колонки счета";
        КонецЕсли;
    КонецЦикла;
    Эталон85 = СтрокиСчета85(ЧисловойТип85());
    Увидено85 = Новый Соответствие;
    Итог85 = 0;
    Для Каждого Факт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] <> Исходная85[Имя85] Тогда
                ВызватьИсключение "Не совпала фактическая ячейка исходного счета";
            КонецЕсли;
        КонецЦикла;
        Увидено85.Вставить(Факт85.Код85, Истина);
        Итог85 = Итог85 + Факт85.Количество85 * Факт85.Цена85;
    КонецЦикла;
    Если Итог85 <> ?(ТолькоКнига85, 500, 1000) Или Результат85.Итог("Сумма85") <> Итог85 Тогда
        ВызватьИсключение "Не совпали независимый пересчет и реальные суммы всех строк";
    КонецЕсли;
КонецПроцедуры
Модуль обычного приложения: открытие только РедакторСчета85

Конфигурация → Модуль обычного приложения. Событие ПриНачалеРаботыСистемы; ровно0параметров.

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

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

  1. Подготовьте только указанный собственный FileCF и настоящие controls.

  2. Откройте форму настоящим application callback; initializer строит только собственные объекты в памяти.

  3. Используйте только подготовленные native кнопки и сверяйте реальные source/owner/type/results до и после каждого действия.

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

  1. Открытие дает actual3 строки и сумму1000, источник/схема сохранены. Выберите именно верхний native корень собственной структуры.

  2. Первое настоящее Нажатие СледующийЭтап85: активируется собственное условие enumКнига85, компактные именованные элементы и БыстрыйДоступ; native output ровно1 строка2×250=500. Все пять фактических ячеек совпадают с независимым исходником.

  3. Второе Нажатие: отбор выключен, detailedTrue и Все; native output снова3 строки и1000. Код не подставляет1000 или500 в приемник; они лишь контроль независимой арифметики.

  4. Выбор узла деталей вместо корня отказывает ДО изменения; неизвестный исход любого изменяемого этапа дает sticky отказ, даже если часть политики уже успела примениться. Третье Нажатие запрещено; fresh экземпляр начинает маршрут заново.

  5. Ручной сдвиг/изменение собственных выбранных полей, источника или фильтра обязан дать конкретный readback отказ либо новый отличный фактический результат — не считать простую смену видимости доказательством безопасности данных.

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

Рабочая задача отделяет типизацию, настройки интерфейса и настоящее вычисление счета; все PRIMARY употреблены в основном модуле своей формы.

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

  1. Код только написан и проверяется статически: actual1С/UI/БД/сеть/печать/хранилища не выполнялись. Отрисовку и реальные callbacks проверяйте лично в подготовленной новой ИБ; резервные копии не создавались.

  2. Это обычные ПолеВвода/ТабличноеПоле толстого клиента, НЕ управляемые ПолеФормы/ТаблицаФормы. ТипЗначения можно записать только у несвязанного контрола; для связанного Данные это readonly. Value/Data недоступны, если control сам назначен владельцем формы — поэтому владелец здесь только обычная форма.

  3. Режимы дерева, отображения полей/именованных настроек, доступа к интерактивному порядку и ограничений доступных полей меняют интерфейс редактора. Это не фильтр счета, не security, не запрет использования поля в схеме; числа проверяются отдельным настоящим процессором.

  4. После частичной ошибки настройки не обещаны атомарность или rollback. Закройте свой экземпляр и откройте новый; чужие UI настройки не очищаются. Sticky отказ этапов СКД нельзя сбросить повторным initializer.

  5. Параметрические ограничения6937 НЕ используются и не кредитуются: хотя English alias совпадает с available-fields extension, их реальный тип другой; Add3445 имеет противоречивый native return. FIELD5998 берется только из своего настоящего ДоступныеПоляКомпоновкиДанных, Add3286 возвращает именно FieldRestriction.

  6. Оформление в коллекционном выводе не объявляется видимым цветом: реальные данные результата проверяются независимо; пользователь видит политики и именованные элементы только в настоящем редакторе. Не создавайте новый control-extension/type из неизвестного конструктора.

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

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

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

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

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