Перенести сортировку только по цене и получить настоящие строки 100/250/300

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

Два собственных построителя работают с локальными числовыми таблицами. Переносим реальную коллекцию разрешённых полей 2 → 1, используем настоящее имя данных и пользовательскую подпись, выполняем оба построителя и считаем итог 3000 из фактического результата.

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

Полный собственный серверный неглобальный непривилегированный общий модуль ТолькоЦены85. Все ТаблицаЗначений, ОписаниеИсточникаДанных, ПостроительЗапроса, Порядок и результаты создаются и остаются на сервере.

Подготовка

  1. Будущий опыт выполняйте в своей НОВОЙ пустой учебной конфигурации на платформе 8.5.1.1343. Основной режим запуска=Управляемое приложение; Режим совместимости=Не использовать. Открывайте толстым управляемым клиентом. Все три товара и оба построителя создаются заново в памяти, без чтения рабочих справочников или документов.

  2. Конфигуратор → Общие → Общие модули → создать ТолькоЦены85. Сервер=Да; Глобальный, Привилегированный, Вызов сервера, Клиент (управляемое приложение), Клиент (обычное приложение), Внешнее соединение=Нет. Повторное использование возвращаемых значений=Не использовать. Основной блок вставьте ЦЕЛИКОМ в пустой модуль; экспортная функция СформироватьПорядокЦен85 не принимает аргументов.

  3. Общие → Общие формы → создать управляемую ПорядокЦен85. Создайте Протокол85: Строка, длина=0 — неограниченная длина. Выведите многострочным полем с ПутьКДанным=Протокол85 и ТолькоПросмотр=Да.

  4. В свойствах своей формы: АвтоматическоеСохранениеДанныхВНастройках=АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать; СохранениеДанныхВНастройках=СохранениеДанныхФормыВНастройках.НеИспользовать. Это два разных перечисления, не флаги Булево. Полный поддерживающий модуль формы вставьте в пустой модуль этой формы.

  5. В форме создайте команду Проверить85: Действие=Проверить85; выведите её кнопку. Настоящий объект Команда передаёт платформа при нажатии; обработчик вручную не вызывайте. В ПриОткрытии опыт не запускайте.

  6. Общие → Общие команды → создать ОткрытьПорядокЦен85 без параметра; включить в командный интерфейс своей учебной подсистемы. Третий полный блок вставьте в её пустой модуль. &НаКлиенте задаёт выполнение обработчика, а #Если ограничивает вид клиента; оба штатных параметра передаёт платформа.

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

  8. Не нужны новая виртуальная машина, отдельный системный пользователь, полный обход метаданных, 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");
    #Иначе
        ВызватьИсключение "Учебную форму открывайте в толстом управляемом клиенте";
    #КонецЕсли
КонецПроцедуры

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

  1. Создаём типизированную таблицу Цена85/Количество85: (300,6), (100,2), (250,4). Для обеих колонок используем одно настоящее описание числа с явными квалификаторами: 9 разрядов, 0 дробных, знак Неотрицательный. Установленный конструктор ОписаниеТипов предупреждает, что без параметра КвалификаторыЧисла числа хранить нельзя. Скопировать(, "Цена85") получает настоящий отдельный эталон с теми же тремя ценами и единственной колонкой: первый необязательный аргумент опущен, поэтому по справке копируются все строки. Проверяем полный состав обеих таблиц, типы и значения.

  2. Каждая таблица получает своё ОписаниеИсточникаДанных и свой ПостроительЗапроса. У собственных колонок разрешаем выбор и упорядочивание; измерения запрещаем. ВыбранныеПоля задаёт колонки результата, а не разрешённые поля сортировки.

  3. ПолучитьДоступныеПоля возвращает настоящие ПоляНастройки. У эталона должна быть только Цена85, у основного порядка — Цена85 и Количество85. Сравниваем количество и поиск точных имён, без предположения о порядке коллекции.

  4. Настраиваем цену эталона по возрастанию. Добавить у Порядок не возвращает элемент: после проверки Количество=1 получаем его через Получить(0). Данные — прочитанное настоящее имя данных; Направление — только для чтения. Проверяем Цена85 и настоящий НаправлениеСортировки.Возр.

  5. УстановитьДоступныеПоля получает именно фактическую коллекцию эталона. Новое чтение основного порядка должно показать одно разрешённое поле Цена85 и отсутствие Количество85. Это перенос списка допустимых ключей сортировки, не удаление колонки товара.

  6. Основная сортировка использует реальное Данные эталонного элемента. У настоящего основного элемента записываем понятное Представление «Цена товара по возрастанию». Эта подпись не переименовывает колонку и не заменяет имя данных.

  7. Выполнить не возвращает таблицу: результат находится в свойстве Результат, доступном только для чтения. Выгрузить() без параметра использует прямой обход и создаёт ТаблицаЗначений. Реально проверяем оба результата: цены 100/250/300; связанные количества 2/4/6.

  8. Из настоящих строк основного результата вычисляем 100×2=200, 250×4=1000, 300×6=1800 и итог 3000. Полное повторное чтение исходных таблиц подтверждает прежний состав и порядок; свежий Получить(0) подтверждает ключ, подпись и направление. Именно эти прочитанные значения и вычисленные суммы попадают в отчёт.

  9. Перед обращением к серверу форма сразу очищает прошлый отчёт. Любая ошибка показывает фиксированное сообщение о незавершённой сортировке; исходное исключение передаётся дальше. Нет подмены чисел, исправления настройки, автоматического повтора или успешного отчёта при отказе.

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

  1. Будущий нормальный запуск: отчёт показывает разрешённые поля 2 → 1, ключ Цена85, подпись «Цена товара по возрастанию», строки 100×2=200; 250×4=1000; 300×6=1800 и настоящий итог 3000.

  2. В своём отладчике перед переносом проверьте тип ПоляНастройки и реальные имена: эталон содержит только Цена85, основной — оба поля. После УстановитьДоступныеПоля повторное чтение содержит только Цена85; поиск Количество85 возвращает Неопределено.

  3. Проверьте, что основной результат всё ещё содержит Количество85. При сортировке количество должно оставаться с собственной ценой: 2 с 100, 4 с 250, 6 с 300. Переставляются строки результата, а не отдельные значения одного столбца.

  4. После обоих выполнений сравните все исходные строки: товары снова (300,6), (100,2), (250,4), эталонные цены снова 300/100/250. У каждой исходной ячейки должен оставаться тип Число.

  5. Только в отдельной своей учебной копии через отладчик измените одну исходную цену либо количество до ПроверитьИсходные85. Ожидается остановка проверки и отсутствие успешного отчёта. Не проверяйте это на рабочих товарах и не чините контрольные значения ради прохождения.

  6. В своей учебной копии измените направление основной сортировки на Убыв, сохранив прежние ожидания. Действительная проверка позиции и связанного количества должна остановить опыт. Другой опыт — неверная итоговая подпись перед свежим Получить(0): проверка подписи тоже должна отказать.

  7. При ошибке поле содержит только «Сортировка НЕ подтверждена. Опыт остановлен», а не предыдущий успешный отчёт или полный текст технической ошибки. Само исключение передаётся платформе; форма не скрывает его как успешный результат.

  8. Повторное обычное нажатие начинает новый самостоятельный расчёт в памяти. Доставка вызова формы на сервер и компиляция ещё требуют ручной проверки; написанный код и сверенная справка не означают уже выполненный опыт.

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

Будущий фактический отчёт: разрешённые ключи сортировки 2 → 1, Цена85, «Цена товара по возрастанию», 100×2=200; 250×4=1000; 300×6=1800; общий итог 3000. Количество85 сохраняется в результате, оба исходных набора неизменны. Реальный запуск и компиляция в 1С пока не выполнялись.

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

  1. Эта семья — старый самостоятельный API ПостроительЗапроса, не СКД и не объект Запрос. Табличный ИсточникДанных — настоящее ОписаниеИсточникаДанных. ПолучитьЗапрос в таком режиме не используем; текст к рабочим таблицам и параметры чужой конфигурации не нужны.

  2. УстановитьДоступныеПоля/ПолучитьДоступныеПоля прямо недоступны у порядка динамических списков СправочникСписок, ДокументСписок и подобных. Не переносите этот пример в их Порядок: здесь оба владельца — собственные отдельные ПостроительЗапроса.

  3. Установка списка сортировки не является RLS, проверкой прав или запретом доступа к данным. Количество85 остаётся выбранным полем результата, но не разрешённым ключом данного собственного порядка.

  4. Пример ПолучитьДоступныеПоля в установленной справке содержит смешанные имена и свойства отбора. Он сохранён как источник, но не скопирован в модуль. Сигнатуры Добавить/Получить и свойства Данные/Представление используются отдельно и точно.

  5. Добавить, УстановитьДоступныеПоля и Выполнить здесь вызываются как операции без получения результата. Не присваивайте их неописанный результат переменной и не выдумывайте возвращаемый ЭлементПорядка. Числовой индекс Получить начинается с 0.

  6. Данные и Направление только для чтения. Данные — имя данных, ПутьКДанным — отдельное свойство. Для одного собственного плоского поля проверяем фактическое Цена85; всеобщего равенства этих двух свойств не обещаем. Направление задаётся документированным аргументом Добавить.

  7. Представление — строка пользовательской подписи, доступная для записи. Оно не меняет ключ, исходную колонку или порядок строк само по себе; поэтому отдельно проверяются реальная сортировка и свежие свойства элемента.

  8. УстановитьДоступныеПоля не обещает глубокую копию или независимость коллекций. После передачи обе коллекции не изменяем и их объектную идентичность не сравниваем. Проверяется новая фактическая разрешённая схема и полезный результат, не сериализация настроек.

  9. Описание колонок разрешает выбор и сортировку, запрещает измерения. Если фактическая версия даёт иной состав разрешённых полей или иной результат, это незавершённая подготовка/ошибка, а не успешный урок с красивыми константами.

  10. Построители, таблицы и результаты остаются на сервере; в клиент передаётся String. Строка(Число) зависит от национальных установок: сравнивайте настоящие значения и смысл, не побайтовое оформление отчёта.

  11. Это только собственные объекты в памяти. Нет записи настройки, рабочей базы, файлов, печати, COM или сети из алгоритма. Открытие формы и обращение клиента к серверу выполняют обычные платформенные вызовы. Совпадение имени формы и отключённого сохранения не является защитой от подделки вызова.

  12. В 1С этот сценарий пока не запускался и не компилировался. Любое исключение/неверное фактическое значение — остановка, не положительная демонстрация заявленных пунктов и не основание исправлять рабочую конфигурацию.

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

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

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

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

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