При разработке конфигураций на платформе 1С:Предприятие 8 часто возникает задача ограничить список доступных счетов в плане счетов Хозрасчетный. Это может быть необходимо для минимизации ошибок пользователя или для реализации специфической бизнес-логики. В данной статье мы подробно разберем, как реализовать отборы для обычных и управляемых форм, а также рассмотрим расширенные методы фильтрации.
Для начала рассмотрим ситуацию, когда нам нужно открыть форму выбора плана счетов и оставить в ней только определенные счета по их кодам. Разберем механизм работы через объект Отбор. В обычных формах мы сначала получаем объект формы, настраиваем его свойства и только затем открываем.
Проанализируем пример кода, где мы используем СписокЗначений для фильтрации по нескольким кодам:
СписокСчетов = Новый СписокЗначений;
СписокСчетов.Добавить("20.01");
СписокСчетов.Добавить("26");
СписокСчетов.Добавить("44.01");
ФормаВыбора = ПланыСчетов.Хозрасчетный.ПолучитьФормуВыбора();
Отбор = ФормаВыбора.Отбор.Код;
Отбор.ВидСравнения = ВидСравнения.ВСписке;
Отбор.Использование = Истина;
Отбор.Значение = СписокСчетов;
ФормаВыбора.Открыть();
Обратите внимание на важный нюанс: при использовании ВидСравнения.ВСписке значением обязательно должен выступать объект СписокЗначений. Если вы попытаетесь передать туда простую строку или массив, система выдаст ошибку или отбор не сработает корректно.
Часто требуется показать не просто список конкретных счетов, а все субсчета, принадлежащие определенной группе (родителю). Рассмотрим, как это сделать. Если нам нужно выбрать все счета, входящие в группу "211", мы можем использовать отбор по полю Родитель или применить поиск по иерархии.
Выясним причину, почему отбор по коду родителя может быть сложнее. Правильнее использовать ссылку на объект счета. Рассмотрим следующий пример:
СчетРодитель = ПланыСчетов.Хозрасчетный.НайтиПоКоду("211");
ФормаВыбора = ПланыСчетов.Хозрасчетный.ПолучитьФормуВыбора();
ФормаВыбора.Отбор.Родитель.Установить(СчетРодитель);
ФормаВыбора.Открыть();
Если же стоит задача отобрать счета, принадлежащие сразу нескольким родителям, мы снова возвращаемся к ВидСравнения.ВСпискеПоИерархии. В этом случае в список значений нужно добавить ссылки на все интересующие нас группы счетов. Система автоматически развернет дерево и покажет все подчиненные элементы любого уровня вложенности.
Перейдем к современному интерфейсу "Такси" и управляемым формам. Здесь подход в корне отличается: мы не получаем форму заранее, а передаем параметры открытия в функцию ОткрытьФорму. Это позволяет платформе оптимизировать клиент-серверное взаимодействие.
Рассмотрим пошагово, как прописать отбор в обработчике события НачалоВыбора для реквизита на форме:
&НаКлиенте
Процедура СчетУчетаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отменяем стандартное открытие
Список = Новый СписокЗначений;
Список.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду("20.01"));
Список.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду("26"));
// Формируем структуру отбора
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Ссылка", Список); // Используем ссылку для надежности
// Помещаем отбор в параметры открытия формы
ПараметрыОткрытия = Новый Структура("Отбор", ПараметрыОтбора);
ОткрытьФорму("ПланСчетов.Хозрасчетный.ФормаВыбора", ПараметрыОткрытия, Элемент);
КонецПроцедуры
Важный момент: В управляемых формах для отбора по списку достаточно передать СписокЗначений или Массив в структуру параметров. Платформа сама определит вид сравнения как ВСписке.
Довольно часто бухгалтеры просят ограничить выбор так, чтобы нельзя было выбрать "верхний" счет (папку), у которого есть субсчета. Это предотвращает ошибки при проведении документов, так как проводки обычно должны идти только по конечным счетам.
В управляемых формах это решается установкой параметра ВыборГруппИЭлементов. Посмотрим на пример настройки:
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ВыборГруппИЭлементов", ИспользованиеГруппИЭлементов.Элементы);
ОткрытьФорму("ПланСчетов.Хозрасчетный.ФормаВыбора", ПараметрыОткрытия, Элемент);
При такой настройке пользователь увидит структуру плана счетов, сможет раскрывать группы, но кнопка "Выбрать" будет активна только для конечных счетов-элементов.
Проанализируем ситуацию: если вы установили отбор программно, пользователь в открывшейся форме может зайти в меню "Еще — Настроить список" и удалить ваш фильтр. Чтобы этого избежать, следует использовать ФиксированныеНастройки. Это особенно актуально для управляемых форм, когда нужно жестко ограничить видимость данных без возможности изменения со стороны пользователя.
Если вам нужно ограничить список доступных счетов во всей конфигурации сразу (например, исключить забалансовые счета из всех полей ввода), лучше не прописывать код в каждой форме, а воспользоваться модулем менеджера плана счетов.
Разберем, как это работает в модуле менеджера ПланыСчетов.Хозрасчетный:
ОбработкаПолученияДанныхВыбора.Параметры добавьте необходимые условия в структуру Отбор.Этот метод хорош тем, что он срабатывает даже при вводе счета по строке (когда пользователь просто набирает цифры в поле, не открывая форму выбора).
При настройке фильтров важно понимать разницу между отбором по Коду и по Ссылке:
Отбор по Коду (строка):
Отбор по Ссылке (объект):
НайтиПоКоду() или запросом.Мы рекомендуем всегда использовать ссылки, если это возможно, так как это гарантирует корректную работу программы при обновлении типовых конфигураций, где коды счетов могут незначительно меняться.
Подводя итог, можно сказать, что выбор метода отбора зависит от типа используемых форм и требуемой жесткости фильтрации. Для простых задач в обычных формах достаточно настройки объекта Отбор, в то время как для сложных интерфейсных решений на УФ лучше использовать структуру ПараметрыОткрытия и механизмы модуля менеджера.