Программно-ориентированный подход: почти бесшовное расширение типовой конфигурации
В этой статье мы рассмотрим техническую реализацию функции «Удалить документы (КБФИТ)» в программном продукте «Дополнение КБФИТ для ДГУ» — на примере того, как можно расширять функциональность типовой конфигурации, не изменяя её объекты и формы.
В системе документооборота медицинского сектора часто возникает потребность в дополнительных функциях, которых нет в типовой конфигурации. Классический подход — доработка конфигурации «в лоб» — приводит к проблемам при обновлениях, конфликтам версий и усложнению поддержки. Альтернативный путь — использование механизма расширений — позволяет изолировать доработки, но требует переноса форм, макетов и других объектов в расширение.
КБФИТ пошла ещё дальше в новом продукте «Дополнение КБФИТ для ДГУ»: мы реализовали программно-ориентированный подход, при котором функциональность добавляется исключительно через код, без заимствования форм и объектов. Это позволяет минимизировать влияние на типовую конфигурацию и даёт максимальную гибкость при обновлениях.
О продукте «Дополнение КБФИТ для ДГУ»
Программный продукт «Дополнение КБФИТ для ДГУ» предназначен для расширения функциональных возможностей «1С:Документооборот государственного учреждения 8» и применения в экосистеме продуктов от ООО «КБФИТ». Продукт распространяется на условиях «Открытой лицензии на продукты КБФИТ» и доступен для организаций, имеющих действующую подписку формата ИТС (ПРОФ), например, «КБФИТ: ИТС (ПРОФ-Медицина)».
Продукт включает в себя набор расширений и общих модулей, реализующих дополнительные функции для работы с документами: контролируемое удаление, управление регистрационными номерами, интеграционные сценарии через API (для применения возможностей АЙКИНЫ).
Что делает функция «Удалить документы (КБФИТ)»
В рамках продукта мы реализовали функцию, которая добавляет на форму списка справочника «Документы предприятия» новую команду — «Удалить документы (КБФИТ)». Эта команда выполняет комплекс операций с выделенными документами:
- Проверяет права пользователя на удаление документа: возможность удалять подобного типа документы, соответствие ответственного за документ текущему пользователю, соблюдение даты запрета удаления.
- Прерывает обработку документа — автоматически завершает все активные процессы согласования, связанные с документом.
- Формирует новый регистрационный номер с префиксом «удл_»: выполняет поиск свободного номера, проверяет его уникальность и присваивает документу.
- Помечает документ на удаление с сохранением его в базе данных до операции физического удаления.
При этом все действия выполняются в рамках одного вызова, с отображением прогресса обработки для каждого документа.
Назначение метода
В повседневной работе с документооборотом иногда возникает ситуация, когда в уже запущенных в работу документах обнаруживаются ошибки (например, неверно указана должность ответственного или некорректно заполнены реквизиты). Чтобы исправить такую ошибку, обычно требуется пройти длительный путь: прервать согласование, удалить его, и сбросить регистрационный номер. Это занимает много времени и повышает риск появления новых ошибок.
Функция «Удалить документы (КБФИТ)» решает эту проблему одним действием: пользователь выделяет ошибочные документы, нажимает кнопку, и система автоматически прерывает все процессы, присваивает документу новый регистрационный номер с префиксом «удл_» и помечает его на удаление. После этого можно создать корректный документ и запустить его в работу.
Архитектура решения: программно-ориентированный подход
В основе подхода лежит набор общих модулей расширения, которые взаимодействуют с типовой конфигурацией «1С:ДГУ» через стандартные точки расширения БСП (библиотека стандартных подсистем от фирмы 1С) — переопределяемые процедуры и обработчики событий. Рассмотрим состав модулей.
Данный подход имеет одно существенное условие — наличие в составе основной конфигурации БСП. Если библиотека стандартных подсистем отсутствует, то предложенный метод расширения неприменим, так как именно БСП предоставляет механизмы подключаемых команд и переопределяемых модулей.
Типовые модули «1С:ДГУ» (используются как точки входа)
Для реализации программно-ориентированного расширения мы используем два стандартных модуля конфигурации «1С:ДГУ», которые предоставляют точки входа для внедрения нашего кода. Эти модули являются частью БСП и предназначены именно для расширения функциональности без изменения типовых объектов.
| Модуль | Назначение |
|---|---|
| ПодключаемыеКоманды | Стандартный модуль формы, содержащий обработчик &После("ПриСозданииНаСервере"). Используется для инициализации формы при её создании. |
| ПодключаемыеКомандыПереопределяемый | Стандартный модуль-переопределяемый, содержащий обработчики &После("ПриОпределенииКомандПодключенныхКОбъекту") и &После("ПриОпределенииВидовПодключаемыхКоманд"). Используется для добавления новых команд и видов команд в интерфейс. |
Таблица 1. Типовые модули «1С:ДГУ», используемые как точки входа
Собственные модули расширения КБФИТ
Поверх типовых модулей мы создаём три собственных общих модуля, которые содержат всю логику расширения. Каждый модуль имеет строгое назначение и набор признаков, определяющих контекст выполнения.
- КБФИТ_МодификацияФормВызовСервера — серверный общий модуль (признаки: «Сервер», «Вызов сервера»), содержащий процедуры для модификации форм. Включает:
ПроинициализироватьФорму()— определяет имя формы и вызывает специализированную обработку.ПроинициализироватьФорму_ПриОпределенииКоманд()— добавляет команды в интерфейс формы.<ИмяОбъекта>_<ИмяФормы>()— перемещает элементы управления в нужные позиции (например,ДокументыПредприятия_ФормаСпискаСПапками).<ИмяОбъекта>_<ИмяФормы>_ПриОпределенииКоманд()— настраивает новую команду (например,ДокументыПредприятия_ФормаСпискаСПапками_ПриОпределенииКоманд).
- КБФИТ_МетодыМодифицированныхФормКлиент — клиентский общий модуль (признак: «Клиент»), содержащий процедуры самих методов, которые выполняются на клиенте. Включает:
- Блок
Методы_<ТипОбъекта>(например,Методы_ДокументыПредприятия). КБФИТ_УдалитьДокументы()— клиентская обёртка для удаления документов, отображает прогресс, вызывает серверный метод.
- Блок
- КБФИТ_МетодыМодифицированныхФормВызовСервера — серверный общий модуль (признаки: «Сервер», «Вызов сервера»), содержащий серверные процедуры самих методов. Включает:
- Блок
Методы_<ТипОбъекта>(например,Методы_ДокументыПредприятия). Док_УдалитьИПрерватьДокументПредприятия()— серверная логика удаления документа: проверка прав, прерывание согласования, генерация номера, пометка на удаление.
- Блок
При этом для разработки можно и не иметь полноценную конфигурацию. В нашем случае для разработки используется конфигурация-пустышка. В неё добавлены только необходимые объекты — без структур реквизитов, процедур и функций типового решения. По сути, от типового решения там только идентификаторы объектов метаданных. Это позволяет разрабатывать расширение независимо от основной конфигурации.
Использовать расширение «Дополнение КБФИТ для ДГУ» в отрыве от «1С:Документооборот государственного учреждения 8» не получится. Расширение разработано именно для этой конфигурации и использует её объектную модель.
Как это работает «под капотом»
Рассмотрим последовательность действий, которая происходит при нажатии на кнопку «Удалить документы (КБФИТ)».
Шаг 1. Добавление вида команд «КБФИТ_Действия» — в модуле ПодключаемыеКомандыПереопределяемый в обработчике &После(«ПриОпределенииВидовПодключаемыхКоманд») выполняется код:
Процедура КБФИТ_ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд)
// Проверка на наличие записи
НайденныеСтроки = ВидыПодключаемыхКоманд.НайтиСтроки(Новый Структура("Имя", "КБФИТ_Действия"));
Если Не НайденныеСтроки.Количество() = 0 Тогда
Возврат
КонецЕсли;
// Добавление строки
НовСтрока = ВидыПодключаемыхКоманд.Добавить();
НовСтрока.Заголовок = "КБФИТ";
НовСтрока.Имя = "КБФИТ_Действия";
НовСтрока.ИмяПодменю = "ПодменюКБФИТ_Действия";
НовСтрока.Картинка = БиблиотекаКартинок.КБФИТ_ВыполнитьДействие_16;
НовСтрока.Отображение = ОтображениеКнопки.КартинкаИТекст;
НовСтрока.Порядок = 10;
КонецПроцедуры
Данный код регистрирует новый вид команд в системе, создавая подменю «КБФИТ» в интерфейсе пользователя. Вид команд — это группа, в которой будут отображаться все команды, добавленные нашим расширением. Проверка на наличие записи гарантирует, что подменю будет создано только один раз, даже если обработчик будет вызван несколько раз.
Шаг 2. Определение команды для формы списка — в модуле КБФИТ_МодификацияФормВызовСервера в процедуре ДокументыПредприятия_ФормаСпискаСПапками_ПриОпределенииКоманд добавляется новая команда:
НовКоманда = Команды.Добавить();
НовКоманда.Вид = "КБФИТ_Действия";
НовКоманда.Идентификатор = "КБФИТ_УдалитьДокументы";
НовКоманда.Представление = НСтр("ru = 'Удалить документы (КБФИТ)'");
НовКоманда.Порядок = 1;
НовКоманда.Картинка = БиблиотекаКартинок.Удалить;
НовКоманда.МножественныйВыбор = Истина;
НовКоманда.РежимЗаписи = "НеЗаписывать";
НовКоманда.Обработчик = "КБФИТ_МетодыМодифицированныхФормКлиент.КБФИТ_УдалитьДокументы";
Обратите внимание на ключевые настройки:
Вид = "КБФИТ_Действия"— команда попадает в подменю «КБФИТ».МножественныйВыбор = Истина— поддерживает обработку нескольких документов одновременно.РежимЗаписи = "НеЗаписывать"— объект не записывается, в обработчик передаётся форма.Обработчик = "КБФИТ_МетодыМодифицированныхФормКлиент.КБФИТ_УдалитьДокументы"— клиентская процедура, которая будет вызвана при нажатии.
Шаг 3. Реорганизация элементов формы — в процедуре ДокументыПредприятия_ФормаСпискаСПапками происходит перемещение элементов управления в нужные позиции:
// Перемещение меню «ПодменюКБФИТ_Действия»
ЭЛ_Что = Форма.Элементы.Найти("ПодменюКБФИТ_Действия");
ЭЛ_Куда = Форма.Элементы.Найти("ГруппаВажныеКоманды");
Если Не ЭЛ_Что = Неопределено И Не ЭЛ_Куда = Неопределено Тогда
Форма.Элементы.Переместить(ЭЛ_Что, ЭЛ_Куда, ЭЛ_ПередЧем);
КонецЕсли;
Этот код находит созданное подменю и перемещает его в группу «Важные команды», обеспечивая удобный доступ к функциональности. Проверка на Неопределено защищает от ошибок, если по какой-то причине элементы не были созданы.
Шаг 4. Клиентская обработка — При нажатии на команду вызывается клиентская процедура КБФИТ_УдалитьДокументы из модуля КБФИТ_МетодыМодифицированныхФормКлиент. Она:
- Проверяет, что передан массив документов.
- Для каждого документа последовательно вызывает серверную процедуру
Док_УдалитьИПрерватьДокументПредприятия. - Отображает прогресс обработки через
Состояние(). - В случае ошибки — выводит предупреждение и останавливает обработку.
- После завершения — обновляет список документов.
Шаг 5. Серверная логика удаления — серверная процедура Док_УдалитьИПрерватьДокументПредприятия выполняет основную работу:
- Включает привилегированный режим для выполнения операций.
- Получает данные о документе: ответственный, вид документа, дата регистрации.
- Проверяет права пользователя через вызов
ПользователюДоступноУдалениеСвоихДокументов(). - Ищет активную обработку документа и прерывает её с указанием причины.
- Помечает документ на удаление и генерирует новый регистрационный номер с префиксом «удл_»:
- Определяет начальный номер удаления (из текущего номера или 0).
- В цикле проверяет уникальность номера через запрос к справочнику.
- При нахождении свободного номера — присваивает его документу.
- Записывает изменения в документ.
- При возникновении ошибки — устанавливает код
ДГУ_д0003и формирует описание.
В решениях от КБФИТ мы ведем реестр ошибок — предоставляя возможность пользователю ознакомиться с описанием решения возникшей проблемы и перейти к связанным материалам портала mederp.ru
Преимущества и ограничения подхода
Программно-ориентированный подход, реализованный в «Дополнении КБФИТ для ДГУ», имеет свои сильные стороны и особенности.
Преимущества:
- Минимальное вмешательство в типовую конфигурацию: не требуется заимствование форм, макетов, справочников и документов в расширение. Все изменения выполняются программно через стандартные точки расширения.
- Устойчивость к обновлениям: поскольку формы и объекты остаются типовыми, обновление «1С:ДГУ» с меньшей вероятностью приведёт к конфликтам. Расширение работает с текущей структурой формы, адаптируясь к изменениям.
- Гибкость размещения элементов: команды и кнопки можно размещать в любых группах формы, перемещая их программно, без правки формы.
- Чистота кода: вся логика сосредоточена в общих модулях расширения, что упрощает анализ, отладку и модификацию.
- Скорость разработки: отсутствие необходимости переносить формы и объекты в расширение сокращает время на разработку и настройку.
Ограничения и требования:
- Повышенные требования к квалификации разработчика: для реализации функциональности требуется глубокое знание архитектуры «1С:ДГУ», стандартных точек расширения, работы с формами и элементами управления через код.
- Зависимость от стабильности структуры: при кардинальном изменении архитектуры решения (например, полной перестройке функциональности) потребуется адаптация кода расширения.
- Отсутствие визуального редактора: вся работа по размещению элементов выполняется программно, что требует больше времени на разработку по сравнению с визуальным редактированием.
Для разработки подобных расширений мы рекомендуем привлекать специалистов, прошедших сертификацию от КБФИТ и получивших документ о подтверждении знаний «КБФИТ: Разработчик». Более подробно о сертификации можно ознакомиться здесь: Сертификация специалистов партнёров КБФИТ.
Ниже представлен пошаговый чек-лист для реализации программно-ориентированного подхода, применённого в «Дополнении КБФИТ для ДГУ». Чек-лист поможет систематизировать действия при создании собственных расширений.
Данный чек-лист составлен на основе реального опыта разработки продукта «Дополнение КБФИТ для ДГУ» и может использоваться как методическое руководство для разработчиков расширений.
| № | Действие | Отметка |
|---|---|---|
| 1. | Модуль «ПодключаемыеКоманды» типовой конфигурации включен в расширение | ☐ |
| 1.1. | Добавлена процедура "ПриСозданииНаСервере" с директивой &После |
☐ |
| 1.2. | В тексте модуля добавлен вызов инициализации формы: КБФИТ_МодификацияФормВызовСервера.ПроинициализироватьФорму(Форма) |
☐ |
| 2. | Модуль «ПодключаемыеКомандыПереопределяемый» типовой конфигурации включен в расширение | ☐ |
| 2.1. | Добавлен обработчик определения команд с директивой &После("ПриОпределенииКомандПодключенныхКОбъекту") |
☐ |
| 2.2. | В тексте обработчика добавлен вызов КБФИТ_МодификацияФормВызовСервера.ПроинициализироватьФорму_ПриОпределенииКоманд() |
☐ |
| 2.3. | Добавлен обработчик определения видов команд с директивой &После("ПриОпределенииВидовПодключаемыхКоманд") |
☐ |
| 2.4. | В обработчике видов команд зарегистрирован новый вид "КБФИТ_Действия" с созданием подменю |
☐ |
| 3. | Создан общий модуль «КБФИТ_МодификацияФормВызовСервера» с признаками «Сервер» и «Вызов сервера» | ☐ |
| 3.1. | В блоке #Область ПрограммныйИнтерфейс добавлены процедуры ПроинициализироватьФорму() и ПроинициализироватьФорму_ПриОпределенииКоманд() |
☐ |
| 3.2. | Добавлена область #Область Обработчики_<ИмяОбъекта> для группировки процедур по объектам |
☐ |
| 3.3. | Добавлена процедура инициализации размещения элементов: <ИмяОбъекта>_<ИмяФормы>() |
☐ |
| 3.4. | Добавлена процедура определения команд: <ИмяОбъекта>_<ИмяФормы>_ПриОпределенииКоманд() |
☐ |
| 4. | Создан общий модуль «КБФИТ_МетодыМодифицированныхФормКлиент» с признаком «Клиент» | ☐ |
| 4.1. | Добавлена область #Область Методы_<ТипОбъекта> |
☐ |
| 4.2. | Добавлена клиентская процедура-обработчик: <Префикс>_<Действие>() |
☐ |
| 5. | Создан общий модуль «КБФИТ_МетодыМодифицированныхФормВызовСервера» с признаками «Сервер» и «Вызов сервера» | ☐ |
| 5.1. | Добавлена область #Область Методы_<ТипОбъекта> |
☐ |
| 5.2. | Добавлена серверная процедура: <Префикс>_<Действие><ТипОбъекта>() с реализацией бизнес-логики |
☐ |
| 6. | Проверка работоспособности расширения | ☐ |
| 6.1. | В интерфейсе появилось подменю «КБФИТ» в группе «Важные команды» | ☐ |
| 6.2. | Команда «Удалить документы (КБФИТ)» отображается в подменю | ☐ |
| 6.3. | При выделении документов и нажатии команды выполняется обработка | ☐ |
| 6.4. | Обработка ошибок работает корректно (вывод предупреждений) | ☐ |
Общая схема взаимодействия модулей
На схеме ниже наглядно представлена архитектура взаимодействия типовых модулей «1С:ДГУ» и модулей расширения КБФИТ. Схема показывает, как вызовы проходят от пользовательского интерфейса через клиентские обработчики к серверной логике, и какие модули на каждом этапе задействованы.

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




