Самостоятельный полный модуль своей обычной общей формы; настоящие native источники и полная проверка собственного счета.
Где и как запускать
Полный модуль ОбщаяФорма.РедакторСчета85, обычная форма толстого клиента.
Подготовка
Вручную создайте НОВУЮ отдельную файловую ИБ по точному пути C:\1C85_OwnOrdinaryEditors\47a694a9-b495-4d06-9bcc-6d773cc319fd\Base. Это UUID-каталог учебного стенда, не идентификатор рабочей ИБ. Не используйте копию УТ/КА/УНФ/БП, клиент-серверную ИБ или рабочий сеанс. Здесь ничего не создавалось и 1С не запускалась.
Конфигурация Уч85ОбычныеРедакторыСчета: основное приложение Обычное приложение, Режим совместимости Не использовать; платформа8.5.1.1343. Нет BSP, расширений, общих модулей, прикладных объектов и хранилищ. Создайте только одну роль УчебныйАдминистратор85: Администрирование для ПолучитьПользователей, использование своих общих форм и перечисления. Единственный пользователь с тем же именем получает эту роль; нет гостя/другого пользователя.
Создайте Перечисление.ПозицияСчета85 и ровно3 значения В ЭТОМ ПОРЯДКЕ: Книга85 (синоним Книга), Бумага85 (синоним Бумага), Папка85 (синоним Папка). Форм перечисления нет. Это настоящие metadata enum-ссылки, не строки и не ранее существующие записи каталога.
Создайте три Общие формы, вид Обычная: ОписаниеКолонки85, НастройкиПостроителя85, РедакторСчета85. Они не являются формами отчета и не используют поле/табличное поле в качестве владельца. Данные у всех показанных полей ввода и табличных полей оставьте пустыми: модуль задает настоящий native Значение, а не строку произвольного имени переменной.
В выбранной форме добавьте реквизит Состояние85 Строка500 с полем только для просмотра. Все остальные источники существуют в переменных полного модуля и создаются заново ПриОткрытии. Источники не подгружаются из соседней карточки; общий модуль не нужен.
Свяжите обычное событие формы ПриОткрытии с ПриОткрытии() без параметров. Для каждой названной обычной кнопки свяжите Нажатие с одноименной процедурой(Кнопка), ровно один native параметр. Не вызывайте эти события вручную и не передавайте Неопределено вместо кнопки.
Вставьте полный основной модуль этой карточки в точную выбранную общую форму. Остальные две общие формы могут пока оставаться пустыми, если их уроки еще не установлены: они не вызываются и не предоставляют скрытых помощников. В модуле обычного приложения установите полный поддерживающий модуль этой карточки; он открывает только выбранную форму.
Запускайте только собственную новую ИБ в ТОЛСТОМ клиенте с ОБЫЧНЫМ приложением. Сначала вручную проверьте строку соединения и имя пользователя. Guard обязан отказать при другом пути, версии, режиме совместимости, metadata составе или пользователе; guard не является обещанием защиты рабочего окружения от произвольного другого кода.
Добавьте5 настоящих ТабличноеПоле: Структура85, Отбор85, Оформление85, ДоступныеПоля85, Результат85; кнопка СледующийЭтап85. Данные пусты. Структура85 получает ВЕСЬ объект НастройкиКомпоновкиДанных, НЕ его коллекцию Структура. Остальные редакторы получают ровно свои native коллекции от actual собственного компоновщика.
Новая схема создается полностью в памяти: Local, один Object набор Счет85 с ИмяОбъекта Строки85, пять typed полей, одна детальная группировка и собственный enum-фильтр Книга85. Никакого DB query, параметрического редактора или неизвестной схемы нет.
Политика ПриНедоступностиНастроек = ИзменятьДоступностьПоля изучается с настоящим ordinary корнем и current-data; конкретная визуальная деактивация не обещается без ручного UI теста. Именованные фильтр/оформление реально существуют, поэтому detailed flags имеют предмет отображения.
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", , Новый УникальныйИдентификатор).Открыть();
КонецПроцедурыРазбор по шагам
Подготовьте только указанный собственный FileCF и настоящие controls.
Откройте форму настоящим application callback; initializer строит только собственные объекты в памяти.
Используйте только подготовленные native кнопки и сверяйте реальные source/owner/type/results до и после каждого действия.
Как проверить результат
Открытие дает actual3 строки и сумму1000, источник/схема сохранены. Выберите именно верхний native корень собственной структуры.
Первое настоящее Нажатие СледующийЭтап85: активируется собственное условие enumКнига85, компактные именованные элементы и БыстрыйДоступ; native output ровно1 строка2×250=500. Все пять фактических ячеек совпадают с независимым исходником.
Второе Нажатие: отбор выключен, detailedTrue и Все; native output снова3 строки и1000. Код не подставляет1000 или500 в приемник; они лишь контроль независимой арифметики.
Выбор узла деталей вместо корня отказывает ДО изменения; неизвестный исход любого изменяемого этапа дает sticky отказ, даже если часть политики уже успела примениться. Третье Нажатие запрещено; fresh экземпляр начинает маршрут заново.
Ручной сдвиг/изменение собственных выбранных полей, источника или фильтра обязан дать конкретный readback отказ либо новый отличный фактический результат — не считать простую смену видимости доказательством безопасности данных.
Ожидаемый результат
Рабочая задача отделяет типизацию, настройки интерфейса и настоящее вычисление счета; все PRIMARY употреблены в основном модуле своей формы.
На что обратить внимание
Код только написан и проверяется статически: actual1С/UI/БД/сеть/печать/хранилища не выполнялись. Отрисовку и реальные callbacks проверяйте лично в подготовленной новой ИБ; резервные копии не создавались.
Это обычные ПолеВвода/ТабличноеПоле толстого клиента, НЕ управляемые ПолеФормы/ТаблицаФормы. ТипЗначения можно записать только у несвязанного контрола; для связанного Данные это readonly. Value/Data недоступны, если control сам назначен владельцем формы — поэтому владелец здесь только обычная форма.
Режимы дерева, отображения полей/именованных настроек, доступа к интерактивному порядку и ограничений доступных полей меняют интерфейс редактора. Это не фильтр счета, не security, не запрет использования поля в схеме; числа проверяются отдельным настоящим процессором.
После частичной ошибки настройки не обещаны атомарность или rollback. Закройте свой экземпляр и откройте новый; чужие UI настройки не очищаются. Sticky отказ этапов СКД нельзя сбросить повторным initializer.
Параметрические ограничения6937 НЕ используются и не кредитуются: хотя English alias совпадает с available-fields extension, их реальный тип другой; Add3445 имеет противоречивый native return. FIELD5998 берется только из своего настоящего ДоступныеПоляКомпоновкиДанных, Add3286 возвращает именно FieldRestriction.
Оформление в коллекционном выводе не объявляется видимым цветом: реальные данные результата проверяются независимо; пользователь видит политики и именованные элементы только в настоящем редакторе. Не создавайте новый control-extension/type из неизвестного конструктора.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.