При работе с платформой 1С:Предприятие разработчики часто сталкиваются с ситуацией, когда данные, полученные в результате выполнения запроса, при выгрузке в ТаблицаЗначений имеют непредсказуемую разрядность числовых колонок. Рассмотрим подробнее, почему возникают значения 38, 15 или 0, и как управлять этим поведением.
Когда мы выгружаем результат запроса в ТаблицаЗначений, платформа 1С пытается автоматически определить типы данных для колонок. Однако алгоритм этого определения сильно зависит от источника данных:
Многие разработчики пытаются решить проблему с помощью оператора ВЫРАЗИТЬ, однако на практике это не всегда дает желаемый результат. Проблема заключается в том, что результат запроса часто является составным типом NULL, Число. Из-за наличия NULL квалификаторы числа не всегда корректно применяются к колонке ТаблицаЗначений.
Рассмотрим, как правильно работать с разрядностью на примерах:
Самым надежным способом получения нужной разрядности является принудительная установка типа колонки уже после того, как данные попали в ТаблицаЗначений. Это исключает зависимость от того, как именно 1С интерпретирует результат запроса.
Воспользуемся методом Добавить с указанием ОписаниеТипов:
// Пример принудительной настройки колонки
Таблица = Запрос.Выполнить().Выгрузить();
Квалификаторы = Новый КвалификаторыЧисла(15, 3);
ОписаниеТипаЧисло = Новый ОписаниеТипов("Число", Квалификаторы);
Таблица.Колонки["ИмяВашейКолонки"].ТипЗначения = ОписаниеТипаЧисло;
Если вам необходимо гарантировать, что все данные в уже заполненной таблице соответствуют формату, можно программно обработать каждую строку:
Для Каждого Строка Из Таблица Цикл
Строка.Количество = Число(Строка.Количество);
КонецЦикла;
Важное примечание: Использование функции Число() в коде 1С не меняет структуру (метаданные) колонки ТаблицаЗначений, но позволяет привести конкретное значение к нужной точности, если вы работаете с данными в цикле.
Разберем ситуацию подробнее. Когда мы пишем:
ВЫБРАТЬ
ВЫРАЗИТЬ(СУММА(Количество) КАК ЧИСЛО(15, 3)) КАК Количество
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
Результат всё равно может возвращать разрядность 0 в колонке ТаблицаЗначений. Это происходит потому, что платформа 1С при создании колонок в ТаблицаЗначений на основе запроса опирается на тип, который возвращает СУБД для данного выражения, а не всегда на жесткие квалификаторы внутри оператора ВЫРАЗИТЬ, особенно при сложных объединениях или наличии NULL.
ТаблицаЗначений вручную после метода Выгрузить().NULL, используйте функцию ЕСТЬNULL(Поле, 0), чтобы избавиться от составного типа данных, что упрощает дальнейшую работу с типизацией.Помните, что ТаблицаЗначений — это объект, который живет в памяти, и его метаданные (типы колонок) могут быть изменены вами в любой момент выполнения программы. Это дает вам полный контроль над тем, как именно будут представлены ваши числа.