В процессе эксплуатации систем на базе 1С:Предприятие 8.3 разработчики часто сталкиваются с ситуацией, когда расширение, которое вчера работало исправно, внезапно начинает «глючить». Это проявляется в том, что документы (например, Приходные кассовые ордера — ПКО) перестают открываться, выдавая ошибку «Переменная не определена» или указывая на отсутствие общего модуля. При этом в списке расширений оно значится как активное.
В этой статье мы подробно разберем, почему это происходит, как диагностировать проблему и какие шаги предпринять для ее окончательного решения. Мы проанализируем ситуацию на примере платформы 8.3.18.1289 и конфликта имен общих модулей.
Проанализируем исходную ситуацию. В системе существует два общих модуля с идентичным именем — РозничныеПродажи. Один находится в основной конфигурации, другой — в расширении. Это «классическая» ловушка для разработчика. Рассмотрим, к чему это приводит:
Если мы не можем прямо сейчас обновить платформу или переименовать модули, разберем способ программного вызова методов. Вместо прямого обращения к модулю РозничныеПродажи, мы будем использовать механизмы Библиотеки стандартных подсистем (БСП).
Посмотрим на пример кода, который вызывает ошибку:
// Прямое обращение часто вызывает ошибку "Переменная не определена"
РозничныеПродажи.ТаблицаТоваровСРаспределениемКодовМаркировкиИСМП(Товары, ДанныеДляИСМП);
Заменим его на безопасный вызов через модуль ОбщегоНазначения. Это позволит системе найти модуль в режиме реального времени (runtime), даже если статическая ссылка на него «отвалилась» из-за глюка платформы:
// Безопасный вызов модуля через обертку БСП
МодульРозничныеПродажи = ОбщегоНазначения.ОбщийМодуль("РозничныеПродажи");
МодульРозничныеПродажи.ТаблицаТоваровСРаспределениемКодовМаркировкиИСМП(Товары, ДанныеДляИСМП);
Важно: Этот метод сработает только в том случае, если в вашей конфигурации внедрена БСП. Если нет — функцию ОбщийМодуль можно написать самостоятельно, используя метод Вычислить(), хотя это менее рекомендуемый путь.
Выясним, как правильно организовать структуру модулей в расширении, чтобы избежать конфликтов. Если вам нужно расширить функционал существующего модуля РозничныеПродажи, не создавайте новый модуль с таким же именем. Выполните следующие шаги:
пр_РозничныеПродажи или Расш1_РозничныеПродажи.Такой подход гарантирует, что компилятор 1С однозначно определит, к какому именно программному коду нужно обратиться, и «отваливание» расширения станет невозможным из-за пересечения имен.
Если переименование не помогает и ошибка повторяется у всех пользователей (как в нашем случае), проанализируем состояние серверного кэша. Обычная очистка кэша на локальном компьютере пользователя здесь не поможет, так как расширения кэшируются на стороне сервера 1С:Предприятия.
Разберем порядок действий для системного администратора или разработчика:
C:\Program Files\1cv8\srvinfo).reg_1541), внутри них будут папки с идентификаторами информационных баз.snccntx и config внутри папки вашей базы. Внимание: Не удаляйте файлы журналов регистрации (папка 1Cv8Log), если они вам нужны.После этой процедуры платформа будет вынуждена заново перечитать все метаданные основной конфигурации и всех подключенных расширений, что часто устраняет «фантомные» ошибки.
Поскольку мы используем релиз 8.3.18.1289, стоит признать, что это одна из самых проблемных версий в плане работы с расширениями. Фирма «1С» выпустила множество исправлений в последующих релизах.
Проанализируем ситуацию: если ошибки в расширении возникают хаотично (то работают, то нет), лучшим решением будет переход на более стабильную версию. Рассмотрим подходящие варианты:
Иногда расширение может блокироваться из-за настроек безопасности. Проверим этот момент:
Подведем итог: если у вас «отваливается» расширение и документы не открываются, сначала проверьте уникальность имен модулей. Если имена дублируются — используйте префиксы. Если проблема сохраняется — используйте программный вызов через ОбщегоНазначения.ОбщийМодуль() и обязательно запланируйте очистку серверного кэша или обновление платформы до актуального релиза.