В предыдущем сообщении я рассказал о том, как ограничить список выбора значений агрегатного типа в 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; КонецЕсли; КонецПроцедуры
А вот так выглядит результат:
Тема раскрыта или я что-то упустил из виду? Если Вам есть, что добавить, оставляйте комментарии.
Благодарю! Коротко и понятно!
ОтветитьУдалитьСпасибо за ценую информацию!
ОтветитьУдалитьНе подскажите, как сделать примерно то же самое, но относительно Документов?
Относительно документов аналогично.
ОтветитьУдалитьСпасибо. Помогло!
ОтветитьУдалитьИспользовал. спасибо.
ОтветитьУдалитьХорошая шпаргалка! Спасибо.
ОтветитьУдалить