Добавление данных в существующую временную таблицу - использование и проблемы

04.03.25

Разработка - Инструментарий разработчика

Начиная с версии платформы 8.3.25, разработчики расширили функционал работы с временными таблицами. Теперь можно во временную таблицу добавлять новые строки через "ДОБАВИТЬ". Это круто, подумал я, и решил немедленно воспользоваться такой возможностью. Итак, новая фича работает только, если добавление происходит используя данные самой базы. Если же хочешь добавить свою запись, то выскакивает ошибка "Тип устанавливаемого значения не соответствует типу поля временной таблицы. ...". Хотя в параметры запроса были переданы значения с типами аналогичными измерениям и ресурсам регистра сведений. В приложенной обработке реализован обход проблемы с добавлением своей произвольной строки. Проблема наблюдается в версии платформы 8.3.25.1445, возможно, в новых версиях платформы это исправят.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Добавление данных в существующую временную таблицу - использование и проблемы:
.epf 7,51Kb
0
0 Скачать (1 SM) Купить за 1 850 руб.

Начиная с версии платформы 8.3.25 расширили функционал работы с временными таблицами. Теперь можно во временную таблицу добавлять новые строки через "ДОБАВИТЬ". Это круто, подумал я, и решил немедленно воспользоваться такой возможностью.

У меня был алгоритм, который заполнял некий регистр сведений и при этом использовал данные этого регистра, чтоб просчитать новую запись для него же. Запись в регистр - это НЕ очень производительная процедура. В попытках отказаться от поштучной записи в этот регистр, используя таблицу значений не увенчались успехом, т.к. при большом количестве циклов поиска нужных данных из этой таблицы значений так же приводили к падению производительности. И тут бац и 1С добавляет такую полезную фичу.

В какой-то момент я решился отрефакторить данный алгоритм. Каково же было разочарование, когда потратив надцать часов, добавление новой записи во временную таблицу мне выдало: "Тип устанавливаемого значения не соответствует типу поля временной таблицы. ...". И тут я провалился ещё на надцать часов, чтоб найти обходные пути.

Итак, новая фича работает только, если добавление происходит используя данные самой базы, как это описано в зазеркалье:

 

 

А если в подготовленную временную таблицу:

 

 

пытаешься добавить так:

 

 

То выскакивает ошибка "Тип устанавливаемого значения не соответствует типу поля временной таблицы. ...". Хотя в параметры запроса были переданы значения с типами аналогичными измерениям и ресурсам регистра сведений. Ошибки вызывали поля НЕ ссылочного типа: число, дата, строка. Это и понятно, в параметрах запроса мы передаём значения, описание типов идут при этом лесом. Попытки выразить их в запросе ни к чему не привели. Я прошерстил кучу форумов и ресурсов, пробовал и так и сяк. В общем нашёл обходной путь как всё таки можно добавить свою строчку во временную таблицу. Единственно, не удалось справится с реквизитом с типом строка, перепробовал разные варианты, итог - строка не поддаётся. Т.е. если у вас в регистре/справочнике и т.п. есть реквизит с типом строка, то воспользоваться функцией ДОБАВИТЬ вам не удастся - будет возникать ошибка.

Прикладываю обработку, в которой реализован обход этой проблемы. Будем надеяться, что 1С решит эту проблему, и в каком-нибудь релизе платформы решит эту проблему, и можно будет нормально добавлять записи, а будет ещё лучше, если будет возможность изменять значение конкретной строки временной таблицы, а то приходится в конце расчета сворачивать строки, что так же затратно при больших объёмах данных.

Приложенная обработка будет работать на конфигурациях, в которых есть регистр сведений КурсыВалют. В обработке 2 кнопки, одна заработает, когда 1С исправят описанную проблему, вторая содержит обходной путь, позволяющий во временную таблицу добавлять свои записи без привязки к конфигурации.

 

 

Обработка протестирована на версии платформы: 1С:Предприятие 8.3 (8.3.25.1445).

Добавление данных в существующую временную таблицу Тип устанавливаемого значения не соответствует типу поля временной таблицы

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    177551    986    403    

942

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    19043    127    70    

130

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

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

15000 руб.

10.11.2023    12790    53    33    

72

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

22200 руб.

06.10.2023    18746    49    19    

82

Инструментарий разработчика Программист Платформа 1С v8.3 Платные (руб)

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

9360 руб.

17.05.2024    28889    100    48    

146

Инструментарий разработчика Программист 8.3.14 Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

20000 руб.

07.10.2021    18610    7    32    

43

Инструментарий разработчика Платформа 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    1699    2    0    

5
Отзывы
2. kalyaka 1128 05.03.25 14:25 Сейчас в теме
Для решения задачи добавления во временную таблицу данных из переменных необходимо использовать в качестве источника таблицу значений с соответствующими типами колонок:
Таблица = Новый ТаблицаЗначений();
Таблица.Колонки.Добавить("Период", ОбщегоНазначения.ОписаниеТипаДата(ЧастиДаты.Дата));
Таблица.Колонки.Добавить("Валюта", Новый ОписаниеТипов("СправочникСсылка.Валюты"));
Таблица.Колонки.Добавить("Курс", ОбщегоНазначения.ОписаниеТипаЧисло(10, 4, ДопустимыйЗнак.Неотрицательный));
Таблица.Колонки.Добавить("Кратность", ОбщегоНазначения.ОписаниеТипаЧисло(10, 0, ДопустимыйЗнак.Неотрицательный));

НоваяСтрока = Таблица.Добавить();
НоваяСтрока.Период = ТекущаяДата();
НоваяСтрока.Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
НоваяСтрока.Курс = 1;
НоваяСтрока.Кратность = 1;
Показать
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. kalyaka 1128 05.03.25 13:35 Сейчас в теме
Мои изыскания на эту тему показали, что при чтении запроса не из таблицы БД типизация колонок происходит с классификатора типа по-умолчанию. Например, поле Период в примере типа "Дата" с классификатором "Дата", а при чтении из переменной становится с классификатором "Дата и время".

С числами ситуация сложнее: требуется точное совпадение по разрядам и допустимому знаку.

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

Итог: добавление во временную таблицу возможно только по полям с полным совпадением типов и классификаторов.
2. kalyaka 1128 05.03.25 14:25 Сейчас в теме
Для решения задачи добавления во временную таблицу данных из переменных необходимо использовать в качестве источника таблицу значений с соответствующими типами колонок:
Таблица = Новый ТаблицаЗначений();
Таблица.Колонки.Добавить("Период", ОбщегоНазначения.ОписаниеТипаДата(ЧастиДаты.Дата));
Таблица.Колонки.Добавить("Валюта", Новый ОписаниеТипов("СправочникСсылка.Валюты"));
Таблица.Колонки.Добавить("Курс", ОбщегоНазначения.ОписаниеТипаЧисло(10, 4, ДопустимыйЗнак.Неотрицательный));
Таблица.Колонки.Добавить("Кратность", ОбщегоНазначения.ОписаниеТипаЧисло(10, 0, ДопустимыйЗнак.Неотрицательный));

НоваяСтрока = Таблица.Добавить();
НоваяСтрока.Период = ТекущаяДата();
НоваяСтрока.Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
НоваяСтрока.Курс = 1;
НоваяСтрока.Кратность = 1;
Показать
3. _root 179 05.03.25 21:29 Сейчас в теме
(2) Хороший вариант, который позволяет и тип строка обрабатывать, только он для моих нужд медленнее в 5 раз, чем добавление без использования таблицы значений.
Прикрепленные файлы:
Оставьте свое сообщение