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