При разработке расширений для 1С:Предприятие 8.3 начинающие программисты часто сталкиваются с ситуацией, когда код, написанный в расширении, не видит реквизиты основной конфигурации. Это приводит к ошибкам вроде «Поле объекта не обнаружено» или трудностям при написании запросов. В данной статье мы подробно разберем, как правильно обращаться к данным основной конфигурации, почему нельзя обращаться к реквизитам через менеджер справочника и как использовать возможности типовых конфигураций (на примере БП 3.0) для эффективного решения задачи.
Проанализируем ситуацию, описанную в теме. Автор пытается получить номер счета следующей строкой:
НомерСчета = Справочники.БанковскиеСчета.НомерСчета;
Выясним причину, почему этот код не будет работать. В системе 1С объект Справочники.БанковскиеСчета является менеджером справочника. Менеджер нужен для создания новых элементов, поиска или работы с предопределенными данными. У менеджера нет и не может быть реквизита НомерСчета, так как этот реквизит принадлежит конкретному элементу (ссылке) или объекту справочника, а не всей таблице в целом.
Рассмотрим разницу на примере кода из сообщения:
Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации — это обращение к предопределенному элементу. Система находит конкретную ссылку в базе.Справочники.БанковскиеСчета.НомерСчета — это попытка достать значение из «чертежа» справочника, не указывая, о каком именно счете идет речь.Чтобы получить значение реквизита, нам всегда нужна конкретная Ссылка на элемент справочника.
Когда мы пишем код в расширении, у нас есть два пути взаимодействия с реквизитами основной конфигурации.
Способ 1: Добавление реквизита в расширение (Заимствование)
Если мы добавим (заимствуем) справочник БанковскиеСчета и его реквизит НомерСчета в наше расширение, то:
СсылкаНаСчет.НомерСчета проверка конфигурации не выдаст ошибок.Способ 2: Работа без заимствования (Динамическое обращение)
Если мы не хотим «раздувать» расширение лишними объектами, мы можем обращаться к реквизитам основной конфигурации, используя запросы. Платформа 1С устроена так, что в режиме «1С:Предприятие» запрос, написанный просто текстом (строкой), успешно найдет поля основной конфигурации, даже если их нет в расширении.
Однако помните: Конструктор запроса в расширении не позволит вам выбрать поле, которого нет в структуре расширения. Вам придется писать текст запроса вручную или временно добавлять объекты для использования конструктора, а потом удалять их (что не рекомендуется).
Посмотрим на структуру данных. Справочник БанковскиеСчета обычно является подчиненным справочнику Организации (или Контрагенты). Это означает, что связь между ними идет через реквизит Владелец.
Проанализируем некорректный фрагмент кода:
Запрос.Текст = "ВЫБРАТЬ ... ИЗ Справочник.БанковскиеСчета КАК КИ ГДЕ КИ.Ссылка = &Организация";
Здесь кроется логическая ошибка: Ссылка банковского счета никогда не будет равна Ссылке организации. Это разные типы данных. Чтобы найти счета конкретной организации, нужно использовать условие по владельцу. Также, как правило, у организации есть реквизит ОсновнойБанковскийСчет.
Рассмотрим правильный вариант получения номера основного счета организации:
Функция ПолучитьНомерОсновногоСчета(ОрганизацияСсылка)
// Проверяем, заполнена ли ссылка
Если ОрганизацияСсылка.Пустая() Тогда
Возврат "";
КонецЕсли;
// Обращаемся через реквизит организации (если он заимствован в расширение)
// Либо используем запрос для универсальности
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Организации.ОсновнойБанковскийСчет.НомерСчета КАК НомерСчета
|ИЗ
| Справочник.Организации КАК Организации
|ГДЕ
| Организации.Ссылка = &Организация";
Запрос.УстановитьПараметр("Организация", ОрганизацияСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.НомерСчета;
КонецЕсли;
Возврат "";
КонецФункции
Если вы работаете в конфигурации «Бухгалтерия предприятия 3.0», вам не нужно изобретать велосипед и писать сложные запросы к табличным частям контактной информации или банковским счетам. Разберем, как это делают профессионалы.
1. Получение данных организации для печати
В БП 3.0 существует общий модуль ОбщегоНазначенияБП, содержащий функцию ДанныеПечатиОрганизаций. Она возвращает структуру, в которой уже есть всё: ИНН, КПП, ОГРН, Адреса и Телефоны, а также реквизиты банка.
Пример использования:
СписокОрганизаций = Новый Массив;
СписокОрганизаций.Добавить(ПараметрОрганизация);
ДанныеОрганизации = ОбщегоНазначенияБП.ДанныеПечатиОрганизаций(СписокОрганизаций);
// Теперь в структуре ДанныеОрганизации[ПараметрОрганизация] есть все поля
Если ДанныеОрганизации.Количество() > 0 Тогда
Сведения = ДанныеОрганизации[ПараметрОрганизация];
НомерСчета = Сведения.НомерСчета;
ЮридическийАдрес = Сведения.ЮридическийАдрес;
КонецЕсли;
2. Работа с контактной информацией
Для получения адресов (Юридического, Фактического) лучше использовать модуль УправлениеКонтактнойИнформации. Это гарантирует, что вы получите актуальный адрес с учетом истории изменений (если она ведется).
ВидАдреса = Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации;
ПредставлениеАдреса = УправлениеКонтактнойИнформации.МенеджерКонтактнойИнформации.ПечатноеПредставлениеАдреса(Организация, ВидАдреса);
Проанализируем ситуацию: вы написали код, но он выдает ошибку, что поле не найдено. Как проверить, видит ли система данные в режиме реального времени?
Организация.ОсновнойБанковскийСчет.НомерСчета. Если отладчик покажет значение, значит, проблема не в доступе к данным, а в синтаксисе вашего запроса или кода.Важный нюанс: Если вы используете в тексте запроса конструкцию Справочник.Организации.КонтактнаяИнформация, убедитесь, что в расширение добавлен не только справочник, но и его табличная часть КонтактнаяИнформация со всеми нужными реквизитами. Без этого запрос может не сработать в контексте расширения.
Для успешного извлечения реквизитов из основной конфигурации в расширение придерживайтесь следующих правил:
Справочники.Имя.Реквизит).Владелец.ОбщегоНазначения или УправлениеКонтактнойИнформации). Это сократит ваш код в разы и сделает его более надежным при обновлениях.