При разработке конфигураций на платформе 1С:Предприятие 8, особенно в процессе подготовки к экзамену «1С:Специалист», одной из самых частых задач является реализация механизма учетной политики. Казалось бы, задача тривиальна: создать регистр сведений и прочитать из него значение. Однако новички часто сталкиваются с ошибкой «Значение не является значением объектного типа (МетодСписания)» при попытке программного обращения к данным регистра. Для проверки результатов разработки в базе используется автоматическая сверка бухгалтерских и налоговых проводок через COM-соединение.
В этой статье мы подробно разберем, почему возникает эта ошибка, как правильно спроектировать регистр сведений для хранения настроек и какие методы получения данных являются наиболее эффективными.
Рассмотрим типичный фрагмент кода в модуле объекта (например, документа «РасходнаяНакладная»), который вызывает сбой:
МетодСписания = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).МетодСписания;
На первый взгляд код выглядит корректно. Метод ПолучитьПоследнее(Дата) должен вернуть структуру с последними значениями ресурсов регистра на указанный момент времени. Однако система выдает ошибку. Проанализируем причины, по которым обращение к свойству МетодСписания может завершиться неудачей.
Выясним главную особенность менеджера регистра сведений. Метод ПолучитьПоследнее() доступен только для периодических регистров. Если при создании регистра в свойстве «Периодичность» (на вкладке «Основные» в конфигураторе) установлено значение «Непериодический», то менеджер регистра просто не будет содержать этого метода.
Хотя в этом случае система чаще выдает ошибку «Метод объекта не обнаружен», в сложных цепочках вызовов или при определенных настройках платформы ошибка может трансформироваться в «Значение не является значением объектного типа», если результат вызова (который не отработал штатно) интерпретируется неверно.
Решение: Установите периодичность регистра (например, «В пределах года» или «В пределах дня»), чтобы система начала отслеживать изменения настроек во времени.
Это ключевая методическая ошибка. Разберем подробнее разницу между измерениями и ресурсами:
МетодСписания измерением, это будет означать, что мы хотим видеть данные «в разрезе методов списания». Это позволит создать на одну дату две записи (одну для LIFO, другую для FIFO), что противоречит логике учетной политики организации.Метод ПолучитьПоследнее() возвращает структуру, в которую входят только ресурсы. Если МетодСписания был ошибочно добавлен в список измерений, он просто не попадет в возвращаемую структуру. При попытке обращения к свойству .МетодСписания у структуры, где такого ключа нет, 1С вернет ошибку обращения к объекту.
Решение: Перенесите МетодСписания в состав ресурсов регистра сведений.
Рассмотрим ситуацию, когда в регистре вообще нет ни одной записи. Метод ПолучитьПоследнее() в этом случае все равно вернет структуру, но значения ресурсов в ней будут содержать значения по умолчанию (например, 0 для чисел или ПустаяСсылка для перечислений). Однако, если вы используете сложные условия или отборы, и метод по какой-то причине возвращает Неопределено (что бывает крайне редко именно для этого метода, но возможно в других конструкциях), обращение через точку вызовет ошибку.
Проанализируем более безопасный способ написания кода:
Отбор = Новый Структура("Организация", Организация); // если есть измерение Организация
СтруктураПолитики = РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата, Отбор);
Если СтруктураПолитики.МетодСписания = Перечисления.УчетнаяПолитика.ФИФО Тогда
// Ваша логика
КонецЕсли;
Хотя использование метода ПолучитьПоследнее() допустимо в простых сценариях, при проведении документов крайне рекомендуется использовать Запросы к виртуальной таблице СрезПоследних. Рассмотрим подробнее, почему это лучше:
Пример получения метода списания через запрос:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| УчетнаяПолитикаСрезПоследних.МетодСписания КАК МетодСписания
|ИЗ
| РегистрСведений.УчетнаяПолитика.СрезПоследних(&Период, ) КАК УчетнаяПолитикаСрезПоследних";
Запрос.УстановитьПараметр("Период", Дата);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
МетодСписания = Выборка.МетодСписания;
Иначе
// Обработка ситуации, когда учетная политика не задана
ВызватьИсключение "Не задана учетная политика!";
КонецЕсли;
При решении задач на сертификацию важно соблюдать методические рекомендации фирмы «1С». Проанализируем настройки, которые должны быть у регистра «Учетная политика»:
Подводя итог, можно сказать, что ошибка Значение не является значением объектного типа в контексте работы с учетной политикой — это верный признак того, что структура метаданных не соответствует ожиданиям программного кода. Всегда проверяйте, является ли регистр периодическим и правильно ли распределены поля между измерениями и ресурсами. Помните, что измерения — это то, по чему мы ищем, а ресурсы — это то, что мы получаем. Для проверки корректности реализации механизмов в экзаменационных задачах можно использовать комплект эталонных решений экзамена «1С:Специалист по платформе 8.3».