Два собственных построителя работают с локальными числовыми таблицами. Переносим реальную коллекцию разрешённых полей 2 → 1, используем настоящее имя данных и пользовательскую подпись, выполняем оба построителя и считаем итог 3000 из фактического результата.
Где и как запускать
Полный собственный серверный неглобальный непривилегированный общий модуль ТолькоЦены85. Все ТаблицаЗначений, ОписаниеИсточникаДанных, ПостроительЗапроса, Порядок и результаты создаются и остаются на сервере.
Подготовка
Будущий опыт выполняйте в своей НОВОЙ пустой учебной конфигурации на платформе 8.5.1.1343. Основной режим запуска=Управляемое приложение; Режим совместимости=Не использовать. Открывайте толстым управляемым клиентом. Все три товара и оба построителя создаются заново в памяти, без чтения рабочих справочников или документов.
Конфигуратор → Общие → Общие модули → создать ТолькоЦены85. Сервер=Да; Глобальный, Привилегированный, Вызов сервера, Клиент (управляемое приложение), Клиент (обычное приложение), Внешнее соединение=Нет. Повторное использование возвращаемых значений=Не использовать. Основной блок вставьте ЦЕЛИКОМ в пустой модуль; экспортная функция СформироватьПорядокЦен85 не принимает аргументов.
Общие → Общие формы → создать управляемую ПорядокЦен85. Создайте Протокол85: Строка, длина=0 — неограниченная длина. Выведите многострочным полем с ПутьКДанным=Протокол85 и ТолькоПросмотр=Да.
В свойствах своей формы: АвтоматическоеСохранениеДанныхВНастройках=АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать; СохранениеДанныхВНастройках=СохранениеДанныхФормыВНастройках.НеИспользовать. Это два разных перечисления, не флаги Булево. Полный поддерживающий модуль формы вставьте в пустой модуль этой формы.
В форме создайте команду Проверить85: Действие=Проверить85; выведите её кнопку. Настоящий объект Команда передаёт платформа при нажатии; обработчик вручную не вызывайте. В ПриОткрытии опыт не запускайте.
Общие → Общие команды → создать ОткрытьПорядокЦен85 без параметра; включить в командный интерфейс своей учебной подсистемы. Третий полный блок вставьте в её пустой модуль. &НаКлиенте задаёт выполнение обработчика, а #Если ограничивает вид клиента; оба штатных параметра передаёт платформа.
После будущей проверки синтаксиса сохраните конфигурацию и обновите только свою учебную базу. Откройте ПорядокЦен85 штатной общей командой и нажмите Проверить85. Сервер создаёт таблицы, настройки и результаты; клиент получает только строковый отчёт.
Не нужны новая виртуальная машина, отдельный системный пользователь, полный обход метаданных, COM, Интернет или согласие на запись рабочих данных. Этот опыт не сохраняет настройки и не принимает чужие объекты. Компиляция и реальный запуск в 1С пока не выполнялись.
&НаСервере
Функция СформироватьПорядокЦен85() Экспорт
Товары85 = Новый ТаблицаЗначений();
Квалификаторы85 = Новый КвалификаторыЧисла(9, 0, ДопустимыйЗнак.Неотрицательный);
ТипЧисла85 = Новый ОписаниеТипов("Число", Квалификаторы85);
Товары85.Колонки.Добавить("Цена85", ТипЧисла85);
Товары85.Колонки.Добавить("Количество85", ТипЧисла85);
Строка85 = Товары85.Добавить();
Строка85.Цена85 = 300;
Строка85.Количество85 = 6;
Строка85 = Товары85.Добавить();
Строка85.Цена85 = 100;
Строка85.Количество85 = 2;
Строка85 = Товары85.Добавить();
Строка85.Цена85 = 250;
Строка85.Количество85 = 4;
Цены85 = Товары85.Скопировать(, "Цена85");
ПроверитьИсходные85(Товары85, Цены85);
Эталон85 = СоздатьПостроитель85(Цены85);
Основной85 = СоздатьПостроитель85(Товары85);
Если ТипЗнч(Эталон85.Порядок) <> Тип("Порядок")
Или ТипЗнч(Основной85.Порядок) <> Тип("Порядок") Тогда
ВызватьИсключение "Не получены настоящие порядки собственных построителей";
КонецЕсли;
ПоляЭталона85 = Эталон85.Порядок.ПолучитьДоступныеПоля();
ПоляДо85 = Основной85.Порядок.ПолучитьДоступныеПоля();
Если ТипЗнч(ПоляЭталона85) <> Тип("ПоляНастройки")
Или ТипЗнч(ПоляДо85) <> Тип("ПоляНастройки") Тогда
ВызватьИсключение "Нужны настоящие коллекции разрешённых полей";
КонецЕсли;
РазрешенныхДо85 = ПоляДо85.Количество();
Если ПоляЭталона85.Количество() <> 1 Или РазрешенныхДо85 <> 2 Тогда
ВызватьИсключение "До переноса нужны одно поле эталона и два поля основного порядка";
КонецЕсли;
ПолеЭталона85 = ПоляЭталона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.Порядок.Получить(0);
Если ТипЗнч(ЭлементЭталона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", "Цена", НаправлениеСортировки.Возр);
Если Основной85.Порядок.Количество() <> 1 Тогда
ВызватьИсключение "Не создана единственная основная сортировка";
КонецЕсли;
ЭлементОсновного85 = Основной85.Порядок.Получить(0);
Если ТипЗнч(ЭлементОсновного85) <> Тип("ЭлементПорядка") Тогда
ВызватьИсключение "Не получен настоящий элемент основного порядка";
КонецЕсли;
ЭлементОсновного85.Представление = "Цена товара по возрастанию";
Эталон85.Выполнить();
Основной85.Выполнить();
Если ТипЗнч(Эталон85.Результат) <> Тип("РезультатЗапроса")
Или ТипЗнч(Основной85.Результат) <> Тип("РезультатЗапроса") Тогда
ВызватьИсключение "Построители не дали настоящие результаты";
КонецЕсли;
РезультатЦен85 = Эталон85.Результат.Выгрузить();
РезультатТоваров85 = Основной85.Результат.Выгрузить();
Если ТипЗнч(РезультатЦен85) <> Тип("ТаблицаЗначений")
Или ТипЗнч(РезультатТоваров85) <> Тип("ТаблицаЗначений") Тогда
ВызватьИсключение "Оба результата должны быть настоящими таблицами";
КонецЕсли;
Если РезультатЦен85.Количество() <> 3 Или РезультатЦен85.Колонки.Количество() <> 1
Или РезультатЦен85.Колонки.Найти("Цена85") = Неопределено
Или РезультатТоваров85.Количество() <> 3 Или РезультатТоваров85.Колонки.Количество() <> 2
Или РезультатТоваров85.Колонки.Найти("Цена85") = Неопределено
Или РезультатТоваров85.Колонки.Найти("Количество85") = Неопределено Тогда
ВызватьИсключение "Результат не сохранил собственный состав строк и колонок";
КонецЕсли;
Итого85 = 0;
СтрокиОтчета85 = "";
Для Индекс85 = 0 По 2 Цикл
ЦенаЭталона85 = РезультатЦен85.Получить(Индекс85).Цена85;
СтрокаТовара85 = РезультатТоваров85.Получить(Индекс85);
Цена85 = СтрокаТовара85.Цена85;
Количество85 = СтрокаТовара85.Количество85;
Если ТипЗнч(ЦенаЭталона85) <> Тип("Число") Или ТипЗнч(Цена85) <> Тип("Число")
Или ТипЗнч(Количество85) <> Тип("Число") Тогда
ВызватьИсключение "В результатах нужны реальные числовые цены и количества";
КонецЕсли;
Если ЦенаЭталона85 <> Цена85
Или (Индекс85 = 0 И (Цена85 <> 100 Или Количество85 <> 2))
Или (Индекс85 = 1 И (Цена85 <> 250 Или Количество85 <> 4))
Или (Индекс85 = 2 И (Цена85 <> 300 Или Количество85 <> 6)) Тогда
ВызватьИсключение "Фактическая сортировка или связь цены с количеством не подтверждена";
КонецЕсли;
СуммаСтроки85 = Цена85 * Количество85;
Итого85 = Итого85 + СуммаСтроки85;
СтрокиОтчета85 = СтрокиОтчета85 + Строка(Цена85) + " × " + Строка(Количество85)
+ " = " + Строка(СуммаСтроки85) + "; ";
КонецЦикла;
Если ТипЗнч(Итого85) <> Тип("Число") Или Итого85 <> 3000 Тогда
ВызватьИсключение "Настоящий итог товаров не равен 3000";
КонецЕсли;
ПроверитьИсходные85(Товары85, Цены85);
Если Основной85.Порядок.Количество() <> 1 Тогда
ВызватьИсключение "Итоговый порядок неожиданно изменился";
КонецЕсли;
ИтоговыйЭлемент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.Количество() <> 3 Или Товары85.Колонки.Количество() <> 2
Или Товары85.Колонки.Найти("Цена85") = Неопределено
Или Товары85.Колонки.Найти("Количество85") = Неопределено
Или Цены85.Количество() <> 3 Или Цены85.Колонки.Количество() <> 1
Или Цены85.Колонки.Найти("Цена85") = Неопределено Тогда
ВызватьИсключение "Не совпал полный собственный состав исходных данных";
КонецЕсли;
Для Индекс85 = 0 По 2 Цикл
СтрокаТовара85 = Товары85.Получить(Индекс85);
Цена85 = СтрокаТовара85.Цена85;
Количество85 = СтрокаТовара85.Количество85;
ЦенаЭталона85 = Цены85.Получить(Индекс85).Цена85;
Если ТипЗнч(Цена85) <> Тип("Число") Или ТипЗнч(Количество85) <> Тип("Число")
Или ТипЗнч(ЦенаЭталона85) <> Тип("Число") Тогда
ВызватьИсключение "Исходные значения должны оставаться настоящими числами";
КонецЕсли;
Если ЦенаЭталона85 <> Цена85
Или (Индекс85 = 0 И (Цена85 <> 300 Или Количество85 <> 6))
Или (Индекс85 = 1 И (Цена85 <> 100 Или Количество85 <> 2))
Или (Индекс85 = 2 И (Цена85 <> 250 Или Количество85 <> 4)) Тогда
ВызватьИсключение "Исходные строки изменены либо не подготовлены";
КонецЕсли;
КонецЦикла;
КонецПроцедурыПолный модуль своей формы ПорядокЦен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: (300,6), (100,2), (250,4). Для обеих колонок используем одно настоящее описание числа с явными квалификаторами: 9 разрядов, 0 дробных, знак Неотрицательный. Установленный конструктор ОписаниеТипов предупреждает, что без параметра КвалификаторыЧисла числа хранить нельзя. Скопировать(, "Цена85") получает настоящий отдельный эталон с теми же тремя ценами и единственной колонкой: первый необязательный аргумент опущен, поэтому по справке копируются все строки. Проверяем полный состав обеих таблиц, типы и значения.
Каждая таблица получает своё ОписаниеИсточникаДанных и свой ПостроительЗапроса. У собственных колонок разрешаем выбор и упорядочивание; измерения запрещаем. ВыбранныеПоля задаёт колонки результата, а не разрешённые поля сортировки.
ПолучитьДоступныеПоля возвращает настоящие ПоляНастройки. У эталона должна быть только Цена85, у основного порядка — Цена85 и Количество85. Сравниваем количество и поиск точных имён, без предположения о порядке коллекции.
Настраиваем цену эталона по возрастанию. Добавить у Порядок не возвращает элемент: после проверки Количество=1 получаем его через Получить(0). Данные — прочитанное настоящее имя данных; Направление — только для чтения. Проверяем Цена85 и настоящий НаправлениеСортировки.Возр.
УстановитьДоступныеПоля получает именно фактическую коллекцию эталона. Новое чтение основного порядка должно показать одно разрешённое поле Цена85 и отсутствие Количество85. Это перенос списка допустимых ключей сортировки, не удаление колонки товара.
Основная сортировка использует реальное Данные эталонного элемента. У настоящего основного элемента записываем понятное Представление «Цена товара по возрастанию». Эта подпись не переименовывает колонку и не заменяет имя данных.
Выполнить не возвращает таблицу: результат находится в свойстве Результат, доступном только для чтения. Выгрузить() без параметра использует прямой обход и создаёт ТаблицаЗначений. Реально проверяем оба результата: цены 100/250/300; связанные количества 2/4/6.
Из настоящих строк основного результата вычисляем 100×2=200, 250×4=1000, 300×6=1800 и итог 3000. Полное повторное чтение исходных таблиц подтверждает прежний состав и порядок; свежий Получить(0) подтверждает ключ, подпись и направление. Именно эти прочитанные значения и вычисленные суммы попадают в отчёт.
Перед обращением к серверу форма сразу очищает прошлый отчёт. Любая ошибка показывает фиксированное сообщение о незавершённой сортировке; исходное исключение передаётся дальше. Нет подмены чисел, исправления настройки, автоматического повтора или успешного отчёта при отказе.
Как проверить результат
Будущий нормальный запуск: отчёт показывает разрешённые поля 2 → 1, ключ Цена85, подпись «Цена товара по возрастанию», строки 100×2=200; 250×4=1000; 300×6=1800 и настоящий итог 3000.
В своём отладчике перед переносом проверьте тип ПоляНастройки и реальные имена: эталон содержит только Цена85, основной — оба поля. После УстановитьДоступныеПоля повторное чтение содержит только Цена85; поиск Количество85 возвращает Неопределено.
Проверьте, что основной результат всё ещё содержит Количество85. При сортировке количество должно оставаться с собственной ценой: 2 с 100, 4 с 250, 6 с 300. Переставляются строки результата, а не отдельные значения одного столбца.
После обоих выполнений сравните все исходные строки: товары снова (300,6), (100,2), (250,4), эталонные цены снова 300/100/250. У каждой исходной ячейки должен оставаться тип Число.
Только в отдельной своей учебной копии через отладчик измените одну исходную цену либо количество до ПроверитьИсходные85. Ожидается остановка проверки и отсутствие успешного отчёта. Не проверяйте это на рабочих товарах и не чините контрольные значения ради прохождения.
В своей учебной копии измените направление основной сортировки на Убыв, сохранив прежние ожидания. Действительная проверка позиции и связанного количества должна остановить опыт. Другой опыт — неверная итоговая подпись перед свежим Получить(0): проверка подписи тоже должна отказать.
При ошибке поле содержит только «Сортировка НЕ подтверждена. Опыт остановлен», а не предыдущий успешный отчёт или полный текст технической ошибки. Само исключение передаётся платформе; форма не скрывает его как успешный результат.
Повторное обычное нажатие начинает новый самостоятельный расчёт в памяти. Доставка вызова формы на сервер и компиляция ещё требуют ручной проверки; написанный код и сверенная справка не означают уже выполненный опыт.
Ожидаемый результат
Будущий фактический отчёт: разрешённые ключи сортировки 2 → 1, Цена85, «Цена товара по возрастанию», 100×2=200; 250×4=1000; 300×6=1800; общий итог 3000. Количество85 сохраняется в результате, оба исходных набора неизменны. Реальный запуск и компиляция в 1С пока не выполнялись.
На что обратить внимание
Эта семья — старый самостоятельный API ПостроительЗапроса, не СКД и не объект Запрос. Табличный ИсточникДанных — настоящее ОписаниеИсточникаДанных. ПолучитьЗапрос в таком режиме не используем; текст к рабочим таблицам и параметры чужой конфигурации не нужны.
УстановитьДоступныеПоля/ПолучитьДоступныеПоля прямо недоступны у порядка динамических списков СправочникСписок, ДокументСписок и подобных. Не переносите этот пример в их Порядок: здесь оба владельца — собственные отдельные ПостроительЗапроса.
Установка списка сортировки не является RLS, проверкой прав или запретом доступа к данным. Количество85 остаётся выбранным полем результата, но не разрешённым ключом данного собственного порядка.
Пример ПолучитьДоступныеПоля в установленной справке содержит смешанные имена и свойства отбора. Он сохранён как источник, но не скопирован в модуль. Сигнатуры Добавить/Получить и свойства Данные/Представление используются отдельно и точно.
Добавить, УстановитьДоступныеПоля и Выполнить здесь вызываются как операции без получения результата. Не присваивайте их неописанный результат переменной и не выдумывайте возвращаемый ЭлементПорядка. Числовой индекс Получить начинается с 0.
Данные и Направление только для чтения. Данные — имя данных, ПутьКДанным — отдельное свойство. Для одного собственного плоского поля проверяем фактическое Цена85; всеобщего равенства этих двух свойств не обещаем. Направление задаётся документированным аргументом Добавить.
Представление — строка пользовательской подписи, доступная для записи. Оно не меняет ключ, исходную колонку или порядок строк само по себе; поэтому отдельно проверяются реальная сортировка и свежие свойства элемента.
УстановитьДоступныеПоля не обещает глубокую копию или независимость коллекций. После передачи обе коллекции не изменяем и их объектную идентичность не сравниваем. Проверяется новая фактическая разрешённая схема и полезный результат, не сериализация настроек.
Описание колонок разрешает выбор и сортировку, запрещает измерения. Если фактическая версия даёт иной состав разрешённых полей или иной результат, это незавершённая подготовка/ошибка, а не успешный урок с красивыми константами.
Построители, таблицы и результаты остаются на сервере; в клиент передаётся String. Строка(Число) зависит от национальных установок: сравнивайте настоящие значения и смысл, не побайтовое оформление отчёта.
Это только собственные объекты в памяти. Нет записи настройки, рабочей базы, файлов, печати, COM или сети из алгоритма. Открытие формы и обращение клиента к серверу выполняют обычные платформенные вызовы. Совпадение имени формы и отключённого сохранения не является защитой от подделки вызова.
В 1С этот сценарий пока не запускался и не компилировался. Любое исключение/неверное фактическое значение — остановка, не положительная демонстрация заявленных пунктов и не основание исправлять рабочую конфигурацию.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.