1с таблица значений заполнить значения

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

Статьи о других универсальных коллекциях значений в 1С

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника;

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu


Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:

можно оплатить вручную:

Яндекс.Деньги — 410012882996301
Web Money — R955262494655

Вступайте в мои группы.

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

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

Поэтому в 1С видное место занимает работа с таблицами.

Таблицы в 1С также называют «табличные части». Они есть у справочников, документов и других .

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

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

//Вариант 1 – последовательный доступ к результатам запроса

//получение таблицы
Выборка = Запрос.Выполнить().Выбрать();
//по порядку обходим все строки результата запроса
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование);
КонецЦикла;

//Вариант 2 – выгрузка в таблицу значений
Запрос = Новый Запрос(«ВЫБРАТЬ Наименование ИЗ Справочник.Номенклатура»);
//получение таблицы
Таблица = Запрос.Выполнить().Выгрузить().
//далее можем также обойти все строки
Для каждого Строка из Таблица Цикл
Сообщить(Строка.Наименование);
КонецЦикла;
//или произвольно обращаться к строкам
Строка = Таблица.Найти(«Лопата», «Наименование»);

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

Таблица на форме (толстый клиент)

Пользователь работает с таблицей, когда она размещена на форме.

Базовые принципы работы с формами мы с Вами обсуждали в уроке по и в уроке по

Итак, разместим таблицу на форме. Для этого можно перетащить таблицу с панели элементов управления. Аналогично можно выбрать в меню Форма/Вставить элемент управления.

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

Нажмите кнопку «…» в свойстве Данные. Для того, чтобы увидеть список табличных частей, нужно раскрыть ветку Объект.

При выборе табличной части 1С сама добавит колонки у таблицы на форме. Строки введенные пользователем в такую таблицу будут сохраняться автоматически вместе со справочником/документом.

В этом же свойстве Данные Вы можете ввести произвольное имя и выбрать тип ТаблицаЗначений.

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

Нажав правой кнопкой на таблице Вы можете добавить колонку. В свойствах колонки можно указать его имя (для обращения в коде 1С), заголовок колонки на форме, связь с реквизитом табличной части (последнее – если выбрана не произвольная таблица, а табличная часть).

В свойствах таблицы на форме Вы можете указать – доступно ли пользователю добавлять/удалять строки. Более продвинутая форма – галочка ТолькоПросмотр. Эти свойства удобно использовать для организации таблиц предназначенных для вывода информации, но не редактирования.

Чтобы управлять таблицей, нужно вывести на форму командную панель. Выберите пункт меню Форма/Вставить элемент управления/Командная панель.

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

Таблица на форме (тонкий/управляемый клиент)

На управляемой форме указанные действия выглядят немного по другому. Если Вам нужно разместить на форме табличную часть – раскройте ветку Объект и перетащите одну из табличных частей влево. И все!

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

Чтобы добавить колонки, используйте меню по правой кнопке мыши на этом реквизите формы, пункт Добавить колонку реквизита.

После чего также перетащите таблицу влево.

Чтобы у таблицы появилась командная панель, в свойствах таблицы выберите значения в секции Использование – Положение командной панели.

Выгрузка таблицы в Excel

Любую таблицу 1С, расположенную на форме, можно распечатать или выгрузить в Excel.

Для этого щелкните правой кнопкой мыши на свободном месте в таблице и выберите пункт Вывести список.

В управляемом (тонком) клиент аналогичные действия можно выполнить с помощью пункта меню Все действия/Вывести список.

таблица значений 1С

Таблица значений 1С используется для оперативного хранения данных и их обработки. При большом числе строк скорость поиска данных резко снижается. Многие программисты недооценивают важность применения индексов, при поиске информации в таблице значений. Я намерен показать вам, что применение индексов ускоряет работу с ТЗ (таблица значений 1С ) до 100 раз .

Итак, для тестирования я создал небольшой код, который работает примерно так.

  • Извлекается 20 тысяч строк из табличной части документа "Реализация" в таблицу значений. Называется она Т1.
  • Сделал копию этой же таблицы значений, вторую таблицу, назвал ее Т2. Итак, получилось 2 таблицы значений, Т1 и Т2, в каждой по 20 тысяч строк.
  • Далее в цикле от 1 до 5 мы делаем пять проходов. Проход заключается в следующем:
  • В цикле (который вложен в цикл от 1 до 5) перебираются все строки таблицы значений Т1, все 20 тысяч строк.
  • Для каждой текущей строки Т1 извлекаем из таблицы значений Т1 значение в колонке "Сумма" - это число.
  • Ищем строку в таблице значений Т2, содержащую в колонке "Сумма" тоже самое число, которое которое извлекли на предыдущем шаге.
  • Измеряем время каждого прохода в миллисекундах и выводим на экран.

Другими словами, перебирая все строки одной таблицы значений 1С и запоминая значение столбца "Сумма" , мы ищем в другой таблице значений строку с той же самой суммой. Используется метод таблицы значений "Найти". В одном проходе операция поиска выполняется 20 тысяч раз. Проходов всего пять. Они необходимы для усреднения результатов эксперимента.

Ниже вы видите таблицу результатов работы теста. Второй столбец отражает время выполнения каждого из пяти проходов в обычном, не оптимизированном варианте запуска, а под столбцом стоит суммарное время выполнения теста, равное 279641 миллисекунды, или примерно 279 секунд . В третьем столбце показано время выполнения того же теста, но с оптимизированным вариантом поиска, с использованием индекса в таблице значений . Для наглядности я добавил в табличку время, затрачиваемое на создание индекса (первая строчка под заголовком), оно очень мало, всего 0, 047 секунды. Суммарное время выполнения теста во втором варианте равно 2781 миллисекунды, или 2,78 секунды .

Итак, в первом варианте имеем - 279 секунд, во втором варианте - 2,78 секунд. Разница в 100 раз! Причем, такое ускорение достигается добавлением всего ОДНОЙ СТРОЧКИ КОДА!

Время выполнения, миллисекунды
№ тестового запуска 1 вариант, обычный 2 вариант, оптимальный
время на создание индекса - 47
1 46531 563
2 55516 547
3 60969 531
4 58688 562
5 57937 531
Итоговое время 279641 2781
Ускорение в раз: 100,5541172

Вот полный код примера:

Процедура кнИндексТаблицыЗначенийНажатие(Элемент) // создаем запрос для выборки данных Запрос = Новый Запрос; Запрос. Текст = "ВЫБРАТЬ ПЕРВЫЕ 20000 | РеализацияТовары.Ссылка, | РеализацияТовары.НомерСтроки, | РеализацияТовары.Количество, | РеализацияТовары.Сумма, | РеализацияТовары.Товар |ИЗ | Документ.Реализация.Товары КАК РеализацияТовары" ; // помещаем выбранные данные в таблицу значений Т1 Т1 = Запрос. Выполнить () . Выгрузить() ; // создаем таблицу значений Т2 путем копирования содержимого таблицы значений Т1 Т2 = Т1. Скопировать() ; НачДобавленияИндекса = ПолучитьВремяВМиллисекундах() ; Т2. Индексы. Добавить("Сумма" ) ; // ВОТ ЭТО САМАЯ ВАЖНАЯ СТРОЧКА, ДОБАВЛЕНИЕ ИНДЕКСА ПО КОЛОНКЕ "СУММА" КонДобавленияИндекса = ПолучитьВремяВМиллисекундах() ; Сообщить ("Время добавления индекса " + (КонДобавленияИндекса - НачДобавленияИндекса) + " мс" ) ; Сообщить ("Всего строк в нашей таблице значений: " + Т2. Количество() ) ; // организуем цикл из пяти проходов, по-сути - пять раз прогоняем тест Для Сч = 1 По 5 Цикл Начало = ПолучитьВремяВМиллисекундах() ; // запоминаем время начала НайденоРаз = 0 ; Для Каждого Стр Из Т1 Цикл // перебираем все строки таблицы Т1 ОбработкаПрерыванияПользователя () ; // ищем в таблице Т2 строку, в которой колонка "Сумма" // совпадает с текущим значением "Сумма" таблицы Т1 НайденнаяСтрока = Т2. Найти (Стр. Сумма, "Сумма" ) ; // Если совпадение зафиксировано (строка найдена), увеличиваем счетчик найденных строк Если НайденнаяСтрока <> Неопределено Тогда НайденоРаз = НайденоРаз + 1 ; КонецЕсли ; КонецЦикла ; // получаем время завершения цикла перебора строк таблицы Т1 Конец = ПолучитьВремяВМиллисекундах() ; // сообщаем номер прохода теста, количество найденных совпадений и время выполнения в миллисекундах Сообщить ("Проход № " + Сч) ; Сообщить ("Найдено раз:" + НайденоРаз) ; Сообщить ("Время выполнения " + Строка (Конец- Начало) + " миллисекунд" ) ; КонецЦикла ; // уходим делать следующий проход КонецПроцедуры


Пример откомментирован, и должен быть понятен. Главное заключается в строчке Т2.Индексы.Добавить("Сумма"); Мы сообщаем 1С, что мы собираемся выполнять операцию поиска по колонке "Сумма", в таблице значений Т1 и требуем создать индекс по этой колонке. Система создает индекс, и далее при всех операциях поиска по колонке "Сумма" использует его автоматически. Следует отметить, что созданный индекс действует только для поиска по колонке "Сумма", так как создан для этой колонки. Если нам нужны другие колонки для поиска, следует создать соответствующие индексы, с указанием нужных имен колонок.

К одной таблице мы можем создать несколько индексов, если мы собираемся искать значения для разных столбцов. Индексы хранятся в коллекции индексов таблицы значений 1С , что следует из кода: ТЗ.Индексы.Добавить(ИмяКолонки)

Если нам нужен поиск по комбинации значений колонок, например, одновременно по колонкам "Количество" и "Сумма" - следует создать составной индекс: Т2.Индексы.Добавить("Количество, Сумма") Такой индекс будет задействован, когда мы ищем значение в таблице при помощи метода "НайтиСтроки()" Например:

МассивНайденныхСтрок = Т2.НайтиСтроки(Новый Структура("Количество, Сумма", ИскомоеКоличество, ИскомаяСумма));

Используемые в тексте примера.
С уважением, Дегтярев Роман.

Как научиться программировать в 1С с нуля?

Как работать программистом 1С и получать до 150 000 рублей в месяц?

ЗАПИШИСЬ НА БЕСПЛАТНЫЙ

2-НЕДЕЛЬНЫЙ КУРС

"ПРОГРАММИРОВАНИЕ в 1С ДЛЯ НОВИЧКОВ"

Курс придет на электронную почту. Стань программистом, выполняя пошаговые задания.

Для участия нужен только компьютер и интернет

Бесплатный доступ на курс:

Sp-force-hide { display: none;}.sp-form { display: block; background: #eff2f4; padding: 5px; width: 270px; max-width: 100%; border-radius: 0px; -moz-border-radius: 0px; -webkit-border-radius: 0px; font-family: Arial, "Helvetica Neue", sans-serif; background-repeat: no-repeat; background-position: center; background-size: auto;}.sp-form input { display: inline-block; opacity: 1; visibility: visible;}.sp-form .sp-form-fields-wrapper { margin: 0 auto; width: 260px;}.sp-form .sp-form-control { background: #ffffff; border-color: #cccccc; border-style: solid; border-width: 1px; font-size: 15px; padding-left: 8.75px; padding-right: 8.75px; border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; height: 35px; width: 100%;}.sp-form .sp-field label { color: #444444; font-size: 13px; font-style: normal; font-weight: bold;}.sp-form .sp-button { border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; background-color: #f4394c; color: #ffffff; width: 100%; font-weight: 700; font-style: normal; font-family: Arial, "Helvetica Neue", sans-serif; box-shadow: none; -moz-box-shadow: none; -webkit-box-shadow: none; background: linear-gradient(to top, #e30d22 , #f77380);}.sp-form .sp-button-container { text-align: center; width: auto;}

(Эта статья относится к циклу статей 1С с нуля; программирование 1с с нуля; таблица значений 1с)

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

Давайте расширим эти знания, для более удобной работы с таблицей значений. Начнем с некоторых полезных свойств таблицы значений.

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

Метод ТаблицаЗначений.Количество() - возвращает количество строк в таблице значений.

Напоминаю, что если метод ТаблицаЗначений.Количество() показал, что в таблице 5 строк, то индексы(номера) этих строк такие: 0, 1, 2, 3, 4.

Предположим, что мы имеем таблицу значений 1С с колонкой "ФамилияКлиента"

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

Для НомерСтроки = 0 По НашаТаблица.Количество() - 1 Цикл // здесь перебираются строки ТекущаяФамилия = НашаТаблица[НомерСтроки].ФамилияКлиента; // "ФамилияКлиента" - это имя колонки, содержащее фамилию клиента Сообщить(ТекущаяФамилия); КонецЦикла;

Обратите внимание, что счетчик цикла мы наращиваем до значения, равного числу строк таблицы минус один: НашаТаблица.Количество() - 1

Давайте выясним, что означает код: НашаТаблица[НомерСтроки] . Это и есть обращение к конкретной строке таблицы значений по ее индексу (номеру).

В следующем примере я покажу, как НашаТаблица[НомерСтроки] возвращает нам объект, который имеет тип "СтрокаТаблицыЗначений" .
В дополнительную переменную я помещаю результат обращение к строке по номеру: СтрокаТаблицы = НашаТаблица[НомерСтроки]

Далее, получив объект - одну строку таблицы значений в виде переменной СтрокаТаблицы , мы можем работать отдельно с этим объектом-строкой. Пример ниже делает тоже самое, что и пример выше, только в нижнем примере использована "лишняя" переменная СтрокаТаблицы

Для НомерСтроки = 0 По НашаТаблица.Количество() - 1 Цикл // здесь перебираются строки СтрокаТаблицы = НашаТаблица[НомерСтроки].ФамилияКлиента; // получаем текущую строку таблицы значений по ее индексу (номеру) ТекущаяФамилия = СтрокаТаблицы.ФамилияКлиента; // "ФамилияКлиента" - это имя колонки, содержащее фамилию клиента Сообщить(ТекущаяФамилия); КонецЦикла;

Если внутри цикла мы напишем такой код: Сообщить(СтрокаТаблицы) - этот код НЕ выведет на экран данные из текущей строки таблицы значений (например фамилию клиента и прочее).

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

Например, код СтрокаТаблицы.ФамилияКлиента как раз означает доступ к данным, хранящимся в колонке "ФамилияКлиента" у текущей строки-объекта. Чем мы и воспользовались в примере, чтобы вывести фамилии всех клиентов, хранящиеся в таблице значений. Перебирая все строки и выводя на экран по очереди эти самые фамилии.

2. Перебор строк таблицы значений при помощи цикла перебора коллекции "Для Каждого..."

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

А любую коллекцию в 1С можно перебрать при помощи цикла:

Для Каждого Из Цикл....... действие внутри цикла КонецЦикла

Выведем все фамилии клиентов из всех строк таблицы, при помощи перебора коллекции строк таблицы значений:

Для Каждого СтрокаТаблицы Из НашаТаблица Цикл Сообщить(СтрокаТаблицы.ФамилияКлиента); КонецЦикла

При переборе коллекции нам не понадобился счетчик номеров строк (индексов). Специальная форма цикла помогла обойтись без счетчика. В произвольную переменную СтрокаТаблицы при каждом проходе цикла автоматически присваивается объект-строка таблицы значений.

Таким образом в СтрокаТаблицы по мере выполнения цикла, подряд попадают все строки нашей таблицы значений. А мы только и делаем, что у каждой переданной нам строки выводим на экран содержимое колонки "ФамилияКлиента" с помощью конструкции Сообщить(СтрокаТаблицы.ФамилияКлиента);

3.А сейчас: повторение материала.

Итак, таблица значений 1С является коллекцией строк . Кто-то коллекционировал строки, складывал их в кучу, и получилась целая такая коллекция строк - которую назвали - таблицей значений.

Только это коллекция не просто обычных текстовых строк. Это коллекция объектов типа СтрокаТаблицыЗначений . И этот отдельный объект-строка хранит в себе данные для каждой колонки в текущей строке. Он хранит фамилию клиента, рост клиента или что-то там еще, что было нужно.

Получить доступ к строке таблицы значений можно по ее индексу, который начинается с нуля. При помощи кода МояЧетвертаяСтрока = МояТаблица - мы получаем четвертую строку таблицы значений, так как нумерация строк начинается с нуля: 0, 1, 2, 3.

Число строк мы определяем методом МояТаблица.Количество() . Скобки в конце не забываем, так как мы вызываем метод без параметров.

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

Последнее: При переборе коллекции, как получить номер строки таблицы значений?
Получить номер текущей строки можно вызовом метода Индекс() для таблицы значений, в который мы передаем объект-строку.

Пример ниже выведет на экран номера всех строк в таблице значений 1С:

Для Каждого СтрокаТаблицы Из НашаТаблица Цикл Сообщить(НашаТаблица.Индекс(СтрокаТаблицы)); КонецЦикла

Продолжение материалов будет в следующих статьях.....

Дегтярев Роман.

Как научиться программировать в 1С с нуля?

Как работать программистом 1С и получать до 150 000 рублей в месяц?

ЗАПИШИСЬ НА БЕСПЛАТНЫЙ

2-НЕДЕЛЬНЫЙ КУРС

"ПРОГРАММИРОВАНИЕ в 1С ДЛЯ НОВИЧКОВ"

Курс придет на электронную почту. Стань программистом, выполняя пошаговые задания.

Для участия нужен только компьютер и интернет

Бесплатный доступ на курс:

Sp-force-hide { display: none;}.sp-form { display: block; background: #eff2f4; padding: 5px; width: 270px; max-width: 100%; border-radius: 0px; -moz-border-radius: 0px; -webkit-border-radius: 0px; font-family: Arial, "Helvetica Neue", sans-serif; background-repeat: no-repeat; background-position: center; background-size: auto;}.sp-form input { display: inline-block; opacity: 1; visibility: visible;}.sp-form .sp-form-fields-wrapper { margin: 0 auto; width: 260px;}.sp-form .sp-form-control { background: #ffffff; border-color: #cccccc; border-style: solid; border-width: 1px; font-size: 15px; padding-left: 8.75px; padding-right: 8.75px; border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; height: 35px; width: 100%;}.sp-form .sp-field label { color: #444444; font-size: 13px; font-style: normal; font-weight: bold;}.sp-form .sp-button { border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; background-color: #f4394c; color: #ffffff; width: 100%; font-weight: 700; font-style: normal; font-family: Arial, "Helvetica Neue", sans-serif; box-shadow: none; -moz-box-shadow: none; -webkit-box-shadow: none; background: linear-gradient(to top, #e30d22 , #f77380);}.sp-form .sp-button-container { text-align: center; width: auto;}