При работе с типовыми и, в особенности, с отраслевыми конфигурациями 1С, такими как «1С:Учет в управляющих компаниях ЖКХ, ТСЖ и ЖСК», мы часто сталкиваемся с ситуацией, когда некоторые общие модули помечены «замочком» и недоступны для прямого редактирования. Это вызывает справедливое желание снять с них защиту, чтобы внести необходимые изменения, например, для корректировки алгоритмов расчета формул. Однако при попытке установить правило поддержки «Редактируется с сохранением поддержки» система выдает предупреждение: «Для данных объектов поставщик запрещает устанавливать правило поддержки: Редактируется с сохранением поддержки». Давайте разберемся, почему так происходит, какие существуют ограничения и как можно решить задачу доработки конфигурации, сохраняя возможность получать обновления и поддержку.
Прежде чем искать пути обхода блокировки, важно понять причины, по которым поставщики отраслевых решений закрывают часть кода. Это не простая «жадность», как кто-то может подумать, а продуманная стратегия, направленная на обеспечение стабильности и защиты продукта:
Как мы уже выяснили из сообщения 2, «легальными способами – никак». Поставщик специально блокирует такую возможность на уровне метаданных, и система 1С:Предприятие не позволяет обойти это ограничение через стандартные механизмы поддержки. Попытка установить правило «Редактируется с сохранением поддержки» для таких объектов всегда будет блокирована предупреждением. Это означает, что прямое изменение кода в этих модулях без потери поддержки невозможно.
Наиболее безопасным, рекомендуемым и современным способом доработки типовых конфигураций 1С без снятия с поддержки является использование расширений конфигурации. Этот механизм позволяет добавлять новую функциональность или изменять поведение существующих объектов, не затрагивая при этом саму основную конфигурацию. Разберем подробнее, как мы можем использовать расширения для решения нашей задачи.
&Перед: Позволяет выполнить свой код перед вызовом типовой процедуры или функции. Если в вашем коде установлено значение параметра, который передается по ссылке, или возвращено значение функции, то типовой код может быть отменен (зависит от конкретной процедуры).&После: Позволяет выполнить свой код после выполнения типовой процедуры или функции. Мы можем получить доступ к результатам выполнения типового кода и внести в них корректировки.&Вместо: Позволяет полностью заменить выполнение типовой процедуры или функции своим кодом. Этот метод наиболее мощный, но и наиболее рискованный, так как при обновлениях типовой конфигурации нам придется вручную отслеживать изменения в замещенном коде.Если нам необходимо переопределить расчет формул, как упоминалось в сообщении 10, мы можем сделать следующее:
РассчитатьФормулу в общем модуле ОбщиеРасчетыЖКХ.ОбщиеРасчетыЖКХ).&После или &Вместо.
&После:
Если мы хотим добавить что-то к существующему расчету или скорректировать его результат, не переписывая весь типовой алгоритм, мы можем использовать &После. Предположим, типовая процедура возвращает результат в переменной РезультатРасчета, а мы хотим применить дополнительный коэффициент.
&После("РассчитатьФормулу")
Процедура РассчитатьФормулуПосле(Параметр1, Параметр2, РезультатРасчета)
// Получаем значение, рассчитанное типовым кодом
// Допустим, РезультатРасчета передается по ссылке и уже содержит типовой расчет
РезультатРасчета = РезультатРасчета * КоэффициентНадбавки;
Сообщить("Расчет формулы скорректирован через расширение!");
КонецПроцедуры
&Вместо:
Если нам нужно полностью переопределить алгоритм расчета, то &Вместо — наш выбор. Однако здесь мы должны быть особенно осторожны, так как придется скопировать большую часть типового кода или написать свой с нуля. Это усложнит анализ изменений при будущих обновлениях.
&Вместо("РассчитатьФормулу")
Процедура РассчитатьФормулуВместо(Параметр1, Параметр2)
// Здесь пишем свою логику расчета, которая полностью заменит типовую
МойРезультат = МойМодуль.ВыполнитьСвойРасчет(Параметр1, Параметр2);
// Возвращаем результат, если процедура типовая была функцией
// или записываем в нужные параметры/объекты, как это делала типовая процедура
// Внимание: если типовая процедура была функцией,
// необходимо имитировать ее возвращаемое значение.
// Для примера, если типовая процедура возвращала значение через параметр по ссылке:
Параметр2.ЗначениеРезультата = МойРезультат;
Сообщить("Расчет формулы полностью переопределен через расширение!");
КонецПроцедуры
Важно отметить, что если типовая процедура возвращает значение как функция, то при использовании &Вместо вам нужно будет реализовать механизм возврата значения, аналогичный типовому, или адаптировать вызывающий код, если это возможно.
Как и любой инструмент, расширения имеют свои особенности и ограничения, о которых мы должны помнить:
МенеджерОбменаДаннымиКлиентСервер), так как они имеют специфичный режим работы.&Вместо: Хотя она очень мощная, использование &Вместо часто заставляет нас копировать весь код типовой процедуры или функции, даже если нужно изменить лишь небольшую часть. Это значительно затрудняет анализ изменений при последующих обновлениях типовой конфигурации. Старайтесь по возможности использовать &Перед и &После, которые более устойчивы к изменениям в типовом коде.Несмотря на кажущуюся простоту, прямое изменение защищенных модулей, то есть полное «снятие с замка» конфигурации (превращение ее в полностью нетиповую) и модификация кода, является крайне нерекомендуемым подходом. Мы должны быть осведомлены о серьезных последствиях:
Таким образом, для доработки конфигурации «1С:Учет в управляющих компаниях ЖКХ, ТСЖ и ЖСК» при наличии заблокированных общих модулей, наиболее безопасным, гибким и рекомендуемым способом является использование расширений конфигурации. Мы можем добавить необходимую функциональность, модифицировать логику расчетов или поведение типовых объектов, сохраняя при этом возможность получения обновлений и поддержки от поставщика. Если с расширениями возникают ошибки, как это было в сообщении 7, нам следует внимательно проверить их настройки (например, «Безопасный режим») и убедиться, что попытка изменения не затрагивает глобальные серверные модули или другие объекты, для которых расширения имеют ограничения. Правильное применение расширений позволяет нам добиться нужного результата без катастрофических последствий для нашей информационной системы.