Как ограничить выбор счетов из плана счетов и настроить отбор в форме 1С 8.3

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При разработке специализированных документов и обработок часто возникает задача ограничить выбор пользователя определенным перечнем счетов (например, предоставить возможность выбирать только счета расчетов 70-й группы). Если предоставить доступ ко всему плану счетов, возрастает риск пользовательской ошибки и некорректного формирования проводок.

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

Анализ типичных ошибок при программном открытии формы выбора

Рассмотрим исходную ситуацию: разработчик пытается открыть стандартную форму выбора плана счетов через событие НачалоВыбора и передать туда отбор.


&НаКлиенте
Процедура Счет7XНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    СписокСчетов7Х = Новый СписокЗначений;
    ПараметрыВыбора = Новый Структура("Отбор", СписокСчетов7Х());    
    
    ОткрытьФорму("ПланСчетов.Хозрасчетный.ФормаВыбора", ПараметрыВыбора);
    
КонецПроцедуры

Выясним причину, почему такой код не работает должным образом:

  1. Не указан владелец открываемой формы: при переопределении стандартной обработки (СтандартнаяОбработка = Ложь) процедура ОткрытьФорму должна принимать элемент формы в качестве владельца или использовать описание оповещения. Без передачи элемента форма открывается сама по себе, и выбор значения пользователем не помещается обратно в реквизит.
  2. Некорректная структура отбора: параметр формы Отбор ожидает структуру, где ключом выступает имя поля динамического списка (например, Ссылка или Код), а значением — искомое значение или массив/список значений. Передача структуры вида Новый Структура("Отбор", СписокЗначений) платформой игнорируется.

Способ 1. Ограничение выбора через СписокВыбора элемента формы (рекомендуемый для вспомогательных окон)

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

Посмотрим на реализацию в обработчике ПриСозданииНаСервере:


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

Важные параметры элемента формы: чтобы поле ввода не пыталось открывать форму выбора всего плана счетов, убедимся в настройке свойств элемента Счет7X:

  1. Установим свойство РежимВыбораИзСписка в значение Истина.
  2. Включим свойство КнопкаВыпадающегоСписка (значение Истина).
  3. Отключим свойство КнопкаВыбора (значение Ложь).

Способ 2. Программная установка параметров выбора элемента формы

Если необходимо сохранить открытие стандартной формы выбора, но жестко отфильтровать доступные элементы, воспользуемся свойством ПараметрыВыбора элемента формы. Этот механизм передает отбор в форму выбора автоматически при стандартном нажатии на кнопку выбора.

Проанализируем пример настройки:


&НаСервере
Процедура НастроитьОтборСчетовНаСервере()
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    Хозрасчетный.Ссылка КАК Счет
    |ИЗ
    |    ПланСчетов.Хозрасчетный КАК Хозрасчетный
    |ГДЕ
    |    Хозрасчетный.Код ПОДОБНО ""7%""";
    
    МассивСчетов = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Счет");
    
    МассивПараметров = Новый Массив;
    МассивПараметров.Добавить(Новый ПараметрВыбора("Отбор.Ссылка", Новый ФиксированныйМассив(МассивСчетов)));
    МассивПараметров.Добавить(Новый ПараметрВыбора("Отбор.ЗапретитьИспользоватьВПроводках", Ложь));
    
    Элементы.СчетУчета.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);
    
КонецПроцедуры

В этом случае разработчику не требуется переопределять процедуру НачалоВыбора на клиенте — платформа 1С самостоятельно передаст отбор в открываемый динамический список и применит его.

Способ 3. Программное открытие формы выбора с правильной структурой параметров

Если логика требует обязательного вызова метода ОткрытьФорму из клиентского кода, корректная передача параметров и владельца выглядит следующим образом:


&НаКлиенте
Процедура СчетУчетаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    МассивСчетов = ПолучитьМассивСчетовНаСервере();
    
    СтруктураОтбора = Новый Структура;
    СтруктураОтбора.Вставить("Ссылка", МассивСчетов);
    СтруктураОтбора.Вставить("ЗапретитьИспользоватьВПроводках", Ложь);
    
    ПараметрыФормы = Новый Структура("Отбор", СтруктураОтбора);
    
    // Передаем Элемент вторым параметром в качестве владельца формы
    ОткрытьФорму("ПланСчетов.Хозрасчетный.ФормаВыбора", ПараметрыФормы, Элемент);
    
КонецПроцедуры

Обратите внимание: структура отбора помещается внутрь общего параметра Отбор, а ключами выступают конкретные реквизиты объекта метаданных или поля динамического списка.

Рекомендации по составлению запросов к плану счетов

  1. Исключение групп счетов: при подборе счетов для хозяйственных операций всегда добавляйте в условие ЗапретитьИспользоватьВПроводках = ЛОЖЬ. Это исключает выбор папок и счетов верхнего уровня, по которым нельзя делать проводки.
  2. Фильтрация по иерархии: условие по маске кода (ПОДОБНО "7%") может быть не всегда точным при наличии нестандартных кодов субсчетов. По возможности используйте конструкцию запроса В ИЕРАРХИИ (&МассивСчетов) с передачей предопределенных счетов-родителей.
← На главную