Flexy @ Сегодня, 12:01
необходимо зарегистрироваться для просмотра ссылки
,
Насколько я могу понимать, наименование контрагента имеется в табличной части, в представлении.
Возможно его от туда вытащить?
В макете он выражен так: <ТекстПокупатель> <ПредставлениеПолучателя>
На всякий - прилагаю весть код:
///////////////////////////////////////////////////////////////////////////////
// ПЕРЕМЕННЫЕ МОДУЛЯ
Перем Объект Экспорт; // Объект, который печатается
Перем ОбъектПредставление Экспорт; // Представление объекта. Используется для формирования заголовка, имен сохраняемых файлов и т.п. Если не задано, то будет построено по "Объект"
Перем ДополнительноКПредставлению Экспорт; // Строка, которая будет выведена дополнительно в конец заголовка формы
Перем Принтеры; // Список установленных в системе принтеров
Перем ИмяТекПринтера; // Имя принтера (как оно установлено в системе) на который будет осуществляться вывод
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ
Функция ПолучитьПредставление(Объект)
//+CRM
Если Объект = Неопределено Тогда
Возврат "";
КонецЕсли;
//-CRM
// Определим тип переданного нам объекта (для всех "объектов" получим ссылки на них)
Попытка
ТипЗнчОбъекта = ТипЗнч(Объект.Ссылка);
Исключение
ТипЗнчОбъекта = ТипЗнч(Объект);
КонецПопытки;
// Определим представление в зависмоти от типа переданного нам объекта
Представление = "";
Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнчОбъекта) Тогда
Представление = дкПолучитьПредставление(Объект);
ИначеЕсли Справочники.ТипВсеСсылки().СодержитТип(ТипЗнчОбъекта) Тогда
Представление = Объект.Метаданные().Синоним;
КонецЕсли;
Возврат Представление;
КонецФункции
// Приводит произвольную строку к идентификатору, который затем можно использовать как ключ структуры
// Преобразование выполняется разрушающим способом (обратное преобразование невозможно)
Функция обСтрокуКID(Стр) Экспорт
Ст=обСтрокаПоМаске(Стр,"_0123456789
|ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
|АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя");
Возврат ?(Найти("0123456789",Лев(Ст,1))>0,"_"+Ст,Ст);
КонецФункции // обСтрокуКID()
// Функция возвращает строку символов, полученную из исходной <Стр> GOAN
// заменой всех символов, не входящих в <Маска> на символ <Симв>
Функция обСтрокаПоМаске(Стр,Маска="",Симв="") Экспорт
Ст=""; Если ПустаяСтрока(Маска) Тогда Возврат Ст; КонецЕсли;
Для Сч=1 По СтрДлина(Стр) Цикл
Сим=Сред(Стр,Сч,1);
Если Найти(Маска,Сим)>0 Тогда Ст=Ст+Сим; Иначе Ст=Ст+Симв; КонецЕсли;
КонецЦикла;
Возврат Ст;
КонецФункции // обСтрокаПоМаске
// Возвращает представление для документа
// Параметры
// ЭтотОбъект - <ДокументСсылка> или <ДокументОбъект>
// АльтернативноеНазвание - Строка, используется, если хотим заменить синоним документа
// Возвращаемое значение:
// Строка - Строка представления документа
Функция дкПолучитьПредставление(ЭтотОбъект, АльтернативноеНазвание = "") Экспорт
Попытка
ТекстПредставления=?(ПустаяСтрока(АльтернативноеНазвание), ЭтотОбъект.Метаданные().Синоним, АльтернативноеНазвание)+" № "+СокрЛП(ЭтотОбъект.Номер)+" от "+Формат(ЭтотОбъект.Дата,"ДФ=dd.MM.yyyy");
Исключение
ТекстПредставления="Неправильный тип объекта!";
КонецПопытки;
Возврат ТекстПредставления;
КонецФункции // ПолучитьПредставление()
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ДЕЙСТВИЯ КОМАНДНЫХ ПАНЕЛЕЙ ФОРМЫ
// Процедура отправляет отчет по электронной почте в виде табличного документа mxl
Процедура ДействияФормыОтправитьПоEmail(Кнопка)
РасширениеФайла = "";
ТипПересылаемогоФайла = Неопределено;
Если Кнопка.Имя = "ОтправитьКакMXL" Тогда
ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.MXL;
РасширениеФайла = ".mxl";
ИначеЕсли Кнопка.Имя = "ОтправитьКакHTML" Тогда
ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.HTML;
РасширениеФайла = ".html";
ИначеЕсли Кнопка.Имя = "ОтправитьКакXLS" Тогда
ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.XLS97;
РасширениеФайла = ".xls";
ИначеЕсли Кнопка.Имя = "ОтправитьКакPDF" Тогда
ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.PDF;
РасширениеФайла = ".pdf";
Иначе
Возврат;
КонецЕсли;
НаименованиеПечатнойФормы = СтрЗаменить(ОбъектПредставление,".","_");
// сохраним ПФ во временный каталог
ИмяФайлаСообщения = КаталогВременныхФайлов() + НаименованиеПечатнойФормы + РасширениеФайла;
Если ТипЗнч(ТипПересылаемогоФайла) = Тип("ТипФайлаТабличногоДокумента") Тогда
ЭлементыФормы.ТабличныйДокумент.Записать(ИмяФайлаСообщения, ТипПересылаемогоФайла);
КонецЕсли;
//
//+CRM
Если НЕ Константы.ИспользованиеВстроенногоПочтовогоКлиента.Получить() Тогда
СтруктураПараметров = Новый Структура();
СтруктураПараметров.Вставить("Тема", НаименованиеПечатнойФормы);
УправлениеЭлектроннойПочтой.ОткрытьПисьмоПочтовогоКлиентаОперационнойСистемы(СтруктураПараметров);
Иначе
СтруктураНовогоПисьма = Новый Структура();
СтруктураНовогоПисьма.Вставить("Тема",НаименованиеПечатнойФормы);
СтруктураПисьма = УправлениеЭлектроннойПочтой.НаписатьПисьмо(глЗначениеПеременной("глТекущийПользователь"), СтруктураНовогоПисьма,,,,,,);
Если СтруктураПисьма = Неопределено Тогда
Возврат
КонецЕсли;
ВложенияПисьмаТЗ = СтруктураПисьма.Форма.ВложенияПисьмаТЗ.Добавить();
Файл = Новый Файл(ИмяФайлаСообщения);
ВложенияПисьмаТЗ.ИмяФайла = Файл.Имя;
ВложенияПисьмаТЗ.Наименование = ОбъектПредставление;
Попытка
ВложенияПисьмаТЗ.Данные = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяФайлаСообщения), Новый СжатиеДанных);
Исключение
ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки());
КонецПопытки;
УдалитьФайлы(ИмяФайлаСообщения);
КонецЕсли;
//-CRM
КонецПроцедуры // ДействияФормыОтправитьПоEmail()
// Процедура сохраняет табличный документ в формате MXL под введенным пользователем именем файла
Процедура ДействияФормыСохранитьКакMXL(Кнопка)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Сохранение табличного документа";
Диалог.Фильтр = "Табличный документ (*.mxl)|*.mxl";
Диалог.Расширение = "mxl";
Диалог.ПолноеИмяФайла = СтрЗаменить(ОбъектПредставление,".","_");
Диалог.Каталог = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"),"ОсновнойКаталогФайлов");
Если Диалог.Выбрать() Тогда
Если НЕ ПустаяСтрока(Диалог.ПолноеИмяФайла) Тогда
ЭлементыФормы.ТабличныйДокумент.Записать(Диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.MXL);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Процедура сохраняет табличный документ в формате HTML под введенным пользователем именем файла
Процедура ДействияФормыСохранитьКакHTML(Кнопка)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Сохранение веб-страницы";
Диалог.Фильтр = "Веб-страница (*.html)|*.html";
Диалог.Расширение = "html";
Диалог.ПолноеИмяФайла = СтрЗаменить(ОбъектПредставление,".","_");
Диалог.Каталог = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"),"ОсновнойКаталогФайлов");
Если Диалог.Выбрать() Тогда
Если НЕ ПустаяСтрока(Диалог.ПолноеИмяФайла) Тогда
ЭлементыФормы.ТабличныйДокумент.Записать(Диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.HTML);
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ДействияФормыСохранитьКакHTML()
Процедура ДействияФормыСохранитьКакXLS(Кнопка)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Сохранение документа Excel";
Диалог.Фильтр = "Документ Excel (*.xls)|*.xls";
Диалог.Расширение = "xls";
Диалог.ПолноеИмяФайла = СтрЗаменить(ОбъектПредставление,".","_");
Диалог.Каталог = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"),"ОсновнойКаталогФайлов");
Если Диалог.Выбрать() Тогда
Если НЕ ПустаяСтрока(Диалог.ПолноеИмяФайла) Тогда
ЭлементыФормы.ТабличныйДокумент.Записать(Диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLS97);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Процедура сохраняет табличный документ в формате PDF под введенным пользователем именем файла
Процедура ДействияФормыСохранитьКакPDF(Кнопка)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Сохранение документа PDF";
Диалог.Фильтр = "Документ PDF (*.pdf)|*.pdf";
Диалог.Расширение = "pdf";
Диалог.ПолноеИмяФайла = СтрЗаменить(ОбъектПредставление,".","_");
Диалог.Каталог = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"),"ОсновнойКаталогФайлов");
Если Диалог.Выбрать() Тогда
Если НЕ ПустаяСтрока(Диалог.ПолноеИмяФайла) Тогда
ЭлементыФормы.ТабличныйДокумент.Записать(Диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.PDF);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Процедура печатает табличный документ на выбраном принтере
Процедура ОсновныеДействияФормыПечать(Кнопка)
ЭлементыФормы.ТабличныйДокумент.ИмяПринтера = ИмяТекПринтера;
ЭкземпляровНаСтранице=0;//обПраво("КоличествоСтраницНаЛисте",глПрава);
Если ЭкземпляровНаСтранице<>0 И ЭкземпляровНаСтранице<>1 И ЭкземпляровНаСтранице<>2 Тогда
ЭкземпляровНаСтранице=0;
КонецЕсли;
ЭлементыФормы.ТабличныйДокумент.ЭкземпляровНаСтранице=ЭкземпляровНаСтранице;
ЭлементыФормы.ТабличныйДокумент.Напечатать(НЕ ПустаяСтрока(ИмяТекПринтера));
ЧислоКопий = ЭлементыФормы.ТабличныйДокумент.КоличествоЭкземпляров;
КонецПроцедуры
// Получает список принтеров установленных в системе и предлагает пользователю
// выбрать принтер для печати
Процедура ОсновныеДействияФормыСписокПринтеров(Кнопка)
// Посмотрим был ли ранее составлен список принтеров, которые установлены в системе, если нет, тогда попытаемся получить его
Если ТипЗнч(Принтеры) <> Тип("СписокЗначений") Тогда
Принтеры = Новый СписокЗначений;
Состояние("Составляется список принтеров. Подождите.");
Попытка
Locator = Новый COMОбъект("WbemScripting.SWbemLocator");
Сервисы = Locator.ConnectServer(".");
Объекты = Сервисы.InstancesOf("Win32_Printer");
// Теперь переберем все принтеры системы
Для каждого Принтер из Объекты Цикл
ИмяПринтера = Принтер.Name;
Пока Найти(ИмяПринтера,"\") > 0 Цикл
ИмяПринтера = Сред(ИмяПринтера, Найти(ИмяПринтера,"\")+1);
КонецЦикла;
ИмяПринтера = СокрЛП(ИмяПринтера);
Принтеры.Добавить(Принтер.Name,ИмяПринтера,(Принтер.Name=ИмяТекПринтера));
КонецЦикла;
Исключение
КонецПопытки;
Принтеры.Вставить(0,"ДиалогВыбораПринтера","Диалог выбора принтера",ПустаяСтрока(ИмяТекПринтера));
Состояние();
КонецЕсли;
// Предложим пользователю выбрать один из принтеров
Результат = ВыбратьИзМеню(Принтеры,ЭлементыФормы.кнВспомогательная);
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
// Установим пометку у "текушего" принтера в списке
Принтеры.ЗаполнитьПометки(ЛОЖЬ);
Результат.Пометка = ИСТИНА;
// Обработаем результат выбора
ИмяТекПринтера = ?(Результат.Значение = "ДиалогВыбораПринтера","",Результат.Значение);
ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Печать.Текст = "Печать"+?(ПустаяСтрока(ИмяТекПринтера),""," на <"+Результат.Представление+">");
// Передвинем вспомогательную кнопку
СтараяШирина = ЭлементыФормы.кнВспомогательная.Ширина;
ЭлементыФормы.кнВспомогательная.Заголовок = "";
ЭлементыФормы.кнВспомогательная.Ширина = 10;
ЭлементыФормы.кнВспомогательная.Лево = ЭлементыФормы.кнВспомогательная.Лево - 1; // необходимо чтобы установилать "автоширина" кнопки
ЭлементыФормы.кнВспомогательная.Заголовок = ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Печать.Текст;
ЭлементыФормы.кнВспомогательная.Лево = ЭлементыФормы.кнВспомогательная.Лево + 1; // необходимо чтобы установилать "автоширина" кнопки
ЭлементыФормы.кнВспомогательная.Лево = ЭлементыФормы.кнВспомогательная.Лево - (ЭлементыФормы.кнВспомогательная.Ширина - СтараяШирина);
// Напечатаем
ОсновныеДействияФормыПечать(Неопределено);
КонецПроцедуры
// Открывает окно "Предварительный просмотр"
Процедура ОсновныеДействияФормыПредварительныйПросмотр(Кнопка)
ТекущийЭлемент = ЭлементыФормы.ТабличныйДокумент;
// Произведем эмуляцию нажатия клавишь. По ходу дела это единственный способ открыть окно просмотра печати
WHSShell = Новый COMОбъект("WScript.Shell");
WHSShell.SendKeys("%");
WHSShell.SendKeys("~");
WHSShell.SendKeys("{DOWN 10}");
WHSShell.SendKeys("~");
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ, ВЫЗЫВАЕМЫЕ ИЗ ЭЛЕМЕНТОВ ФОРМЫ
Процедура ЧислоКопийПриИзменении(Элемент)
ЭлементыФормы.ТабличныйДокумент.КоличествоЭкземпляров = ЧислоКопий;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ
Процедура ПриОткрытии()
// Сформеруем заголовок формы
Если ПустаяСтрока(ОбъектПредставление) Тогда
ОбъектПредставление = ПолучитьПредставление(Объект);
КонецЕсли;
Заголовок = "Печать <" + ОбъектПредставление + "> " + ДополнительноКПредставлению;
// Восстановим ранее сохраненные настройки
//ИмяСохраненияПараметров = "ПечатнаяФормаДокументов_" + обСтрокуКID(СтрЗаменить(ОбъектПредставление," ","_")) + "_" + обСтрокуКID(СтрЗаменить(ДополнительноКПредставлению," ","_"));
//ЭлементыФормы.ТабличныйДокумент.ИмяПараметровПечати = ИмяСохраненияПараметров;
ЧислоКопий = ЭлементыФормы.ТабличныйДокумент.КоличествоЭкземпляров;
// "Вспомним" о том, на каком принтере в последний раз печатали
ИмяТекПринтера = ЭлементыФормы.ТабличныйДокумент.ИмяПринтера;
ПредставлениеТекПринтера = ИмяТекПринтера;
Пока Найти(ПредставлениеТекПринтера,"\") > 0 Цикл
ПредставлениеТекПринтера = Сред(ПредставлениеТекПринтера, Найти(ПредставлениеТекПринтера,"\")+1);
КонецЦикла;
ПредставлениеТекПринтера = СокрЛП(ПредставлениеТекПринтера);
// Допишем имя текущего принтера к кнопке "Печать" и подготовим вспомогательную кнопку
ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Печать.Текст = "Печать" + ?(ПустаяСтрока(ИмяТекПринтера),""," на <"+ПредставлениеТекПринтера+">");
ЭлементыФормы.кнВспомогательная.Заголовок = ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Печать.Текст;
ЭлементыФормы.кнВспомогательная.Лево = ЭлементыФормы.кнВспомогательная.Лево - 1; // необходимо чтобы установилать "автоширина" кнопки
ЭлементыФормы.кнВспомогательная.Лево = ЭлементыФормы.кнВспомогательная.Лево + 1 - (ЭлементыФормы.кнВспомогательная.Ширина - 46) + 1;
// Если табличный документ в режиме "Только просмотр", то сделаем серыми несколько кнопок
ДоступностьКнопок = НЕ ЭлементыФормы.ТабличныйДокумент.ТолькоПросмотр;
// ЭлементыФормы.ДействияФормы.Кнопки.ОткрытьВExcel .Доступность = ДоступностьКнопок;
ЭлементыФормы.ДействияФормы.Кнопки.СохранитьКакMXL .Доступность = ДоступностьКнопок;
ЭлементыФормы.ДействияФормы.Кнопки.СохранитьКакHTML.Доступность = ДоступностьКнопок;
Для каждого ТекКнопка Из ЭлементыФормы.ДействияФормы.Кнопки.ОтправитьПоEmail.Кнопки Цикл
ТекКнопка.Доступность = ДоступностьКнопок;
КонецЦикла;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// ИСПОЛНЯЕМАЯ ЧАСТЬ МОДУЛЯ
ОбъектПредставление = Неопределено;
ДополнительноКПредставлению = Неопределено;
Принтеры = Неопределено;