При разработке специализированных документов и обработок часто возникает задача ограничить выбор пользователя определенным перечнем счетов (например, предоставить возможность выбирать только счета расчетов 70-й группы). Если предоставить доступ ко всему плану счетов, возрастает риск пользовательской ошибки и некорректного формирования проводок.
Разберем типичные ошибки при программной настройке отбора, а также рассмотрим несколько эффективных способов решения этой задачи на управляемых формах 1С:Предприятия.
Рассмотрим исходную ситуацию: разработчик пытается открыть стандартную форму выбора плана счетов через событие НачалоВыбора и передать туда отбор.
&НаКлиенте
Процедура Счет7XНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СписокСчетов7Х = Новый СписокЗначений;
ПараметрыВыбора = Новый Структура("Отбор", СписокСчетов7Х());
ОткрытьФорму("ПланСчетов.Хозрасчетный.ФормаВыбора", ПараметрыВыбора);
КонецПроцедуры
Выясним причину, почему такой код не работает должным образом:
СтандартнаяОбработка = Ложь) процедура ОткрытьФорму должна принимать элемент формы в качестве владельца или использовать описание оповещения. Без передачи элемента форма открывается сама по себе, и выбор значения пользователем не помещается обратно в реквизит.Отбор ожидает структуру, где ключом выступает имя поля динамического списка (например, Ссылка или Код), а значением — искомое значение или массив/список значений. Передача структуры вида Новый Структура("Отбор", СписокЗначений) платформой игнорируется.Если выбор счета происходит во вспомогательной форме или диалоге заполнения, наиболее простым и надежным решением является отказ от открытия тяжелой формы плана счетов в пользу выпадающего списка выбора. В этом случае пользователь видит только заранее подготовленный список разрешенных счетов.
Посмотрим на реализацию в обработчике ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Хозрасчетный.Ссылка КАК Счет
|ИЗ
| ПланСчетов.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Код ПОДОБНО ""7%""
| И Хозрасчетный.ЗапретитьИспользоватьВПроводках = ЛОЖЬ";
Выборка = Запрос.Выполнить().Выбрать();
СписокСчетов = Новый СписокЗначений;
Пока Выборка.Следующий() Цикл
СписокСчетов.Добавить(Выборка.Счет);
КонецЦикла;
Элементы.Счет7X.СписокВыбора.ЗагрузитьЗначения(СписокСчетов.ВыгрузитьЗначения());
КонецПроцедуры
Важные параметры элемента формы: чтобы поле ввода не пыталось открывать форму выбора всего плана счетов, убедимся в настройке свойств элемента Счет7X:
РежимВыбораИзСписка в значение Истина.КнопкаВыпадающегоСписка (значение Истина).КнопкаВыбора (значение Ложь).Если необходимо сохранить открытие стандартной формы выбора, но жестко отфильтровать доступные элементы, воспользуемся свойством ПараметрыВыбора элемента формы. Этот механизм передает отбор в форму выбора автоматически при стандартном нажатии на кнопку выбора.
Проанализируем пример настройки:
&НаСервере
Процедура НастроитьОтборСчетовНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Хозрасчетный.Ссылка КАК Счет
|ИЗ
| ПланСчетов.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Код ПОДОБНО ""7%""";
МассивСчетов = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Счет");
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(Новый ПараметрВыбора("Отбор.Ссылка", Новый ФиксированныйМассив(МассивСчетов)));
МассивПараметров.Добавить(Новый ПараметрВыбора("Отбор.ЗапретитьИспользоватьВПроводках", Ложь));
Элементы.СчетУчета.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);
КонецПроцедуры
В этом случае разработчику не требуется переопределять процедуру НачалоВыбора на клиенте — платформа 1С самостоятельно передаст отбор в открываемый динамический список и применит его.
Если логика требует обязательного вызова метода ОткрытьФорму из клиентского кода, корректная передача параметров и владельца выглядит следующим образом:
&НаКлиенте
Процедура СчетУчетаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
МассивСчетов = ПолучитьМассивСчетовНаСервере();
СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить("Ссылка", МассивСчетов);
СтруктураОтбора.Вставить("ЗапретитьИспользоватьВПроводках", Ложь);
ПараметрыФормы = Новый Структура("Отбор", СтруктураОтбора);
// Передаем Элемент вторым параметром в качестве владельца формы
ОткрытьФорму("ПланСчетов.Хозрасчетный.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры
Обратите внимание: структура отбора помещается внутрь общего параметра Отбор, а ключами выступают конкретные реквизиты объекта метаданных или поля динамического списка.
ЗапретитьИспользоватьВПроводках = ЛОЖЬ. Это исключает выбор папок и счетов верхнего уровня, по которым нельзя делать проводки.ПОДОБНО "7%") может быть не всегда точным при наличии нестандартных кодов субсчетов. По возможности используйте конструкцию запроса В ИЕРАРХИИ (&МассивСчетов) с передачей предопределенных счетов-родителей.