Описание практической проблемы:
У функции ОткрытьПодбор(,,,), активно используемой в обработке УОПО для выбора значений объектов, замечено два недостатка:
1. С ее помощью нельзя открыть для подбора внешнюю обработку. Приходится открывать форму внешней обработки модально. Если установлена ВК FormEx.dll, можно также имитировать режим подбора в немодальном режиме, вызывая с помощью объекта «Сервис» процедуру ОбработкаПодбора(,,,) в контексте формы, открывшей обработку. Но это требует дополнительных действий при написании кода и уменьшает универсальность обработки.
2. Если использовать функцию ОткрытьПодбор(,,,) для выбора значений в форме открытой модально, то форма подбора открывается немодально «под» вызвавшей его модальной формой(рис.1) и оказывается заблокированной для выбора.
С учетом сказанного стандартная УОПО оказывается неудобна при открытии в модальном режиме для редактирования списков. Кнопки подбора объектов фактически не работают. Остается только кнопка «Отобрать объекты» без установленных фильтров (фильтры тоже заполняются с помощью функции ОткрытьПодбор(,,,)).
Однако на практике модальный режим может потребоваться, если для редактирования списка нужно открыть УОПО, хранящуюся во внешнем файле. Также модальный режим может быть удобен, если сразу после изменения списка, где-нибудь в форме требуется обновить его текстовое представление.
Описание исправлений и улучшения в предлагаемой версии УОПО:
1) Для исправления работы обработки в модальном режиме, сначала проверяется режим открытия формы. Если форма открыта немодально - для выбора объектов по-старому используется функция ОткрытьПодбор(,,,). Если форма открыта в модальном режиме, то для этой цели используется другая функция - ВвестиЗначение(,,,), которая гарантированно открывает модальный диалог выбора.
2) Расширен список типов значений, полноценно поддерживаемых при заполнении таблицы выбора объектов. Теперь кроме справочников, документов, операций и счетов можно использовать следующие типы 1С:
a. Перечисления;
b. Календари (системное перечисление);
c. Виды расчетов (системное перечисление);
d. Виды субконто (системное перечисление);
e. Планы бухг. счетов (системное перечисление);
3) Для тех объектов, которые нельзя открыть функцией ОткрытьФорму(,,) (Перечисления, ВидыРасчетов, Календари и т.п.), предусмотрено при клике в таблице отобранных объектов открытие списка выбора в диалоге с активизацией в нем текущего объекта (Рис.5). Стандартная обработка в этом случае просто ничего не делае, так как функция ОткрытьФорму(,,) игнорирует такие объекты без ошибок времени исполнения.
4) Реализована функция печати списка объектов с выводом колонок показываемых реквизитов (Рис.2). Можно распечатать как все строки в списке, так и только отмеченные. Таким образом обработку можно использовать как универсальный распечатник простых списков объектов (без группировки и агрегирования).
5. Добавлен новый режим подбора, когда обработка не заполняет объектами из таблицы выбора список, переданный через параметр формы, а возвращает копию самой таблицы выбора без колонок с пиктограммами. Для этого в параметре формы нужно установить значение с идентификатором «ПодборUChoice» не равным нулю (см. примеры ниже).
Значение параметра «ПодборUChoice» > 0 используется для подбора в немодальном режиме. Таблица выбора возвращается методом Форма.ВыполнитьВыбор(Значение) как выбранное в подборе значение (пример 2).
Значение параметра «ПодборUChoice» < 0 используется для подбора в модальном режиме. Таблица выбора возвращается через параметр формы в значении с идентификатором «гТабВыборка» (примеры 1 и 2).
6. Предусмотрена установка своего заголовка формы обработки вместо стандартного. Для этого нужно передать требуемый заголовок через параметр формы в значении с идентификатором «Заголовок» (см. примеры ниже). Кроме этого в форму добавлена надпись, выводящая количество выбранных в обработке объектов (Рис.2 и рис.3).
Требования:
Особенно никаких требований не нужно, разве что наличие действующей подписки ИТС.
Желательно иметь загруженную компоненту FormEx.dll (dorex.ru). Тогда при открытии можно выбирать тип и вид объекта в красивом диалоге в виде дерева (Рис.4).
Компоненту можно скачать с сайта разработчиков http://www.dorex.pro/ , взять в файле поставки обработки "Изменение времени документа" в каталоге ..\FormEx1CPP\.
Примеры использования:
1) Изменение списка объектов во внешней обработке УОПО, открытой модально:
ИмяОбработкиВнеш =КаталогИБ()+"ExtForms\ ПодборUChoice.ert";
Параметр =тзПараметров. Параметр;
Тип =тзПараметров. Тип;
Вид =тзПараметров. Вид;
сзПараметр = тзПараметров.Значение;
Если ТипЗначенияСтр(сзПараметр)<>"СписокЗначений" Тогда
сзПараметр = СоздатьОбъект("СписокЗначений");
тзПараметров.Значение= сзПараметр;
КонецЕсли;
Парам = СоздатьОбъект("СписокЗначений");
Парам.Установить("ИмяВызвавшейФормы","");
Парам.Установить("Тип",Тип);
Парам.Установить("Вид",Вид);
Парам.Установить("БезГрупп",0);
Парам.Установить("Объекты",сзПараметр);
Парам.Установить("Заголовок","Редактирование списка параметра '#"+СокрЛП(Параметр)+"':");
ОткрытьФормуМодально("Обработка",Парам, ИмяОбработкиВнеш);
ЗначениеПредс=СписокЗначений_в_Строку(сзПараметр,,20);
тзПараметров.ЗначениеПредс=ЗначениеПредс;
2) Подбор таблицы со ссылками на объекты в УОПО:
// Перем Тип; // переменные модуля формы, куда перед подбором объектов
// Перем Вид; // записываются их тип и вид при выборе в диалоге
ИмяОбработкиВстр = " ПодборUChoice";
ИмяОбработкиВнеш =КаталогИБ()+"ExtForms\ ПодборUChoice.ert";
ЕстьРедакторСписков=0;
Если Метаданные.Обработка("ПодборUChoice").Выбран()=1 Тогда
ЕстьРедакторСписков=1; // подбор таблицы объектов в немодальном режиме
Иначе Если ФС.СуществуетФайл(ИмяОбработкиВнеш)=1 Тогда
ЕстьРедакторСписков=2; // подбор таблицы объектов в модальном режиме
КонецЕсли;
Если ЕстьРедакторСписков=0 Тогда
Возврат;
КонецЕсли;
Парам =СоздатьОбъект("СписокЗначений");
Парам.Установить("Тип", Тип);
Парам.Установить("Вид", Вид);
Парам.Установить("Заголовок","Выбор объектов для очистки:");
Если ЕстьРедакторСписков=1 Тогда
// подбор таблицы объектов в немодальном режиме
Парам.Установить("ПодборUChoice",+1);
ОткрытьПодбор ("Обработка. "+ ИмяОбработкиВстр, Парам);
ИначеЕсли ЕстьРедакторСписков=2 Тогда
// подбор таблицы объектов в модальном режиме
Парам.Установить("ПодборUChoice",-1);
ОткрытьФормуМодально("Обработка#", Парам, ИмяОбработкиВнеш);
СтатусОК=-1;
Если ТипЗначенияСтр(Парам)="СписокЗначений" Тогда
СтатусОК=Цел(Парам.Получить("СтатусОК"));
КонецЕсли;
Если СтатусОК<=0 Тогда
Возврат;
КонецЕсли;
Значение = Парам.Получить("гТабВыборка");
ОбработкаПодбора(Значение,Неопределено);
КонецЕсли;
Благодарности:
Выражаю огромную благодарность всем разработчикам фирмы 1С за их нелегкий труд.