1С объединить две таблицы значений в одну

1С объединить две таблицы значений в одну

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

Объединение в запросах в языке 1С 8.3, 8.2 (в примерах)

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Подписывайтесь и получайте новые статьи и обработки на почту (не чаще 1 раза в неделю).

Вступайте в мою группу ВКонтакте, Одноклассниках, Facebook или Google+ — самые последние обработки, исправления ошибок в 1С, всё выкладываю там в первую очередь.

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться:

У объекта встроенного языка ТаблицаЗначений не предусмотрено специальных методов загрузки данных из других таблиц, либо объединения данных нескольких таблиц.

Поэтому задача добавления одной таблицы значений в конец другой является чисто алгоритмической.

Допустим, у нас есть таблицы вида:

Таблица 1

Товар Количество
1 Стул деревянный 4
2 Стол деревянный 1
Таблица 2

Товар Количество
1 Шкаф для одежды 1
2 Тумба прикроватная 2

и стоит задача их объединить. Самый элементарный способ реализации, который напрашивается: построчно скопировать строки второй таблицы в конец первой:

В результате мы получим таблицу вида:

Результат

Товар Количество
1 Стул деревянный 4
2 Стол деревянный 1
3 Шкаф для одежды 1
4 Тумба прикроватная 2

Но у приведенного выше алгоритма есть один недостаток: он привязан к именам колонок таблиц значений. Чтобы сделать этот код по настоящему универсальным, следует использовать функцию встроенного языка ЗаполнитьЗначенияСвойств(), тогда не понадобится прописывать имена колонок в коде каждый раз при объединении таблиц:

Читайте также:  Iconbit movie ultra hd 4k отзывы

Почему я перенес инициализацию номера строки ниже, думаю, Вы догадаетесь сами. Если нет, рекомендую прорешать данную задачу на практике самостоятельно.

Всегда все объединения ТЗ делал циклом с проверкой наличия строки перед добавлением. Это конечно для случаев когда нельзя получить данные сразу в одну ТЗ любым методом.

Занимаясь автоматизацией получения данных с ресурса от поставщика, столкнулся с проблемой. количество строк в каталоге поставщика около 100 000 и получение их возможно только частями по принадлежности к группам.

Просмотрев массу примеров, взял 1 за основу. в моем варианте получилось в 2 раза меньше строк. Работает стабильно, но возникла следующая проблема — ТЗ1 по количеству колонок отличается от ТЗ2. Немного дополнил функцию и циклом 2 ТЗ объединяются без проблем. И снова НО, потребовалось получить весь каталог для обработки, а это в моем случае 23 запроса по группам верхнего уровня. Объединение ТЗ циклом занимает от 30 сек до 210 в зависимости от размера получаемого блока. В совокупности у меня получилось почти 20 минутное ожидание чтобы собрать каталог товаров поставщика в 1 ТЗ. Это очень долго.

Поискав примеры объединения 2-х ТЗ через запрос, собрал свой рабочий вариант. Встречал разные примеры, вот один из них http://zapros-1c-8.ru/9-yazik-zaprosov-1c-8/15-union.

И снова НО: а если ТЗ которые нужно объединять не один конкретный вариант, а их много. Писать под каждый вариант отдельный запрос на объединение? Большинство так и делают.

В моем случае возможных вариантов ТЗ что требуется объединить не 1 и 2, а много больше и по мере развития проекта, над которым работаю, их количество будет только расти, поэтому разработал вариант универсальный.

Объединение ведется по любой указанной колонке.

Читайте также:  Beko wkb 51031 ptma ремонт своими руками

Уже выложив пример процедур с использованием цикла и запроса, ну и конечно получив первые комментарии, при отладке очередной задачи частично переписал обе процедуры. Сразу оговорюсь, ситуации бывают разные, изначально получил более оптимальный алгоритм через запрос, но потом учитывая комментарий об индексе и добавив сворачивание ТЗ, получил что циклом в 2 раза быстрее чем запросом. скорость обработки зависит от многих факторов: количество строк, колонок, уникальных записей. После модернизации, мне более стал подходить вариант циклом, хотя есть другая задача, где запрос с 15% отрывом работает быстрее, так что использую оба варианта.

Вариант запросом не работает если есть колонки типа строка неграниченной длины, для исправления этого пример процедуры ниже.

Вариант 1. Объединение циклом:

Вариант 2. Объединение запросом:

Для более наглядного примера смотрите обработку, там выбрав 2 документа можно увидеть результат работы обоих методов. Запрос по ТЗ во втором методе формирется по колонкам ТЗ1 и ТЗ2

И небольшое дополнение к решению задачи по объединению двух таблиц значений. Дело в том что при работе с ТЗ в запросе есть определенные ограничения, например строки неограниченной длины там недопустимы, другими словами при создании колонки ТЗ ( если тип СТРОКА ) нужно ЧЕТКО указать длину строки . Иначе при выполнении запроса получите ошибку: "Тип не может быть выбран в запросе" . Поэтому будте внимательны и четко прописывайте тип колонок, а на случай если: некогда, пофиг, ну или просто невозможно это сделать по какой либо причине, предлагаю такую процедуру для исправления:

взято и переработано немного отсюда: ссылка

Ссылка на основную публикацию
Adblock detector