Как получить значение дополнительного реквизита в печатную форму 1С?

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

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

Различие между реквизитами конфигуратора и дополнительными реквизитами

Первое, что необходимо усвоить — это архитектурная разница между этими двумя типами данных:

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

Решение: использование механизмов БСП для получения данных

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

Для того чтобы получить значение, используйте метод УправлениеСвойствами.ЗначениеСвойства. Этот метод позволяет корректно «достать» информацию из регистра сведений, где хранятся дополнительные данные.

Пример использования кода для вставки в печатную форму:


// Получаем значение свойства по ссылке на объект и наименованию свойства
ЗначениеИсполнителя = УправлениеСвойствами.ЗначениеСвойства(СсылкаНаДокумент, "Исполнитель");

// Далее присваиваем полученное значение параметру макета
ОбластьСтрокаТЧ.Параметры.Исполнитель = ЗначениеИсполнителя;

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


// Поиск ссылки на свойство в плане видов характеристик
СвойствоИсполнитель = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Исполнитель");

// Получение значения с использованием найденной ссылки
ЗначениеИсполнителя = УправлениеСвойствами.ЗначениеСвойства(СсылкаНаДокумент, СвойствоИсполнитель);

Как выводить данные из табличных частей

При работе с печатными формами часто требуется перенести данные из табличной части (ТЧ) документа в макет. Рассмотрим пошагово, как это правильно реализовать.

  1. Создание области: В макете печатной формы подготовьте область, которая будет соответствовать строке таблицы. Назовите её, например, СтрокаТЧ.
  2. Обход коллекции: В коде используйте цикл для обхода строк табличной части документа.
  3. Заполнение параметров: Внутри цикла последовательно заполняйте параметры области значениями из текущей строки.
  4. Вывод в табличный документ: Выводите область в результирующий ТабличныйДокумент.

Пример реализации заполнения:


// Получаем табличную часть документа
Для Каждого Стр Из СсылкаНаДокумент.Товары Цикл
    // Заполняем параметры области
    ОбластьСтрокаТЧ.Параметры.Наименование = Стр.Номенклатура;
    ОбластьСтрокаТЧ.Параметры.Количество = Стр.Количество;
    
    // Выводим строку в печатную форму
    ТабДок.Вывести(ОбластьСтрокаТЧ);
КонецЦикла;

Почему возникают ошибки доступа?

Если вы уверены, что используете правильный метод, но данные все равно не выводятся, проверьте следующие моменты:

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

← На главную