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