Как исправить ошибку «Процедура или функция с указанным именем не определена (ПоказатьВводЗначения)» в 1С 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке в среде управляемых форм 1С:Предприятия 8.3 разработчики часто сталкиваются с ошибкой компиляции: Процедура или функция с указанным именем не определена (ПоказатьВводЗначения). Разберем основные причины возникновения этой проблемы и рассмотрим правильные варианты реализации интерактивного выбора значений.

Причины возникновения ошибки

Проанализируем типовые ошибки, которые приводят к данной ситуации:

  1. Опечатка в названии метода. В платформе 1С метод называется ПоказатьВводЗначения (с одной буквой «в» в корне слова). Опечатки вроде ПоказатьВвводЗначения вызывают ошибку на этапе синтаксической проверки.
  2. Неверный контекст выполнения (&НаСервере). Интерактивные методы интерфейса недоступны на стороне сервера. Они могут выполняться исключительно в контексте клиента: тонкого, веб-, толстого или мобильного клиента.
  3. Использование процедуры как функции в условии. Метод ПоказатьВводЗначения является процедурой, а не функцией. Конструкция Если ПоказатьВводЗначения(...) Тогда некорректна, так как метод не возвращает булево значение и требует передачи описания оповещения для асинхронной обработки результата.
  4. Смешивание синхронного и немодального подхода. Синхронный метод ВвестиЗначение возвращает Истина или Ложь, но он работает только при включенном режиме использования модальности. В современных конфигурациях модальность заблокирована, поэтому необходимо применять асинхронные механизмы платформы.

Вариант 1. Использование немодальной процедуры ПоказатьВводЗначения с ОписаниемОповещения

Рассмотрим классический способ реализации выбора значения для управляемых форм. Для получения результата создается объект ОписаниеОповещения, указывающий на процедуру-обработчик, которая выполнится после закрытия диалога пользователем.

Разберем по шагам, как правильно разделить клиентский интерфейсный вызов и последующую серверную обработку:


&НаКлиенте
Процедура ВыбратьДокумент(Команда)
    
    Оповещение = Новый ОписаниеОповещения("ВыбратьДокументЗавершение", ЭтотОбъект);
    
    ТипВыбора = Новый ОписаниеТипов("ДокументСсылка.РегламентированныеДанные");
    НачальноеЗначение = ПредопределенноеЗначение("Документ.РегламентированныеДанные.ПустаяСсылка");
    
    ПоказатьВводЗначения(Оповещение, НачальноеЗначение, "Выберите 12-ю декларацию", ТипВыбора);
    
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьДокументЗавершение(ВыбранноеЗначение, ДополнительныеПараметры) Экспорт
    
    // Если пользователь нажал "Отмена" или закрыл окно, переменная равна Неопределено
    Если ВыбранноеЗначение = Неопределено Или ВыбранноеЗначение.Пустая() Тогда
        Возврат;
    КонецЕсли;
    
    // Передаем ссылку на сервер для чтения данных и работы с запросами
    ОбработатьВыбранныйДокументНаСервере(ВыбранноеЗначение);
    
КонецПроцедуры

Вариант 2. Использование асинхронной функции ВвестиЗначениеАсинх (платформа 8.3.18 и новее)

Если конфигурация работает на версии платформы 8.3.18 или выше, удобнее использовать асинхронные процедуры с оператором Ждать. Это позволяет писать линейный и легко читаемый код без создания отдельных процедур завершения.

Посмотрим на пример реализации с директивой Асинх:


&НаКлиенте
Асинх Процедура ВыбратьДокументАсинх(Команда)
    
    ТипВыбора = Новый ОписаниеТипов("ДокументСсылка.РегламентированныеДанные");
    НачальноеЗначение = ПредопределенноеЗначение("Документ.РегламентированныеДанные.ПустаяСсылка");
    
    ВыбранноеЗначение = Ждать ВвестиЗначениеАсинх(НачальноеЗначение, "Выберите 12-ю декларацию", ТипВыбора);
    
    Если ВыбранноеЗначение = Неопределено Или ВыбранноеЗначение.Пустая() Тогда
        Возврат;
    КонецЕсли;
    
    ОбработатьВыбранныйДокументНаСервере(ВыбранноеЗначение);
    
КонецПроцедуры

Разделение контекста: чтение данных и выполнение запросов на сервере

Обратите внимание: работа с объектом Запрос, выгрузка и загрузка таблиц значений, а также чтение табличных частей объектов по ссылке должны происходить строго на сервере. Клиентская процедура отвечает только за отображение диалога ввода.

Рассмотрим пример серверного обработчика, выполняющего валидацию и перенос данных:


&НаСервере
Процедура ОбработатьВыбранныйДокументНаСервере(ВыбДокСсылка)
    
    // Проверка реквизитов документа через обращение к ссылке
    Если ВыбДокСсылка.ВидДекларации <> Перечисления.ВидыДеклараций.ID12 Тогда
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Выбрана не 12-я декларация!");
        Возврат;
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ДанныеФорма12.vidCode КАК vidCode,
        |   ДанныеФорма12.producer КАК producer,
        |   ДанныеФорма12.TTYPE КАК TTYPE,
        |   ДанныеФорма12.P120 КАК P106,
        |   ДанныеФорма12.department КАК department
        |ИЗ
        |   Документ.РегламентированныеДанные.ДанныеФорма12 КАК ДанныеФорма12
        |ГДЕ
        |   ДанныеФорма12.Ссылка = &Ссылка
        |   И ДанныеФорма12.TTYPE = ЗНАЧЕНИЕ(Перечисление.ТипыСтрокОтчетности.Таблица1)";
        
    Запрос.УстановитьПараметр("Ссылка", ВыбДокСсылка);
    
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("В выбранном документе отсутствуют данные!");
        Возврат;
    КонецЕсли;
    
    // Заполнение табличной части текущего объекта
    Объект.ДанныеФорма12.Загрузить(РезультатЗапроса.Выгрузить());
    
КонецПроцедуры

Альтернативный вариант: открытие стандартной формы выбора

Вместо универсального окна ввода значения часто удобнее открыть полноценную форму выбора документа. Это позволяет сразу установить отбор (например, по виду декларации), исключив выбор некорректных данных пользователем.

Посмотрим на реализацию открытия формы выбора с оповещением:


&НаКлиенте
Процедура ОткрытьВыборДекларации(Команда)
    
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораДекларации", ЭтотОбъект);
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор", Новый Структура("ВидДекларации", ПредопределенноеЗначение("Перечисление.ВидыДеклараций.ID12")));
    ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Истина);
    
    ОткрытьФорму("Документ.РегламентированныеДанные.ФормаВыбора", ПараметрыФормы, ЭтотОбъект, , , , Оповещение);
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораДекларации(ВыбранноеЗначение, ДополнительныеПараметры) Экспорт
    
    Если ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
        ОбработатьВыбранныйДокументНаСервере(ВыбранноеЗначение);
    КонецЕсли;
    
КонецПроцедуры

Резюме: для устранения ошибки проверяйте правильность написания метода (ПоказатьВводЗначения), вызывайте его исключительно в контексте &НаКлиенте и передавайте результат обработки через ОписаниеОповещения либо используйте конструкцию Ждать ВвестиЗначениеАсинх(...).

← На главную