ВариантыНастроекКомпоновкиДанных.Сдвинуть

Методы · Move

Перемещает элемент в коллекции.

Синтаксис

Сдвинуть(<Элемент>, <Смещение>)
Полное описание, параметры и ограничения

ВариантыНастроекКомпоновкиДанных.Сдвинуть (DataCompositionSettingsVariants.Move)

ВариантыНастроекКомпоновкиДанных (DataCompositionSettingsVariants)

Сдвинуть (Move)

Доступен, начиная с версии 8.2.

Синтаксис:
Сдвинуть(<Элемент>, <Смещение>)
Параметры:

<Элемент> (обязательный)
Тип: ВариантНастроекКомпоновкиДанных.
Перемещаемый элемент.

<Смещение> (обязательный)
Тип: Число.
Смещение элемента в коллекции.
Описание:

Перемещает элемент в коллекции.

Доступность:

Сервер, толстый клиент, внешнее соединение.

Использование в версии:

Доступен, начиная с версии 8.2.

Методическая информация

Практические примеры

Два локальных варианта: Сдвинуть объектом, получить новый первый и восстановить

Собственная схема пакетов создаёт Подробно85 и Кратко85, а не использует сохранённые UUID. НастройкиПоУмолчанию по native принадлежат первому варианту. На сервере переносится настоящий ВариантНастроекКомпоновкиДанных; фактические индексы, имена, представления и полный выбор проверяются до загрузки в реальный отчёт. Затем возвращается именно исходный собственный порядок. Числа и внешний вид результата проверяются отдельно вручную; запуск 1С не выполнен.

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

Смешанный управляемый: толстый клиент 8.5.1.1343 Такси и сервер

Подготовка

  1. Только будущий ручной опыт: создайте совершенно новую пустую учебную информационную базу. Здесь 1С и BSL не запускались; runtime-проверок 0. Не переносите урок в рабочую конфигурацию.

  2. В конфигураторе имя собственной конфигурации задайте УчебныеВариантыПакетов85; основное приложение — управляемое, Режим совместимости — Не использовать. Запуск: толстый клиент в режиме управляемого приложения, установленная платформа ровно 8.5.1.1343, интерфейс Такси, обычный режим основного окна. Обычный режим основного окна не означает обычное приложение: приложение остаётся управляемым. Проверки версии/имени/интерфейса не доказывают, каким исполняемым клиентом был запущен сеанс: проверьте способ запуска вручную.

  3. Создайте нового отдельного пользователя АвторВариантов85 только в этой новой базе. Не переименовывайте и не используйте рабочего пользователя. Сеанс всегда запускайте им: guard проверяет точное ИмяПользователя().

  4. Создайте собственную роль ПакетыУчебные85: доступ только к своему отчёту УчебныеЛокальныеВарианты85, его собственной форме, просмотр/использование форм. В правах корня конфигурации включите ТолстыйКлиент (ThickClient), РежимОсновногоОкнаОбычный (MainWindowModeNormal) и СохранениеДанныхПользователя (SaveUserData). После обновления конфигурации базы данных назначьте эту роль новому пользователю АвторВариантов85. Не выдавайте учебному пользователю Администрирование, АдминистрированиеДанных или ОбновлениеКонфигурацииБазыДанных. Отчёт не требует чтения или записи предметных объектов; локальный запрос состоит только из трёх константных строк.

  5. У конфигурации свойства ХранилищеВариантовОтчетов и ХранилищеПользовательскихНастроекОтчетов оставьте незаданными. Это необходимое соответствие стандартному внутреннему хранилищу, которое получает авторский код; при собственном прикладном хранилище отчётный setter мог бы читать другое место.

  6. Метаданные → Отчёты: создайте собственный УчебныеЛокальныеВарианты85. ОсновнаяСхемаКомпоновкиДанных в метаданных не нужна: полный модуль строит собственную схему в памяти и присваивает реальному ОтчетОбъект.СхемаКомпоновкиДанных. Никаких таблиц базы и внешних наборов нет.

  7. В УчебныеЛокальныеВарианты85 → Формы создайте управляемую форму отчёта ЛокальныйПорядок85 типа Основная. Не обычную форму. Укажите её основной формой отчёта.

  8. Основной реквизит формы Отчет — ОтчетОбъект.УчебныеЛокальныеВарианты85, флаг Основной. Реквизит Результат — ТабличныйДокумент. Элемент ПолеРезультата — поле табличного документа, ПутьКДанным = Результат. Имена собственные, не предполагаются имена автоматически созданных элементов.

  9. Добавьте реквизиты формы СостояниеУрока (Строка неограниченная), МаршрутКомпоновки (Булево), СобытийДо и СобытийПосле (Число 9,0 неотрицательное). Счётчики относятся только к маршруту событий, не к строкам или числам отчёта. Добавьте поле состояния с ПутьКДанным = СостояниеУрока.

  10. В событиях именно формы назначьте ПриСозданииНаСервере → ПриСозданииНаСервере, ПриКомпоновкеРезультата → ПриКомпоновкеРезультата, ПослеКомпоновкиРезультата → ПослеКомпоновкиРезультата. Не создавайте эти обработчики в модуле объекта отчёта; его одноимённые события имеют другой контракт.

  11. Создайте собственные команды формы и кнопки с действиями: КраткийПервым → КраткийПервым; ВосстановитьПодробный → ВосстановитьПодробный. Все имена обработчиков приведены в основном полном модуле. Штатные произвольные кнопки сохранения/загрузки не используйте в этом опыте.

  12. Точное место основного блока: модуль управляемой формы Отчет.УчебныеЛокальныеВарианты85.Форма.ЛокальныйПорядок85. Замените только модуль своей новой формы целиком, не добавляйте неизвестные общие модули и helpers.

  13. Вся схема задаётся основным блоком: источник ИсточникПакетов85 типа Local, набор запроса Пакеты85 с АвтоЗаполнениеДоступныхПолей = Истина; Пакет (Строка), Количество (Число) и Сумма (Число) образуются константным запросом ПакетА/3/60, ПакетБ/1/20, ПакетВ/6/120. Детальные записи без промежуточных или общего итога. Поля выбора Подробно85: Пакет,Количество,Сумма; Кратко85: Пакет,Сумма.

  14. Не привязывайте пригодность схемы или числовую правильность результата к служебному флагу. ПослеКомпоновкиРезультата проверяет только actual тип параметра ТабличныйДокумент и маршрут штатной компоновки. Координаты вывода не предполагаются: полный состав реальных строк и значения читатель проверит в ПолеРезультата вручную.

  15. Добавьте реквизит КраткийПервый (Булево). Только модуль устанавливает его после успешной фактической проверки собственного порядка.

  16. Полный supporting-блок запуска вставьте в модуль управляемого приложения этой новой пустой конфигурации; ПриНачалеРаботыСистемы вызывает только Отчет.УчебныеЛокальныеВарианты85.Форма.ЛокальныйПорядок85. Для разных уроков запускайте соответствующий полный блок, не три обработчика одинакового имени сразу.

  17. После всех подготовок метаданных, реквизитов, событий, команд, полных модулей формы/пульта/управляемого приложения и прав роли автор стенда в конфигураторе сохраняет конфигурацию и выполняет Конфигурация → Обновить конфигурацию базы данных (F7). Подтвердите обновление именно новой учебной базы. Это действие автора стенда, а не требование административных прав у учебного пользователя. После F7 проверьте назначение роли ПакетыУчебные85 пользователю АвторВариантов85 и только затем запускайте собственный управляемый сеанс этим пользователем.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Попытка
    ПроверитьУчебнуюСреду();
    Если ЭтаФорма.ТипФормыОтчета <> ТипФормыОтчета.Основная Тогда
        ВызватьИсключение "Нужна собственная управляемая форма отчёта Основная";
    КонецЕсли;
    ЭтаФорма.РежимБлокировкиПриОткрытииОкна = РежимБлокировкиПриОткрытииОкнаФормы.НеБлокировать;
    ОбъектОтчета = ЭтаФорма.РеквизитФормыВЗначение("Отчет");
    ОбъектОтчета.СхемаКомпоновкиДанных = СоздатьСобственнуюСхему();
    ОбъектОтчета.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(ОбъектОтчета.СхемаКомпоновкиДанных));
    ОбъектОтчета.КомпоновщикНастроек.ЗагрузитьНастройки(ОбъектОтчета.СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
    ЭтаФорма.ЗначениеВРеквизитФормы(ОбъектОтчета, "Отчет");
    ЭтаФорма.СобытийДо = 0;
    ЭтаФорма.СобытийПосле = 0;
    ЭтаФорма.МаршрутКомпоновки = Ложь;
    ЭтаФорма.СостояниеУрока = "Собственная схема готова; числа и внешний вид не проверены";
    ПроверитьПорядок(ОбъектОтчета.СхемаКомпоновкиДанных, Ложь);
    ЭтаФорма.КраткийПервый = Ложь;
Исключение
    Отказ = Истина;
    ВызватьИсключение "Подготовка остановлена: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверитьУчебнуюСреду()
Если ИмяПользователя() <> "АвторВариантов85" Тогда
    ВызватьИсключение "Нужен отдельный новый именованный пользователь АвторВариантов85";
КонецЕсли;
Если КлиентскоеПриложение.ТекущийВариантИнтерфейса() <> ВариантИнтерфейсаКлиентскогоПриложения.Такси Тогда
    ВызватьИсключение "Нужен собственный толстый управляемый сеанс Такси";
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция СоздатьСобственнуюСхему()
Схема = Новый СхемаКомпоновкиДанных;
Источник = Схема.ИсточникиДанных.Добавить();
Источник.Имя = "ИсточникПакетов85";
Источник.ТипИсточникаДанных = "Local";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
Набор.Имя = "Пакеты85";
Набор.ИсточникДанных = Источник.Имя;
Набор.АвтоЗаполнениеДоступныхПолей = Истина;
Набор.Запрос = "ВЫБРАТЬ ""ПакетА"" КАК Пакет, 3 КАК Количество, 60 КАК Сумма
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""ПакетБ"", 1, 20
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""ПакетВ"", 6, 120";
Схема.ВариантыНастроек.Очистить();
Подробный = Схема.ВариантыНастроек.Добавить();
Подробный.Имя = "Подробно85";
Подробный.Представление = "Все три поля пакетов";
ЗаполнитьНастройки(Подробный.Настройки, "Пакет,Количество,Сумма");
Краткий = Схема.ВариантыНастроек.Добавить();
Краткий.Имя = "Кратко85";
Краткий.Представление = "Пакет и сумма";
ЗаполнитьНастройки(Краткий.Настройки, "Пакет,Сумма");
Возврат Схема;
КонецФункции

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

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

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

&НаСервереБезКонтекста
Процедура ПроверитьПорядок(Схема, КраткийПервый)
Варианты = Схема.ВариантыНастроек;
Если Варианты.Количество() <> 2 Тогда
    ВызватьИсключение "Собственная коллекция должна содержать ровно два варианта";
КонецЕсли;
Первый = Варианты.Получить(0);
Второй = Варианты.Получить(1);
Если Варианты.Индекс(Первый) <> 0 Или Варианты.Индекс(Второй) <> 1 Тогда
    ВызватьИсключение "Не совпали фактические индексы объектов";
КонецЕсли;
Если Первый.Имя <> ?(КраткийПервый, "Кратко85", "Подробно85") Или Второй.Имя <> ?(КраткийПервый, "Подробно85", "Кратко85") Тогда
    ВызватьИсключение "Не совпал полный порядок собственных вариантов";
КонецЕсли;
Если Первый.Представление <> ?(КраткийПервый, "Пакет и сумма", "Все три поля пакетов") Или Второй.Представление <> ?(КраткийПервый, "Все три поля пакетов", "Пакет и сумма") Тогда
    ВызватьИсключение "Изменились собственные представления вариантов";
КонецЕсли;
ПроверитьПолныйВыбор(Первый.Настройки, ?(КраткийПервый, "Пакет,Сумма", "Пакет,Количество,Сумма"));
ПроверитьПолныйВыбор(Второй.Настройки, ?(КраткийПервый, "Пакет,Количество,Сумма", "Пакет,Сумма"));
ПроверитьПолныйВыбор(Схема.НастройкиПоУмолчанию, ?(КраткийПервый, "Пакет,Сумма", "Пакет,Количество,Сумма"));
КонецПроцедуры

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

&НаКлиенте
Процедура КраткийПервым(Команда)
Попытка
    ПереставитьСобственныйВариант(Истина);
    СформироватьДляРучнойСверки();
Исключение
    ЭтаФорма.МаршрутКомпоновки = Ложь;
    ЭтаФорма.СостояниеУрока = "Перестановка или компоновка не подтверждена: " + ОписаниеОшибки();
КонецПопытки;
Сообщить(ЭтаФорма.СостояниеУрока);
КонецПроцедуры

&НаКлиенте
Процедура ВосстановитьПодробный(Команда)
Попытка
    ПереставитьСобственныйВариант(Ложь);
    СформироватьДляРучнойСверки();
Исключение
    ЭтаФорма.МаршрутКомпоновки = Ложь;
    ЭтаФорма.СостояниеУрока = "Восстановление или компоновка не подтверждены: " + ОписаниеОшибки();
КонецПопытки;
Сообщить(ЭтаФорма.СостояниеУрока);
КонецПроцедуры
Полный запуск собственного стенда

Модуль управляемого приложения новой конфигурации УчебныеВариантыПакетов85; событие ПриНачалеРаботыСистемы

Толстый клиент, управляемое приложение

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

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

  1. Подготовьте новую базу/пользователя и полную форму, вставьте её модуль и соответствующий запуск. Здесь выполнены только статические и модельные проверки, не запуск платформы.

  2. Запустите собственный толстый управляемый сеанс. Проверка исходного порядка требует ровно два реально созданных варианта: Подробно85 индекс0, Кратко85 индекс1; иной состав останавливает создание формы.

  3. Нажмите КраткийПервым. Код получает именно объект второго варианта и вызывает Сдвинуть(Перемещаемый,-1), не передаёт индекс вместо объекта.

  4. После переноса должны совпасть фактические индексы0/1, оба собственных имени/представления и оба полных выбора. НастройкиПоУмолчанию должны содержать Пакет,Сумма.

  5. В actual компоновщик загружается новая настройка первого варианта; его effective выбор проверяется полностью перед штатной компоновкой.

  6. В ПолеРезультата вручную проверьте все три детальные строки и ровно два выбранных поля: ПакетА/60, ПакетБ/20, ПакетВ/120. Порядок самих записей запросом не задан; сверяйте состав, не координаты.

  7. Нажмите ВосстановитьПодробный. Теперь второй объект Подробно85 перемещается на первое место, возвращаются исходные индексы, оба полных выбора и подробные настройки по умолчанию.

  8. В actual результате вручную проверьте состав ПакетА/3/60, ПакетБ/1/20, ПакетВ/6/120 и три выбранных поля. Повторный возврат не должен менять уже восстановленный порядок.

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

  1. Нет constructor ВариантНастроекКомпоновкиДанных: объекты получены только Добавить()/Получить().

  2. Readonly Настройки и НастройкиПоУмолчанию не переприсваиваются; изменяется собственная коллекция и содержимое своего объекта настроек.

  3. Сдвинуть использует VariantObject и числовое смещение, затем реальные Индекс и Получить подтверждают полный порядок.

  4. Флаг маршрута требует actual события и ТабличныйДокумент, но не доказывает реальные значения; визуальные и числовые результаты — ручные.

  5. Оба обратных действия проверяют исходный состав собственных настроек, не предполагают начальные элементы конструктора схемы.

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

Будущий успешный опыт: краткий объект стал первым, изменился default и effective выбор; подробный порядок затем восстановлен. Два actual вывода сверены вручную. Сейчас runtime0.

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

  1. Очистить применяется только к ВариантыНастроек новой схемы в памяти, не к внутреннему хранилищу и не к чужим сохранённым вариантам.

  2. Не присваивайте readonly Вариант.Настройки или Схема.НастройкиПоУмолчанию.

  3. Это не УстановитьТекущийВариант: локальный объект и его имя не являются ключом записи отчётного хранилища.

  4. Нельзя заменить Сдвинуть объектом на выдуманный overload с индексом.

  5. Схема не задаёт числового итога или порядка детальных записей; общий итог200 здесь не обещается.

  6. Служебные проверки состава и событий не являются доказательством actual чисел или отображения.

  7. Платформа может внутренне сохранять состояние формы; отсутствие явного Save в первом опыте не означает отсутствия всех внутренних операций.

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

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

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

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

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