Как настроить видимость дополнительных реквизитов номенклатуры в 1С:УТ 11.4, если эти настройки отсутствуют?

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

При работе с системой 1С:Управление торговлей (УТ) версии 11.4 пользователи часто сталкиваются с необходимостью настройки видимости и доступности дополнительных реквизитов номенклатуры. Эта задача может оказаться нетривиальной, особенно когда речь идет о реквизитах, созданных ранее. В процессе создания нового дополнительного реквизита обычно доступны опции для управления его видимостью, доступностью и обязательностью заполнения. Однако, как отмечают многие пользователи, для уже существующих реквизитов эти настройки могут быть недоступны, что приводит к вопросу: как получить доступ к управлению видимостью таких реквизитов?

Давайте подробно рассмотрим эту проблему, выясним её причины и предложим несколько решений, включая программные методы.

Понимание ограничений: почему настройки видимости отсутствуют?

Первым шагом к решению проблемы является понимание, почему настройки видимости и доступности могут отсутствовать для определенных дополнительных реквизитов. Анализ системы показывает, что ключевым фактором является тип дополнительного реквизита – является ли он «общим» или привязан к конкретному «виду номенклатуры».

Мы выяснили, что настройка видимости и доступности невозможна для дополнительных реквизитов, у которых используется возможность включения в несколько наборов. Проще говоря, если реквизит является «общим» – то есть, он может использоваться в нескольких местах или принадлежать к нескольким видам справочников одновременно – система ограничивает возможность детальной настройки его видимости через пользовательский интерфейс.

Рассмотрим фрагмент кода, который подтверждает это поведение:


Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
    СтарыйТипЗначения = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Ссылка, "ТипЗначения");
    МожноНастраиватьВидимостьДоступность = ЗначениеЗаполнено(Объект.НаборСвойств);
Иначе
    СтарыйТипЗначения = Новый ОписаниеТипов;
    МожноНастраиватьВидимостьДоступность = ЗначениеЗаполнено(ТекущийНаборСвойств);
КонецЕсли;

// ... далее по коду ...

Если МожноНастраиватьВидимостьДоступность Тогда
    // ... элементы для настройки видимости/доступности ...
    Элементы.ЗадатьУсловиеДоступности.Доступность = Истина;
    Элементы.ЗадатьУсловиеВидимости.Доступность = Истина;
Иначе
    Элементы.ГруппаНастройкаЗависимостей.Видимость = Ложь;
    Элементы.Виден.Видимость = Ложь;
    Элементы.Доступен.Видимость = Ложь;
    // ... другие ограничения ...
КонецЕсли;

Этот код явно показывает, что возможность настраивать видимость и доступность (переменная МожноНастраиватьВидимостьДоступность) напрямую зависит от того, заполнено ли свойство Объект.НаборСвойств (для существующего объекта) или ТекущийНаборСвойств (для нового объекта). Свойство НаборСвойств заполняется только в том случае, если дополнительный реквизит не является общим, а привязан к конкретному набору свойств, то есть к определенному виду номенклатуры.

Таким образом, если ваш дополнительный реквизит был создан как «общий» (например, в папке «Справочник Номенклатура (общее)» или через общий список реквизитов), вы не увидите настроек видимости и доступности в его свойствах. Даже попытка использовать кнопку «Изменить настройку дополнительного реквизита» и галку «Реквизит со своим списком значений» в пользовательском режиме может не изменить его тип с «общего» на обычный, что является распространенной проблемой.

Решение 1: Программное изменение типа дополнительного реквизита

Чтобы получить возможность управлять видимостью дополнительного реквизита, нам необходимо программно изменить его тип с «общего» на реквизит, привязанный к конкретному виду номенклатуры. Это можно сделать, исключив реквизит из набора общих реквизитов и включив его в набор желаемого вида номенклатуры.

Рассмотрим пошаговый алгоритм и пример кода для выполнения этой операции:

  1. Подготовка:

    Для программного изменения вам потребуется консоль кода (например, «Универсальная обработка объектов» или «Консоль запросов» с возможностью выполнения кода) или расширение конфигурации.

    Нам понадобятся ссылки на два объекта:

    • НаборДопРеквизитов: Ссылка на элемент справочника НаборыДополнительныхРеквизитовИСведений. Это может быть набор для «общих» реквизитов или набор для конкретного вида номенклатуры.
    • ДопРеквизит: Ссылка на элемент плана видов характеристик ДополнительныеРеквизитыИСведения, который является нашим целевым дополнительным реквизитом.

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

    • Реквизит формы: НаборОбщихРеквизитов, тип СправочникСсылка.НаборыДополнительныхРеквизитовИСведений (для набора «общих» реквизитов).
    • Реквизит формы: НаборВидаНоменклатуры, тип СправочникСсылка.НаборыДополнительныхРеквизитовИСведений (для набора конкретного вида номенклатуры, к которому вы хотите привязать реквизит).
    • Реквизит формы: ЦелевойДопРеквизит, тип ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения (ваш доп. реквизит).
  2. Исключение из набора общих реквизитов:

    Сначала мы должны убрать наш дополнительный реквизит из набора «общих» реквизитов. Это позволит ему перестать быть «общим» и подготовит к привязке к конкретному виду.

    
    // Получаем объект набора общих реквизитов
    НаборОбъект = ЭтаФорма.НаборОбщихРеквизитов.ПолучитьОбъект();
    
    // Ищем наш целевой дополнительный реквизит в списке реквизитов набора
    СтрокаСвойства = НаборОбъект.ДополнительныеРеквизиты.Найти(ЭтаФорма.ЦелевойДопРеквизит, "Свойство");
    
    // Если реквизит найден, удаляем его
    Если СтрокаСвойства <> Неопределено Тогда
        НаборОбъект.ДополнительныеРеквизиты.Удалить(СтрокаСвойства);
        // Корректируем количество реквизитов в наборе (важно для поддержания целостности данных)
        НаборОбъект.КоличествоРеквизитов = НаборОбъект.КоличествоРеквизитов - 1;
        НаборОбъект.Записать();
        Сообщить("Дополнительный реквизит '" + ЭтаФорма.ЦелевойДопРеквизит.Наименование + "' успешно исключен из набора общих реквизитов.");
    Иначе
        Сообщить("Дополнительный реквизит '" + ЭтаФорма.ЦелевойДопРеквизит.Наименование + "' не найден в наборе общих реквизитов, возможно он уже не общий.");
    КонецЕсли;
    

    Важный момент: убедитесь, что вы выбрали правильный элемент справочника НаборыДополнительныхРеквизитовИСведений, который соответствует «общим» реквизитам. Как правило, он имеет наименование вроде «Справочник Номенклатура (общее)».

  3. Включение в набор конкретного вида номенклатуры:

    Теперь, когда реквизит не является «общим», мы можем добавить его в набор, соответствующий конкретному виду номенклатуры, для которого вы хотите настроить его видимость.

    
    // Получаем объект набора конкретного вида номенклатуры
    НаборОбъект = ЭтаФорма.НаборВидаНоменклатуры.ПолучитьОбъект();
    
    // Ищем наш целевой дополнительный реквизит в списке реквизитов набора
    СтрокаСвойства = НаборОбъект.ДополнительныеРеквизиты.Найти(ЭтаФорма.ЦелевойДопРеквизит, "Свойство");
    
    // Если реквизит не найден, добавляем его
    Если СтрокаСвойства = Неопределено Тогда
        СтрокаСвойства = НаборОбъект.ДополнительныеРеквизиты.Добавить();
        СтрокаСвойства.Свойство = ЭтаФорма.ЦелевойДопРеквизит;
        // Корректируем количество реквизитов в наборе
        НаборОбъект.КоличествоРеквизитов = НаборОбъект.КоличествоРеквизитов + 1;
        НаборОбъект.Записать();
        Сообщить("Дополнительный реквизит '" + ЭтаФорма.ЦелевойДопРеквизит.Наименование + "' успешно включен в набор вида номенклатуры '" + ЭтаФорма.НаборВидаНоменклатуры.Наименование + "'.");
    Иначе
        Сообщить("Дополнительный реквизит '" + ЭтаФорма.ЦелевойДопРеквизит.Наименование + "' уже присутствует в наборе вида номенклатуры '" + ЭтаФорма.НаборВидаНоменклатуры.Наименование + "'.");
    КонецЕсли;
    

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

Возможные ошибки при изменении типа реквизита

При попытке перевода дополнительного реквизита из «общего» в «привязанный к виду» вы можете столкнуться с ошибкой, аналогичной следующей:


{ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.МодульМенеджера(153)}: Ошибка при изменении настройки свойства Ручнаядоставка. Набор свойств не связан ни с одним владельцем значений свойств.

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

Решение 2: Динамическое управление видимостью на форме через расширение

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

Для этого нам потребуется использовать расширение конфигурации и программный код. Мы будем работать с элементами формы, которые соответствуют нашим дополнительным реквизитам.

  1. Создание расширения и добавление формы:

    Создайте новое расширение конфигурации. Добавьте в расширение форму того объекта (например, справочника «Номенклатура»), на которой расположены ваши дополнительные реквизиты. Если реквизиты отображаются на стандартной форме объекта, вам нужно будет создать форму объекта в расширении и перетащить на неё необходимые элементы.

  2. Доступ к элементам формы:

    В управляемых формах 1С элементы, соответствующие дополнительным реквизитам, доступны через коллекцию Элементы формы. Их имена обычно формируются по шаблону _ДополнительныйРеквизит_<ИмяРеквизита> или аналогично.

    Чтобы найти нужный элемент формы, вы можете использовать отладчик или проанализировать структуру элементов формы в конфигураторе.

  3. Управление видимостью:

    Рассмотрим сценарий, когда у нас есть булевый дополнительный реквизит «ИспользоватьОсобыеУсловия», и мы хотим, чтобы другой дополнительный реквизит «ОсобыеУсловияТекстом» был виден только тогда, когда флажок «ИспользоватьОсобыеУсловия» установлен.

    Для этого мы можем использовать обработчик события «При изменении» для поля ввода булевого реквизита, а также установить начальное состояние видимости в событии «ПриСозданииНаСервере».

    
    // В событии формы ПриСозданииНаСервере
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // Инициализация видимости зависимого реквизита при открытии формы
        // Объект.ДополнительныеРеквизиты.<ИмяБулевогоРеквизита>
        // Например, если булевый реквизит называется "ИспользоватьОсобыеУсловия"
        // и зависимый реквизит "ОсобыеУсловияТекстом"
        ОпределитьВидимостьЗависимогоРеквизита(Объект.ДополнительныеРеквизиты.ИспользоватьОсобыеУсловия);
    КонецПроцедуры
    
    // Обработчик события ПриИзменении для поля ввода булевого дополнительного реквизита
    // Этот обработчик нужно создать для элемента формы, связанного с булевым реквизитом
    &НаКлиенте
    Процедура ИспользоватьОсобыеУсловияПриИзменении(Элемент)
        ОпределитьВидимостьЗависимогоРеквизита(Элемент.Значение);
    КонецПроцедуры
    
    // Общая процедура для определения видимости
    &НаКлиенте
    Процедура ОпределитьВидимостьЗависимогоРеквизита(ЗначениеБулевогоРеквизита)
        // Имя элемента формы, соответствующего зависимому реквизиту
        // Например, если имя элемента формы '_ДополнительныйРеквизит_ОсобыеУсловияТекстом'
        Если Элементы.Есть('_ДополнительныйРеквизит_ОсобыеУсловияТекстом') Тогда
            Элементы._ДополнительныйРеквизит_ОсобыеУсловияТекстом.Видимость = ЗначениеБулевогоРеквизита;
            // Также можно управлять доступностью
            // Элементы._ДополнительныйРеквизит_ОсобыеУсловияТекстом.Доступность = ЗначениеБулевогоРеквизита;
        КонецЕсли;
    КонецПроцедуры
    

    Важно: для корректной работы этого механизма убедитесь, что имя элемента формы, к которому вы обращаетесь (например, _ДополнительныйРеквизит_ОсобыеУсловияТекстом), точно соответствует имени, которое присваивает система для вашего дополнительного реквизита на форме. Эти имена можно увидеть в отладчике или в палитре свойств элемента формы в конфигураторе.

Обходной путь: Создание новых реквизитов и перенос данных

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

  1. Создайте новые дополнительные реквизиты:

    Создайте новые дополнительные реквизиты с необходимыми настройками видимости и доступности, сразу привязав их к нужному виду номенклатуры (не делая их «общими»). Убедитесь, что для булевых реквизитов настройки видимости и доступности доступны и сконфигурированы так, как вам нужно.

  2. Перенесите данные:

    Используйте «Групповую обработку объектов» или специализированную обработку для переноса данных из старых «общих» дополнительных реквизитов в новые. Это позволит сохранить все накопленные данные.

  3. Удалите старые реквизиты:

    После успешного переноса данных старые «общие» дополнительные реквизиты можно будет удалить.

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

Заключение

Настройка видимости дополнительных реквизитов в 1С:УТ 11.4, особенно для уже созданных «общих» реквизитов, требует понимания внутренних механизмов платформы. Мы рассмотрели, что ключом к управлению видимостью является привязка реквизита к конкретному виду номенклатуры. Программное изменение типа реквизита из «общего» в привязанный к виду – это эффективный способ получить доступ к нужным настройкам. Далее, для динамического управления видимостью на форме, мы можем использовать расширения конфигурации и программный код на клиенте и сервере. В качестве альтернативы всегда остается возможность создать новые реквизиты с корректными настройками и перенести в них данные, если программные методы кажутся излишне сложными или вызывают трудности. Выбирайте подход, который наилучшим образом соответствует вашим знаниям и целям.

← На главную