Как добавить дополнительные колонки в отчет 1С 7.7 при использовании 1С++ и прямых запросов?

Программист 1С v7.7 Управленческий учет IT и автоматизация бизнеса
← На главную

При сопровождении отчетов в среде 1С:Предприятие 7.7 разработчики нередко сталкиваются с кодом, использующим внешнюю компоненту 1С++ и прямой доступ к данным через объект ODBCRecordset. Доработка таких отчетов требует понимания не только работы табличного документа (макета), но и специфики передачи данных через объект ТаблицаЗначений, а также синтаксиса типизации полей в прямых SQL-запросах.

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


Шаг 1. Модификация прямого SQL-запроса (1С++)

Проанализируем текст запроса. В исходном коде данные извлекаются из таблицы журнала документов _1SJourn, шапки документа $Документ.АктОбъемаРабот и справочника $Справочник.Объект. Если требуемый реквизит (например, источник финансирования) привязан к объекту строительства, нет необходимости выполнять дополнительные поиски через СоздатьОбъект("Справочник...") внутри циклов — его можно получить напрямую в блоке SELECT.

Используем синтаксис метаимен 1С++ для типизации ссылки, чтобы компонента автоматически вернула готовый объект справочника:


ТекстЗапроса = 
"
|SELECT
|   Жур.IDDoc            as [Док $Документ],
|   Жур.IDDocDef         as Док_вид,
|   Спр.Code             as Код,
|   Спр.Descr            as Наименование,
|   $Док.Объект          as [Объект $Справочник.Объект],
|   $Спр.ИсточникФин     as [ИсточникФинансирования $Справочник.ИсточникиФинансирования],
|   $Док.Сумма           as Сумма,
|   $Док.ДолгПоОплате    as ДолгПоОплате,
|   $Док.ПризнакПодпис   as [ПризнакПодпис $Перечисление.Признак],
|   $Док.ВидАкта         as [ВидАкта $Справочник.ВидАкт],
|   $Спр.Заказчик        as [Заказчик $Справочник.Заказчик],
|   $Спр.Район           as [Район $Справочник.Области]
|FROM
|   _1SJourn as Жур
|INNER JOIN
|   $Документ.АктОбъемаРабот as Док ON Док.IDDoc = Жур.IDDoc
|INNER JOIN
|   $Справочник.Объект as Спр ON Спр.ID = $Док.Объект 
|WHERE    
|   Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ 
|   AND Жур.Closed & 1 = 1
|   AND $Док.ВидАкта <> :ВидАктов
|   AND $Док.ДолгПоОплате <> 0 
|   AND $Спр.Заказчик = :ТекЗаказчик
|";

Конструкция [ИмяКолонки $Справочник.Имя] позволяет сразу обращаться к реквизитам полученного значения через точку (например, ТЗ.ИсточникФинансирования.Наименование).


Шаг 2. Корректировка обработки данных в ТаблицеЗначений

Рассмотрим переменные с1, с2, с3, с4 в исходном коде. Это внутренние имена колонок промежуточного объекта ТаблицаЗначений (ТабОбъект), куда складываются суммы:

  1. с1 — группировочная колонка (Объект строительства);
  2. с2 — неподписанная сумма;
  3. с3 — подписанная сумма;
  4. с4 — долг по экспертизе.

При добавлении нового поля в структуру ТабОбъект важно правильно применить метод Свернуть(). Метод принимает два строковых параметра:

  1. Список колонок группировки (не суммируются, по ним объединяются строки);
  2. Список суммируемых колонок (числовые ресурсы).

Если новое поле не указать в первом параметре метода Свернуть(), оно будет очищено. Добавим колонку сИсточник:


ТабОбъект.НоваяКолонка("с1");
ТабОбъект.НоваяКолонка("сИсточник");
ТабОбъект.НоваяКолонка("с2");
ТабОбъект.НоваяКолонка("с3");
ТабОбъект.НоваяКолонка("с4");

// Заполнение в цикле выборки запроса:
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
    // ... вычисление сумм ...
    ТабОбъект.НоваяСтрока();
    ТабОбъект.с1        = ТЗ.Объект;
    ТабОбъект.сИсточник = ТЗ.ИсточникФинансирования;
    ТабОбъект.с2        = СуммаНеПодпис;
    ТабОбъект.с3        = СуммаПодпис;
    ТабОбъект.с4        = ДолгЭкспертизы;
КонецЦикла;

// Выполняем группировку с учетом новой колонки:
ТабОбъект.Свернуть("с1,сИсточник", "с2,с3,с4");

Шаг 3. Добавление колонок в макет печатной формы

В платформе 1С 7.7 печатная форма формируется построчно при помощи метода Таб.ВывестиСекцию("ИмяСекции"). Перейдем на вкладку Таблица отчета и выполним настройку:

  1. Вставим два новых вертикальных столбца в область вывода строк отчета (в секциях Шапка, Объект, Итого, Всего).
  2. В секции Шапка укажем текстовые заголовки: «Источник финансирования» и «Примечание».
  3. В секции Объект для ячейки источника финансирования откроем Свойства ячейки, переключим тип на Выражение и в поле формулы укажем переменную: ПечИсточник.
  4. Для второй колонки («Примечание» для ручного ввода на бумаге) в секции Объект оставим тип Текст и пустое значение с рамками ячейки.

Шаг 4. Подготовка переменных перед выводом секции

Перед каждым вызовом метода Таб.ВывестиСекцию("Объект") присвоим значение переменной ПечИсточник:


ТабОбъект.ВыбратьСтроки();
Пока ТабОбъект.ПолучитьСтроку() = 1 Цикл
    Если (ТабОбъект.с2 > ОстМеньше) или (ТабОбъект.с3 > ОстМеньше) или (ТабОбъект.с4 > ОстМеньше) Тогда
        сз.УдалитьВсе();
        сз.ДобавитьЗначение(ТабОбъект.с1.Код);
        
        // Подготавливаем значение для макета:
        ПечИсточник = ТабОбъект.сИсточник;
        
        Таб.ВывестиСекцию("Объект");
        Номер = Номер + 1;
        
        ТабЗначЗаказчик.НоваяСтрока();
        ТабЗначЗаказчик.с1 = ТабОбъект.с2;
        ТабЗначЗаказчик.с2 = ТабОбъект.с3;
        ТабЗначЗаказчик.с3 = ТабОбъект.с4;
    КонецЕсли;
КонецЦикла;

Шаг 5. Настройка интерактивного ввода пользователем

Обратим внимание на режим отображения таблицы в конце процедуры Сформировать(). В коде установлена инструкция:

Таб.ТолькоПросмотр(1);

Если требуется, чтобы пользователь мог вносить пометки прямо в ячейки сформированной на экране таблицы 1С, необходимо снять защиту от редактирования, изменив параметр на 0:

Таб.ТолькоПросмотр(0);

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

← На главную