Перемещает элемент в коллекции.
Синтаксис
Сдвинуть(<Элемент>, <Смещение>)Полное описание, параметры и ограничения
ВариантыНастроекКомпоновкиДанных.Сдвинуть (DataCompositionSettingsVariants.Move)
ВариантыНастроекКомпоновкиДанных (DataCompositionSettingsVariants)
Сдвинуть (Move)
Доступен, начиная с версии 8.2.
Синтаксис:
Сдвинуть(<Элемент>, <Смещение>)
Параметры:
<Элемент> (обязательный)
Тип: ВариантНастроекКомпоновкиДанных.
Перемещаемый элемент.
<Смещение> (обязательный)
Тип: Число.
Смещение элемента в коллекции.
Описание:
Перемещает элемент в коллекции.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Два локальных варианта: Сдвинуть объектом, получить новый первый и восстановить
Собственная схема пакетов создаёт Подробно85 и Кратко85, а не использует сохранённые UUID. НастройкиПоУмолчанию по native принадлежат первому варианту. На сервере переносится настоящий ВариантНастроекКомпоновкиДанных; фактические индексы, имена, представления и полный выбор проверяются до загрузки в реальный отчёт. Затем возвращается именно исходный собственный порядок. Числа и внешний вид результата проверяются отдельно вручную; запуск 1С не выполнен.
Где и как запускать
Смешанный управляемый: толстый клиент 8.5.1.1343 Такси и сервер
Подготовка
Только будущий ручной опыт: создайте совершенно новую пустую учебную информационную базу. Здесь 1С и BSL не запускались; runtime-проверок 0. Не переносите урок в рабочую конфигурацию.
В конфигураторе имя собственной конфигурации задайте УчебныеВариантыПакетов85; основное приложение — управляемое, Режим совместимости — Не использовать. Запуск: толстый клиент в режиме управляемого приложения, установленная платформа ровно 8.5.1.1343, интерфейс Такси, обычный режим основного окна. Обычный режим основного окна не означает обычное приложение: приложение остаётся управляемым. Проверки версии/имени/интерфейса не доказывают, каким исполняемым клиентом был запущен сеанс: проверьте способ запуска вручную.
Создайте нового отдельного пользователя АвторВариантов85 только в этой новой базе. Не переименовывайте и не используйте рабочего пользователя. Сеанс всегда запускайте им: guard проверяет точное ИмяПользователя().
Создайте собственную роль ПакетыУчебные85: доступ только к своему отчёту УчебныеЛокальныеВарианты85, его собственной форме, просмотр/использование форм. В правах корня конфигурации включите ТолстыйКлиент (ThickClient), РежимОсновногоОкнаОбычный (MainWindowModeNormal) и СохранениеДанныхПользователя (SaveUserData). После обновления конфигурации базы данных назначьте эту роль новому пользователю АвторВариантов85. Не выдавайте учебному пользователю Администрирование, АдминистрированиеДанных или ОбновлениеКонфигурацииБазыДанных. Отчёт не требует чтения или записи предметных объектов; локальный запрос состоит только из трёх константных строк.
У конфигурации свойства ХранилищеВариантовОтчетов и ХранилищеПользовательскихНастроекОтчетов оставьте незаданными. Это необходимое соответствие стандартному внутреннему хранилищу, которое получает авторский код; при собственном прикладном хранилище отчётный setter мог бы читать другое место.
Метаданные → Отчёты: создайте собственный УчебныеЛокальныеВарианты85. ОсновнаяСхемаКомпоновкиДанных в метаданных не нужна: полный модуль строит собственную схему в памяти и присваивает реальному ОтчетОбъект.СхемаКомпоновкиДанных. Никаких таблиц базы и внешних наборов нет.
В УчебныеЛокальныеВарианты85 → Формы создайте управляемую форму отчёта ЛокальныйПорядок85 типа Основная. Не обычную форму. Укажите её основной формой отчёта.
Основной реквизит формы Отчет — ОтчетОбъект.УчебныеЛокальныеВарианты85, флаг Основной. Реквизит Результат — ТабличныйДокумент. Элемент ПолеРезультата — поле табличного документа, ПутьКДанным = Результат. Имена собственные, не предполагаются имена автоматически созданных элементов.
Добавьте реквизиты формы СостояниеУрока (Строка неограниченная), МаршрутКомпоновки (Булево), СобытийДо и СобытийПосле (Число 9,0 неотрицательное). Счётчики относятся только к маршруту событий, не к строкам или числам отчёта. Добавьте поле состояния с ПутьКДанным = СостояниеУрока.
В событиях именно формы назначьте ПриСозданииНаСервере → ПриСозданииНаСервере, ПриКомпоновкеРезультата → ПриКомпоновкеРезультата, ПослеКомпоновкиРезультата → ПослеКомпоновкиРезультата. Не создавайте эти обработчики в модуле объекта отчёта; его одноимённые события имеют другой контракт.
Создайте собственные команды формы и кнопки с действиями: КраткийПервым → КраткийПервым; ВосстановитьПодробный → ВосстановитьПодробный. Все имена обработчиков приведены в основном полном модуле. Штатные произвольные кнопки сохранения/загрузки не используйте в этом опыте.
Точное место основного блока: модуль управляемой формы Отчет.УчебныеЛокальныеВарианты85.Форма.ЛокальныйПорядок85. Замените только модуль своей новой формы целиком, не добавляйте неизвестные общие модули и helpers.
Вся схема задаётся основным блоком: источник ИсточникПакетов85 типа Local, набор запроса Пакеты85 с АвтоЗаполнениеДоступныхПолей = Истина; Пакет (Строка), Количество (Число) и Сумма (Число) образуются константным запросом ПакетА/3/60, ПакетБ/1/20, ПакетВ/6/120. Детальные записи без промежуточных или общего итога. Поля выбора Подробно85: Пакет,Количество,Сумма; Кратко85: Пакет,Сумма.
Не привязывайте пригодность схемы или числовую правильность результата к служебному флагу. ПослеКомпоновкиРезультата проверяет только actual тип параметра ТабличныйДокумент и маршрут штатной компоновки. Координаты вывода не предполагаются: полный состав реальных строк и значения читатель проверит в ПолеРезультата вручную.
Добавьте реквизит КраткийПервый (Булево). Только модуль устанавливает его после успешной фактической проверки собственного порядка.
Полный supporting-блок запуска вставьте в модуль управляемого приложения этой новой пустой конфигурации; ПриНачалеРаботыСистемы вызывает только Отчет.УчебныеЛокальныеВарианты85.Форма.ЛокальныйПорядок85. Для разных уроков запускайте соответствующий полный блок, не три обработчика одинакового имени сразу.
После всех подготовок метаданных, реквизитов, событий, команд, полных модулей формы/пульта/управляемого приложения и прав роли автор стенда в конфигураторе сохраняет конфигурацию и выполняет Конфигурация → Обновить конфигурацию базы данных (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", , , Новый УникальныйИдентификатор);
КонецПроцедурыРазбор по шагам
Подготовьте новую базу/пользователя и полную форму, вставьте её модуль и соответствующий запуск. Здесь выполнены только статические и модельные проверки, не запуск платформы.
Запустите собственный толстый управляемый сеанс. Проверка исходного порядка требует ровно два реально созданных варианта: Подробно85 индекс0, Кратко85 индекс1; иной состав останавливает создание формы.
Нажмите КраткийПервым. Код получает именно объект второго варианта и вызывает Сдвинуть(Перемещаемый,-1), не передаёт индекс вместо объекта.
После переноса должны совпасть фактические индексы0/1, оба собственных имени/представления и оба полных выбора. НастройкиПоУмолчанию должны содержать Пакет,Сумма.
В actual компоновщик загружается новая настройка первого варианта; его effective выбор проверяется полностью перед штатной компоновкой.
В ПолеРезультата вручную проверьте все три детальные строки и ровно два выбранных поля: ПакетА/60, ПакетБ/20, ПакетВ/120. Порядок самих записей запросом не задан; сверяйте состав, не координаты.
Нажмите ВосстановитьПодробный. Теперь второй объект Подробно85 перемещается на первое место, возвращаются исходные индексы, оба полных выбора и подробные настройки по умолчанию.
В actual результате вручную проверьте состав ПакетА/3/60, ПакетБ/1/20, ПакетВ/6/120 и три выбранных поля. Повторный возврат не должен менять уже восстановленный порядок.
Как проверить результат
Нет constructor ВариантНастроекКомпоновкиДанных: объекты получены только Добавить()/Получить().
Readonly Настройки и НастройкиПоУмолчанию не переприсваиваются; изменяется собственная коллекция и содержимое своего объекта настроек.
Сдвинуть использует VariantObject и числовое смещение, затем реальные Индекс и Получить подтверждают полный порядок.
Флаг маршрута требует actual события и ТабличныйДокумент, но не доказывает реальные значения; визуальные и числовые результаты — ручные.
Оба обратных действия проверяют исходный состав собственных настроек, не предполагают начальные элементы конструктора схемы.
Ожидаемый результат
Будущий успешный опыт: краткий объект стал первым, изменился default и effective выбор; подробный порядок затем восстановлен. Два actual вывода сверены вручную. Сейчас runtime0.
На что обратить внимание
Очистить применяется только к ВариантыНастроек новой схемы в памяти, не к внутреннему хранилищу и не к чужим сохранённым вариантам.
Не присваивайте readonly Вариант.Настройки или Схема.НастройкиПоУмолчанию.
Это не УстановитьТекущийВариант: локальный объект и его имя не являются ключом записи отчётного хранилища.
Нельзя заменить Сдвинуть объектом на выдуманный overload с индексом.
Схема не задаёт числового итога или порядка детальных записей; общий итог200 здесь не обещается.
Служебные проверки состава и событий не являются доказательством actual чисел или отображения.
Платформа может внутренне сохранять состояние формы; отсутствие явного Save в первом опыте не означает отсутствия всех внутренних операций.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.