Как соединить 2 макета 1с
В этом уроке мы научимся создавать табличные макеты в 1С, которые в дальнейшем могут быть использованы для программного формирования печатных форм.
К примеру, как я сформировал макеты для тестовой базы.
Я зашёл в форму обработки и перешёл на закладку "Макеты":
Далее я нажал на "Плюсик" и выбрал тип "Табличный документ":
Открылся редактор табличного документа:
Во многих моментах работа в редакторе похожа на работу в программе Excel, но есть свои особенности, на которых я бы хотел остановиться.
Как назначить имя области
Что я понимаю под областью? Это и несколько строк и несколько ячеек, в общем любая часть табличного документа, которая может быть выделена нами, используя левую кнопку мыши.
Вот выделенная область из двух строк:
А вот выделенная область из 2 столбцов:
А сейчас мы выделим область на пересечении первых двух строк и первых двух столбцов:
Так вот. Если мы сумели выделить нужную нам область, то, нажав на ней правой кнопкой и выбрав пункт "Свойства", мы сможем присвоить ей имя, по-которому мы будем к ней обращаться из нашего кода, формируя печатную форму:
Это базовый навык, которым мы должны овладеть, чтобы суметь делать табличные макеты.
Как посмотреть уже назначенные имена
А давайте посмотрим какие имена областям уже назначены в макете?
Для этого из меню конфигуратора выбираем:
Вот она наша только что назначенная область "Шапка":
А если сейчас выделим её в диалоге и нажмём "Выбрать", то в редакторе будет выбрана соотв. область ячеек:
Как задать параметр области
Часто при формировании печатной области требуется не просто вывести область из макета. Нужно ещё и заполнить определенные ячейки определенными параметрами.
Эти параметры мы задаём у области и заданные значения автоматически попадают в нужные ячейки.
Для этого в свойствах нужной нам ячейки (куда будет выводиться значение параметра).
Указываем в поле "Заполнение" значение "Параметр", а в поле "Параметр" пишем имя, по которому мы будем обращаться к этому параметру из кода:
Если же указать в заполнении не "Параметр", а "Шаблон", то можно будет в самой ячейке указать какой-то текст (шаблон) с использованием имени параметра в квадратных скобках:
В этом случае имя параметра (и его позиция в шаблоне) указывается в квадратных скобках.
Как задать параметр расшифровки?
Имя параметра расшифровки задаётся всё в тех же свойствах ячейки:
Уже потом из кода мы присвоим этому параметру (по имени "РасшифровкаНоменклатуры") нужное значение (ссылку на элемент номенклатуры).
И когда пользователь сделает двойной щелчок на этой ячейки - ему откроется значение, присвоенное параметру расшифровки (в данном случае откроется форма элемента номенклатуры).
Дальнейшее напутствие
Мы рассмотрели необходимые основы. А теперь внимательно исследуйте рабочий пример.
Скачайте и разверните эту базу. Найдите в ней обработку "ОбработкаДляИспытаний".
В её макетах есть табличные варианты. Исследуйте их как можно тщательнее, опираясь на приёмы, которые мы рассмотрели чуть выше.
Уже затем (в этой же обработке) переходите к примерам использования этих макетов. Только так вы научитесь создавать свои печатные формы на основе табличных макетов.
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Алгоритм и расширение (как пример) демонстрируют механизм одновременного использования двух макетов (стандартного и измененного), принадлежащих одной записи регистра «Макеты печатных форм» («ПользовательскиеМакетыПечати») в конфигурации «1С:Бухгалтерия предприятия, редакция 3.0».
Алгоритм решения задачи следующий (все модули в моём случае прописываются в расширении к конфигурации БП 3.0). Внесённые изменения в стандартные процедуры обозначены через «скобки»: //дельта стало теперь НАЧАЛО и //дельта стало теперь КОНЕЦ. Это может пригодиться для понимания того, какие были внесены изменения в стандартные процедуры.
1. В модуле менеджера соответствующего документа (в примере это документ «Реализация (акты, накладные)») в процедуру «Печать» добавляем текст, касающийся второй измененной пользователем печатной формы. Ниже приведена часть данной процедуры:
2. В модуле менеджера соответствующего документа (в примере это «Реализация (акты, накладные)») в процедуру «ДобавитьКомандыПечати» добавляем текст, касающийся второй печатной формы. Ниже приведен весь текст данной процедуры:
3. В общем модуле «ПечатьТорговыхДокументов» изменяем процедуру печати необходимой печатной формы (в случае примера это процедура «ПечатьАктаОбОказанииУслуг»). Ниже приведена часть данной процедуры:
4. В общем модуле «ПечатьТорговыхДокументов» добавляем свою процедуру печати необходимой печатной формы (в случае примера это процедура «д_МакетПечатнойФормы»). Ниже приведен весь текст данной процедуры:
После выполнения всех этих действий у вас в соответствующем документе станет доступным печать обоих макетов одной печатной формы. Расширение подключается к конфигурации «1С:Бухгалтерия 3.0» и после перезапуска базы в соответствующем документе появляется возможность печати обоих вариантов макета одной печатной формы. Подключается расширение в меню «Администрирование → Печатные формы, отчеты и обработки → Расширения», после этого надо перезапустить базу. Разработка и тестирование осуществлялись на типовом релизе «1С:Бухгалтерия предприятия, редакция 3.0» 3.0.70.50 и платформе 1С 8.3.14.1779.
Примечания:
- предложенный механизм использования того или иного макета работает только в процессе формирования печатной формы через кнопку «Печать» и не отрабатывает событие, если печатные формы формируются как вложения в электронное письмо при нажатии кнопку отправки электронного письма на форме документа.
Собственно, проблема, которая может возникнуть при присоединении одного табличного документа к другому в том, что строки документов изначально могут иметь один формат строк, но при этом разную ширину колонок. При присоединении одного такого документа к другому мы получим одну и туже ширину колонок табличного документа, т.е. документ будет выглядеть не так как вы ожидаете.
Рис.1. Ширина колонок изменилась и логотип сместился вправо.
При каких сценариях это происходит:
- При объединении нескольких печатных форм в один табличный документ;
- При дополнении отчета на СКД областью из своего макета.
Суть решения
Все просто - в момент присоединения одного табличного документа к другому мы создаем для него новый формат строк. По сути тоже самое, что происходит при интерактивном редактировании макета, когда вы выделяете строки и изменяете для них ширину столбца.
Рис.2. Табличный документ из двух частей. Создан новый формат строк.
Рис. 3. Вопрос в редакторе табличного документа при изменении ширины столбцов.
В качестве бонуса отчет на СКД с логотипом.
Тестировалось на платформе 8.3.13.1513
Специальные предложения
Всё равно ширина колонок будет одна и та же в обоих макетах, т.е. уедет ваш второй макет от изначального шаблона. Или я ошибаюсь? Точно, ошибаюсь, проверил :) Тогда "плюс" :)
Коллеги доброго времени суток, есть функция которая получает сформированные Печатные формы(далее ПФ) у каждого табдока есть параметр "ШиринаТаблицы" для всех сформированных ПФ разный(зависит от макета) и объединяет их в большойТАбДОк.
При попытке вывести на печать наш большойТАбДОк (при условии что для него АвтоМасштаб = Истина) получается что та ПФ которая с меньшим параметром "ШиринаТаблицы" становится нечитаемым(скрин прилагается) . Хотелось узнать можно ли как то решить эту проблему не унифицируя все макеты ПФ?
ПЫСЫ: параметр ШиринаТаблицы недоступен для записи.
Особенности использования форматированных строк описаны на ИТС
Особенности работы с форматами строк табличного документа
Но из голой теории мало что понятно - не хватает картинок. примеров на реальных макетах.
В справке 1С - предоставлен пример такой же , как и в публикации - который отрабатывает присоединяемый табл. документ, у которого один (!) формат строк на весь макет.
Если в присоединяемом табл. документе много разных блоков - с разными форматами строк, то алгоритм уже не сработает - поскольку все последующие строки табл. документа будут приводиться к формату первого блока строк.
Автор алгоритма потрудился разделить присоединяемый табл.документ на все блоки разных форматов строк - присоединил каждый по отдельности. Ему огромное спасибо за предоставленный алгоритм!
Расскажу в чем нюанс. Сначала я выводил так таб. документы:
В таком случае два макета садятся в один - с первого взгляда красиво, но в формат А4 Портрет уже не влезает - колонки изменяют ширину. По отдельности каждый макет влезает в А4.
Пришлось воспользоваться алгоритмом соединения табл. документов через СоздатьФорматСтрок() - результат положительный и представлен на скриншотах.
1С 8.3 Объединение табличных документов (с разной шириной)
// Процедура ПрисоединитьТабличныйДокумент осуществляет вывод Присоединяемого документа под указанным
// С возможностью создания нового формата строк для всей области присоединяемого документа
// Удобно использовать, чтобы колонки различной ширины не разъезжались
//
// Параметры:
// ПриемникТаблДок - ТабличныйДокумент - документ, куда будут добавлены области присоединяемого документа
// ПередатчикТаблДок - ТабличныйДокумент/ОбластьЯчеекТабличногоДокумента - документ, который присоединяем
// СоздатьФорматСтрок - Булево - флаг, указывающий на то, что необходимо создать свой формат строк
//
Процедура ПрисоединитьТабличныйДокумент ( ПриемникТаблДок , Знач ПередатчикТаблДок , Знач СоздатьФорматСтрок = Ложь) Экспорт
ВременныйТаблДок = Новый ТабличныйДокумент ;
ОбластьЯчеек = ВременныйТаблДок . Вывести ( ПередатчикТаблДок );
Если СоздатьФорматСтрок Тогда
ОбластьЯчеек . СоздатьФорматСтрок ();
КонецЕсли;
ПриемникТаблДок . Вывести ( ВременныйТаблДок );
// Добавляет один сформированный табличный документ к другому
//
// Параметры:
// - табличный документ, в который добавляется Табличный документ
// - табличный документ, вставляемый в приемник
Процедура ДобавитьТабличныйДокумент ( ПриемникТаблДок , ПередатчикТаблДок )
Если ПередатчикТаблДок = Неопределено Тогда
Возврат;
КонецЕсли;
НачалоНовогоТД = ПриемникТаблДок . ВысотаТаблицы + 1 ;
//Разобъем вствляемый ТД на куски форматов строк
ФорматыСтрокТЗ = Новый ТаблицаЗначений ;
ФорматыСтрокТЗ . Колонки . Добавить ( "ПерваяСтрока" );
ФорматыСтрокТЗ . Колонки . Добавить ( "ПоследняяСтрока" );
ФорматыСтрокТЗ . Колонки . Добавить ( "МассивЗначенийШирины" );
//Чтобы узнать ширину колонки для каждой ячейки необходимо разъединить все объединенные ячейки
//А, т.к. вставляемый ТД нам не нужно изменять, создадим копию вставляемого ТД
ВременныйТаблДок = ПередатчикТаблДок . ПолучитьОбласть ();
ВременныйТаблДок . Область (). Разъединить ();
//Готовим таблицу, где будет храниться информация обо всех "группах" форматирования строк
ПредыдущаяШиринаСтрокой = "" ;
Для НомерСтроки = 1 По ВременныйТаблДок . ВысотаТаблицы Цикл
МассивЗначенийШирины = Новый Массив ;
Для НомерКолонки = 1 По ВременныйТаблДок . ШиринаТаблицы Цикл
МассивЗначенийШирины . Добавить ( ВременныйТаблДок . Область ( НомерСтроки , НомерКолонки ). ШиринаКолонки );
КонецЦикла;
ШиринаСтрокой = ПолучитьШиринуСтрокой ( МассивЗначенийШирины , ";" );
Если ШиринаСтрокой <> ПредыдущаяШиринаСтрокой Тогда
Если ФорматыСтрокТЗ . Количество ()> 0 Тогда
ФорматыСтрокТЗ [ ФорматыСтрокТЗ . Количество () - 1 ]. ПоследняяСтрока = НомерСтроки - 1 ;
КонецЕсли;
ФорматыСтрокСтрока = ФорматыСтрокТЗ . Добавить ();
ФорматыСтрокСтрока . ПерваяСтрока = НомерСтроки ;
ФорматыСтрокСтрока . МассивЗначенийШирины = МассивЗначенийШирины ;
КонецЦикла;
ФорматыСтрокТЗ [ ФорматыСтрокТЗ . Количество () - 1 ]. ПоследняяСтрока = НомерСтроки - 1 ;
//Теперь вставляем в Приемник вставляемую ТД кусками. Сразу же устанавливаем ширину колонок
Для Каждого СтрокаФорматыТЗ Из ФорматыСтрокТЗ Цикл
ПерваяСтрокаОбласти = НачалоНовогоТД + СтрокаФорматыТЗ . ПерваяСтрока - 1 ;
ПоследняяСтрокаОбласти = НачалоНовогоТД + СтрокаФорматыТЗ . ПоследняяСтрока - 1 ;
КусокВставляемогоТабДок =
ПередатчикТаблДок . ПолучитьОбласть ( СтрокаФорматыТЗ . ПерваяСтрока ,, СтрокаФорматыТЗ . ПоследняяСтрока );
ОбластьИсточник = КусокВставляемогоТабДок . Область ();
ОбластьПриемник = ПриемникТаблДок . Область ( ПерваяСтрокаОбласти , , ПоследняяСтрокаОбласти , );
ПриемникТаблДок . ВставитьОбласть ( ОбластьИсточник , ОбластьПриемник );
ОбластьПриемник . СоздатьФорматСтрок ();
Для Счетчик = 1 По КусокВставляемогоТабДок . ШиринаТаблицы Цикл
ПриемникТаблДок . Область ( ПерваяСтрокаОбласти , Счетчик , ПоследняяСтрокаОбласти , Счетчик ). ШиринаКолонки =
СтрокаФорматыТЗ . МассивЗначенийШирины [ Счетчик - 1 ];
КонецЦикла;
Функция ПолучитьШиринуСтрокой ( перМассив , разделитель = ";" )
Рез = "" ;
Для Каждого Стр Из перМассив Цикл
Рез = Рез + стр + разделитель ;
КонецЦикла;
Возврат Рез ;
КонецФункции
При этом на выводе мы имеем, что то, что выводится из макета2, имеет ту же самую ширину колонок, что в макете1, а вовсе не ту, что я задал в макете2. Как с этим бороться? Может быть, есть какой-то разделитель табличного документа? Просто фигачить всё из одного макета очень неудобно - слишком разные наборы и размеры колонок.
почти, лучше все таки из временного таб дока при выводе в основной брать область по высоте и ширине таблицы
можешь в одном Макете сделать две области именованные и внутри них уже играть с шириной колонок независимо можешь сделать микроколонки и объединять их
чот я сомневаюсь что есть программный функционал того как в конфигураторе можно задать разные ширины колонок в макете. сильно сомневаюсь.
благодарю за идею. Описание здесь: Просто разбиваю ячейки. Хотелось бы конечно понять, как решить задачу в (на будущее), но и на том спасибо.
я, к сожалению, эту бубуйню с шириной так и не смог забороть, когда вывод ШК на ПФ рисовал. "нижний" все одно к "верхнему" приводится
в макете-то можно. А в табличном документе, куда потом это всё выводится? Он же, сука, ширины всех колонок берёт так, как в самой первой своей строке. Вот если бы в табличном документе был какой-то разделитель, отмечающий, что до строки Х у нас одна таблица, а после - другая, с другой структурой колонок. это было бы дело.
"если бы в табличном документе был какой-то разделитель, отмечающий, что до строки Х у нас одна таблица, а после - другая, с другой структурой колонок. " - Это легко реализовать программно. Я так выводил отчёт из 12-ти таблиц - у каждой разное кол-во колонок, и соответственно, разная ширина колонок, чтобы на страницу одинаково влезали.
+ А делается это при помощи: СоздатьФорматСтрок (CreateFormatOfRows) Синтаксис: СоздатьФорматСтрок Описание: Создает у области новый формат строк. В новом формате строк размеры колонок будут соответствовать размерам колонок, которые были установлены в области.
надо попробовать , никогда не было надобности. Так-то через копи-пасте и так вставляются, через специальную вставку (там тоже указывать с форматом строк галку)
+ я, когда мутил вывод ШК, как только не извращался с шириной программно, но один фиг - сбивалась к "верхнему"
Только один хрен, после СоздатьФорматСтрок придётся ширину ручками выставлять в этой новой области. Че не сделать было сразу в методе Вывести - параметр, типа сохранить формат ячеек. И было бы как в Специальной вставке в меню.
Читайте также: