В практике разработки и администрирования систем на платформе 1С:Предприятие 8 иногда возникает странная и неприятная ситуация: в поле ввода, связанном с типом Перечисление, вместо привычного списка доступных значений отображается текст Пустое значение. Это происходит даже в тех случаях, когда в конфигураторе перечисление заполнено, а стандартное тестирование и исправление информационной базы не выдает ошибок. Давайте детально разберем, почему так происходит, и пройдем по шагам от простых решений к сложным методам восстановления работоспособности системы.
Когда мы видим Пустое значение вместо списка выбора, это сигнализирует о том, что платформа на уровне интерфейса не может сопоставить внутренний идентификатор (UUID) значения перечисления с его текстовым представлением. Это может быть связано как с физическим повреждением данных в таблицах SQL, так и с логическими ограничениями в самой конфигурации или «замусоренным» кэшем. Если в чистой базе (после выгрузки и загрузки .dt) проблема исчезает, значит, корень зла кроется в локальных настройках сеанса, серверном кэше или специфических данных конкретной ИБ.
Первым делом мы должны исключить самую тривиальную причину — некорректный кэш. Платформа 1С активно кэширует представления объектов для ускорения работы интерфейса. Если кэш «битый», вы будете видеть пустые строки там, где должны быть данные.
Рассмотрим порядок действий для полной очистки:
1C:Enterprise 8.3 Server Agent. Перейдите в каталог кластера (обычно это C:\Program Files\1cv8\srvinfo) и удалите содержимое папок внутри reg_1541, за исключением файлов конфигурации кластера./ClearCache, хотя этот метод менее радикален, чем ручное удаление папок.Выясним, не вмешивается ли в процесс отображения программный код. В платформе 1С существует специальное событие ОбработкаПолученияПредставления, которое может быть определено в модуле менеджера перечисления. Если в этом обработчике допущена ошибка или он принудительно устанавливает пустое значение, вы получите именно тот результат, который мы обсуждаем.
Проанализируем пример кода, который мог бы привести к проблеме:
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
// Если здесь по ошибке очищается представление:
Представление = "";
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Проверьте модуль менеджера вашего перечисления. Если этот обработчик существует, попробуйте временно закомментировать его содержимое и проверить, появятся ли значения в интерфейсе. Также убедитесь, что в форме документа не используется событие АвтоПодбор или ОкончаниеВводаТекста, которые могут динамически очищать список выбора.
Если конкретные значения перечисления или само перечисление включены в состав Функциональных опций, платформа будет скрывать их, если опция выключена. В «чистой» базе, куда вы выгружали конфигурацию, настройки функциональных опций могут отличаться (например, они могут быть включены по умолчанию или вовсе не заданы в константах), что объясняет, почему там всё работает.
Выполним проверку по следующим пунктам:
ФункциональнойОпции.Иногда проблема кроется в настройках самого элемента управления на форме. Разберем ситуацию, когда реквизит имеет составной тип или наложены ограничения на список выбора.
Посмотрим на свойства поля ввода в редакторе формы:
Да, платформа строит список в памяти. Попробуйте переключить в Авто или Нет.ПриСозданииНаСервере. Если код заполняет Элементы.ИмяПоля.СписокВыбора вручную, он может передавать туда пустые ссылки.Если ничего из вышеперечисленного не помогло, и вы подозреваете физическое повреждение базы (несмотря на пройденный ТИС), придется заглянуть в «подкапотное пространство» SQL-сервера. Нам нужно убедиться, что идентификаторы в таблице документа соответствуют идентификаторам в таблице перечисления.
Проанализируем ситуацию через SQL-запрос. Сначала определим имена таблиц с помощью функции ПолучитьСтруктуруХраненияБазыДанных(). Допустим, наше перечисление называется _Enum15, а документ _Document100.
Выполним примерную проверку в консоли SQL:
-- Посмотрим, какие значения реально лежат в поле документа
SELECT DISTINCT [ИмяРеквизита_RRRef]
FROM [_Document100]
-- Проверим, существуют ли такие ссылки в таблице перечисления
SELECT [_IDRRef], [_EnumOrder]
FROM [_Enum15]
Если в таблице документа есть значения (бинарные ссылки), которых нет в таблице _Enum, это означает нарушение ссылочной целостности. В этом случае Тестирование и исправление должно было создать объекты «Объект не найден», но для перечислений этот механизм иногда отрабатывает специфично. В такой ситуации может потребоваться ручная корректировка значений в таблице документа через UPDATE в SQL или программная перезапись реквизитов в 1С на корректные значения.
Современные конфигурации часто используют расширения. Если перечисление или документ, в котором оно используется, заимствованы в расширение, может возникнуть конфликт метаданных. Рассмотрим, как это проверить:
Ситуация с отображением Пустого значения вместо перечисления — это комплексная проблема, которая чаще всего решается очисткой серверного кэша или проверкой функциональных опций. Однако никогда не стоит забывать о возможности программной ошибки в ОбработкеПолученияПредставления. Последовательно применяя описанные методы, вы обязательно найдете причину сбоя и вернете системе работоспособность.