В процессе разработки и администрирования систем на платформе 1С:Предприятие специалисты часто сталкиваются со странным поведением предопределенных элементов справочников. Бывают ситуации, когда элемент создан в конфигураторе, код программы успешно к нему обращается, но в пользовательском режиме «1С:Предприятие» в форме списка этот элемент упорно не отображается. Особенно часто это происходит со специфическими справочниками, такими как ВнешниеОбработки или ДополнительныеОтчетыИОбработки (например, при использовании обработки «Обмен ЭСФ» в конфигурации «Бухгалтерия для Казахстана»).
В этой статье мы подробно разберем, почему предопределенные элементы могут «исчезать» из интерфейса программы, проанализируем внутренние механизмы платформы 1С версий 8.2 и 8.3, а также рассмотрим пошаговые инструкции по возвращению скрытых или поврежденных предопределенных данных.
Разберем наиболее частую и неочевидную причину «исчезновения» элементов. В интерфейсе пользователя многие формы списков открываются не «как есть», а с наложением жестких программных отборов в коде конфигурации. Это делается для удобства разделения данных.
В справочнике ВнешниеОбработки (или аналогичном ему в современных версиях БСП) существует реквизит, определяющий тип или назначение объекта — например, ВидОбработки. Этот реквизит может принимать значения из соответствующего перечисления (например, дополнительные печатные формы, отчеты, обработки, заполнение табличных частей). При открытии формы списка система программно устанавливает отбор по этому реквизиту. Если у созданного предопределенного элемента данный реквизит оказался не заполнен или заполнен некорректно, стандартный динамический список формы просто отфильтрует его. При этом физически в базе данных элемент существует, и его можно найти через консоль запросов или универсальные обработки поиска данных.
Выяснить причину программного фильтра можно, проанализировав модуль формы списка справочника, обратив внимание на процедуру ПриОткрытии или ПриСозданииНаСервере, где устанавливаются параметры отбора динамического списка.
Если элемент физически присутствует в базе данных, но скрыт из-за незаполненного реквизита, нам нужно принудительно установить этот реквизит в правильное значение. Поскольку стандартными средствами через форму списка мы не можем открыть скрытый элемент, воспользуемся универсальными инструментами.
Рассмотрим пошагово, как это сделать в режиме «1С:Предприятие»:
ВнешниеОбработки (или ДополнительныеОтчетыИОбработки).ИмяПредопределенныхДанных равно "ОбменЭСФ" или по наименованию элемента), чтобы обработка нашла конкретно наш скрытый объект.ВидОбработки (или аналогичный реквизит вида).После выполнения этих действий и обновления формы списка в пользовательском режиме предопределенный элемент появится на своем законном месте.
Для понимания сути проблемы важно проанализировать, как именно платформа связывает предопределенные элементы из конфигуратора с фактическими записями в таблицах базы данных.
В платформе 1С:Предприятие 8.2 (и при использовании режимов совместимости ниже 8.3) связь объектов БД с деревом метаданных осуществляется жестко по уникальному внутреннему идентификатору (UUID). Если разработчик случайно удалил предопределенный элемент в конфигураторе, а затем создал новый с точно таким же именем, платформа сгенерирует для него совершенно новый UUID. При обновлении информационной базы старая запись в таблице СУБД потеряет признак предопределенности (у нее пропадет золотой кружок на иконке), а новая запись может вообще не создаться или создаться как дубликат. Любые обращения в программном коде по имени предопределенного элемента начнут вызывать ошибки.
В платформе 1С:Предприятие 8.3 механизм был кардинально переработан. Появилось специальное системное поле — ИмяПредопределенныхДанных. Теперь связь осуществляется по строковому идентификатору, заданному в конфигураторе. Это нововведение позволило управлять предопределенными элементами непосредственно в режиме «1С:Предприятие»: связывать существующие обычные элементы с предопределенными, удалять их или пересоздавать без потери ссылочной целостности базы данных.
Еще одна распространенная техническая причина — свойство справочника в конфигураторе «Обновление предопределенных данных». Оно может принимать три значения:
Если для справочника установлено значение «Не обновлять автоматически», новые элементы не появятся в режиме «1С:Предприятие» до тех пор, пока не будет вызван принудительный механизм инициализации данных.
В распределенных информационных системах (РИБ) создание предопределенных элементов подчиняется строгим правилам. При добавлении нового предопределенного элемента в главном узле, в подчиненные узлы он должен приходить исключительно через файлы обмена данными. Если в подчиненном узле произошло некорректное обновление конфигурации без предварительного приема сообщения обмена, связь предопределенных элементов может нарушиться, и они «зависнут» в неинициализированном состоянии.
Рассмотрим методы принудительного восстановления сопоставления предопределенных данных. Если элементы повреждены, удалены или не инициализировались, мы можем воспользоваться встроенным языком 1С.
Для платформы 1С:Предприятие 8.3 мы можем программно сбросить признак инициализации предопределенных данных для конкретного справочника и запустить этот процесс заново. Посмотрим на пример кода, который можно выполнить во внешней обработке:
Процедура ВосстановитьПредопределенныеЭлементы() Экспорт
// Сбрасываем флаг инициализации для нужного справочника
УстановитьИнициализациюПредопределенныхДанных(Ложь);
// Запускаем процесс повторного создания и сопоставления элементов
ИнициализироватьПредопределенныеДанные();
Сообщить("Инициализация предопределенных данных справочника успешно завершена!");
КонецПроцедуры
Если ваша конфигурация разработана с использованием Библиотеки стандартных подсистем (БСП), в ней предусмотрены готовые механизмы для обновления служебных реквизитов дополнительных отчетов и обработок. Для принудительного обновления и восстановления структуры можно использовать вызовы экспортных процедур общих модулей БСП:
// Пример вызова обновления для конфигураций на БСП
ДополнительныеОтчетыИОбработкиВладелецВызова = Справочники.ДополнительныеОтчетыИОбработки;
ДополнительныеОтчетыИОбработкиВладелецВызова.ИнициализироватьПредопределенныеДанные();
В тех случаях, когда сбой произошел на уровне СУБД (например, повредилась служебная таблица соответствия _REFSINF), стандартные методы встроенного языка могут не сработать. В этой ситуации проанализируем системные утилиты тестирования:
chdbfl.exe), которая находится в каталоге установки платформы 1С.Подводя итог, отметим: если предопределенный элемент справочника не отображается в режиме Предприятия, в первую очередь всегда проверяйте наличие скрытых отборов по реквизитам в форме списка. В 90% случаев проблема решается простым заполнением недостающих реквизитов элемента через универсальные групповые обработки.