Почему колонка НомерСтроки в ТаблицеЗначений переименовывается в lineNumber при передаче в фоновое задание

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

При разработке асинхронных механизмов и выносе ресурсоемких расчетов в фоновые задания разработчики нередко сталкиваются с неожиданным поведением платформы 1С:Предприятие 8.3: при передаче таблицы значений в качестве параметра имя колонки НомерСтроки внутри фоновой процедуры самопроизвольно меняется на англоязычное lineNumber. В результате типовой или доработанный код, обращающийся к свойству СтрокаТаблицы.НомерСтроки, падает с критической ошибкой отсутствия поля.

Разберем детально механизм возникновения этой ошибки и рассмотрим надежные варианты ее обхода.

Причины автоматического переименования колонок

Проанализируем, как платформа передает параметры между сеансами. Запуск фонового задания через метод ФоновыеЗадания.Выполнить() инициирует создание отдельного фонового сеанса на сервере. Для передачи данных из вызывающего контекста в процедуру фонового задания платформа выполняет сериализацию объектов с использованием механизма XDTO.

В процессе преобразования структуры таблицы значений действуют следующие правила:

  1. Сопоставление со стандартными именами: Имена колонок, совпадающие с системными реквизитами платформы (например, НомерСтроки, Код, Ссылка), при формировании XML/XDTO-структуры сопоставляются с каноническими англоязычными свойствами схемы (в частности, lineNumber).
  2. Десериализация в целевом сеансе: При распаковке входящего массива параметров внутри нового фонового сеанса таблица значений создается заново на основе схемы, где колонка уже получила системное имя lineNumber.
  3. Независимость от локализации: Настройки региональных установок операционной системы и сервера 1С не влияют на этот процесс, так как схема XDTO-сериализации платформы зафиксирована на уровне ядра.

Способ 1. Передача таблицы значений через ХранилищеЗначения

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

Посмотрим на пример упаковки параметров перед запуском задания:


ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(Новый ХранилищеЗначения(ТаблицаДанных));

ФоновоеЗадание = ФоновыеЗадания.Выполнить("МойОбщийМодуль.ВыполнитьОбработкуВФоне", ПараметрыЗадания);

Разберем извлечение таблицы внутри исполняемой процедуры фонового задания:


Процедура ВыполнитьОбработкуВФоне(ХранилищеТаблицы) Экспорт
    
    ТаблицаДанных = ХранилищеТаблицы.Получить();
    
    // Колонка "НомерСтроки" сохраняет свое исходное русскоязычное имя
    Для Каждого Стр Из ТаблицаДанных Цикл
        Если Стр.НомерСтроки > 1 Тогда
            // Обработка данных
        КонецЕсли;
    КонецЦикла;

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

Способ 2. Обратное переименование колонки на входе в фоновую процедуру

Если сигнатура метода фонового задания уже зафиксирована и изменение состава параметров нежелательно, можно восстановить исходное имя колонки сразу при входе в фоновую процедуру.

Проанализируем программный код нормализации структуры колонок:


Процедура ОбработатьДанныеФоново(ТаблицаДанных) Экспорт

    КолонкаLineNumber = ТаблицаДанных.Колонки.Найти("lineNumber");
    Если КолонкаLineNumber <> Неопределено Тогда
        КолонкаLineNumber.Имя = "НомерСтроки";
    КонецЕсли;

    // Дальнейший алгоритм работает со стандартным именем "НомерСтроки"
    Для Каждого СтрокаГруппировки Из ТаблицаДанных Цикл
        Если СтрокаГруппировки.НомерСтроки > 1 Тогда
            // Выполнение логики
        КонецЕсли;
    КонецЦикла;

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

Способ 3. Использование альтернативных имен колонок при формировании запроса

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

Посмотрим на пример текста запроса с псевдонимом:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Таблица.ПорядковыйНомер КАК НомСтроки,
    |   Таблица.Номенклатура КАК Номенклатура
    |ИЗ
    |   &ИсходныеДанные КАК Таблица";

ТаблицаДанных = Запрос.Выполнить().Выгрузить();

В этом случае при передаче таблицы в метод ФоновыеЗадания.Выполнить() колонка НомСтроки не будет перехвачена механизмом XDTO и поступит в фоновый сеанс без изменений.

Способ 4. Обновление версии технологической платформы

Данная особенность сериализации характерна для релизов ветки 8.3 (в частности, 8.3.8–8.3.10). В более современных версиях платформы 1С:Предприятие 8.3 механизмы передачи параметров в фоновые задания были доработаны. Если инфраструктура позволяет, обновление платформы до актуального стабильного релиза также решает проблему с сопоставлением имен колонок.

← На главную