1с табличный документ
Хотел написать красивую заметку в рубрику ‘Джуниор 1с’ о том, как в 1с работать с табличным документом под управляемые формы. Где на простом примере бы описал как создать макет, как его получить и заполнить его области и параметры, а затем вывести на форму в табличный документ. Но потом нашел у себя совершенно безумный отчет, который был сделан в оперативном режиме за 1 день (обычная задача, когда нужно срочно здесь и сейчас – и здесь уже приходиться жертвовать оптимизацией и здравым смыслом) и решил его взять за основу этой статьи. В конце статьи предоставлен отчет для скачивания!
Итак, приведем основные шаги для успешного создания отчета с помощью табличного документа в 1с:
- Создаем макет – тип табличный документ (создаем его у нужного объекта: отчета, внешнего отчета, обработки, справочника, внешний макет и т.д.);
- В созданном макете описываем области и параметры этих областей. При необходимости указываем параметры расшифровки для ячеек;
- В серверной функции создаем новый табличный документ, получаем созданный нами макет и производим его наполнение, с последовательным выводом информации в табличный документ. Из функции возвращаем табличный документ;
- На форме создаем реквизит с типом ‘ТабличныйДокумент’ и выводим его на форму. Присваиваем ему полученное значение из вышеуказанной функции;
- Наслаждаемся результатом.
Вкратце рассмотрим каждый этап.
Создаем наш макет табличного документа:
С помощью инструментов макета описываем его: создаем области, рисуем шапку, заполняем параметры и расшифровку:
Создаем на форме реквизит с типом ‘ТабличныйДокумент’, создаем команду формирования печатной формы и выводим все это дело на форму нашего отчета:
Отлично, теперь переходим непосредственного к самому программированию. В клиентской процедуре нашей команды прописываем отображение макета на форме и функцию, которая нам вернет готовый табличный документ с данными:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
&НаКлиенте Процедура Сформировать(Команда) Если НЕ ЗначениеЗаполнено(ЭтаФорма.Контрагент) Тогда Возврат; КонецЕсли; ТабличныйДокумент = СформироватьНаСервере(); ТабличныйДокумент.ФиксацияСлева = 1; ТабличныйДокумент.ФиксацияСверху = 3; ЭтаФорма.Результат = ТабличныйДокумент; //ЭтаФорма.Результат.Показать(); КонецПроцедуры |
Самое интересно происходит здесь в процедуре ‘СформироватьНаСервере()’. Её полный код вы можете посмотреть в готовом отчете в конце этой статьи. Рассмотрим лишь основные её моменты.
Первое что мы должны сделать это создать новый табличный документ и получить наш макет:
1 2 3 4 5 6 7 8 9 10 11 |
&НаСервере Функция СформироватьНаСервере() ТабличныйДокумент = Новый ТабличныйДокумент; ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_бит_РеестрПлатежей_РеестрПлатежей"; МакетОтчета = РеквизитФормыВЗначение("Отчет").ПолучитьМакет("Макет"); //.... КонецФункции |
Здесь важно понимать, как получить правильно макет. В данном примере таким способом получается макет внешнего отчета или обработки (РеквизитФормыВЗначение(“Объект”)). Макет у объекта конфигурации мы можем получить следующим образом:
1 2 3 |
МакетОбъекта = ПолучитьОбщийМакет("ОписаниеИзмененийСистемы"); МакетОбъекта = Отчеты._ДемоФайлы.ПолучитьМакет("ТестовыйМакет"); МакетОбъекта = Справочники._ДемоБанковскиеСчета.ПолучитьМакет("ТестовыйМакет"); |
Далее мы начинаем выводить области макета и отображать их в табличном документе:
1 2 3 4 5 |
ОблЗаголовок = МакетОтчета.ПолучитьОбласть("Гр_Заголовок"); ТабличныйДокумент.Вывести(ОблЗаголовок); ОблШапка = МакетОтчета.ПолучитьОбласть("ШапкаОтчета"); ТабличныйДокумент.Вывести(ОблШапка); |
Если есть необходимость то в полученной области мы заполняем параметры и расшифровку и только затем мы выводим область в табличный документ. В случае если будет заполнен параметр расшифровки, то по двойному щелчку в макете нам откроется значение расшифровки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
ТЗ = ДетальныеЗаписиАкты(ВременныйМассивВсехДоговоров); Для Каждого СтрокаТЗ Из ТЗ Цикл Гр_Документы = МакетОтчета.ПолучитьОбласть("Гр_ДокументыЗаявкиНаЗатраты"); Гр_Документы.Параметры.ДатаДокумента = СтрокаТЗ.ДатаДокумента; Гр_Документы.Параметры.СуммаДокумента = СтрокаТЗ.СуммаДокумента; Гр_Документы.Параметры.НомерДокумента = СтрокаТЗ.НомерДокумента; Гр_Документы.Параметры.СуммаГУ = СтрокаТЗ.барк_СуммаГарантийныеУдержания; Гр_Документы.Параметры.СуммаЗА = СтрокаТЗ.барк_СуммаАванса; ДетальныеЗаписиОстатокВыполнения = ДетальныеЗаписиОстатокВыполнения - СтрокаТЗ.СуммаДокумента; Гр_Документы.Параметры.ОстатокВыполнения = ДетальныеЗаписиОстатокВыполнения; Гр_Документы.Параметры.РасшифровкаДокумент = СтрокаТЗ.Ссылка; ОсновныеИтогиПоСтатьямУдержаний = ДетальныеЗаписиАктыУдержания(СтрокаТЗ.Ссылка); Для Каждого СтрокаУдрежания Из ОсновныеИтогиПоСтатьямУдержаний Цикл Гр_Документы.Параметры[СтрокаУдрежания.Ключ] = СтрокаУдрежания.Значение; КонецЦикла; ТабличныйДокумент.Вывести(Гр_Документы); ТЗ_Списания = ДетальныеЗаписиСписания(СтрокаТЗ.Ссылка); Для Каждого ЭлементСписание Из ТЗ_Списания Цикл Гр_ДокументыСписание = МакетОтчета.ПолучитьОбласть("Гр_ДокументыСписания"); Гр_ДокументыСписание.Параметры.ДатаДокумента = ЭлементСписание.ДатаДокумента; Гр_ДокументыСписание.Параметры.СуммаДокумента = ЭлементСписание.СуммаДокумента; Гр_ДокументыСписание.Параметры.РасшифровкаДокумент = ЭлементСписание.Ссылка; ТабличныйДокумент.Вывести(Гр_ДокументыСписание); КонецЦикла; КонецЦикла; |
Вот таким вот образом мы шаг за шагом получаем данные и отображаем их в табличном документе.
Также дополнительно если мы хотим обеспечить сворачивание группы данных, как в макете на СКД, то для этого нам необходимо использовать методы табличного документа ‘НачатьГруппуСтрок’ и ‘ЗакончитьГруппуСтрок’:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
ТабличныйДокумент.НачатьГруппуСтрок(, Истина); //{Итоги 1-ого уровня ВременныйМассивВсехДоговоров = Новый Массив;; ВременныйМассивВсехДоговоров.Добавить(СтрокаДерева.ДоговорКонтрагента); ОбщаяСуммаАванса = ОсновныеИтогиАванс(ВременныйМассивВсехДоговоров); //.... //.... ТабличныйДокумент.ЗакончитьГруппуСтрок(); КонецЦикла; |
Ну и в результате нашего алгоритма нам необходимо вернуть заполненный табличный документ, для отображении его на клиенте:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
КонецЦикла; КонецЦикла; КонецЦикла; ТабличныйДокумент.ЗакончитьГруппуСтрок(); КонецЦикла; Возврат ТабличныйДокумент; КонецФункции |
При необходимости указываем дополнительные параметры табличного документа и присваиваем его значение реквизиту формы. После чего автоматически обновится отображение на форме:
Если мы хотим вывести печатную форму отдельно вне формы, либо сохранить её на диск, то для этого достаточно использовать следующие методы макета: ‘Показать’ и ‘Записать’.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
&НаКлиенте Процедура Сформировать(Команда) Если НЕ ЗначениеЗаполнено(ЭтаФорма.Контрагент) Тогда Возврат; КонецЕсли; ТабличныйДокумент = СформироватьНаСервере(); ТабличныйДокумент.ФиксацияСлева = 1; ТабличныйДокумент.ФиксацияСверху = 3; ТабличныйДокумент.Показать(); ТабличныйДокумент.Записать("<ИмяФайла>"); //ЭтаФорма.Результат = ТабличныйДокумент; КонецПроцедуры |
Как видите работать с табличным документом в 1с не сложно. С ним легко настроить любую печатную форму и сделать отчет. Конечно отчеты лучше сделать на системе компоновки данных, но если отчет сложный и тем более нет времени на СКД, то на помощь всегда придет макет табличного документа.
Отчет в данном примере сложный тем, что здесь собираются итоги по группировкам, которые в СКД мы с легкостью получили бы конструктором. Но на тот момент не было возможность сделать его через СКД, проще было набросать рабочее решение через макет.
Качайте отчет для примера! Но так как в нем описано получение данных и его вывод лучше не делать:). Возможно когда будет свободное время я его оптимизирую – а может быть и нет. Всем удачи! Пока!
Скачать файлыcraft1c_fin_AktSverkiSPodryadchikami.erf
Спонсор предоставленных материалов ютуб каналы Zona Комфорта и CRAFT1С! Подписывайся!
Отличная заметка!
неплохая заметка
Добавьте описание сложных расшифровок. Эх… мне этого так не хватало в юности
Привет! Ок – могу даже отдельную заметку на эту тему сделать!
Все Круто. Статья Супер. Но еще интересует продолжение…а именно как отправить содержимое реквизита “результат” в теле письма по электронной почте. Как преобразовать Тип Табличный документ в Тип Строка…я заметил у Вас кнопочка отправки есть )))
Привет! Да это вроде как из типового функционала) просто табличный документ помещается во временный файл ексель и он уже потом прикрепляется к письму… Вроде ничего сложного. Если будет время закину решение)