При разработке в среде 1С:Предприятие часто возникает ситуация, когда конфигурацию необходимо доработать с помощью расширения, не снимая основную конфигурацию с поддержки. Одной из типовых задач является добавление новых полей в документ и вывод их во внешнюю печатную форму. Однако разработчики часто сталкиваются с ошибкой Поле объекта не обнаружено при попытке обращения к новым реквизитам. Разберем подробно, почему это происходит и как правильно решить данную задачу.
Рассмотрим ситуацию, описанную в теме. Разработчик добавил два новых поля в форму документа ПриемВремонт через расширение. При попытке печати внешней формы код ОбластьСтрока.Параметры.Серийник = СсылкаНаДокумент.Серийник; вызывает исключение. Проанализируем, в чем заключается ошибка.
В платформе 1С существует принципиальное различие между реквизитами формы и реквизитами объекта:
Ссылка в любом месте программы, включая внешние обработки.В данном случае поля были добавлены именно в расширение формы. Стандартная подсистема печати (БСП) работает исключительно со ссылками на объекты (ДокументСсылка). Процедуры печати ничего не знают о том, какие дополнительные данные вы ввели на экране, если эти данные не сохранены в самом объекте базы данных.
Выясним еще одну важную деталь, упомянутую в обсуждении: режим совместимости конфигурации (например, УНФ 1.6 может иметь режим 8.3.8). Это критический фактор для работы с расширениями.
Важно помнить: полноценная возможность добавления новых реквизитов объектов (создание новых физических полей в таблицах БД) через расширения появилась в платформе 1С начиная с версии 8.3.11. Если режим совместимости вашей конфигурации ниже (например, 8.3.8 или 8.3.10), расширение позволяет добавлять реквизиты только в формы или использовать программный код, но оно не может менять структуру таблиц базы данных. В этом случае у вас есть два пути:
Если режим совместимости позволяет (8.3.11 и выше), для решения проблемы необходимо добавить реквизит не в форму расширения, а в сам объект (документ) внутри расширения. Процедура выглядит так:
ПриемВремонт в расширение.Серийник).СсылкаНаДокумент.Серийник.Проанализируем технические нюансы обращения к данным. Обращение "через точку" (Ссылка.Реквизит) является неявным запросом, который считывает весь объект целиком. В случае работы с расширениями и внешними формами лучше использовать объект Запрос. Это гарантирует, что платформа обратится напрямую к таблицам базы данных, где расширение уже создало нужные поля.
Пример правильного получения данных во внешней печатной форме:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПриемВремонт.Серийник КАК Серийник,
| ПриемВремонт.Дата КАК Дата
|ИЗ
| Документ.ПриемВремонт КАК ПриемВремонт
|ГДЕ
| ПриемВремонт.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ОбластьСтрока.Параметры.Серийник = Выборка.Серийник;
КонецЕсли;
Если вы исправили структуру метаданных, но ошибка сохраняется, обратите внимание на безопасный режим. Внешние обработки часто запускаются в безопасном режиме, который может ограничивать доступ к данным расширений. Рассмотрим два способа решения:
Также помните, что печать в современных конфигурациях часто выполняется в фоновом задании. Чтобы изменения в метаданных расширения вступили в силу для серверных процессов, может потребоваться перезапуск сеанса пользователя или даже перезапуск службы агента сервера 1С (в редких случаях для очистки кэша метаданных).
Если вы не хотите менять структуру конфигурации или расширения, используйте механизм Дополнительные реквизиты (БСП). Это штатный способ добавить поле в любой документ без программирования метаданных. Внешняя печатная форма может получить эти значения с помощью функции УправлениеСвойствами.ПолучитьЗначенияСвойств(Ссылка). Этот метод наиболее безопасен при частых обновлениях типовой конфигурации 1С:Управление нашей фирмой.