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