В практике разработки на платформе 1С:Предприятие часто возникает задача: активировать определенный функционал (например, кнопку «Загрузчик» или дополнительную панель) только для конкретных видов документов или показателей. Начинающие разработчики часто используют метод НайтиПоНаименованию, что ведет к хрупкости системы. Стоит пользователю добавить лишний пробел или исправить «удержание» на «начисление», как программный код перестает работать.
В этой статье мы подробно разберем, как уйти от поиска по строке и реализовать надежную проверку через Константы, GUID и Предопределенные элементы, чтобы ваш интерфейс оставался стабильным при любых действиях пользователя.
Рассмотрим типичную ошибку. Разработчик пишет код в процедуре ПриСозданииНаСервере, привязываясь к текстовому названию элемента справочника:
Если ВидДокумента = Справочники.ВидыДокументовВводДанныхДляРасчетаЗарплаты.НайтиПоНаименованию("Ввод удержаний за питание") Тогда
ДобавитьЭлементыДляЗагрузчика();
КонецЕсли;
Проанализируем риски такого подхода:
НайтиПоНаименованию выполняет поиск в базе данных перебором. Если справочник большой, это замедляет открытие формы.Рассмотрим более надежные способы решения этой задачи.
Если по заданию требуется использовать именно константы, это правильный шаг в сторону гибкости. Вместо того чтобы «зашивать» названия в код, мы даем администратору возможность самому указать, для каких элементов должен работать функционал.
Порядок действий:
Константу в конфигураторе (например, ВидДокументаДляЗагрузчикаПитание).СправочникСсылка.ВидыДокументовВводДанныхДляРасчетаЗарплаты.Теперь наш код будет выглядеть так:
// Платформа эффективно кэширует значения констант
НужныйВид = Константы.ВидДокументаДляЗагрузчикаПитание.Получить();
Если Объект.ВидДокумента = НужныйВид Тогда
// Логика подключения загрузчика
КонецЕсли;
Даже если пользователь изменит наименование справочника ВидыДокументовВводДанныхДляРасчетаЗарплаты, его Ссылка останется прежней, и константа будет возвращать верный объект.
Если создание новых объектов метаданных (констант) нежелательно, можно использовать Уникальный идентификатор элемента. Каждый объект в 1С имеет свой неизменный UUID.
Проанализируем, как это реализовать:
GUID нужного элемента (через консоль запросов или специальную обработку). Допустим, он равен "550e8400-e29b-41d4-a716-446655440000".
Идентификатор = Новый УникальныйИдентификатор("550e8400-e29b-41d4-a716-446655440000");
СсылкаНаЭлемент = Справочники.ВидыДокументовВводДанныхДляРасчетаЗарплаты.ПолучитьСсылку(Идентификатор);
Если Объект.ВидДокумента = СсылкаНаЭлемент Тогда
// Выполняем действия
КонецЕсли;
Важный нюанс: Этот метод надежнее поиска по имени, но все равно считается «жестким кодом» (hardcode). Если база данных будет перенесена путем выгрузки/загрузки данных (а не через файл .dt), идентификаторы могут измениться в редких случаях, хотя обычно они сохраняются.
Если конфигурация доступна для доработки (не стоит на полной поддержке без возможности изменений), создание предопределенных элементов — самый профессиональный метод.
Вы добавляете в справочник ПоказателиРасчетаЗарплаты элемент на уровне метаданных. Тогда в коде вы сможете обращаться к нему напрямую через точку:
Если Объект.Показатель = Справочники.ПоказателиРасчетаЗарплаты.Обеды Тогда
// Логика загрузчика
КонецЕсли;
Это самый быстрый и безопасный способ, так как связь осуществляется на уровне идентификаторов объектов метаданных. Пользователь не сможет удалить такой элемент, а переименование никак не повлияет на работу алгоритма.
Выясним, что делать, если элементов, для которых нужен «Загрузчик», станет не два, а десять. Создавать десять констант — не лучшее решение. В этом случае создадим РегистрСведений.НастройкиЗагрузчика с одним измерением ОбъектНастройки (тип ЛюбаяСсылка).
Разберем преимущество этого метода:
// Проверяем наличие текущего вида документа в списке разрешенных
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| НастройкиЗагрузчика.ОбъектНастройки
|ИЗ
| РегистрСведений.НастройкиЗагрузчика КАК НастройкиЗагрузчика
|ГДЕ
| НастройкиЗагрузчика.ОбъектНастройки = &ТекущийОбъект";
Запрос.УстановитьПараметр("ТекущийОбъект", Объект.ВидДокумента);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
ДобавитьЭлементыДляЗагрузчика();
КонецЕсли;
Чтобы интерфейс работал быстро, проанализируем, где именно выполнять проверку. Лучше всего это делать ПриСозданииНаСервере. Если вы используете константы, платформа кэширует их значения, поэтому повторное обращение к Константы.Имя.Получить() не вызывает лишних обращений к СУБД в рамках одного сеанса.
Если же вы используете Функциональные опции, вы можете привязать видимость элементов формы напрямую к значению константы (типа Булево). Это позволит платформе автоматически скрывать или показывать группу «Загрузчик» без написания программного кода на каждой форме.
Подведем итог: для двух элементов проще всего использовать две или четыре константы с типом ссылок на соответствующие справочники. Это обеспечит стабильность кода и даст пользователю возможность самостоятельно управлять настройками без участия программиста.