При обновлении или запуске старых типовых конфигураций (таких как Управление торговлей 10.3, Управление производственным предприятием 1.3 или Комплексная автоматизация 1.1) на современных версиях платформы «1С:Предприятие 8.3» разработчики часто сталкиваются с досадной ошибкой компиляции. Система выдает сообщение: {МодульОбычногоПриложения(56,7)}: Переменная с указанным именем уже определена (НаправлениеПоиска). Давайте разберем по шагам, почему возникает эта ситуация и как правильно её исправить, чтобы сохранить работоспособность программы.
Проанализируем ситуацию с технической точки зрения. Начиная с версии платформы 8.3.14, разработчики фирмы «1С» ввели новое системное перечисление — НаправлениеПоиска (в англоязычном варианте SearchDirection). Оно предназначено для управления глобальным поиском и поиском в строках и имеет три предопределенных значения: СНачала, Вперед и Назад.
Проблема заключается в том, что в старых конфигурациях, созданных еще во времена платформ 8.1 и 8.2, имя НаправлениеПоиска уже использовалось разработчиками в качестве глобальной переменной в МодульОбычногоПриложения. Когда вы запускаете такую конфигурацию на платформе 8.3.14 и выше, возникает конфликт имен. Платформа видит системный объект и переменную в коде с одинаковыми именами и отдает приоритет системному перечислению. В результате мы получаем ошибку: «Переменная уже определена».
Более того, если попытаться просто проигнорировать определение переменной, возникнет следующая ошибка: Поле объекта недоступно для записи (НаправлениеПоиска). Это происходит потому, что код пытается присвоить какое-либо значение (например, структуру или ссылку) системному перечислению, которое по своей природе доступно только для чтения.
Рассмотрим попытки решения через настройки конфигурации. Казалось бы, логично понизить режим совместимости до версии 8.2.13 или 8.3.10. Однако, как показывает практика, платформа 8.3.17 и выше все равно «знает» о существовании системного перечисления НаправлениеПоиска, независимо от режима совместимости.
Кроме того, современные релизы конфигураций (даже старых линеек) начинают использовать механизмы, появившиеся в более новых версиях платформы, например, Общие реквизиты. Попытка установить режим совместимости ниже 8.2.12 приведет к тому, что конфигурация просто откажется сохраняться из-за использования несовместимых объектов метаданных. Поэтому путь изменения режима совместимости — это тупиковая ветка развития ситуации.
Самый надежный и правильный способ устранения данной проблемы — это переименование переменной НаправлениеПоиска во всей конфигурации. Посмотрим, как это сделать максимально эффективно, не нарушив логику работы программы.
Важно понимать, что переменная в МодульОбычногоПриложения обычно объявлена с ключевым словом Экспорт:
// В Модуле обычного приложения
Перем НаправлениеПоиска Экспорт;
Это означает, что она может использоваться в любом месте кода: в общих модулях, в формах документов, в обработках. Поэтому простого переименования в одном модуле будет недостаточно. Проанализируем алгоритм действий:
НаправлениеПоиска.глНаправлениеПоиска или НаправлениеПоиска_УТ. Использование префикса «гл» (глобальная) поможет в будущем сразу понимать, что это переменная приложения, а не системный объект.Если вы предпочитаете точечные правки или конфигурация небольшая, проанализируем, где именно чаще всего встречаются проблемные участки. Первым делом мы идем в Модуль обычного приложения. Нам нужно найти строку определения и инициализации:
// Было:
Перем НаправлениеПоиска Экспорт;
// Стало:
Перем глНаправлениеПоиска Экспорт;
Затем найдем процедуру, где эта переменная инициализируется (обычно это ПриНачалеРаботыСистемы). Посмотрим на пример кода до и после правки:
// Было:
НаправлениеПоиска = Новый Структура;
НаправлениеПоиска.Вставить("Вперед", 1);
// Стало:
глНаправлениеПоиска = Новый Структура;
глНаправлениеПоиска.Вставить("Вперед", 1);
Помните, что если вы оставите старое имя НаправлениеПоиска при попытке записи в него структуры, платформа выдаст ошибку Поле объекта недоступно для записи, так как она будет считать, что вы пытаетесь изменить значение встроенного перечисления платформы.
Если ваша конфигурация находится на поддержке, важно знать, что фирма «1С» в последних релизах (например, в 10.3.64.1 и выше для УТ) уже провела работу по переименованию этой переменной. Однако, если вы обновляетесь с очень старого релиза на промежуточный, ошибка может проявиться в момент первого запуска после объединения метаданных.
В этом случае у вас есть два пути:
НаправлениеПоиска на другое имя во всех модулях.Проанализируем ситуацию, когда после переименования конфигурация все равно выдает ошибки. Это может быть связано с тем, что переменная использовалась во внешних обработках или отчетах, которые не входят в состав основной конфигурации. В таких файлах замену придется произвести вручную, открыв каждый файл в конфигураторе.
Подводя итог, отметим, что ошибка с НаправлениеПоиска — это классический пример конфликта имен при развитии платформы. Мы разобрали, что наиболее правильным решением является полное переименование переменной в коде конфигурации. Это позволяет избежать конфликтов с системными объектами платформы 8.3.14+ и гарантирует стабильную работу системы даже на самых свежих версиях платформы 8.3.20, 8.3.23 и выше.
Использование уникальных префиксов для глобальных переменных является хорошим тоном разработки и помогает избежать подобных проблем в будущем, когда в платформе могут появиться новые системные объекты с популярными названиями.