При отладке сложных алгоритмов и анализе данных разработчикам регулярно требуется использовать в качестве источника временной таблицы внешние файлы, например прайс-листы или списки номенклатуры в формате XLSX. В специализированных консолях (включая подсистему «Инструменты разработчика») доступна возможность загрузки параметров типа ТаблицаЗначений через промежуточные файлы или табличные документы. Однако при этом часто возникают трудности: имена колонок блокируются для редактирования, а изменение типов данных завершается ошибками платформы.
Разберем причины такого поведения платформы 1С и рассмотрим наиболее надежные способы загрузки и подготовки данных для передачи в запрос.
Проанализируем внутреннее устройство платформы 1С, которое накладывает жесткие технические ограничения на работу с объектом ТаблицаЗначений при ее передаче во временную таблицу запроса:
ТипЗначения доступно только для чтения. После того как колонка создана в коллекции Колонки, платформа не позволяет изменить ее состав допустимых типов «на лету». Чтобы изменить тип существующей колонки, требуется полностью пересоздать структуру таблицы с новым объектом ОписаниеТипов и перезаполнить строки. Именно поэтому интерактивное редактирование типов в интерфейсе консолей часто блокируется или сбрасывается.ПОМЕСТИТЬ ... ИЗ &Параметр, все используемые поля должны обладать строгой типизацией. Если колонка создана без указания типа (допускает значение любого типа) или содержит типы, недопустимые для базы данных, платформа выдаст исключение «Тип не может быть выбран в запросе».Наиболее правильный и масштабируемый подход — отказаться от ручной вставки данных через буфер обмена и написать программную подготовку параметра. В продвинутых консолях запросов предусмотрена специальная вкладка (например, «Перед выполнением запроса» или «Код до выполнения»), где доступен контекст объекта Запрос.
Начиная с платформы 8.3.6, объект ТабличныйДокумент умеет напрямую читать файлы XLSX без использования сторонних библиотек, технологии COM или промежуточного сохранения в формат MXL. Разберем по шагам, как прочитать файл, создать строго типизированную таблицу и передать ее в запрос:
// 1. Читаем файл Excel в табличный документ средствами платформы
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\Temp\Data.xlsx");
// 2. Формируем типизированную таблицу значений с правильными именами колонок
ТЗ = Новый ТаблицаЗначений;
МассивТиповСтрока = Новый Массив;
МассивТиповСтрока.Добавить(Тип("Строка"));
КвалификаторыСтроки = Новый КвалификаторыСтроки(150);
ОписательСтроки = Новый ОписаниеТипов(МассивТиповСтрока, , КвалификаторыСтроки);
МассивТиповЧисло = Новый Массив;
МассивТиповЧисло.Добавить(Тип("Число"));
КвалификаторыЧисла = Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Любой);
ОписательЧисла = Новый ОписаниеТипов(МассивТиповЧисло, , , КвалификаторыЧисла);
ТЗ.Колонки.Добавить("Артикул", ОписательСтроки);
ТЗ.Колонки.Добавить("Количество", ОписательЧисла);
// 3. Заполняем таблицу значениями из ячеек (пропуская строку заголовка)
ВсегоСтрок = ТабДок.ВысотаТаблицы;
Для НомерСтроки = 2 По ВсегоСтрок Цикл
ТекАртикул = СокрЛП(ТабДок.ПолучитьОбласть(НомерСтроки, 1).ТекущийОбъект);
Если ПустаяСтрока(ТекАртикул) Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Артикул = ТекАртикул;
НоваяСтрока.Количество = Число(ТабДок.ПолучитьОбласть(НомерСтроки, 2).ТекущийОбъект);
КонецЦикла;
// 4. Передаем подготовленную таблицу в параметры запроса
Запрос.УстановитьПараметр("ТаблицаДанных", ТЗ);
Этот код гарантирует, что каждая колонка получит строго определенный тип, системные имена не будут содержать запрещенных символов, а сам запрос отработает без ошибок типизации СУБД.
Если таблица уже загружена в параметр интерактивно через встроенный мастер или MXL, но имена колонок подставились по умолчанию (например, Колонка1, Колонка2), их необязательно переименовывать в самой структуре таблицы значений.
Рассмотрим, как назначить колонкам смысловые имена непосредственно в момент их помещения во временную таблицу с помощью псевдонимов языка запросов:
ВЫБРАТЬ
ИсходныеДанные.Колонка1 КАК НоменклатураНаименование,
ИсходныеДанные.Колонка2 КАК Количество
ПОМЕСТИТЬ ВТ_ИсходныеДанные
ИЗ
&ТаблицаДанных КАК ИсходныеДанные
;
ВЫБРАТЬ
ВТ.НоменклатураНаименование,
ВТ.Количество
ИЗ
ВТ_ИсходныеДанные КАК ВТ
Такой подход экономит время: мы оставляем исходные технические имена колонок во входящем параметре, а внутри запроса работаем с понятными псевдонимами.
Выясним причину сбоев при интерактивной загрузке: в ранних версиях инструментов разработчика парсинг внешних форматов опирался на системные драйверы Windows или промежуточные форматы табличных документов, что приводило к потере типов колонок. В современных релизах инструментов механизм импорта использует актуальные возможности платформы 1С:Предприятие 8.3, позволяя загружать файлы XLSX напрямую и настраивать сопоставление типов на отдельном шаге мастера импорта без ручных манипуляций с промежуточным сохранением в MXL.