В процессе разработки на платформе 1С:Предприятие 8.3 начинающие программисты часто сталкиваются с ситуацией, когда процедура или функция, написанная в модуле формы, отказывается вызываться, выдавая ошибку Метод объекта не обнаружен. Чтобы эффективно выявлять такие проблемы на ранних этапах, рекомендуется проводить анализ конфигураций и расширений на наличие ошибок вызова процедур. В этой статье мы подробно разберем, почему возникает эта проблема, как работают директивы компиляции и как правильно организовать передачу данных между клиентом и сервером.
Основная причина подобных ошибок кроется в клиент-серверной архитектуре управляемого приложения. В 1С код может исполняться либо на стороне тонкого/толстого клиента (в интерфейсе пользователя), либо на стороне сервера (где происходит работа с базой данных). Если вы пытаетесь вызвать процедуру, которая не видна в текущем контексте исполнения, платформа закономерно выдаст ошибку.
Проанализируем типичную ситуацию. Программист создает кнопку на форме и хочет, чтобы при ее нажатии произошло какое-то действие с данными. Код нажатия кнопки всегда выполняется &НаКлиенте, но сами данные (справочники, документы) доступны только &НаСервере. Чтобы эти две части "увидели" друг друга и соответствовали системе качества, важно соблюдать стандарты и методики разработки конфигураций 1С и использовать специальные инструкции для компилятора.
В управляемых формах 1С используются основные директивы компиляции, которые определяют "место жительства" вашего кода. Рассмотрим каждую из них подробнее:
Вопрос(), ПоказатьОповещениеПользователя()) и работа с интерфейсом. На клиенте нельзя делать запросы к базе данных или обращаться к объектам типа СправочникОбъект напрямую.Посмотрим на пример кода, где мы хотим рассчитать сумму в документе при изменении количества. Проанализируем, как правильно разделить логику между клиентом и сервером:
&НаКлиенте
Процедура КоличествоПриИзменении(Элемент)
// Код начинается на клиенте
РассчитатьСуммуНаСервере();
КонецПроцедуры
&НаСервере
Процедура РассчитатьСуммуНаСервере()
// Мы передали управление на сервер, здесь можно работать с данными
Объект.Сумма = Объект.Количество * Объект.Цена;
КонецПроцедуры
В данном примере процедура КоличествоПриИзменении помечена директивой &НаКлиенте, так как она привязана к событию элемента формы. Внутри нее мы вызываем РассчитатьСуммуНаСервере, которая помечена директивой &НаСервере. Если же ваша задача требует длительных вычислений, стоит рассмотреть конвейер обработки задач, позволяющий выполнять тяжелые операции в фоновом режиме.
Часто программисты используют &НаСервере там, где это избыточно. Если для вычислений нам не нужны все данные формы, а достаточно передать лишь пару параметров, лучше использовать &НаСервереБезКонтекста. Проанализируем ситуацию, когда нам нужно получить цену товара из справочника:
&НаКлиенте
Процедура ТоварПриИзменении(Элемент)
// Получаем цену без передачи всей формы на сервер
АктуальнаяЦена = ПолучитьЦенуНаСервере(Объект.Товар);
Объект.Цена = АктуальнаяЦена;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЦенуНаСервере(ВыбранныйТовар)
// Сервер не знает про "Объект", он знает только то, что мы передали в параметрах
Возврат ВыбранныйТовар.Цена;
КонецФункции
Использование &НаСервереБезКонтекста является хорошим тоном разработки в 1С, так как это минимизирует объем данных, передаваемых между клиентом и сервером по сети.
При организации взаимодействия важно помнить, что далеко не все типы данных могут "путешествовать" между клиентом и сервером. Посмотрим на основные правила:
СправочникСсылка, ДокументСсылка) можно передавать свободно.СправочникОбъект, ДокументОбъект) живут только на сервере. Их нельзя передать на клиент.ДанныеФормыКоллекция).Если вы попытаетесь передать СправочникОбъект в клиентскую процедуру, 1С выдаст ошибку преобразования данных. Выясним, как с этим работать: на сервере мы открываем объект, модифицируем его, записываем (Записать()) и возвращаем на клиент уже только ссылку или результат выполнения операции.
Рассмотрим наиболее частые ошибки, которые встречаются в обсуждениях на форумах:
&НаСервере (в модуле формы). Если вы пытаетесь вызвать ее как обработчик события кнопки, система ее не найдет. Решение: всегда явно указывайте &НаКлиенте для обработчиков событий. Чтобы не пропускать такие ошибки, используйте статический анализатор кода проектов.Запрос.Выполнить() прямо &НаКлиенте приведет к ошибке компиляции. Решение: выносите все запросы в функции с директивой &НаСервере.Подводя итог, можно сказать, что понимание разницы между клиентом и сервером — это фундамент разработки на 1С 8.3. Тщательно выбирайте контекст исполнения, используйте &НаСервереБезКонтекста для оптимизации и следите за типами передаваемых данных. Это позволит вашим приложениям работать быстро и без ошибок.