При работе со старыми конфигурациями, такими как Управление торговлей 10.3, работающими на обычных формах (ОФ), программисты часто сталкиваются с проблемой: при попытке добавить форму документа в расширение визуальный редактор и модуль формы оказываются недоступны для редактирования. Давайте подробно разберем, почему так происходит, и какие существуют методы решения этой задачи, чтобы не снимать основную конфигурацию с поддержки.
Для начала проанализируем ситуацию с точки зрения архитектуры платформы 1С:Предприятие 8.3. Механизм расширений изначально создавался и затачивался под управляемое приложение и управляемые формы. Несмотря на то что современные версии платформы позволяют подключать расширения к старым конфигурациям, существует жесткое ограничение: обычные формы не являются расширяемыми объектами.
Когда мы пытаемся добавить обычную форму в расширение, конфигуратор позволяет создать объект типа Форма, однако он не может инициализировать для нее редактор форм и редактор модуля, так как они технологически не поддерживают работу в слое расширения. Именно поэтому вы видите форму в дереве объектов расширения, но "модуль нельзя открыть".
Прежде чем приступать к реализации обходных путей, нам необходимо убедиться, что база вообще готова к работе с расширениями. Проанализируем настройки основной конфигурации. Для корректной работы расширений режим совместимости должен быть установлен в значение не ниже 8.3.6, а для использования современных аннотаций, таких как &Вместо, &Перед или &После, требуется версия 8.3.10 и выше.
Важный момент: простое повышение режима совместимости в УТ 10.3 может привести к непредсказуемым последствиям в работе типовых механизмов (например, в работе торгового оборудования или специфических интерфейсных решений). Поэтому действовать нужно осторожно и всегда проводить полное тестирование после изменения этого параметра.
Рассмотрим самый современный подход. Если нам нужно добавить абсолютно новую форму для существующего документа в УТ 10.3, мы можем использовать механизм управляемых форм в режиме обычного приложения. Это легальный и поддерживаемый платформой способ расширения интерфейса.
Выполним следующие шаги:
Использовать управляемые формы в обычном приложении.Для вызова такой формы из обычного интерфейса можно использовать расширение модуля объекта документа. Рассмотрим пример кода, который перехватывает открытие формы:
&Вместо("ПередОткрытием")
Процедура Расш1_ПередОткрытием(Отказ, СтандартнаяОбработка)
// Если нужно подменить стандартную форму на нашу управляемую
СтандартнаяОбработка = Ложь;
ОткрытьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаУправляемаяРасширение", Новый Структура("Ключ", Ссылка));
КонецПроцедуры
Если ваша задача заключается не в изменении расположения кнопок на форме, а в изменении логики поведения документа (например, при заполнении или проверке данных), то визуальное редактирование формы вам не требуется. Разберем, как работать с логикой через модули, которые расширять можно.
В расширение можно добавить Модуль объекта документа. В отличие от модуля формы, модуль объекта в расширении открывается без проблем. Мы можем использовать аннотации для внедрения в типовой процесс:
&Перед — для выполнения действий до начала типового алгоритма.&После — для выполнения действий после завершения типовой логики.&Вместо — для полной замены типовой процедуры своей собственной.Например, проанализируем ситуацию, когда нам нужно добавить проверку при записи документа в УТ 10.3 через расширение:
&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если Не ЗначениеЗаполнено(ЭтотОбъект.Склад) Тогда
Сообщить("Внимание: Склад не заполнен, но мы разрешим запись для черновика.");
КонецЕсли;
КонецПроцедуры
Рассмотрим более сложный, но эффективный метод. Если в УТ 10.3 логика работы формы вынесена в Общий модуль (что часто встречается в типовых решениях для процедур заполнения или расчета налогов), мы можем расширить именно этот общий модуль.
Посмотрим на алгоритм действий:
&Вместо, чтобы изменить поведение кода, который вызывается из формы.Таким образом, мы меняем поведение формы, вообще не трогая саму форму в расширении. Это "чистый" способ, позволяющий сохранить типовую конфигурацию в неизменном виде.
В процессе обсуждения на форумах часто возникает вопрос о представлении данных, например, влияет ли наличие пробелов в числе (типа 31 000 138) на работу программы. Выясним этот момент, так как он важен при написании кода в расширениях.
В языке 1С тип Число всегда хранится в памяти в чистом виде. Пробелы, которые вы видите в консоли или на формах — это лишь строковое представление числа, настроенное через форматную строку. Если вы сравниваете два числа в коде:
Если Число1 = 31000138 Тогда
// Это условие сработает, даже если на форме число отображается как "31 000 138"
КонецЕсли;
Однако будьте внимательны при получении данных из внешних источников (Excel, текстовые файлы). Если вы получаете "31 000 138" как строку, то функция Число() может выдать ошибку или неверный результат из-за неразрывных пробелов. В таких случаях перед преобразованием строки в число необходимо удалять все пробелы символом СтрЗаменить(Стр, Символы.НПП, "").
Подведем итог нашему анализу работы расширений в УТ 10.3:
ОткрытьФорму().Работая таким образом, мы сохраняем возможность легкого обновления УТ 10.3, при этом гибко настраивая систему под нужды бизнеса, используя современные инструменты платформы 1С.