1с обход таблицы значений.

таблица значений 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;}

Вот есть для начала небольшой фак - простые примеры работы с таблицей значений:

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

ТаблицаЗначений = Новый ТаблицаЗначений;


2. Создать колонки таблицы значений:

ТаблицаЗначений.Колонки.Добавить("Имя");
ТаблицаЗначений.Колонки.Добавить("Фамилия");


3. Добавить новые строки используя имена колонок:


НоваяСтрока.Имя = "Василий";
НоваяСтрока.Фамилия = "Пупкин";


4. Как искать значение в таблице значений:
Необходимо найти строку таблицы содержащую искомое значение.

НайденнаяСтрока = ТаблицаЗначений.Найти(ИскомоеЗначение);


5. Найти первое вхождение в определенных колонках таблицы значений

НайденнаяСтрока = ТаблицаЗначений.Найти(ИскомоеЗначение, "Поставщик, Покупатель");


6. Если надо найти все вхождения в таблице значений:
Используем структуру поиска.

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


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

7. Как перебрать таблицу значений в произвольном порядке

Для Каждого ТекущаяСтрока Из ТаблицаЗначений Цикл
Сообщить(ТекущаяСтрока.Имя);
КонецЦикла;

Тоже самое используя индексы:

СтаршийИндекс = ТаблицаЗначений.Количество() - 1;
Для Сч = 0 по СтаршийИндекс Цикл
Сообщить(ТаблицаЗначений[Сч].Имя);
КонецЦикла;


8. Удаление имеющейся строки таблицы значений

ТаблицаЗначений.Удалить(УдаляемаяСтрока);

по индексу

ТаблицаЗначений.Удалить(0);


9. Удаление имеющейся колонки таблицы значений

ТаблицаЗначений.Колонки.Удалить(УдаляемаяКолонка);


по индексу

ТаблицаЗначений.Колонки.Удалить(0);

Необходимо учитывать, что удаление строки (или колонки) «из середины» таблицы значений приведет к уменьшению на единицу индексов строк, стоявших «после» удаленной

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

НоваяСтрока = ТаблицаЗначений.Добавить();
НоваяСтрока[ИмяКолонки] = Значение;


11. Как заполнить всю колонку таблицы значений нужным значением?
Колонку ФлагФискальногоУчета в таблице значений ТаблицаЗначений необходимо заполнить значением Ложь

ТаблицаЗначений.ЗаполнитьЗначения(Ложь, "ФлагФискальногоУчета");


Применяем для таблицы значений метод ЗаполнитьЗначения(). Первым параметром передаем заполняемое значение. Вторым параметром – имя заполняемой колонки.

12. Как таблицу значений «ТаблицаПолучатель» заполнить данными таблицы значений «ИсходнаяТаблица»?

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

ТаблицаПолучатель = ТаблицаИсходная.Скопировать();


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

Частичный перенос данных для колонок с совпадающими именами:

Для Каждого СтрокаИсходнойТаблицы Из ИсходнаяТаблица Цикл
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсходнойТаблицы);
КонецЦикла


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

Если у таблиц не будет колонок с одинаковыми именами, таблица-получатель будет в результате содержать столько же строк с пустыми значениями, сколько строк было в таблице-источнике.
Если у каких-то одноименных колонок тип значения данных из таблицы-источника не попадет в массив разрешенных типов колонки таблицы-получателя, в таких полях получим пустые значения.
Рассмотрим третий случай. В случае одноименных колонок колонку таблицы-получателя нужно привести в полное соответствие колонке таблицы-источника.

Полное копирование данных для колонок с совпадающими именами

ОдноименныеКолонки = Новый Массив();

Для Каждого Колонка Из ИсходнаяТаблица.Колонки Цикл
СовпадающаяКолонка = ТаблицаПолучатель.Колонки.Найти(Колонка.Имя);

Если СовпадающаяКолонка <> Неопределено Тогда

// Получить свойства колонки.
Имя = Колонка.Имя;
ТипЗначения = Колонка.ТипЗначения;
Заголовок = Колонка.Заголовок;
Ширина = Колонка.Ширина;

// Заменить колонки в таблице-получателе.
Индекс = ТаблицаПолучатель.Колонки.Индекс(СовпадающаяКолонка);

ТаблицаПолучатель.Колонки.Удалить(Индекс);
ТаблицаПолучатель.Колонки.Вставить(Индекс, Имя, ТипЗначения, Заголовок, Ширина);

// Добавить очередное имя совпадающих колонок в массив.
ОдноименныеКолонки.Добавить(Колонка.Имя);

КонецЕсли;

КонецЦикла;

// Цикл перебора строк исходной таблицы.
Для каждого СтрокаИсходнойТаблицы Из ИсходнаяТаблица Цикл

// Добавить новую строку в таблицу-получатель.
НоваяСтрока = ТаблицаПолучатель.Добавить();

// Заполнить значения в совпадающих ячейках.
Для каждого ИмяКолонки Из ОдноименныеКолонки Цикл
НоваяСтрока[ИмяКолонки] = СтрокаИсходнойТаблицы[ИмяКолонки];

КонецЦикла;

КонецЦикла;


Нам придется заменить колонку в таблице-получателе на новую, чьи свойства полностью будут соответствовать колонке таблицы-источника.
Поэтому в случае обнаружения в таблице-получателе одноименной колонки собираем в переменных все свойства для новой колонки. Далее удаляем старую и создаем новую колонку. Затем выполняем цикл перебора строк исходной таблицы.
В цикле добавляем к таблице-получателю новую строку и открываем цикл перебора имен колонок в массиве совпадающих колонок.
Внутри этого вложенного цикла производим заполнение ячеек таблицы-получателя данными ячейки таблицы-источника.

13. Как добавить колонки к таблице значений «ТаблицаЗначений» с ограничениями по типу?

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

Добавление колонки без указания типа данных

// Добавить колонку без ограничений по типу.
ТаблицаЗначений.Колонки.Добавить("Объект");


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

Добавление колонки с указанием типа данных

// Ограничения по типам данных колонки:
// Только элементы справочника "Контрагенты".
ТаблицаЗначений.Колонки.Добавить("Контрагент",Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));


Если среди типов, разрешенных к заполнению данных колонки, есть строка, можно ограничить ее разрядность (длину), указать использование переменной или фиксированной длины. Все это обеспечивается созданием объекта при помощи конструктора КвалификаторыСтроки. Далее этот объект будет использован в качестве одного из параметров конструктора ОписаниеТипов.

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

// Подготовка и установка ограничений для данных типа Строка.
КвалификаторыСтроки = Новый КвалификаторыСтроки(20, ДопустимаяДлина.Переменная);
ДопустимыеТипы = Новый ОписаниеТипов("Строка", КвалификаторыСтроки);
ТаблицаЗначений.Колонки.Добавить("ПримечаниеСтроковоеКороткое", ДопустимыеТипы);


Аналогичные действия можно осуществлять в отношении квалификаторов числа и даты.
Обратите внимание: описание типов можно строить конструктором как «с нуля», так и использовать в качестве основы уже существующее описание типов

Использование существующих описаний типов для указания типа данных колонки таблицы значений

// Расширение уже использованного ранее описания типов.
КвалификаторыЧисла = Новый КвалификаторыЧисла(10, 2, ДопустимыйЗнак.Неотрицательный);
КвалификаторыДаты = Новый КвалификаторыДаты(ЧастиДаты.Дата);
РасширенныеДопустимыеТипы = Новый ОписаниеТипов(ДопустимыеТипы, "Число, Дата", КвалификаторыЧисла, КвалификаторыДаты);

ТаблицаЗначений.Колонки.Добавить("Примечание", РасширенныеДопустимыеТипы);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Таблица значений в платформе 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

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