Реквизиты 1с объекта Печать
Автор: А.Волос   
17.02.2014 18:47

Ниже показан код внешней обработки для 1с, в которой программа находит имена реквизитов документа, формирует запрос к БД, и как результат выводятся имена и значения всех реквизитов документа, тип и номер которого пользователь выберет в выпадающих списках формы.

 

 

 

 

 

Функции МассивИменРеквизитовОбъекта() и ИспользуетсяОбщийРеквизит() найдены в интернете.

 

Процедура КнопкаВыполнитьНажатие(Кнопка)
	
	ТипДокумента = ЭлементыФормы.ПолеВыбора2.Значение;
	НомерДок     = ЭлементыФормы.ПолеВыбора1.Значение;
	
    Если СокрЛП(ТипДокумента) = "" Тогда
	Предупреждение("Выберите тип документа");
    ИначеЕсли  СокрЛП(НомерДок) = "" Тогда
	Предупреждение("Выберите номер документа");
    Иначе	
	ДокОснование = СсылкаНаДокумент(НомерДок);
	
	//Найдем массив имен реквизитов документа
	МассивИменРеквизитов = МассивИменРеквизитовОбъекта(ДокОснование);
	
	Если СокрЛП(ТипДокумента) = "АвансовыйОтчет" Тогда	
		МассивИменРеквизитов = АвансовыйОтчетМассивИменРеквизитов(МассивИменРеквизитов);
	КонецЕсли;	
	
	строкаЗапроса = СформироватьЗапрос(ТипДокумента, МассивИменРеквизитов);
	Сообщить(строкаЗапроса);
	
	Запрос = Новый Запрос();
	Запрос.УстановитьПараметр("Номер", НомерДок);
	Запрос.Текст = строкаЗапроса; 
	
	Док = Запрос.Выполнить().Выгрузить();

	ПоказатьТаблицу(Док);
	
    КонецЕсли;		
		
КонецПроцедуры

 

Вспомогательные функции

 

// Проверяет используется ли в Объекте указанный общий реквизит
//
Функция ИспользуетсяОбщийРеквизит(ОбщийРеквизит, Объект) Экспорт

    Если ТипЗнч(Объект) = Тип("ОбъектМетаданных") Тогда
        МетаданныеОбъекта = Объект;
    Иначе
        МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Объект));
        Если МетаданныеОбъекта = Неопределено Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЕсли;

    Если ТипЗнч(ОбщийРеквизит) = Тип("ОбъектМетаданных") Тогда
        МетаданныеОбщегоРеквизита = ОбщийРеквизит;
    Иначе
        МетаданныеОбщегоРеквизита = Метаданные.ОбщиеРеквизиты.Найти(ОбщийРеквизит);
        Если МетаданныеОбщегоРеквизита = Неопределено Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЕсли;

    ЭлементСостава = МетаданныеОбщегоРеквизита.Состав.Найти(МетаданныеОбъекта);

    Если ЭлементСостава = Неопределено Тогда
        Возврат Ложь;
    КонецЕсли;

    пИспользованиеОбщегоРеквизита = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита;

    Если ЭлементСостава.Использование = пИспользованиеОбщегоРеквизита.Использовать Тогда
        Возврат Истина;
    иначеЕсли ЭлементСостава.Использование = пИспользованиеОбщегоРеквизита.НеИспользовать Тогда
        Возврат Ложь;
    Иначе
        пАвтоИспользованиеОбщегоРеквизита = Метаданные.СвойстваОбъектов.АвтоИспользованиеОбщегоРеквизита;

        Если МетаданныеОбщегоРеквизита.АвтоИспользование = пАвтоИспользованиеОбщегоРеквизита.Использовать Тогда
            Возврат Истина;
        Иначе
            Возврат Ложь;
        КонецЕсли;
    КонецЕсли;

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

 

 
функция СсылкаНаДокумент(Номер)
	
        Запрос = Новый Запрос();
        Запрос.УстановитьПараметр("Номер", Номер);

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

 

 
// Возвращает массив имен всех реквизитов переданного объекта
//
Функция МассивИменРеквизитовОбъекта(Объект) Экспорт

    МассивИменРеквизитов = Новый Массив;

    Если ТипЗнч(Объект) = Тип("ОбъектМетаданных") Тогда
        МетаданныеОбъекта = Объект;
    Иначе
        МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Объект));
        Если МетаданныеОбъекта = Неопределено Тогда
            Возврат МассивИменРеквизитов;
        КонецЕсли;
    КонецЕсли;

    Для индекс = 0 по 1 Цикл
        КоллекцияРеквизитов = ?(индекс = 0, МетаданныеОбъекта.СтандартныеРеквизиты, МетаданныеОбъекта.Реквизиты);

        Для Каждого Реквизит Из КоллекцияРеквизитов Цикл
            МассивИменРеквизитов.Добавить(Реквизит.Имя);
        КонецЦикла;

    КонецЦикла;

    Для каждого ОбщийРеквизит Из Метаданные.ОбщиеРеквизиты Цикл
        Если ИспользуетсяОбщийРеквизит(ОбщийРеквизит, МетаданныеОбъекта) Тогда
            МассивИменРеквизитов.Добавить(ОбщийРеквизит.Имя);
        КонецЕсли;
    КонецЦикла;

    Возврат МассивИменРеквизитов;

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


 

 
функция СформироватьЗапрос(ТипДок, МассивИменРеквизитов)
        
        ДлинаМассива         = МассивИменРеквизитов.ВГраница();
                
        //Сформировать строку запроса
        СтрЗапроса = " ВЫБРАТЬ";

        //Просканируем массив
        Для н = 0 По ДлинаМассива Цикл
                Если н < ДлинаМассива Тогда
                        СтрЗапроса = СтрЗапроса + " " +ТипДок+ "." + МассивИменРеквизитов[н] + ",";
                Иначе
                        СтрЗапроса = СтрЗапроса + " " +ТипДок+ "." + МассивИменРеквизитов[н];
                КонецЕсли;      
        КонецЦикла;                     
                
        СтрЗапроса = СтрЗапроса + " ИЗ Документ." +ТипДок+" КАК "+ТипДок+" ГДЕ " +ТипДок+ ".Номер = &Номер;";
                
        Возврат(СтрЗапроса);        

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

 
функция ПоказатьТаблицу(Табл)
	
	Количество = Табл.Колонки.Количество();
	
	Для каждого Строка из Табл Цикл
		Для Индекс = 0 По Количество-1 Цикл 
			Сообщить(СокрЛП(Индекс)+" "+СокрЛП(Табл.Колонки[Индекс].Имя)+ ": " + Строка[СокрЛП(Табл.Колонки[Индекс].Имя)]);
   		КонецЦикла;      		
	КонецЦикла;
КонецФункции
 

 
В авансовом отчете используется не все реквизиты, поэтому эта функция отсеивает ненужные.

функция АвансовыйОтчетМассивИменРеквизитов(МассивИменРеквизитов)
	
		//Зададим массив неиспользуемых в авансовом отчете реквизитов
		МассивИсключений = Новый Массив; 
		МассивИсключений.Добавить("ВидОперации");
		МассивИсключений.Добавить("БанковскийСчетОрганизации");
		МассивИсключений.Добавить("Сделка");
		МассивИсключений.Добавить("Склад");
		МассивИсключений.Добавить("ДоговорКонтрагента");
		МассивИсключений.Добавить("Контрагент");
		МассивИсключений.Добавить("КурсВзаиморасчетов");
		МассивИсключений.Добавить("КратностьВзаиморасчетов");
		МассивИсключений.Добавить("ВидПередачи");
		МассивИсключений.Добавить("АдресДоставки");
		МассивИсключений.Добавить("Грузополучатель");
		МассивИсключений.Добавить("Грузоотправитель");
		МассивИсключений.Добавить("ДисконтнаяКарта");
		МассивИсключений.Добавить("УсловиеПродаж");
		МассивИсключений.Добавить("ОтключитьКонтрольВзаиморасчетов");
		МассивИсключений.Добавить("ОтпускРазрешил");
		МассивИсключений.Добавить("ОтпускПроизвел");
		МассивИсключений.Добавить("ДоверенностьНомер");
		МассивИсключений.Добавить("ДоверенностьДата");
		МассивИсключений.Добавить("ДоверенностьВыдана");
		МассивИсключений.Добавить("ДоверенностьЧерезКого");
		МассивИсключений.Добавить("ДополнениеКАдресуДоставки");
	
		//Удалим имена неиспользуемых реквизитов из массива имен реквизитов (двойной цикл)
		Индекс = 0;
		Для Каждого элем Из МассивИменРеквизитов Цикл
			Инд=0;
			Для Каждого эл Из МассивИсключений Цикл
				Если СокрЛП(МассивИсключений[Инд]) = СокрЛП(МассивИменРеквизитов[Индекс]) Тогда
          			МассивИменРеквизитов.Удалить(Индекс);
				КонецЕсли;
				Инд = Инд+1;
			КонецЦикла;
			Индекс = Индекс+1;
		КонецЦикла;
		
		Возврат МассивИменРеквизитов;
	
КонецФункции	

 

Скачать файл внешней обработки 1с "Реквизиты документа":
Скачать