При разработке расширений для конфигурации 1С:Зарплата и управление персоналом 3.1 (КОРП) программисты часто сталкиваются с ситуацией, когда после добавления нового функционала система отказывается запускаться, выдавая критическую ошибку: «В данный момент вход в приложение невозможен. Не удалось создать новую версию расширений». Рассмотрим подробно причины этой проблемы, проанализируем механизмы работы платформы 8.3.24 и разберем по шагам, как исправить подобные ошибки.
Представим ситуацию: мы разрабатываем расширение для автоматизации уведомлений о кадровых изменениях. Нам необходимо отслеживать создание новых документов ПриемНаРаботу и Увольнение. Для реализации этой задачи мы используем стандартный механизм подписок на события, вынесенный в расширение.
Логика работы следующая:
ПередЗаписью мы фиксируем, является ли объект новым, и сохраняем этот признак в ДополнительныеСвойства (также можно использовать дополнительные реквизиты табличных частей).ПриЗаписи мы проверяем этот признак и, если объект новый, вызываем функцию подготовки параметров для отправки электронного письма.Разберем типичный код обработчика, который может привести к ошибке:
Процедура УведКадрИзм_УведомлениеОКадровыхИзмененияхПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Сохраняем признак нового объекта
Источник.ДополнительныеСвойства.Вставить("ЭтоНовый", Источник.ЭтоНовый());
КонецПроцедуры
Процедура УведКадрИзм_УведомлениеОКадровыхИзмененияхПриЗаписи(Источник, Отказ) Экспорт
Если Отказ Тогда
Возврат;
КонецЕсли;
ЭтоНовый = Ложь;
Если НЕ Источник.ДополнительныеСвойства.Свойство("ЭтоНовый", ЭтоНовый) ИЛИ НЕ ЭтоНовый Тогда
Возврат;
КонецЕсли;
ПараметрыПисьма = ПодготовитьПараметрыПисьма(Источник);
// Далее следует логика отправки...
КонецПроцедуры
Ошибка проявляется именно в функции ПодготовитьПараметрыПисьма, когда мы пытаемся обратиться к реквизиту Источник.Сотрудник. При включении активности расширения программа просто не дает пользователю авторизоваться.
Многие ошибочно полагают, что ошибка возникнет только в момент выполнения кода (при записи документа). Однако в современных версиях платформы (особенно начиная с 8.3.24) реализован строгий механизм валидации метаданных при компиляции модулей расширения (для глубокой проверки модулей удобно использовать анализ конфигураций и расширений).
Когда вы запускаете сеанс 1С:Предприятие (в процессе которого могут появляться новые сообщения для расшифровки), система выполняет следующие действия:
Источник.Сотрудник), компилятор проверяет, есть ли это свойство у всех типов объектов, которые выбраны в качестве источника для этой подписки.Если хотя бы у одного типа объекта в списке подписки отсутствует поле Сотрудник, платформа считает код расширения некорректным и блокирует создание версии расширения в памяти. Это и приводит к сообщению «В данный момент вход в приложение невозможен».
Проанализируем состав типов в подписке. Часто из-за невнимательности при выборе документов в списке Состав типов оказывается лишний объект. Например, случайно выбранный СправочникОбъект или другой документ, у которого нет реквизита Сотрудник.
В нашем случае выяснилось, что в расширении в подписку случайно попал тип СправочникОбъект. Поскольку ни один справочник в расширении не имел реквизита Сотрудник, система безопасности типов 1С заблокировала работу расширения целиком. Важно помнить: даже если код фактически не будет вызываться для этого типа, компилятор требует его валидности «на бумаге».
В конфигурации ЗУП 3.1 существует важная архитектурная особенность. Для кадровых событий предусмотрены два вида документов:
ПриемНаРаботу, Увольнение. У них реквизит Сотрудник находится в шапке.ПриемНаРаботуСписком, УвольнениеСписком. У этих документов нет реквизита Сотрудник в шапке; данные о сотрудниках находятся в табличной части Сотрудники.Если в вашу подписку в расширении попал «списковый» документ, обращение Источник.Сотрудник вызовет фатальную ошибку валидации при старте системы, так как для одного из источников это поле физически не существует в метаданных.
Чтобы избежать подобных проблем и сделать код расширения устойчивым к изменениям метаданных, мы рекомендуем использовать методы безопасного обращения к реквизитам. Вместо прямой связи через точку, проанализируем ситуацию и применим методы проверки.
Рассмотрим пример правильной реализации функции в общем модуле расширения:
Функция ПодготовитьПараметрыПисьма(Источник)
// 1. Проверяем тип объекта перед обращением к свойствам
МетаданныеОбъекта = Источник.Метаданные();
ЭтоПриемНаРаботу = (МетаданныеОбъекта = Метаданные.Документы.ПриемНаРаботу);
// 2. Используем безопасный поиск реквизита (через БСП или встроенные средства)
Сотрудник = Неопределено;
Если ОбщегоНазначения.ЕстьРеквизитОбъекта("Сотрудник", МетаданныеОбъекта) Тогда
Сотрудник = Источник.Сотрудник;
ИначеЕсли ОбщегоНазначения.ЕстьТабличнаяЧасть("Сотрудники", МетаданныеОбъекта) Тогда
// Обработка спискового документа
Если Источник.Сотрудники.Количество() > 0 Тогда
Сотрудник = Источник.Сотрудники[0].Сотрудник; // Берем первого для примера
КонецЕсли;
КонецЕсли;
// Дальнейшая логика формирования параметров...
ПараметрыПисьма = Новый Структура;
ПараметрыПисьма.Вставить("Тема", "Уведомление");
// ...
Возврат ПараметрыПисьма;
КонецФункции
Использование метода ОбщегоНазначения.ЕстьРеквизитОбъекта позволяет компилятору «пропустить» проверку прямой связи метаданных, так как обращение к полю будет происходить динамически в процессе выполнения, а не на этапе жесткой компиляции типов.
Иногда даже после исправления кода ошибка «Не удалось создать новую версию расширения» сохраняется. Это связано с тем, что платформа кэширует структуру расширений для ускорения запуска. Разберем, как принудительно очистить эти данные:
%AppData%\1C\1cv8\.ConfigCAS и Extensions в момент запуска отладки.Если вы столкнулись с невозможностью входа в приложение при разработке расширения, выполните следующие действия:
Источник.ИмяРеквизита на проверку наличия реквизита или предварительную проверку типа ТипЗнч(Источник).Проанализировав ситуацию, мы выяснили, что даже небольшая опечатка или лишняя «галочка» в метаданных может полностью заблокировать работу информационной системы. Внимательное отношение к составу типов в расширениях — залог стабильной работы 1С:ЗУП 3.1 КОРП.