Как правильно достать реквизиты справочника из основной конфигурации в расширение и избежать ошибок

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

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

Разбор типичной ошибки: Менеджер справочника vs Ссылка на объект

Проанализируем ситуацию, описанную в теме. Автор пытается получить номер счета следующей строкой:

НомерСчета = Справочники.БанковскиеСчета.НомерСчета;

Выясним причину, почему этот код не будет работать. В системе 1С объект Справочники.БанковскиеСчета является менеджером справочника. Менеджер нужен для создания новых элементов, поиска или работы с предопределенными данными. У менеджера нет и не может быть реквизита НомерСчета, так как этот реквизит принадлежит конкретному элементу (ссылке) или объекту справочника, а не всей таблице в целом.

Рассмотрим разницу на примере кода из сообщения:

  1. Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации — это обращение к предопределенному элементу. Система находит конкретную ссылку в базе.
  2. Справочники.БанковскиеСчета.НомерСчета — это попытка достать значение из «чертежа» справочника, не указывая, о каком именно счете идет речь.

Чтобы получить значение реквизита, нам всегда нужна конкретная Ссылка на элемент справочника.

Как работать с реквизитами в расширении: два подхода

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

Способ 1: Добавление реквизита в расширение (Заимствование)

Если мы добавим (заимствуем) справочник БанковскиеСчета и его реквизит НомерСчета в наше расширение, то:

Способ 2: Работа без заимствования (Динамическое обращение)

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

Однако помните: Конструктор запроса в расширении не позволит вам выбрать поле, которого нет в структуре расширения. Вам придется писать текст запроса вручную или временно добавлять объекты для использования конструктора, а потом удалять их (что не рекомендуется).

Исправление логики запроса к банковским счетам

Посмотрим на структуру данных. Справочник БанковскиеСчета обычно является подчиненным справочнику Организации (или Контрагенты). Это означает, что связь между ними идет через реквизит Владелец.

Проанализируем некорректный фрагмент кода:


Запрос.Текст = "ВЫБРАТЬ ... ИЗ Справочник.БанковскиеСчета КАК КИ ГДЕ КИ.Ссылка = &Организация";

Здесь кроется логическая ошибка: Ссылка банковского счета никогда не будет равна Ссылке организации. Это разные типы данных. Чтобы найти счета конкретной организации, нужно использовать условие по владельцу. Также, как правило, у организации есть реквизит ОсновнойБанковскийСчет.

Рассмотрим правильный вариант получения номера основного счета организации:


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

Использование типовых механизмов БП 3.0 (Профессиональный подход)

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

1. Получение данных организации для печати

В БП 3.0 существует общий модуль ОбщегоНазначенияБП, содержащий функцию ДанныеПечатиОрганизаций. Она возвращает структуру, в которой уже есть всё: ИНН, КПП, ОГРН, Адреса и Телефоны, а также реквизиты банка.

Пример использования:


СписокОрганизаций = Новый Массив;
СписокОрганизаций.Добавить(ПараметрОрганизация);
ДанныеОрганизации = ОбщегоНазначенияБП.ДанныеПечатиОрганизаций(СписокОрганизаций);

// Теперь в структуре ДанныеОрганизации[ПараметрОрганизация] есть все поля
Если ДанныеОрганизации.Количество() > 0 Тогда
    Сведения = ДанныеОрганизации[ПараметрОрганизация];
    НомерСчета = Сведения.НомерСчета;
    ЮридическийАдрес = Сведения.ЮридическийАдрес;
КонецЕсли;

2. Работа с контактной информацией

Для получения адресов (Юридического, Фактического) лучше использовать модуль УправлениеКонтактнойИнформации. Это гарантирует, что вы получите актуальный адрес с учетом истории изменений (если она ведется).


ВидАдреса = Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации;
ПредставлениеАдреса = УправлениеКонтактнойИнформации.МенеджерКонтактнойИнформации.ПечатноеПредставлениеАдреса(Организация, ВидАдреса);

Советы по отладке в расширении

Проанализируем ситуацию: вы написали код, но он выдает ошибку, что поле не найдено. Как проверить, видит ли система данные в режиме реального времени?

  1. Запустите программу в режиме отладки.
  2. Установите точку останова в вашем коде расширения.
  3. Когда выполнение остановится, воспользуйтесь окном «Вычислить выражение» (Shift+F9).
  4. Попробуйте написать Организация.ОсновнойБанковскийСчет.НомерСчета. Если отладчик покажет значение, значит, проблема не в доступе к данным, а в синтаксисе вашего запроса или кода.

Важный нюанс: Если вы используете в тексте запроса конструкцию Справочник.Организации.КонтактнаяИнформация, убедитесь, что в расширение добавлен не только справочник, но и его табличная часть КонтактнаяИнформация со всеми нужными реквизитами. Без этого запрос может не сработать в контексте расширения.

Резюме

Для успешного извлечения реквизитов из основной конфигурации в расширение придерживайтесь следующих правил:

← На главную