При обновлении крупных и сильно кастомизированных конфигураций 1С, таких как Управление производственным предприятием (УПП), редакция 1.3, программисты часто сталкиваются с неожиданными ошибками компиляции. Одна из наиболее коварных и массовых проблем в последних релизах — появление ошибок вида Процедура или функция с указанным именем не определена (ОпределяемыеТипы).
В этой статье мы подробно разберем, почему возникает эта ошибка, как устроена архитектура эмуляции типов в решениях на обычных формах и как правильно исправить эту проблему при ручном обновлении через сравнение и объединение конфигураций.
Начиная с версии платформы 1С:Предприятие 8.3.3, разработчикам доступен стандартный объект метаданных — Определяемые типы (в англоязычной версии — DefinedTypes). Этот объект позволяет централизованно описывать типы данных, используемые во многих местах конфигурации (например, для идентификаторов систем маркировки, реквизитов контрагентов или документов-оснований).
Однако конфигурация 1С:УПП 1.3 исторически разрабатывалась под платформу 8.2. Даже при запуске на современных версиях платформы 8.3 она функционирует в режиме совместимости (как правило, с версией 8.2.13 или 8.2.16). В таком режиме физическое использование платформенных определяемых типов невозможно. При попытке сохранить конфигурацию с реальным объектом метаданных типа ОпределяемыйТип платформа выдаст ошибку совместимости.
Поскольку в УПП необходимо было оперативно внедрить современные государственные подсистемы интеграции (ИС МП «Честный Знак», ЕГАИС, ВетИС), которые в типовых ERP-решениях построены на определяемых типах, разработчики 1С применили элегантный обходной путь — программную эмуляцию коллекции типов.
Они создали глобальную функцию-обертку с именем ОпределяемыеТипы в глобальном общем модуле. Рассмотрим структуру этого механизма подробнее:
ИнтеграцияЕГАИСУТКлиентСерверГлобальный с установленным флагом Глобальный.
Функция ОпределяемыеТипы() Экспорт
#Если НЕ ВебКлиент И НЕ ТонкийКлиент Тогда
Возврат ИнтеграцияИСУТПовтИсп.ОпределяемыеТипыУПП();
#КонецЕсли
КонецФункции
При вызове в коде конструкции вида ОпределяемыеТипы["ОснованиеЗаказНаЭмиссиюКодовМаркировкиИСМП"].Тип, платформа обращается к этой глобальной функции. Функция, в свою очередь, возвращает кэшированную структуру (объект ФиксированнаяСтруктура), подготовленную модулем повторного использования ИнтеграцияИСПовтИсп (или ИнтеграцияИСУТПовтИсп).
Проанализируем пример формирования этой структуры в модуле повторного использования:
Функция ОпределяемыеТипыУПП() Экспорт
Типы = Новый Структура;
Типы.Вставить("gln", Новый Структура("Тип", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(13))));
Типы.Вставить("gtin", Новый Структура("Тип", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(14))));
Типы.Вставить("документыисмп", Новый Структура("Тип", Новый ОписаниеТипов(
"ДокументСсылка.МаркировкаТоваровИСМП,
|ДокументСсылка.ЗаказНаЭмиссиюКодовМаркировкиСУЗ,
|ДокументСсылка.ВыводИзОборотаИСМП,
|ДокументСсылка.СписаниеКодовМаркировкиИСМП,
|ДокументСсылка.ПеремаркировкаТоваровИСМП"
)));
Типы.Вставить("номенклатура", Новый Структура("Тип", Новый ОписаниеТипов("СправочникСсылка.Номенклатура")));
Типы.Вставить("организация", Новый Структура("Тип", Новый ОписаниеТипов("СправочникСсылка.Организации")));
Возврат Новый ФиксированнаяСтруктура(Типы);
КонецФункции
Благодаря этому приему разработчики смогли использовать один и тот же программный код интеграции с ГИС как в современных ERP-системах с реальными определяемыми типами, так и в устаревшей УПП 1.3 с эмулируемой структурой.
Если после обновления конфигурации вы получаете сотни ошибок вида Процедура или функция с указанным именем не определена (ОпределяемыеТипы), это однозначно указывает на то, что платформа не может найти глобальную функцию ОпределяемыеТипы().
Разберем по шагам, почему это происходит во время обновления:
ИнтеграцияЕГАИСУТКлиентСерверГлобальный не был перенесен или обновлен, функция физически отсутствует в базе.Для устранения этой ошибки выполните следующие действия:
ИнтеграцияЕГАИСУТКлиентСерверГлобальный. Если его нет, выполните повторное сравнение-объединение с файлом обновления (.cf или .cfu соответствующего релиза) и принудительно перенесите данный модуль.ОпределяемыеТипы(). Если она отсутствует или закомментирована, восстановите её код из типовой конфигурации поставщика.ИнтеграцияИСУТПовтИсп (или аналогичного для вашего релиза интеграции) и наличие в нем функции ОпределяемыеТипыУПП(), которая возвращает структуру типов.В процессе обновления до релизов 1.3.137.x вы можете столкнуться с еще одной специфической ошибкой при запуске обработчиков обновления информационной базы. Сбой происходит в процедуре ДополнитьМассивМенеджеровСсылочнымТипом при попытке зарегистрировать менеджер плана счетов Бюджетирование.
Рассмотрим причины этой проблемы и способы их локализации:
Если база данных ранее обновлялась некорректно (например, «грязным» копированием объектов или частичным сравнением без сохранения конфигурации поставщика), внутренний GUID плана счетов Бюджетирование в основной конфигурации мог разойтись с конфигурацией поставщика. Визуально объект отображается в дереве, но при попытке программного обращения по имени через коллекцию ПланыСчетов платформа выдает исключение.
Решение: Выполните операцию «Конфигурация — Поддержка — Настройка поддержки», найдите план счетов «Бюджетирование» и убедитесь, что он стоит на поддержке. При необходимости выполните повторное объединение с полной конфигурацией поставщика (файлом .cf) с приоритетом конфигурации поставщика для восстановления UUID объектов.
При обновлении структуры крупных баз на сервере 1С:Предприятия часто зависает старый серверный кэш конфигурации. Платформа пытается выполнить код обновления, обращаясь к несуществующим в старой структуре реквизитам плана счетов.
Решение: Остановите службу сервера 1С:Предприятия. Полностью очистите папки серверного кэша (каталог snccntry и временные папки баз внутри каталога srvinfo). Также очистите локальный кэш пользователя на рабочем компьютере, с которого выполняется обновление.
Если в таблицах субконто или движениях по бюджетированию остались «битые» ссылки, обращение к менеджеру плана счетов при обновлении может вызывать системный сбой СУБД.
Решение: Запустите Тестирование и исправление со следующими настройками: