Как правильно получить адрес контрагента в 1С:Бухгалтерии 2.0?

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

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

Причины ошибки при обращении к элементам формы

Рассмотрим типовой ошибочный фрагмент кода, в котором выполняется попытка считывания адреса:


ФормаКонтр = ДанныеДляПечати.Ссылка.ПоставщикА.ПолучитьФорму("ФормаЭлемента");
АдресПост = ФормаКонтр.ЭлементыФормы.ПолеКИ1;
ОбластьМакета.Параметры.АдресПоставщика = "Поставщик адрес: " + АдресПост;

В приведенном примере возникают две ключевые технические проблемы:

  1. Обращение к объекту элемента интерфейса вместо его значения. Переменная ФормаКонтр.ЭлементыФормы.ПолеКИ1 ссылается на сам элемент управления формы (элемент типа ПолеВвода), а не на данные, которые в нем отображаются.
  2. Особенности инициализации формы в памяти. Метод ПолучитьФорму() лишь создает объект формы в оперативной памяти, но не выполняет код инициализации. Обработчики событий ПередОткрытием и ПриОткрытием, в которых происходит заполнение элементов формы данными из регистра, срабатывают только при вызове метода Открыть(). Даже при попытке обратиться к свойству .Значение поле останется пустым.

Кроме того, обращение к визуальным элементам формы недопустимо в серверных модулях (например, при формировании печатных форм или в фоновых заданиях), так как элементы формы существуют исключительно в клиентском контексте.

Способ 1. Использование встроенного программного интерфейса (Общие модули)

В типовой конфигурации 1С:Бухгалтерия 2.0 предусмотрены готовые функции в общем модуле УправлениеКонтактнойИнформацией. Разберем основные из них.

Для получения конкретной строки адреса по контрагенту используется функция ПолучитьАдресИзКонтактнойИнформации():


СсылкаНаКонтрагента = ДанныеДляПечати.Ссылка.ПоставщикА;
ВидАдреса = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;

СтрокаАдреса = УправлениеКонтактнойИнформацией.ПолучитьАдресИзКонтактнойИнформации(СсылкаНаКонтрагента, ВидАдреса);
ОбластьМакета.Параметры.АдресПоставщика = "Поставщик адрес: " + СтрокаАдреса;

Если для печатной формы требуется получить полный комплект реквизитов (наименование, ИНН, КПП, юридический и фактический адреса, телефоны), рекомендуется использовать функцию СведенияОЮрФизЛице():


СведенияОПоставщике = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(ДанныеДляПечати.Ссылка.ПоставщикА, ДатаДокумента);
ОбластьМакета.Параметры.АдресПоставщика = СведенияОПоставщике.ЮридическийАдрес;

Данная функция возвращает структуру с готовыми отформатированными представлениями реквизитов организации или контрагента.

Способ 2. Запрос к регистру сведений «КонтактнаяИнформация»

В редакции 1С:Бухгалтерия 2.0 контактная информация хранится в независимом регистре сведений КонтактнаяИнформация. Если необходимо написать прямой запрос к базе данных, проанализируем структуру отбора.

Для корректного извлечения адреса контрагента недостаточно наложить отбор только по измерению Объект. Необходимо обязательно указать тип и вид контактной информации:

Рассмотрим пример запроса для получения юридического адреса поставщика:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	КИ.Представление КАК Адрес
    |ИЗ
    |	РегистрСведений.КонтактнаяИнформация КАК КИ
    |ГДЕ
    |	КИ.Объект = &Поставщик
    |	И КИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)
    |	И КИ.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ЮрАдресКонтрагента)";

Запрос.УстановитьПараметр("Поставщик", ДанныеДляПечати.Ссылка.ПоставщикА);

РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    ОбластьМакета.Параметры.АдресПоставщика = "Поставщик адрес: " + Выборка.Адрес;
КонецЕсли;

Оптимизация получения данных при формировании печати

Вызов функций общего модуля или отдельных запросов в цикле при обработке множества строк неэффективен. При подготовке данных для макетов рекомендуется левым соединением получать адресную информацию сразу в основном запросе выборки данных документа.


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

Этот подход сокращает количество обращений к СУБД и значительно ускоряет работу печатных форм.

← На главную