Как создать новый документ в расширении на основе существующего

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

В практике разработки на платформе 1С:Предприятие 8.3 часто возникает задача создания нового документа, который по своей структуре и логике почти полностью повторяет уже существующий в основной конфигурации. Разберем, как сделать это правильно, используя механизм расширений, и какие подводные камни нас ожидают при разных подходах.

Метод 1. Копирование существующего объекта (Copy-Paste)

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

Проанализируем основные сложности этого метода:

  1. Проблема самоссылок: Если в исходном документе были реквизиты, ссылающиеся на тип самого документа (например, ДокументОснование с типом ДокументСсылка.ИсходныйДокумент), то после копирования в расширение эти реквизиты продолжат ссылаться на старый тип. Нам необходимо вручную пересмотреть все реквизиты и изменить их типы на ДокументСсылка.НовоеИмяИзРасширения.
  2. Обработчики событий: При копировании форм переносятся и привязки к событиям. Если в модуле формы нового документа остались вызовы процедур из модуля менеджера или модуля объекта, которые не были перенесены или адаптированы под новое имя, система выдаст ошибку. Нам придется проверить каждый обработчик: ПриСозданииНаСервере, ПередЗаписью, ОбработкаПроверкиЗаполнения и другие.
  3. Уникальные идентификаторы (GUID): У скопированного объекта будет новый внутренний идентификатор. Это означает, что любые механизмы, завязанные на жесткое сравнение типов в коде, перестанут работать для нового документа, пока мы их не адаптируем.

Метод 2. Модификация существующего документа вместо создания нового

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

Выясним, какие преимущества это дает:

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


Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    Если Данные.ЭтоНовыйВидДокумента Тогда
        Представление = "Новый тип: " + Данные.Номер + " от " + Формат(Данные.Дата, "ДЛФ=D");
        СтандартнаяОбработка = Ложь;
    КонецЕсли;
КонецПроцедуры

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

Метод 3. Использование регистров сведений для доп. данных

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

Проанализируем безопасный путь: если нам нужно лишь несколько новых полей, мы можем создать в расширении Регистр сведений. В качестве измерения укажем ссылку на основной документ, а в ресурсах — наши новые реквизиты. На формах документа в расширении мы просто будем программно выводить эти данные, читая и записывая их при работе с документом. Это гарантирует сохранность данных даже при временном отключении расширения.

Технические нюансы работы с расширениями

Если мы все же решили создавать новый объект в расширении, разберем критически важные моменты, которые часто упускают:

  1. Структура подчиненности: Чтобы новый документ отображался в типовом отчете «Структура подчиненности», его нужно включить в критерий отбора (обычно это СвязанныеДокументы). В расширении мы можем расширить состав этого критерия, добавив туда наш новый документ.
  2. Журналы документов: Важно помнить, что мы не можем добавить новый документ из расширения в существующий журнал документов основной конфигурации. Если нам нужен общий список, придется создавать новый журнал в самом расширении или использовать динамический список с произвольным запросом ОБЪЕДИНИТЬ ВСЕ.
  3. Права доступа: Новые объекты расширения не видны пользователям автоматически. Нам необходимо создать в расширении свою Роль, дать ей права на чтение/просмотр/редактирование нового документа и назначить эту роль пользователям через профили групп доступа.
  4. Нумерация: Стандартные механизмы нумерации у разных метаданных разделены. Если требуется сквозная нумерация с прототипом, ее нужно реализовывать программно в событии ПриУстановкеНовогоНомера модуля объекта.

Безопасное удаление реквизитов

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

Подводя итог, можно сказать: если логика документов совпадает более чем на 80-90%, лучше использовать модификацию существующего объекта (Метод 2). Если же документы должны жить абсолютно разной жизнью, имеют разные права доступа и бизнес-процессы — создаем новый объект в расширении (Метод 1), но тщательно вычищаем все ссылки и настраиваем права и критерии отбора.

← На главную