Снять с поддержки 1С хотят, когда типовую УТ, БП или КА нужно доработать, а конфигуратор не пускает: объекты поставщика на поддержке, модули открыты только для чтения. Кнопка «Снять с поддержки» решает это за минуту, а расплачиваться приходится на каждом обновлении. Разберём три правила поддержки и их цену при обновлениях, как снять с поддержки один объект или всю конфигурацию и когда вместо этого делать расширение.
У объекта конфигурации на поддержке два правила. Правило поставщика задаёт фирма-разработчик: «Изменения разрешены», «Изменения не рекомендуются» или «Изменения запрещены». Правило пользователя выбираете вы, и от него зависит, что станет с объектом при обновлении.
| Правило пользователя | Править можно? | Что происходит при обновлении | Цена обновления |
|---|---|---|---|
| Объект поставщика не редактируется | Нет | Объект заменяется новой версией поставщика | Минимальная |
| Объект поставщика редактируется с сохранением поддержки | Да | Сравниваются три конфигурации: текущая, старая и новая поставщика. Изменения 1С переносятся, ваши остаются; то, что правили и вы, и 1С, разбирают вручную | Растёт с числом правок в типовых объектах |
| Объект поставщика снят с поддержки | Да | Изменения поставщика в объект не приходят, переносить их нужно вручную | Самая высокая: объект отстаёт от типовой с каждым релизом |
Ограничения из справки конфигуратора. При правиле поставщика «Изменения не рекомендуются» своё правило поставить можно, но конфигуратор предупредит. При «Изменения запрещены» правило объекта не меняется — остаётся только отказаться от поддержки всей конфигурации. Обратного хода нет: после «Объект поставщика снят с поддержки» вернуть «Объект поставщика не редактируется» нельзя.
На полной поддержке обновление — загрузка файла обновления, обновление базы и проверка; программист нужен на тестирование, а не на перенос кода.
При «редактируется с сохранением поддержки» платформа сама переносит изменения 1С в нетронутые места. Вручную разбирают только дважды изменённые свойства — модули, формы и макеты, которые правили и вы, и поставщик. Цена зависит не от числа доработок, а от того, сколько типовых объектов изменено и как активно 1С их развивает: строчка в модуле документа продаж обходится дороже десятка своих отчётов, ведь свои объекты поставщик не трогает.
Объект, снятый с поддержки, при обновлении не меняется. Экономия кажущаяся: как только обновлённый типовой код обратится к процедуре или реквизиту, которых в «замороженном» объекте нет, ошибку увидят пользователи. Поэтому изменения поставщика переносят в него вручную на каждом релизе.
Дороже всего — конфигурация, снятая с поддержки целиком. «Конфигурация → Поддержка → Обновить конфигурацию» и файлы .cfu рассчитаны на конфигурацию на поддержке, так что релиз объединяют из полного .cf через «Конфигурация → Сравнить, объединить с конфигурацией из файла». Сравниваются две конфигурации без старой версии поставщика, и каждое отличие программист разбирает сам: ваша это правка или изменение 1С.
Оценить будущие обновления можно заранее: сравните основную конфигурацию с конфигурацией поставщика («Конфигурация → Сравнить конфигурации…»), а доработки в расширениях соберите кодом из раздела «Перед обновлением».
Если правок немного, оставьте в обоих случаях «Объект поставщика не редактируется» и включайте редактирование точечно. Если доработки по всей конфигурации, выбирайте «Объект поставщика редактируется с сохранением поддержки». «Снят с поддержки» здесь не ставьте: правило получат все объекты группы.
Снять с поддержки объект конфигурации оправдано, только если вы целиком забираете его развитие на себя, — например, типовой отчёт переписан под вашу методику. В остальных случаях объект, снятый с поддержки, — отложенный счёт: изменения 1С по нему копятся, а не приходят.
В окне «Настройка поддержки» для этого есть кнопка «Снять с поддержки». В 8.3 то же делает пакетный режим конфигуратора: ключ /ManageCfgSupport с параметром -disableSupport, а -force нужен, если возможность изменения ещё не включена. Перед снятием сделайте полную копию базы.
@echo off
rem Снять конфигурацию с поддержки целиком в пакетном режиме конфигуратора 8.3.
rem Сначала полная выгрузка базы - самый простой путь назад.
rem Версию платформы подставьте свою, пароль администратора базы - в переменной V8_PWD.
set "V8=C:\Program Files\1cv8\8.3.x.xxxx\bin\1cv8.exe"
set "LOG=D:\1C\logs\support.log"
set IB=/S srv01\trade /N admin /P "%V8_PWD%"
if not exist "D:\1C\logs" mkdir "D:\1C\logs"
if not exist "D:\1C\backup" mkdir "D:\1C\backup"
start "" /wait "%V8%" DESIGNER %IB% /DisableStartupDialogs /Out "%LOG%" /DumpIB "D:\1C\backup\trade_before_unsupport.dt"
if errorlevel 1 (
echo Copy failed, see %LOG%
exit /b 1
)
rem -force: снять, даже если возможность изменения в конфигурации ещё не включена
start "" /wait "%V8%" DESIGNER %IB% /DisableStartupDialogs /Out "%LOG%" -NoTruncate /ManageCfgSupport -disableSupport -force
Вернуть конфигурацию на поддержку можно объединением с .cf поставщика через «Конфигурация → Сравнить, объединить с конфигурацией из файла…»: платформа предложит поставить её на поддержку (в пакетном режиме — параметр -EnableSupport ключа /MergeCfg). Берите .cf того же релиза, что стоит в базе: тогда отличия в окне сравнения — это ваши доработки, а не изменения 1С.
Когда без изменения основной конфигурации не обойтись, держите правку в типовом модуле минимальной. Логику кладите в свой общий модуль, например ДоработкиЗаказовКлиента с флажком «Сервер»: это ваш объект, правила поставщика на него не действуют. В конец типовой процедуры ОбработкаПроверкиЗаполнения вставляется только вызов с метками:
// ++ ДоработкиЗаказов: проверки заказа (задача 125)
ДоработкиЗаказовКлиента.ПроверитьЗаказ(ЭтотОбъект, Отказ);
// -- ДоработкиЗаказов
На обновлении модуль может оказаться дважды изменённым, но разбирать придётся три строки с метками. Чтобы добавить свой общий модуль, правило корня конфигурации тоже должно разрешать изменения.
Расширение подключается без включения возможности изменения, поэтому типовая остаётся на полной поддержке и обновляется по самому дешёвому сценарию. В расширении перехватывают события и процедуры (&Перед, &После, &Вместо), правят типовой метод через &ИзменениеИКонтроль, добавляют реквизиты, формы, команды, отчёты и роли. Назначение «Исправление» — для срочной правки ошибки типовой, «Дополнение» — для нового функционала. Подробнее — в статье про расширения конфигурации.
Чего расширение не умеет: удалить типовой объект или реквизит, а контролируемые свойства заимствованных объектов должны совпадать с основной конфигурацией. Тогда остаются «с сохранением поддержки» и минимальная правка.
Пример — проверка заказа клиента без единой строки в типовом модуле (имена сверены по УТ 11.4 и КА 2.5).
// Расширение с префиксом Расш1_: модуль объекта заимствованного документа
// ЗаказКлиента (имена - по УТ 11.4 и КА 2.5). Типовой модуль не изменён,
// конфигурация остаётся на полной поддержке.
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
&После("ОбработкаПроверкиЗаполнения")
Процедура Расш1_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
// Несогласованный заказ - черновик: наши правила к нему не применяем
Если ЭтотОбъект.Статус = Перечисления.СтатусыЗаказовКлиентов.НеСогласован Тогда
Возврат;
КонецЕсли;
// Заказы, загруженные с сайта, нередко приходят без менеджера
Если Не ЗначениеЗаполнено(ЭтотОбъект.Менеджер) Тогда
Расш1_СообщитьОбОшибке("Укажите менеджера: без него заказ не передаётся в работу.",
"Менеджер", Отказ);
КонецЕсли;
// Крупный заказ принимаем только с пометкой о согласовании
Если ЭтотОбъект.СуммаДокумента >= Расш1_ПорогКрупногоЗаказа()
И ПустаяСтрока(ЭтотОбъект.Комментарий) Тогда
Расш1_СообщитьОбОшибке("Для крупного заказа укажите в комментарии, кто согласовал условия.",
"Комментарий", Отказ);
КонецЕсли;
КонецПроцедуры
// Порог условный: в рабочей базе его удобнее хранить в константе расширения
Функция Расш1_ПорогКрупногоЗаказа()
Возврат 1000000;
КонецФункции
Процедура Расш1_СообщитьОбОшибке(ТекстОшибки, ИмяРеквизита, Отказ)
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ТекстОшибки;
Сообщение.Поле = ИмяРеквизита;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецПроцедуры
#КонецЕсли
Какие типовые объекты меняют расширения, нужно знать до обновления — их и проверяют после релиза. Платформа отдаёт это методами объектов метаданных ЕстьИзмененияРасширениямиКонфигурации() и РасширениеКонфигурации(). Код — модуль формы внешней обработки, запускать в сеансе с применёнными расширениями.
// Внешняя обработка «Контроль доработок», модуль формы. У формы две команды
// с одноимёнными действиями: ДоработкиРасширениями и ПроверитьРасширения.
// Свойства Активно и ИзменяетСтруктуруДанных() - с режима совместимости 8.3.12 и 8.3.13.
&НаКлиенте
Процедура ДоработкиРасширениями(Команда)
ТекстОтчета = Новый ТекстовыйДокумент;
ТекстОтчета.УстановитьТекст(ОтчетОДоработкахРасширениями());
ТекстОтчета.Показать("Доработки расширениями");
КонецПроцедуры
&НаСервереБезКонтекста
Функция ОтчетОДоработкахРасширениями()
Строки = Новый Массив;
// Расширения базы: назначение, активность, свои данные
Для Каждого Расширение Из РасширенияКонфигурации.Получить() Цикл
Строки.Добавить(СтрШаблон("%1, версия %2: %3; активно: %4; хранит данные: %5",
Расширение.Имя, Расширение.Версия, Расширение.Назначение,
Формат(Расширение.Активно, "БЛ=нет; БИ=да"),
Формат(Расширение.ИзменяетСтруктуруДанных(), "БЛ=нет; БИ=да")));
КонецЦикла;
// Типовые объекты, которые расширения меняют в текущем сеансе
Строки.Добавить("");
Строки.Добавить("Изменённые типовые объекты:");
Для Каждого Раздел Из РазделыМетаданных() Цикл
Для Каждого ОбъектМД Из Раздел.Коллекция Цикл
Если ОбъектМД.РасширениеКонфигурации() <> Неопределено Тогда
Продолжить; // объект добавлен расширением, в типовой его нет
КонецЕсли;
Если Не ОбъектМД.ЕстьИзмененияРасширениямиКонфигурации() Тогда
Продолжить;
КонецЕсли;
Описание = " " + ОбъектМД.ПолноеИмя();
Если Раздел.ЕстьРеквизиты Тогда
Описание = Описание + НовыеРеквизиты(ОбъектМД);
КонецЕсли;
Строки.Добавить(Описание);
КонецЦикла;
КонецЦикла;
Возврат СтрСоединить(Строки, Символы.ПС);
КонецФункции
&НаСервереБезКонтекста
Функция РазделыМетаданных()
// Коллекция метаданных и признак «у объектов есть реквизиты»
Разделы = Новый Массив;
Разделы.Добавить(Новый Структура("Коллекция, ЕстьРеквизиты", Метаданные.Справочники, Истина));
Разделы.Добавить(Новый Структура("Коллекция, ЕстьРеквизиты", Метаданные.Документы, Истина));
Разделы.Добавить(Новый Структура("Коллекция, ЕстьРеквизиты", Метаданные.РегистрыСведений, Истина));
Разделы.Добавить(Новый Структура("Коллекция, ЕстьРеквизиты", Метаданные.РегистрыНакопления, Истина));
Разделы.Добавить(Новый Структура("Коллекция, ЕстьРеквизиты", Метаданные.Отчеты, Истина));
Разделы.Добавить(Новый Структура("Коллекция, ЕстьРеквизиты", Метаданные.Обработки, Истина));
Разделы.Добавить(Новый Структура("Коллекция, ЕстьРеквизиты", Метаданные.ОбщиеМодули, Ложь));
Разделы.Добавить(Новый Структура("Коллекция, ЕстьРеквизиты", Метаданные.ОбщиеФормы, Ложь));
Разделы.Добавить(Новый Структура("Коллекция, ЕстьРеквизиты", Метаданные.Роли, Ложь));
Возврат Разделы;
КонецФункции
&НаСервереБезКонтекста
Функция НовыеРеквизиты(ОбъектМД)
Имена = Новый Массив;
Для Каждого Реквизит Из ОбъектМД.Реквизиты Цикл
Если Реквизит.РасширениеКонфигурации() <> Неопределено Тогда
Имена.Добавить(Реквизит.Имя);
КонецЕсли;
КонецЦикла;
Если Имена.Количество() = 0 Тогда
Возврат "";
КонецЕсли;
Возврат "; реквизиты расширения: " + СтрСоединить(Имена, ", ");
КонецФункции
После обновления типовой расширение может не примениться (критичная проблема) или примениться с предупреждениями. Вторая команда обработки собирает проблемы запуска сеанса, проверяет расширения базы против новой конфигурации и показывает неподключённые. Аналог в конфигураторе — «Конфигурация → Расширения конфигурации», меню «Действия» → «Проверка возможности применения всех расширений».
// Та же обработка, команда «Проверить расширения»: запускать после обновления типовой.
&НаКлиенте
Процедура ПроверитьРасширения(Команда)
Проблемы = ПроблемыПримененияРасширений();
Если Проблемы.Количество() = 0 Тогда
ПоказатьПредупреждение(, "Расширения применимы к текущей конфигурации, проблем нет.");
Возврат;
КонецЕсли;
Для Каждого ТекстСообщения Из Проблемы Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ТекстСообщения;
Сообщение.Сообщить();
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПроблемыПримененияРасширений()
Проблемы = Новый Массив;
Если Не ПравоДоступа("Администрирование", Метаданные) Тогда
Проблемы.Добавить("Проверку запускает пользователь с правом «Администрирование».");
Возврат Проблемы;
КонецЕсли;
// Что не удалось применить при запуске этого сеанса
Для Каждого Проблема Из РасширенияКонфигурации.ПолучитьИнформациюОПроблемахПримененияВСеансе() Цикл
Проблемы.Добавить(ОписаниеПроблемы(Проблема, "при запуске сеанса"));
КонецЦикла;
// Все расширения базы против текущей конфигурации, по порядку загрузки
Для Каждого Проблема Из РасширенияКонфигурации.ПроверитьВозможностьПримененияВсех() Цикл
Проблемы.Добавить(ОписаниеПроблемы(Проблема, "проверка применения"));
КонецЦикла;
// Расширения есть в базе, но в этом сеансе не подключены
Отключенные = РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Расширение Из Отключенные Цикл
Проблемы.Добавить(СтрШаблон("%1, версия %2: в этом сеансе не подключено",
Расширение.Имя, Расширение.Версия));
КонецЦикла;
Возврат Проблемы;
КонецФункции
&НаСервереБезКонтекста
Функция ОписаниеПроблемы(Проблема, Этап)
Если Проблема.Важность = ВажностьПроблемыПримененияРасширенияКонфигурации.Критичная Тогда
Уровень = "КРИТИЧНО, расширение не применится";
ИначеЕсли Проблема.Важность = ВажностьПроблемыПримененияРасширенияКонфигурации.Обычная Тогда
Уровень = "предупреждение";
Иначе
Уровень = "низкая важность";
КонецЕсли;
ИмяРасширения = ?(Проблема.Расширение = Неопределено, "?", Проблема.Расширение.Имя);
Возврат СтрШаблон("[%1] %2 (%3): %4", Уровень, ИмяРасширения, Этап, Проблема.Описание);
КонецФункции
&После("ОбработкаПроверкиЗаполнения") — обработчик расширения выполняется после типового, типовые проверки работают как раньше. Параметры повторяют типовую процедуру: (Отказ, ПроверяемыеРеквизиты) в УТ 11.4 и КА 2.5.ЭтотОбъект.Менеджер — реквизиты читаем через ЭтотОбъект, и модуль компилируется, даже если реквизиты не заимствованы в расширение.Сообщение.УстановитьДанные(ЭтотОбъект) с Сообщение.Поле привязывают ошибку к реквизиту: из сообщения можно перейти к полю.ОбъектМД.РасширениеКонфигурации() <> Неопределено — объект добавлен расширением, обновление 1С его не касается.ЕстьИзмененияРасширениямиКонфигурации() — Истина, если расширения в текущем сеансе изменили сам объект или подчинённые ему, в том числе добавили новые реквизиты или формы.ИзменяетСтруктуруДанных() — у расширения свои данные, удалить и поставить его заново без потери данных нельзя.ПроверитьВозможностьПримененияВсех() проверяет расширения базы по порядку загрузки, ПолучитьИнформациюОПроблемахПримененияВСеансе() — что случилось при запуске сеанса. Важность «Критичная» значит, что расширение не будет использовано; «Обычная» подключение не блокирует.// ++ и // --.&ИзменениеИКонтроль перестал работать без единой ошибки. В справке конфигуратора 8.3.27 проверка текста метода неблокирующая: если 1С поменяла типовой метод, расширение применится, но этот метод расширен не будет. После обновления запускайте «Проверка возможности применения всех расширений» — она сверяет и такие методы.Нет: при объединении платформа сохраняет ваши изменения и добавляет изменения 1С. Риск в другом — если для дважды изменённого модуля взять в окне объединения версию поставщика, правка пропадёт.
Откройте «Конфигурация → Поддержка → Настройка поддержки…» — там видно правило каждого объекта. У конфигурации на поддержке в дереве объектов есть значки состояния поддержки; если их нет ни у одного объекта, конфигурация, скорее всего, снята с поддержки целиком или никогда на ней не стояла.
Можно, но сначала у него и всех подчинённых объектов должно быть правило «Объект поставщика снят с поддержки». Обычно проще перестать объектом пользоваться: так он не мешает обновлениям.
Узнать релиз (свойство «Версия» корня конфигурации, если его не меняли), взять .cf этого релиза и поставить конфигурацию на поддержку объединением. Найденные отличия — доработки: часть переносят в расширения, остальные оставляют на «с сохранением поддержки».
Если база уже снята с поддержки или непонятно, сколько в ней правок, опишите ситуацию на площадке: исполнители оценят возврат на поддержку и перенос доработок в расширения. Оценка бесплатная, ответ — в течение рабочего дня; ориентиры по цене — на странице «Сколько стоит доработка 1С», а задачу можно разместить бесплатно.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.