Транспонирование таблицы в 1С: строки в столбцы и обратно
Содержание
Встроенной кнопки «Транспонировать» в табличном документе 1С нет. Стандартная команда есть только в Excel, поэтому в 1С задачу решают одним из четырёх способов: кодом, настройкой отчёта на СКД, обходным путём через Excel или построением таблицы заново из данных.
Какой способ выбрать, зависит от того, что именно у вас перед глазами: готовая печатная форма, отчёт, список или таблица значений в обработке. Сначала определите это, дальше всё просто.
С чего начать: что именно вы переворачиваете
Слова «поменять строки и столбцы» в 1С относятся к разным объектам. Способ у каждого свой.
| Что у вас | Что делать | Сложность |
|---|---|---|
| Готовый отчёт на СКД | Перенести поле группировки из строк в колонки в настройках | Низкая |
| Табличный документ (печатная форма, результат отчёта) | Код с циклом по ячейкам или копия в Excel | Средняя |
| Таблица значений | Построить новую таблицу с обратным соответствием колонок | Средняя |
| Динамический список | Менять нечего, строки и колонки жёстко заданы запросом | Не применимо |
Если вы пишете свой отчёт, транспонировать почти никогда не нужно. Правильнее сразу построить его так, чтобы данные ложились в нужные оси. Переворот готовой таблицы — это заплатка для случаев, когда исходная форма уже есть и менять её нельзя.
Перед любым экспериментом на рабочей базе сделайте копию или работайте на тестовой. Код ниже не меняет данные информационной базы, но запускать его лучше сначала в консоли кода на тестовой копии.
Табличный документ: перевернуть таблицу программно
Табличный документ хранит ячейки в координатах «строка, колонка». Чтобы получить транспонированную копию, меняем координаты местами: ячейка из строки 2, колонки 5 исходной таблицы попадает в строку 5, колонку 2 результата.
Рабочий пример для обработки или внешней консоли кода:
Функция Транспонировать(Исходный)
Результат = Новый ТабличныйДокумент;
Для Стр = 1 По Исходный.ВысотаТаблицы Цикл
Для Кол = 1 По Исходный.ШиринаТаблицы Цикл
Откуда = Исходный.Область(Стр, Кол, Стр, Кол);
Куда = Результат.Область(Кол, Стр, Кол, Стр);
Куда.Текст = Откуда.Текст;
Куда.ГоризонтальноеПоложение = Откуда.ГоризонтальноеПоложение;
КонецЦикла;
КонецЦикла;
Возврат Результат;
КонецФункции
Что здесь происходит:
ВысотаТаблицыиШиринаТаблицыдают размеры занятой части таблицы.Область(Верх, Лево, Низ, Право)берёт одну ячейку по координатам.- В цикле строка и колонка меняются местами, а текст переносится как есть.
Результат показывают пользователю командой Результат.Показать("Транспонированная таблица").
Что код не переносит
Он копирует текст и выравнивание, но не оформление. Границы, шрифты, цвета заливки, ширину колонок придётся переносить отдельно либо принять, что в результате будет «чистая» таблица. Для служебных сводок этого обычно хватает.
Две ловушки, на которых спотыкаются чаще всего:
- ⚠️ Объединённые ячейки. Код выше копирует каждую ячейку отдельно, поэтому объединение теряется, а текст попадает только в одну клетку. Если в исходной таблице есть шапка с объединением, лучше сначала разобрать её на обычные ячейки.
- 🔢 Числа превращаются в текст. Свойство
Текстхранит то, что показано на экране, например1 250,00. Чтобы в результате остались числа, присваивайтеЗначение, а неТекст, и задавайте формат отдельно.
Если в таблице тысячи строк, цикл по ячейкам работает заметно медленнее, чем кажется. Для больших объёмов быстрее собрать таблицу значений, транспонировать её, а табличный документ сформировать один раз в конце.
Транспонирование таблицы значений
Таблица значений чаще всего и есть источник данных. Её переворот делается построением новой таблицы: колонками становятся прежние строки, строками — прежние колонки.
Функция ТранспонироватьТаблицу(Исходная)
Результат = Новый ТаблицаЗначений;
// Первая колонка — подпись, остальные — по числу строк исходной таблицы
Результат.Колонки.Добавить("Показатель");
Для Н = 1 По Исходная.Количество() Цикл
Результат.Колонки.Добавить("К" + Формат(Н, "ЧГ=0"));
КонецЦикла;
Для Каждого Колонка Из Исходная.Колонки Цикл
НоваяСтрока = Результат.Добавить();
НоваяСтрока.Показатель = Колонка.Имя;
Н = 1;
Для Каждого Строка Из Исходная Цикл
НоваяСтрока["К" + Формат(Н, "ЧГ=0")] = Строка[Колонка.Имя];
Н = Н + 1;
КонецЦикла;
КонецЦикла;
Возврат Результат;
КонецФункции
Имена колонок исходной таблицы становятся значениями первой колонки. Имена новых колонок мы задаём сами (К1, К2 и так далее), потому что значения из ячеек исходной таблицы далеко не всегда годятся как идентификаторы.
Отчёт на СКД: кросс-таблица вместо кода
Если нужно перевернуть отчёт, код не нужен. Система компоновки данных умеет выводить данные в строках и колонках, и «перевернуть» значит сменить, по какой оси идёт группировка.
Порядок действий в режиме пользователя:
- Откройте отчёт и вызовите его настройки (команда настроек в командной панели отчёта, при необходимости переключитесь на расширенный режим).
- На вкладке структуры найдите поле, которое сейчас стоит в группировке строк.
- Перенесите его в группировку колонок, а то, что было в колонках, переставьте в строки.
- Сформируйте отчёт заново.
Отчёт при этом может иметь вид «кросс-таблицы»: по строкам один показатель, по колонкам другой, на пересечении сумма. Классический пример: строки — контрагенты, колонки — месяцы. Поменяли оси, и теперь строки — месяцы, колонки — контрагенты.
Если настроек отчёта не видно
Пользователю могут быть закрыты настройки конкретного отчёта. Тогда есть два выхода: попросить администратора выдать права на изменение вариантов отчёта либо сохранить свой вариант, если такая возможность в отчёте включена.
Разработчику в конфигураторе или расширении нужно:
- открыть схему компоновки данных отчёта;
- на вкладке настроек добавить группировку и в её параметрах указать расположение полей: по строкам или по колонкам;
- сохранить вариант и проверить, что итоги по осям считаются корректно.
Транспонирование в СКД не умеет менять местами разные типы данных. Если в колонки вы переносите поле с сотнями уникальных значений, отчёт получит сотни колонок и станет нечитаемым. Сначала отберите значения отбором.
Excel: самый быстрый ручной путь
Когда таблица нужна один раз и без красоты, проще всего вывести её в Excel и перевернуть там. Обходной путь, но он работает с любым табличным документом.
Порядок:
- Сформируйте отчёт или откройте таблицу в 1С.
- Выделите нужные ячейки и скопируйте (
Ctrl+C). Можно сохранить документ в формат Excel через команды сохранения табличного документа. - В Excel выделите пустое место, вызовите специальную вставку и поставьте флажок «Транспонировать».
- Если нужно вернуть результат в 1С, скопируйте уже перевёрнутую таблицу и вставьте в табличный документ, в том числе в печатную форму, где предусмотрена свободная область.
Если выбирали вставку значений, формулы пересчитываться не будут: останутся только результаты. Это нормально для справок и плохо для тех мест, где важна связь с исходными данными.
⚠️ При вставке обратно в 1С числа иногда приходят текстом: с пробелами в разрядах и запятой. Проверьте несколько ячеек и при необходимости приведите формат.
Динамические списки: почему здесь не перевернуть
Динамический список строится запросом, и его колонки задаются выборкой этого запроса. Пользовательской команды «поменять строки и колонки» у него нет, и сделать её штатно нельзя: формат определён структурой данных.
Что можно сделать:
- Выбрать другую группировку в списке, если форма её поддерживает: списки справочников и документов могут отображаться деревом или иерархией.
- Выгрузить список в табличный документ и дальше действовать любым способом из этой статьи. Для этого есть команда вывода списка, она обычно доступна в меню «Ещё».
- Если вы разработчик, сделайте отдельный запрос с нужной формой данных. Запрос может использовать конструкцию
СГРУППИРОВАТЬ ПОи условные выражения для разворота значений в колонки, и отдельный отчёт с кросс-таблицей часто удобнее, чем переделка списка.
Не пытайтесь «вывернуть» сам динамический список кодом. Это приведёт к потере отбора, сортировки и обновления при записи данных.
Универсальная обработка: готовый инструмент вместо кода
Если переворачивать приходится регулярно, имеет смысл один раз создать обработку , которая принимает табличный документ и возвращает перевёрнутый. Это тот же цикл из раздела выше, но с интерфейсом.
Минимальный состав обработки:
- реквизит или команда для вставки исходной таблицы;
- кнопка «Транспонировать», запускающая функцию из примера;
- поле вывода результата, которое можно скопировать в Excel или отправить на печать.
Делать из неё огромный комбайн не стоит. Полезные добавления одно-два: переключатель «первая строка — заголовки» и флажок «сохранить числа числами».
Обработку можно подключить как внешнюю через меню Администрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки, если нужные функции включены в настройках. Так её не придётся внедрять в конфигурацию.
Для разовой задачи внешняя обработка быстрее настройки отчёта: вы не трогаете конфигурацию, не обновляете базу и не согласуете изменения.
Мини-кейс: помесячные продажи по трём контрагентам
Отчёт выдал таблицу: в строках месяцы с января по декабрь, в колонках три контрагента. Руководитель просит наоборот: контрагенты в строках, месяцы в колонках, чтобы вся таблица легла на один альбомный лист.
Исходная таблица содержит 12 строк данных и 3 колонки данных, плюс заголовки. После переворота получится 3 строки данных и 12 колонок. Для альбомного листа это нормально: 12 узких колонок с числами помещаются свободно.
Как действовать по порядку:
- Если отчёт на СКД, меняете оси в настройках. Это самый чистый результат, итоги пересчитаются сами.
- Если отчёт собран кодом или это печатная форма, берёте функцию
Транспонироватьиз примера выше. - Если нужен разовый файл для письма, копируете в Excel и вставляете с транспонированием.
Проверьте итог по одной контрольной ячейке: например, продажи первого контрагента за март должны остаться в той же сумме, просто в другом месте таблицы. Сверка двух-трёх ячеек занимает полминуты и сразу показывает, не сдвинулись ли строки.
Когда переворачивать не нужно
Есть три ситуации, где транспонирование только мешает.
- 📉 Данных слишком много. Если исходная таблица содержит сотни строк, после переворота получатся сотни колонок, которые не читаются ни на экране, ни на бумаге. Здесь лучше отбор или сводная таблица.
- 🔁 Таблица нужна для дальнейшей загрузки. Обмены и загрузки из файла ждут строгой структуры: по одной записи в строке. Перевёрнутая таблица такую загрузку не пройдёт.
- 🧾 Это регламентированная форма. Бланки и отчётность с жёстким макетом менять нельзя: порядок строк и граф утверждён, и перестановка сделает форму недействительной.
Типичные проблемы после переворота
Здесь только то, что не разобрано выше.
Размер таблицы вышел за пределы листа. Если строк исходной таблицы много, а колонок мало, результат получает сотни колонок и ломается при печати. Режьте данные до переворота: фильтр по периоду, по организации, по группе номенклатуры.
Итоги встали не туда. После переворота итоговая строка превращается в итоговую колонку, и сумма в ней считается по другим ячейкам. Если итоги были формулами, пересчитайте их заново в новом месте, а при выводе кодом присвойте им нужные значения отдельно.
Шапка осталась в строке. Заголовки колонок исходной таблицы после переворота должны оказаться в первой колонке. Если вы использовали цикл по всей области, они переедут автоматически. Если пропустили первую строку, добавьте её отдельно.
Пустые ячейки превратились в нули. Это бывает при приведении типов. Проверьте, что проверка на пустое значение стоит до присвоения.
Лишние пробелы и неразрывные пробелы. Текст, скопированный из Excel, содержит разделители, которые 1С не считает пробелами. Прогоните значения через СокрЛП() и замените неразрывные пробелы на обычные, если собираетесь складывать суммы.
Частые вопросы
Можно ли перевернуть таблицу в 1С без программирования?
Сохранится ли форматирование при программном транспонировании?
Почему после переворота числа не складываются?
Текст, а Значение, либо преобразуйте строки обратно в число перед суммированием.