Порядок строк и элементов в 1С: перетаскивание, сортировка и код
Содержание
Строку табличной части в 1С 8.3 двигают стрелками «Переместить вверх» и «Переместить вниз» в командной панели таблицы или перетаскивают мышью. Элемент справочника так не сдвинешь: у него нет физической позиции. Порядок в списке справочника или журнале документов задаёт только сортировка, а её меняют кликом по заголовку колонки или в настройке списка на вкладке «Порядок».
Отсюда главная путаница. Пользователь видит в одном окне стрелки, а в другом их нет, и решает, что программа сломалась. На деле всё зависит от того, что за список перед вами. Если нужен свой порядок элементов справочника, «как я хочу», его делают отдельным числовым реквизитом. Ниже разобраны все три случая и код для разработчика.
Почему в одних списках позиция меняется, а в других нет
В 1С 8.3 под словом «список» прячутся разные вещи. От типа зависит, можно ли вообще установить позицию элемента.
| Что перед вами | Есть ли позиция | Чем меняется порядок |
|---|---|---|
| Табличная часть документа (товары, услуги, сотрудники) | Да, у каждой строки есть номер N | Стрелки, перетаскивание, код |
| Список справочника, журнал документов | Нет, порядок вычисляется при каждом показе | Сортировка по колонке или реквизиту |
| Список с реквизитом порядка (виды контактной информации, дополнительные реквизиты в типовых) | Условная, это число в реквизите | Стрелки, которые меняют числа местами |
| Список значений, таблица значений в коде | Да, по индексу | Методы Сдвинуть, Вставить |
Список справочника в управляемой форме строится динамически. Программа делает запрос к базе и сортирует результат. Поэтому после перезапуска позиция элемента определяется только настройками порядка, а не тем, куда вы его «положили» раньше.
Номер строки табличной части пересчитывается сам. Сдвинули пятую строку на две позиции вверх — она станет третьей, а бывшие третья и четвёртая уедут на одну вниз.
Как переместить строку вверх или вниз в пользовательском режиме
Этот способ работает в табличных частях документов, справочников и обработок, если разработчик не запретил менять порядок строк.
Кнопками
- Откройте документ, например реализацию или поступление.
- Выделите строку в табличной части.
- Нажмите стрелку вверх или вниз в командной панели над таблицей. Если стрелок не видно, откройте меню
Ещёэтой таблицы: там есть командыПереместить вверхиПереместить вниз. - Повторите, пока строка не встанет на место.
- Запишите документ. Без записи новый порядок не сохранится.
В тонком клиенте для перемещения строк обычно работают сочетания Ctrl+Shift+↑ и Ctrl+Shift+↓. Точное сочетание для вашей формы видно в меню Ещё рядом с названием команды.
Перетаскиванием
Наведите курсор на строку, зажмите левую кнопку мыши и тащите вверх или вниз. Между строками появится полоса-индикатор, туда строка и встанет. Для длинной таблицы удобнее стрелки: при перетаскивании за край окна прокрутка идёт рывками.
Перенос элемента в другую группу
В иерархическом справочнике (номенклатура, контрагенты) «позиция» часто означает группу. Элемент перетаскивают мышью на нужную папку в дереве групп или выбирают в меню Ещё команду перемещения в группу. Внутри группы элементы всё равно встанут по сортировке.
Перенос номенклатуры между группами может поменять настройки, которые типовая конфигурация берёт от группы. Например, счета учёта, заданные для группы. Проверьте их после переноса.
Как настроить порядок через свойства списка
Для журнала документов или списка справочника «установить позицию» значит выбрать сортировку. Есть два уровня.
Быстро: клик по заголовку колонки
Щёлкните по заголовку колонки «Наименование», «Дата» или «Код». Первый клик сортирует по возрастанию, второй — по убыванию. Возле заголовка появится треугольник-указатель. Программа запоминает выбор для вашего пользователя и этой формы.
Подробно: вкладка «Порядок» в настройке списка
- В списке откройте меню
Ещёи выберите команду настройки списка. - Перейдите на вкладку «Порядок».
- Слева выберите поле, перенесите его вправо кнопкой со стрелкой или двойным щелчком.
- Задайте направление: по возрастанию или по убыванию.
- Добавьте второе поле, если нужно сортировать сначала по одному, потом по другому. Например, сначала по группе, потом по наименованию.
- Нажмите «Завершить редактирование».
Порядок полей на вкладке важен: верхнее поле главное. Если на первом месте «Дата», а на втором «Номер», документы одного дня выстроятся по номеру.
Приём «через код»
Когда нужен постоянный порядок, а реквизита для него нет, многие сортируют по коду. Справочнику с ручным вводом кода присваивают значения 010, 020, 030 с шагом 10. Новый элемент между вторым и третьим получает 025, и ничего перенумеровывать не надо.
| Способ | Когда подходит | Минус |
|---|---|---|
| Клик по колонке | Разово найти элемент | Только по одной колонке |
| Вкладка «Порядок» | Постоянная сортировка для себя | Действует только у вашего пользователя |
| Сортировка по коду с шагом | Небольшой справочник, свой порядок без доработки | Нужен ручной код, легко сбить при обмене |
| Реквизит порядка | Порядок общий для всех пользователей | Нужна доработка конфигурации |
Программная установка позиции в коде 1С
Разработчику под «установить позицию» приходится решать две разные задачи: сдвинуть элемент в коллекции или поставить курсор на нужную строку.
Сдвинуть строку в коллекции
У таблицы значений, табличной части объекта и списка значений есть метод Сдвинуть. Отрицательное смещение двигает вверх, положительное — вниз.
// Таблица значений: поднять третью строку на одну позицию
Строка = ТаблицаТоваров[2];
ТаблицаТоваров.Сдвинуть(Строка, -1);
// Список значений: опустить первый элемент на две позиции
Элемент = СписокВидов[0];
СписокВидов.Сдвинуть(Элемент, 2);
В управляемой форме табличная часть объекта — это коллекция данных формы. Её метод Сдвинуть принимает индекс строки и смещение:
&НаКлиенте
Процедура ПоднятьСтроку(Команда)
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Индекс = Объект.Товары.Индекс(ТекущиеДанные);
Если Индекс > 0 Тогда
Объект.Товары.Сдвинуть(Индекс, -1);
Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры
Проверка Индекс > 0 нужна: сдвинуть первую строку выше некуда, платформа выдаст ошибку.
Новую строку сразу в нужное место ставят методом Вставить(Индекс) вместо Добавить(). Объект.Товары.Вставить(0) создаст строку в самом верху.
Поставить курсор на нужную строку
Текущую строку таблицы формы задают свойством ТекущаяСтрока. Для табличной части в него пишут идентификатор строки:
&НаКлиенте
Процедура ПерейтиКСтроке(Индекс)
Строка = Объект.Товары[Индекс];
Элементы.Товары.ТекущаяСтрока = Строка.ПолучитьИдентификатор();
КонецПроцедуры
В динамическом списке справочника ключ строки — ссылка: Элементы.Список.ТекущаяСтрока = НужнаяСсылка;. Чтобы форма списка открылась сразу на нужном элементе, передайте параметр при открытии:
ПараметрыФормы = Новый Структура("ТекущаяСтрока", НужнаяСсылка);
ОткрытьФорму("Справочник.Номенклатура.ФормаСписка", ПараметрыФормы);
Задать порядок динамического списка
Сортировку списка в форме можно задать из кода через свойство Порядок динамического списка:
&НаСервере
Процедура УстановитьПорядокСписка()
Список.Порядок.Элементы.Очистить();
ЭлементПорядка = Список.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("Наименование");
ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр;
ЭлементПорядка.Использование = Истина;
КонецПроцедуры
Вызывают такую процедуру обычно из ПриСозданииНаСервере. Пользовательская сортировка кликом по колонке всё равно останется доступной.
Реквизит порядка: как сделать свой порядок элементов справочника
Если порядок элементов должен быть одинаковым у всех пользователей, без числового реквизита не обойтись. В типовых конфигурациях на Библиотеке стандартных подсистем для этого есть подсистема «Настройка порядка элементов». Она добавляет справочнику реквизит РеквизитДопУпорядочивания и команды «Переместить вверх» и «Переместить вниз».
В своей конфигурации или расширении схема такая:
- Добавьте справочнику реквизит «Порядок», тип «Число», без дробной части.
- В форме списка задайте сортировку по этому реквизиту.
- При записи нового элемента присвойте ему максимальное значение плюс один.
- Добавьте в форму списка две команды, которые меняют значения «Порядок» у текущего и соседнего элемента.
Код для пункта 3 в модуле объекта:
Процедура ПередЗаписью(Отказ)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если ЭтоНовый() И Порядок = 0 Тогда
Запрос = Новый Запрос(
"ВЫБРАТЬ ЕСТЬNULL(МАКСИМУМ(Т.Порядок), 0) + 1 КАК Порядок
|ИЗ Справочник.ВидыРабот КАК Т");
Порядок = Запрос.Выполнить().Выгрузить()[0].Порядок;
КонецЕсли;
КонецПроцедуры
Функция ЕСТЬNULL нужна для пустого справочника: МАКСИМУМ по пустой таблице вернёт NULL, и первый элемент получит номер 1.
Обмен значениями двух соседей делайте в одной транзакции, чтобы при ошибке записи не получить два элемента с одинаковым номером:
&НаСервере
Процедура ПоменятьМестами(СсылкаА, СсылкаБ)
НачатьТранзакцию();
Попытка
ОбъектА = СсылкаА.ПолучитьОбъект();
ОбъектБ = СсылкаБ.ПолучитьОбъект();
Временно = ОбъектА.Порядок;
ОбъектА.Порядок = ОбъектБ.Порядок;
ОбъектБ.Порядок = Временно;
ОбъектА.Записать();
ОбъектБ.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
После вызова обновите список на клиенте: Элементы.Список.Обновить();.
Доработку справочника в типовой конфигурации делайте расширением, а не правкой основной конфигурации. Иначе каждое обновление превратится в сравнение и объединение. Перед загрузкой расширения в рабочую базу сделайте резервную копию.
Особенности веб-клиента, тонкого и толстого клиента
Тонкий клиент и веб-клиент работают с одними и теми же управляемыми формами. Стрелки, команды меню Ещё и настройка списка там одинаковые. Разница в мелочах.
- 🌐 Веб-клиент. Часть сочетаний клавиш перехватывает браузер. Если
Ctrl+Shift+↑не срабатывает, пользуйтесь стрелками в командной панели. - 🖱️ Перетаскивание в браузере. Работает, но при медленном соединении индикатор места вставки появляется с задержкой. Не отпускайте кнопку мыши раньше времени, иначе строка встанет не туда.
- 🔄 Задержка обновления. В веб-клиенте после команд, меняющих реквизит порядка, список иногда показывает старую картину до обновления. Нажмите
F5, стоя в списке. - 🗂️ Толстый клиент с обычными формами. В старых конфигурациях на обычных формах свойства и методы табличного поля другие. Управляемые формы и код выше рассчитаны на тонкий клиент и интерфейс «Такси».
Сохранённая сортировка списка привязана к пользователю, а не к компьютеру. Выбрали порядок в тонком клиенте — тот же порядок увидите в браузере под своим логином.
Почему позиция не меняется: частые ошибки
Ещё одна ловушка — сброс настроек. В меню Ещё формы настройки списка есть команда возврата к стандартным настройкам. Она стирает и отборы, и вашу сортировку, так что пользуйтесь ей осознанно.
Если стрелки в табличной части пропали только у одного пользователя, проверьте его права. Без права на изменение документа команды редактирования, включая перемещение строк, недоступны.