1с получить текст из макета

Обновлено: 04.07.2024

В типовых конфигурациях на управляемых формах «1С Бухгалтерия предприятия 8», «1С Зарплата и управление персоналом 8», «1С Управление Торговлей 8» и т.д., которые реализованы с использованием БСП (библиотека стандартных подсистем) – есть такая замечательная вещь, как регистр сведений «Пользовательские макеты печати». Помимо своего прямого предназначения - дать пользователю возможность самостоятельно редактировать печатные формы (конечно в разумных пределах), его можно использовать и по другому назначению. А именно - хранить в нём некоторую информацию. Бывают ситуации, когда поставленная задача казалось бы не даёт возможности её выполнить, не внеся изменений в типовую конфигурацию. А менять типовую без крайней необходимости – ой, как не хочется. На мой взгляд - с помощью регистра сведений "Пользовательские макеты" - можно решать некоторые задачи. Регистр сведений "ПользовательскиеМакетыПечати" - имеет два измерения: "Объект" и "ИмяМакета", которые имеют тип "Строка" и один ресурс "Макет" с типом "ХранилищеЗначений", где можно хранить что угодно. Почему бы этим не воспользоваться. Ниже примеры из моей практики, где применял.

Пример для «1С Зарплата и управление персоналом 8»:

Необходимо из внешней торговой системы загружать данные о продажах и на основании этих данных рассчитывать премии продавцам. Продавцы имеют процент в зависимости от должности («стажер», «консультант» и т.д) и от места расположения магазина. Никакой линейной зависимости нет: одна и та же должность в разных магазинах имеет разный процент. В прежней редакции Зарплаты 2.5 был заведен «регистр сведений» в разрезе должность/подразделение со ставкой процента. При переходе на 3.1 – было решено использовать макет. Это позволило оставить конфигурацию полностью типовой. Использовать дополнительные реквизиты не получалось, т.к. тогда пришлось бы прописывать для каждого магазина должности и ставки процентов. Оставался бы открытым вопрос с хранением истории изменения ставок, да и забивать форму кучей дополнительных реквизитов тоже не хотелось.

Пример использования при печати:

Необходимо разработать внешнюю печатную форму (неважно что это будет, например трудовой договор по форме принятой в организации). При печати должно «всплывать» окно, в котором дополнительно указываются некоторые сведения, которые также выводятся в печатную форму. При этом должна сохранятся возможность повторной печати с этими же самыми сведениями: у одного сотрудника это одни условия, у другого – другие. В прежней версии использовался непериодический регистр сведений. Я сделал с использованием макета. При первичной печати данные в макет записываются, при повторной – считываются.

Конечно использование макетов - регистр сведений никогда не заменит, но в каких-то случаях очень даже полезен.

Ниже пример реализации по примеру с записью ставок процентов продаж:

Создаем внешнюю обработку, форму с табличной частью, которую должен заполнить пользователь и макет, который потом будет считывать. После заполнения – записываем данные. Простая табличная часть в три колонки "Подразделение", "Должность", "Процент" и "Дата сведений" на форме обработки.

С записью всё просто:

«ИмяВладельца» и «ИмяМакета» - большой роли не играют. Главное чтобы потом при считывании макета они были такими же.

Считываем макет и выводим на печать:

Для вывода на печать, чтобы использовать общую форму "Печать документов", нужно будет ещё в реквизиты формы добавить Таблицу значений с колонками произвольного типа "ИмяМакета", "ТабличныйДокумент", "ИмяВРЕГ", "СинонимМакета", "Экземпляров", "ПолныйПутьКМакету", "ИмяФайлаПечатнойФормы", "ОфисныеДокументы".

Есть ещё один момент который я считаю плюсом: если пользователь зайдёт в регистр сведений "Пользовательские макеты печати", то данный макет он не увидит. С одной стороны сохраняется конфиденциальность, а с другой не будет лишних вопросов.

Пример с обработкой прилагаю: работает и "1С Зарплатой 8" и с "1СБухгалтерией 8". В "1С Управлении торговлей 8" не сработает по причине отсутствия справочников "Должности" и "Подразделения", но сам принцип рабочий.

Обработка тестировалась на релизах "1С Зарплата 8" 3.1.7.144, 3.1.8.216; "1С Бухгалтерия 8" 3.0.67.54.

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

(0)У меня всё работает как обычно, поле рисунок, в нём изображение печати на прозрачном фоне.

(14) Второй день блужу по коду . )
(15) выложи код модуля внешней обработки где происходит передача в печать и подпись ?

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

(17)Так и я сделал . хотелось как в типовой печатной форме использовать галочку добавить рисунки. А так приходится использовать 2 внешних отчета , один без факсимиле, второй факсимиле.. Кстати кто знает как программно получить подпись руководителя ?

Я обычно вырезаю когда делаю ВПФ, так как в ВПФ макет уже свой, то в него тупо можно добавить необходимые подписи и печати..

(19) да я понял , я так сделал . но хочется чтобы можно было в одном макете и добавить и убрать печати , видимо не хватает какого-то параметра что ли в СтруктураПараметровПечати , хотя сверял с печатью макета из конфигурации данные те же самые передаются

И вот это делал - Не получается сделать флажок "Подпись и печать" во внешней печатной форме - со слов "Перед этим вызовом нужно определить ПараметрыПечати следующим образом:"?

(20)Сделай в одном макете.. даже в одной ВПФ, перед печатью показывай форму в которой будет вопрос выводить подпись и печать или нет..
И исходя из этого параметра выводи область подвала с рисунками или область подвала без рисунков..

(21) флажок есть в форме общей печати , но никакой реакции при включении,выключении не происходит . нет картинок

(22) хотелось бы разобраться именно как эта функция отрабатывает правильно .
ЗЫ так-то сделал 2 формы с печатью и без, напрямую тяну по фирме и руководителю картинки из двоичных данных.

(23)Поле рисунок полностью помещается в область печати? С этим вроде бывают проблемы я помню.

(27) Да, без проблем, когда я напрямую гружу подпись и печать . Терзают смутные сомнения, что используя метод ДополнитьДокументПодписьюИПечатью(ТабличныйДокумент, СведенияОДокументе, ОбъектыПечати, СтруктураПараметровПечати)
тоже заполняются, только не хватает какой-то переменной, которой в форме печати говорила бы, что есть такие реквизиты и их можно регулировать флажком "подпись и печать". потому что в отладчике не переходит по событию выбора значения флажка при выводе ВПФ и работает , когда из типовой формируешь

(28) Если взять УправлениеПечатьюБП.ДополнитьДокументПодписьюИПечатью(ТабличныйДокумент, СведенияОДокументе, ОбъектыПечати, ПараметрыПечати) из конфы по печати счета и вывести резалт в обычный табличный документ (просто для проверки), то факсимилей не будет. Получается, что она работает в купе с общей формой и тем флажком на форме. Отдельно его заюзать не получится. Хотя в потрохах, есть на это заточки, и туда якобы даже можно передать адрес хранилищ, где лежат картинки этих факсимиле, однако в конце по коду, все равно все факсимиле кодом же и очищаются. Т.е. кастомизации там не получилось, или я не понял как ее подюзать.

(29) ага , просто вызывая УправлениеПечатьюБП.ДополнитьДокументПодписьюИПечатью(ТабличныйДокумент, СведенияОДокументе, ОбъектыПечати, ПараметрыПечати) я так понял активируется флажок "Подпись и печать"

(31) а вот когда флажком уже в форме печати играешь , он в картинки с именами содержащими названия "факсимиле" добавляет или очищает .

(32) дык так и сделал , а не выходит каменный цветок . только названия картинок должны соответствовать названиям двоичных файлов картинок из подчиненного "Организациям" справочника ПрикрепленныефайлыОрганизаций. Иначе программа не знает в какую картинку подпись или печать вставлять

(33) Так ты сам получи двоичные данные в твоей ВПФ, и в макете в соответствующие рисунки картинку выведешь по твоим двоичным данным. Дальше они не должны очищаться.

(34) так и сделал , отключил при выводе в общую форму флажок , но хотелось бы разобраться в чем причина , и в дальнейшем пригодится делать ону форму и выводить печати интерактивно

(35) так причина в том и есть, что видимо разработчики не предполагали задействование ДополнитьДокументПодписьюИПечатью через ВПФ, как полноценный отдельный механизм. Нет туда адекватной прокидки без этой общей формы.

(36) ИМХО , что-то упускаем . "Общей форме печати" все равно откуда ее вызвали из типового документа или ВПФ , какой-то параметр при вызове впф не учитывается или неверно указывается и поэтому флажок не реагирует.

(37) Если бы это было так, тогда простой вызов этой функции рисовал бы тебе подписи :) Однако они очищаются.

(38) не факт , м.б. не передается ссылка на временное хранилище картинок , или какой-то параметр не указывается , который как раз и влияет на вывод и удаление картинок, х.з. тема интересная . но пока текучкой занят нет времени расковырять.

(39) >>не передается ссылка на временное хранилище картинок
Это не важно, они все равно очищаются в самом конце. По хорошему, там должна быть проверка на заполненность картинок и если они заполнены, их очищать не нужно. Тогда можно было бы напрямую дергать эту функцию и не знать себе проблем. Но сейчас там явная заточку и на форму, и на имена. Т.е. нет прокидки этого механизма наружу.

(40) Может и так , но всем не равнодушным по этой теме предлагаю докопаться до истины и дать рецепт что нужно сделать , чтобы в ВПФ флажок заработал как надо .

ВНИМАНИЕ! При использовании кодов описанных ниже, уберите символ _
Давайте рассмотрим на примерах как это делается! =) Мне известно 2 способа:
1. Путем замены шаблонного текста в макете Wordа.
2. Путем вставки текста с помощью закладок в Wordе,

В первом случае сразу скажу, что длина строки передаваемая в функцию замены, довольно небольшая  255 символов, да и расстановка шаблонных выражений в макете Word занимает довольно много времени. Через процедуру Content.Find.Execute.

Во втором случае длина, насколько мне известно неограниченна, также воськаться с закладками намного быстрее и удобнее, чем расставлять шаблонный текст. Используя Bookmarks().S_elect(). Поэтому давайте на коде рассмотрим второй пример.

И так, для начала необходимо добавить Word макет к документу. Добавляем макет с помощью конструктора макетов указав Active document и выбрав соответствующий макет.

Называем его Акт. Открываем макет в 1Ске, ставим курсор в нужном месте, переходим в меню Вставка закладка нажимаем добавить закладку к примеру у меня это НарушенияТекст

Теперь кидаем на форму документа кнопку Сформировать и по нажатию на нее пишем код который открывает наш макет Word ищем закладку по имени и вставляет туда текст:
Код 1C v 8.х
Это пример вывода множества строчек из табличной части  одной строкой, если нужно просто выгрузить какой-то реквизит то можно пропустить часть 2 и перейти к части 3.

Для выгрузки табличной части в форме таблицы можно использовать функцию автоформата, примеру код выгрузки табличной части документа Предписание:
Код 1C v 8.х
Ну вот и все =)
Автор: saylolpls

Еще способ Active document
В Конфигураторе Макеты - правый клик - Добавить
Тип макета: Active document
Создать новый - Документ Microsoft Word

Меню Вставка - Поле - Автоматизация - DocVariable
Написать имя поля в графе "Новое имя:" ДатаПриказа

В модуле формы документа создаем кнопку, и в ее обработчике пишем:
Код 1C v 8.х

2) добавляем не поле, а Закладку
Меню Вставка - Закладка и далее указываем ее имя ("ИмяЗакл")
Код 1C v 8.х

Код 1C v 8.2 УП


&НаКлиенте
Процедура ЗаписьТекстовогоФайла ( Команда )

КаталогСохранения = "D:\Storage\data" ;
СоздатьКаталог ( КаталогСохранения ); // Имя каталога (путь)

Файл_ТХТ = Новый ТекстовыйДокумент ;

// Наполнение файла содержимым
Файл_ТХТ . УстановитьТекст ( "
|MS Windows
|Linux
|MacOS
|OSX" );

// Очистка содержимого файла
Файл_ТХТ . Очистить ();

// Добавление 1-й строки:
Файл_ТХТ . ДобавитьСтроку ( "Word" );
// Добавление 2-й строки:
Файл_ТХТ . ДобавитьСтроку ( "Excel" );
// Добавление 3-й строки:
Файл_ТХТ . ДобавитьСтроку ( "Powerpoint" );

// Замена первой строки на "Outlook"
Файл_ТХТ . ЗаменитьСтроку ( 1 , "Outlook" );

// Вставка новую строки сразу после 1-й (*на место 2-й)
Файл_ТХТ . ВставитьСтроку ( 2 , "Access" );

// Удаление 2-й строки: ("Access")
Файл_ТХТ . УдалитьСтроку ( 2 );

// Запись/перезапись файла (D:\Storage\data\MS.txt) на диск
// Параметры: путь, кодировка, разделитель строк
Файл_ТХТ . Записать ( КаталогСохранения + "\MS.txt" , КодировкаТекста . UTF8 , Символы . ВК + Символы . ПС );

// Открытие созданного файла в блокноте
ЗапуститьПриложение ( КаталогСохранения + "\MS.txt" );

&НаКлиенте
Процедура ЧтениеТекстовогоФайла ( Команда )

Файл_ТХТ = Новый ТекстовыйДокумент ;

Файл_ТХТ . Прочитать ( ПутьКФайлу_ТХТ , КодировкаТекста . UTF8 , Символы . ВК + Символы . ПС );

// Показать текст целиком
Сообщить ( Файл_ТХТ . ПолучитьТекст ());
//Outlook
//Excel
//Powerpoint

// Показать текст по строкам
Для Индекс = 1 По Файл_ТХТ . КоличествоСтрок () Цикл
Сообщить ( Файл_ТХТ . ПолучитьСтроку ( Индекс )); //. Outlook . Excel . Powerpoint
КонецЦикла;

Формирование печатной формы из текстового макета в 1С 8.3:

&НаКлиенте
Процедура ФормированиеПечатнойФормыИзТекстовогоМакета ( Команда )

ФормаПечати = СформироватьПечатнуюФорму ();
ФормаПечати . Показать ( "Счет №2020" );

&НаСервере
Функция СформироватьПечатнуюФорму ()

ФормаПечати = Новый ТекстовыйДокумент ;
Макет = ЭтотОбъект . ПолучитьМакет ( "Макет_Счета" );

// Получение области и макета по имени
Шапка = Макет . ПолучитьОбласть ( "Шапка" );
// Заполнение параметров
Шапка . Параметры . Дата = ТекущаяДата ();
Шапка . Параметры . Номер = 2020 ;
// Вывод шапки в документ
ФормаПечати . Вывести ( Шапка );

// Заголовок табличной части.
ЗаголовокТ = Макет . ПолучитьОбласть ( "ТЧ_Заголовок" );
ФормаПечати . Вывести ( ЗаголовокТ );

// Строки табличной части (обычно в цикле)
СтрокаТ = Макет . ПолучитьОбласть ( "ТЧ_Строка" );

// Строка 1
СтрокаТ . Параметры . Номенклатура = "SSD Intel Optane DC P4800X 1.5TB" ;
СтрокаТ . Параметры . Количество = 7 ;
ФормаПечати . Вывести ( СтрокаТ );

// Строка 2
СтрокаТ . Параметры . Номенклатура = "SSD Huawei 02351SPX 1.92TB" ;
СтрокаТ . Параметры . Количество = 12 ;
ФормаПечати . Вывести ( СтрокаТ );

// Вывод подвала ТЧ
СтрокаТ = Макет . ПолучитьОбласть ( "ТЧ_Подвал" );
СтрокаТ . Параметры . ИтогоКоличество = 19 ; // Всего
ФормаПечати . Вывести ( СтрокаТ );

Читайте также: