При обновлении крупных типовых решений, таких как 1С:ERP Управление предприятием, Комплексная автоматизация или Управление торговлей, разработчики часто сталкиваются с ситуацией, когда необходимо обновить только логику (код) формы, сохранив при этом уникальные изменения в её интерфейсе. Стандартное объединение объектов целиком часто приводит к потере пользовательских полей, кнопок или измененной структуры закладок, что вынуждает программиста тратить часы на ручное восстановление визуальной части.
В этой статье мы подробно разберем, как использовать встроенные механизмы платформы 1С:Предприятие 8.3 для селективного обновления, а также рассмотрим альтернативные стратегии минимизации конфликтов при обновлении.
Разберем самый простой и быстрый способ, который часто упускают из виду из-за невнимательности при анализе дерева объектов. В окне сравнения и объединения конфигураций каждый объект типа Форма не является неделимым элементом.
Проанализируем шаги, которые необходимо выполнить:
ФормаЭлемента справочника Номенклатура).Таким образом, платформа заменит текст модуля на новый из обновления, но не тронет XML-описание элементов управления, которое отвечает за расположение кнопок и полей на экране.
Рассмотрим ситуацию, когда изменений слишком много, и ручное проставление флажков для каждой формы занимает много времени. Мы можем воспользоваться автоматизированными правилами. Для этого в окне сравнения нажмем на иконку шестеренки (Параметры объединения).
Выясним, какие настройки будут полезны:
Важно помнить, что режим объединения по умолчанию для всей конфигурации может быть опасен, поэтому лучше применять настройки к конкретным веткам метаданных.
Современные версии платформы предоставляют еще более глубокий контроль. Если мы дважды кликнем по строке с формой в окне объединения, откроется специализированное окно визуального сравнения форм. Проанализируем его структуру:
В левой части отображается дерево элементов, реквизитов и команд. Платформа подсвечивает цветом, какие именно элементы были добавлены, удалены или изменены. Мы можем точечно выбрать перенос только одной новой кнопки, добавленной разработчиками «1С», сохранив при этом все свои изменения в остальных группах формы. Это избавляет от необходимости выбирать между «обновить всё» или «не обновлять ничего».
Посмотрим на проблему с другой стороны. Чтобы при обновлении вообще не возникало вопроса о сохранении элементов формы, рекомендуется переносить все доработки в Расширения конфигурации. Это наиболее современный и правильный подход.
Как это работает для модулей и элементов:
&Перед, &После или &Вместо.Пример кода в расширении для добавления логики при открытии формы:
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Добавляем программно элемент, если не хотим менять визуальную схему
НовыйЭлемент = Элементы.Добавить("МояСлужебнаяКнопка", Тип("КнопкаФормы"), Элементы.ГруппаКоманднаяПанель);
НовыйЭлемент.Заголовок = "Дополнительное действие";
НовыйЭлемент.ИмяКоманды = "МояКоманда";
КонецПроцедуры
Разберем ситуацию, когда использование расширений по каким-то причинам ограничено. Опытные разработчики часто прибегают к программному созданию элементов управления в коде модуля формы. Это гарантирует, что даже если «1С» полностью перерисует форму в новом релизе, ваши элементы появятся на ней автоматически, так как код создания выполнится в момент открытия.
Рассмотрим пример программного создания поля ввода:
&НаСервере
Процедура ДобавитьПолеПрограммно()
ИмяРеквизита = "ДополнительнаяИнформация";
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(Новый РеквизитФормы(ИмяРеквизита, Новый ОписаниеТипов("Строка"), , "Инфо", Истина));
ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов);
НовыйЭлемент = Элементы.Добавить("ПолеИнфо", Тип("ПолеФормы"), ЭтаФорма);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = ИмяРеквизита;
КонецПроцедуры
Хотя этот метод кажется трудоемким («гланды через задницу», как выразился один из участников обсуждения), он обеспечивает максимальную выживаемость доработок при агрессивных обновлениях поставщика.
Выясним важный нюанс: что произойдет, если мы обновим модуль, но оставим старую визуальную часть формы? Основная опасность заключается в обработчиках событий.
Представим ситуацию:
ПриИзмененииНоменклатуры() в НоменклатураПриИзменении().ПриИзмененииНоменклатуры).Результатом будет ошибка времени выполнения: «Процедура не найдена». Поэтому, если вы практикуете раздельное объединение, всегда проверяйте вкладку «События» у ключевых элементов формы после завершения процесса.
Для эффективного обновления 1С:Предприятие 8.3 придерживайтесь следующих правил:
Применяя эти подходы, вы значительно сократите время на техническую поддержку ваших конфигураций и снизите риск возникновения ошибок «человеческого фактора» при ручном переносе кода.