Как правильно подставить значение из справочника в табличную часть на управляемых формах 1С

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

При разработке в среде 1С:Предприятие 8.3 начинающие программисты часто сталкиваются с трудностями при взаимодействии между визуальным интерфейсом (формой) и данными, которые за этим интерфейсом стоят. Типичная ситуация: пользователь выбирает значение в одной колонке табличной части (ТЧ), и система должна автоматически заполнить другую колонку, подтянув данные из связанного справочника. Однако вместо ожидаемого результата программа выдает ошибку: «Ошибка отображения типов: Отсутствует отображение для типа 'Поле формы'».

В этой статье мы подробно разберем, почему возникает эта ошибка, как правильно обращаться к данным текущей строки табличной части и как реализовать автоматическое заполнение расшифровки кода (например, ОКВЭД) с учетом различных условий.

Разбор основной проблемы: Элементы формы vs Данные

Давайте проанализируем ситуацию, описанную автором темы. Попытка передать на сервер объект типа Элементы.КодыСтатистики1Значение — это коренная ошибка. В управляемом приложении 1С существует четкое разделение между данными (тем, что хранится в базе или в реквизитах формы) и элементами формы (визуальными полями ввода, кнопками, таблицами).

Когда вы обращаетесь к Элементы.ИмяПоля, вы обращаетесь к программному объекту «Поле формы». Этот объект существует только на клиенте и предназначен для управления свойствами отображения: видимостью, доступностью, цветом текста. Серверная функция &НаСервереБезКонтекста ничего не знает о визуальных элементах формы, она умеет работать только с типами данных, которые можно передать по сети (числа, строки, ссылки, структуры).

Передача «Поля формы» на сервер и вызывает ту самую ошибку отображения типов. Программе просто «непонятно», как превратить визуальное поле ввода в данные справочника на стороне сервера.

Шаг 1. Получение данных текущей строки через ТекущиеДанные

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

Предположим, ваша табличная часть называется КодыСтатистики, а элемент формы, отображающий её — КодыСтатистики1. Тогда код получения строки будет выглядеть так:


&НаКлиенте
Процедура КодыСтатистикиЗначениеПриИзменении(Элемент)
    
    // Получаем строку, в которой произошло изменение
    СтрокаТЧ = Элементы.КодыСтатистики1.ТекущиеДанные;
    
    // Проверяем, что строка действительно существует (не пустая)
    Если СтрокаТЧ <> Неопределено Тогда
        // Передаем на сервер только ссылку, хранящуюся в колонке "Значение"
        СтрокаТЧ.Расшифровка = ПолучитьРасшифровкуНаСервере(СтрокаТЧ.Значение);
    КонецЕсли;

КонецПроцедуры

В данном примере СтрокаТЧ — это объект типа ДанныеФормыЭлементКоллекции. Он ведет себя как обычная строка таблицы, и через него мы можем как читать значения из колонок, так и записывать их обратно.

Шаг 2. Реализация серверной функции получения данных

Теперь рассмотрим серверную часть. Использование директивы &НаСервереБезКонтекста является наиболее производительным вариантом, так как при вызове такой функции на сервер не передается вся форма целиком, что экономит трафик и ресурсы сервера.

Проанализируем правильную реализацию функции:


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

Важный совет: Если в вашей конфигурации используется Библиотека Стандартных Подсистем (БСП), для получения реквизита лучше использовать метод ОбщегоНазначения.ЗначениеРеквизитаОбъекта(). Это работает быстрее, так как не читает весь объект справочника из базы данных целиком.

Шаг 3. Добавление логики по Виду кода

Автор темы выразил пожелание: подставлять расшифровку только в том случае, если в колонке ВидКода выбрано значение «ОКВЭД». Это очень правильный подход с точки зрения бизнес-логики, так как расшифровки для ИНН или КПП могут браться из других источников или не требоваться вовсе.

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


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

КонецПроцедуры

Дополнительные рекомендации для профессиональной разработки

Для того чтобы сделать работу пользователя еще более удобной и избежать ошибок ввода, рассмотрим еще несколько важных механизмов платформы 1С.

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

Итоговый пример кода

Объединим все наши наработки в единый блок кода, который можно использовать как шаблон для решения подобных задач.


&НаКлиенте
Процедура КодыСтатистикиЗначениеПриИзменении(Элемент)
    ОбновитьРасшифровкуВСтроке();
КонецПроцедуры

&НаКлиенте
Процедура КодыСтатистикиВидКодаПриИзменении(Элемент)
    ОбновитьРасшифровкуВСтроке();
КонецПроцедуры

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

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

Разберем, что мы получили в итоге. Мы создали общую процедуру ОбновитьРасшифровкуВСтроке, которая вызывается при любом значимом изменении в строке таблицы. Мы корректно используем ТекущиеДанные для доступа к реквизитам и передаем на сервер только необходимые ссылки, что гарантирует отсутствие ошибок «типа ПолеФормы» и высокую скорость работы интерфейса.

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

← На главную