31 января 2010 г.

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

В предыдущем сообщении я рассказал о том, как ограничить список выбора значений агрегатного типа в 1С 8. Сегодня рассмотрим, как эта задача решается в 1С 7.7.

Помню, когда 1С 8.0 только появилась, мне часто задавали вопрос, трудно ли после 7.7 перестроиться на новую платформу. Не знаю, кому как, а мне лично было легко. И даже не потому, что встроенный язык программирования восьмой платформы близкий родственник языку программирования 1С 7.7. Скорее потому, что программировать в 1С 8 гораздо удобнее, а язык 1С 8 более логичный, предсказуемый и дает программисту гораздо больше возможностей для управления системой. А сейчас, по прошествии некоторого времени, платформа 1С 7.7 в сравнении с 1С 8 кажется неким полуфабрикатом. И теперь уже гораздо тяжелее возвращаться к программированию в старой версии, несмотря на многолетний опыт программирования в 1С 7.7.

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

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

Использование отбора в «семерке» также работает и используется в типовых конфигурациях от 1С. Но решение задачи в 1С 7.7 выглядит чуть сложнее. Все проблема в ограниченных возможностях взаимодействия между формами. В 1С 7.7 мы не можем из одной формы также свободно управлять другой формой. Максимум, что мы можем себе позволить, это передать в открываемую форму значение любого типа. В открытой форме переданное значение будет доступно в виде атрибута Форма.Параметр.

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

Интересующий нас код находится в предопределенной процедуре ПриНачалеВыбораЗначения:

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

При открытии формы справочника «Прочие доходы и расходы», в нее передается значение перечисления Перечисление.ВидыПрочихДоходовИРасходов.ВыбытиеАктивов. Оператор Флаг = 0 отменяет стандартный процесс выбора значения. Но это, как Вы понимаете, только одна часть кода. Вторую часть нужно искать в форме выбора справочника «Прочие доходы и расходы». Форма выбора (она же форма списка) в предопределенной процедуре ПриОткрытии, используя переданное ей значение, устанавливает отбор по реквизиту «Вид прочих доходов и расходов». Вот как это выглядит:

Процедура ПриОткрытии()
    Если ТипЗначенияСтр(Форма.Параметр) = "Перечисление"  Тогда
        Если Форма.Параметр.Вид() = "ВидыПрочихДоходовИРасходов" Тогда
            Форма.ВидПрочихДоходовИРасходов.Видимость(0);
            УстановитьОтбор("ВидПрочихДоходовИРасходов", Форма.Параметр);
            ВидыОтбора("");
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Оператор ВидыОтбора("") закрывает для пользователя возможность управлять отбором в открытой форме справочника. Таким образом, пользователь может сделать выбор только из ограниченного списка.

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

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

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

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

А вот так выглядит результат:

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

Тема раскрыта или я что-то упустил из виду? Если Вам есть, что добавить, оставляйте комментарии.

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

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

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

6 комментариев: