Как исправить ошибку «ОпределяемыеТипы не определены» при обновлении 1С:УПП

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При обновлении крупных и сильно кастомизированных конфигураций 1С, таких как Управление производственным предприятием (УПП), редакция 1.3, программисты часто сталкиваются с неожиданными ошибками компиляции. Одна из наиболее коварных и массовых проблем в последних релизах — появление ошибок вида Процедура или функция с указанным именем не определена (ОпределяемыеТипы).

В этой статье мы подробно разберем, почему возникает эта ошибка, как устроена архитектура эмуляции типов в решениях на обычных формах и как правильно исправить эту проблему при ручном обновлении через сравнение и объединение конфигураций.

Почему возникает путаница с платформенным механизмом?

Начиная с версии платформы 1С:Предприятие 8.3.3, разработчикам доступен стандартный объект метаданных — Определяемые типы (в англоязычной версии — DefinedTypes). Этот объект позволяет централизованно описывать типы данных, используемые во многих местах конфигурации (например, для идентификаторов систем маркировки, реквизитов контрагентов или документов-оснований).

Однако конфигурация 1С:УПП 1.3 исторически разрабатывалась под платформу 8.2. Даже при запуске на современных версиях платформы 8.3 она функционирует в режиме совместимости (как правило, с версией 8.2.13 или 8.2.16). В таком режиме физическое использование платформенных определяемых типов невозможно. При попытке сохранить конфигурацию с реальным объектом метаданных типа ОпределяемыйТип платформа выдаст ошибку совместимости.

Как вендор реализовал обходной путь (эмуляцию)

Поскольку в УПП необходимо было оперативно внедрить современные государственные подсистемы интеграции (ИС МП «Честный Знак», ЕГАИС, ВетИС), которые в типовых ERP-решениях построены на определяемых типах, разработчики 1С применили элегантный обходной путь — программную эмуляцию коллекции типов.

Они создали глобальную функцию-обертку с именем ОпределяемыеТипы в глобальном общем модуле. Рассмотрим структуру этого механизма подробнее:

  1. Создается общий модуль ИнтеграцияЕГАИСУТКлиентСерверГлобальный с установленным флагом Глобальный.
  2. Внутри этого модуля объявляется экспортная функция, имитирующая коллекцию:

Функция ОпределяемыеТипы() Экспорт
    #Если НЕ ВебКлиент И НЕ ТонкийКлиент Тогда
        Возврат ИнтеграцияИСУТПовтИсп.ОпределяемыеТипыУПП();
    #КонецЕсли
КонецФункции

При вызове в коде конструкции вида ОпределяемыеТипы["ОснованиеЗаказНаЭмиссиюКодовМаркировкиИСМП"].Тип, платформа обращается к этой глобальной функции. Функция, в свою очередь, возвращает кэшированную структуру (объект ФиксированнаяСтруктура), подготовленную модулем повторного использования ИнтеграцияИСПовтИсп (или ИнтеграцияИСУТПовтИсп).

Проанализируем пример формирования этой структуры в модуле повторного использования:


Функция ОпределяемыеТипыУПП() Экспорт
    Типы = Новый Структура;
    
    Типы.Вставить("gln", Новый Структура("Тип", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(13))));
    Типы.Вставить("gtin", Новый Структура("Тип", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(14))));
    
    Типы.Вставить("документыисмп", Новый Структура("Тип", Новый ОписаниеТипов(
        "ДокументСсылка.МаркировкаТоваровИСМП,
        |ДокументСсылка.ЗаказНаЭмиссиюКодовМаркировкиСУЗ,
        |ДокументСсылка.ВыводИзОборотаИСМП,
        |ДокументСсылка.СписаниеКодовМаркировкиИСМП,
        |ДокументСсылка.ПеремаркировкаТоваровИСМП"
    )));
    
    Типы.Вставить("номенклатура", Новый Структура("Тип", Новый ОписаниеТипов("СправочникСсылка.Номенклатура")));
    Типы.Вставить("организация", Новый Структура("Тип", Новый ОписаниеТипов("СправочникСсылка.Организации")));
    
    Возврат Новый ФиксированнаяСтруктура(Типы);
КонецФункции

Благодаря этому приему разработчики смогли использовать один и тот же программный код интеграции с ГИС как в современных ERP-системах с реальными определяемыми типами, так и в устаревшей УПП 1.3 с эмулируемой структурой.

Выясняем причину ошибки при обновлении

Если после обновления конфигурации вы получаете сотни ошибок вида Процедура или функция с указанным именем не определена (ОпределяемыеТипы), это однозначно указывает на то, что платформа не может найти глобальную функцию ОпределяемыеТипы().

Разберем по шагам, почему это происходит во время обновления:

Пошаговая инструкция по исправлению ошибки

Для устранения этой ошибки выполните следующие действия:

  1. Откройте конфигурацию в режиме Конфигуратор.
  2. Найдите в дереве метаданных общий модуль ИнтеграцияЕГАИСУТКлиентСерверГлобальный. Если его нет, выполните повторное сравнение-объединение с файлом обновления (.cf или .cfu соответствующего релиза) и принудительно перенесите данный модуль.
  3. Откройте палитру свойств этого общего модуля (нажав по нему правой кнопкой мыши и выбрав «Свойства»). Убедитесь, что установлены флажки Глобальный, Сервер и необходимые клиентские галочки.
  4. Откройте модуль и проверьте наличие экспортной функции ОпределяемыеТипы(). Если она отсутствует или закомментирована, восстановите её код из типовой конфигурации поставщика.
  5. Проверьте наличие общего модуля повторного использования ИнтеграцияИСУТПовтИсп (или аналогичного для вашего релиза интеграции) и наличие в нем функции ОпределяемыеТипыУПП(), которая возвращает структуру типов.
  6. Запустите полную синтаксическую проверку конфигурации, чтобы убедиться, что все обращения к коллекции успешно компилируются.

Дополнительно: Ошибка в процедуре «ДополнитьМассивМенеджеровСсылочнымТипом» на плане счетов «Бюджетирование»

В процессе обновления до релизов 1.3.137.x вы можете столкнуться с еще одной специфической ошибкой при запуске обработчиков обновления информационной базы. Сбой происходит в процедуре ДополнитьМассивМенеджеровСсылочнымТипом при попытке зарегистрировать менеджер плана счетов Бюджетирование.

Рассмотрим причины этой проблемы и способы их локализации:

1. Нарушение уникальных идентификаторов (UUID) метаданных

Если база данных ранее обновлялась некорректно (например, «грязным» копированием объектов или частичным сравнением без сохранения конфигурации поставщика), внутренний GUID плана счетов Бюджетирование в основной конфигурации мог разойтись с конфигурацией поставщика. Визуально объект отображается в дереве, но при попытке программного обращения по имени через коллекцию ПланыСчетов платформа выдает исключение.

Решение: Выполните операцию «Конфигурация — Поддержка — Настройка поддержки», найдите план счетов «Бюджетирование» и убедитесь, что он стоит на поддержке. При необходимости выполните повторное объединение с полной конфигурацией поставщика (файлом .cf) с приоритетом конфигурации поставщика для восстановления UUID объектов.

2. Сбой кэша метаданных платформы 1С

При обновлении структуры крупных баз на сервере 1С:Предприятия часто зависает старый серверный кэш конфигурации. Платформа пытается выполнить код обновления, обращаясь к несуществующим в старой структуре реквизитам плана счетов.

Решение: Остановите службу сервера 1С:Предприятия. Полностью очистите папки серверного кэша (каталог snccntry и временные папки баз внутри каталога srvinfo). Также очистите локальный кэш пользователя на рабочем компьютере, с которого выполняется обновление.

3. Ошибки логической и ссылочной целостности

Если в таблицах субконто или движениях по бюджетированию остались «битые» ссылки, обращение к менеджеру плана счетов при обновлении может вызывать системный сбой СУБД.

Решение: Запустите Тестирование и исправление со следующими настройками:

← На главную