В процессе разработки в среде «1С:Предприятие 8», особенно при изучении учебных пособий (например, популярного практического руководства М. Г. Радченко), начинающие разработчики часто сталкиваются с типовыми ошибками компиляции и выполнения кода. Две наиболее коварные из них — это ошибка «Недопустимое значение параметра (параметр номер '2')» при работе с периодическими регистрами сведений и ошибка «Метод объекта не обнаружен» при обращении к процедурам общих модулей. В этой статье мы подробно разберем причины возникновения этих неполадок и пошагово выясним, как их исправить. Для контроля результата доработок и поиска возможных расхождений в проводках используется автоматическая сверка бухгалтерских и налоговых данных.
Данный сбой обычно заявляет о себе при попытке получить актуальную цену номенклатуры или другие периодические данные. Проанализируем строку кода, на которой спотыкается система:
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);
Для того чтобы понять, почему платформа выдает ошибку, давайте обратимся к синтаксису метода ПолучитьПоследнее(). Этот метод предназначен для получения значений ресурсов периодического регистра сведений, актуальных на определенную точку во времени. Он принимает два параметра:
АктуальнаяДата) — тип Дата, МоментВремени или Граница.Отбор) — тип Структура.Ключевое требование платформы «1С:Предприятие» заключается в следующем: ключи структуры отбора должны строго соответствовать именам измерений регистра сведений. Обратите внимание — именно измерениям, а не ресурсам или реквизитам!
Рассмотрим по шагам, почему возникает ошибка и как ее локализовать:
Шаг 1. Инициализация отбора в коде. Обычно разработчик создает структуру отбора следующим образом:
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", СтрокаТабличнойЧасти.Номенклатура);
В данном случае мы ожидаем, что в регистре сведений «Цены» есть измерение с именем Номенклатура.
Шаг 2. Проверка метаданных регистра сведений. Ошибка «Недопустимое значение параметра (параметр номер '2')» чаще всего сигнализирует о том, что платформа не смогла сопоставить ключ структуры "Номенклатура" ни с одним из измерений регистра. Откройте Конфигуратор, найдите ваш регистр сведений «Цены», разверните ветку «Измерения» и внимательно изучите написание имени измерения. Очень часто из-за банальной опечатки измерение называют, например, Номекнклатура (как это и произошло в рассматриваемом случае) или используют латинские буквы вместо кириллических.
Шаг 3. Устранение несоответствия. Если вы обнаружили опечатку в имени измерения регистра сведений, у вас есть два пути решения:
Номенклатура), после чего обновить конфигурацию базы данных. Это самый правильный и логичный путь.Посмотрим на пример корректного получения последней записи из регистра сведений после исправления опечатки:
// Формируем структуру отбора по измерению "Номенклатура"
Отбор = Новый Структура("Номенклатура", СтрокаТабличнойЧасти.Номенклатура);
// Получаем срез последних записей на нужную дату
ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(Объект.Дата, Отбор);
// Заполняем цену в строке табличной части
СтрокаТабличнойЧасти.Цена = ЗначенияРесурсов.Цена;
Вторая распространенная проблема возникает при попытке рассчитать сумму в строке табличной части документа (например, «Оказание услуги» или «Приходная накладная») при изменении количества или цены. Код вызова метода выглядит следующим образом:
РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти);
Если платформа выдает ошибку «Метод объекта не обнаружен», это означает, что в общем модуле РаботаСДокументами система не видит процедуру РассчитатьСумму. Проанализируем причины этой проблемы и пути их решения.
Человеческий фактор играет огромную роль в программировании. Проверьте, как именно написано имя процедуры в самом общем модуле РаботаСДокументами. Распространенная ошибка — написание слова «Рассчитать» с одной буквой «с» (РасчитатьСумму) или использование разного регистра букв. Имя процедуры при ее объявлении в общем модуле и имя процедуры при вызове в форме документа должны совпадать символ в символ.
Для того чтобы процедура или функция общего модуля была доступна для вызова из других модулей (в частности, из модуля формы документа), она обязательно должна быть объявлена как экспортная. Проверьте объявление процедуры в общем модуле РаботаСДокументами. Правильный шаблон объявления выглядит так:
Процедура РассчитатьСумму(СтрокаТабличнойЧасти) Экспорт
СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена;
КонецПроцедуры
Если ключевое слово Экспорт отсутствует, процедура будет видна только внутри самого общего модуля РаботаСДокументами, а при попытке вызвать ее снаружи вы получите ошибку «Метод объекта не обнаружен».
Современные управляемые формы в 1С работают в рамках клиент-серверной архитектуры. Процедура обработки события изменения количества или цены (например, НоменклатураПриИзменении) выполняется на стороне клиента (директива &НаКлиенте).
Если общий модуль РаботаСДокументами настроен для работы только на сервере, то клиентский код формы просто не сможет «увидеть» этот модуль и его экспортные методы.
Выясним, как правильно настроить свойства общего модуля:
РаботаСДокументами в дереве метаданных.Только при наличии флага «Клиент (управляемое приложение)» и ключевого слова Экспорт клиентская форма сможет успешно обратиться к процедуре РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти).
Чтобы сберечь время и не искать опечатки вручную, настоятельно рекомендуем использовать встроенные инструменты Конфигуратора 1С.
Синтаксический контроль (сочетание клавиш Ctrl + F7). Систематически запускайте синтаксическую проверку активного модуля. Платформа мгновенно укажет на пропущенные скобки, кавычки, неверно написанные операторы и предупредит, если вы пытаетесь вызвать несуществующий или неэкспортный метод.
Инструмент «Проверка конфигурации». Доступен через меню Конфигурация -> Проверка конфигурации.... Этот инструмент выполняет глобальный анализ всей базы данных. Он незаменим для поиска логических нестыковок, некорректных связей в метаданных и выявления процедур, которые вызываются в одном контексте, но определены в другом. Для автоматизации технического обслуживания и регулярного тестирования нескольких баз используется программа для обновления и обслуживания 1С.
Контекстная подсказка (сочетание клавиш Ctrl + Пробел). Никогда не набирайте имена процедур, функций и объектов метаданных вручную от начала до конца. Начните писать первые несколько букв (например, РаботаСДок) и нажмите комбинацию клавиш Ctrl + Пробел. Платформа выведет интерактивный список всех доступных объектов и методов. Это полностью исключает опечатки в коде.
Синтакс-помощник (сочетание клавиш Ctrl + F1). Если вы сомневаетесь, какие параметры принимает та или иная системная функция (например, ПолучитьПоследнее), позиционируйте курсор на имени функции и нажмите Ctrl + F1. Перед вами откроется встроенная справка с подробным описанием типов параметров и примерами использования.
Используя эти несложные правила отладки и возможности Конфигуратора, вы сможете быстро локализовать любые подобные ошибки и продолжить успешное освоение разработки в системе «1С:Предприятие 8»!