При разработке интерфейсов в среде 1С:Предприятие 7.7 часто возникает ситуация, когда для реализации сложной фильтрации данных используется метод ИспользоватьСписокЭлементов(). Однако разработчики сталкиваются с тем, что стандартная панель инструментов формы автоматически блокирует возможность добавления новых элементов. Давайте разберем, почему это происходит и как правильно организовать работу в таких случаях.
Метод ИспользоватьСписокЭлементов() переводит форму справочника в режим жесткого отображения строго определенного набора записей. Платформа 1С 7.7 отключает кнопки добавления, удаления и копирования, так как система не может автоматически гарантировать, что созданный пользователем новый элемент будет соответствовать текущим условиям фильтрации, заданным в списке. Это ограничение платформы является архитектурным и не предполагает «включения» кнопки через стандартные настройки.
Если вам критически важно оставить стандартную форму списка, самым надежным решением будет скрытие стандартной панели инструментов и создание собственной. Рассмотрим шаги реализации:
Процедура ПриНажатииКнопкиДобавить()
ОткрытьФорму("Справочник.ВашСправочник", );
КонецПроцедуры
Когда перед нами стоит задача создать развитый интерфейс — например, дерево групп или объектов слева и список элементов справа, — использование формы списка справочника становится нецелесообразным. В таких случаях мы рекомендуем перейти к архитектуре АРМ (автоматизированного рабочего места) на базе ТаблицаЗначений.
Преимущества использования ТаблицыЗначений:
Запрос, который выберет данные по любым критериям (например, по дому, подъезду и специфическим условиям абонента одновременно).Разберем пример реализации обновления списка при смене выбора в дереве:
Процедура ОбновитьСписок()
ТаблицаАбонентов.УдалитьСтроки();
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Абонент = Справочник.Абоненты.ТекущийЭлемент;
|Условие (Абонент.Дом = ВыбранныйДом);
|Группировка Абонент;
|";
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
Пока Запрос.Группировка(1) = 1 Цикл
ТаблицаАбонентов.НоваяСтрока();
ТаблицаАбонентов.Абонент = Запрос.Абонент;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Проанализировав ситуацию, мы рекомендуем не пытаться «взламывать» поведение системной панели через внешние компоненты. Попытки заставить кнопку работать вопреки логике платформы часто ведут к нестабильной работе формы.
Если задача требует сложной выборки — отказывайтесь от стандартных форм списков в пользу специализированных обработок. Это сделает ваш код более читаемым, а интерфейс — более отзывчивым для конечного пользователя. В случае использования ТаблицаЗначений вы всегда будете точно знать, почему та или иная кнопка доступна или недоступна, так как управление ими будет полностью находиться в вашей Процедуре обработки событий.
Помните, что создание интерфейса, соответствующего задачам АРМ, всегда выигрывает по сравнению с попытками переопределить стандартное поведение «родных» форм 1С 7.7.