Как правильно привязать программную логику к элементам справочников и почему нельзя использовать поиск по наименованию

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

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

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

Проблема использования НайтиПоНаименованию

Рассмотрим типичную ошибку. Разработчик пишет код в процедуре ПриСозданииНаСервере, привязываясь к текстовому названию элемента справочника:


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

Проанализируем риски такого подхода:

  1. Человеческий фактор: Бухгалтер может переименовать элемент для удобства (например, добавить год или уточнение), и поиск вернет пустую ссылку.
  2. Производительность: Метод НайтиПоНаименованию выполняет поиск в базе данных перебором. Если справочник большой, это замедляет открытие формы.
  3. Чувствительность к символам: Разница между обычным пробелом и неразрывным пробелом визуально незаметна, но для кода это разные строки.

Рассмотрим более надежные способы решения этой задачи.

Решение 1: Использование констант

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

Порядок действий:

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

Теперь наш код будет выглядеть так:


// Платформа эффективно кэширует значения констант
НужныйВид = Константы.ВидДокументаДляЗагрузчикаПитание.Получить();

Если Объект.ВидДокумента = НужныйВид Тогда
    // Логика подключения загрузчика
КонецЕсли;

Даже если пользователь изменит наименование справочника ВидыДокументовВводДанныхДляРасчетаЗарплаты, его Ссылка останется прежней, и константа будет возвращать верный объект.

Решение 2: Проверка по уникальному идентификатору (GUID)

Если создание новых объектов метаданных (констант) нежелательно, можно использовать Уникальный идентификатор элемента. Каждый объект в 1С имеет свой неизменный UUID.

Проанализируем, как это реализовать:

  1. Сначала нам нужно узнать GUID нужного элемента (через консоль запросов или специальную обработку). Допустим, он равен "550e8400-e29b-41d4-a716-446655440000".
  2. В коде мы получаем ссылку по этому идентификатору.

Идентификатор = Новый УникальныйИдентификатор("550e8400-e29b-41d4-a716-446655440000");
СсылкаНаЭлемент = Справочники.ВидыДокументовВводДанныхДляРасчетаЗарплаты.ПолучитьСсылку(Идентификатор);

Если Объект.ВидДокумента = СсылкаНаЭлемент Тогда
    // Выполняем действия
КонецЕсли;

Важный нюанс: Этот метод надежнее поиска по имени, но все равно считается «жестким кодом» (hardcode). Если база данных будет перенесена путем выгрузки/загрузки данных (а не через файл .dt), идентификаторы могут измениться в редких случаях, хотя обычно они сохраняются.

Решение 3: Предопределенные элементы

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

Вы добавляете в справочник ПоказателиРасчетаЗарплаты элемент на уровне метаданных. Тогда в коде вы сможете обращаться к нему напрямую через точку:


Если Объект.Показатель = Справочники.ПоказателиРасчетаЗарплаты.Обеды Тогда
    // Логика загрузчика
КонецЕсли;

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

Решение 4: Регистр сведений для гибкой настройки

Выясним, что делать, если элементов, для которых нужен «Загрузчик», станет не два, а десять. Создавать десять констант — не лучшее решение. В этом случае создадим РегистрСведений.НастройкиЗагрузчика с одним измерением ОбъектНастройки (тип ЛюбаяСсылка).

Разберем преимущество этого метода:

  1. Пользователь может сам добавлять любые элементы (виды документов, показатели) в этот список в режиме «1С:Предприятие».
  2. Проверка в коде выполняется через простой запрос или поиск в регистре.

// Проверяем наличие текущего вида документа в списке разрешенных
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |   НастройкиЗагрузчика.ОбъектНастройки
    |ИЗ
    |   РегистрСведений.НастройкиЗагрузчика КАК НастройкиЗагрузчика
    |ГДЕ
    |   НастройкиЗагрузчика.ОбъектНастройки = &ТекущийОбъект";

Запрос.УстановитьПараметр("ТекущийОбъект", Объект.ВидДокумента);
Результат = Запрос.Выполнить();

Если Не Результат.Пустой() Тогда
    ДобавитьЭлементыДляЗагрузчика();
КонецЕсли;

Рекомендации по оптимизации

Чтобы интерфейс работал быстро, проанализируем, где именно выполнять проверку. Лучше всего это делать ПриСозданииНаСервере. Если вы используете константы, платформа кэширует их значения, поэтому повторное обращение к Константы.Имя.Получить() не вызывает лишних обращений к СУБД в рамках одного сеанса.

Если же вы используете Функциональные опции, вы можете привязать видимость элементов формы напрямую к значению константы (типа Булево). Это позволит платформе автоматически скрывать или показывать группу «Загрузчик» без написания программного кода на каждой форме.

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

← На главную