Мы часто сталкиваемся с необходимостью выводить контактную информацию организации, такую как юридический адрес, номер телефона, сайт или электронная почта, в различных печатных формах, особенно при использовании внешних обработок. В 1С, особенно для начинающих разработчиков, получение этих данных может вызвать вопросы. Давайте рассмотрим, как правильно извлечь эти сведения, избегая типичных ошибок, используя функционал 1С:УНФ и Библиотеки стандартных подсистем (БСП).
Наш первый инстинкт в 1С часто заключается в попытке обратиться к данным напрямую через свойства объекта, например: ОбластьШапка.Параметры.Сайт = СсылкаНаДокумент.Организация.Сайт;. Однако, как показывает практика и подтверждают более опытные коллеги, такой подход, как правило, не срабатывает для контактной информации. Это связано с тем, что в большинстве типовых конфигураций 1С, включая 1С:УНФ, контактная информация (адреса, телефоны, email, сайты) не хранится непосредственно как реквизиты в справочнике "Организации" или "Контрагенты".
Вместо этого, для унификации и гибкости, эти данные обычно размещаются в специализированных механизмах, таких как регистры сведений или табличные части, которые затем связываются со справочником "ВидыКонтактнойИнформации". Такой подход позволяет хранить множество видов контактной информации для одного объекта, обеспечивать историю изменений и гибко управлять ее использованием.
Для корректного и унифицированного доступа к контактной информации в типовых конфигурациях, построенных на основе Библиотеки стандартных подсистем (БСП), разработчики рекомендуют использовать функции из общего модуля УправлениеКонтактнойИнформацией. Эти функции предоставляют стандартизированный интерфейс для получения различных сведений об объектах, включая юридические и физические лица.
СведенияОЮрФизЛице и ее применениеОдной из наиболее полезных функций для нашей задачи является СведенияОЮрФизЛице. Она предназначена для получения полных реквизитов организации (юридического или физического лица) в виде структуры. Давайте посмотрим на правильный синтаксис ее вызова, который был предложен в обсуждении:
СведенияОНашейОрганизации = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(СсылкаНаДокумент.Организация, СсылкаНаДокумент.Дата,,);
Разберем этот пример подробно:
СведенияОНашейОрганизации: Это переменная, в которую будет помещена структура с полученными данными об организации. Обращаться к ее элементам мы сможем по ключу, например, СведенияОНашейОрганизации.ЮридическийАдрес или СведенияОНашейОрганизации.Телефон.УправлениеКонтактнойИнформацией: Это имя общего модуля, содержащего функцию, которую мы хотим вызвать. Важно точно указать имя модуля, чтобы система могла его найти.СведенияОЮрФизЛице: Имя вызываемой функции.СсылкаНаДокумент.Организация: Это первый и основной параметр функции — ссылка на объект "Организация", чьи сведения нам необходимы. В нашем случае это организация, связанная с текущим документом (например, договором, реализацией, приходным ордером и т.д.). Важно убедиться, что переменная СсылкаНаДокумент.Организация действительно содержит корректную ссылку на элемент справочника "Организации" в вашей базе данных.СсылкаНаДокумент.Дата: Второй параметр — дата, на которую нужно получить сведения. Контактная информация может изменяться со временем (например, меняется юридический адрес), и эта функция позволяет получить данные на определенный момент. Обычно мы используем дату текущего документа, чтобы данные в печатной форме соответствовали документу.,,: Следующие два параметра пропущены. В типовом использовании они могут быть не нужны или иметь значения по умолчанию. Если вы хотите получить конкретные данные, например, только банковские счета или только определенные адреса, то в этих параметрах можно передать соответствующие значения или фильтры. Для большинства стандартных задач их можно опустить.Важно помнить, что если в вашем коде используется переменная текдоговор, как было в первоначальном вопросе, то она должна быть корректно инициализирована и представлять собой ссылку на объект, содержащий реквизит Организация. Например, это может быть ссылка на элемент справочника "Договоры" или на конкретный документ "Договор", который в свою очередь ссылается на нужную нам организацию.
Одна из распространенных ошибок, с которой сталкиваются новички при работе с общими модулями и их функциями, это "Метод объекта не обнаружен". В нашем случае это выглядело как "Метод объекта не обнаружен(СведенияОЮрФизЛице)". Давайте разберем причины этой ошибки и способы ее устранения, чтобы мы могли успешно продолжить работу.
УправлениеКонтактнойИнформацией) и имя функции (СведенияОЮрФизЛице), включая регистр символов. В 1С имена чувствительны к регистру, поэтому "управлениеконтактнойинформацией" и "УправлениеКонтактнойИнформацией" — это разные имена.Экспорт. Если метод не экспортный, он доступен только внутри самого модуля, и попытка вызова извне приведет к ошибке "Метод объекта не обнаружен".Для того чтобы проверить наличие метода, его параметры и корректность вызова, а также убедиться в его экспортности, мы настоятельно рекомендуем использовать встроенный инструмент 1С — Синтакс-Помощник. Это ваш лучший друг в мире 1С-разработки.
Ctrl+F1, или через меню "Справка" -> "Синтакс-Помощник".УправлениеКонтактнойИнформацией и внимательно поищите функцию СведенияОЮрФизЛице.Если вы не нашли функцию СведенияОЮрФизЛице в модуле УправлениеКонтактнойИнформацией вашей версии 1С:УНФ, то, скорее всего, вам придется искать аналогичные функции или реализовать получение контактной информации другим способом, возможно, с использованием других функций БСП, таких как КонтактнаяИнформацияОбъекта(), о которых мы поговорим далее.
Поскольку в обсуждении возник вопрос о том, что такое общий модуль и где его найти, давайте разберем это базовое, но критически важное понятие в 1С подробнее. Понимание общих модулей необходимо для любого, кто пишет код в 1С.
Общий модуль — это специальный объект конфигурации 1С, предназначенный для хранения многократно используемых фрагментов кода (процедур и функций). Его основное назначение — централизация кода, который может быть вызван из различных мест конфигурации (форм, документов, отчетов, других модулей) без его дублирования. Это значительно упрощает разработку, поддержку и обновление системы, а также способствует созданию более структурированного, чистого и легко читаемого кода. Например, если у вас есть функция для расчета НДС, которая используется в нескольких документах, ее логично поместить в общий модуль.
Чтобы найти общие модули в конфигураторе 1С, выполните следующие шаги:
УправлениеКонтактнойИнформацией. Модули обычно отсортированы по алфавиту.ЭкспортДля того чтобы функция или процедура, определенная в общем модуле, была доступна для вызова извне этого модуля (то есть из любого другого модуля, формы, отчета или обработки), она обязательно должна быть объявлена с ключевым словом Экспорт. Без этого ключевого слова функция считается внутренней и доступна только для вызова из кода, находящегося в том же общем модуле.
Пример:
// Это экспортная функция. Ее можно вызвать извне как: УправлениеКонтактнойИнформацией.МояЭкспортнаяФункция(...)
Функция МояЭкспортнаяФункция(Параметр1) Экспорт
Сообщить("Вызвана экспортная функция.");
Возврат Истина;
КонецФункции
// Это неэкспортная функция. Ее можно вызвать только внутри модуля УправлениеКонтактнойИнформацией
// Например, из МояЭкспортнаяФункция() можно вызвать МояВнутренняяФункция()
Функция МояВнутренняяФункция(Параметр2)
Сообщить("Вызвана внутренняя функция.");
Возврат Ложь;
КонецФункции
Если вы пытаетесь вызвать функцию, которая не является экспортной, вы получите именно ту ошибку, с которой мы столкнулись: "Метод объекта не обнаружен".
У каждого общего модуля есть важные свойства, которые определяют, где и как его функции будут доступны и выполняться. Эти свойства критически важны для правильной работы кода:
Для функции СведенияОЮрФизЛице и большинства других функций БСП, предназначенных для такого широкого использования, обычно устанавливаются флажки "Сервер" и "Клиент (управляемое приложение)" (через вызовы клиентских оберток), чтобы обеспечить ее доступность в различных сценариях выполнения.
МояФункция() вместо МойОбщийМодуль.МояФункция()). Однако использовать глобальные модули рекомендуется осторожно, так как это может замедлять запуск системы и приводить к конфликтам имен, если разные модули содержат функции с одинаковыми именами. Для большинства системных модулей БСП этот флажок не установлен, что требует явного указания имени модуля при вызове функций.Именно поэтому мы вызываем функцию с префиксом модуля: УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(...).
Помимо СведенияОЮрФизЛице, в общем модуле УправлениеКонтактнойИнформацией и других связанных модулях БСП могут быть доступны и другие полезные функции для работы с контактными данными. Выбор подходящей функции зависит от конкретной задачи и от того, в каком формате вам требуется получить информацию.
КонтактнаяИнформацияОбъекта(): Эта функция предназначена для получения всей контактной информации объекта в виде таблицы значений или массива структур. Если вам требуется отобразить все доступные виды контактной информации (например, несколько телефонов, несколько адресов, контактные лица), или если вам нужно выполнить более сложную логику обработки, чем просто извлечение конкретного поля, то эта функция может быть предпочтительнее. Она позволяет получить детализированную информацию, включая тип, вид контактной информации, представление и другие сопутствующие данные. Например, можно получить все телефоны, а затем выбрать основной, или вывести все адреса в зависимости от их типа.
// Пример использования КонтактнаяИнформацияОбъекта()
// Получаем таблицу значений со всей контактной информацией для организации
ТаблицаКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(СсылкаНаДокумент.Организация);
// Перебираем строки таблицы и выводим информацию
Для Каждого СтрокаКИ Из ТаблицаКИ Цикл
// СтрокаКИ будет содержать поля: Вид, Представление, Значение, Поле, Тип
Если СтрокаКИ.Вид.Наименование = "Телефон" Тогда
Сообщить("Телефон: " + СтрокаКИ.Представление);
ИначеЕсли СтрокаКИ.Вид.Наименование = "Юридический адрес" Тогда
Сообщить("Юр. адрес: " + СтрокаКИ.Представление);
КонецЕсли;
КонецЦикла;
Эта функция особенно полезна, когда требуется гибкая обработка контактных данных и доступ к их структурированным компонентам.
ПредставлениеКонтактнойИнформацииОбъекта(): Эта функция является удобным инструментом, если вам нужно получить уже отформатированное строковое представление контактной информации. Например, если в печатной форме вам просто нужна одна строка типа "г. Москва, ул. Ленина, д.1, тел. +7(XXX)XXX-XX-XX, e-mail: info@org.ru", без детального парсинга каждого поля, то эта функция возьмет на себя заботу о правильном форматировании данных. Она часто используется для быстрого вывода общей информации без сложной логики.
// Пример использования ПредставлениеКонтактнойИнформацииОбъекта()
// Получаем предопределенный элемент справочника "ВидыКонтактнойИнформации"
// для юридического адреса организации
ВидЮрАдрес = Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации;
// Получаем отформатированное представление юридического адреса
ПредставлениеЮрАдреса = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформацииОбъекта(
СсылкаНаДокумент.Организация,
ВидЮрАдрес
);
// Получаем отформатированное представление телефона организации
ВидТелефон = Справочники.ВидыКонтактнойИнформации.ТелефонОрганизации;
ПредставлениеТелефона = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформацииОбъекта(
СсылкаНаДокумент.Организация,
ВидТелефон
);
// ... далее используем ПредставлениеЮрАдреса и ПредставлениеТелефона в параметрах печати
ОбластьШапка.Параметры.ЮридическийАдресТекст = ПредставлениеЮрАдреса;
ОбластьШапка.Параметры.ТелефонТекст = ПредставлениеТелефона;
Обратите внимание, что для этой функции часто требуется передавать не просто строку с именем вида информации, а ссылку на элемент справочника ВидыКонтактнойИнформации или его предопределенный аналог, если это необходимо. В БСП часто используются предопределенные элементы, такие как Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации или Справочники.ВидыКонтактнойИнформации.ТелефонОрганизации.
КонтактнаяИнформацияОбъектов(): Если ваша задача состоит в том, чтобы получить контактную информацию для целого списка организаций или контрагентов, а не для одного объекта, то функция КонтактнаяИнформацияОбъектов() будет наиболее эффективной. Она позволяет передать массив ссылок на объекты и получить контактные данные для всех них за один вызов, что значительно оптимизирует производительность, уменьшая количество обращений к базе данных. Это особенно актуально в отчетах, где нужно отобразить информацию по многим объектам, или при пакетной обработке документов.
// Пример использования КонтактнаяИнформацияОбъектов()
// Создаем массив объектов, для которых хотим получить КИ
МассивОбъектов = Новый Массив();
МассивОбъектов.Добавить(СсылкаНаДокумент.Организация);
// Добавим другие организации или контрагентов, если нужно
// МассивОбъектов.Добавить(ДругаяОрганизацияСсылка);
// Получаем предопределенный вид контактной информации (например, юридический адрес)
ВидКИДляПолучения = Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации;
// Вызываем функцию для получения контактной информации для всех объектов
ТаблицаКИПоНесколькимОбъектам = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(
МассивОбъектов, // Массив ссылок на объекты
ВидКИДляПолучения, // Конкретный вид КИ, который нас интересует (можно передать Неопределено для всех видов)
Истина, // Получить последнее значение (актуальное на дату)
СсылкаНаДокумент.Дата // Дата, на которую нужны сведения
);
// Перебираем полученную таблицу и выводим информацию
Для Каждого СтрокаКИ Из ТаблицаКИПоНесколькимОбъектам Цикл
// СтрокаКИ будет содержать поля: Объект, Вид, Представление, Значение, Поле, Текст
Если СтрокаКИ.Объект = СсылкаНаДокумент.Организация Тогда
Сообщить("Юр. адрес организации: " + СтрокаКИ.Представление);
КонецЕсли;
// Можно обрабатывать и информацию по другим объектам из МассивОбъектов
КонецЦикла;
Эта функция возвращает таблицу значений, где каждая строка содержит контактную информацию для определенного объекта и вида. Это мощный инструмент для массовой обработки, позволяющий избежать множественных вызовов функций в цикле и значительно ускорить работу.
Таким образом, выбор функции зависит от специфики вашей задачи: СведенияОЮрФизЛице удобна для получения стандартного набора реквизитов для одного лица, КонтактнаяИнформацияОбъекта() — для детального анализа всех КИ одного объекта, ПредставлениеКонтактнойИнформацииОбъекта() — для получения отформатированной строки, а КонтактнаяИнформацияОбъектов() — для массового получения данных.
В 1С:УНФ все основные сведения об организации, включая контактную информацию, вводятся и хранятся в карточке организации. Чтобы получить доступ к этим данным программно, нам нужно знать, как они там структурированы и как пользователи их заполняют.
В карточке организации (доступной через меню "НСИ и администрирование" -> "Организации"), на вкладке "Адреса, телефоны", пользователи заполняют различные виды контактной информации. Каждый вид информации (например, "Юридический адрес", "Телефон", "E-mail", "Сайт") представляет собой предопределенный элемент справочника ВидыКонтактнойИнформации. При получении данных функцией СведенияОЮрФизЛице, результатом будет структура, ключи которой будут соответствовать стандартизированным названиям полей, таким как ЮридическийАдрес, Телефон, Email, Сайт.
После успешного вызова функции УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице и получения структуры СведенияОНашейОрганизации, мы можем обращаться к ее полям для извлечения нужных данных. Всегда рекомендуется проверять наличие свойства в структуре перед обращением к нему, чтобы избежать ошибок в случае, если данные не были заполнены.
// Предполагаем, что СсылкаНаДокумент.Организация и СсылкаНаДокумент.Дата корректно установлены
// и функция УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице доступна и успешно выполнилась.
СтруктураСведенийОбОрганизации = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(СсылкаНаДокумент.Организация, СсылкаНаДокумент.Дата,,);
// Инициализируем переменные, которые будем передавать в печатную форму
ПередаваемыйЮрАдрес = "";
ПередаваемыйТелефон = "";
ПередаваемыйСайт = "";
ПередаваемаяЭлектроннаяПочта = "";
// Извлекаем юридический адрес
Если СтруктураСведенийОбОрганизации.Свойство("ЮридическийАдрес") Тогда
ПередаваемыйЮрАдрес = СтруктураСведенийОбОрганизации.ЮридическийАдрес;
Иначе
Сообщить("В структуре сведений об организации отсутствует юридический адрес.");
КонецЕсли;
// Извлекаем телефон
Если СтруктураСведенийОбОрганизации.Свойство("Телефон") Тогда
ПередаваемыйТелефон = СтруктураСведенийОбОрганизации.Телефон;
Иначе
Сообщить("В структуре сведений об организации отсутствует телефон.");
КонецЕсли;
// Извлекаем сайт
Если СтруктураСведенийОбОрганизации.Свойство("Сайт") Тогда
ПередаваемыйСайт = СтруктураСведенийОбОрганизации.Сайт;
Иначе
Сообщить("В структуре сведений об организации отсутствует сайт.");
КонецЕсли;
// Извлекаем электронную почту
Если СтруктураСведенийОбОрганизации.Свойство("ЭлектроннаяПочта") Тогда
ПередаваемаяЭлектроннаяПочта = СтруктураСведенийОбОрганизации.ЭлектроннаяПочта;
Иначе
Сообщить("В структуре сведений об организации отсутствует электронная почта.");
КонецЕсли;
// Теперь эти переменные можно использовать для вывода в соответствующие области печатной формы
// ОбластьШапка - это переменная типа "ОбластьМакета", представляющая собой шапку вашей печатной формы
ОбластьШапка.Параметры.ЮридическийАдрес = ПередаваемыйЮрАдрес;
ОбластьШапка.Параметры.Телефон = ПередаваемыйТелефон;
ОбластьШапка.Параметры.Сайт = ПередаваемыйСайт;
ОбластьШапка.Параметры.ЭлектроннаяПочта = ПередаваемаяЭлектроннаяПочта;
// Далее можно вывести ОбластьШапка в табличный документ
// ТабличныйДокумент.Вывести(ОбластьШапка);
Мы используем проверку Свойство() перед обращением к полю структуры, чтобы избежать ошибки, если по каким-либо причинам данное свойство отсутствует в возвращенной структуре (например, если контактная информация для данного вида не заполнена в карточке организации). Если поле отсутствует, мы можем вывести сообщение для отладки или использовать пустую строку.
Для успешного получения контактной информации в 1С:УНФ из внешней обработки и ее использования в печатных формах, подытожим наши шаги и ключевые моменты:
УправлениеКонтактнойИнформацией и его функция СведенияОЮрФизЛице. В качестве альтернативы рассмотрите КонтактнаяИнформацияОбъекта() или ПредставлениеКонтактнойИнформацииОбъекта() в зависимости от ваших потребностей.СведенияОЮрФизЛице) всегда используйте проверку Структура.Свойство("ИмяСвойства") перед тем, как обратиться к этому свойству. Это поможет избежать ошибок, если какое-либо поле не заполнено в базе данных.Следуя этим рекомендациям, вы сможете эффективно работать с контактной информацией организаций в 1С:УНФ, успешно интегрировать ее в ваши печатные формы и отчеты, а также повысить свою квалификацию в разработке на платформе 1С:Предприятие.