8.х Выгрузка печатной формы в xls

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем powerc, 23 авг 2012.

  1. TopicStarter Overlay
    powerc
    Offline

    powerc

    Регистрация:
    23 авг 2012
    Сообщения:
    29
    Симпатии:
    0
    Баллы:
    1
    Добрый день! Конфигурация: УправлениеТорговлей 10. Ситуация: Имеется документ, из него по нажатию кнопки "Печать" выводится уже заполненная печатная форма. Сохранить в ручном режиме эту форму в xls не проблема. Задача: Сохранить данную форму программно.

    Предпологаю, что код такой:

    ТекущиеДанные = ЭтаФорма.ЭлементыФормы.ДокументСписок.ТекущиеДанные;
    ТабДок = ??*
    ТабДок.Записать("C:\Отчет.xls");

    *Вопрос как правильно объявить ТабДок. В итоге этот код помещается на кнопку в ФормеСписка, по нажатию которой данная печатная форма будет сохраняться на жесткий диск.

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

    Прошу помощи, заранее благодарен!!!
  2. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Код:
    ТабДок = Новый ТабличныйДокумент;
    Но:
    1) Вам это тут не поможет.
    2) Посмотрите на параметры метода Записать. Если просто записать указав расширение - ничего не выйдет. Эксель не станет открывать такой файл (т.е. открывать будет, а открываться - нет)

    А ловить Вам нужно место, где фактически формируется отчет. Что то мне подсказывает, что скорее всего место это - отдельная обработка или отчет. На форме которого размещен реквизит типа ПолеТабличногоДокумента, в который и выводится отчет.

    ПолеТабличногоДокумента - наследован от ТабличныйДокумент, и имеет те-же методы и св-ва что и ТабличныйДокумент. Т.е. после формирования отчета и отображения его на экран можно вызывать метод Записать этого реквизита.
  3. TopicStarter Overlay
    powerc
    Offline

    powerc

    Регистрация:
    23 авг 2012
    Сообщения:
    29
    Симпатии:
    0
    Баллы:
    1
    Uza, спасибо! Очень полезно. Однако конкретизирую задачу: Имеется документ "Поступление товаров и услуг" (Управление торговлей 10). Необходимо чтобы на форме списка была кнопка, которая сохраняет печатную форму документа на жесткий диск. Привожу код:

    Процедура ЭкспортНажатие(Элемент) // Кнопка

    ТекущиеДанные = ЭтаФорма.ЭлементыФормы.ДокументСписок.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено тогда
    УниверсальныеМеханизмы.НапечататьДокументИзФормыСписка(ТекущиеДанные.Ссылка.ПолучитьОбъект());
    КонецЕсли;

    КонецПроцедуры

    *

    Процедура НапечататьДокументИзФормыСписка(Объект) Экспорт

    Если Объект = Неопределено Тогда
    Возврат;
    КонецЕсли;
    НаПринтер = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ПараметрыСеанса.ТекущийПользователь, "ПечатьДокументовБезПредварительногоПросмотра") = Истина;
    Если Не НапечататьДокументПоУмолчанию(Объект, 0, НаПринтер) Тогда
    Предупреждение("Операция не выполнена");
    КонецЕсли;

    КонецПроцедуры // НапечататьДокументИзФормыСписка()

    *
    Функция НапечататьДокументПоУмолчанию(Объект, КоличествоЭкземпляров = 0, НаПринтер = Ложь) Экспорт

    ЭтоДокумент = Метаданные.Документы.Содержит(Объект.Метаданные());

    Если ЭтоДокумент И Объект.Метаданные().Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить и Не УправлениеДопПравамиПользователей.РазрешитьПечатьНепроведенныхДокументов(Объект.Проведен) Тогда
    Сообщить("Недостаточно полномочий для печати непроведенного документа!");
    Возврат Ложь;
    КонецЕсли;

    Попытка
    СтруктураВнутреннихПечатныхФорм = Объект.ПолучитьСтруктуруПечатныхФорм()
    Исключение
    СтруктураВнутреннихПечатныхФорм = Новый Структура;
    КонецПопытки;

    ДеревоМакетов = ПолучитьДеревоМакетовПечати(Объект.Ссылка, СтруктураВнутреннихПечатныхФорм);

    СтрокаПоУмолчанию = ПолучитьСтрокуДереваМакетовПоУмолчанию(Объект.Метаданные().Имя, ДеревоМакетов);

    Если СтрокаПоУмолчанию = Неопределено Тогда

    Сообщить("Для данного вида " + ?(ЭтоДокумент, "документа ", "") + "не назначено ни одной печатной формы!");
    Возврат Ложь;

    КонецЕсли;

    Расшифровка = СтрокаПоУмолчанию.Расшифровка;
    Если ТипЗнч(Расшифровка) = Тип("Структура") и Расшифровка.ВидПечатнойФормы = Перечисления.ВидыДополнительныхВнешнихОбработок.ПечатнаяФорма Тогда
    Если Не РаботаСДиалогами.ПроверитьМодифицированность(Объект) Тогда
    Возврат Ложь;
    КонецЕсли;

    ТабДокумент = НапечататьВнешнююФорму(Объект.Ссылка, Расшифровка);
    НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, ?(ЭтоДокумент, ОбщегоНазначения.СформироватьЗаголовокДокумента(Объект), Строка(Объект)), Объект.Ссылка);
    Иначе
    Объект.Печать(Расшифровка, КоличествоЭкземпляров, НаПринтер);
    КонецЕсли;
    Возврат Истина;

    КонецФункции

    *
    Функция НапечататьВнешнююФорму(Ссылка, ИсточникМакета) Экспорт

    ДвоичныеДанные = ИсточникМакета.СсылкаНаВнешнююОбработку.Принадлежность[ИсточникМакета.НомерСтроки - 1].ХранилищеВнешнейОбработки.Получить();
    Если ДвоичныеДанные = Неопределено Тогда
    ДвоичныеДанные = ИсточникМакета.СсылкаНаВнешнююОбработку.ХранилищеВнешнейОбработки.Получить();
    КонецЕсли;
    ДополнительныеПараметры = ИсточникМакета.СсылкаНаВнешнююОбработку.Принадлежность[ИсточникМакета.НомерСтроки - 1].ДополнительныеПараметрыОбработки.Получить();

    Если ДвоичныеДанные = Неопределено Тогда
    Возврат Неопределено;
    КонецЕсли;

    ТабДокумент = Неопределено;

    ИмяФайла = ПолучитьИмяВременногоФайла("epf");
    Попытка
    ДвоичныеДанные.Записать(ИмяФайла);
    Обработка = ВнешниеОбработки.Создать(ИмяФайла);
    Обработка.СсылкаНаОбъект = Ссылка;

    // Передать внешней обработке дополнительные параметры
    Если ДополнительныеПараметры <> Неопределено Тогда
    // Если у внешней обработки есть реквизит для дополнительных параметров, присвоить ему значение
    Если НЕ Обработка.Метаданные().Реквизиты.Найти("ДополнительныеПараметры") = Неопределено Тогда
    Обработка.ДополнительныеПараметры = ДополнительныеПараметры;
    КонецЕсли;
    КонецЕсли;

    ТабДокумент = Обработка.Печать();
    УдалитьФайлы(ИмяФайла);

    Если ТипЗнч(ТабДокумент) = Тип("ТабличныйДокумент") И (ПустаяСтрока(ТабДокумент.ИмяПараметровПечати)) Тогда
    Попытка
    ИдентификаторОбработки = Строка(ИсточникМакета.СсылкаНаВнешнююОбработку.УникальныйИдентификатор());
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_" + СтрЗаменить(ИдентификаторОбработки, "-", "_");
    ТабДокумент.ИмяПараметровПечати = ТабДокумент.ИмяПараметровПечати + "_" + Ссылка.Метаданные().Имя;
    Исключение

    КонецПопытки;
    КонецЕсли;
    Исключение
    ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки(),, "Не удалось сформировать внешнюю печатную форму!");
    КонецПопытки;

    Возврат ТабДокумент;

    КонецФункции

    *

    Вот такой хитрый код. Uza, если обратить внимание на последнюю функцию то там можно найти много чего интересного.
  4. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    1) Многа букаф - ниасилил.

    2) Применяйте тэги - мои глаза ломаются.

    3)
    Последняя функция это
    Код:
    ОбщегоНазначения.СообщитьОбОшибке(....);
    ?
  5. TopicStarter Overlay
    powerc
    Offline

    powerc

    Регистрация:
    23 авг 2012
    Сообщения:
    29
    Симпатии:
    0
    Баллы:
    1
    Извиняюсь, но функция "Код1с" октазывается проглалить такой большой код. Пришлось цитатами разделять.

    Нет, имеется ввиду функция:

    Код:
    Функция НапечататьВнешнююФорму(Ссылка, ИсточникМакета) Экспорт

  6. TopicStarter Overlay
    powerc
    Offline

    powerc

    Регистрация:
    23 авг 2012
    Сообщения:
    29
    Симпатии:
    0
    Баллы:
    1
    У кого какие мысли?
  7. TopicStarter Overlay
    powerc
    Offline

    powerc

    Регистрация:
    23 авг 2012
    Сообщения:
    29
    Симпатии:
    0
    Баллы:
    1
    Проблема была решена следующим образом:

    Код:
    ТабДокумент = ПечатьСчетаЗаказа("Заказ");
    
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xls");
    
    ТабДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLS);
    
    
    Т.е. при определении переменной "ИмяВременногоФайла", обращаемся напрямую к печатной форме "ПечатьСчетаЗаказа", которой отдаем правильный параметр "Заказ").

    Впрочем, как и советовали.
  8. KatrineKA
    Offline

    KatrineKA Опытный в 1С

    Регистрация:
    5 окт 2010
    Сообщения:
    214
    Симпатии:
    0
    Баллы:
    26
    Возможно мой вопрос не потеме этой ветке, но мне кажется, очень близко.
    Собственно вопрос в следущем: необходимо сохранять печатную форму в эксель, не программно, а как обычно это делает пользователь. Но параметры печатной формы должны быть такие же как и в 1с. Т.е. с сохранением положение на странице и автомасштабом.
    эти настройки в 1с ТабДокумент.АвтоМасштаб = Истина; не передаются в эксель.

Поделиться этой страницей