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