При работе в 1С часто возникает необходимость получить данные об организации, например, ее наименование, для вывода в отчетах, документах или программном коде. Иногда стоит задача сделать это без использования явных запросов к базе данных, полагаясь на встроенные методы менеджеров справочников. Давайте рассмотрим подробнее, какие существуют подходы к решению этой задачи, проанализируем их преимущества, недостатки и особенности использования.
Для того чтобы получить название организации без явного конструирования запросов, мы можем воспользоваться несколькими методами, предоставляемыми платформой 1С. Каждый из них имеет свою область применения и нюансы, которые важно учитывать.
Один из самых простых способов — это обратиться к организации, которая установлена в системе как основная. Этот подход идеально подходит, если в вашей информационной базе ведется учет преимущественно по одной организации, и она четко определена как "организация по умолчанию".
В платформе 1С существует специальное свойство менеджера справочника "Организации", которое позволяет получить ссылку на организацию, помеченную пользователем как основная. Для этого используется свойство ОрганизацияПоУмолчанию.
Рассмотрим пример кода:
// Пример получения полного наименования основной организации
ПолноеНаименованиеОсновнойОрганизации = Справочники.Организации.ОрганизацияПоУмолчанию.НаименованиеПолное;
Сообщить("Полное наименование основной организации: " + ПолноеНаименованиеОсновнойОрганизации);
// Или краткое наименование
КраткоеНаименованиеОсновнойОрганизации = Справочники.Организации.ОрганизацияПоУмолчанию.Наименование;
Сообщить("Краткое наименование основной организации: " + КраткоеНаименованиеОсновнойОрганизации);
Важные моменты:
ОрганизацияПоУмолчанию предназначен для получения только одной, основной организации. Если вам нужно работать с несколькими организациями, этот метод не подойдет.ОрганизацияПоУмолчанию на серверной стороне, скорее всего, все равно выполняет некий запрос к базе данных для определения, какая из организаций является основной. Однако с точки зрения нашего кода, это не является "явным использованием запроса".Этот способ удобен и лаконичен, если в вашей конфигурации предусмотрен механизм "основной организации" и вы работаете именно с ней.
Если каждая организация в вашем справочнике имеет уникальный код, вы можете использовать метод НайтиПоКоду() менеджера справочника. Этот метод позволяет получить ссылку на элемент справочника, зная его уникальный код.
Метод НайтиПоКоду(<ЗначениеКода>) принимает строковое значение кода и возвращает ссылку на элемент справочника, если такой элемент найден. Если элемент не найден или коды не используются, поведение метода может отличаться.
Разберем пример кода:
// Предположим, мы знаем код организации "000000001"
КодОрганизацииДляПоиска = "000000001";
// Пытаемся найти организацию по коду
СсылкаНаОрганизацию = Справочники.Организации.НайтиПоКоду(КодОрганизацииДляПоиска);
// Обязательно проверяем результат поиска
Если ТипЗнч(СсылкаНаОрганизацию) = Тип("СправочникСсылка.Организации") Тогда
// Если найдена ссылка на организацию, получаем ее наименование
НаименованиеОрганизации = СсылкаНаОрганизацию.Наименование;
Сообщить("Найдена организация с кодом " + КодОрганизацииДляПоиска + ": " + НаименованиеОрганизации);
ИначеЕсли СсылкаНаОрганизацию = Неопределено Тогда
// Это произойдет, если для справочника "Организации" установлена длина кода = 0
Сообщить("Ошибка: Коды для справочника 'Организации' не используются, метод НайтиПоКоду() вернул Неопределено.");
Иначе
// Это произойдет, если элемент с таким кодом не найден
Сообщить("Организация с кодом " + КодОрганизацииДляПоиска + " не найдена.");
КонецЕсли;
Важные моменты и возможные ошибки:
НайтиПоКоду() вернет Неопределено. В этом случае попытка обратиться к свойству Наименование от Неопределено приведет к ошибке выполнения.НайтиПоКоду() вернет ПустаяСсылка. Это означает, что ссылка на объект существует, но она не указывает на конкретный элемент в базе данных.НайтиПоКоду() вернет Неопределено.НайтиПоКоду(), как показано в примере выше, чтобы избежать ошибок.Если в вашей системе коды организаций строго контролируются и используются, этот метод является быстрым и эффективным.
Наиболее универсальным и надежным способом поиска организации без запросов, особенно если вы хотите избежать проблем с меняющимися наименованиями или отсутствующими кодами, является использование метода НайтиПоРеквизиту(). Этот метод позволяет найти ссылку на элемент справочника по значению любого его реквизита.
В большинстве случаев, когда говорят о надежном поиске организации, рекомендуют использовать ИНН (Идентификационный Номер Налогоплательщика). ИНН является уникальным и неизменным идентификатором для каждого юридического лица. Если ИНН организации меняется, это чаще всего означает, что речь идет уже о другой организации (или о реорганизации, требующей отдельных процедур), поэтому ИНН — это очень стабильный критерий для поиска.
Метод НайтиПоРеквизиту(<ИмяРеквизита>, <ЗначениеРеквизита>) принимает два параметра: строковое имя реквизита (например, "ИНН") и значение, которое мы ищем. Он возвращает ссылку на первый найденный элемент справочника, соответствующий условию.
Рассмотрим пример кода:
// Предположим, мы знаем ИНН организации "0123456789"
ИННДляПоиска = "0123456789";
// Пытаемся найти организацию по ИНН
СсылкаНаОрганизацию = Справочники.Организации.НайтиПоРеквизиту("ИНН", ИННДляПоиска);
// Обязательно проверяем результат поиска
Если ТипЗнч(СсылкаНаОрганизацию) = Тип("СправочникСсылка.Организации") Тогда
// Если найдена ссылка на организацию, получаем ее наименование
НаименованиеОрганизации = СсылкаНаОрганизацию.Наименование;
Сообщить("Найдена организация по ИНН " + ИННДляПоиска + ": " + НаименованиеОрганизации);
Иначе
// Если элемент с таким ИНН не найден
Сообщить("Организация с ИНН " + ИННДляПоиска + " не найдена.");
КонецЕсли;
Важные моменты:
НайтиПоРеквизиту() желательно, чтобы для используемого реквизита (в нашем случае "ИНН") в конфигураторе был установлен признак "Индексировать" или "Ведущее" (что подразумевает индексацию). Это значительно ускоряет поиск по базе данных. Без индексации поиск может быть медленным для больших справочников.Метод НайтиПоРеквизиту() по ИНН является одним из самых рекомендуемых способов получения ссылки на организацию без написания явных запросов.
При работе с объектами справочников в 1С всегда важно помнить о контексте выполнения кода — клиентский или серверный. Некоторые операции могут быть ограничены на клиентской стороне и требовать выполнения на сервере для получения актуальных данных из базы.
Например, прямой доступ к свойствам объекта справочника, таким как Наименование или ИНН, если у вас есть только ссылка на объект, может потребовать обращения к серверу для чтения этих данных из базы. Методы менеджера справочника, такие как НайтиПоКоду() и НайтиПоРеквизиту(), по своей сути обращаются к базе данных, поэтому они будут работать корректно и на сервере, и, в большинстве случаев, будут доступны и на клиенте (с возможностью неявного обращения к серверу).
Если вы работаете в клиентском модуле и пытаетесь получить данные, которые не кэшированы на клиенте или требуют обращения к базе, платформа 1С может автоматически выполнить серверный вызов. Однако лучшей практикой считается выполнение операций, связанных с чтением данных из базы, на сервере, чтобы избежать неявных вызовов и более тонко контролировать производительность.
Хотя в обсуждении форума иногда упоминается перебор всего справочника через метод Выбрать() в цикле, мы не рекомендуем использовать этот подход без крайней необходимости. Этот метод извлекает из базы данных все элементы справочника и затем позволяет нам в цикле перебрать их. Например:
// НЕ РЕКОМЕНДУЕТСЯ для больших справочников!
ВыборкаОрганизаций = Справочники.Организации.Выбрать();
Пока ВыборкаОрганизаций.Следующий() Цикл
Если ВыборкаОрганизаций.ИНН = "0123456789" Тогда
Сообщить("Найдена организация по ИНН: " + ВыборкаОрганизаций.Наименование);
Прервать; // Выходим из цикла после нахождения
КонецЕсли;
КонецЦикла;
Почему это неоптимально:
Выбрать() может привести к значительному снижению производительности, поскольку он загружает (или, по крайней мере, инициализирует доступ к) большому объему данных, даже если нам нужен только один элемент.Мы должны использовать этот метод только в тех редких случаях, когда другие, более целевые методы поиска (такие как НайтиПоКоду() или НайтиПоРеквизиту()) по какой-то причине не применимы или нам действительно требуется обработать каждый элемент справочника, а не найти конкретный.
Мы рассмотрели несколько эффективных способов получения названия организации из справочника "Организации" в 1С без написания явных запросов. Каждый метод имеет свои особенности:
Справочники.Организации.ОрганизацияПоУмолчанию.НаименованиеПолное прост и удобен для работы с единственной основной организацией.Справочники.Организации.НайтиПоКоду("КодОрганизации").Наименование эффективен, если коды строго уникальны и используются в справочнике. Не забывайте о проверке на Неопределено или ПустаяСсылка.Справочники.Организации.НайтиПоРеквизиту("ИНН", "0123456789").Наименование является наиболее надежным и предпочтительным, особенно когда важна стабильность идентификации организации независимо от изменения наименования.При выборе метода всегда учитывайте особенности вашей конфигурации, стабильность данных (кодов, наименований, ИНН) и контекст выполнения кода (клиент/сервер) для обеспечения максимальной производительности и надежности.