Транспонирование таблицы в 1С: строки в столбцы и обратно

· 9 мин

Содержание

Встроенной кнопки «Транспонировать» в табличном документе 1С нет. Стандартная команда есть только в Excel, поэтому в 1С задачу решают одним из четырёх способов: кодом, настройкой отчёта на СКД, обходным путём через Excel или построением таблицы заново из данных.

Какой способ выбрать, зависит от того, что именно у вас перед глазами: готовая печатная форма, отчёт, список или таблица значений в обработке. Сначала определите это, дальше всё просто.

С чего начать: что именно вы переворачиваете

Слова «поменять строки и столбцы» в 1С относятся к разным объектам. Способ у каждого свой.

Что у васЧто делатьСложность
Готовый отчёт на СКДПеренести поле группировки из строк в колонки в настройкахНизкая
Табличный документ (печатная форма, результат отчёта)Код с циклом по ячейкам или копия в ExcelСредняя
Таблица значенийПостроить новую таблицу с обратным соответствием колонокСредняя
Динамический списокМенять нечего, строки и колонки жёстко заданы запросомНе применимо

Если вы пишете свой отчёт, транспонировать почти никогда не нужно. Правильнее сразу построить его так, чтобы данные ложились в нужные оси. Переворот готовой таблицы — это заплатка для случаев, когда исходная форма уже есть и менять её нельзя.

Перед любым экспериментом на рабочей базе сделайте копию или работайте на тестовой. Код ниже не меняет данные информационной базы, но запускать его лучше сначала в консоли кода на тестовой копии.

Табличный документ: перевернуть таблицу программно

Табличный документ хранит ячейки в координатах «строка, колонка». Чтобы получить транспонированную копию, меняем координаты местами: ячейка из строки 2, колонки 5 исходной таблицы попадает в строку 5, колонку 2 результата.

Рабочий пример для обработки или внешней консоли кода:

Функция Транспонировать(Исходный)

    Результат = Новый ТабличныйДокумент;

    Для Стр = 1 По Исходный.ВысотаТаблицы Цикл
        Для Кол = 1 По Исходный.ШиринаТаблицы Цикл
            Откуда = Исходный.Область(Стр, Кол, Стр, Кол);
            Куда = Результат.Область(Кол, Стр, Кол, Стр);
            Куда.Текст = Откуда.Текст;
            Куда.ГоризонтальноеПоложение = Откуда.ГоризонтальноеПоложение;
        КонецЦикла;
    КонецЦикла;

    Возврат Результат;

КонецФункции

Что здесь происходит:

  1. ВысотаТаблицы и ШиринаТаблицы дают размеры занятой части таблицы.
  2. Область(Верх, Лево, Низ, Право) берёт одну ячейку по координатам.
  3. В цикле строка и колонка меняются местами, а текст переносится как есть.

Результат показывают пользователю командой Результат.Показать("Транспонированная таблица").

Что код не переносит

Он копирует текст и выравнивание, но не оформление. Границы, шрифты, цвета заливки, ширину колонок придётся переносить отдельно либо принять, что в результате будет «чистая» таблица. Для служебных сводок этого обычно хватает.

Две ловушки, на которых спотыкаются чаще всего:

  • ⚠️ Объединённые ячейки. Код выше копирует каждую ячейку отдельно, поэтому объединение теряется, а текст попадает только в одну клетку. Если в исходной таблице есть шапка с объединением, лучше сначала разобрать её на обычные ячейки.
  • 🔢 Числа превращаются в текст. Свойство Текст хранит то, что показано на экране, например 1 250,00. Чтобы в результате остались числа, присваивайте Значение, а не Текст, и задавайте формат отдельно.

Если в таблице тысячи строк, цикл по ячейкам работает заметно медленнее, чем кажется. Для больших объёмов быстрее собрать таблицу значений, транспонировать её, а табличный документ сформировать один раз в конце.

Транспонирование таблицы значений

Таблица значений чаще всего и есть источник данных. Её переворот делается построением новой таблицы: колонками становятся прежние строки, строками — прежние колонки.

Функция ТранспонироватьТаблицу(Исходная)

    Результат = Новый ТаблицаЗначений;

    // Первая колонка — подпись, остальные — по числу строк исходной таблицы
    Результат.Колонки.Добавить("Показатель");
    Для Н = 1 По Исходная.Количество() Цикл
        Результат.Колонки.Добавить("К" + Формат(Н, "ЧГ=0"));
    КонецЦикла;

    Для Каждого Колонка Из Исходная.Колонки Цикл
        НоваяСтрока = Результат.Добавить();
        НоваяСтрока.Показатель = Колонка.Имя;
        Н = 1;
        Для Каждого Строка Из Исходная Цикл
            НоваяСтрока["К" + Формат(Н, "ЧГ=0")] = Строка[Колонка.Имя];
            Н = Н + 1;
        КонецЦикла;
    КонецЦикла;

    Возврат Результат;

КонецФункции

Имена колонок исходной таблицы становятся значениями первой колонки. Имена новых колонок мы задаём сами (К1, К2 и так далее), потому что значения из ячеек исходной таблицы далеко не всегда годятся как идентификаторы.

Отчёт на СКД: кросс-таблица вместо кода

Если нужно перевернуть отчёт, код не нужен. Система компоновки данных умеет выводить данные в строках и колонках, и «перевернуть» значит сменить, по какой оси идёт группировка.

Порядок действий в режиме пользователя:

  1. Откройте отчёт и вызовите его настройки (команда настроек в командной панели отчёта, при необходимости переключитесь на расширенный режим).
  2. На вкладке структуры найдите поле, которое сейчас стоит в группировке строк.
  3. Перенесите его в группировку колонок, а то, что было в колонках, переставьте в строки.
  4. Сформируйте отчёт заново.

Отчёт при этом может иметь вид «кросс-таблицы»: по строкам один показатель, по колонкам другой, на пересечении сумма. Классический пример: строки — контрагенты, колонки — месяцы. Поменяли оси, и теперь строки — месяцы, колонки — контрагенты.

Если настроек отчёта не видно

Пользователю могут быть закрыты настройки конкретного отчёта. Тогда есть два выхода: попросить администратора выдать права на изменение вариантов отчёта либо сохранить свой вариант, если такая возможность в отчёте включена.

Разработчику в конфигураторе или расширении нужно:

  • открыть схему компоновки данных отчёта;
  • на вкладке настроек добавить группировку и в её параметрах указать расположение полей: по строкам или по колонкам;
  • сохранить вариант и проверить, что итоги по осям считаются корректно.

Транспонирование в СКД не умеет менять местами разные типы данных. Если в колонки вы переносите поле с сотнями уникальных значений, отчёт получит сотни колонок и станет нечитаемым. Сначала отберите значения отбором.

Excel: самый быстрый ручной путь

Когда таблица нужна один раз и без красоты, проще всего вывести её в Excel и перевернуть там. Обходной путь, но он работает с любым табличным документом.

Порядок:

  1. Сформируйте отчёт или откройте таблицу в 1С.
  2. Выделите нужные ячейки и скопируйте (Ctrl+C). Можно сохранить документ в формат Excel через команды сохранения табличного документа.
  3. В Excel выделите пустое место, вызовите специальную вставку и поставьте флажок «Транспонировать».
  4. Если нужно вернуть результат в 1С, скопируйте уже перевёрнутую таблицу и вставьте в табличный документ, в том числе в печатную форму, где предусмотрена свободная область.

Если выбирали вставку значений, формулы пересчитываться не будут: останутся только результаты. Это нормально для справок и плохо для тех мест, где важна связь с исходными данными.

⚠️ При вставке обратно в 1С числа иногда приходят текстом: с пробелами в разрядах и запятой. Проверьте несколько ячеек и при необходимости приведите формат.

Динамические списки: почему здесь не перевернуть

Динамический список строится запросом, и его колонки задаются выборкой этого запроса. Пользовательской команды «поменять строки и колонки» у него нет, и сделать её штатно нельзя: формат определён структурой данных.

Что можно сделать:

  • Выбрать другую группировку в списке, если форма её поддерживает: списки справочников и документов могут отображаться деревом или иерархией.
  • Выгрузить список в табличный документ и дальше действовать любым способом из этой статьи. Для этого есть команда вывода списка, она обычно доступна в меню «Ещё».
  • Если вы разработчик, сделайте отдельный запрос с нужной формой данных. Запрос может использовать конструкцию СГРУППИРОВАТЬ ПО и условные выражения для разворота значений в колонки, и отдельный отчёт с кросс-таблицей часто удобнее, чем переделка списка.

Не пытайтесь «вывернуть» сам динамический список кодом. Это приведёт к потере отбора, сортировки и обновления при записи данных.

Универсальная обработка: готовый инструмент вместо кода

Если переворачивать приходится регулярно, имеет смысл один раз создать обработку , которая принимает табличный документ и возвращает перевёрнутый. Это тот же цикл из раздела выше, но с интерфейсом.

Минимальный состав обработки:

  • реквизит или команда для вставки исходной таблицы;
  • кнопка «Транспонировать», запускающая функцию из примера;
  • поле вывода результата, которое можно скопировать в Excel или отправить на печать.

Делать из неё огромный комбайн не стоит. Полезные добавления одно-два: переключатель «первая строка — заголовки» и флажок «сохранить числа числами».

Обработку можно подключить как внешнюю через меню Администрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки, если нужные функции включены в настройках. Так её не придётся внедрять в конфигурацию.

Для разовой задачи внешняя обработка быстрее настройки отчёта: вы не трогаете конфигурацию, не обновляете базу и не согласуете изменения.

Мини-кейс: помесячные продажи по трём контрагентам

Отчёт выдал таблицу: в строках месяцы с января по декабрь, в колонках три контрагента. Руководитель просит наоборот: контрагенты в строках, месяцы в колонках, чтобы вся таблица легла на один альбомный лист.

Исходная таблица содержит 12 строк данных и 3 колонки данных, плюс заголовки. После переворота получится 3 строки данных и 12 колонок. Для альбомного листа это нормально: 12 узких колонок с числами помещаются свободно.

Как действовать по порядку:

  1. Если отчёт на СКД, меняете оси в настройках. Это самый чистый результат, итоги пересчитаются сами.
  2. Если отчёт собран кодом или это печатная форма, берёте функцию Транспонировать из примера выше.
  3. Если нужен разовый файл для письма, копируете в Excel и вставляете с транспонированием.

Проверьте итог по одной контрольной ячейке: например, продажи первого контрагента за март должны остаться в той же сумме, просто в другом месте таблицы. Сверка двух-трёх ячеек занимает полминуты и сразу показывает, не сдвинулись ли строки.

Когда переворачивать не нужно

Есть три ситуации, где транспонирование только мешает.

  • 📉 Данных слишком много. Если исходная таблица содержит сотни строк, после переворота получатся сотни колонок, которые не читаются ни на экране, ни на бумаге. Здесь лучше отбор или сводная таблица.
  • 🔁 Таблица нужна для дальнейшей загрузки. Обмены и загрузки из файла ждут строгой структуры: по одной записи в строке. Перевёрнутая таблица такую загрузку не пройдёт.
  • 🧾 Это регламентированная форма. Бланки и отчётность с жёстким макетом менять нельзя: порядок строк и граф утверждён, и перестановка сделает форму недействительной.

Типичные проблемы после переворота

Здесь только то, что не разобрано выше.

Размер таблицы вышел за пределы листа. Если строк исходной таблицы много, а колонок мало, результат получает сотни колонок и ломается при печати. Режьте данные до переворота: фильтр по периоду, по организации, по группе номенклатуры.

Итоги встали не туда. После переворота итоговая строка превращается в итоговую колонку, и сумма в ней считается по другим ячейкам. Если итоги были формулами, пересчитайте их заново в новом месте, а при выводе кодом присвойте им нужные значения отдельно.

Шапка осталась в строке. Заголовки колонок исходной таблицы после переворота должны оказаться в первой колонке. Если вы использовали цикл по всей области, они переедут автоматически. Если пропустили первую строку, добавьте её отдельно.

Пустые ячейки превратились в нули. Это бывает при приведении типов. Проверьте, что проверка на пустое значение стоит до присвоения.

Лишние пробелы и неразрывные пробелы. Текст, скопированный из Excel, содержит разделители, которые 1С не считает пробелами. Прогоните значения через СокрЛП() и замените неразрывные пробелы на обычные, если собираетесь складывать суммы.

Частые вопросы

Можно ли перевернуть таблицу в 1С без программирования?
Да. Для отчёта на СКД достаточно переставить поле из группировки строк в группировку колонок. Для остальных таблиц самый простой путь — скопировать в Excel и вставить с флажком «Транспонировать».
Сохранится ли форматирование при программном транспонировании?
Нет, цикл по ячейкам копирует только текст и выравнивание. Границы, цвета и ширину колонок переносите отдельно или создавайте оформление заново.
Почему после переворота числа не складываются?
Скорее всего, в ячейках оказался текст. Присваивайте не Текст, а Значение, либо преобразуйте строки обратно в число перед суммированием.
Как перевернуть таблицу, если в ней есть объединённые ячейки?
Сначала снимите объединение или обработайте объединённые области отдельно. Простой цикл по ячейкам такие области не воспроизводит.
Можно ли сразу сохранить перевёрнутую таблицу в файл?
Да. Покажите результат пользователю и сохраните его командой сохранения табличного документа в нужный формат, например Excel или PDF.