Как добавить нумерацию строк в стандартный отчет по продажам в 1С: Управление торговлей 10.3?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← К списку

Давайте вместе разберемся, как решить довольно частую задачу: добавить простую колонку с порядковыми номерами строк в отчет, созданный в конфигурации "Управление торговлей 10.3". Основная сложность заключается в том, что большинство типовых отчетов в этой конфигурации построены на устаревшей технологии Построителя отчетов, в котором, в отличие от современной Системы Компоновки Данных (СКД), нет встроенной функции для нумерации строк.

Проанализируем ситуацию и рассмотрим несколько подходов, от самых простых "обходных" маневров до более правильных программных решений.

Решение 1: Создание нового отчета на СКД (рекомендуемый, но трудоемкий способ)

Это самый правильный и современный подход с точки зрения разработки в 1С. Вместо того чтобы дорабатывать старый отчет на Построителе, мы можем создать его аналог на Системе Компоновки Данных (СКД).

Основное преимущество этого метода — в СКД есть встроенные системные поля, которые решают нашу задачу в несколько кликов. Вам не придется писать сложный код.

Разберем по шагам, как это работает в СКД:

  1. В настройках структуры отчета на СКД, в разделе "Выбранные поля", вы можете добавить новое поле.
  2. Вместо поля из набора данных выберите системное поле с названием НомерПоПорядку или НомерПоПорядкуВГруппировке.
  3. Поле НомерПоПорядку обеспечит сквозную нумерацию всех детальных записей в отчете.
  4. Поле НомерПоПорядкуВГруппировке будет начинать нумерацию заново для каждой новой группировки (например, для каждого контрагента).

Недостаток: Этот способ требует времени и навыков работы с СКД, так как, по сути, это создание отчета с нуля. Если вам нужно быстрое решение для существующего отчета, рассмотрим другие варианты.

Решение 2: Использование дополнительных реквизитов или свойств для сортировки

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

Рассмотрим подробнее:

  1. Создаем поле для сортировки. Вам нужно добавить новый реквизит или свойство к тому справочнику, по которому вы строите отчет. Например, для отчета по продажам контрагентам это будет справочник Контрагенты. Назовем свойство, например, "ПриоритетДляОтчетов".
  2. Заполняем данные. Для каждого элемента справочника (например, для каждого контрагента) проставьте в этом свойстве числовое значение, определяющее его порядок (1, 2, 3 и т.д.).
  3. Настраиваем отчет. В настройках типового отчета на Построителе найдите вкладку "Сортировка". Добавьте в нее ваше новое свойство "ПриоритетДляОтчетов" и установите сортировку по возрастанию.

Важный момент: Это именно сортировка, а не нумерация. Если по какому-то контрагенту с номером "3" не будет продаж в выбранном периоде, он просто не попадет в отчет, и после строки с номером "2" сразу пойдет строка с номером "4". Этот метод не обеспечивает сплошную нумерацию строк в итоговой таблице.

Решение 3: Программная обработка готового табличного документа

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

Разберем по шагам, как это можно реализовать:

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

Этот метод очень гибкий, но требует аккуратной работы с объектом ТабличныйДокумент и понимания структуры конкретного отчета.

Решение 4: Подмена источника данных для Построителя отчета

Это, пожалуй, самый "чистый" программный способ доработки существующего отчета без его переписывания на СКД. Суть метода — подготовить данные для отчета заранее, добавив в них нужную нам нумерацию, и затем передать эти подготовленные данные Построителю.

Выясним, как это работает:

  1. Выполняем запрос Построителя. Сначала мы получаем из Построителя его текст запроса, выполняем его и выгружаем результат во временную ТаблицуЗначений.
    
    Построитель = Новый ПостроительОтчета;
    // ... здесь идут настройки Построителя ...
    
    Запрос = Новый Запрос(Построитель.Текст);
    // Устанавливаем параметры, если они есть
    // ...
    РезультатЗапроса = Запрос.Выполнить();
    ТаблицаДанных = РезультатЗапроса.Выгрузить();
    
  2. Добавляем колонку нумерации. В полученную таблицу значений добавляем новую колонку.
    
    ТаблицаДанных.Колонки.Добавить("НомерПП", Новый ОписаниеТипов("Число"));
    
  3. Заполняем новую колонку. Обходим таблицу значений в цикле и проставляем порядковые номера.
    
    Для Каждого Стр Из ТаблицаДанных Цикл
        Стр.НомерПП = ТаблицаДанных.Индекс(Стр) + 1;
    КонецЦикла;
    
  4. Подменяем источник данных. Указываем Построителю, что теперь его источником данных является наша измененная таблица.
    
    Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблицаДанных);
    
  5. Выводим поле в отчет. После такой подмены в списке доступных полей отчета (в настройках) появится наше поле НомерПП. Теперь пользователь может сам добавить его в отчет стандартными средствами настройки.

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

← К списку