При переходе на новые релизы конфигурации «1С:Бухгалтерия предприятия» разработчики и пользователи нередко сталкиваются с ситуацией, когда добавленные законодательные ставки налога (например, 22% и 22%/122%) отсутствуют в выпадающем списке выбора. При этом, если начать вводить цифры «22» вручную с клавиатуры, система без проблем находит и подставляет нужное значение. Подобное поведение наблюдается как в типовых документах, так и во вновь созданных внешних обработках с реквизитом типа ПеречислениеСсылка.СтавкиНДС.
Разберем детально архитектуру этого механизма, выясним причину такого поведения платформы и прикладного решения, а также рассмотрим способы проверки и адаптации форм под собственные задачи.
В отличие от справочников или регистров сведений, объект метаданных Перечисление не поддерживает периодические реквизиты. Все значения перечисления хранятся статично. Чтобы пользователи не могли случайно выбрать ставку налога до момента её официального вступления в силу (или устаревшую ставку после отмены), разработчики типовых решений реализуют динамическое ограничение списка значений.
Откроем конфигуратор и обратим внимание на перечисление СтавкиНДС, а именно на его модуль менеджера. В нем переопределен платформенный обработчик события ОбработкаПолученияДанныхВыбора. Рассмотрим логику его работы:
СвязиПараметровВыбора в процедуру передается дата документа. Если дата документа меньше даты вступления изменений в силу, новая ставка принудительно исключается из формируемого массива значений.ТекущаяДатаСеанса(). Если текущая дата сеанса предшествует дате начала применения ставки, значение 22% отфильтровывается и не выводится в выпадающем окне.СтрокаПоиска пуст, и срабатывает жесткий отбор. Однако при вводе символов вручную (например, «22») платформа запускает режим поиска по подстроке. Если в кодовой ветке при наличии значения в Параметры.СтрокаПоиска управление передается стандартной обработке (СтандартнаяОбработка = Истина), платформа выполняет прямой поиск по синонимам предопределенных значений перечисления, игнорируя наложенный фильтр по дате.В зависимости от того, где именно возникла необходимость использовать или протестировать новую ставку, разберем по шагам доступные варианты действий.
Если мы работаем со стандартным документом (например, «Поступление (акт, накладная, УПД)» или «Реализация (акт, накладная, УПД)»), список выбора динамически адаптируется под дату самого документа. Проверим это:
Важно: если обойти интерфейсное ограничение вводом строки «22» в документе с текущей датой до вступления закона в силу, типовые алгоритмы проверки при проведении документа заблокируют запись и выдадут ошибку контроля применения ставок НДС.
Если требуется проверить механизмы расчета или интерфейсные формы без редактирования дат каждого отдельного документа, скорректируем рабочую дату в сеансе:
Если мы разрабатываем собственную внешнюю обработку или добавляем реквизит на форму, платформа не передает дату в менеджер перечисления автоматически. Рассмотрим, как правильно организовать передачу контекста:
СвязиПараметровВыбора. Настроим связь параметра Отбор.Период (или соответствующего реквизита даты) с полем даты на нашей форме. В таком случае менеджер перечисления получит конкретное значение периода вместо вызова текущей системной даты.СписокВыбора элемента формы при инициализации:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.СтавкаНДС.СписокВыбора.Очистить();
Для Каждого ЗначениеПеречисления Из Метаданные.Перечисления.СтавкиНДС.ЗначенияПеречисления Цикл
Элементы.СтавкаНДС.СписокВыбора.Добавить(Перечисления.СтавкиНДС[ЗначениеПеречисления.Имя]);
КонецЦикла;
КонецПроцедуры
Если требуется установить значение программно в коде процедур или модулей загрузки данных, мы можем напрямую присвоить предопределенное значение реквизиту:
Объект.СтавкаНДС = Перечисления.СтавкиНДС.НДС22;
На прямое программное присвоение значения в коде платформенные события получения данных выбора не влияют.