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