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