Как создать и настроить предопределенные элементы в справочнике Номенклатура в 1С:УТ 11

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

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

Зачем нужны предопределенные элементы в Номенклатуре

Обычно справочник Номенклатура заполняется пользователями в процессе работы. Однако в специфических бизнес-процессах могут потребоваться фиксированные позиции (например, для автоматических услуг, корректировок или специфических затрат вроде «Цена на койку»), на которые завязана программная логика. Использование предопределенных данных позволяет программисту писать код вида Справочники.Номенклатура.ИмяЭлемента, не опасаясь, что пользователь изменит наименование или удалит объект.

Способ 1: Создание через Конфигуратор

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

  1. Откроем Конфигуратор и найдем справочник Номенклатура.
  2. Перейдем на вкладку Прочее.
  3. Нажмем кнопку Предопределенные.
  4. В открывшемся окне нажмем Добавить.
  5. Заполним поле Имя (это идентификатор для кода, например, УслугаПроживания) и Наименование (то, что увидит пользователь).

Важное замечание: У справочников в 1С есть свойство Обновление предопределенных данных. Разберем его значения:

Способ 2: Программное связывание существующего элемента

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


// Сначала найдем ссылку на существующий объект
СсылкаНаОбъект = Справочники.Номенклатура.НайтиПоНаименованию("Цена на койку");

// Получим объект для редактирования
ОбъектСправочника = СсылкаНаОбъект.ПолучитьОбъект();

// Укажем имя, которое мы предварительно создали в Конфигураторе
ОбъектСправочника.ИмяПредопределенныхДанных = "ЦенаНаКойку";

// Запишем объект
Попытка
    ОбъектСправочника.Записать();
    Сообщить("Элемент успешно связан с предопределенным именем.");
Исключение
    Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;

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

Проблема заполнения обязательных реквизитов в УТ 11

Справочник Номенклатура в УТ 11 — это сложный объект. В отличие от простых справочников, здесь недостаточно просто создать запись. Если создать предопределенный элемент только в Конфигураторе, многие его реквизиты (ВидНоменклатуры, ЕдиницаИзмерения, СтавкаНДС) останутся пустыми. Это приведет к критическим ошибкам при попытке выбрать такую номенклатуру в документах.

Выясним, как правильно дозаполнить реквизиты. Рекомендуется использовать следующий алгоритм:

  1. Создаем предопределенный элемент в Конфигураторе.
  2. В модуле обновления (или через внешнюю обработку) пишем код, который проверяет заполнение обязательных полей.

Рассмотрим пример дозаполнения:


НоменклатураОбъект = Справочники.Номенклатура.ЦенаНаКойку.ПолучитьОбъект();

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

Методика переноса данных и удаления дублей

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

Альтернативный подход: Использование настроек и констант

Опытные разработчики часто советуют избегать создания предопределенных элементов в справочнике Номенклатура, если это возможно. Почему? Предопределенные элементы сложно удалять, и они «засоряют» конфигурацию. Рассмотрим более гибкий вариант:

Вместо создания предопределенного элемента, создайте Константу или добавьте поле в Настройки программы с типом СправочникСсылка.Номенклатура.

Преимущества этого метода:

  1. Пользователь может сам выбрать в настройках любую удобную ему номенклатуру.
  2. Нет необходимости менять конфигурацию, если компания решит использовать другую позицию для тех же целей.
  3. В коде вы будете обращаться не к Справочники.Номенклатура.Имя, а к Константы.НужнаяНоменклатура.Получить().

Выбор между предопределенным элементом и константой зависит от жесткости требований к бизнес-логике. Если элемент является фундаментальной частью алгоритма, используйте предопределенные данные. Если это просто «значение по умолчанию» — используйте настройки.

← На главную