При сопровождении отчетов в среде 1С:Предприятие 7.7 разработчики нередко сталкиваются с кодом, использующим внешнюю компоненту 1С++ и прямой доступ к данным через объект ODBCRecordset. Доработка таких отчетов требует понимания не только работы табличного документа (макета), но и специфики передачи данных через объект ТаблицаЗначений, а также синтаксиса типизации полей в прямых SQL-запросах.
Разберем по шагам, как правильно добавить в отчет две новые колонки: одну — для отображения связанных данных из справочника, а вторую — для пользовательских пометок и записей.
Проанализируем текст запроса. В исходном коде данные извлекаются из таблицы журнала документов _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 $Спр.Заказчик = :ТекЗаказчик
|";
Конструкция [ИмяКолонки $Справочник.Имя] позволяет сразу обращаться к реквизитам полученного значения через точку (например, ТЗ.ИсточникФинансирования.Наименование).
Рассмотрим переменные с1, с2, с3, с4 в исходном коде. Это внутренние имена колонок промежуточного объекта ТаблицаЗначений (ТабОбъект), куда складываются суммы:
с1 — группировочная колонка (Объект строительства);с2 — неподписанная сумма;с3 — подписанная сумма;с4 — долг по экспертизе.При добавлении нового поля в структуру ТабОбъект важно правильно применить метод Свернуть(). Метод принимает два строковых параметра:
Если новое поле не указать в первом параметре метода Свернуть(), оно будет очищено. Добавим колонку сИсточник:
ТабОбъект.НоваяКолонка("с1");
ТабОбъект.НоваяКолонка("сИсточник");
ТабОбъект.НоваяКолонка("с2");
ТабОбъект.НоваяКолонка("с3");
ТабОбъект.НоваяКолонка("с4");
// Заполнение в цикле выборки запроса:
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
// ... вычисление сумм ...
ТабОбъект.НоваяСтрока();
ТабОбъект.с1 = ТЗ.Объект;
ТабОбъект.сИсточник = ТЗ.ИсточникФинансирования;
ТабОбъект.с2 = СуммаНеПодпис;
ТабОбъект.с3 = СуммаПодпис;
ТабОбъект.с4 = ДолгЭкспертизы;
КонецЦикла;
// Выполняем группировку с учетом новой колонки:
ТабОбъект.Свернуть("с1,сИсточник", "с2,с3,с4");
В платформе 1С 7.7 печатная форма формируется построчно при помощи метода Таб.ВывестиСекцию("ИмяСекции"). Перейдем на вкладку Таблица отчета и выполним настройку:
Шапка, Объект, Итого, Всего).Шапка укажем текстовые заголовки: «Источник финансирования» и «Примечание».Объект для ячейки источника финансирования откроем Свойства ячейки, переключим тип на Выражение и в поле формулы укажем переменную: ПечИсточник.Объект оставим тип Текст и пустое значение с рамками ячейки.Перед каждым вызовом метода Таб.ВывестиСекцию("Объект") присвоим значение переменной ПечИсточник:
ТабОбъект.ВыбратьСтроки();
Пока ТабОбъект.ПолучитьСтроку() = 1 Цикл
Если (ТабОбъект.с2 > ОстМеньше) или (ТабОбъект.с3 > ОстМеньше) или (ТабОбъект.с4 > ОстМеньше) Тогда
сз.УдалитьВсе();
сз.ДобавитьЗначение(ТабОбъект.с1.Код);
// Подготавливаем значение для макета:
ПечИсточник = ТабОбъект.сИсточник;
Таб.ВывестиСекцию("Объект");
Номер = Номер + 1;
ТабЗначЗаказчик.НоваяСтрока();
ТабЗначЗаказчик.с1 = ТабОбъект.с2;
ТабЗначЗаказчик.с2 = ТабОбъект.с3;
ТабЗначЗаказчик.с3 = ТабОбъект.с4;
КонецЕсли;
КонецЦикла;
Обратим внимание на режим отображения таблицы в конце процедуры Сформировать(). В коде установлена инструкция:
Таб.ТолькоПросмотр(1);
Если требуется, чтобы пользователь мог вносить пометки прямо в ячейки сформированной на экране таблицы 1С, необходимо снять защиту от редактирования, изменив параметр на 0:
Таб.ТолькоПросмотр(0);
Важное ограничение платформы 7.7: данные, введенные пользователем в ячейки печатной формы, существуют только в текущем экранном документе и не сохраняются в информационной базе при закрытии отчета. Если требуется постоянное хранение пользовательских комментариев, их следует записывать в реквизиты соответствующих документов или периодические реквизиты справочников.