При работе с типовыми конфигурациями «1С:Управление торговлей», «1С:ERP» или «1С:Комплексная автоматизация» версии 11.4 (особенно релизов 11.4.4.84 и 11.4.4.88) пользователи нередко сталкиваются с досадной технической ошибкой. При попытке создать или открыть документ Ввод начальных остатков по разделу Прочие расходы система аварийно завершает работу с сообщением: Поле объекта не обнаружено (ПрименяетсяПБУ18). Рассмотрим детально, почему это происходит и как мы можем исправить ситуацию собственными силами, не дожидаясь глобальных обновлений.
Для начала разберем программный контекст. Ошибка возникает в модуле формы документа ВводОстатков, конкретно в форме ФормаПрочиеРасходы. Проблема локализована в процедуре, которая отвечает за установку видимости полей в зависимости от настроек учетной политики организации. Проанализируем фрагмент кода, на который указывает конфигуратор:
ПараметрыУчетнойПолитики = РегистрыСведений.УчетнаяПолитикаОрганизаций.ПараметрыУчетнойПолитики(Объект.Организация, Объект.Дата);
ПрименяетсяПБУ18 = Истина;
ВедетсяУчетПостоянныхИВременныхРазниц = Истина;
Если ПараметрыУчетнойПолитики <> Неопределено Тогда
ПрименяетсяПБУ18 = ПараметрыУчетнойПолитики.ПрименяетсяПБУ18; // Здесь происходит авария
ВедетсяУчетПостоянныхИВременныхРазниц = ПараметрыУчетнойПолитики.ВедетсяУчетПостоянныхИВременныхРазниц;
КонецЕсли;
Выясним причину: функция ПараметрыУчетнойПолитики менеджера регистра сведений возвращает структуру. В данных релизах разработчики 1С провели рефакторинг API учетной политики. В результате, в зависимости от версии ПБУ 18/02 или даты документа, структура может не содержать поле ПрименяетсяПБУ18. Поскольку код обращается к свойству структуры напрямую через точку, а само свойство отсутствует, платформа выбрасывает исключение.
Это классический случай рассинхронизации между измененным программным интерфейсом (общим модулем или менеджером регистра) и экранными формами, которые не были адаптированы под эти изменения.
Самый надежный способ исправить код — это уйти от прямого обращения к свойству структуры и использовать метод Свойство(). Это позволит коду работать корректно, даже если поле отсутствует. Проанализируем, как должен выглядеть исправленный фрагмент:
ПараметрыУчетнойПолитики = РегистрыСведений.УчетнаяПолитикаОрганизаций.ПараметрыУчетнойПолитики(Объект.Организация, Объект.Дата);
ПрименяетсяПБУ18 = Ложь; // Устанавливаем значение по умолчанию
ВедетсяУчетПостоянныхИВременныхРазниц = Ложь;
Если ПараметрыУчетнойПолитики <> Неопределено Тогда
// Проверяем наличие свойств перед обращением
Если ПараметрыУчетнойПолитики.Свойство("ПрименяетсяПБУ18") Тогда
ПрименяетсяПБУ18 = ПараметрыУчетнойПолитики.ПрименяетсяПБУ18;
КонецЕсли;
Если ПараметрыУчетнойПолитики.Свойство("ВедетсяУчетПостоянныхИВременныхРазниц") Тогда
ВедетсяУчетПостоянныхИВременныхРазниц = ПараметрыУчетнойПолитики.ВедетсяУчетПостоянныхИВременныхРазниц;
КонецЕсли;
КонецЕсли;
Такой подход исключает возникновение ошибки Поле объекта не обнаружено и является хорошим тоном программирования в 1С при работе со структурами, состав которых может динамически меняться.
Если ваша база находится на поддержке и вы не хотите вносить изменения непосредственно в основную конфигурацию, создадим Расширение. Это позволит сохранить возможность типового обновления и одновременно исправит баг. Разберем шаги по реализации расширения:
ВводОстатков и его форму ФормаПрочиеРасходы.ПриЧтенииСозданииНаСервере или связанная с ней УстановитьВидимость).&Вместо для полной замены процедуры или &ИзменениеИКонтроль для точечного исправления.Свойство(), как было показано выше.Также можно перехватить саму функцию ПараметрыУчетнойПолитики в менеджере регистра сведений с помощью аннотации &После и принудительно добавлять недостающее поле в структуру, если его там нет:
&После("ПараметрыУчетнойПолитики")
Функция Расш_ПараметрыУчетнойПолитики(Организация, Период)
Результат = ПродолжитьВызов(Организация, Период);
Если ТипЗнч(Результат) = Тип("Структура") Тогда
Если Не Результат.Свойство("ПрименяетсяПБУ18") Тогда
Результат.Вставить("ПрименяетсяПБУ18", Ложь);
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Фирма 1С признала данную ошибку (баг 00-00155099). Если ваша конфигурация поддерживает автоматическую загрузку исправлений (патчей) через интернет, убедитесь, что эта функция включена. Посмотрим, как это проверить:
ВводОстатков.Если патч недоступен, радикальным решением будет обновление на релиз 11.4.5.x или выше, где структура параметров учетной политики и формы документов приведены к единообразию.
Проанализируем ситуацию, когда техподдержка утверждает, что ошибка «не воспроизводится». Это происходит из-за зависимости структуры ПараметрыУчетнойПолитики от данных конкретной информационной базы. Если в тестовой базе консультанта 1С создана запись учетной политики с другими датами или иным вариантом настройки ПБУ 18/02, алгоритм может пойти по другой ветке, где поле существует. Поэтому при обращении в поддержку крайне важно указывать дату документа ввода остатков и прикладывать скриншот настроек учетной политики из регистра УчетнаяПолитикаОрганизаций.
Резюме: Мы выяснили, что ошибка носит чисто программный характер и вызвана обращением к несуществующему полю структуры. Наилучшим способом оперативного исправления является создание небольшого расширения с безопасным методом Свойство(), что позволит бухгалтеру продолжить ввод начальных остатков без ожидания выхода следующего релиза.