Разработка и Конфигурация · 9 мин
Как поменять строки местами в 1С
Как поменять строки местами в 1С: перемещение строк в табличной части документа, методы Сдвинуть и индексы в таблице значений, типовые ошибки и проверка результата.
Задача поменять строки местами в 1С возникает в двух разных ситуациях. Первая — пользовательская: нужно изменить порядок строк в табличной части документа, например переставить позиции номенклатуры в счёте или акте. Вторая — программная: разработчик обрабатывает таблицу значений или табличную часть в модуле и должен переставить строки кодом. Подходы в этих случаях принципиально различаются.
В пользовательском режиме порядок строк обычно меняют перетаскиванием мышью, кнопками перемещения вверх/вниз или сортировкой по колонке. Встроенной команды «поменять две строки местами» в типовом интерфейсе нет — перестановка выполняется последовательными сдвигами. В коде же доступен метод Сдвинуть(), а для прямого обмена двух строк применяют обмен значениями через временную переменную.
Важно понимать, что нумерация строк в табличных частях документов пересчитывается автоматически, а в таблицах значений порядок определяется индексами от нуля до количества минус один. Ошибка с индексами — самая частая причина неработающего кода перестановки.
Как переставить строки в табличной части документа без программирования
В управляемых формах типовых конфигураций (1С:Бухгалтерия, 1С:Управление торговлей, 1С:ERP) табличная часть документа поддерживает перетаскивание строк мышью. Нажмите левую кнопку на строке и, удерживая её, перетащите строку на нужную позицию — между соседними строками появится горизонтальная линия-индикатор вставки. После отпускания кнопки строка займёт новое место, а нумерация пересчитается автоматически.
Если перетаскивание неудобно или отключено в форме, используйте команды перемещения. Выделите строку, затем в меню «Ещё» табличной части найдите пункты «Переместить вверх» и «Переместить вниз». В некоторых конфигурациях для этого работают сочетания клавиш Ctrl+Shift+стрелка вверх/вниз. Чтобы поменять местами две соседние строки, достаточно один раз сдвинуть верхнюю вниз или нижнюю вверх.
Для перестановки строк, находящихся далеко друг от друга, потребуется несколько сдвигов. Альтернатива — сортировка: щелчок по заголовку колонки упорядочит строки по значению этой колонки, а команда сортировки по нескольким полям доступна через меню «Ещё». Это удобно, когда нужен не ручной порядок, а упорядочивание по сумме, наименованию или артикулу.
- 1Откройте документ и перейдите к нужной табличной части
- 2Выделите верхнюю из двух строк щелчком мыши
- 3Нажмите «Ещё» → «Переместить вниз» или перетащите строку ниже соседней
- 4Проверьте, что нумерация строк пересчиталась корректно
- 5Запишите документ, чтобы сохранить новый порядок
Ограничения пользовательского способа
Не во всех формах перемещение строк доступно. Если табличная часть открыта в режиме просмотра, документ проведён и запрещено его изменение, либо у пользователя нет прав на редактирование, команды перемещения будут неактивны. В этом случае сначала отмените проведение документа или откройте его на редактирование.
Учтите, что порядок строк табличной части сохраняется в базе данных и влияет на печатные формы. Если в печатной форме позиции выводятся в порядке строк, перестановка изменит и внешний вид документа на бумаге. Перед изменением порядка в проведённых документах, по которым уже выданы бумажные копии, оцените последствия.
Программное перемещение строки методом Сдвинуть
Для табличных частей и таблиц значений встроенный язык 1С предоставляет метод Сдвинуть(Строка, Смещение). Первый параметр — строка (или её индекс), которую нужно переместить, второй — на сколько позиций сместить: положительное число двигает вниз, отрицательное — вверх. Метод работает и для табличных частей документов, и для таблиц значений.
Пример: сдвинуть первую строку табличной части на две позиции вниз.
ТабЧасть = Объект.Товары;
ТабЧасть.Сдвинуть(0, 2); // строка с индексом 0 переместится на индекс 2Чтобы поменять местами две соседние строки, достаточно сдвинуть одну из них на единицу: ТабЧасть.Сдвинуть(ИндексСтроки, 1) опустит строку на одну позицию, фактически обменяв её с нижележащей. Это самый короткий способ обмена соседних строк без временных переменных.
При работе с методом следите за границами: сдвиг за пределы таблицы (например, последнюю строку вниз) не выполнится или приведёт к ошибке в зависимости от контекста. Перед вызовом проверяйте, что целевой индекс остаётся в диапазоне от 0 до Количество() - 1.
Обмен двух произвольных строк местами в коде
Метод Сдвинуть() неудобен, когда строки находятся далеко друг от друга и нужен именно обмен, а не смещение со сдвигом всех промежуточных строк. В этом случае применяют классический приём с временной переменной: значения колонок первой строки сохраняют, копируют в неё значения второй, затем записывают сохранённые данные во вторую.
Для копирования значений между строками одной таблицы используют ЗаполнитьЗначенияСвойств():
Строка1 = ТЗ[Индекс1];
Строка2 = ТЗ[Индекс2];
Копия = ТЗ.Добавить();
ЗаполнитьЗначенияСвойств(Копия, Строка1);
ЗаполнитьЗначенияСвойств(Строка1, Строка2);
ЗаполнитьЗначенияСвойств(Строка2, Копия);
ТЗ.Удалить(Копия);Здесь временная строка добавляется в конец таблицы, служит хранилищем значений и удаляется после обмена. Такой подход корректно работает и для таблиц значений, и для табличных частей. Альтернатива — перестроить порядок через сортировку: ТЗ.Сортировать("Колонка Убыв"), если обмен нужен не точечный, а по правилу.
Особенности работы с динамическими списками и запросами
В динамических списках (журналы документов, списки справочников) произвольно переставить строки нельзя — порядок определяется запросом и настройкой сортировки. Пользователь может изменить её через «Ещё» → «Настроить список» → «Сортировка», добавив нужные поля и направление. Ручное перетаскивание в динамическом списке не поддерживается.
Если порядок строк должен задаваться пользователем и сохраняться (например, порядок разделов в отчёте), в конфигурации для этого создают реквизит «Порядок» или «НомерСтрокиПорядка» и сортируют по нему. Перестановка реализуется обменом значений этого реквизита у двух элементов, а не физическим перемещением строк.
Как проверить результат перестановки
Контрольные точки после перестановки
Номера идут последовательно с 1 без пропусков
Номера дублируются или порядок визуально не изменился
Позиции выводятся в новом порядке
Порядок на печати старый — документ не записан
Суммы и количество не изменились
Итоги изменились — возможно, строка была удалена, а не перемещена
Строки заняли ожидаемые индексы
Ошибка «Индекс находится за границами массива»
После ручной перестановки обязательно запишите документ и заново сформируйте печатную форму — это самый надёжный способ убедиться, что порядок сохранился. После программного обмена выведите содержимое таблицы в сообщение или проверьте значения ключевых колонок по целевым индексам.
Типичные ошибки при перестановке строк
Отдельная группа проблем — попытка переставить строки в форме, где табличная часть отображается с отбором или сортировкой, заданной разработчиком. В этом случае визуальный порядок не совпадает с физическим, и команды перемещения могут работать непредсказуемо. Снимите отбор и сортировку перед ручной перестановкой.
Что важно запомнить
В интерфейсе строки переставляют перетаскиванием или командами «Переместить вверх/вниз», в коде — методом Сдвинуть() или обменом значений через временную строку. Индексы в коде начинаются с нуля. После перестановки записывайте документ и проверяйте печатную форму и итоги.
Частые вопросы
Можно ли поменять строки местами в проведённом документе?
Да, если у вас есть права на изменение проведённых документов. Откройте документ, переставьте строки и перепроведите его. Учтите, что перепроведение может изменить движения по регистрам, поэтому для документов закрытых периодов действуйте осторожно.
Почему кнопки «Переместить вверх/вниз» неактивны?
Чаще всего документ открыт в режиме просмотра, для табличной части задана сортировка или отбор, либо у пользователя нет прав на редактирование. Откройте документ на изменение и снимите сортировку через меню «Ещё» табличной части.
Как переставить строки в таблице значений на форме обработки?
Если речь о таблице на форме — добавьте в её контекстное меню команды перемещения и в их обработчиках вызовите метод Сдвинуть() для текущей строки. Программно вне формы используйте Сдвинуть() или обмен значений через ЗаполнитьЗначенияСвойств.
Меняется ли нумерация строк при перетаскивании?
Да, реквизит «НомерСтроки» табличной части пересчитывается автоматически после перемещения и записи объекта. Вручную править номера строк не требуется и не рекомендуется.
Как отсортировать строки по нескольким колонкам?
В интерфейсе — через «Ещё» → «Сортировать» с добавлением нескольких полей и направлений. В коде — методом Сортировать с перечислением колонок через запятую, например: ТЗ.Сортировать("Дата Возр, Сумма Убыв").
Что делать, если после обмена строк сломались связанные данные?
Если табличная часть связана с другой через реквизит «КлючСвязи», при обмене значений ключи остаются у старых строк. После перестановки синхронизируйте значения ключей связи или перестраивайте строки целиком, а не копированием значений колонок.