
Пользователь выбирает в переключателе (Регистр сведений либо Регистр накоплений). Далее выбирает в списке выбора имя регистра, который желает отобразить. Нажимает Выполнить. Регистр отображается в табличном документе, в поле выбора на форме отображается сформированный программой запрос!
Скачать 1с внешнюю обработку "":
Отображение регистра в табличный документ
Функция ПриИзмененииТипаРегистра() инициирует данными список выбора. Данные берутся из регистра, который пользователь выбрал в переключателе (Регистр сведений либо Регистр накоплений). Так что при переключении радиокнопки содержание списка выбора меняется.
Функции ПоказатьВыбранныйРегистрСведений() и ПоказатьВыбранныйРегистрНакоплений() подготавливают и возвращают запрос к БД, касающийся выбранного регистра.
Далее, в основной процедуре производится запрос к БД и вывод результата в табличный документ:
Регистр = ЭлементыФормы.Регистр.Значение;
СтрокаЗапроса = ПоказатьВыбранныйРегистрСведений();
ЭтаФорма.ПолеВвода1 = СтрокаЗапроса;
Запрос = Новый Запрос();
Запрос.Текст = СтрокаЗапроса;
Таб = Запрос.Выполнить().Выгрузить();
ТабДок = ВывестиТаблицуЗначений(Таб, Истина);
ТабДок.Показать();
Кроме того, в поле ввода на форме выводится сам сформированный
программой запрос к БД!
Код программы:
Перем Периодический;
Процедура ПриИзмененииТипаРегистра()
ЭлементыФормы.Регистр.СписокВыбора.Очистить();
//Заполним список регистров сведений по метаданным, только не подчиненные регистратору
МетаданныеРегистров = ?(ВыбранРегистрСведений, Метаданные.РегистрыСведений, Метаданные.РегистрыНакопления);
Для каждого РегистрМетаданные Из МетаданныеРегистров Цикл
ЭлементыФормы.Регистр.СписокВыбора.Добавить(РегистрМетаданные.Имя, РегистрМетаданные.Синоним);
КонецЦикла;
//Отсортируем по алфавиту
ЭлементыФормы.Регистр.СписокВыбора.СортироватьПоПредставлению();
Регистр = ЭлементыФормы.Регистр.СписокВыбора[0].Значение;
КонецПроцедуры
//********* Заполнение полей отбора ****************
Функция ПоказатьВыбранныйРегистрСведений()
РегСвед = Метаданные.РегистрыСведений[Регистр];
Периодический = (РегСвед.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический);
СтрокаОтбора = "";
Если Периодический Тогда
СтрокаОтбора = СтрокаОтбора+"Период";
КонецЕсли;
Для каждого Реквизит Из РегСвед.Измерения Цикл
СтрокаОтбора = СтрокаОтбора+?(ЗначениеЗаполнено(СтрокаОтбора), ", ", "")+ Реквизит.Имя + ".*";
КонецЦикла;
Для каждого Реквизит Из РегСвед.Ресурсы Цикл
СтрокаОтбора = СтрокаОтбора+?(ЗначениеЗаполнено(СтрокаОтбора), ", ", "") + Реквизит.Имя + ".*";
КонецЦикла;
Для каждого Реквизит Из РегСвед.Реквизиты Цикл
СтрокаОтбора = СтрокаОтбора+?(ЗначениеЗаполнено(СтрокаОтбора), ", ", "") + Реквизит.Имя + ".*";
КонецЦикла;
ПостроительОтчета.Текст =
"ВЫБРАТЬ РС.* ИЗ РегистрСведений." + Регистр + " КАК РС
| {ГДЕ " + СтрокаОтбора + "}";
Возврат ПостроительОтчета.Текст;
КонецФункции
Функция ПоказатьВыбранныйРегистрНакоплений()
РегНакопл = Метаданные.РегистрыНакопления[Регистр];
СтрокаОтбора = "Период";
Для каждого Реквизит Из РегНакопл.Измерения Цикл
СтрокаОтбора = СтрокаОтбора+?(ЗначениеЗаполнено(СтрокаОтбора), ", ", "")+ Реквизит.Имя + ".*";
КонецЦикла;
Для каждого Реквизит Из РегНакопл.Ресурсы Цикл
СтрокаОтбора = СтрокаОтбора+?(ЗначениеЗаполнено(СтрокаОтбора), ", ", "") + Реквизит.Имя + ".*";
КонецЦикла;
Для каждого Реквизит Из РегНакопл.Реквизиты Цикл
СтрокаОтбора = СтрокаОтбора+?(ЗначениеЗаполнено(СтрокаОтбора), ", ", "") + Реквизит.Имя + ".*";
КонецЦикла;
ПостроительОтчета.Текст =
"ВЫБРАТЬ РС.* ИЗ РегистрНакопления." + Регистр + " КАК РС
| {ГДЕ " + СтрокаОтбора + "}";
Возврат ПостроительОтчета.Текст;
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)
//Обновим отбор
Если ВыбранРегистрСведений Тогда
Регистр = ЭлементыФормы.Регистр.Значение;
СтрокаЗапроса = ПоказатьВыбранныйРегистрСведений();
ЭтаФорма.ПолеВвода1 = СтрокаЗапроса;
Запрос = Новый Запрос();
Запрос.Текст = СтрокаЗапроса;
Таб = Запрос.Выполнить().Выгрузить();
ТабДок = ВывестиТаблицуЗначений(Таб, Истина);
ТабДок.Показать();
Иначе
Регистр = ЭлементыФормы.Регистр.Значение;
СтрокаЗапроса = ПоказатьВыбранныйРегистрНакоплений();
ЭтаФорма.ПолеВвода1 = СтрокаЗапроса;
Запрос = Новый Запрос();
Запрос.Текст = СтрокаЗапроса;
Таб = Запрос.Выполнить().Выгрузить();
ТабДок = ВывестиТаблицуЗначений(Таб, Истина);
ТабДок.Показать();
КонецЕсли;
КонецПроцедуры
//********* ПОДГОТОВКА ФОРМЫ ****************
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
ВыбранРегистрСведений = Истина;
ПриИзмененииТипаРегистра();
КонецПроцедуры
Процедура ПриОткрытии()
ПоказатьВыбранныйРегистрСведений();
КонецПроцедуры
Функция ВывестиТаблицуЗначений(ТЗ, ВыводитьЗаголовкиКолонок)
Если ТипЗНЧ(ТЗ) <> Тип("ТаблицаЗначений") Тогда
ВызватьИсключение("Входной параметр функции ВывестиТаблицуЗначений() не является таблицей значений ");
КонецЕсли;
ТабДок = Новый ТабличныйДокумент;
НомТекСтр = 1;
Если ВыводитьЗаголовкиКолонок Тогда
Для Каждого Колонки Из ТЗ.Колонки Цикл
Область = ТабДок.Область(НомТекСтр, ТЗ.Колонки.Индекс(Колонки)+1);
Область.Текст = Колонки.Имя;
КонецЦикла;
НомТекСтр = НомТекСтр+1;
КонецЕсли;
Для СчСтрок = 0 По ТЗ.Количество()-1 Цикл
Для СчКол = 0 По ТЗ.Колонки.Количество()-1 Цикл
Область = ТабДок.Область(НомТекСтр, СчКол+1);
ТекстДляВывода = ТЗ[СчСтрок][СчКол];
Область.Текст = ТекстДляВывода;
Область.ШиринаКолонки = Макс(СтрДлина(ТекстДляВывода), Область.ШиринаКолонки);
КонецЦикла;
НомТекСтр = НомТекСтр+1;
КонецЦикла;
Возврат ТабДок;
КонецФункции
Процедура ВыбранРегистрНакопленийПриИзменении(Элемент)
ПриИзмененииТипаРегистра();
КонецПроцедуры
Процедура ВыбранРегистрСведенийПриИзменении(Элемент)
ПриИзмененииТипаРегистра();
КонецПроцедуры
В программе использованы:
Материалы сайта http://1cdop.ru,
Материалы видеоурока Романа Дегтярева http://www.youtube.com/watch?v=biW1WZBJLJ4
Скачать 1с внешнюю обработку "":
Отображение регистра в табличный документ
|