При активном внедрении и кастомизации типовых решений на платформе 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.
Проанализируем, как развивались возможности расширения данных в зависимости от версии платформы и режима совместимости:
Таким образом, если ваша типовая конфигурация работает в режиме совместимости 8.3.10, вы физически не сможете добавить новый документ в расширение. Простое обновление версии платформы без изменения конфигурации или обновления самого релиза конфигурации до версии с более высоким режимом совместимости не решит эту задачу.
Если перед нами стоит задача добавить новый документ, а режим совместимости конфигурации не позволяет сделать это через расширение, мы можем пойти несколькими путями. Рассмотрим подробно каждый из них.
Этот метод позволяет сохранить ключевые типовые объекты без изменений, что гарантирует прохождение автоматического обновления в будущем.
Мы создаем сам документ (его структуру, реквизиты, табличные части) непосредственно в основной конфигурации. При этом мы не трогаем типовые объекты. Всю сопутствующую логику — роли, интерфейсные доработки, интеграцию с другими подсистемами, формы и обработчики событий — мы реализуем в расширении конфигурации.
В этом случае основная конфигурация снимается с поддержки с сохранением правил (объекты редактируются с сохранением поддержки). Сам новый документ помечается как нетиповой, но так как он не пересекается с кодом и объектами поставщика, обновление пройдет в автоматическом режиме без конфликтов.
Мы можем вручную изменить режим совместимости в свойствах корневого объекта основной конфигурации (например, установить 8.3.12 вместо 8.3.10). Это позволит нам создавать документы в расширении.
Важное предупреждение: этот путь крайне опасен для крупных и сложных информационных баз. Изменение режима совместимости для всей конфигурации может привести к непредсказуемому поведению стандартных механизмов: могут "поехать" запросы, некорректно заработать блокировки данных, сломаться фоновые задания или механизмы компоновки данных. Использовать этот метод на рабочих базах без тотального тестирования категорически не рекомендуется.
Фирма "1С" постепенно повышает режим совместимости в своих типовых решениях. Например, современные версии "1С:Управление торговлей" редакции 11.5 давно работают на режимах совместимости 8.3.14 и выше. Если выполнить плановое обновление конфигурации до актуального релиза, режим совместимости повысится штатным образом, и вы сможете безболезненно использовать современные механизмы расширений.
Представим сценарий: ранее вы пошли по первому пути и создали документ в основной конфигурации. Спустя время вы обновили систему, режим совместимости повысился, и вы решили перенести документ в расширение, чтобы полностью вернуть основную конфигурацию к типовому виду.
Внимание: если вы просто удалите документ из основной конфигурации и создадите его заново в расширении с тем же именем, все накопленные данные по этому документу в базе данных будут безвозвратно удалены! Платформа воспринимает расширение как независимый контур и создает для его объектов новые физические таблицы в СУБД (например, в MS SQL или PostgreSQL).
Разберем по шагам безопасный алгоритм переноса данных из основной конфигурации в расширение:
Не спешите удалять объект. Сначала нам нужно переименовать его в основной конфигурации, чтобы освободить имя для нового объекта в расширении.
Откройте конфигуратор, найдите ваш документ в основной конфигурации и добавьте к его имени префикс Удалить_ (например, был Документ.МойДокумент, стал Документ.Удалить_МойДокумент). Выполните обновление конфигурации базы данных (клавиша F7).
Теперь создайте новое расширение (или используйте существующее) и добавьте в него новый документ с исходным именем МойДокумент. Позаботьтесь о том, чтобы структура реквизитов, табличных частей и типов данных нового документа полностью соответствовала структуре старого документа (который теперь называется с префиксом Удалить_).
Примените изменения базы данных.
Для переноса информации нам потребуется написать внешнюю обработку. Проанализируем пример кода для переноса документов и заполнения их табличных частей:
Процедура ПеренестиДанныеДокументов() Экспорт
// Выбираем все старые документы из основной конфигурации
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СтарыйДок.Ссылка КАК Ссылка,
| СтарыйДок.Дата КАК Дата,
| СтарыйДок.Номер КАК Номер,
| СтарыйДок.Контрагент КАК Контрагент,
| СтарыйДок.СуммаДокумента КАК СуммаДокумента
|ИЗ
| Документ.Удалить_МойДокумент КАК СтарыйДок";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Создаем новый документ в расширении
НовыйДок = Документы.МойДокумент.СоздатьДокумент();
// Заполняем основные реквизиты
НовыйДок.Дата = Выборка.Дата;
НовыйДок.Номер = Выборка.Номер;
НовыйДок.Контрагент = Выборка.Контрагент;
НовыйДок.СуммаДокумента = Выборка.СуммаДокумента;
// Переносим табличную часть "Товары"
ПеренестиТабличнуюЧастьТовары(Выборка.Ссылка, НовыйДок);
Попытка
НовыйДок.Записать(РежимЗаписиДокумента.Проведение);
Исключение
// Если не удалось провести, записываем просто так для последующего анализа
НовыйДок.Записать(РежимЗаписиДокумента.Запись);
ЗаписьЖурналаРегистрации("ПереносДанных", УровеньЖурналаРегистрации.Предупреждение, , ,
"Не удалось провести документ: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Процедура ПеренестиТабличнуюЧастьТовары(СсылкаНаСтарыйДок, НовыйОбъектДокумента)
ЗапросТЧ = Новый Запрос;
ЗапросТЧ.Текст =
"ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Количество КАК Количество,
| Товары.Цена КАК Цена,
| Товары.Сумма КАК Сумма
|ИЗ
| Документ.Удалить_МойДокумент.Товары КАК Товары
|ГДЕ
| Товары.Ссылка = &Ссылка";
ЗапросТЧ.УстановитьПараметр("Ссылка", СсылкаНаСтарыйДок);
ВыборкаТЧ = ЗапросТЧ.Выполнить().Выбрать();
Пока ВыборкаТЧ.Следующий() Цикл
НоваяСтрока = НовыйОбъектДокумента.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаТЧ);
КонецЦикла;
КонецПроцедуры
После запуска обработки убедитесь, что все документы успешно перенеслись и провелись в расширении. На этом этапе в системе будут существовать два одинаковых набора документов: старые (с префиксом Удалить_) и новые (в расширении).
Новый документ имеет другие уникальные идентификаторы (GUID ссылки), отличные от старого документа. Если ссылки на старый документ были записаны в других объектах системы (например, в движениях регистров накопления, реквизитах других документов или справочников), эти ссылки станут "битыми" после удаления старого документа.
Для корректной замены воспользуемся типовым механизмом БСП "Поиск и замена значений" или напишем обработку, которая находит все упоминания старой ссылки в базе данных и заменяет их на ссылку нового документа. Также можно использовать метод платформы НайтиПоСсылкам.
Только после того, как вы убедились в стопроцентной корректности переноса всех данных и успешной замене всех ссылок по всей базе данных, можно зайти в конфигуратор и физически удалить объект Документ.Удалить_МойДокумент из основной конфигурации.
Внедряя объекты данных через расширения, важно помнить о специфических рисках безопасности данных, которые накладывает платформа 1С:
Именно поэтому для критически важных учетных документов крупных корпоративных систем рекомендуется использовать основную конфигурацию, а расширения применять для вспомогательных интерфейсных задач, отчетов, печатных форм и интеграционных модулей.