Тип: ОграниченияИспользованияДоступныхПолейКомпоновкиДанных. Содержит коллекцию ограничений для использования доступных полей в данном табличном поле. С помощью данной коллекции разработчик может исключить часть доступных полей из данного табличного поля. Таким образом, можно фильтровать набор доступных полей и не предоставлять пользователю те поля, использование которых нецелесообразно в данном конкретном случае.
Полное описание, параметры и ограничения
Расширение табличного поля доступных полей компоновки данных.ОграниченияИспользования (Data composition available fields table box extension.UseRestrictions)
Расширение табличного поля доступных полей компоновки данных (Data composition available fields table box extension)
ОграниченияИспользования (UseRestrictions)
Доступен, начиная с версии 8.1.
Использование:
Только чтение.
Описание:
Тип: ОграниченияИспользованияДоступныхПолейКомпоновкиДанных.
Содержит коллекцию ограничений для использования доступных полей в данном табличном поле.
С помощью данной коллекции разработчик может исключить часть доступных полей из данного табличного поля. Таким образом, можно фильтровать набор доступных полей и не предоставлять пользователю те поля, использование которых нецелесообразно в данном конкретном случае.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Управлять отображением настоящих редакторов СКД и проверить фильтр1000→500→1000
Самостоятельный полный модуль своей обычной общей формы; настоящие 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 из неизвестного конструктора.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.