Как получить ИНН организации в 1С:Бухгалтерия 3.0 на управляемых формах?

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

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

Выясним причину возникновения ошибки

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

При попытке выполнить код ИНН = Организация.ИНН; в процедуре с директивой &НаКлиенте, система выдаст ошибку, так как на стороне клиента у ссылки отсутствуют данные о реквизитах (кроме базовых, таких как Наименование или Код, и то в определенных случаях). Для получения ИНН нам необходимо «сходить» на сервер, где есть прямой доступ к базе данных.

Способ 1. Создание собственной серверной функции

Разберем самый простой и наглядный метод — вынос обращения к реквизиту в отдельную функцию, исполняемую на стороне сервера. Посмотрим на пример кода, который исправляет ошибку автора темы:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Получаем ссылку на организацию через серверный вызов
    ОрганизацияСсылка = ПолучитьОсновнуюОрганизацию();
    
    // Получаем ИНН, вызывая другую серверную функцию
    ИНН = ПолучитьИННОрганизации(ОрганизацияСсылка);
КонецПроцедуры

&НаСервере
Функция ПолучитьОсновнуюОрганизацию()
    Возврат БухгалтерскийУчетПереопределяемый.ПолучитьЗначениеПоУмолчанию("ОсновнаяОрганизация");
КонецФункции

&НаСервереБезКонтекста
Функция ПолучитьИННОрганизации(СсылкаНаОрганизацию)
    Если ЗначениеЗаполнено(СсылкаНаОрганизацию) Тогда
        Возврат СсылкаНаОрганизацию.ИНН;
    КонецЕсли;
    Возврат "";
КонецФункции

В данном примере мы использовали директиву &НаСервереБезКонтекста. Это важный момент для оптимизации: такие вызовы работают быстрее, так как не передают на сервер все данные формы, а оперируют только переданными параметрами.

Способ 2. Использование функций библиотеки стандартных подсистем (БСП)

В современных конфигурациях, таких как БП 3.0, для получения реквизитов объектов созданы специальные общие модули. Рассмотрим, как сделать код чище и профессиональнее, используя возможности БСП. Вместо написания своих функций, мы можем воспользоваться универсальным механизмом.

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


&НаСервере
Процедура ПолучитьДанныеНаСервере()
    Организация = БухгалтерскийУчетПереопределяемый.ПолучитьЗначениеПоУмолчанию("ОсновнаяОрганизация");
    
    // Используем стандартную функцию БСП
    ИНН = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Организация, "ИНН");
КонецПроцедуры

Если нам требуется получить сразу несколько значений (например, ИНН, КПП и ОГРН), проанализируем метод ЗначенияРеквизитовОбъекта, который возвращает структуру:


&НаСервере
Процедура ПолучитьРеквизитыОрганизации()
    Организация = БухгалтерскийУчетПереопределяемый.ПолучитьЗначениеПоУмолчанию("ОсновнаяОрганизация");
    
    Реквизиты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Организация, "ИНН, КПП, ОГРН");
    
    Сообщить("ИНН: " + Реквизиты.ИНН);
    Сообщить("КПП: " + Реквизиты.КПП);
КонецПроцедуры

Способ 3. Оптимизация через ПриСозданииНаСервере

Рассмотрим ситуацию с точки зрения производительности. Вызов серверных функций из клиентской процедуры ПриОткрытии заставляет пользователя ждать, пока программа выполнит лишний цикл «клиент-сервер». Лучшей практикой считается подготовка всех необходимых данных заранее.

Разберем по шагам, как это реализовать:

  1. Создадим реквизит формы (например, ИНН_Организации) с типом Строка.
  2. В процедуре ПриСозданииНаСервере заполним этот реквизит.
  3. На клиенте просто обратимся к уже готовой переменной.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Организация = БухгалтерскийУчетПереопределяемый.ПолучитьЗначениеПоУмолчанию("ОсновнаяОрганизация");
    
    // Сразу вычисляем ИНН и записываем в реквизит формы
    Объект.ИНН_Организации = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Организация, "ИНН");
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // На клиенте данные уже доступны без вызовов сервера
    Если ПустаяСтрока(Объект.ИНН_Организации) Тогда
        Сообщить("ИНН не заполнен!");
    КонецЕсли;
КонецПроцедуры

Дополнительные нюансы для БП 3.0

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

Функция ОбщегоНазначенияБП.ДанныеОрганизации позволяет получить структуру сведений на определенную дату, что критично для учета, если реквизиты организации менялись со временем:


&НаСервере
Функция ПолучитьПолныеДанные(ОрганизацияСсылка, АктуальнаяДата)
    Возврат ОбщегоНазначенияБП.ДанныеОрганизации(ОрганизацияСсылка, АктуальнаяДата);
КонецФункции

Подведем итог: никогда не пытайтесь обращаться к реквизитам через точку от ссылки на клиенте. Всегда используйте либо специализированные функции БСП в серверном контексте, либо подготавливайте данные в момент создания формы на сервере. Это обеспечит стабильную работу программы и отсутствие ошибок доступа к данным.

← На главную