Почему внешняя печатная форма не видит реквизиты, добавленные через расширение?

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

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

Анализ причины: Реквизиты формы против Реквизитов объекта

Рассмотрим ситуацию, описанную в теме. Разработчик добавил два новых поля в форму документа ПриемВремонт через расширение. При попытке печати внешней формы код ОбластьСтрока.Параметры.Серийник = СсылкаНаДокумент.Серийник; вызывает исключение. Проанализируем, в чем заключается ошибка.

В платформе 1С существует принципиальное различие между реквизитами формы и реквизитами объекта:

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

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

Влияние режима совместимости платформы

Выясним еще одну важную деталь, упомянутую в обсуждении: режим совместимости конфигурации (например, УНФ 1.6 может иметь режим 8.3.8). Это критический фактор для работы с расширениями.

Важно помнить: полноценная возможность добавления новых реквизитов объектов (создание новых физических полей в таблицах БД) через расширения появилась в платформе 1С начиная с версии 8.3.11. Если режим совместимости вашей конфигурации ниже (например, 8.3.8 или 8.3.10), расширение позволяет добавлять реквизиты только в формы или использовать программный код, но оно не может менять структуру таблиц базы данных. В этом случае у вас есть два пути:

Как правильно организовать доступ к данным в расширении

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

  1. Добавляем документ ПриемВремонт в расширение.
  2. В дереве расширения находим узел "Реквизиты" этого документа и добавляем туда новый реквизит (например, Серийник).
  3. После этого поле станет доступно через точку от ссылки: СсылкаНаДокумент.Серийник.

Рекомендации по написанию кода печати

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

Пример правильного получения данных во внешней печатной форме:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ПриемВремонт.Серийник КАК Серийник,
    |	ПриемВремонт.Дата КАК Дата
    |ИЗ
    |	Документ.ПриемВремонт КАК ПриемВремонт
    |ГДЕ
    |	ПриемВремонт.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
    ОбластьСтрока.Параметры.Серийник = Выборка.Серийник;
КонецЕсли;

Безопасный режим и фоновое выполнение

Если вы исправили структуру метаданных, но ошибка сохраняется, обратите внимание на безопасный режим. Внешние обработки часто запускаются в безопасном режиме, который может ограничивать доступ к данным расширений. Рассмотрим два способа решения:

Также помните, что печать в современных конфигурациях часто выполняется в фоновом задании. Чтобы изменения в метаданных расширения вступили в силу для серверных процессов, может потребоваться перезапуск сеанса пользователя или даже перезапуск службы агента сервера 1С (в редких случаях для очистки кэша метаданных).

Альтернатива: Дополнительные реквизиты

Если вы не хотите менять структуру конфигурации или расширения, используйте механизм Дополнительные реквизиты (БСП). Это штатный способ добавить поле в любой документ без программирования метаданных. Внешняя печатная форма может получить эти значения с помощью функции УправлениеСвойствами.ПолучитьЗначенияСвойств(Ссылка). Этот метод наиболее безопасен при частых обновлениях типовой конфигурации 1С:Управление нашей фирмой.

← На главную