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