При подготовке к экзамену «1С:Специалист по платформе» (например, при решении задачи 1.1) или просто при разработке механизмов проведения документов многие начинающие разработчики сталкиваются с одной весьма загадочной ошибкой. Код написан точь-в-точь как в обучающем видео или руководстве, но система категорически отказывается его принимать.
Рассмотрим классическую ситуацию: мы пытаемся установить параметр виртуальной таблицы остатков на момент времени документа.
Запрос.УстановитьПараметр("МВ", Новый Граница(МоментВремени(), ВидГраницы.Включая));
И при проверке модуля получаем сообщение компилятора: «Процедура или функция с указанным именем не определена (MоментВремени)». Давайте подробно разберем, откуда берется эта ошибка, проанализируем ситуацию и выясним, как ее исправить раз и навсегда.
Прежде чем переходить к ошибке, вспомним, для чего вообще используется объект МоментВремени. В архитектуре 1С:Предприятие реквизит Дата документа хранит значение с точностью только до секунды. В реальной работе крупной базы в одну и ту же секунду может быть создано или проведено несколько разных документов.
Чтобы выстроить их в строгую хронологическую последовательность, платформа использует комбинацию из даты и уникального идентификатора документа (UUID). Именно эта связка и называется МоментВремени. При запросе остатков из регистров накопления мы часто используем объект Граница, в который передаем момент времени текущего документа. Это позволяет четко указать системе, нужно ли при получении остатков учитывать движения самого этого документа (используя ВидГраницы.Включая или ВидГраницы.Исключая).
Теперь перейдем к корню проблемы. Платформа 1С:Предприятие лояльно относится к языку программирования: мы можем писать код как на русском, так и на английском языке. Однако она строго различает кодировку символов.
Осмотрим внимательнее слово MоментВремени из текста ошибки. На первый взгляд, всё написано абсолютно верно. Но если разобрать символы по кодам (в шестнадцатеричной системе), мы увидим следующее:
004D.Поскольку системный метод документа пишется исключительно кириллицей (или полностью его английский синоним), платформа встречает неизвестное ей слово. Компилятор думает: «Ага, системного метода с таким именем нет. Значит, это пользовательская функция. Но в модуле она нигде не описана!». Именно поэтому возникает ошибка «Процедура или функция с указанным именем не определена».
Такая подмена часто происходит, когда разработчик быстро переключает раскладки клавиатуры или начинает печатать с нажатым Shift, не заметив, что включен английский язык. Буквы «М», «о», «е», «а», «р», «с», «х» выглядят абсолютно одинаково в обеих раскладках, что делает эту ошибку одной из самых коварных (так называемая «ошибка начинающего»).
Проанализируем шаги, которые помогут нам избавиться от этой проблемы.
МоментВремени(), удалите его полностью и напечатайте заново, убедившись, что у вас включена русская раскладка клавиатуры с самого первого символа.Мом) и нажмите комбинацию клавиш Ctrl + Space (Пробел). Платформа сама предложит варианты и автоматически допишет правильное слово в верной кодировке.Привычка использовать контекстную подсказку (автоподстановку кода) критически важна, особенно при сдаче экзамена на «Специалиста». Она не только экономит время на набор текста, но и на 100% страхует вас от опечаток и случайных латинских букв в кириллических словах.
Мы выяснили причину: ошибка скрывалась не в логике алгоритма, а в единственном символе из другой раскладки. Будьте внимательны к кодировке текста. Используйте встроенные механизмы конфигуратора, такие как подсказки и автодополнение кода (Ctrl + Space). Это позволит вам сосредоточиться на решении сложных бизнес-задач 1С, а не на поиске случайных опечаток.