Обновление нетиповых конфигураций 1С или перенос доработок через механизм сравнения и объединения файлов cf — задача, требующая предельной внимательности. Часто возникают ситуации, когда после успешного, на первый взгляд, объединения база начинает выдавать критические ошибки в тех местах, которые даже не подвергались изменениям. В этой статье мы подробно разберем ситуацию, когда в общем модуле перестают распознаваться стандартные функции, такие как Предупреждение, и выясним, как правильно настроить среду выполнения кода.
Рассмотрим конкретный пример. После обновления конфигурации "1С:Управление торговлей 8.2" (обычные формы) при попытке формирования отчета или выполнения печати система выдает серию ошибок компиляции в общем модуле УниверсальныеМеханизмы. Ошибки выглядят следующим образом:
{ОбщийМодуль.УниверсальныеМеханизмы.Модуль(1991,3)}: Процедура или функция с указанным именем не определена (Предупреждение)
>Предупреждение("Операция не выполнена");
{ОбщийМодуль.УниверсальныеМеханизмы.Модуль(2011,30)}: Процедура или функция с указанным именем не определена (ПолучитьДеревоМакетовПечати)
На первый взгляд это кажется странным, так как Предупреждение является базовой функцией платформы 1С. Однако ключевой момент здесь заключается в том, где именно (в каком контексте) выполняется этот код. В системе 1С существует строгое разделение на клиентскую и серверную части. Функция Предупреждение является интерактивной и доступна исключительно на клиенте. Если сервер пытается скомпилировать код, содержащий этот метод, он выдаст ошибку, так как на сервере "нет монитора", чтобы показать это сообщение.
Давайте разберем, почему это происходит именно после обновления. При использовании механизма "Сравнить и объединить с конфигурацией из файла", разработчики часто обращают внимание только на текст модулей, забывая о свойствах самих объектов метаданных. Рассмотрим основные причины:
УниверсальныеМеханизмы могли измениться галочки "Клиент", "Сервер" или "Внешнее соединение". Если в новой конфигурации модуль помечен только как "Сервер", то весь клиентский код (инструкции Предупреждение, Вопрос) внутри него станет невалидным.УниверсальныеМеханизмы, сервер попытается скомпилировать этот модуль целиком и "споткнется" о клиентские функции.Первым делом нам необходимо проверить настройки компиляции модуля, в котором возникла ошибка. Выполним следующие действия:
ОбщийМодуль.УниверсальныеМеханизмы.Чтобы код был универсальным и не вызывал ошибок при компиляции на сервере, мы должны явно указывать системе, какие части кода предназначены только для клиента. Перепишем проблемный участок кода из сообщения:
Процедура НапечататьДокументИзФормыЖурналДокументовСписок(Объект) Экспорт
Если Объект = Неопределено Тогда
Возврат;
КонецЕсли;
// ... логика определения параметров печати ...
Если Не НапечататьКомплектацию(Объект, 0, НаПринтер) Тогда
#Если Клиент Тогда
Предупреждение("Операция не выполнена");
#КонецЕсли
КонецЕсли;
КонецПроцедуры
Использование конструкции #Если Клиент Тогда ... #КонецЕсли гарантирует, что при компиляции модуля на стороне сервера строка с предупреждением будет просто проигнорирована, и ошибка "Процедура не определена" не возникнет.
Чтобы избежать подобных проблем в будущем, проанализируем правильную последовательность действий при обновлении конфигурации, в которую внесены доработки:
В обсуждении упоминалось, что проблемы начались после настройки ролей. Это важный момент. В 1С 8.2 ограничение прав доступа (RLS) или некорректная настройка прав на чтение объектов может приводить к тому, что запросы в отчетах возвращают пустые результаты или вызывают ошибки доступа. Однако ошибки вида "Процедура не определена" — это всегда ошибки компиляции кода, а не прав доступа. Если же отчет просто "перестал загружать данные", проверьте права роли на соответствующие РегистрыСведений и Справочники, которые участвуют в обмене с сайтом.
Если вы уверены, что код верный и свойства модулей настроены правильно, но ошибка сохраняется, стоит вспомнить о "коварстве" динамического обновления. Рассмотрим ситуацию: вы обновили конфигурацию, когда пользователи были в базе (так называемое "демонское" обновление). В этом случае серверные вызовы могут продолжать использовать старые версии скомпилированных модулей из кэша.
Рекомендация: При возникновении странных ошибок после обновления всегда выполняйте полную очистку кэша на сервере и клиентских машинах, а также, по возможности, перезапускайте службу 1C:Enterprise Server Administration.
Подводя итог, можно сказать, что решение проблемы кроется в понимании архитектуры 1С. Всегда разделяйте интерфейсную логику (диалоги, предупреждения) и бизнес-логику (расчеты, запросы). Держите общие модули в чистоте, используя инструкции препроцессора, и тогда никакое обновление не вызовет подобных затруднений.