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

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

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

В этой статье мы разберем по шагам все возможные методы решения данной задачи: от штатных средств платформы до «хакерских» методов обхода ограничений.

Метод 1. Настройка правил поддержки (Частичное снятие «замка»)

Это наиболее правильный и сбалансированный метод с точки зрения платформы 1С. Многие ошибочно полагают, что снятие «замка» означает полную потерю связи с вендором. На самом деле, система позволяет разрешить редактирование только конкретных объектов.

Разберем алгоритм действий:

  1. Откроем конфигурацию и перейдем в меню Конфигурация — Поддержка — Настройка поддержки.
  2. Нажмем кнопку Включить возможность изменения. В появившемся окне выберем вариант «Объект поставщика редактируется с сохранением поддержки». Важно: не выбирайте полную отмену поддержки!
  3. Найдем в дереве объектов нужную нам форму обработки или документа.
  4. Установим для этой конкретной формы правило Объект поставщика редактируется с сохранением поддержки.

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

Метод 2. Использование внешней обработки как «обертки»

Если вмешательство в основную конфигурацию категорически запрещено (например, из-за жестких условий аудита вендора), мы можем пойти путем создания внешней обработки. Рассмотрим, как реализовать подмену формы.

Сначала мы создаем внешнюю обработку (.epf), в которую копируем содержимое нужной нам формы и вносим необходимые правки. Чтобы система открывала нашу форму вместо стандартной, нам нужно найти «точку входа» в конфигурации. Если хотя бы один модуль (например, модуль приложения или общий модуль) доступен для редактирования, мы можем использовать перехват события открытия.

Пример кода для перехвата открытия в обычном приложении через процедуру ПриОткрытии (если есть доступ к модулю объекта):


Процедура ПриОткрытии(Отказ)
    // Проверяем, не открыта ли уже наша внешняя форма, чтобы избежать зацикливания
    Если Не ЭтаФорма.Свойство("ЭтоВнешняяМодификация") Тогда
        Отказ = Истина; // Отменяем открытие стандартной формы
        ПутьКФайлу = "C:\1C\MyForm.epf"; 
        ВнешняяОбработка = ВнешниеОбработки.Создать(ПутьКФайлу);
        ФормаОбъекта = ВнешняяОбработка.ПолучитьФорму("Форма", ЭтаФорма.Владелец);
        ФормаОбъекта.ОбъектОснование = ЭтаФорма.ЭтотОбъект; // Передаем данные
        ФормаОбъекта.Открыть();
    КонецЕсли;
КонецПроцедуры

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

Метод 3. Программная модификация формы через подписки на события

Выясним, можно ли изменить форму, не имея доступа к ее визуальному редактору и модулю. В 1С существуют Подписки на события. Хотя большинство подписок относятся к объектам данных (ПередЗаписью, ПриУстановкеНовогоНомера), для некоторых типов объектов (например, документов) в обычном приложении можно использовать общие механизмы.

Если вендор предусмотрел в коде вызов процедур из общих модулей при инициализации формы, мы можем изменить свойства элементов управления программно. Рассмотрим пример добавления кнопки на форму документа РеализацияТоваровУслуг программным способом:


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

Такой подход позволяет изменять интерфейс «на лету», не снимая замок с самой формы, если у нас есть возможность вызвать этот код из открытого общего модуля.

Метод 4. Работа с расширениями в режиме обычного приложения

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

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


&После("РассчитатьСуммуДокумента")
Процедура Расш1_РассчитатьСуммуДокумента(Параметры)
    // Наша логика, которая сработает после стандартной
    Сообщить("Сумма пересчитана расширением!");
КонецПроцедуры

Метод 5. Технический обход через внешние утилиты (v8unpack)

Проанализируем ситуацию, когда нужно внести изменения «тихо», не меняя правил поддержки в самой базе. Существует возможность модифицировать файл конфигурации (.cf) или файл внешней поставки (.cfu) вне среды 1С.

Используя утилиты типа v8unpack, разработчик может разложить файл конфигурации на составляющие (XML-описания, модули, изображения). В этих текстовых файлах можно вручную поменять координаты кнопок, текст надписей или код модулей, а затем собрать файл обратно. При загрузке такого файла в базу 1С будет считать, что объект все еще находится на поддержке («замок» визуально останется), но фактически код будет изменен.

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

Метод 6. Использование Native API и WinAPI

Для самых сложных случаев, когда форма закрыта, а интерфейс изменить нужно, можно использовать внешние компоненты. Поскольку обычные формы 1С базируются на стандартных дескрипторах Windows (HWND), мы можем написать компоненту на C++ или Delphi, которая найдет окно формы 1С и программно внедрит в него новые элементы или скроет существующие.

Разберем логику процесса:

  1. При открытии формы вызывается внешняя компонента.
  2. Компонента через WinAPI функцию FindWindowEx находит элементы управления 1С.
  3. Используя функцию ShowWindow(hWnd, SW_HIDE), скрываются ненужные элементы, либо через CreateWindow создаются новые.

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

Резюме и рекомендации

Подведем итог нашему анализу. Если вам необходимо модифицировать закрытую вендорскую форму:

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

← На главную