Как добавить функционал к форме обработки в 1С, не меняя конфигурацию напрямую и сохраняя возможность обновлений?

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

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

Представим ситуацию: у нас есть обработка, которая включена в конфигурацию. Ее разрабатывают и обновляют сторонние специалисты, руководствуясь своим техническим заданием. Наши же пользователи хотели бы внести небольшие изменения, например, добавить вопрос "Вы точно хотите закрыть окно и потерять нафиг 20 минут работы?" при нажатии клавиши Esc. Сохранить обработку в виде отдельного файла и дописать ее – не выход, так как при следующем обновлении конфигурации наши изменения будут утеряны. Как быть в такой ситуации?

Важное уточнение терминологии: "Внешняя" или "Включенная" обработка?

Прежде чем перейти к решению, давайте проясним один важный момент, который часто вызывает путаницу. Автор исходного вопроса использовал фразу "внешняя обработка, которая включена в конфигурацию". Это может ввести в заблуждение.

  1. Внешняя обработка (файл .epf): Это обработка, которая существует как отдельный файл на диске. Она не является частью конфигурации и запускается пользователем вручную (через "Файл - Открыть" или через специальные команды). Такую обработку можно свободно редактировать, но она не обновляется вместе с конфигурацией.
  2. Обработка, включенная в конфигурацию: Если обработка "включена в конфигурацию", это означает, что она является полноправным объектом метаданных конфигурации (как документ, справочник или отчет). Она хранится внутри файла базы данных (.dt) или .cf/.cfu и обновляется вместе со всей конфигурацией. Именно о такой ситуации идет речь в нашем случае. Если обработка является частью конфигурации, то к ней применимы все те же механизмы доработки, что и к другим объектам конфигурации.

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

Ключевое решение: Механизм расширений 1С

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

Преимущества использования расширений:

  1. Сохранение типовой поддержки: Главное преимущество. Основная конфигурация остается неизменной. Это значительно упрощает и ускоряет процесс ее обновления поставщиком, так как нет необходимости снимать конфигурацию с поддержки или объединять изменения.
  2. Раздельная разработка: Все наши доработки оформляются в виде отдельной "микроконфигурации" — файла расширения, который подключается к основной конфигурации. Это позволяет четко отделить типовой функционал от наших модификаций.
  3. Точечные изменения: Расширения дают возможность модифицировать только необходимые нам части существующих объектов (формы, модули, реквизиты, команды) или даже добавлять совершенно новые объекты, не затрагивая всю конфигурацию.
  4. Гибкость: Мы можем применять несколько расширений к одной конфигурации, и они будут действовать последовательно. Это удобно для разделения функционала по логическим блокам или для применения различных доработок разными командами.

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

Пошаговая реализация с использованием расширений

Давайте разберем, как именно мы можем добавить вопрос при закрытии формы обработки, используя расширения.

1. Создание нового расширения

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

  1. Запустите 1С:Предприятие в режиме "Конфигуратор".
  2. Откройте основную конфигурацию.
  3. Перейдите в меню Конфигурация -> Расширения конфигурации.
  4. В открывшемся окне нажмите кнопку Добавить (зеленый плюс).
  5. Присвойте расширению осмысленное имя, например, "МоиДоработкиОбработки". Укажите, что оно может использоваться в режиме совместимости с более старыми версиями платформы, если это необходимо. Убедитесь, что расширение Активно.
  6. При необходимости можно установить Приоритет расширения. Если у вас несколько расширений, платформа применяет их в порядке возрастания приоритета.
  7. Закройте окно "Расширения конфигурации". Теперь в дереве конфигурации появится новая ветка Расширения.

2. Заимствование обработки и ее формы

Для того чтобы модифицировать форму обработки, нам необходимо "заимствовать" ее в наше расширение. Это не копирование объекта, а создание ссылки на него в расширении, которая позволяет нам вносить изменения, не затрагивая оригинал.

  1. Разверните ветку Расширения -> ВашеРасширение -> Общие и найдите ветку Обработки.
  2. Найдите в основной конфигурации необходимую обработку (например, "МояВажнаяОбработка") в ветке Обработки.
  3. Правой кнопкой мыши нажмите на эту обработку и выберите пункт Добавить в расширение -> ВашеРасширение.
  4. После добавления обработка появится в дереве метаданных вашего расширения.
  5. Теперь нам нужно заимствовать ее форму. Разверните заимствованную обработку в расширении, найдите нужную форму (обычно это "ФормаОбъекта" или "ОсновнаяФорма") в ветке Формы.
  6. Правой кнопкой мыши нажмите на нужную форму и выберите пункт Добавить в расширение -> ВашеРасширение.
  7. Форма будет заимствована в расширение. Теперь мы можем ее модифицировать.

Обратите внимание, что мы заимствуем только те объекты, которые планируем изменять. В данном случае это сама обработка (как контейнер для формы) и конкретная форма этой обработки.

3. Модификация модуля формы для добавления нового функционала

Теперь, когда форма обработки находится в нашем расширении, мы можем открыть ее модуль и добавить необходимую логику. Наша задача — добавить вопрос при закрытии формы. Для этого мы будем использовать событие формы ПередЗакрытием.

Событие ПередЗакрытием вызывается платформой перед тем, как форма будет закрыта. Оно имеет параметр Отказ, который мы можем установить в Истина, чтобы отменить закрытие формы. Также есть параметр СтандартнаяОбработка, который позволяет управлять вызовом стандартного обработчика (если он есть). Для добавления нашего вопроса мы используем аннотацию &Перед.

Аннотации &Перед, &После, &Вместо:

В нашем случае, если мы хотим добавить вопрос ДО того, как форма закроется, и, возможно, предотвратить ее закрытие, нам идеально подходит &Перед.

  1. Откройте заимствованную форму в расширении.
  2. Перейдите на вкладку Модуль.
  3. Добавьте следующий код в модуль формы:

// В модуле формы, заимствованной в расширение,
// мы можем добавить обработчик события ПередЗакрытием.
// Если в базовой конфигурации уже есть процедура ПередЗакрытием,
// мы можем перехватить ее с помощью аннотации &Перед,
// чтобы добавить нашу логику до выполнения типовой.

&Перед("ПередЗакрытием")
Процедура ПередЗакрытиемРасширение(Отказ, СтандартнаяОбработка)
    // Этот код будет выполнен перед тем, как будет вызван типовой обработчик
    // ПередЗакрытием (если он есть) и перед закрытием формы.
    // Нажатие Esc часто приводит к вызову события ПередЗакрытием формы.

    // Выводим диалог с вопросом
    Ответ = Вопрос("Вы точно хотите закрыть окно и потерять нафиг 20 минут работы?", РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет);

    // Если пользователь ответил "Нет", то отменяем закрытие формы
    Если Ответ = КодВозвратаДиалога.Нет Тогда
        Отказ = Истина;             // Устанавливаем Отказ в Истина, чтобы предотвратить закрытие формы
        СтандартнаяОбработка = Ложь; // Подавляем вызов оригинального обработчика ПередЗакрытием
                                    // (если он существует), так как мы уже приняли решение.
    КонецЕсли;

    // Если Отказ не установлен в Истина, форма продолжит закрываться,
    // и, если СтандартнаяОбработка не Ложь, будет вызван типовой обработчик ПередЗакрытием.
КонецПроцедуры

Пояснения к коду:

4. Подключение и настройка расширения

После того как мы внесли все необходимые изменения в расширение, нам необходимо убедиться, что оно корректно подключено к базе данных и активно.

  1. Сохраните изменения в расширении (через меню Конфигурация -> Сохранить конфигурацию или Файл -> Сохранить, если это отдельное окно расширения).
  2. Закройте Конфигуратор.
  3. Запустите 1С:Предприятие в пользовательском режиме. Расширение должно автоматически подключиться.
  4. Для проверки корректности подключения, снова откройте Конфигуратор, перейдите в Конфигурация -> Расширения конфигурации. Убедитесь, что ваше расширение активно и не содержит ошибок.
  5. Проверьте работу вашей доработки в пользовательском режиме: откройте обработку и попробуйте закрыть ее, в том числе нажатием клавиши Esc. Вы должны увидеть ваш диалог.

Типы расширений по назначению

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

  1. Исправление (патч): Этот тип расширений предназначен для срочного устранения ошибок в типовой конфигурации. Он имеет наивысший приоритет и применяется первым.
  2. Адаптация: Используется для доработки типового функционала под нужды конкретного клиента, как в нашем случае. Цель — адаптировать стандартные решения к специфическим бизнес-процессам.
  3. Дополнение: Предназначено для создания абсолютно нового функционала, который не затрагивает типовые объекты конфигурации, а лишь добавляет свои собственные (новые отчеты, обработки, справочники и т.д.). Этот тип имеет наименьший приоритет.

В нашем случае добавление вопроса при закрытии формы является примером Адаптации.

Потенциальные сложности и важные рекомендации

Хотя расширения являются мощным инструментом, их использование требует внимательности и соблюдения определенных правил, чтобы избежать проблем в будущем. Об этом нас предупреждали и коллеги на форуме.

  1. Конфликты при обновлении: При обновлении основной конфигурации могут возникнуть конфликты, если поставщик изменил те же объекты или методы, которые доработаны в вашем расширении. Это особенно актуально для аннотации &Вместо, которая полностью заменяет типовую логику. Если типовая логика сильно изменится, ваше &Вместо может оказаться неактуальным или привести к ошибкам. Аннотации &Перед и &После менее конфликтны, но также требуют контроля.
  2. Обновление заимствованных форм: Если расширяемая форма существенно изменилась после обновления основной конфигурации (например, добавлены новые реквизиты, элементы управления или изменена структура), вам, возможно, потребуется обновить эту форму в расширении. Для этого в конфигураторе на заимствованной форме в расширении нужно выбрать Обновить из конфигурации. Это перенесет изменения поставщика, но сохранит ваши доработки.
  3. "Двойное" или "тройное" выполнение: Если вы используете аннотации &Перед или &После без должного понимания, как они взаимодействуют с типовым кодом, существует риск, что некие важные действия, которые разработчики основной конфигурации делают при закрытии формы, будут выполняться дважды или трижды. Всегда анализируйте типовой код, чтобы понять, что он делает, и как ваша доработка в него встроится.
  4. Множественные расширения: Не рекомендуется создавать отдельное расширение для каждого чиха. Лучше объединять доработки по функциональности в логически связанные расширения. Старайтесь делать расширения максимально независимыми друг от друга, чтобы минимизировать риски конфликтов.
  5. Ограничения платформы: Расширения могут быть несовместимы с базовыми версиями 1С:Предприятия (требуется версия ПРОФ или выше). Также существуют некоторые исключения: определенные объекты или их свойства нельзя использовать в расширениях. Например, удаление команд из заимствованной формы через расширение не допускается. Всегда проверяйте документацию к вашей версии платформы.
  6. Анализ перед обновлением: Перед обновлением платформы 1С или основной конфигурации критически важно проанализировать все установленные расширения на предмет актуальности и совместимости. Выделяйте время на тестирование доработанного функционала после каждого обновления.
  7. Минимизация заимствованных объектов: В расширение следует добавлять только те объекты, которые действительно требуют изменений. Не заимствуйте всю обработку или все ее формы, если вам нужно изменить только одну кнопку на одной форме. Это упрощает поиск доработок и уменьшает вероятность ложного срабатывания контроля изменений.
  8. Организационные вопросы: Как было отмечено в форуме, идеальный подход – это обсуждение пожеланий пользователей с разработчиками основной конфигурации и включение их в техническое задание. Это минимизирует риски возникновения "костылей", конфликтов и неразберихи. Если есть разработчики, ТЗ и пожелания пользователей, то либо эти пожелания учитываются, либо пользователи информируются о причинах отказа. Иначе бардак неминуем, и при очередном обновлении "костыль отвалится".
  9. Проблема противоречивых пожеланий пользователей: Разные пользователи могут иметь разные требования (один хочет вопрос при закрытии, другой нет, третий хочет автоматическое нажатие "да"). Расширения могут помочь в настройке для разных групп пользователей (путем создания разных профилей или ролей, которые активируют разные расширения или функционал внутри них), но это усложняет логику.

Заключение

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

← На главную