Как получить название организации из справочника "Организации" в 1С без использования запроса?

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

При работе в 1С часто возникает необходимость получить данные об организации, например, ее наименование, для вывода в отчетах, документах или программном коде. Иногда стоит задача сделать это без использования явных запросов к базе данных, полагаясь на встроенные методы менеджеров справочников. Давайте рассмотрим подробнее, какие существуют подходы к решению этой задачи, проанализируем их преимущества, недостатки и особенности использования.

Для того чтобы получить название организации без явного конструирования запросов, мы можем воспользоваться несколькими методами, предоставляемыми платформой 1С. Каждый из них имеет свою область применения и нюансы, которые важно учитывать.

Метод 1: Получение названия основной организации по умолчанию

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

Как работает этот метод?

В платформе 1С существует специальное свойство менеджера справочника "Организации", которое позволяет получить ссылку на организацию, помеченную пользователем как основная. Для этого используется свойство ОрганизацияПоУмолчанию.

Рассмотрим пример кода:


// Пример получения полного наименования основной организации
ПолноеНаименованиеОсновнойОрганизации = Справочники.Организации.ОрганизацияПоУмолчанию.НаименованиеПолное;
Сообщить("Полное наименование основной организации: " + ПолноеНаименованиеОсновнойОрганизации);

// Или краткое наименование
КраткоеНаименованиеОсновнойОрганизации = Справочники.Организации.ОрганизацияПоУмолчанию.Наименование;
Сообщить("Краткое наименование основной организации: " + КраткоеНаименованиеОсновнойОрганизации);

Важные моменты:

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

Этот способ удобен и лаконичен, если в вашей конфигурации предусмотрен механизм "основной организации" и вы работаете именно с ней.

Метод 2: Поиск организации по коду с помощью НайтиПоКоду()

Если каждая организация в вашем справочнике имеет уникальный код, вы можете использовать метод НайтиПоКоду() менеджера справочника. Этот метод позволяет получить ссылку на элемент справочника, зная его уникальный код.

Как работает этот метод?

Метод НайтиПоКоду(<ЗначениеКода>) принимает строковое значение кода и возвращает ссылку на элемент справочника, если такой элемент найден. Если элемент не найден или коды не используются, поведение метода может отличаться.

Разберем пример кода:


// Предположим, мы знаем код организации "000000001"
КодОрганизацииДляПоиска = "000000001";

// Пытаемся найти организацию по коду
СсылкаНаОрганизацию = Справочники.Организации.НайтиПоКоду(КодОрганизацииДляПоиска);

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

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

  1. Длина кода: Критически важно проверить, используется ли вообще кодировка для справочника "Организации" в вашей конфигурации. Если в конфигураторе для справочника "Организации" установлена длина кода, равная 0 (т.е., коды не используются), то метод НайтиПоКоду() вернет Неопределено. В этом случае попытка обратиться к свойству Наименование от Неопределено приведет к ошибке выполнения.
  2. Пустая ссылка vs Неопределено:
    • Если коды используются (длина кода > 0), но элемент с указанным кодом не найден, метод НайтиПоКоду() вернет ПустаяСсылка. Это означает, что ссылка на объект существует, но она не указывает на конкретный элемент в базе данных.
    • Если коды не используются (длина кода = 0), метод НайтиПоКоду() вернет Неопределено.
    Поэтому крайне важно всегда проверять результат выполнения НайтиПоКоду(), как показано в примере выше, чтобы избежать ошибок.
  3. Уникальность кода: Этот метод надежен только в том случае, если коды организаций строго уникальны и постоянны. Если коды могут дублироваться или меняться, этот способ может быть ненадежным.

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

Метод 3: Поиск организации по реквизиту с помощью НайтиПоРеквизиту()

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

Почему ИНН?

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

Как работает этот метод?

Метод НайтиПоРеквизиту(<ИмяРеквизита>, <ЗначениеРеквизита>) принимает два параметра: строковое имя реквизита (например, "ИНН") и значение, которое мы ищем. Он возвращает ссылку на первый найденный элемент справочника, соответствующий условию.

Рассмотрим пример кода:


// Предположим, мы знаем ИНН организации "0123456789"
ИННДляПоиска = "0123456789";

// Пытаемся найти организацию по ИНН
СсылкаНаОрганизацию = Справочники.Организации.НайтиПоРеквизиту("ИНН", ИННДляПоиска);

// Обязательно проверяем результат поиска
Если ТипЗнч(СсылкаНаОрганизацию) = Тип("СправочникСсылка.Организации") Тогда
    // Если найдена ссылка на организацию, получаем ее наименование
    НаименованиеОрганизации = СсылкаНаОрганизацию.Наименование;
    Сообщить("Найдена организация по ИНН " + ИННДляПоиска + ": " + НаименованиеОрганизации);
Иначе
    // Если элемент с таким ИНН не найден
    Сообщить("Организация с ИНН " + ИННДляПоиска + " не найдена.");
КонецЕсли;

Важные моменты:

  1. Надежность: Использование ИНН делает этот метод очень надежным, поскольку ИНН, как правило, не изменяется и является уникальным для каждой организации.
  2. Производительность: Для эффективной работы НайтиПоРеквизиту() желательно, чтобы для используемого реквизита (в нашем случае "ИНН") в конфигураторе был установлен признак "Индексировать" или "Ведущее" (что подразумевает индексацию). Это значительно ускоряет поиск по базе данных. Без индексации поиск может быть медленным для больших справочников.
  3. Точное соответствие: Для строковых реквизитов поиск осуществляется по точному совпадению значения. Убедитесь, что передаваемое значение точно соответствует значению в базе (без лишних пробелов, в нужном регистре, если это имеет значение для вашего реквизита).
  4. Первый найденный: Если существует несколько элементов с одинаковым значением реквизита (что не должно быть для ИНН, но может произойти с другими реквизитами), метод вернет ссылку только на один из них (как правило, на первый попавшийся).

Метод НайтиПоРеквизиту() по ИНН является одним из самых рекомендуемых способов получения ссылки на организацию без написания явных запросов.

Особенности работы на клиентской и серверной сторонах

При работе с объектами справочников в 1С всегда важно помнить о контексте выполнения кода — клиентский или серверный. Некоторые операции могут быть ограничены на клиентской стороне и требовать выполнения на сервере для получения актуальных данных из базы.

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

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

Менее оптимальный метод: Перебор всего справочника

Хотя в обсуждении форума иногда упоминается перебор всего справочника через метод Выбрать() в цикле, мы не рекомендуем использовать этот подход без крайней необходимости. Этот метод извлекает из базы данных все элементы справочника и затем позволяет нам в цикле перебрать их. Например:


// НЕ РЕКОМЕНДУЕТСЯ для больших справочников!
ВыборкаОрганизаций = Справочники.Организации.Выбрать();
Пока ВыборкаОрганизаций.Следующий() Цикл
    Если ВыборкаОрганизаций.ИНН = "0123456789" Тогда
        Сообщить("Найдена организация по ИНН: " + ВыборкаОрганизаций.Наименование);
        Прервать; // Выходим из цикла после нахождения
    КонецЕсли;
КонецЦикла;

Почему это неоптимально:

  1. Производительность: Для больших справочников метод Выбрать() может привести к значительному снижению производительности, поскольку он загружает (или, по крайней мере, инициализирует доступ к) большому объему данных, даже если нам нужен только один элемент.
  2. Нагрузка на сеть/сервер: Передача всего справочника по сети или его обработка на сервере может создать излишнюю нагрузку.

Мы должны использовать этот метод только в тех редких случаях, когда другие, более целевые методы поиска (такие как НайтиПоКоду() или НайтиПоРеквизиту()) по какой-то причине не применимы или нам действительно требуется обработать каждый элемент справочника, а не найти конкретный.

Заключение

Мы рассмотрели несколько эффективных способов получения названия организации из справочника "Организации" в 1С без написания явных запросов. Каждый метод имеет свои особенности:

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

← На главную