При работе в среде 1С:Предприятие 8 пользователи и разработчики иногда сталкиваются с ситуациями, когда привычные функции программы внезапно перестают работать, а система выдает пугающие сообщения об ошибках компиляции. Одна из таких проблем — ошибка «Переменная не определена (СкладОтветственногоХранения)» в модуле объекта справочника Склады. Проанализируем причины возникновения этой ситуации и разберем по шагам, как восстановить работоспособность базы данных.
Ошибка вида {Справочник.Склады.МодульОбъекта(196,25)}: Переменная не определена (СкладОтветственногоХранения) означает, что в программном коде модуля есть обращение к свойству или реквизиту, которого физически не существует в структуре метаданных справочника. Рассмотрим подробнее, почему так происходит:
Проанализируем фрагмент кода, в котором возникает ошибка. Обычно это происходит в процедурах проверки заполнения или установки функциональных опций. Посмотрим на пример типичного кода в модуле справочника Склады:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
МассивНепроверяемыхРеквизитов = Новый Массив;
Если Не ЭтоГруппа Тогда
// Проверка типа склада
Если (ТипСклада <> Перечисления.ТипыСкладов.РозничныйМагазин
Или ЗначениеЗаполнено(РозничныйВидЦены) ) Тогда
МассивНепроверяемыхРеквизитов.Добавить("РозничныйВидЦены");
КонецЕсли;
КонецЕсли;
// Ошибка возникает здесь
Если Не ЭтоГруппа И НЕ СкладОтветственногоХранения Тогда
МассивНепроверяемыхРеквизитов.Добавить("ВидПоклажедержателя");
МассивНепроверяемыхРеквизитов.Добавить("Поклажедержатель");
КонецЕсли;
КонецПроцедуры
В данном случае система пытается прочитать значение реквизита СкладОтветственногоХранения. Если в дереве метаданных (в конфигураторе) этого реквизита нет, программа не понимает, что это за переменная, и прекращает работу.
Прежде всего нам необходимо убедиться, что реквизит действительно отсутствует. Откроем конфигуратор, найдем справочник Склады и развернем ветку Реквизиты. Если в списке нет элемента с именем СкладОтветственногоХранения, его нужно добавить вручную для временного восстановления работы, но это лишь первый этап «лечения».
Важные параметры реквизита:
После добавления реквизита ошибка компиляции исчезнет, и вы сможете открывать карточки складов. Однако, если конфигурация «посыпалась» дальше, вы можете столкнуться со следующим типом ошибки: Метод объекта не обнаружен (ЕстьВидНоменклатурыТребующийОбязательностиОрдернойСхемыПоИзлишкамНедостачам).
Если после восстановления реквизита система выдает ошибку о «необнаруженном методе», это явный признак того, что общий модуль (например, НоменклатураСервер) устарел или не соответствует текущему модулю объекта. Рассмотрим ситуацию подробнее:
// Пример проблемного вызова в модуле Склады
Если НоменклатураСервер.ЕстьВидНоменклатурыТребующийОбязательностиОрдернойСхемыПоИзлишкамНедостачам() Тогда
// Логика обработки ордерной схемы
КонецЕсли;
Причина здесь кроется в том, что в процессе обновления один объект (справочник) обновился, а другой (общий модуль) — нет. Это состояние «битой» конфигурации. Чтобы исправить это правильно, нельзя просто добавлять пустые функции. Нужно восстановить эталонное состояние кода.
Самый надежный способ исправить ситуацию — выполнить процедуру Сравнения и объединения. В качестве источника можно использовать либо чистый файл поставки (.cf) того же релиза, либо старую резервную копию, в которой все работало корректно.
Выполним следующие действия:
Склады и общий модуль НоменклатураСервер.Важный совет: Если вы видите, что различий слишком много и они затрагивают множество объектов, возможно, стоит выполнить сравнение с Конфигурацией поставщика. Это поможет вернуть систему к стандартному виду, если в нее не вносились доработки.
Часто ошибки «Переменная не определена» при работе с файлами (например, при нажатии кнопки «Из присоединенных файлов») связаны с аналогичной проблемой в подсистеме Библиотеки Стандартных Подсистем (БСП). Если в карточке номенклатуры «отвалились» файлы, проверьте наличие справочника НоменклатураПрисоединенныеФайлы и корректность кода в общих модулях работы с файлами.
Профилактика подобных проблем:
Таким образом, мы выяснили, что ошибка «Переменная не определена» — это следствие нарушения целостности метаданных. Сочетание ручного исправления критических реквизитов и глубокого сравнения конфигураций позволяет полностью устранить проблему и вернуть систему в рабочее состояние без потери данных.