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

Программист 1С v8.3 (Обычные формы) 1С:Зарплата и Управление Персоналом
← На главную

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

Причина 1: Почему в результате запроса появляется «ТаблицаЗначений»

Рассмотрим ситуацию, когда в тексте запроса происходит обращение к табличной части документа через круглые скобки в секции ВЫБРАТЬ, например: ПриемНаРаботу.Показатели.(МАКСИМУМ(...)) КАК Оклад. Платформа 1С:Предприятие в таком случае создает вложенный результат запроса. При выгрузке результата в табличную часть или таблицу значений соответствующая колонка получает тип ТаблицаЗначений вместо скалярного числового типа.

Решение 1: Переработка запроса с использованием временных таблиц

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

Рассмотрим пример правильного пакета запросов:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
	ПриемНаРаботуПоказатели.Ссылка КАК Ссылка,
	МАКСИМУМ(ВЫБОР
		КОГДА ПриемНаРаботуПоказатели.Показатель.ВидТарифнойСтавки В (
			ЗНАЧЕНИЕ(Перечисление.ВидыТарифныхСтавок.МесячнаяТарифнаяСтавка),
			ЗНАЧЕНИЕ(Перечисление.ВидыТарифныхСтавок.ЧасоваяТарифнаяСтавка),
			ЗНАЧЕНИЕ(Перечисление.ВидыТарифныхСтавок.ДневнаяТарифнаяСтавка)
		)
		ТОГДА ПриемНаРаботуПоказатели.Значение
		ИНАЧЕ 0
	КОНЕЦ) КАК Оклад
ПОМЕСТИТЬ ТарифнаяСтавка
ИЗ
	Документ.ПриемНаРаботу.Показатели КАК ПриемНаРаботуПоказатели
ГДЕ
	ПриемНаРаботуПоказатели.Ссылка.Проведен
	И ПриемНаРаботуПоказатели.Ссылка В(&МассивОбъектов)
СГРУППИРОВАТЬ ПО
	ПриемНаРаботуПоказатели.Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	ПриемНаРаботу.Ссылка КАК Ссылка,
	ПриемНаРаботу.Организация.НаименованиеПолное КАК НазваниеОрганизации,
	ПриемНаРаботу.Организация.КодПоОКПО КАК КодПоОКПО,
	ПриемНаРаботу.Номер КАК НомерДок,
	ПриемНаРаботу.Дата КАК ДатаДок,
	ПриемНаРаботу.Сотрудник КАК Работник,
	ПриемНаРаботу.Подразделение КАК Подразделение,
	ПриемНаРаботу.Должность КАК Должность,
	ПриемНаРаботу.КоличествоСтавок КАК КоличествоСтавок,
	ЕСТЬNULL(ТарифнаяСтавка.Оклад, 0) КАК Оклад
ИЗ
	Документ.ПриемНаРаботу КАК ПриемНаРаботу
		ЛЕВОЕ СОЕДИНЕНИЕ ТарифнаяСтавка КАК ТарифнаяСтавка
		ПО ПриемНаРаботу.Ссылка = ТарифнаяСтавка.Ссылка
ГДЕ
	ПриемНаРаботу.Проведен
	И ПриемНаРаботу.Ссылка В(&МассивОбъектов)
УПОРЯДОЧИТЬ ПО
	Ссылка

Обратим внимание на важные детали в приведенном решении:

  1. Во временную таблицу ТарифнаяСтавка обязательно выбирается поле Ссылка и применяется группировка СГРУППИРОВАТЬ ПО. Это предотвращает получение декартова произведения при соединении.
  2. В основном запросе используется ЛЕВОЕ СОЕДИНЕНИЕ по ключу ПО ПриемНаРаботу.Ссылка = ТарифнаяСтавка.Ссылка.
  3. Функция ЕСТЬNULL(ТарифнаяСтавка.Оклад, 0) защищает код от получения значения NULL, если у документа отсутствуют строки с окладом.

Причина 2: Ошибка «Преобразование к типу Число не может быть выполнено»

Выясним причину второй частой ошибки. При выгрузке надбавок в макет печатной формы разработчики часто объединяют процентную ставку и текстовое обозначение единицы измерения:


// Ошибка произойдет здесь, если ПроцентНадбавки является числом:
ОбластьНадбавка.Параметры.ПроцентНадбавки = ПроцентНадбавки + " " + ЕдиницаНадбавки;

В языке 1С оператор + выполняет сложение или конкатенацию в зависимости от типа первого операнда. Если переменная ПроцентНадбавки содержит Число, платформа пытается прибавить к нему следующие элементы как числа. Встречая строку (например, пробел или знак процента), 1С пытается преобразовать ее к числу и вызывает исключение «Преобразование к типу Число не может быть выполнено».

Решение 2: Корректное приведение типов при конкатенации строк

Чтобы избежать ошибки при формировании строковых параметров макета, необходимо гарантировать, что первым операндом выражения является строка. Разберем рабочие варианты решения:

Вариант 1. Неявное приведение через пустую строку:


ОбластьНадбавка.Параметры.ПроцентНадбавки = "" + ПроцентНадбавки + " " + ЕдиницаНадбавки;

Вариант 2. Явное приведение с помощью функции Строка():


ОбластьНадбавка.Параметры.ПроцентНадбавки = Строка(ПроцентНадбавки) + " " + ЕдиницаНадбавки;

При использовании любого из этих способов платформа 1С воспринимает операцию как сложение строк (конкатенацию), и вывод печатной формы выполняется корректно.

← На главную