Имя: Пароль:
1C
1С v8
Отправка на почту, печатного документа -внешняя печ. форма
0 anisa8310
 
25.05.15
15:16
Всем доброго дня!
Бухгалтерия предприятия КОРП, редакция 3.0 (3.0.39.52)
Прикрутила печатную форму, все нормально работает, но пытаюсь ее отправить на почту через общую форму: "ПечатьДокументов"-выходит ошибка (скрин в самом низу сообщения), видимо массив собрала неверно-не могу найти ошибку ! массив [0] это ссылка на объект в моей внешней печ. форме (КОД НИЖЕ) в  Процедуре ЗаполнитьТемуПолучателяПисьма(МассивОбъектов, КоллекцияПечатныхФорм, ПараметрыВывода, КоличествоЭД = 0) Экспорт
общего модуля ОтправкаПочтовыхСообщений. массив [0] проверяет ТИП организация- как это исправить -конфу лучше не трогать-лучше обработку ...где то не пойму где

Внешняя печатная форма:

// Возвращает сведения о внешней обработке.
Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("1.0.0.0");
    
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.БезопасныйРежим = Истина;
    //ПараметрыРегистрации.Назначение.Добавить("Документ.СчетНаОплатуПокупателю");
    
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = НСтр("ru = 'Договор-Счет с печатью'");
    НоваяКоманда.Идентификатор = "СчетНаОплатуПокупателю_ФЛ";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    НоваяКоманда.Модификатор = "ПечатьMXL";
    
    Возврат ПараметрыРегистрации;
    
КонецФункции

// Интерфейс для выполнения команд обработки.
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    
    Если МассивОбъектов.Количество()=0 Тогда
        Возврат;
    КонецЕсли;
    
    ТекДок = МассивОбъектов[0]; //Ссылка на документ для которой формируем печатную форму

    Макет = ПолучитьМакет("ФЛ");
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    СчетНаОплатуПокупателю.Ссылка,
        |    СчетНаОплатуПокупателю.Представление,
        |    СчетНаОплатуПокупателю.Номер,
        |    СчетНаОплатуПокупателю.Организация,
        |    СчетНаОплатуПокупателю.Склад,
        |    СчетНаОплатуПокупателю.ПодразделениеОрганизации,
        |    СчетНаОплатуПокупателю.Контрагент,
        |    СчетНаОплатуПокупателю.ДоговорКонтрагента,
        |    СчетНаОплатуПокупателю.СуммаДокумента,
        |    СчетНаОплатуПокупателю.Дата,
        |    СчетНаОплатуПокупателю.ДоговорКонтрагента.РуководительКонтрагента КАК РуководительКонтрагента,
        |    СчетНаОплатуПокупателю.ДоговорКонтрагента.ЗаРуководителяКонтрагентаПоПриказу КАК ПоПриказуКонтрагента
        |ИЗ
        |    Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
        |ГДЕ
        |    СчетНаОплатуПокупателю.Ссылка = &Ссылка";

    Запрос.УстановитьПараметр("Ссылка", МассивОбъектов[0]);

    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
        Возврат;
    КонецЕсли;

    ОбластьТекст1 = Макет.ПолучитьОбласть("Текст1");
    ОбластьТекст2 = Макет.ПолучитьОбласть("Текст2");
    ОбластьРеквизиты = Макет.ПолучитьОбласть("Реквизиты");
    ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    ОбластьИтого = Макет.ПолучитьОбласть("Итого");
    ОбластьПодписи = Макет.ПолучитьОбласть("Подписи");
    //ОбластьПечать = Макет.ПолучитьОбласть("Печать");
    


    ТабДок = Новый ТабличныйДокумент;
    
        
    ВыборкаШапка=РезультатЗапроса.Выбрать();
    ВыборкаШапка.Следующий();
    Подразделение= ВыборкаШапка.ПодразделениеОрганизации;
    Организация=ВыборкаШапка.Организация;
    Контрагент=ВыборкаШапка.Контрагент;
    НомерДокумента=ВыборкаШапка.Номер;
    НаименованиеДокумента=ВыборкаШапка.Представление;
    ДатаДокумента=ВыборкаШапка.Дата;
    СуммаДокумента=ВыборкаШапка.СуммаДокумента;
    РуководительКонтрагента=ВыборкаШапка.РуководительКонтрагента;
    ПоПриказуКонтрагента=ВыборкаШапка.ПоПриказуКонтрагента;
    
    ЗначениеДаты = ТекущаяДатаСеанса();
    СведенияОПолучателе = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(Организация, ЗначениеДаты);
    СведенияОКонтрагенте = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(Контрагент, ЗначениеДаты);
    
    ОтветственныеЛицаОрганизации = ОтветственныеЛицаБП.ОтветственныеЛица(Организация, ДатаДокумента, Подразделение);
    
    ТабДок.Очистить();
    
    ОбластьТекст1.Параметры.ПечОрганизация=СведенияОПолучателе.НаименованиеДляПечатныхФорм;
    ОбластьТекст1.Параметры.ПечПокупатель=Контрагент.Наименование;
    ОбластьТекст1.Параметры.РуководительКонтрагента=РуководительКонтрагента;
    ОбластьТекст1.Параметры.ПоПриказуКонтрагента=ПоПриказуКонтрагента;
    
    ОбластьТекст1.Параметры.ПечНомер=НомерДокумента;
    ОбластьТекст1.Параметры.ПечДата=Формат(ДатаДокумента, "ДЛФ=DD");
    ОбластьТекст1.Параметры.ПечРуководитель=ОтветственныеЛицаОрганизации.РуководительПредставление;
    
    
    
    ТабДок.Вывести(ОбластьТекст1);
    ТабДок.Вывести(ОбластьШапкаТаблицы);
    ТабДок.НачатьАвтогруппировкуСтрок();

    ЗапросПоТЧ=Новый Запрос;
    ЗапросПоТЧ.Текст=
    "ВЫБРАТЬ
    |    СчетНаОплатуПокупателюТовары.Количество,
    |    СчетНаОплатуПокупателюТовары.Цена,
    |    СчетНаОплатуПокупателюТовары.Сумма,
    |    СчетНаОплатуПокупателюТовары.СуммаНДС,
    |    СчетНаОплатуПокупателюТовары.Ссылка,
    |    СчетНаОплатуПокупателюТовары.Номенклатура,
    |    СчетНаОплатуПокупателюТовары.Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    |    СчетНаОплатуПокупателюТовары.Номенклатура.НаименованиеПолное КАК НаименованиеПолное
    |ИЗ
    |    Документ.СчетНаОплатуПокупателю.Товары КАК СчетНаОплатуПокупателюТовары
    |ГДЕ
    |    СчетНаОплатуПокупателюТовары.Ссылка = &Ссылка";    
    
    ЗапросПоТЧ.УстановитьПараметр("Ссылка", МассивОбъектов[0]);
    РезультатПоТЧ=ЗапросПоТЧ.Выполнить();
    Если не РезультатПоТч.Пустой() Тогда
        ВыборкаПоТЧ=РезультатПоТч.Выбрать();
        НомерСтроки=1;
        Пока ВыборкаПоТЧ.Следующий() Цикл    
            ОбластьСтрока.Параметры.НомерСтроки=НомерСтроки;
            ОбластьСтрока.Параметры.НаименованиеПолное=ВыборкаПоТЧ.НаименованиеПолное;
            ОбластьСтрока.Параметры.Количество=ВыборкаПоТЧ.Количество;
            ОбластьСтрока.Параметры.ЕдиницаИзмерения=ВыборкаПоТЧ.ЕдиницаИзмерения;
            ОбластьСтрока.Параметры.Цена=ВыборкаПоТЧ.Цена;
            ОбластьСтрока.Параметры.Сумма=ВыборкаПоТЧ.Сумма;
            ТабДок.Вывести(ОбластьСтрока, ВыборкаПоТЧ.Уровень());
            НомерСтроки=НомерСтроки+1;
        КонецЦикла;
    КонецЕсли;

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

    
    КоллекцияПечатныхФорм[0].ТабличныйДокумент = ТабДок;

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

////////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

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





КОД ОБЩЕГО МОДУЛЯ

Процедура ЗаполнитьТемуПолучателяПисьма(МассивОбъектов, КоллекцияПечатныхФорм, ПараметрыВывода, КоличествоЭД = 0) Экспорт
    
    Если ТипЗнч(МассивОбъектов[0]) = Тип("СправочникСсылка.Организации") Тогда
        ЗаполнитьТемуТелоПисьмаСКарточкойОрганизации(МассивОбъектов, ПараметрыВывода, КоллекцияПечатныхФорм);
        Возврат;
    КонецЕсли;
    
    СтруктураТиповОбъектыПечати = РазложитьСписокПоТипамОбъектов(МассивОбъектов);
    ОписаниеДопустимыхТиповКонтрагента = ОписаниеТиповИзСтроки("Контрагенты, Организации, ФизическиеЛица");
    
    ОрганизацияПоПисьму = ПолучитьЗначениеОбщегоРеквизита(СтруктураТиповОбъектыПечати, "Организация", ОписаниеТиповИзСтроки("Организации"));
    КонтрагентПоПисьму  = ПолучитьЗначениеОбщегоРеквизита(СтруктураТиповОбъектыПечати, "Контрагент",  ОписаниеДопустимыхТиповКонтрагента);
    
    Если ПараметрыВывода.Свойство("ПараметрыОтправки") Тогда
        ПараметрыПисьма = ПараметрыВывода.ПараметрыОтправки;
    Иначе
        ПараметрыПисьма = ПараметрыВывода;
    КонецЕсли;
    
    ПараметрыПисьма.Получатель = АдресаЭлектроннойПочты(КонтрагентПоПисьму);
    
    КоличествоВложений = 0;
    Если ПараметрыПисьма.Свойство("Вложения") Тогда
        КоличествоВложений = ПараметрыПисьма.Вложения.Количество();
    КонецЕсли;
    
    ЕстьОбщийКонтрагент  = НЕ КонтрагентПоПисьму  = Неопределено;
    Если ЕстьОбщийКонтрагент Тогда
        ПредставлениеКонтрагента = ПолучитьПредставлениеСПрефиксом(НСтр("ru='для'"),
            Справочники.Контрагенты.ПолучитьКраткоеНаименованиеКонтрагента(КонтрагентПоПисьму));
    Иначе
        ПредставлениеКонтрагента = "";
    КонецЕсли;
    
    ЕстьОбщаяОрганизация = НЕ ОрганизацияПоПисьму = Неопределено;
    Если ЕстьОбщаяОрганизация Тогда
        ПредставлениеОрганизации = ПолучитьПредставлениеСПрефиксом(НСтр("ru='от'"),
            ПолучитьНаименованиеКонтрагента(ОрганизацияПоПисьму));
    Иначе
        ПредставлениеОрганизации = "";
    КонецЕсли;
    
    ТемаПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Документы %1 %2'"),
        ПредставлениеКонтрагента,
        ПредставлениеОрганизации);
    
    ТекстПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
        НСтр("ru = 'К письму приложены документы %1 %2:'"),
        ПредставлениеКонтрагента,
        ПредставлениеОрганизации);
    
    Запрос = Новый Запрос;
    
    СхемаЗапроса = Новый СхемаЗапроса;
    ЗапросСхемы = СхемаЗапроса.ПакетЗапросов[0];
    ЗапросСхемы.ВыбиратьРазрешенные = Истина;
    
    ЭтоПервыйОператорВыбора = Истина;
    Для Каждого ТипОбъекта Из СтруктураТиповОбъектыПечати Цикл
        
        ЕстьРеквизитСумма  = ОбщегоНазначения.ЕстьРеквизитОбъекта("СуммаДокумента", ТипОбъекта.Ключ);
        ЕстьРеквизитВалюта = ОбщегоНазначения.ЕстьРеквизитОбъекта("ВалютаДокумента", ТипОбъекта.Ключ);
        
        Если ЭтоПервыйОператорВыбора Тогда
            ЭтоПервыйОператорВыбора = Ложь;
            ОператорВыбора = ЗапросСхемы.Операторы[0];
        Иначе
            ОператорВыбора = ЗапросСхемы.Операторы.Добавить();
        КонецЕсли;
        
        Источник = ОператорВыбора.Источники.Добавить("Документ." + ТипОбъекта.Ключ.Имя, "ВыгружаемыйДокумент");
        
        ОператорВыбора.ВыбираемыеПоля.Добавить("ВыгружаемыйДокумент.Ссылка");
        ИмяПоляСумма = ?(ЕстьРеквизитСумма, "ВыгружаемыйДокумент.СуммаДокумента", "0");
        ОператорВыбора.ВыбираемыеПоля.Добавить(ИмяПоляСумма);
        ИмяПоляВалюта = ?(ЕстьРеквизитВалюта, "ВыгружаемыйДокумент.ВалютаДокумента", "ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка)");
        ОператорВыбора.ВыбираемыеПоля.Добавить(ИмяПоляВалюта);
        
        НаименованиеОтбора = "МассивОбъектов" + ТипОбъекта.Ключ.Имя;
        ОператорВыбора.Отбор.Добавить("ВыгружаемыйДокумент.Ссылка В(&" + НаименованиеОтбора + ")");
        Запрос.УстановитьПараметр(НаименованиеОтбора, ТипОбъекта.Значение);
    КонецЦикла;
    
    ЗапросСхемы.Колонки[0].Псевдоним = "Ссылка";
    ЗапросСхемы.Колонки[1].Псевдоним = "СуммаДокумента";
    ЗапросСхемы.Колонки[2].Псевдоним = "ВалютаДокумента";
    
    Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
        ТаблицаСведенийОбъектовПечати = Неопределено;
    Иначе
        ТаблицаСведенийОбъектовПечати = РезультатЗапроса.Выгрузить();
        ТаблицаСведенийОбъектовПечати.Индексы.Добавить("Ссылка");
    КонецЕсли;

    Для Каждого Объект Из МассивОбъектов Цикл
        
        ТекстСуммаДокумента  = "";
        
        Если ТаблицаСведенийОбъектовПечати <> Неопределено Тогда
            СведенияОбъектаПечати = ТаблицаСведенийОбъектовПечати.Найти(Объект, "Ссылка");
            Если ЗначениеЗаполнено(СведенияОбъектаПечати.СуммаДокумента) Тогда
                Шаблон = Нстр("ru='на сумму %1 %2'");
                ТекстСуммаДокумента = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон,
                    Формат(СведенияОбъектаПечати.СуммаДокумента, "ЧЦ=15; ЧДЦ=2"),
                    СведенияОбъектаПечати.ВалютаДокумента);
            КонецЕсли;
        КонецЕсли;
        
        ПутьКДанным = "";
        Если КоллекцияПечатныхФорм.Колонки.Найти("СинонимМакета") <> Неопределено Тогда
            ПутьКДанным = "СинонимМакета";
        ИначеЕсли КоллекцияПечатныхФорм.Колонки.Найти("Представление") <> Неопределено Тогда
            ПутьКДанным = "Представление";
        Иначе
            СведенияОбъектаПечати = КоллекцияПечатныхФорм.Найти(Объект, "Объект");
            Для Каждого ПечатнаяФорма Из СведенияОбъектаПечати.ПечатныеФормы Цикл
                ТекстПисьма = ТекстПисьма + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 %2'"),
                ОбщегоНазначенияБПВызовСервера.СформироватьЗаголовокДокумента(Объект, ПечатнаяФорма.Ключ.Представление),
                    ТекстСуммаДокумента);
            КонецЦикла;
        КонецЕсли;
        
        Если ЗначениеЗаполнено(ПутьКДанным) Тогда
            Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
                ТекстПисьма = ТекстПисьма + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 %2'"),
                    ОбщегоНазначенияБПВызовСервера.СформироватьЗаголовокДокумента(Объект, ПечатнаяФорма[ПутьКДанным]),
                    ТекстСуммаДокумента);
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    
    Если КоличествоВложений > 0 И КоличествоЭД > 0 Тогда
        НачальныйИндекс = КоличествоВложений - КоличествоЭД;
        Для Индекс = НачальныйИндекс По КоличествоВложений - 1 Цикл
            ТекстПисьма = ТекстПисьма + Символы.ПС+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1'"),
                ПараметрыПисьма.Вложения[Индекс].Представление);
        КонецЦикла;
    КонецЕсли;
    
    ДокументHTML = ПолучитьДокументHTMLИзОбычногоТекста(ТекстПисьма);
    ТекстПисьма  = ПолучитьТекстHTMLИзОбъектаДокументHTML(ДокументHTML);
    
    ПараметрыПисьма.Тема  = УдалитьЛишниеПробелы(ТемаПисьма);
    ПараметрыПисьма.Текст = УдалитьЛишниеПробелы(ТекстПисьма);
    
КонецПроцедуры



Скрин ошибки:

http://radikall.com/image/Q652
1 zak555
 
25.05.15
15:29
точку останова поставь на строчку
Если ТипЗнч(МассивОбъектов[0]) = Тип("СправочникСсылка.Организации") Тогда

и посмотри, что в МассивОбъектов
2 stix2010
 
25.05.15
15:30
телепатирую в Массиве объектов ничего нет
3 anisa8310
 
29.05.15
10:25
(2) {ОбщийМодуль.ОтправкаПочтовыхСообщений.Модуль(170)}: Индекс находится за границами массива
    Если ТипЗнч(МассивОбъектов[0]) = Тип("СправочникСсылка.Организации") Тогда