В конфигурациях 1С:Предприятие понятие «основная организация» часто используется для идентификации головного юридического лица в многофирменных базах, определения дефолтных настроек или при интеграции с внешними системами. Однако встроенного универсального метода ПолучитьОсновнуюОрганизацию() не существует — разработчику приходится самостоятельно реализовывать логику поиска. Эта статья поможет разобраться, как программно получить основную организацию в разных сценариях, от простых до сложных.
Мы рассмотрим 5 рабочих подходов: от использования реквизитов справочника Организации до анализа регистров сведений и работы с БСП (Библиотека Стандартных Подсистем). Особое внимание уделим типичным ошибкам, например, когда в базе нет явной пометки о «главной» организации, или когда логика определения зависит от подчиненности или иерархии холдинга. Все примеры кода адаптированы для платформы 1С:Предприятие 8.3 (актуально для версий 8.3.20+).
1. Метод 1: Использование реквизита «Основная» в справочнике Организации
Самый очевидный способ — проверка флага Основная (или ЭтоОсновнаяОрганизация) в справочнике Организации. Этот реквизит часто добавляют в конфигурациях на базе БП 3.0, УТ 11 или КА 2.4, но его наличие зависит от доработок.
Пример кода для поиска:
Функция ПолучитьОсновнуюОрганизациюПоРеквизиту()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Организации.Ссылка КАК Организация
|ИЗ
| Справочник.Организации КАК Организации
|ГДЕ
| Организации.Основная = ИСТИНА";
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Возврат РезультатЗапроса.Выгрузить()[0].Организация;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
⚠️ Внимание: В стандартных конфигурациях 1С реквизит Основная отсутствует по умолчанию. Его необходимо добавить вручную или использовать альтернативные методы из этой статьи.
- ✅ Плюсы: Простота и скорость выполнения.
- ❌ Минусы: Требует доработки конфигурации, не работает в типовой базе.
- 🔧 Когда использовать: Если вы контролируете структуру справочника и можете добавить реквизит.
2. Метод 2: Анализ регистра сведений «Организации» (для БП 3.0 и УТ 11)
В типовых конфигурациях 1С:Бухгалтерия 3.0 и 1С:Управление Торговлей 11 есть регистр сведений Организации, где хранится информация о головной организации холдинга. Это более надежный способ, чем поиск по реквизитам.
Пример запроса к регистру:
Функция ПолучитьГоловнуюОрганизациюИзРегистра()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Организации.Организация КАК Организация
|ИЗ
| РегистрСведений.Организации КАК Организации
|ГДЕ
| Организации.ГоловнаяОрганизация = ИСТИНА
| И Организации.Период = &МаксимальнаяДата";
Запрос.УстановитьПараметр("МаксимальнаяДата", ТекущаяДата());
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Возврат РезультатЗапроса.Выгрузить()[0].Организация;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
| Конфигурация | Регистр сведений | Реквизит для фильтра |
|---|---|---|
| БП 3.0 | Организации |
ГоловнаяОрганизация |
| УТ 11 | Организации |
ЭтоГоловнаяОрганизация |
| КА 2.4 | СведенияОбОрганизациях |
Основная |
В конфигурациях на базе БСП 3.1+ логика может отличаться: головная организация определяется через подсистему «Управление холдингом». В этом случае используйте метод 4 из этой статьи.
3. Метод 3: Поиск по иерархии подчинения (для холдингов)
Если в базе ведется учет по нескольким организациям с иерархией (например, головной офис + филиалы), основную организацию можно определить как верхний уровень иерархии. Для этого анализируем поле Родитель в справочнике Организации.
Алгоритм:
- Находим все организации, у которых
Родитель = NULL(нет вышестоящей организации). - Если таких несколько — берем первую или применяем дополнительные фильтры (например, по коду или наименованию).
Функция ПолучитьВерхнююОрганизациюПоИерархии()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Организации.Ссылка КАК Организация
|ИЗ
| Справочник.Организации КАК Организации
|ГДЕ
| ЗНАЧЕНИЕЗАПОЛНЕНО(Организации.Родитель) = ЛОЖЬ
|УПОРЯДОЧИТЬ ПО
| Организации.Код";
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Возврат РезультатЗапроса.Выгрузить()[0].Организация;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
⚠️ Внимание: В некоторых конфигурациях полеРодительможет называтьсяГоловнаяОрганизацияилиВышестоящаяОрганизация. Проверьте структуру справочника вКонфигураторе(разделОбъекты → Справочники → Организации → Реквизиты).
Убедиться, что в справочнике есть реквизит "Родитель"|Проверить, что иерархия заполнена корректно|Учесть возможность нескольких "верхних" организаций|Тестировать на копии базы, если логика критична-->
4. Метод 4: Использование Библиотеки Стандартных Подсистем (БСП)
В конфигурациях с БСП 2.4+ (например, 1С:ERP, 1С:УХ) для работы с организациями предназначена подсистема Организации. Она предоставляет готовые функции, в том числе для определения головной организации холдинга.
Пример кода с использованием БСП:
Функция ПолучитьГоловнуюОрганизациюЧерезБСП()
ПодсистемаОрганизации = Подсистемы.Организации;
// Получаем список всех организаций
Организации = ПодсистемаОрганизации.ПолучитьСписокОрганизаций();
// Фильтруем по признаку головной
ГоловныеОрганизации = ПодсистемаОрганизации.ПолучитьГоловныеОрганизации(Организации);
Если ГоловныеОрганизации.Количество() > 0 Тогда
Возврат ГоловныеОрганизации[0];
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Если в вашей конфигурации БСП отключена или модифицирована, проверьте наличие следующих объектов:
- 📁 Подсистема
Организациив дереве конфигурации. - 🔧 Общий модуль
ОрганизацииКлиентСерверилиОрганизацииПереопределяемый. - 📊 Регистр сведений
СведенияОбОрганизацияхс реквизитомЭтоГоловная.
Что делать, если БСП отсутствует?
Если в вашей конфигурации нет Библиотеки Стандартных Подсистем, используйте альтернативные методы из этой статьи (например, анализ регистра сведений или иерархии). Для добавления БСП потребуется обновить конфигурацию до версии, поддерживающей подсистему (например, перейти с УТ 10.3 на УТ 11).
5. Метод 5: Определение по умолчанию (первая организация в списке)
Если в базе нет явной пометки о главной организации, но требуется возвращать какую-либо организацию по умолчанию (например, для интеграций), можно использовать первый элемент справочника. Этот метод подходит для простых баз с одной организацией или когда порядок важен.
Примеры реализации:
// Вариант 1: Первая организация по коду
Функция ПолучитьПервуюОрганизациюПоКоду()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Организации.Ссылка КАК Организация
|ИЗ
| Справочник.Организации КАК Организации
|УПОРЯДОЧИТЬ ПО
| Организации.Код";
Возврат Запрос.Выполнить().Выгрузить()[0].Организация;
КонецФункции
// Вариант 2: Организация с минимальным кодом (для стабильности)
Функция ПолучитьОрганизациюСМинимальнымКодом()
Организации = Справочники.Организации.Выбрать();
МинимальныйКод = Неопределено;
Результат = Неопределено;
Пока Организации.Следующий() Цикл
Если МинимальныйКод = Неопределено ИЛИ Организации.Код < МинимальныйКод Тогда
МинимальныйКод = Организации.Код;
Результат = Организации.Ссылка;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
⚠️ Внимание: Этот метод не гарантирует корректность с бизнес-логикой! Например, если в базе есть тестовые организации с кодом001, они могут оказаться «первыми». Всегда добавляйте дополнительные проверки (например, фильтр поПометкаУдаления = ЛОЖЬ).
Для стабильности кэшируйте результат первой организации в общем модуле с периодом актуальности 1 день. Это сократит количество обращений к базе при частых вызовах функции.
6. Типичные ошибки и как их избежать
При программном получении основной организации разработчики часто сталкиваются с следующими проблемами:
- Ошибка «Неопределено» при отсутствии организаций:
Всегда проверяйте результат функции на
НеопределеноилиNULL. Например:Организация = ПолучитьОсновнуюОрганизацию();Если Организация = Неопределено Тогда
Сообщить("В базе нет организаций или не задана основная!");
Возврат;
КонецЕсли;
- Конфликт версий БСП:
В конфигурациях с кастомизированной БСП стандартные методы могут не работать. Проверяйте наличие модулей через
МетодыОбъекта():Если НЕ ЗначениеЗаполнено(Подсистемы.Организации) Тогда// Используем альтернативный метод
КонецЕсли;
- Неучет прав доступа:
При работе с регистрами сведений (метод 2) убедитесь, что у пользователя есть права на чтение. Иначе запрос вернет пустой результат.
Частая ошибка — предположение, что «основная организация всегда есть». В реальности:
- 🏢 В новой базе может не быть ни одной организации.
- 🔄 В холдинге может быть несколько головных организаций (например, по разным направлениям бизнеса).
- 🔒 Организация может быть помечена на удаление (
ПометкаУдаления = ИСТИНА).
Всегда реализуйте резервный механизм на случай отсутствия основной организации (например, возврат первой активной или генерация исключения с понятным сообщением).
FAQ: Частые вопросы по работе с организациями в 1С
Как узнать, есть ли в моей конфигурации реквизит «Основная» в справочнике Организации?
Откройте конфигуратор (Файл → Открыть конфигурацию), перейдите в Объекты → Справочники → Организации → Реквизиты. Если реквизита нет, его можно добавить вручную или использовать альтернативные методы из этой статьи.
Можно ли получить основную организацию через HTTP-сервисы или REST API?
Да, если в конфигурации опубликован WS-сервис или HTTP-сервис с соответствующим методом. Пример вызова:
// Пример для OData (1С:Предприятие 8.3.20+)
Адрес = "http://server/odata/standard.odata/Organization?$filter=IsMain eq true";
Запрос = Новый HTTPЗапрос(Адрес);
Ответ = Новый HTTPСоединение().Получить(Запрос);
Данные = JSON.Прочитать(Ответ.ПолучитьТекст());
Для этого требуется настройка Публикация на веб-сервере в конфигураторе.
Что делать, если в базе несколько организаций с флагом «Основная»?
Это ошибка данных. Решения:
- Добавить в запрос сортировку по
КодилиНаименованиеи брать первую запись. - Исправить данные вручную через
Справочники → Организации. - Реализовать логику выбора (например, приоритет по дате создания).
Как получить основную организацию в 1С:ЗУП 3.1?
В Зарплате и Управлении Персоналом основная организация определяется через регистр сведений Организации с отбором по реквизиту ОсновнаяОрганизация. Используйте метод 2 из этой статьи, заменив имя регистра на РегистрСведений.ОрганизацииЗУП.
Можно ли определить основную организацию по ИНН?
Да, если вы знаете ИНН головной организации. Пример запроса:
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Организации.Ссылка КАК Организация
|ИЗ
| Справочник.Организации КАК Организации
|ГДЕ
| Организации.ИНН = &ИНН";
Но этот метод не универсален — он работает только если ИНН заранее известен.