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