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