HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#статьи</a></p>
1 <p><a>#статьи</a></p>
2 <ul><li>12 сен 2025</li>
2 <ul><li>12 сен 2025</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><p>Подробное руководство по таблице значений в "1С": создание, добавление колонок, отбор, сортировка, поиск, группировка и не только.</p>
4 </ul><p>Подробное руководство по таблице значений в "1С": создание, добавление колонок, отбор, сортировка, поиск, группировка и не только.</p>
5 <p>Иллюстрация: Оля Ежак для Skillbox Media</p>
5 <p>Иллюстрация: Оля Ежак для Skillbox Media</p>
6 <p>Программист, консультант, специалист по документированию. Легко и доступно рассказывает о сложных вещах в программировании и дизайне.</p>
6 <p>Программист, консультант, специалист по документированию. Легко и доступно рассказывает о сложных вещах в программировании и дизайне.</p>
7 <p>Таблица значений в "1С:Предприятии" - один из самых часто используемых объектов при обработке данных в памяти. Она позволяет удобно хранить и обрабатывать табличную информацию без записи в базу данных.</p>
7 <p>Таблица значений в "1С:Предприятии" - один из самых часто используемых объектов при обработке данных в памяти. Она позволяет удобно хранить и обрабатывать табличную информацию без записи в базу данных.</p>
8 <p>В этой статье мы разберём, что такое таблица значений, как она устроена, как с ней работать и в каких случаях её использование наиболее эффективно.</p>
8 <p>В этой статье мы разберём, что такое таблица значений, как она устроена, как с ней работать и в каких случаях её использование наиболее эффективно.</p>
9 <p><strong>Содержание</strong></p>
9 <p><strong>Содержание</strong></p>
10 <ul><li><a>Кратко про "1С:Предприятие"</a></li>
10 <ul><li><a>Кратко про "1С:Предприятие"</a></li>
11 <li><a>Где будем практиковаться</a></li>
11 <li><a>Где будем практиковаться</a></li>
12 <li><a>Что такое таблица значений</a></li>
12 <li><a>Что такое таблица значений</a></li>
13 <li><a>Как создать таблицу значений</a></li>
13 <li><a>Как создать таблицу значений</a></li>
14 <li><a>Перебор строк и столбцов</a></li>
14 <li><a>Перебор строк и столбцов</a></li>
15 <li><a>Как посчитать итоги</a></li>
15 <li><a>Как посчитать итоги</a></li>
16 <li><a>Как найти строку в таблице значений</a></li>
16 <li><a>Как найти строку в таблице значений</a></li>
17 <li><a>Как удалить одну или несколько строк</a></li>
17 <li><a>Как удалить одну или несколько строк</a></li>
18 <li><a>Сортировка таблицы значений</a></li>
18 <li><a>Сортировка таблицы значений</a></li>
19 <li><a>Отбор строк</a></li>
19 <li><a>Отбор строк</a></li>
20 <li><a>Как скопировать таблицу</a></li>
20 <li><a>Как скопировать таблицу</a></li>
21 <li><a>Как свернуть таблицу значений</a></li>
21 <li><a>Как свернуть таблицу значений</a></li>
22 <li><a>Как добавить данные из другой таблицы</a></li>
22 <li><a>Как добавить данные из другой таблицы</a></li>
23 <li><a>Как выгрузить строки в массив структур и загрузить обратно</a></li>
23 <li><a>Как выгрузить строки в массив структур и загрузить обратно</a></li>
24 <li><a>Как вывести таблицу значений на управляемую форму</a></li>
24 <li><a>Как вывести таблицу значений на управляемую форму</a></li>
25 </ul><p>Прежде чем перейти к таблице значений, кратко расскажем про организацию данных в "1С:Предприятии".</p>
25 </ul><p>Прежде чем перейти к таблице значений, кратко расскажем про организацию данных в "1С:Предприятии".</p>
26 <p>В "1С:Предприятии" данные организованы через метаданные - структуру, описывающую объекты учёта (справочники, документы, регистры, планы и так далее). Логическая модель данных задаётся в конфигурации, а физическое хранение обеспечивается реляционной базой данных (PostgreSQL, Microsoft SQL Server, SQLite и другими).</p>
26 <p>В "1С:Предприятии" данные организованы через метаданные - структуру, описывающую объекты учёта (справочники, документы, регистры, планы и так далее). Логическая модель данных задаётся в конфигурации, а физическое хранение обеспечивается реляционной базой данных (PostgreSQL, Microsoft SQL Server, SQLite и другими).</p>
27 <em>Скриншот: "1С:Предприятие 8.3". Конфигуратор / Skillbox Media</em><p>Каждый объект в 1С (например, справочник "Товары" или документ "Поступление") транслируется в одну или несколько таблиц СУБД. Данные сохраняются в этих таблицах автоматически, а разработчику обычно не нужно взаимодействовать с SQL напрямую: работа идёт через встроенный язык 1С и механизмы платформы.</p>
27 <em>Скриншот: "1С:Предприятие 8.3". Конфигуратор / Skillbox Media</em><p>Каждый объект в 1С (например, справочник "Товары" или документ "Поступление") транслируется в одну или несколько таблиц СУБД. Данные сохраняются в этих таблицах автоматически, а разработчику обычно не нужно взаимодействовать с SQL напрямую: работа идёт через встроенный язык 1С и механизмы платформы.</p>
28 <p>ТаблицаЗначений - это временная структура, которая существует только в оперативной памяти во время выполнения кода. Это аналог обычной двумерной таблицы в памяти, который содержит колонки и строки.</p>
28 <p>ТаблицаЗначений - это временная структура, которая существует только в оперативной памяти во время выполнения кода. Это аналог обычной двумерной таблицы в памяти, который содержит колонки и строки.</p>
29 <p>ТаблицаЗначений позволяет собирать, сортировать, фильтровать и анализировать данные в оперативной памяти. После завершения процедуры (например, модуля или сеанса) она исчезает, но её содержимое можно вывести на печать или явно сохранить в постоянный объект: справочник, документ, регистр или внешний файл.</p>
29 <p>ТаблицаЗначений позволяет собирать, сортировать, фильтровать и анализировать данные в оперативной памяти. После завершения процедуры (например, модуля или сеанса) она исчезает, но её содержимое можно вывести на печать или явно сохранить в постоянный объект: справочник, документ, регистр или внешний файл.</p>
30 <p>Обычно она используется:</p>
30 <p>Обычно она используется:</p>
31 <ul><li>при формировании отчётов;</li>
31 <ul><li>при формировании отчётов;</li>
32 <li>для временного накопления данных перед записью;</li>
32 <li>для временного накопления данных перед записью;</li>
33 <li>в обработках и обработчиках событий;</li>
33 <li>в обработках и обработчиках событий;</li>
34 <li>для обмена данными между модулями;</li>
34 <li>для обмена данными между модулями;</li>
35 <li>при подготовке информации к отображению на форме.</li>
35 <li>при подготовке информации к отображению на форме.</li>
36 </ul><p>Теперь попробуем разобраться с таблицами на примере.</p>
36 </ul><p>Теперь попробуем разобраться с таблицами на примере.</p>
37 <p>Создадим пустую конфигурацию, где будем тестировать свой код. Зайдём в раздел ОбщиеКоманды и добавим новую команду ОбщаяКоманда1 с синонимом Создание таблицы значений - это название отобразится в программе. Добавим команду в группу ПанельНавигации.Обычное. Там она будет находиться при запуске программы "1С:Предприятие".</p>
37 <p>Создадим пустую конфигурацию, где будем тестировать свой код. Зайдём в раздел ОбщиеКоманды и добавим новую команду ОбщаяКоманда1 с синонимом Создание таблицы значений - это название отобразится в программе. Добавим команду в группу ПанельНавигации.Обычное. Там она будет находиться при запуске программы "1С:Предприятие".</p>
38 <em>Скриншот: "1С:Предприятие 8.3". Конфигуратор / Skillbox Media</em><p>Откроем модуль команды и добавим новую процедуру ОбработкаКомандыНаСервере ().</p>
38 <em>Скриншот: "1С:Предприятие 8.3". Конфигуратор / Skillbox Media</em><p>Откроем модуль команды и добавим новую процедуру ОбработкаКомандыНаСервере ().</p>
39 <em>Скриншот: "1С:Предприятие 8.3". Конфигуратор / Skillbox Media</em><p>В этой процедуре мы дальше разместим код.</p>
39 <em>Скриншот: "1С:Предприятие 8.3". Конфигуратор / Skillbox Media</em><p>В этой процедуре мы дальше разместим код.</p>
40 <p>Вот код, который нужно разместить в процедуре ОбработкаКомандыНаСервере (), чтобы создать объект ТаблицаЗначений:</p>
40 <p>Вот код, который нужно разместить в процедуре ОбработкаКомандыНаСервере (), чтобы создать объект ТаблицаЗначений:</p>
41 тСмартфоны = Новый ТаблицаЗначений;<p>Колонки добавляются методом Колонки.Добавить ().</p>
41 тСмартфоны = Новый ТаблицаЗначений;<p>Колонки добавляются методом Колонки.Добавить ().</p>
42 <p>Синтаксис этого метода:</p>
42 <p>Синтаксис этого метода:</p>
43 <p>Добавить (&lt;Имя&gt;, &lt;Тип&gt;, &lt;Заголовок&gt;, &lt;Ширина&gt;)</p>
43 <p>Добавить (&lt;Имя&gt;, &lt;Тип&gt;, &lt;Заголовок&gt;, &lt;Ширина&gt;)</p>
44 <p>Где<strong>:</strong></p>
44 <p>Где<strong>:</strong></p>
45 <ul><li>Имя - это имя колонки таблицы. Это обязательный параметр.</li>
45 <ul><li>Имя - это имя колонки таблицы. Это обязательный параметр.</li>
46 <li>Тип - тип данных, которые будут храниться в колонке. По умолчанию - Строка.</li>
46 <li>Тип - тип данных, которые будут храниться в колонке. По умолчанию - Строка.</li>
47 <li>Заголовок - заголовок колонки, который увидит пользователь, если таблица будет создана программно на форме.</li>
47 <li>Заголовок - заголовок колонки, который увидит пользователь, если таблица будет создана программно на форме.</li>
48 <li>Ширина - длина колонки, то есть количество символов в ней.</li>
48 <li>Ширина - длина колонки, то есть количество символов в ней.</li>
49 </ul>тСмартфоны.Колонки.Добавить("Модель"); тСмартфоны.Колонки.Добавить("Производитель");<p>Мы добавили две текстовые (строковые) колонки: Модель и Производитель. Тип данных в колонке мы не меняем - это Строка.</p>
49 </ul>тСмартфоны.Колонки.Добавить("Модель"); тСмартфоны.Колонки.Добавить("Производитель");<p>Мы добавили две текстовые (строковые) колонки: Модель и Производитель. Тип данных в колонке мы не меняем - это Строка.</p>
50 <p>Зададим тип колонок:</p>
50 <p>Зададим тип колонок:</p>
51 ТипЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 2)); тСмартфоны.Колонки.Добавить("Цена", ТипЧисло); тСмартфоны.Колонки.Добавить("Количество", ТипЧисло);<p>Здесь:</p>
51 ТипЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 2)); тСмартфоны.Колонки.Добавить("Цена", ТипЧисло); тСмартфоны.Колонки.Добавить("Количество", ТипЧисло);<p>Здесь:</p>
52 <ul><li>Создаём тип данных Число с длиной "10" и двумя знаками после запятой. Теперь значения в колонке Цена будут числовыми, например: 54 990,00.</li>
52 <ul><li>Создаём тип данных Число с длиной "10" и двумя знаками после запятой. Теперь значения в колонке Цена будут числовыми, например: 54 990,00.</li>
53 <li>Добавляем колонки Цена и Количество с этим типом.</li>
53 <li>Добавляем колонки Цена и Количество с этим типом.</li>
54 </ul><p>Добавим в таблицу три строки, через точку заполним значения по каждому столбцу. Укажем модель, производителя и цену.</p>
54 </ul><p>Добавим в таблицу три строки, через точку заполним значения по каждому столбцу. Укажем модель, производителя и цену.</p>
55 // iPhone 15 Стр = тСмартфоны.Добавить(); Стр.Модель = "iPhone 15"; Стр.Производитель = "Apple"; Стр.Цена = 99990; Стр.Количество = 1; // Galaxy S24 Стр = тСмартфоны.Добавить(); Стр.Модель = "Galaxy S24"; Стр.Производитель = "Samsung"; Стр.Цена = 89990; Стр.Количество = 1; // Xiaomi 13T Стр = тСмартфоны.Добавить(); Стр.Модель = "Xiaomi 13T"; Стр.Производитель = "Xiaomi"; Стр.Цена = 54990; Стр.Количество = 2; // Xiaomi 13T Стр = тСмартфоны.Добавить(); Стр.Модель = "Xiaomi 14T"; Стр.Производитель = "Xiaomi"; Стр.Цена = 74890; Стр.Количество = 1;<p>Теперь мы можем вывести на экран данные по каждому смартфону. Для перебора строк в таблице значений удобно использовать оператор цикла Для Каждого:</p>
55 // iPhone 15 Стр = тСмартфоны.Добавить(); Стр.Модель = "iPhone 15"; Стр.Производитель = "Apple"; Стр.Цена = 99990; Стр.Количество = 1; // Galaxy S24 Стр = тСмартфоны.Добавить(); Стр.Модель = "Galaxy S24"; Стр.Производитель = "Samsung"; Стр.Цена = 89990; Стр.Количество = 1; // Xiaomi 13T Стр = тСмартфоны.Добавить(); Стр.Модель = "Xiaomi 13T"; Стр.Производитель = "Xiaomi"; Стр.Цена = 54990; Стр.Количество = 2; // Xiaomi 13T Стр = тСмартфоны.Добавить(); Стр.Модель = "Xiaomi 14T"; Стр.Производитель = "Xiaomi"; Стр.Цена = 74890; Стр.Количество = 1;<p>Теперь мы можем вывести на экран данные по каждому смартфону. Для перебора строк в таблице значений удобно использовать оператор цикла Для Каждого:</p>
56 Для Каждого Стр Из тСмартфоны Цикл Сообщить(Стр.Модель + " / " + Стр.Производитель + " -- " + Стр.Цена + " ₽ / " + Стр.Количество + "шт."); КонецЦикла;<p>Здесь:</p>
56 Для Каждого Стр Из тСмартфоны Цикл Сообщить(Стр.Модель + " / " + Стр.Производитель + " -- " + Стр.Цена + " ₽ / " + Стр.Количество + "шт."); КонецЦикла;<p>Здесь:</p>
57 <ul><li>Цикл проходит по всем строкам таблицы значений тСмартфоны.</li>
57 <ul><li>Цикл проходит по всем строкам таблицы значений тСмартфоны.</li>
58 <li>На каждой итерации переменная Стр получает одну строку таблицы.</li>
58 <li>На каждой итерации переменная Стр получает одну строку таблицы.</li>
59 <li>Команда Сообщить () выводит строку в окно сообщений 1С (в нижней части экрана).</li>
59 <li>Команда Сообщить () выводит строку в окно сообщений 1С (в нижней части экрана).</li>
60 </ul><p>Вот как это будет выглядеть в конфигураторе:</p>
60 </ul><p>Вот как это будет выглядеть в конфигураторе:</p>
61 <em>Скриншот: "1С:Предприятие 8.3". Конфигуратор / Skillbox Media</em><p>Обновим конфигурацию, перейдём в "1С:Предприятие" и запустим команду на выполнение. В результате получим:</p>
61 <em>Скриншот: "1С:Предприятие 8.3". Конфигуратор / Skillbox Media</em><p>Обновим конфигурацию, перейдём в "1С:Предприятие" и запустим команду на выполнение. В результате получим:</p>
62 <em>Скриншот: "1С:Предприятие 8.3" / Skillbox Media</em><p>Точно так же мы можем вывести на печать названия всех колонок таблицы:</p>
62 <em>Скриншот: "1С:Предприятие 8.3" / Skillbox Media</em><p>Точно так же мы можем вывести на печать названия всех колонок таблицы:</p>
63 Для Каждого Колонка Из тСмартфоны.Колонки Цикл Сообщить(Колонка.Имя); КонецЦикла; //Модель //Производитель //Цена //Количество<p>Теперь добавим колонку "Сумма" и посчитаем сумму по каждому смартфону:</p>
63 Для Каждого Колонка Из тСмартфоны.Колонки Цикл Сообщить(Колонка.Имя); КонецЦикла; //Модель //Производитель //Цена //Количество<p>Теперь добавим колонку "Сумма" и посчитаем сумму по каждому смартфону:</p>
64 тСмартфоны.Колонки.Добавить("Сумма", ТипЧисло); Для Каждого Стр Из тСмартфоны Цикл Стр.Сумма = Стр.Цена * Стр.Количество; КонецЦикла;<p>Выведем итоговую стоимость всех смартфонов:</p>
64 тСмартфоны.Колонки.Добавить("Сумма", ТипЧисло); Для Каждого Стр Из тСмартфоны Цикл Стр.Сумма = Стр.Цена * Стр.Количество; КонецЦикла;<p>Выведем итоговую стоимость всех смартфонов:</p>
65 Сообщить(тСмартфоны.Итог("Сумма")); // 374 850<p>Это можно сделать разными способами.</p>
65 Сообщить(тСмартфоны.Итог("Сумма")); // 374 850<p>Это можно сделать разными способами.</p>
66 <p>Строки в таблице значений индексируются с 0 до номера последней строки в таблице, уменьшенного на единицу. Строку можно получить по номеру индекса. Но если такого индекса не существует, возникнет ошибка. Поэтому полезно сначала проверить, что заданный индекс меньше количества строк в таблице, например:</p>
66 <p>Строки в таблице значений индексируются с 0 до номера последней строки в таблице, уменьшенного на единицу. Строку можно получить по номеру индекса. Но если такого индекса не существует, возникнет ошибка. Поэтому полезно сначала проверить, что заданный индекс меньше количества строк в таблице, например:</p>
67 Если тСмартфоны.Количество() &gt; 2 Тогда Строка = тСмартфоны.Получить(2); Сообщить(Строка.Модель); КонецЕсли; // Xiaomi 13T<p>В этом случае программа возвратит первую найденную строку с заданным значением:</p>
67 Если тСмартфоны.Количество() &gt; 2 Тогда Строка = тСмартфоны.Получить(2); Сообщить(Строка.Модель); КонецЕсли; // Xiaomi 13T<p>В этом случае программа возвратит первую найденную строку с заданным значением:</p>
68 //Поиск первой строки НайденнаяСтрока = тСмартфоны.Найти("Galaxy S24", "Модель"); Сообщить(НайденнаяСтрока.Количество); // 1<p>Строки можно удалять с помощью метода Удалить (Индекс). Но удалять несколько строк нужно осторожно: если одновременно запустить прямой перебор и удалять индексы, индексы сместятся и программа удалит не то, что надо.</p>
68 //Поиск первой строки НайденнаяСтрока = тСмартфоны.Найти("Galaxy S24", "Модель"); Сообщить(НайденнаяСтрока.Количество); // 1<p>Строки можно удалять с помощью метода Удалить (Индекс). Но удалять несколько строк нужно осторожно: если одновременно запустить прямой перебор и удалять индексы, индексы сместятся и программа удалит не то, что надо.</p>
69 <p>Разберём несколько способов удаления строк.</p>
69 <p>Разберём несколько способов удаления строк.</p>
70 <p>Если вы точно знаете индекс (не забывайте вычитать из количества строк единицу):</p>
70 <p>Если вы точно знаете индекс (не забывайте вычитать из количества строк единицу):</p>
71 //Перед удалением желательно проверить количество строк: Если тСмартфоны.Количество() &gt; 2 Тогда тСмартфоны.Удалить(2); КонецЕсли;Для Каждого Стр Из тСмартфоны Цикл Если Стр.Производитель = "Xiaomi" Тогда тСмартфоны.Удалить(тСмартфоны.Индекс(Стр)); Прервать; // Чтобы удалить только первую подходящую строку КонецЕсли; КонецЦикла;<p>Здесь мы находим в таблице первую строку, удовлетворяющую условию, определяем её индекс и удаляем с помощью метода Удалить ().</p>
71 //Перед удалением желательно проверить количество строк: Если тСмартфоны.Количество() &gt; 2 Тогда тСмартфоны.Удалить(2); КонецЕсли;Для Каждого Стр Из тСмартфоны Цикл Если Стр.Производитель = "Xiaomi" Тогда тСмартфоны.Удалить(тСмартфоны.Индекс(Стр)); Прервать; // Чтобы удалить только первую подходящую строку КонецЕсли; КонецЦикла;<p>Здесь мы находим в таблице первую строку, удовлетворяющую условию, определяем её индекс и удаляем с помощью метода Удалить ().</p>
72 <p>Чтобы удалить все строки, соответствующие условию, лучше идти с конца таблицы: в этом случае индексы не смещаются:</p>
72 <p>Чтобы удалить все строки, соответствующие условию, лучше идти с конца таблицы: в этом случае индексы не смещаются:</p>
73 Кол = тСмартфоны.Количество() - 1; Для Индекс = -Кол По 0 Цикл Стр = тСмартфоны.Получить(-Индекс); Если Стр.Производитель = "Xiaomi" Тогда тСмартфоны.Удалить(-Индекс); КонецЕсли; КонецЦикла;<p>Это безопасный способ, если нужно удалить сразу несколько строк по условию.</p>
73 Кол = тСмартфоны.Количество() - 1; Для Индекс = -Кол По 0 Цикл Стр = тСмартфоны.Получить(-Индекс); Если Стр.Производитель = "Xiaomi" Тогда тСмартфоны.Удалить(-Индекс); КонецЕсли; КонецЦикла;<p>Это безопасный способ, если нужно удалить сразу несколько строк по условию.</p>
74 тСмартфоны.Очистить(); // Удаляет все строки<p>Этот метод удаляет из таблицы все строки, остаются одни пустые колонки.</p>
74 тСмартфоны.Очистить(); // Удаляет все строки<p>Этот метод удаляет из таблицы все строки, остаются одни пустые колонки.</p>
75 <p>В "1С:Предприятии" таблицу значений можно отсортировать по одной или нескольким колонкам с помощью метода Сортировать (). В качестве параметра используется строка с названиями колонок и направлениями сортировки - по возрастанию или убыванию.</p>
75 <p>В "1С:Предприятии" таблицу значений можно отсортировать по одной или нескольким колонкам с помощью метода Сортировать (). В качестве параметра используется строка с названиями колонок и направлениями сортировки - по возрастанию или убыванию.</p>
76 тСмартфоны.Сортировать("Производитель Убыв, Модель Возр"); Для Каждого Стр Из тСмартфоны Цикл Сообщить(Стр.Производитель + " / " + Стр.Модель); КонецЦикла; //Xiaomi / Xiaomi 13T //Xiaomi / Xiaomi 14T //Samsung / Galaxy S24 //Apple / iPhone 15<p>Мы сортируем таблицу сначала по колонке Производитель - по убыванию, а затем по колонке Модель - по возрастанию. Результат выводим на экран.</p>
76 тСмартфоны.Сортировать("Производитель Убыв, Модель Возр"); Для Каждого Стр Из тСмартфоны Цикл Сообщить(Стр.Производитель + " / " + Стр.Модель); КонецЦикла; //Xiaomi / Xiaomi 13T //Xiaomi / Xiaomi 14T //Samsung / Galaxy S24 //Apple / iPhone 15<p>Мы сортируем таблицу сначала по колонке Производитель - по убыванию, а затем по колонке Модель - по возрастанию. Результат выводим на экран.</p>
77 <p>Чтобы отобрать строки, удовлетворяющие условию, нужно использовать структуру, содержащую название колонки и значение для отбора. В результате программа возвращает массив строк:</p>
77 <p>Чтобы отобрать строки, удовлетворяющие условию, нужно использовать структуру, содержащую название колонки и значение для отбора. В результате программа возвращает массив строк:</p>
78 ПараметрыПоиска = Новый Структура("Производитель", "Xiaomi",); НайденныеСтроки = тСмартфоны.НайтиСтроки(ПараметрыПоиска); Для Каждого Элемент Из НайденныеСтроки Цикл Сообщить(Элемент.Модель); КонецЦикла; //Xiaomi 14T //Xiaomi 13T<p>Здесь:</p>
78 ПараметрыПоиска = Новый Структура("Производитель", "Xiaomi",); НайденныеСтроки = тСмартфоны.НайтиСтроки(ПараметрыПоиска); Для Каждого Элемент Из НайденныеСтроки Цикл Сообщить(Элемент.Модель); КонецЦикла; //Xiaomi 14T //Xiaomi 13T<p>Здесь:</p>
79 <ul><li>Сначала создаём структуру ПараметрыПоиска с ключом "Производитель" и значением "Xiaomi".</li>
79 <ul><li>Сначала создаём структуру ПараметрыПоиска с ключом "Производитель" и значением "Xiaomi".</li>
80 <li>Команда НайтиСтроки (ПараметрыПоиска) отбирает из таблицы значений тСмартфоны строки и выгружает их в массив НайденныеСтроки.</li>
80 <li>Команда НайтиСтроки (ПараметрыПоиска) отбирает из таблицы значений тСмартфоны строки и выгружает их в массив НайденныеСтроки.</li>
81 <li>Выводим значения этих строк на экран, используя оператор цикла Для Каждого.</li>
81 <li>Выводим значения этих строк на экран, используя оператор цикла Для Каждого.</li>
82 </ul><p>Можно сделать отбор по нескольким колонкам:</p>
82 </ul><p>Можно сделать отбор по нескольким колонкам:</p>
83 Отбор = Новый Структура(); Отбор.Вставить("Производитель", "Xiaomi"); Отбор.Вставить("Количество", 1); НайденныеСтроки = тСмартфоны.НайтиСтроки(Отбор); Если НайденныеСтроки.Количество() &gt; 0 Тогда Для Каждого Элемент Из НайденныеСтроки Цикл Сообщить(Элемент.Модель); КонецЦикла; КонецЕсли; //Xiaomi 14T<p>Скопировать таблицу можно полностью или по отбору.</p>
83 Отбор = Новый Структура(); Отбор.Вставить("Производитель", "Xiaomi"); Отбор.Вставить("Количество", 1); НайденныеСтроки = тСмартфоны.НайтиСтроки(Отбор); Если НайденныеСтроки.Количество() &gt; 0 Тогда Для Каждого Элемент Из НайденныеСтроки Цикл Сообщить(Элемент.Модель); КонецЦикла; КонецЕсли; //Xiaomi 14T<p>Скопировать таблицу можно полностью или по отбору.</p>
84 ТЗКопия = тСмартфоны.Скопировать();<p>Здесь создаём новую таблицу, содержащую все строки и колонки исходной.</p>
84 ТЗКопия = тСмартфоны.Скопировать();<p>Здесь создаём новую таблицу, содержащую все строки и колонки исходной.</p>
85 ТЗОтбор = тСмартфоны.Скопировать(Новый Структура("Производитель", "Xiaomi"));<p>Здесь создаём новую таблицу, содержащую все колонки и отобранные строки исходной таблицы.</p>
85 ТЗОтбор = тСмартфоны.Скопировать(Новый Структура("Производитель", "Xiaomi"));<p>Здесь создаём новую таблицу, содержащую все колонки и отобранные строки исходной таблицы.</p>
86 ТЗКолонки = тСмартфоны.СкопироватьКолонки();ТЗКолонки = тСмартфоны.СкопироватьКолонки("Модель, Производитель"); Для Каждого Колонка Из ТЗКолонки.Колонки Цикл Сообщить(Колонка.Имя); КонецЦикла; //Модель //Производитель<p>Чтобы свернуть таблицу значений по определённым группировкам используем метод Свернуть (КолонкиГруппировок, КолонкиСуммирования).</p>
86 ТЗКолонки = тСмартфоны.СкопироватьКолонки();ТЗКолонки = тСмартфоны.СкопироватьКолонки("Модель, Производитель"); Для Каждого Колонка Из ТЗКолонки.Колонки Цикл Сообщить(Колонка.Имя); КонецЦикла; //Модель //Производитель<p>Чтобы свернуть таблицу значений по определённым группировкам используем метод Свернуть (КолонкиГруппировок, КолонкиСуммирования).</p>
87 <p>КолонкиГруппировок - это строка с перечнем имён колонок, по значениям которых нужно объединить строки.</p>
87 <p>КолонкиГруппировок - это строка с перечнем имён колонок, по значениям которых нужно объединить строки.</p>
88 <p>КолонкиСуммирования - строка с именами колонок, в которых будут записаны суммы по сгруппированным строкам.</p>
88 <p>КолонкиСуммирования - строка с именами колонок, в которых будут записаны суммы по сгруппированным строкам.</p>
89 <p>В результате строки с одинаковыми значениями сворачиваются в одну строку, а в колонки суммирования заносятся итоговые суммы по свёрнутым строкам. Колонки, не указанные в методе Свернуть (), удаляются.</p>
89 <p>В результате строки с одинаковыми значениями сворачиваются в одну строку, а в колонки суммирования заносятся итоговые суммы по свёрнутым строкам. Колонки, не указанные в методе Свернуть (), удаляются.</p>
90 тСмартфоны.Свернуть("Производитель", "Количество, Сумма"); Для каждого Строка ИЗ тСмартфоны Цикл Сообщить("" + Строка.Производитель + " " + Строка.Количество + "шт. на сумму " + Строка.Сумма + "₽"); КонецЦикла; //Apple 1 шт. на сумму 99 990₽ //Samsung 1 шт. на сумму 89 990₽ //Xiaomi 3 шт. на сумму 184 870₽<p>Создадим таблицу тСмартфоны1 с теми же колонками, что и тСмартфоны.</p>
90 тСмартфоны.Свернуть("Производитель", "Количество, Сумма"); Для каждого Строка ИЗ тСмартфоны Цикл Сообщить("" + Строка.Производитель + " " + Строка.Количество + "шт. на сумму " + Строка.Сумма + "₽"); КонецЦикла; //Apple 1 шт. на сумму 99 990₽ //Samsung 1 шт. на сумму 89 990₽ //Xiaomi 3 шт. на сумму 184 870₽<p>Создадим таблицу тСмартфоны1 с теми же колонками, что и тСмартфоны.</p>
91 тСмартфоны1 = тСмартфоны.СкопироватьКолонки();<p>Добавим в неё строки:</p>
91 тСмартфоны1 = тСмартфоны.СкопироватьКолонки();<p>Добавим в неё строки:</p>
92 // iPhone 16 Стр = тСмартфоны1.Добавить(); Стр.Модель = "iPhone 16 Plus"; Стр.Производитель = "Apple"; Стр.Цена = 116990; Стр.Количество = 1; // Galaxy А35 Стр = тСмартфоны1.Добавить(); Стр.Модель = "Galaxy A35"; Стр.Производитель = "Samsung"; Стр.Цена = 26190; Стр.Количество = 2;<p>Нам нужно перенести строки из Смартфон1 в Смартфон. Это можно сделать, построчно добавляя новую строку в таблицу Смартфон и записывая в каждую колонку значения из соответствующей колонки Смартфон1:</p>
92 // iPhone 16 Стр = тСмартфоны1.Добавить(); Стр.Модель = "iPhone 16 Plus"; Стр.Производитель = "Apple"; Стр.Цена = 116990; Стр.Количество = 1; // Galaxy А35 Стр = тСмартфоны1.Добавить(); Стр.Модель = "Galaxy A35"; Стр.Производитель = "Samsung"; Стр.Цена = 26190; Стр.Количество = 2;<p>Нам нужно перенести строки из Смартфон1 в Смартфон. Это можно сделать, построчно добавляя новую строку в таблицу Смартфон и записывая в каждую колонку значения из соответствующей колонки Смартфон1:</p>
93 Для каждого Стр Из тСмартфоны1 Цикл НоваяСтрока = тСмартфоны.Добавить(); //Скопируем реквизиты строки НоваяСтрока.Модель = Стр.Модель; НоваяСтрока.Производитель = Стр.Производитель; НоваяСтрока.Цена = Стр.Цена; НоваяСтрока.Количество = Стр.Количество; КонецЦикла;<p>У этого алгоритма есть недостаток: в коде приходится прописывать имена колонок. Поэтому лучше использовать функцию встроенного языка ЗаполнитьЗначенияСвойств ().</p>
93 Для каждого Стр Из тСмартфоны1 Цикл НоваяСтрока = тСмартфоны.Добавить(); //Скопируем реквизиты строки НоваяСтрока.Модель = Стр.Модель; НоваяСтрока.Производитель = Стр.Производитель; НоваяСтрока.Цена = Стр.Цена; НоваяСтрока.Количество = Стр.Количество; КонецЦикла;<p>У этого алгоритма есть недостаток: в коде приходится прописывать имена колонок. Поэтому лучше использовать функцию встроенного языка ЗаполнитьЗначенияСвойств ().</p>
94 Для каждого Стр Из тСмартфоны1 Цикл НоваяСтрока = тСмартфоны.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр); КонецЦикла;<p>Код стал намного короче и универсальнее.</p>
94 Для каждого Стр Из тСмартфоны1 Цикл НоваяСтрока = тСмартфоны.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр); КонецЦикла;<p>Код стал намного короче и универсальнее.</p>
95 <p>Такая задача может возникнуть, например, когда нам нужно передать данные из таблицы значений с сервера на клиент. Напрямую мы этого сделать не сможем, так как таблица значений доступна только на сервере. Поэтому нам нужно передать значения из ТЗ в массив - объект, доступный и на клиенте, и на сервере.</p>
95 <p>Такая задача может возникнуть, например, когда нам нужно передать данные из таблицы значений с сервера на клиент. Напрямую мы этого сделать не сможем, так как таблица значений доступна только на сервере. Поэтому нам нужно передать значения из ТЗ в массив - объект, доступный и на клиенте, и на сервере.</p>
96 <p>Это можно сделать с помощью функции:</p>
96 <p>Это можно сделать с помощью функции:</p>
97 Функция ТаблицаЗначенийВМассив(Таблица) Массив = Новый Массив(); СтруктураСтрокой = ""; НужнаЗапятая = Ложь; Для Каждого Колонка Из Таблица.Колонки Цикл Если НужнаЗапятая Тогда СтруктураСтрокой = СтруктураСтрокой + ","; КонецЕсли; СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя; НужнаЗапятая = Истина; КонецЦикла; Для Каждого Строка Из Таблица Цикл НоваяСтрока = Новый Структура(СтруктураСтрокой); ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); Массив.Добавить(НоваяСтрока); КонецЦикла; Возврат Массив; КонецФункции<p>Чтобы выгрузить данные из массива в таблицу значений, можно использовать функцию:</p>
97 Функция ТаблицаЗначенийВМассив(Таблица) Массив = Новый Массив(); СтруктураСтрокой = ""; НужнаЗапятая = Ложь; Для Каждого Колонка Из Таблица.Колонки Цикл Если НужнаЗапятая Тогда СтруктураСтрокой = СтруктураСтрокой + ","; КонецЕсли; СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя; НужнаЗапятая = Истина; КонецЦикла; Для Каждого Строка Из Таблица Цикл НоваяСтрока = Новый Структура(СтруктураСтрокой); ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); Массив.Добавить(НоваяСтрока); КонецЦикла; Возврат Массив; КонецФункции<p>Чтобы выгрузить данные из массива в таблицу значений, можно использовать функцию:</p>
98 Функция МассивВТаблицуЗначений(Массив) Таблица = Новый ТаблицаЗначений; Для Каждого ЭлементМассива Из Массив Цикл // Создаём колонки для таблицы Если Таблица.Колонки.Количество() = 0 Тогда Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл Таблица.Колонки.Добавить(ЗначениеСтруктуры.Ключ); КонецЦикла; КонецЕсли; // Добавляем данные в таблицу НоваяСтрока = Таблица.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлементМассива); КонецЦикла; Возврат Таблица; КонецФункции<p>Создадим в конфигураторе обработку, добавим на форму новый реквизит тРеквизит с типом ТаблицаЗначений и соответствующий ему элемент формы тРеквизитФорма.</p>
98 Функция МассивВТаблицуЗначений(Массив) Таблица = Новый ТаблицаЗначений; Для Каждого ЭлементМассива Из Массив Цикл // Создаём колонки для таблицы Если Таблица.Колонки.Количество() = 0 Тогда Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл Таблица.Колонки.Добавить(ЗначениеСтруктуры.Ключ); КонецЦикла; КонецЕсли; // Добавляем данные в таблицу НоваяСтрока = Таблица.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлементМассива); КонецЦикла; Возврат Таблица; КонецФункции<p>Создадим в конфигураторе обработку, добавим на форму новый реквизит тРеквизит с типом ТаблицаЗначений и соответствующий ему элемент формы тРеквизитФорма.</p>
99 <em>Скриншот: "1С:Предприятие 8.3". Конфигуратор / Skillbox Media</em><p>Добавим команду ВывестиТаблицу и сгенерируем обработчик команды на клиенте и сервере. Привяжем команду к кнопке Вывести таблицу.</p>
99 <em>Скриншот: "1С:Предприятие 8.3". Конфигуратор / Skillbox Media</em><p>Добавим команду ВывестиТаблицу и сгенерируем обработчик команды на клиенте и сервере. Привяжем команду к кнопке Вывести таблицу.</p>
100 <p>В процедуре ВывестиТаблицуНаСервере () создадим таблицу значений тСмартфоны и вызовем процедуру ВывестиТаблицуЗначенийНаФорму ():</p>
100 <p>В процедуре ВывестиТаблицуНаСервере () создадим таблицу значений тСмартфоны и вызовем процедуру ВывестиТаблицуЗначенийНаФорму ():</p>
101 &amp;НаСервере Процедура ВывестиТаблицуНаСервере() тСмартфоны = Новый ТаблицаЗначений; //Добавим колонки тСмартфоны.Колонки.Добавить("Модель", ,"Название модели"); тСмартфоны.Колонки.Добавить("Производитель"); ТипЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 2)); тСмартфоны.Колонки.Добавить("Цена", ТипЧисло); тСмартфоны.Колонки.Добавить("Количество", ТипЧисло); // Добавим строки: // iPhone 15 Стр = тСмартфоны.Добавить(); Стр.Модель = "iPhone 15"; Стр.Производитель = "Apple"; Стр.Цена = 99990; Стр.Количество = 1; // Выведем ТЗ на управляемую форму ВывестиТаблицуЗначенийНаФорму(тСмартфоны, "тРеквизит", "тРеквизитФорма"); КонецПроцедуры<p>Сама процедура вывода таблицы значений на форму выглядит так:</p>
101 &amp;НаСервере Процедура ВывестиТаблицуНаСервере() тСмартфоны = Новый ТаблицаЗначений; //Добавим колонки тСмартфоны.Колонки.Добавить("Модель", ,"Название модели"); тСмартфоны.Колонки.Добавить("Производитель"); ТипЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 2)); тСмартфоны.Колонки.Добавить("Цена", ТипЧисло); тСмартфоны.Колонки.Добавить("Количество", ТипЧисло); // Добавим строки: // iPhone 15 Стр = тСмартфоны.Добавить(); Стр.Модель = "iPhone 15"; Стр.Производитель = "Apple"; Стр.Цена = 99990; Стр.Количество = 1; // Выведем ТЗ на управляемую форму ВывестиТаблицуЗначенийНаФорму(тСмартфоны, "тРеквизит", "тРеквизитФорма"); КонецПроцедуры<p>Сама процедура вывода таблицы значений на форму выглядит так:</p>
102 &amp;НаСервере Процедура ВывестиТаблицуЗначенияНаФорму(ТЗ, ТРеквизит, ТРеквизитФорма) // 1. Добавляем колонки из ТЗ в реквизит тРеквизит МассивРеквизитов = Новый Массив; Для Каждого Колонка Из ТЗ.Колонки Цикл МассивРеквизитов.Добавить( Новый РеквизитФормы( Колонка.Имя, Колонка.ТипЗначения, ТРеквизит ) ); КонецЦикла; ИзменитьРеквизиты(МассивРеквизитов); // 2. Добавляем колонки из ТЗ в элемент ТРеквизитФорма Для Каждого Колонка Из ТЗ.Колонки Цикл НовыйЭлемент = Элементы.Добавить( ТРеквизит + "_" + Колонка.Имя, Тип("ПолеФормы"), Элементы[ТРеквизитФорма] ); НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.ПутьКДанным = ТРеквизит + "." + Колонка.Имя; КонецЦикла; // 3. Наконец, передаём данные из ТабВКоде в ТабРеквизит ЗначениеВРеквизитФормы(ТЗ, ТРеквизит); // Готово! КонецПроцедуры<p>Запустим обработку на выполнение.</p>
102 &amp;НаСервере Процедура ВывестиТаблицуЗначенияНаФорму(ТЗ, ТРеквизит, ТРеквизитФорма) // 1. Добавляем колонки из ТЗ в реквизит тРеквизит МассивРеквизитов = Новый Массив; Для Каждого Колонка Из ТЗ.Колонки Цикл МассивРеквизитов.Добавить( Новый РеквизитФормы( Колонка.Имя, Колонка.ТипЗначения, ТРеквизит ) ); КонецЦикла; ИзменитьРеквизиты(МассивРеквизитов); // 2. Добавляем колонки из ТЗ в элемент ТРеквизитФорма Для Каждого Колонка Из ТЗ.Колонки Цикл НовыйЭлемент = Элементы.Добавить( ТРеквизит + "_" + Колонка.Имя, Тип("ПолеФормы"), Элементы[ТРеквизитФорма] ); НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.ПутьКДанным = ТРеквизит + "." + Колонка.Имя; КонецЦикла; // 3. Наконец, передаём данные из ТабВКоде в ТабРеквизит ЗначениеВРеквизитФормы(ТЗ, ТРеквизит); // Готово! КонецПроцедуры<p>Запустим обработку на выполнение.</p>
103 <em>Скриншот: "1С:Предприятие 8.3" / Skillbox Media</em><p>В результате данные из таблицы значений вывелись на форму.</p>
103 <em>Скриншот: "1С:Предприятие 8.3" / Skillbox Media</em><p>В результате данные из таблицы значений вывелись на форму.</p>
104 <p>Таблица значений позволяет обрабатывать данные любого типа, сортировать и группировать их, выводить их на форму. Она может использоваться при формировании отчётов, обработке результатов запросов, создании новых элементов справочников и документов.</p>
104 <p>Таблица значений позволяет обрабатывать данные любого типа, сортировать и группировать их, выводить их на форму. Она может использоваться при формировании отчётов, обработке результатов запросов, создании новых элементов справочников и документов.</p>
105 <a>Научитесь: Профессия 1С-программист Узнать больше</a>
105 <a>Научитесь: Профессия 1С-программист Узнать больше</a>