Давайте вместе разберемся, как решить довольно частую задачу: добавить простую колонку с порядковыми номерами строк в отчет, созданный в конфигурации "Управление торговлей 10.3". Основная сложность заключается в том, что большинство типовых отчетов в этой конфигурации построены на устаревшей технологии Построителя отчетов, в котором, в отличие от современной Системы Компоновки Данных (СКД), нет встроенной функции для нумерации строк.
Проанализируем ситуацию и рассмотрим несколько подходов, от самых простых "обходных" маневров до более правильных программных решений.
Это самый правильный и современный подход с точки зрения разработки в 1С. Вместо того чтобы дорабатывать старый отчет на Построителе, мы можем создать его аналог на Системе Компоновки Данных (СКД).
Основное преимущество этого метода — в СКД есть встроенные системные поля, которые решают нашу задачу в несколько кликов. Вам не придется писать сложный код.
Разберем по шагам, как это работает в СКД:
НомерПоПорядку или НомерПоПорядкуВГруппировке.НомерПоПорядку обеспечит сквозную нумерацию всех детальных записей в отчете.НомерПоПорядкуВГруппировке будет начинать нумерацию заново для каждой новой группировки (например, для каждого контрагента).Недостаток: Этот способ требует времени и навыков работы с СКД, так как, по сути, это создание отчета с нуля. Если вам нужно быстрое решение для существующего отчета, рассмотрим другие варианты.
Этот метод является скорее "обходным путем", который не создает нумерацию в чистом виде, а позволяет отсортировать данные в нужном порядке. Он подойдет, если вам нужно, чтобы определенные контрагенты или товары всегда были вверху списка под определенными номерами.
Рассмотрим подробнее:
Контрагенты. Назовем свойство, например, "ПриоритетДляОтчетов".Важный момент: Это именно сортировка, а не нумерация. Если по какому-то контрагенту с номером "3" не будет продаж в выбранном периоде, он просто не попадет в отчет, и после строки с номером "2" сразу пойдет строка с номером "4". Этот метод не обеспечивает сплошную нумерацию строк в итоговой таблице.
Этот способ является хорошим компромиссом. Мы не переписываем отчет, а программно дорабатываем уже сформированный результат перед тем, как показать его пользователю. Идея в том, чтобы "перехватить" готовый табличный документ, добавить в него колонку и заполнить ее номерами.
Разберем по шагам, как это можно реализовать:
ПостроительОтчета.Вывести()), мы получаем объект ТабличныйДокумент.ТабличныйДокумент, мы вставляем слева новую колонку. Посмотрим на пример кода:
// Предположим, что ТабДок - это наш сформированный отчет
// Вставляем одну колонку слева
ТабДок.ВставитьОбласть("R1C1:R1C1", ТабДок.Область("R1C1:R" + ТабДок.ВысотаТаблицы + "C1"), СдвигФормул.ПоГоризонтали);
Перем НомерСтроки;
НомерСтроки = 1;
// Обходим все строки в таблице
Для Сч = 1 По ТабДок.ВысотаТаблицы Цикл
// Здесь нужна проверка, является ли строка строкой данных
// Например, можно проверять заполненность ячейки во второй колонке
ЯчейкаДанных = ТабДок.Область("R" + Сч + "C2");
Если НЕ ПустаяСтрока(ЯчейкаДанных.Текст) И ЯчейкаДанных.УровеньГруппировки = 1 Тогда // Пример условия
// Устанавливаем номер в первую колонку
ТабДок.Область("R" + Сч + "C1").Текст = Формат(НомерСтроки, "ЧГ=0");
НомерСтроки = НомерСтроки + 1;
КонецЕсли;
КонецЦикла;
Этот метод очень гибкий, но требует аккуратной работы с объектом ТабличныйДокумент и понимания структуры конкретного отчета.
Это, пожалуй, самый "чистый" программный способ доработки существующего отчета без его переписывания на СКД. Суть метода — подготовить данные для отчета заранее, добавив в них нужную нам нумерацию, и затем передать эти подготовленные данные Построителю.
Выясним, как это работает:
ТаблицуЗначений.
Построитель = Новый ПостроительОтчета;
// ... здесь идут настройки Построителя ...
Запрос = Новый Запрос(Построитель.Текст);
// Устанавливаем параметры, если они есть
// ...
РезультатЗапроса = Запрос.Выполнить();
ТаблицаДанных = РезультатЗапроса.Выгрузить();
ТаблицаДанных.Колонки.Добавить("НомерПП", Новый ОписаниеТипов("Число"));
Для Каждого Стр Из ТаблицаДанных Цикл
Стр.НомерПП = ТаблицаДанных.Индекс(Стр) + 1;
КонецЦикла;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблицаДанных);
НомерПП. Теперь пользователь может сам добавить его в отчет стандартными средствами настройки.Этот способ элегантен тем, что мы работаем с данными, а не с уже отрисованной таблицей. Он позволяет сделать нумерацию полноценным полем отчета, которое можно включать, отключать и перемещать.
← К списку