В практике разработки на платформе 1С:Предприятие 8.3 часто возникает задача создания нового документа, который по своей структуре и логике почти полностью повторяет уже существующий в основной конфигурации. Разберем, как сделать это правильно, используя механизм расширений, и какие подводные камни нас ожидают при разных подходах.
Самый очевидный путь — это копирование документа-прототипа. Рассмотрим этот процесс подробнее. Простым «перетаскиванием» в расширение мы лишь добавим ссылку на существующий объект, поэтому нам нужно именно создать новый объект в дереве метаданных расширения, используя команду «Копировать» на объекте основной конфигурации и «Вставить» в расширении.
Проанализируем основные сложности этого метода:
ДокументОснование с типом ДокументСсылка.ИсходныйДокумент), то после копирования в расширение эти реквизиты продолжат ссылаться на старый тип. Нам необходимо вручную пересмотреть все реквизиты и изменить их типы на ДокументСсылка.НовоеИмяИзРасширения.ПриСозданииНаСервере, ПередЗаписью, ОбработкаПроверкиЗаполнения и другие.Зачастую создание клона — это избыточное решение. Рассмотрим альтернативу: использование исходного документа с добавлением признака отличия. Как отмечалось в обсуждении, мы можем добавить реквизит ВидОперации или просто логический флаг, который будет менять поведение документа.
Выясним, какие преимущества это дает:
Во-первых, нам не нужно дублировать структуру табличных частей и реквизитов. Во-вторых, сохраняется единая нумерация и журналы. Чтобы визуально разделить документы, мы можем использовать программную подмену представления в модуле менеджера через событие ОбработкаПолученияПредставления.
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
Если Данные.ЭтоНовыйВидДокумента Тогда
Представление = "Новый тип: " + Данные.Номер + " от " + Формат(Данные.Дата, "ДЛФ=D");
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
Для разделения списков документов можно создать две разные формы списка с предустановленными отборами по нашему новому признаку. Это позволит пользователю видеть два разных списка документов в интерфейсе, хотя физически они будут храниться в одной таблице.
Существует серьезный риск при добавлении новых реквизитов к объектам основной конфигурации через расширение. При сбоях реструктуризации или ошибках подключения расширения данные в «расширенных» реквизитах могут стать недоступными, так как платформа хранит их в дополнительных скрытых таблицах.
Проанализируем безопасный путь: если нам нужно лишь несколько новых полей, мы можем создать в расширении Регистр сведений. В качестве измерения укажем ссылку на основной документ, а в ресурсах — наши новые реквизиты. На формах документа в расширении мы просто будем программно выводить эти данные, читая и записывая их при работе с документом. Это гарантирует сохранность данных даже при временном отключении расширения.
Если мы все же решили создавать новый объект в расширении, разберем критически важные моменты, которые часто упускают:
СвязанныеДокументы). В расширении мы можем расширить состав этого критерия, добавив туда наш новый документ.ОБЪЕДИНИТЬ ВСЕ.ПриУстановкеНовогоНомера модуля объекта.Рассмотрим ситуацию, когда реквизит в расширение был добавлен ошибочно и в нем уже накоплены данные. Помните: простое удаление реквизита из метаданных расширения приведет к безвозвратному удалению колонки из таблицы базы данных при обновлении конфигурации. Если данные важны, перед удалением их необходимо выгрузить во внешний файл или обработкой перенести в другие объекты конфигурации.
Подводя итог, можно сказать: если логика документов совпадает более чем на 80-90%, лучше использовать модификацию существующего объекта (Метод 2). Если же документы должны жить абсолютно разной жизнью, имеют разные права доступа и бизнес-процессы — создаем новый объект в расширении (Метод 1), но тщательно вычищаем все ссылки и настраиваем права и критерии отбора.