В каком модуле 1С должен располагаться метод при обращении через менеджер или объект справочника?

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

При подготовке к сертификации «1С:Профессионал» по платформе программисты часто сталкиваются с вопросами, которые кажутся неоднозначными или содержат устаревшую терминологию. Один из таких примеров — определение местоположения экспортной процедуры в зависимости от синтаксиса обращения к ней. Рассмотрим подробно ситуации, когда код ссылается на методы через менеджер справочника и через объект, и разберем логику платформы «1С:Предприятие 8».

Разбор ситуации 1: Обращение через менеджер справочника

Рассмотрим следующий программный код: Справочники.Номенклатура.Метод1;. Для того чтобы понять, где должна быть описана процедура Метод1, проанализируем цепочку обращения по шагам.

Во-первых, выражение Справочники.Номенклатура возвращает объект типа СправочникМенеджер. Согласно архитектуре 1С, менеджер конкретного прикладного объекта предназначен для управления этим объектом как целым. Через него выполняются такие действия, как поиск ссылок, создание новых элементов, выборка данных или получение макетов.

Во-вторых, если мы обращаемся к какому-либо методу непосредственно «через точку» от менеджера, этот метод обязан быть объявлен с ключевым словом Экспорт в модуле менеджера соответствующего справочника. Это позволяет выполнять логику, не привязанную к конкретной записи базы данных (например, расчет остатков по всей номенклатуре или сложный поиск).

Важный вывод: если в цепочке вызовов после имени справочника сразу идет название метода, ищите его в модуле менеджера.

Разбор ситуации 2: Обращение через создание объекта

Теперь проанализируем более сложную конструкцию: Справочники.Номенклатура.СоздатьОбъект.Метод1;. Здесь у многих разработчиков возникает путаница из-за использования метода СоздатьОбъект.

Выясним причину появления термина СоздатьОбъект. В современной платформе 8.3 для создания нового элемента используются методы СоздатьЭлемент() или СоздатьГруппу(). Однако в тестах «1С:Профессионал» иногда встречается терминология, наследуемая из версии 7.7, или абстрактные названия методов, чтобы проверить понимание логики возвращаемых типов данных.

Разберем эту цепочку вызовов по этапам:

  1. Справочники.Номенклатура — обращение к менеджеру справочника.
  2. СоздатьОбъект — это функция (в контексте данного вопроса), которая возвращает новый экземпляр объекта справочника. Тип возвращаемого значения здесь — СправочникОбъект.
  3. Метод1 — вызывается уже не от менеджера, а от конкретного объекта, находящегося в оперативной памяти.

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

Сравнение контекстов выполнения

Для закрепления материала посмотрим на пример кода, который наглядно демонстрирует разницу между вызовами. Представим, что у нас есть справочник «Номенклатура».

Если код написан так:


// Вызов метода из Модуля Менеджера
Справочники.Номенклатура.ОбновитьЦеныНаВсюПродукцию();

В этом случае процедура ОбновитьЦеныНаВсюПродукцию должна находиться в модуле менеджера и иметь пометку Экспорт.

Если же код выглядит следующим образом:


// Вызов метода из Модуля Объекта
НовыйТовар = Справочники.Номенклатура.СоздатьЭлемент();
НовыйТовар.РассчитатьСебестоимостьЕдиницы();

Здесь процедура РассчитатьСебестоимостьЕдиницы обязана располагаться в модуле объекта, так как она работает с данными конкретного НовыйТовар.

Нестандартные варианты реализации

В ходе обсуждения на форумах иногда выдвигаются экзотические гипотезы о том, как такой код может сработать. Например, можно имитировать подобную структуру через структуры или формы на клиенте, но для целей официального тестирования 1С такие варианты рассматривать не стоит. Рассмотрим пример «хитрого» кода, предложенного участниками для имитации вызова Справочники.Номенклатура.СоздатьОбъект.Метод1:


&НаКлиенте
Процедура КомандаВыполнить(Команда)
    Перем Справочники;
    // Создаем структуру, имитирующую дерево объектов
    Справочники = Новый Структура("Номенклатура", 
        Новый Структура("СоздатьОбъект", ЭтаФорма));
    
    // Теперь этот вызов синтаксически корректен
    Справочники.Номенклатура.СоздатьОбъект.Метод1(); 
КонецПроцедуры

&НаКлиенте
Процедура Метод1() Экспорт
    Сообщить("Метод вызван из модуля формы!");
КонецПроцедуры

Хотя такой код технически возможен, в контексте экзамена «Профессионал» подразумевается стандартное поведение платформы. Поэтому всегда ориентируйтесь на тип конечного объекта, у которого вызывается метод через последнюю «точку».

Шпаргалка для определения модуля

Чтобы не ошибиться в тестах и на практике, используйте следующий алгоритм:

  1. Определите тип значения перед последней точкой в выражении.
  2. Если это СправочникМенеджер (например, Справочники.Склады) — метод находится в модуле менеджера.
  3. Если это СправочникОбъект (результат методов СоздатьЭлемент(), ПолучитьОбъект() или, как в вопросе, СоздатьОбъект) — метод находится в модуле объекта.
  4. Если это СправочникСсылка — помните, что у ссылки нет собственных методов, определенных пользователем. Для обращения к методам модуля объекта ссылку сначала нужно преобразовать в объект через ПолучитьОбъект().

Проанализировав эти правила, мы видим, что вопрос 6.67 из сборника тестов специально использует конструкцию, возвращающую объект, чтобы проверить, понимает ли кандидат разницу в типах данных 1С и соответствующих им программных модулях. Знание этих основ позволяет не только успешно сдавать экзамены, но и писать грамотный, структурированный код, соблюдая стандарты разработки фирмы «1С».

← На главную