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