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