Перемещение строк в табличных частях 1С:Предприятие — одна из самых частых задач при работе с документами, справочниками и регистрами. Казалось бы, что может быть проще: взял строку мышкой и перетащил. Но на практике пользователи сталкиваются с ограничениями интерфейса, ошибками при сохранении или необходимостью автоматизировать процесс через код. Эта статья охватывает все возможные способы перемещения строк — от стандартных средств платформы до программных решений на встроенном языке.
Мы разберём не только базовые приёмы вроде Drag-and-Drop, но и нюансы работы с управляемыми формами, ограничения в тонком клиенте, а также приведём готовые процедуры для перемещения строк через 1С:Enterprise и 1С:Script. Особое внимание уделим типичным ошибкам, из-за которых строки "не хотят" сохраняться в новом порядке, и способам их обхода.
Статья будет полезна и начинающим пользователям, которые хотят понять, почему в их базе не работает перетаскивание, и опытным разработчикам, которым нужно реализовать нестандартную логику сортировки строк в документах или справочниках.
1. Стандартное перемещение строк мышью (Drag-and-Drop)
Самый интуитивный способ — перетаскивание строк мышью. Он работает в большинстве конфигураций на базе 1С 8.3 (включая УТ 11, ERP 2, БП 3.0), но имеет ряд ограничений:
- 🖱️ Работает только в толстом клиенте и веб-клиенте (в тонком клиенте может быть отключено).
- 📄 Не поддерживается в
Таблица значенийна управляемых формах без дополнительной настройки. - 🔒 Требует прав на редактирование документа/справочника.
- ⚡ После перетаскивания необходимо сохранить объект, иначе порядок строк сбросится.
Чтобы переместить строку:
- Откройте документ или справочник с табличной частью.
- Наведите курсор на строку, которую нужно переместить — он должен превратиться в крестик ➕.
- Зажмите левую кнопку мыши и перетащите строку в нужное место.
- Отпустите кнопку — строка встанет на новое место, а нумерация обновится автоматически.
Если Drag-and-Drop не работает, проверьте настройки формы: в конфигураторе откройте свойства табличного поля и убедитесь, что флаг Разрешить перетаскивание строк установлен.
⚠️ Внимание: В некоторых конфигурациях (например, ЗУП 3.1) перетаскивание строк в документах типа "Приказ о приёме" может приводить к сбою нумерации. Перед использованием проверьте поведение на тестовой базе.
2. Перемещение строк через контекстное меню
Если Drag-and-Drop по какой-то причине недоступен (например, в тонком клиенте или на мобильном устройстве), можно использовать контекстное меню табличной части. Этот метод работает во всех типах клиентов и не требует прав администратора.
Инструкция:
- Щёлкните правой кнопкой мыши по строке, которую нужно переместить.
- В контекстном меню выберите
Переместить вверхилиПереместить вниз. - Повторяйте действие, пока строка не займёт нужную позицию.
Преимущества метода:
- 🔧 Работает даже при отключённом Drag-and-Drop.
- 📱 Поддерживается на планшетах и сенсорных экранах.
- 🛡️ Меньше риск случайно "сбросить" порядок строк (в отличие от мыши).
Недостатки:
- ⏳ Медленно, если нужно переместить строку на несколько десятков позиций.
- 🚫 Не позволяет перемещать строки в произвольное место (только на 1 позицию вверх/вниз).
3. Горячие клавиши для быстрого перемещения
Для ускорения работы можно использовать комбинации клавиш. Они особенно полезны при работе с большими табличными частями (например, в документе "Реализация товаров и услуг" с сотнями строк).
| Действие | Горячие клавиши (Windows) | Горячие клавиши (macOS/Linux) |
|---|---|---|
| Переместить строку вверх | Alt + ↑ |
Option + ↑ |
| Переместить строку вниз | Alt + ↓ |
Option + ↓ |
| Переместить строку в начало списка | Alt + Home |
Option + Fn + ← |
| Переместить строку в конец списка | Alt + End |
Option + Fn + → |
Если горячие клавиши не работают:
- 🔄 Проверьте, не конфликтуют ли они с клавишами вашей ОС или клавиатуры.
- 🛠️ В конфигураторе откройте свойства формы и убедитесь, что флаг
Использовать горячие клавишивключён. - 📋 В некоторых конфигурациях (например, 1С:Розница) эти комбинации могут быть переопределены.
Почему не работают горячие клавиши в тонком клиенте?
В тонком клиенте часть функций, включая горячие клавиши для перемещения строк, может быть ограничена настройками сервера 1С:Предприятие. Это связано с тем, что тонкий клиент передаёт обработку событий на сервер, где некоторые действия блокируются по умолчанию. Чтобы включить поддержку, администратору нужно в файле 1cv8srv.conf (или через консоль администрирования сервера) добавить параметр EnableThinClientHotKeys=1 и перезапустить службу.
4. Программное перемещение строк на встроенном языке
Если нужно автоматизировать перемещение строк (например, при загрузке данных из Excel или после обработки документа), придётся писать код. Ниже приведён универсальный алгоритм, который работает с любой табличной частью.
Базовый пример для перемещения строки на одну позицию вверх:
Процедура ПереместитьСтрокуВверх(ТабличнаяЧасть, ИндексСтроки)
Если ИндексСтроки = 0 Тогда
Возврат; // Нельзя переместить первую строку выше
КонецЕсли;
// Сохраняем текущую строку во временную переменную
ТекущаяСтрока = ТабличнаяЧасть[ИндексСтроки];
// Удаляем строку из таблицы
ТабличнаяЧасть.Удалить(ИндексСтроки);
// Вставляем её на позицию выше
ТабличнаяЧасть.Вставить(ИндексСтроки - 1, ТекущаяСтрока);
КонецПроцедуры
Для перемещения на произвольную позицию используйте этот код:
Процедура ПереместитьСтрокуНаПозицию(ТабличнаяЧасть, ИндексСтроки, НоваяПозиция)
Если ИндексСтроки = НоваяПозиция Тогда
Возврат; // Ничего не делать, если позиция не изменилась
КонецЕсли;
ТекущаяСтрока = ТабличнаяЧасть[ИндексСтроки];
ТабличнаяЧасть.Удалить(ИндексСтроки);
Если НоваяПозиция > ИндексСтроки Тогда
ТабличнаяЧасть.Вставить(НоваяПозиция - 1, ТекущаяСтрока); // Корректировка индекса после удаления
Иначе
ТабличнаяЧасть.Вставить(НоваяПозиция, ТекущаяСтрока);
КонецЕсли;
КонецПроцедуры
Пример вызова для документа РеализацияТоваровУслуг:
Док = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("РТ-000123");
ПереместитьСтрокуНаПозицию(Док.Товары, 5, 2); // Перемещаем 6-ю строку на 3-ю позицию
Док.Записать();
⚠️ Внимание: При программном перемещении строк в управляемых формах после изменения табличной части обязательно вызывайте методОбновитьФорму(), иначе изменения могут не отобразиться на экране:ЭлементыФормы.ТабличнаяЧастьТоваров.ОбновитьФорму();
5. Перемещение строк в таблице значений
Таблица значений — это отдельный объект в 1С, который часто используется для временного хранения данных. Перемещение строк в нём имеет свои особенности, так как таблица значений не привязана к конкретному документу или справочнику.
Пример кода для перемещения строки в таблице значений:
Процедура ПереместитьСтрокуВТаблицеЗначений(ТЗ, ИндексСтроки, НоваяПозиция)
Если ИндексСтроки < 0 Или ИндексСтроки >= ТЗ.Количество() Тогда
Возврат; // Некорректный индекс
КонецЕсли;
Если НоваяПозиция < 0 Или НоваяПозиция >= ТЗ.Количество() Тогда
Возврат; // Некорректная новая позиция
КонецЕсли;
ТекущаяСтрока = ТЗ[ИндексСтроки];
ТЗ.Удалить(ИндексСтроки);
ТЗ.Вставить(НоваяПозиция, ТекущаяСтрока);
КонецПроцедуры
Особенности работы с таблицами значений:
- 🔄 После перемещения строки индексы остальных строк автоматически сдвигаются. Учитывайте это при массовых операциях.
- 📌 В отличие от табличных частей документов, таблица значений не сохраняется автоматически. Вам нужно вручную обновить источник данных.
- 🔍 Для отладки используйте метод
ТЗ.Вывести()— он покажет текущий порядок строк в отладочном окне.
Сделать резервную копию базы|Проверить права пользователя на редактирование|Убедиться, что документ не проведён (если нужно)|Отключить регламентные задания на время изменения|Протестировать код на копии базы-->
6. Перемещение строк в управляемых формах
В управляемых формах (которые используются в веб-клиенте и тонком клиенте) перемещение строк реализуется иначе, чем в обычных формах. Здесь нельзя просто взять и поменять порядок строк в табличной части — нужно учитывать особенности платформы.
Пример кода для управляемой формы:
Процедура ПереместитьСтрокуВверхНаУправляемойФорме(Команда)
ТабличнаяЧасть = ЭлементыФормы.Товары;
ТекущаяСтрока = ТабличнаяЧасть.ТекущаяСтрока;
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
Индекс = ТабличнаяЧасть.Индекс(ТекущаяСтрока);
Если Индекс = 0 Тогда
Возврат; // Первая строка — выше некуда
КонецЕсли;
// Получаем данные строки
ДанныеСтроки = ТекущаяСтрока.Ссылка.ПолучитьОбъект().Товары[Индекс];
// Меняем порядок в объекте
Объект = ТекущаяСтрока.Ссылка.ПолучитьОбъект();
Объект.Товары.Переместить(Индекс, Индекс - 1);
// Обновляем форму
ТабличнаяЧасть.ОбновитьФорму();
КонецПроцедуры
Ключевые моменты:
- 🔗 В управляемых формах
ТабличнаяЧастьна форме — это только представление данных. Сами данные хранятся в объекте (документе/справочнике). - 🔄 После изменения порядка строк обязательно вызывайте
ОбновитьФорму(), иначе пользователь не увидит изменений. - 📎 Для массового перемещения строк используйте метод
Переместить()у коллекции табличной части.
⚠️ Внимание: В 1С:ERP 2.5 и новее при перемещении строк в управляемых формах может срабатывать механизм контроля изменений. Если после перемещения документ не сохраняется, проверьте, не блокирует ли изменения модуль объекта (например, в процедуре ПередЗаписью()).
7. Типичные ошибки и их решения
При перемещении строк пользователи и разработчики часто сталкиваются с одними и теми же проблемами. Вот самые распространённые из них и способы их исправления:
| Ошибка | Причина | Решение |
|---|---|---|
| Строки возвращаются на прежние места после сохранения | В модуле объекта прописана автоматическая сортировка (например, по номеру или дате) | Исправьте процедуру ПередЗаписью() или отключите автосортировку в настройках табличной части |
| Не работает Drag-and-Drop в тонком клиенте | На сервере отключена поддержка перетаскивания для тонкого клиента | В файле 1cv8srv.conf добавьте параметр EnableThinClientDragDrop=1 и перезапустите сервер |
| При программном перемещении выдаёт ошибку "Индекс вне границ" | Неверно рассчитан новый индекс строки (например, пытаетесь вставить строку за пределами таблицы) | Проверьте логику расчёта новой позиции и добавьте проверку границ |
| После перемещения строки пропадают данные в колонках | При копировании строки не скопированы все реквизиты | Используйте метод Копировать() для строки, а не просто присваивание |
Важно: В конфигурациях на базе БСП (Библиотека Стандартных Подсистем) порядок строк в табличных частях может контролироваться механизмом "Порядок строк". Если ваши изменения не сохраняются, проверьте, не включён ли этот механизм в настройках документа.
Перед массовым перемещением строк всегда делайте резервную копию базы. Ошибки в коде могут привести к потере порядка строк во всех документах данного типа.
8. Альтернативные способы: обмен данными и внешние обработки
Если встроенные средства 1С не подходят (например, нужно переместить строки в унаследованной конфигурации с заблокированными формами), можно использовать альтернативные подходы:
- 📤 Выгрузка/загрузка в Excel: Экспортируйте табличную часть в Excel, измените порядок строк там, а затем загрузите обратно. Для этого подойдёт стандартная обработка
ВыгрузкаЗагрузкаДанныхЧерезExcelиз БСП. - 🔧 Внешние обработки: На сайте Infostart или 1С:ИТС можно найти готовые обработки для массового перемещения строк. Например, обработка "Универсальный редактор табличных частей".
- 🤖 Роботы и RPA: Для автоматизации рутинных операций (например, сортировки строк по алфавиту) можно использовать инструменты вроде 1С:Робот или UiPath.
Пример кода для выгрузки табличной части в Excel и обратной загрузки:
// Выгрузка
ТабДок = Новый ТабличныйДокумент;
ТабДок.Вывести(Документ.Товары);
ТабДок.Записать("C:\temp\Товары.xlsx", ТипФайлаТабличногоДокумента.XLSX);
// Загрузка (после редактирования файла)
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\temp\Товары_отредактированный.xlsx");
Документ.Товары.Загрузить(ТабДок);
⚠️ Внимание: При загрузке данных из Excel в 1С может произойти автоматическое округление числовых значений (например, цены с копейками). Чтобы избежать этого, перед загрузкой настройте формат ячеек в Excel как "Текстовый".
FAQ: Частые вопросы по перемещению строк в 1С
Можно ли перемещать строки в печатных формах документов?
Нет, в печатных формах строки отображаются в том порядке, в котором они хранятся в базе. Чтобы изменить порядок вывода, нужно либо отредактировать макет печатной формы (в конфигураторе), либо изменить порядок строк в самом документе перед печатью.
Почему после перемещения строки в документе "Поступление товаров" нумерация сбивается?
Это происходит из-за того, что в некоторых конфигурациях (например, УТ 11) для строк табличной части прописана автоматическая нумерация в модуле объекта. Чтобы исправить, откройте конфигуратор, найдите процедуру ПриЗаписи() или ПередЗаписью() в модуле документа и временно отключите код, отвечающий за нумерацию.
Как переместить строки в мобильном приложении 1С?
В официальном мобильном приложении 1С:Предприятие перемещение строк мышью недоступно. Вместо этого:
- Нажмите и удерживайте строку, которую нужно переместить (появится значок 📍).
- Не отпуская палец, перетащите строку в нужное место.
- Отпустите — строка встанет на новое место.
Если этот способ не работает, используйте контекстное меню (длинное нажатие на строку → Переместить).
Можно ли отменить перемещение строк (Ctrl+Z)?summary>
В большинстве конфигураций отмена перемещения строк (горячие клавиши Ctrl+Z) работает только до сохранения документа. После записи изменений в базу отменить перемещение можно только вручную или через восстановление резервной копии.
Исключение: если в конфигурации реализован механизм версионирования документов (например, в 1С:ERP), можно откатиться к предыдущей версии.
Ctrl+Z) работает только до сохранения документа. После записи изменений в базу отменить перемещение можно только вручную или через восстановление резервной копии.Как запретить пользователям перемещать строки в документе?
Чтобы отключить возможность перемещения строк:
- В конфигураторе откройте форму документа.
- Выделите элемент формы
ТабличноеПолес табличной частью. - В палитре свойств снимите флаги:
Разрешить перетаскивание строкРазрешить изменение порядка строк
Для программного запрета добавьте в модуль формы обработчик события ПередНачаломПеретаскивания():
Процедура ТоварыПередНачаломПеретаскивания(Элемент, ДанныеПеретаскивания, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Запрещаем перетаскивание
КонецПроцедуры