Как в расширении 1С запретить закрытие формы, добавить новые объекты и обойти ограничения типов данных?

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

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

Управление логикой закрытия формы в расширении

Рассмотрим ситуацию, когда в расширении на форму добавлены новые реквизиты, обязательные для заполнения. Если пользователь нажимает кнопку «ОК» (или «Записать и закрыть»), нам необходимо проверить заполнение этих полей и, если они пусты, прервать процесс закрытия. Проблема заключается в том, что даже если мы установим Отказ = Истина в методе с аннотацией &Перед, последующий типовой код может принудительно установить Отказ = Ложь, и форма все равно закроется.

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


&Вместо("ПриЗаписи")
Процедура Расш1_ПриЗаписи(Отказ, ПараметрыЗаписи)
    
    // Выполняем нашу проверку
    Если Объект.Нестандарт И Не ЗначениеЗаполнено(Объект.НашДополнительныйРеквизит) Тогда
        Сообщить("Необходимо заполнить дополнительный реквизит!");
        Отказ = Истина;
        Возврат;
    КонецЕсли;

    // Если проверка пройдена, вызываем типовой алгоритм
    ПродолжитьВызов(Отказ, ПараметрыЗаписи);
    
КонецПроцедуры

Разберем, почему это работает. Метод &Вместо полностью замещает типовой метод. Вызывая ПродолжитьВызов(), мы сами решаем, когда и при каких условиях передать управление «родному» коду конфигурации. Если же мы хотим использовать стандартное событие формы ПередЗакрытием, следует помнить, что оно срабатывает всегда, даже при программном вызове метода Закрыть(). Если параметр Отказ в этом событии будет установлен в Истина, форма не закроется, если только в коде нет принудительного игнорирования этого состояния.

Почему кнопка «Добавить в расширение» может быть неактивна?

Иногда при попытке заимствовать объект из основной конфигурации разработчик обнаруживает, что кнопка «Добавить в расширение» недоступна. Выясним основные причины этой ситуации:

Перенос функционала из доработанной конфигурации в расширение

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

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

Важный нюанс: Начиная с версии платформы 8.3.15, в окне сравнения и объединения основной конфигурации при обновлении можно нажать правую кнопку мыши на измененном объекте и выбрать пункт «Добавить в расширение». Это значительно упрощает «вынос» доработок из основной конфигурации в слой расширения.

Решение проблемы с типом «ЛюбаяСсылка»

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

Основное ограничение здесь — режим совместимости. Для полноценной поддержки произвольных ссылочных типов в расширениях режим совместимости основной конфигурации должен быть не ниже 8.3.15. Если ваша типовая конфигурация («на замочке») имеет более низкий режим совместимости, платформа физически не позволит использовать такие типы в расширении.

Рассмотрим варианты решения:

  1. Использование Определяемых типов: Если в основной конфигурации уже есть ОпределяемыйТип, включающий нужные вам объекты, вы можете заимствовать его в расширение и использовать как тип реквизита. Если же нужного типа нет, а конфигурация «на замочке», этот путь закрыт.
  2. Изменение режима совместимости: Чтобы изменить режим совместимости основной конфигурации, необходимо зайти в «Конфигурация — Поддержка — Настройка поддержки» и нажать кнопку «Включить возможность изменения». Установите статус «Объект поставщика редактируется с сохранением поддержки». Это позволит изменить свойство «Режим совместимости», не теряя возможности автоматического обновления.
  3. Программный обход: Если менять режим совместимости нельзя, можно использовать реквизит с типом ХранилищеЗначения или Строка. В случае со строкой в ней можно сохранять УникальныйИдентификатор ссылки и восстанавливать ссылку программно при необходимости. Однако помните, что это сделает невозможным построение стандартных отчетов по этому полю через СКД.

Современные возможности (платформа 8.3.20 и выше)

Посмотрим на развитие механизмов расширений в актуальных версиях. Платформа версии 8.3.20 и выше принесла много долгожданных функций:

Таким образом, большинство проблем с расширениями решаются либо правильным выбором аннотаций в программном коде, либо корректной настройкой поддержки для изменения режима совместимости. Всегда стремитесь использовать актуальную версию платформы, так как возможности расширений в 1С развиваются очень динамично.

← На главную