Как изменить порядок колонок-ресурсов в отчете СКД на платформе 1С 8.1, если они выводятся последними?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При работе с Системой Компоновки Данных (СКД) в 1С 8.1 разработчики часто сталкиваются с проблемой: поля, добавленные в раздел Ресурсы, несмотря на все настройки макетов и явное указание позиций, упорно выводятся в самых последних колонках отчета. Эта особенность платформы 1С 8.1 создает серьезные трудности при создании отчетов со строго фиксированной структурой, требуемой заказчиком. Отсутствие в этой версии платформы такой полезной настройки, как "Авто позиция ресурсов (не использовать)", делает задачу еще более нетривиальной.

Давайте разберем основные подходы и возможные решения этой проблемы, позволяющие добиться желаемого порядка колонок в отчетах СКД на 1С 8.1.

Вариант 1: Обновление платформы до более новой версии

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

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

Вариант 2: Программная корректировка сформированного табличного документа

Если обновление платформы не является опцией, нам придется искать обходные пути внутри 1С 8.1. Одним из таких способов является программное изменение структуры сформированного отчета непосредственно в табличном документе. После того как СКД сгенерирует отчет, мы можем получить доступ к его табличному представлению и вручную "сдвинуть" необходимые колонки.

Разберем этот подход по шагам:

  1. Формирование отчета: Сначала мы позволяем СКД сформировать отчет в стандартном режиме, даже если колонки расположены некорректно. Результатом будет объект типа ТабличныйДокумент.

  2. Обход табличного документа: Получив объект ТабличныйДокумент, мы можем программно перебрать его ячейки, строки и колонки. Наша задача — найти те колонки, которые СКД ошибочно разместила в конце, и те, куда они должны были попасть изначально.

    Для этого нам могут потребоваться методы объекта ТабличныйДокумент, такие как Область(), Вывести(), Очистить(), УдалитьОбласть(), ВставитьОбласть() и другие. Мы можем также работать с отдельными областями табличного документа, чтобы перемещать блоки информации.

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

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

  4. Изменение порядка колонок: Это самая сложная часть. Прямого метода "поменять местами колонки" в ТабличныйДокумент нет. Вместо этого нам придется использовать более сложные манипуляции:

    1. Создание нового табличного документа или временных областей: Мы можем создать новый пустой ТабличныйДокумент и последовательно выводить в него области из старого документа в нужном порядке. Либо же копировать и удалять области внутри текущего документа.

    2. Копирование и удаление: Мы можем вырезать (скопировать и удалить) область с неправильно расположенной колонкой, а затем вставить ее в нужное место, сдвинув остальные колонки. Это требует аккуратной работы с индексами колонок и понимания, как работают методы УдалитьОбласть() и ВставитьОбласть().

      
      // Примерный псевдокод для перемещения колонки
      ИсходныйДокумент = ЭлементыФормы.ПолеТабличногоДокумента.ПолучитьТабличныйДокумент();
                      
      // Определяем номера колонок, которые хотим поменять
      НомерКолонкиДляПеремещения = 5; // Например, колонка с ресурсом
      ЦелевойНомерКолонки = 2; // Например, после какой-то другой колонки
                      
      // Получаем область колонки, которую хотим переместить
      ОбластьПеремещения = ИсходныйДокумент.Область(1, НомерКолонкиДляПеремещения, ИсходныйДокумент.ВысотаТаблицы, НомерКолонкиДляПеремещения);
                      
      // Сохраняем содержимое колонки (можно создать временный табличный документ для этого)
      ВременныйДокумент = Новый ТабличныйДокумент();
      ВременныйДокумент.Вывести(ОбластьПеремещения);
                      
      // Удаляем исходную колонку
      ИсходныйДокумент.УдалитьОбласть(ОбластьПеремещения, ТипСдвига.Слева); // Сдвигаем все справа налево
                      
      // Вставляем сохраненную колонку в целевое место
      // Нужно учитывать, что после удаления индексы могли измениться
      ИсходныйДокумент.ВставитьОбласть(ВременныйДокумент.Область(1,1,ВременныйДокумент.ВысотаТаблицы,1), ЦелевойНомерКолонки, ТипСдвига.Справа); // Вставляем, сдвигая все справа
                      
      // Обновляем отображение
      ЭлементыФормы.ПолеТабличногоДокумента.Показать(ИсходныйДокумент);
      

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

Вариант 3: Специальная настройка СКД – все поля в ресурсы без агрегации

Этот подход является более тонким и использует специфику обработки полей СКД в 1С 8.1. Идея заключается в том, чтобы включить в раздел "Ресурсы" не только те поля, по которым мы хотим видеть итоги, но и все остальные поля отчета, включая измерения, но при этом для обычных полей не указывать функцию группировки.

Рассмотрим, как это работает:

  1. Понимание логики СКД 8.1: В 1С 8.1 СКД имеет определенную предопределенную логику размещения элементов. Когда вы определяете поле как ресурс, оно часто рассматривается как "итог" и автоматически помещается в конец, особенно если рядом есть "не-ресурсные" поля. Если же все поля отчета представлены как ресурсы, СКД может изменить свою стратегию позиционирования, пытаясь упорядочить "ресурсы" в соответствии с макетом.

  2. Применение настройки:

    • Откройте настройки СКД вашего отчета.

    • Перейдите на вкладку Ресурсы.

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

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

      Пример:

      
      // Вместо
      // Поле        | Функция
      // Сумма       | Сумма
      // Контрагент  | Сумма
                      
      // Делаем так
      // Поле        | Функция
      // Сумма       | Сумма
      // Контрагент  |
      // Номенклатура|
      
    • После этого попробуйте явно указать порядок полей в макете отчета (вкладка Макеты, если вы используете пользовательские макеты, или в Настройках на вкладке Выбранные поля).

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

    Мы должны учитывать, что этот метод может иметь побочные эффекты, например, влиять на итоговые строки, если структура отчета сложная. Важно тщательно протестировать отчет после применения этой настройки.

Вариант 4: Полностью ручная отрисовка отчета без СКД

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

Этот подход дает нам абсолютный контроль над каждой ячейкой, строкой и колонкой отчета:

  1. Формирование данных запросом: Мы создаем обычный запрос, который извлекает все необходимые данные. Возможно, потребуется несколько запросов для получения агрегированных данных и детализации.

  2. Создание макета вручную: Мы не используем макеты СКД. Вместо этого мы можем создать макет в виде отдельного объекта ТабличныйДокумент или жестко кодировать расположение ячеек. Если макет сложный, мы можем использовать встроенные макеты (например, Макет.Основной), в которые предварительно нарисуем шапки, подвалы и области данных.

  3. Построение отчета: Мы итерируемся по результатам запроса и выводим данные в ТабличныйДокумент с помощью метода Вывести(). Мы вручную управляем позиционированием каждой ячейки, объединением, форматированием и расчетом итогов.

    
    // Пример псевдокода ручного формирования отчета
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ Контрагенты.Наименование, СуммаДокументов.Сумма
                 |ИЗ Справочник.Контрагенты КАК Контрагенты
                 |ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Документ.Контрагент, СУММА(Документ.Сумма) КАК Сумма
                 |                  ИЗ Документ.РеализацияТоваровУслуг КАК Документ
                 |                  СГРУППИРОВАТЬ ПО Документ.Контрагент) КАК СуммаДокументов
                 |ПО Контрагенты.Ссылка = СуммаДокументов.Контрагент
                 |УПОРЯДОЧИТЬ ПО Контрагенты.Наименование";
            
    РезультатЗапроса = Запрос.Выполнить().Выбрать();
            
    ТабДок = Новый ТабличныйДокумент;
            
    // Выводим заголовок
    ТабДок.Область(1,1).Текст = "Отчет по контрагентам";
    ТабДок.Область(1,1,1,2).Объединить();
    ТабДок.Область(1,1).ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
    ТабДок.Область(1,1).Шрифт = Новый Шрифт("Arial", 12, Истина);
            
    // Выводим шапку таблицы
    ТабДок.Область(3,1).Текст = "Контрагент";
    ТабДок.Область(3,2).Текст = "Сумма";
    ТабДок.Область(3,1,3,2).Шрифт = Новый Шрифт("Arial", 10, Истина);
            
    СтрокаНачалаДанных = 4;
    ПозицияСтроки = СтрокаНачалаДанных;
    ОбщаяСумма = 0;
            
    Пока РезультатЗапроса.Следующий() Цикл
        ТабДок.Область(ПозицияСтроки,1).Текст = РезультатЗапроса.Наименование;
        ТабДок.Область(ПозицияСтроки,2).Текст = Формат(РезультатЗапроса.Сумма, "ЧДЦ=2");
        ОбщаяСумма = ОбщаяСумма + РезультатЗапроса.Сумма;
        ПозицияСтроки = ПозицияСтроки + 1;
    КонецЦикла;
            
    // Выводим итоги
    ТабДок.Область(ПозицияСтроки + 1,1).Текст = "Итого:";
    ТабДок.Область(ПозицияСтроки + 1,2).Текст = Формат(ОбщаяСумма, "ЧДЦ=2");
    ТабДок.Область(ПозицияСтроки + 1,1,ПозицияСтроки + 1,2).Шрифт = Новый Шрифт("Arial", 10, Истина);
            
    // Выводим табличный документ
    ЭлементыФормы.ПолеТабличногоДокумента.Показать(ТабДок);
    

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

Заключение

Проблема позиционирования полей-ресурсов в отчетах СКД на 1С 8.1 является известным ограничением платформы. Мы рассмотрели несколько подходов к ее решению: от наиболее радикального – обновления платформы, до сложных программных манипуляций с готовым табличным документом и специфических настроек СКД. Выбор конкретного метода зависит от многих факторов, включая возможность обновления платформы, сложность требуемого отчета и готовность к написанию дополнительного кода.

Мы рекомендуем начать с проверки второго и третьего вариантов, поскольку они позволяют остаться в рамках СКД. Если же эти методы не дают желаемого результата, ручное формирование отчета, хоть и трудозатратно, всегда остается надежным вариантом для достижения точного соответствия макету в 1С 8.1.

← На главную