23 января 2010 г.

Как ограничить список выбора значений агрегатного типа в 1С 8

Стандартный функционал для выбора значений агрегатного типа (справочников, документов, перечислений, счетов и т. п.) подразумевает выбор из всего существующего списка значений. А как быть, если список выбора необходимо ограничить? Об этом сегодня пойдет речь.

Способ 1. Использование отбора.

Функционал, который используется для интерактивного отбора в списках, можно использовать и для отбора программным способом.

Для этого нужно для события НачалоВыбора соответствующего поля ввода определить процедуру обработки и внутри процедуры программно устанавить отбор для списка.

Далее следует пример процедуры обработки события НачалоВыбора для поля ввода СтатьяПДР. Реквизит (и поле ввода, соответственно) СтатьяПДР имеет тип СправочникСсылка.ПрочиеДоходыИРасходы. Для списка справочника «Прочие доходы и расходы» устанавливается отбор по реквизиту «Вид прочих доходов и расходов» со значением «Прочие внереализационные доходы (расходы)».

Процедура СтатьяПДРНачалоВыбора(Элемент, СтандартнаяОбработка)
    ФормаВыбора = Справочники.ПрочиеДоходыИРасходы.ПолучитьФормуВыбора(, Элемент);
    ЭлементОтбораВидПДР = ФормаВыбора.Отбор.ВидПрочихДоходовИРасходов;
    Если ЭлементОтбораВидПДР <> Неопределено Тогда
        ЭлементОтбораВидПДР.ВидСравнения  = ВидСравнения.Равно;
        ЭлементОтбораВидПДР.Значение      = Перечисления.ВидыПрочихДоходовИРасходов.ПрочиеВнереализационныеДоходыРасходы;
        ЭлементОтбораВидПДР.Использование = Истина;
    КонецЕсли;
    ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.ВидПрочихДоходовИРасходов.Доступность = Ложь;
    ФормаВыбора.Открыть();
    СтандартнаяОбработка = Ложь; 
КонецПроцедуры

Обратите внимание на строку кода

ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.ВидПрочихДоходовИРасходов.Доступность = Ложь;

Она закрывает доступ к настройке отбора «Вид прочих доходов и расходов». Таким образом, пользователь не может отключить заданный программно отбор и имеет возможность сделать выбор значения только из ограниченного списка.

Пример ограничения  списка выбора для справочника в 1С 8

Внутри процедуры обработки события НачалоВыбора параметру СтандартнаяОбработка нужно обязательно присвоить значение Ложь. В противном случае будет открыт и ограниченный список, и стандартный список, а это, конечно, не входит в наши планы.

Еще один пример для способа №1 иллюстрирует отбор по списку значений, предварительно сформированного любым удобным способом. В следующем примере для поля ввода СчетДт типа ПланСчетовСсылка.Хозрасчетный устанавливается отбор в виде списка счетов. Список счетов предварительно формируется с помощью запроса.

Процедура СчетДтНачалоВыбора(Элемент, СтандартнаяОбработка)
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   | Хозрасчетный.Ссылка
                   |ИЗ
                   | ПланСчетов.Хозрасчетный КАК Хозрасчетный
                   |ГДЕ
                   | Хозрасчетный.Родитель В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы))
                   | И Хозрасчетный.ЗапретитьИспользоватьВПроводках = ЛОЖЬ";
    СписокСчетов = Новый СписокЗначений;
    СписокСчетов.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"));

    ФормаВыбора = ПланыСчетов.Хозрасчетный.ПолучитьФормуВыбора(, Элемент);
    ЭлементОтбораСсылка = ФормаВыбора.Отбор.Ссылка;
    Если ЭлементОтбораСсылка <> Неопределено Тогда
        ЭлементОтбораСсылка.ВидСравнения  = ВидСравнения.ВСписке;
        ЭлементОтбораСсылка.Значение      = СписокСчетов;
        ЭлементОтбораСсылка.Использование = Истина;
    КонецЕсли;
    ФормаВыбора.ЭлементыФормы.Список.НастройкаОтбора.Ссылка.Доступность = Ложь;
    ФормаВыбора.Открыть();
    СтандартнаяОбработка = Ложь; 
КонецПроцедуры

Результат работы данного кода показан на скриншоте (для выбора доступны только субсчета 10-го счета):

Пример ограничения списка выбора для плана счетов в 1С 8

Способ 2. Использование выбора из списка.

Способ №1 совершенно не подходит для ограничения списка перечислений. Выбор значения перечисления обычно осуществляется из маленького списка. Но даже если включить выбор из формы (это делается с помощью свойства «Быстрый выбор» поля ввода), функционал отбора для перечислений все равно неприменим.

В таком случае подходящий способ ограничения списка выбора - использование метода формы ВыбратьИзСписка. Аналогично первому способу, необходимо определить процедуру обработки события НачалоВыбора для поля ввода значения. В следующем примере для поля ввода ВидПДР типа ПеречислениеСсылка.ВидыПрочихДоходовИРасходов программно устанавливается ограниченный список выбора.

Процедура ВидПДРНачалоВыбора(Элемент, СтандартнаяОбработка)
    ВидыПДР = Новый СписокЗначений;
    ВидыПДР.Добавить(Перечисления.ВидыПрочихДоходовИРасходов.ПрочиеВнереализационныеДоходыРасходы);
    ВидыПДР.Добавить(Перечисления.ВидыПрочихДоходовИРасходов.ПрочиеОперационныеДоходыРасходы);
    ВыбранныйЭлемент = ВыбратьИзСписка(ВидыПДР, Элемент, ВидыПДР.НайтиПоЗначению(Элемент.Значение));
    Если ВыбранныйЭлемент <> Неопределено Тогда
        Элемент.Значение = ВыбранныйЭлемент.Значение;
    КонецЕсли;
    СтандартнаяОбработка = Ложь;
КонецПроцедуры

Результат работы процедуры показан на рисунке. Метод ВыбратьИзСписка открывает маленький список с набором значений, переданных в процедуру в первом параметре (в примере - список значений ВидыПДР).

Пример ограничения списка выбора для перечисления в 1С 8

Способ №2 применим отнюдь не только для перечислений. Для других агрегатных типов он также работает.

Процедура СчетКтНачалоВыбора(Элемент, СтандартнаяОбработка)
    СчетаКт = Новый СписокЗначений;
    СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками);
    СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПодотчетнымиЛицами);
    СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПрочимиПоставщикамиИПодрядчиками);
    СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.РасчетыПоТекущимОперациям);
    СчетаКт.Добавить(ПланыСчетов.Хозрасчетный.ПрочиеДоходы);
    ВыбранныйЭлемент = ВыбратьИзСписка(СчетаКт, Элемент, СчетаКт.НайтиПоЗначению(Элемент.Значение));
    Если ВыбранныйЭлемент <> Неопределено Тогда
        Элемент.Значение = ВыбранныйЭлемент.Значение;
    КонецЕсли;
    СтандартнаяОбработка = Ложь;
КонецПроцедуры
Пример ограничения списка выбора для счетов в 1С 8 (2)

Обработку с работающими примерами, как обычно можно скачать в «Кладовке провинциального программиста»:

Скачать обработку «Пример ограничения списка выбора»

Обработка работает в конфигурациях «Бухгалтерия предприятия» и «Управление производственным предприятием»

P. S. А Вы знаете другие варианты решения задачи? Если знаете, пишите комментарии. Также интересно узнать, интересует ли Вас решение данной задачи в 1С 7.7. Как показывают данные опроса, к 1С 7.7 все еще есть интерес, хотя и существенно меньший.

Комментировать в ВКонтакте

Комментировать в Facebook

Комментировать в Blogger

Комментариев нет:

Отправить комментарий