Добавление нового документа в расширении 1С при ограничении режима совместимости

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

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

Однако на практике разработчики часто упираются в технологические ограничения платформы, связанные с установленным режимом совместимости в типовых решениях (таких как 1С:Управление торговлей, 1С:Комплексная автоматизация или 1С:ERP). В этой статье мы подробно разберем, как обойти данные ограничения, какие подводные камни существуют при переносе объектов и как сохранить данные при реструктуризации базы данных.

В чем суть проблемы совместимости?

Рассмотрим классическую ситуацию: у нас установлена платформа 8.3.11, а типовая конфигурация "Управление торговлей" (например, релиз 11.4.3.137) находится в режиме совместимости 8.3.10. При попытке добавить собственный документ в расширение система выдает ошибку или блокирует эту возможность. Выясним причину этого поведения.

Возможность добавления собственных объектов метаданных (справочников, документов) непосредственно в расширение жестко привязана к версии режима совместимости основной конфигурации, а не к версии установленной физически платформы 1С. Даже если вы установите самую современную версию платформы (например, 8.3.23), но конфигурация будет работать в режиме совместимости 8.3.10, возможности расширений будут ограничены правилами версии 8.3.10.

Проанализируем, как развивались возможности расширения данных в зависимости от версии платформы и режима совместимости:

  1. Режим совместимости 8.3.10 и ниже: Добавление собственных документов, справочников и регистров в расширение полностью заблокировано. Допускается только заимствование существующих объектов и изменение их модулей или форм.
  2. Режим совместимости 8.3.11: Появляется базовая возможность создавать собственные справочники, документы и планы обмена в расширении. Однако их функционал сильно урезан: например, созданный в расширении документ не может делать движения по регистрам основной конфигурации.
  3. Режим совместимости 8.3.12: Снято ограничение на проведение. Документы из расширения теперь могут делать движения по заимствованным регистрам накопления, сведений и бухгалтерии основной конфигурации.
  4. Режим совместимости 8.3.13: Появляется возможность создавать собственные регистры накопления, сведений и расчета прямо внутри расширения.
  5. Режим совместимости 8.3.18 и выше: Реализована критически важная возможность расширения типов. Теперь можно добавлять новые типы данных (включая объекты из расширения) в составные типы реквизитов основной конфигурации. Это решает проблемы со структурой подчиненности и вводом на основании.

Таким образом, если ваша типовая конфигурация работает в режиме совместимости 8.3.10, вы физически не сможете добавить новый документ в расширение. Простое обновление версии платформы без изменения конфигурации или обновления самого релиза конфигурации до версии с более высоким режимом совместимости не решит эту задачу.

Варианты решения проблемы при низком режиме совместимости

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

Способ 1. Комбинированный метод (Рекомендуемый)

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

Мы создаем сам документ (его структуру, реквизиты, табличные части) непосредственно в основной конфигурации. При этом мы не трогаем типовые объекты. Всю сопутствующую логику — роли, интерфейсные доработки, интеграцию с другими подсистемами, формы и обработчики событий — мы реализуем в расширении конфигурации.

В этом случае основная конфигурация снимается с поддержки с сохранением правил (объекты редактируются с сохранением поддержки). Сам новый документ помечается как нетиповой, но так как он не пересекается с кодом и объектами поставщика, обновление пройдет в автоматическом режиме без конфликтов.

Способ 2. Принудительное изменение режима совместимости

Мы можем вручную изменить режим совместимости в свойствах корневого объекта основной конфигурации (например, установить 8.3.12 вместо 8.3.10). Это позволит нам создавать документы в расширении.

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

Способ 3. Переход на актуальные релизы конфигурации

Фирма "1С" постепенно повышает режим совместимости в своих типовых решениях. Например, современные версии "1С:Управление торговлей" редакции 11.5 давно работают на режимах совместимости 8.3.14 и выше. Если выполнить плановое обновление конфигурации до актуального релиза, режим совместимости повысится штатным образом, и вы сможете безболезненно использовать современные механизмы расширений.

Как правильно перенести объект в расширение и не потерять данные

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

Внимание: если вы просто удалите документ из основной конфигурации и создадите его заново в расширении с тем же именем, все накопленные данные по этому документу в базе данных будут безвозвратно удалены! Платформа воспринимает расширение как независимый контур и создает для его объектов новые физические таблицы в СУБД (например, в MS SQL или PostgreSQL).

Разберем по шагам безопасный алгоритм переноса данных из основной конфигурации в расширение:

Шаг 1. Подготовка и переименование объекта в основной конфигурации

Не спешите удалять объект. Сначала нам нужно переименовать его в основной конфигурации, чтобы освободить имя для нового объекта в расширении.

Откройте конфигуратор, найдите ваш документ в основной конфигурации и добавьте к его имени префикс Удалить_ (например, был Документ.МойДокумент, стал Документ.Удалить_МойДокумент). Выполните обновление конфигурации базы данных (клавиша F7).

Шаг 2. Создание нового объекта в расширении

Теперь создайте новое расширение (или используйте существующее) и добавьте в него новый документ с исходным именем МойДокумент. Позаботьтесь о том, чтобы структура реквизитов, табличных частей и типов данных нового документа полностью соответствовала структуре старого документа (который теперь называется с префиксом Удалить_).

Примените изменения базы данных.

Шаг 3. Программный перенос данных

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


Процедура ПеренестиДанныеДокументов() Экспорт
    
    // Выбираем все старые документы из основной конфигурации
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   СтарыйДок.Ссылка КАК Ссылка,
        |   СтарыйДок.Дата КАК Дата,
        |   СтарыйДок.Номер КАК Номер,
        |   СтарыйДок.Контрагент КАК Контрагент,
        |   СтарыйДок.СуммаДокумента КАК СуммаДокумента
        |ИЗ
        |   Документ.Удалить_МойДокумент КАК СтарыйДок";
        
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        // Создаем новый документ в расширении
        НовыйДок = Документы.МойДокумент.СоздатьДокумент();
        
        // Заполняем основные реквизиты
        НовыйДок.Дата = Выборка.Дата;
        НовыйДок.Номер = Выборка.Номер;
        НовыйДок.Контрагент = Выборка.Контрагент;
        НовыйДок.СуммаДокумента = Выборка.СуммаДокумента;
        
        // Переносим табличную часть "Товары"
        ПеренестиТабличнуюЧастьТовары(Выборка.Ссылка, НовыйДок);
        
        Попытка
            НовыйДок.Записать(РежимЗаписиДокумента.Проведение);
        Исключение
            // Если не удалось провести, записываем просто так для последующего анализа
            НовыйДок.Записать(РежимЗаписиДокумента.Запись);
            ЗаписьЖурналаРегистрации("ПереносДанных", УровеньЖурналаРегистрации.Предупреждение, , , 
                "Не удалось провести документ: " + ОписаниеОшибки());
        КонецПопытки;
        
    КонецЦикла;
    
КонецПроцедуры

Процедура ПеренестиТабличнуюЧастьТовары(СсылкаНаСтарыйДок, НовыйОбъектДокумента)
    
    ЗапросТЧ = Новый Запрос;
    ЗапросТЧ.Текст = 
        "ВЫБРАТЬ
        |   Товары.Номенклатура КАК Номенклатура,
        |   Товары.Количество КАК Количество,
        |   Товары.Цена КАК Цена,
        |   Товары.Сумма КАК Сумма
        |ИЗ
        |   Документ.Удалить_МойДокумент.Товары КАК Товары
        |ГДЕ
        |   Товары.Ссылка = &Ссылка";
        
    ЗапросТЧ.УстановитьПараметр("Ссылка", СсылкаНаСтарыйДок);
    ВыборкаТЧ = ЗапросТЧ.Выполнить().Выбрать();
    
    Пока ВыборкаТЧ.Следующий() Цикл
        НоваяСтрока = НовыйОбъектДокумента.Товары.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаТЧ);
    КонецЦикла;
    
КонецПроцедуры

После запуска обработки убедитесь, что все документы успешно перенеслись и провелись в расширении. На этом этапе в системе будут существовать два одинаковых набора документов: старые (с префиксом Удалить_) и новые (в расширении).

Шаг 4. Замена ссылок в базе данных

Новый документ имеет другие уникальные идентификаторы (GUID ссылки), отличные от старого документа. Если ссылки на старый документ были записаны в других объектах системы (например, в движениях регистров накопления, реквизитах других документов или справочников), эти ссылки станут "битыми" после удаления старого документа.

Для корректной замены воспользуемся типовым механизмом БСП "Поиск и замена значений" или напишем обработку, которая находит все упоминания старой ссылки в базе данных и заменяет их на ссылку нового документа. Также можно использовать метод платформы НайтиПоСсылкам.

Шаг 5. Окончательное удаление

Только после того, как вы убедились в стопроцентной корректности переноса всех данных и успешной замене всех ссылок по всей базе данных, можно зайти в конфигуратор и физически удалить объект Документ.Удалить_МойДокумент из основной конфигурации.

Риски хранения критически важных данных в расширениях

Внедряя объекты данных через расширения, важно помнить о специфических рисках безопасности данных, которые накладывает платформа 1С:

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

← На главную