В практике разработчика 1С часто встречается ситуация, когда организация использует отраслевое или специализированное решение от стороннего вендора. Такие конфигурации обычно приходят «на замке» — с установленным запретом редактирования, чтобы гарантировать корректное обновление от поставщика. Однако бизнес-требования часто диктуют необходимость изменить интерфейс: добавить кнопку, скрыть лишние поля или изменить логику работы формы. Ситуация осложняется, если используются обычные формы, так как стандартный механизм расширений для них сильно ограничен.
В этой статье мы разберем по шагам все возможные методы решения данной задачи: от штатных средств платформы до «хакерских» методов обхода ограничений.
Это наиболее правильный и сбалансированный метод с точки зрения платформы 1С. Многие ошибочно полагают, что снятие «замка» означает полную потерю связи с вендором. На самом деле, система позволяет разрешить редактирование только конкретных объектов.
Разберем алгоритм действий:
После этого значок «замок» сменится на «кубик». Теперь мы можем редактировать форму. Проанализируем последствия: при выходе обновления от вендора платформа увидит, что объект изменен. Вам придется выполнить сравнение и объединение вручную для этого объекта, чтобы не затереть свои правки кодом поставщика. Это требует внимания программиста при каждом апдейте, но позволяет сохранить функциональность.
Если вмешательство в основную конфигурацию категорически запрещено (например, из-за жестких условий аудита вендора), мы можем пойти путем создания внешней обработки. Рассмотрим, как реализовать подмену формы.
Сначала мы создаем внешнюю обработку (.epf), в которую копируем содержимое нужной нам формы и вносим необходимые правки. Чтобы система открывала нашу форму вместо стандартной, нам нужно найти «точку входа» в конфигурации. Если хотя бы один модуль (например, модуль приложения или общий модуль) доступен для редактирования, мы можем использовать перехват события открытия.
Пример кода для перехвата открытия в обычном приложении через процедуру ПриОткрытии (если есть доступ к модулю объекта):
Процедура ПриОткрытии(Отказ)
// Проверяем, не открыта ли уже наша внешняя форма, чтобы избежать зацикливания
Если Не ЭтаФорма.Свойство("ЭтоВнешняяМодификация") Тогда
Отказ = Истина; // Отменяем открытие стандартной формы
ПутьКФайлу = "C:\1C\MyForm.epf";
ВнешняяОбработка = ВнешниеОбработки.Создать(ПутьКФайлу);
ФормаОбъекта = ВнешняяОбработка.ПолучитьФорму("Форма", ЭтаФорма.Владелец);
ФормаОбъекта.ОбъектОснование = ЭтаФорма.ЭтотОбъект; // Передаем данные
ФормаОбъекта.Открыть();
КонецЕсли;
КонецПроцедуры
Этот метод позволяет полностью изолировать изменения от основной конфигурации, упрощая процесс обновления базы.
Выясним, можно ли изменить форму, не имея доступа к ее визуальному редактору и модулю. В 1С существуют Подписки на события. Хотя большинство подписок относятся к объектам данных (ПередЗаписью, ПриУстановкеНовогоНомера), для некоторых типов объектов (например, документов) в обычном приложении можно использовать общие механизмы.
Если вендор предусмотрел в коде вызов процедур из общих модулей при инициализации формы, мы можем изменить свойства элементов управления программно. Рассмотрим пример добавления кнопки на форму документа РеализацияТоваровУслуг программным способом:
// В общем модуле, который доступен для редактирования
Процедура ДобавитьКнопкуНаФорму(Форма) Экспорт
НоваяКнопка = Форма.ЭлементыФормы.Добавить(Тип("Кнопка"), "КнопкаСпецДействие", Истина, Форма.ПанельОсновная);
НоваяКнопка.Заголовок = "Спец. действие";
НоваяКнопка.УстановитьДействие("Нажатие", Новый Действие("ОбработкаНажатияСпецКнопки"));
КонецПроцедуры
Такой подход позволяет изменять интерфейс «на лету», не снимая замок с самой формы, если у нас есть возможность вызвать этот код из открытого общего модуля.
Существует распространенное заблуждение, что расширения конфигурации бесполезны для обычных форм. Это не совсем так. Рассмотрим подробнее: хотя визуальный редактор обычных форм в расширениях не работает (вы не можете «заимствовать» обычную форму и перетащить на нее элементы), вы можете заимствовать Модуль объекта или Общий модуль.
Используя аннотации &После, &Вместо или &Перед, мы можем вмешаться в логику работы. Например, если в форме документа вызывается процедура модуля объекта для расчета цен, мы можем перехватить её и изменить поведение, что косвенно повлияет на отображение данных в форме.
&После("РассчитатьСуммуДокумента")
Процедура Расш1_РассчитатьСуммуДокумента(Параметры)
// Наша логика, которая сработает после стандартной
Сообщить("Сумма пересчитана расширением!");
КонецПроцедуры
Проанализируем ситуацию, когда нужно внести изменения «тихо», не меняя правил поддержки в самой базе. Существует возможность модифицировать файл конфигурации (.cf) или файл внешней поставки (.cfu) вне среды 1С.
Используя утилиты типа v8unpack, разработчик может разложить файл конфигурации на составляющие (XML-описания, модули, изображения). В этих текстовых файлах можно вручную поменять координаты кнопок, текст надписей или код модулей, а затем собрать файл обратно. При загрузке такого файла в базу 1С будет считать, что объект все еще находится на поддержке («замок» визуально останется), но фактически код будет изменен.
Внимание: это крайне опасный метод. Он нарушает целостность поставки и может привести к непредсказуемым ошибкам при попытке автоматического обновления. Мы рекомендуем использовать его только в исключительных случаях, когда иные методы недоступны.
Для самых сложных случаев, когда форма закрыта, а интерфейс изменить нужно, можно использовать внешние компоненты. Поскольку обычные формы 1С базируются на стандартных дескрипторах Windows (HWND), мы можем написать компоненту на C++ или Delphi, которая найдет окно формы 1С и программно внедрит в него новые элементы или скроет существующие.
Разберем логику процесса:
FindWindowEx находит элементы управления 1С.ShowWindow(hWnd, SW_HIDE), скрываются ненужные элементы, либо через CreateWindow создаются новые.Этот метод требует глубоких знаний системного программирования и практически не используется в типовых задачах, но он технически возможен.
Подведем итог нашему анализу. Если вам необходимо модифицировать закрытую вендорскую форму:
.cf (Метод 5) или WinAPI (Метод 6) прибегайте только в тех случаях, когда цена ошибки ниже, чем стоимость взаимодействия с вендором.Помните, что любые изменения в закрытой конфигурации накладывают на вас ответственность за последующую корректность обновлений. Всегда документируйте свои правки внутри кода комментариями, чтобы при сравнении версий через полгода вы могли быстро восстановить свою логику.