- Помогите найти колонку табличного поля по ее имени.
- Таблица значений
- Как можно создать новую таблицу значений?
- Как добавить новую колонку с определенным типом и заголовком?
- Как добавить новые строки?
- Как выгрузить результат запроса в таблицу значений?
- Как обойти в цикле все строки таблицы значений?
- Как сделать выборку строк в таблице значений с отбором?
- Как выполнить сортировку?
- Как вычислить итоги по колонке?
- Как сделать копию таблицы значений?
- Как свернуть таблицу значений по колонке и суммировать по количеству?
- Как найти строку в таблице значений по значению?
- Как найти строки таблицы значений в 1С 8
- Метод Найти
- Метод НайтиСтроки
- Другие способы найти строки таблицы значений
- Поиск в коллекциях значений
- Бесплатные программы русские. Программирование 1С
- Скачать программы, софт бесплатно. Программирование 1С
- Таблица значений 1С – 3 часть. Метаданные. Перебор колонок таблицы значений 1С
- Таблица значений 1С – 3 часть. Метаданные. Перебор колонок таблицы значений
- Итак, создадим тестовую таблицу значений 1С и заполним ее:
- Первый образец кода — перебор колонок таблицы значений 1С как коллекции.
- Количество колонок в таблице значений 1С
- Получение объекта- колонки по ее номеру (индексу) и перебор колонок при помощи индекса колонок
- Важно никогда не путать свойство объекта и метод объекта.
- Получение данных из таблицы значений 1С при помощи номеров колонок
Помогите найти колонку табличного поля по ее имени.
Заполнил колонки ТП реквизитами документа, теперь перебираю метаданные.реквизиты этого документа и хочу заполнить эти колонки строками с данными из документа. не могу сообразить как найти нужную колонку которая бы соответствовала текущему реквизиту документа.
Процедура Документ()
Выборка= БазаИсточник.Документы.РеализацияТоваровУслуг.Выбрать(ДатаНач,ДатаКон);
МедаданОле= БазаИсточник.Метаданные.Документы.РеализацияТоваровУслуг;
ТабОбщая = Новый ТаблицаЗначений;
ТабОбщаяТЧ = Новый ТаблицаЗначений;
метадан = Метаданные.Документы.РеализацияТоваровУслуг;
// вывести реквизиты
Для Каждого РеквДок из метадан.Реквизиты Цикл
ТабОбщая.Колонки.Добавить(РеквДок.Имя, Новый ОписаниеТипов(«Строка»));
КонецЦикла;
// вывести ТЧ
Для Каждого РеквДокТЧ из метадан.ТабличныеЧасти Цикл
ТабОбщаяТЧ.Колонки.Добавить(РеквДокТЧ.Имя, Новый ОписаниеТипов(«Строка»));
КонецЦикла;
Пока Выборка.Следующий() Цикл
Для Каждого РеквДок из МедаданОле.Реквизиты Цикл
//ТУТ ЗАПУТАЛСЯ+++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++
ТекКолонка = ТабОбщая.Колонки.Найти(РеквДок);
НоваяСтрока = ТабОбщая.Добавить();
НоваяСтрока.ТекущаяКолонка = Выборка.РеквДок;
//ТУТ ЗАПУТАЛСЯ+++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++
КонецЦикла;
КонецЦикла;
ТпДоки = ТабОбщая;
ТпДокиТЧ = ТабОбщаяТЧ;
ЭлементыФормы.ТпДоки.СоздатьКолонки();
ЭлементыФормы.ТпДокиТЧ.СоздатьКолонки();
Источник
Таблица значений
В таблицах значений существуют строки и колонки. У каждой строки есть индекс, он начинается с нуля. Таблицу значений можно создавать с различными колонками и добавлять в нее строки. По строкам в таблице можно делать выборку и поиск, устанавливать и получать значения, сортировать, группировать и удалять строки.
Как можно создать новую таблицу значений?
Как добавить новую колонку с определенным типом и заголовком?
- Имя (необязательный, тип Строка , по умолчанию пустая строка). Имя колонки.
- Тип (необязательный, тип ОписаниеТипов ). Объект, описывающий допустимые типы значений для колонки. Если параметр не указан, в колонке можно будет хранить значение любого типа.
- Заголовок (необязательный, тип Строка , по умолчанию пустая строка). Заголовок колонки таблицы значений. Используется при визуальном отображении таблицы значений.
- Ширина (необязательный, тип Число , по умолчанию ноль). Ширина колонки в символах. Используется при визуальном отображении таблицы значений.
Как добавить новые строки?
Как выгрузить результат запроса в таблицу значений?
Как обойти в цикле все строки таблицы значений?
Как сделать выборку строк в таблице значений с отбором?
- ПараметрыОтбора (обязательный, тип Структура ). Задает условия поиска: ключ структуры определяет имя колонки, по которой будет осуществляться поиск, а значение структуры — искомое значение.
Осуществляет поиск строк таблицы значений, отвечающих заданным условиям поиска. Возвращает массив строк таблицы значений, соответствующих условиям поиска. Метод эффективно использовать для выборки неуникальных значений.
Массив хранит ссылки на строки таблицы значений, то есть при изменении строки в таблице, значение в массиве тоже будет измененным.
Как выполнить сортировку?
Как вычислить итоги по колонке?
Как сделать копию таблицы значений?
Как свернуть таблицу значений по колонке и суммировать по количеству?
Метод Свернуть() сворачивает таблицу по колонке «Наименование» и суммирует колонку «Количество». Если существуют еще колонки, то они будут удалены.
- КолонкиГруппировок (обязательный, тип Строка ). Имена колонок, разделенные запятыми, по которым необходимо группировать строки таблицы значений.
- КолонкиСуммирования (необязательный, тип Строка ). Имена колонок, разделенные запятыми, по которым необходимо суммировать значения в строках таблицы значений.
Осуществляет свертку таблицы значений по указанным колонкам группировки. Строки, у которых совпадают значения в колонках, указанных в первом параметре, сворачиваются в одну строку. Значения этих строк, хранящиеся в колонках, указанных во втором параметре, накапливаются.
Списки колонок не должны пересекаться. Колонки, не вошедшие ни в один из списков колонок, после выполнения метода удаляются из таблицы значений.
- Если в колонке установлен тип и он единственный, то при суммировании будет предприниматься попытка преобразования значения к типу Число .
- Если колонке не присвоены типы, то в процессе суммирования будут принимать участие только значения, имеющие тип Число , значения других типов будут игнорироваться.
- Если в колонке несколько типов и среди них есть тип Число , то в процессе суммирования будут принимать участие только значения, имеющие тип Число , значения других типов будут игнорироваться.
- Если в колонке несколько типов и среди них нет типа Число , то результат суммирования будет 0, который будет присвоен в соответствующую колонку, где будет преобразован к значению по умолчанию для типа, установленного в колонке.
Как найти строку в таблице значений по значению?
- Значение (обязательный, тип Произвольный ). Искомое значение.
- Колонки (необязательный, тип Строка , по умолчанию пустая строка). Список имен колонок, разделенных запятыми, по которым производится поиск. Если параметр не указан, поиск осуществляется по всей таблице значений.
Осуществляет поиск значения в указанных колонках таблицы значений. Возвращает строку таблицы значений, в которой содержится искомое значение. Если значение не найдено, то возвращается значение Неопределено . Метод эффективно использовать для поиска уникальных значений.
Источник
Как найти строки таблицы значений в 1С 8
Для того чтобы найти строки таблицы значений, в 1с 8 используется два метода: Найти и НайтиСтроки. Первый предназначен для поиска одной строки, содержащей указанное значение. Второй для поиска всех строк, соответствующих указанному отбору. Разберем оба метода подробнее.
Метод Найти
Метод таблицы значений Найти, предназначен для поиска строки таблицы, содержащей указанное значение. Если строк содержащих значение будет несколько, будет найдена только первая из них. Эту особенность надо учитывать. Поиск осуществляется только на «равно». Синтаксис метода:
В первый параметр передаем значение, которое необходимо найти. Во втором можно через запятую указываем список колонок, в которых необходимо проводить поиск. Также можно не заполнять второй параметр, тогда поиск будет учитывать значения во всех колонках таблицы. В случае успешного поиска, метод вернет строку таблицы значений. В противном случае будет получено Неопределено.
Рассмотрим простой пример. У нас есть таблица значений с колонками: Номенклатура, Количество, Цена, Сумма. Найдем строку, содержащую значение 2 в колонке Количество или в колонке Цена.
После поиска, обязательно делаем проверку на Неопределено. Иначе, в случае не найденной строки, можно получить ошибку.
При изменении значений в найденной строке, изменяются и значения в самой таблице. Это логично, так как мы работаем непосредственно со строкой таблицы значений.
Метод НайтиСтроки
Метод НайтиСтроки предназначен для поиска всех строк таблицы значений, соответствующих указанному отбору. Синтаксис метода:
Параметры отбора — это структура, где ключ — имя колонки таблицы, а значение — значение, по которому будет осуществляться поиск в данной колонке. Поиск элементов осуществляется только на «равно». Данный метод возвращает массив найденных строк таблицы, либо пустой массив, если по данным условиям ничего не найдено.
Пример 2. Пусть у нас есть Таблица значений содержащаяся в переменной Таблица, у которой есть колонки Наименование и Код.
Как и в предыдущем методе, изменение значений в найденных строках ведет к изменению значений в таблице. Это не так очевидно, и происходит из-за того, что массив найденных строк содержит ссылки на строки исходной таблицы. Это работает и в обратную сторону. То есть, если вы измените значения в таблице, они изменятся и в найденных строках.
Другие способы найти строки таблицы значений
У рассмотренных методов есть свои недостатки. Основной, поиск только на равенство. Если вам необходимо использовать более сложные конструкции отбора строк, то можно обойти таблицу значений циклом, или передать ее в запрос.
Пример 3. Воспользуемся таблицей из самого первого примера. Обработаем строки, цена в которых находится в интервале от 100 до 1000.
Пример 4. Сделаем тоже самое при помощи запроса.
Стоит заметить, что данные найденные запросом никак не связаны с таблицей значений. Это стоит учитывать, если вам необходимо изменять исходные данные.
Источник
Поиск в коллекциях значений
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. При двух и более операциях поиска в объекте ТаблицаЗначений с большим количеством строк (*) рекомендуется:
- Индексировать колонки, по которым выполняется поиск;
- Но только те из них, которые обладают хорошей селективностью (т.е. каждому значению этой колонки должно соответствовать небольшое количество строк). В противном случае, индексирование не даст эффекта, либо он будет отрицательным (потрачено лишнее время на индексирование).
* Примечание: следует ориентироваться на 1000 строк и более, а также учитывать не только размер таблицы, в которой выполняется поиск, но и сколько раз он выполняется. Например, даже если таблица относительно небольшая в 100 строк, но поиск по ней выполняется 100 раз, ее тоже имеет смысл индексировать. В то же время, нет смысла индексировать таблицу из-за только одной единственной операции поиска.
2. Для поиска значений предусмотрены два метода объекта ТаблицаЗначений :
При поиске значения в одной колонке таблицы значений оба метода одинаково эффективно используют индекс, если он был задан (см. п.1).
Однако при поиске значения сразу по нескольким (или по всем) колонкам необходимо учитывать следующие ограничения.
2.1. Не следует использовать метод Найти для поиска по нескольким колонкам в таблицах значений с большим количеством строк, даже если проиндексированы все колонки, обладающие хорошей селективностью. Это ограничение вызвано тем, что метод Найти выполняет поиск с применением индекса только по одному полю.
Например:
ТЗ.Индексы.Добавить(«Колонка1»);
ТЗ.Индексы.Добавить(«Колонка2»);
. = ТЗ.Найти(«найдется все», «Колонка1, Колонка2»); // Индекс НЕ используется!
В этом примере, несмотря на наличие индекса для колонок Колонка1 и Колонка2 , поиск все равно будет выполняться перебором всех строк в таблице значений (что очень ресурсоемко на больших объемах данных).
2.2. При использовании метода НайтиСтроки в таблицах значений с большим количеством строк следует обеспечить, чтобы список полей индекса был точно таким же, как он задан в структуре поиска (порядок полей не важен). В противном случае, индекс не будет задействован, и поиск будет выполняться перебором всех строк в таблице значений (что очень ресурсоемко на больших объемах данных).
Например:
ТЗ.Индексы.Добавить(«Колонка1»); // Индекс1
ТЗ.Индексы.Добавить(«Колонка2»); // Индекс2
. = ТЗ.НайтиСтроки(Новый Структура(«Колонка1, Колонка2 «, «Ищу1″,»Ищу2»)); // Индекс НЕ используется!
. = ТЗ.НайтиСтроки(Новый Структура(«Колонка1», «Ищу1») ); // OK — используется Индекс1
. = ТЗ.НайтиСтроки(Новый Структура(«Колонка2», «Ищу2») ); // OK — используется Индекс2
. = ТЗ.НайтиСтроки(Новый Структура(«Колонка1, Колонка2», «Ищу1″,»Ищу2»)); // OK — индекс используется
. = ТЗ.НайтиСтроки(Новый Структура(«Колонка2, Колонка1», «Ищу2″,»Ищу1»)); // OK — индекс используется
. = ТЗ.НайтиСтроки(Новый Структура(«Колонка1», «Ищу1») ); // Индекс НЕ используется!
. = ТЗ.НайтиСтроки(Новый Структура(«Колонка2», «Ищу2») ); // Индекс НЕ используется!
2.3. Аналогичное ограничение действует и для метода Скопировать таблицы значений при вызове с параметром ПараметрыОтбора ( Структура ).
3. В тех случаях, когда для таблицы значений применяется сортировка по колонкам, содержащим ссылочные значения, необходимо учитывать, что при этом для каждой из этих колонок для всех строк таблицы значений системой будет выполнено обращение к информационной базе за представлением этой ссылки.
- В тех случаях, когда требуется сортировка по наименованию – сразу, на этапе заполнения, добавлять в таблицу дополнительные колонки с представлениями, и сортировку выполнять уже по ним. Если, конечно, это не вызовет аналогичных многократных обращений к информационной базе;
- В остальных случаях – сортировать «по ссылке», а не по представлению. Для этого в методе Сортировать следует использовать объект СравнениеЗначений :
ОбъектСравнения = Новый СравнениеЗначений;
ТаблицаДокументов.Сортировать(«Дата,Ссылка», ОбъектСравнения);
Особенно это важно для таблиц с большим количеством (несколько сотен и тысяч) строк, в алгоритмах критических ко времени исполнения.
3.1. При поиске в объекте Массив с большим количеством элементов(*) следует отказаться от массива в пользу:
- объекта Соответствие , если не важен порядок элементов;
- индексированной ТаблицаЗначений , если порядок элементов значим.
Это обусловлено тем, что в указанных случаях поиск занимает в большинстве случаев константное время, а в массиве поиск выполняется перебором и поэтому пропорционален количеству элементов.
* Примечание: следует ориентироваться на 1000 элементов и более, а также учитывать не только размер массива, но и сколько раз выполняется поиск. Например, если поиск выполняется многократно, в частности, в цикле, то эта рекомендация также действительна для массивов меньшего размера (до 1000 элементов). Особого внимания требуют универсальные механизмы, которые могут применяться на сколь угодно больших объемах данных.
3.2. При необходимости обеспечить уникальность элементов в большом массиве следует однократно в конце алгоритма вызвать функцию СвернутьМассив или процедуру ДополнитьМассив с параметром ТолькоУникальныеЗначения = Истина (модуль ОбщегоНазначения Библиотеки стандартных подсистем).
4. Аналогичный недостаток существует и у объекта ДеревоЗначений , в котором не предусмотрено индексов и поиск выполняется перебором (как в массиве). В указанных выше случаях объект ДеревоЗначений следует заменять индексированным объектом ТаблицаЗначений .
Источник
Бесплатные программы русские. Программирование 1С
Скачать программы, софт бесплатно. Программирование 1С
Таблица значений 1С – 3 часть. Метаданные. Перебор колонок таблицы значений 1С
Таблица значений 1С – 3 часть. Метаданные. Перебор колонок таблицы значений
В этой статье я расскажу как работать с таблицей значений «неизвестной» структуры, как перебирать колонки таблицы значений, как извлекать данные из колонок и строк, не используя названия колонок. (Эта статья относится к циклу статей 1С с нуля; программирование 1с с нуля; таблица значений 1с)
Две предыдущие статьи:
Для объяснения материала и для того, чтобы можно было запустить наши примеры программного кода «в живую», нам необходимая некая тестовая таблица значений 1С. Часть наших примеров будет извлекать данные из таблицы значений, поэтому мы сделаем таблицу с тремя колонками «Фамилия», «Имя», «Отчество» и внесем в нее небольшое количество данных — аж целых 3 строки 🙂
Итак, создадим тестовую таблицу значений 1С и заполним ее:
Наша тестовая таблица состоит из трех колонок: Имя, Фамилия, Отчество; и имеет три заполненных строки с фамилиями героев Гражданской войны.
Номер строки | Фамилия | Имя | Отчество |
0 | Чапаев | Василий | Иванович |
1 | Дзержинский | Феликс | Эдмундович |
2 | Котовский | Григорий | Иванович |
Первый образец кода — перебор колонок таблицы значений 1С как коллекции.
Наш цикл выведет в окно сообщений 1С все имена колонок:
Мы видим, что для перебора колонок применяется специальный цикл перебора коллекции, похожий на цикл перебора строк (в прошлой статье). МояТЗ.Колонки — это коллекция колонок таблицы значений 1С «МояТЗ». Коллекция содержит в себе объекты типа «КолонкаТаблицыЗначений» Каждый объект этого типа и является колонкой таблицы значений, и содержит свойства и методы. Обращаясь к этим свойствам и методам мы получаем нужные сведения об одной колонке или производим какие-то другие действия с ней.
Например, обращаясь к свойству «Имя» (Колонка.Имя) мы получаем имя текущей колонки.
Хочу обратить ваше внимание на заголовок цикла: «Для Каждого Колонка Из МояТЗ.Колонки Цикл» Переменная с именем «Колонка» придумана нами. Необязательно использовать такое же имя. Можно назвать эту переменную как угодно, например «МояТекущаяКолонка» Тогда пример выше будет выглядеть таким образом:
Когда исполняющая подсистема 1С встречает цикл такого вида, при каждом проходе цикла она присваивает переменной с указанным именем один элемент из нашей коллекции, в данном случае — один элемент коллекции колонок таблицы значений МояТЗ.Колонки А далее мы обращаемся к переменной, которая содержит в себе текущую колонку, и используем свойство «Имя».
Предлагаю рядом с именем колонки вывести еще и номер каждой колонки в коллекции колонок:
В окно сообщений 1С будет выведен текст:
Обратим внимание на то, что колонки в таблице значений 1С нумеруются начиная с нуля, так же, как и строки таблицы значений.
Количество колонок в таблице значений 1С
Чтобы узнать количество колонок в таблице значений, мы используем метод «Количество()» у коллекции колонок.
На экране будет выведена цифра «3». Действительно, в нашей таблице три колонки: «Фамилия», «Имя», «Отчество»
Получение объекта- колонки по ее номеру (индексу) и перебор колонок при помощи индекса колонок
Сделаем цикл перебора всех колонок таблицы значений при помощи индексов колонок (номеров). Помним, что нумерация колонок начинается с нуля. Поэтому счетчик цикла «Сч» мы должны наращивать от нуля до числа, равного количеству колонок минус один.
На экране мы получим следующее
Думаю, что этот пример был понятен. Мы обратились к методу Количество() коллекции колонок «МояТЗ.Колонки.Количество()«, получили количество колонок, и запустили цикл со счетчиком от нуля до количество колонок минус один. Внутри цикла мы получаем каждую колонку из коллекции колонок и присваиваем текущий объект-колонку в переменную ТекущаяКолонка Далее, у переменной ТекущаяКолонка мы обращаемся к свойству Имя и выводим значение этого свойства на экран: Сообщить(ТекущаяКолонка.Имя);
Важно никогда не путать свойство объекта и метод объекта.
Свойство — это некая статическая величина и обращение к нему пишется без скобок, например ТекущаяКолонка.Имя. А метод — это по сути, процедура или функция объекта, а вызовы процедур и функций всегда пишутся со скобками (даже если нет входных параметров). Например: МояТЗ.Колонки.Количество()
Если мы обратимся к методу, забыв написать скобки — интерпретатор 1С выдаст нам сообщение об ошибке и не запустит код на выполнение. Так как интерпретатор будет считать, что мы обращаемся не к методу, а к свойству — потому что нет скобок. А свойства с таким именем найти не сможет (потому что с таким именем имеется только метод) — о чем и будет сказано в сообщении об ошибке.
Вот что напишет интерпретатор, если я забуду поставит скобки в вызове метода таким неправильным способом МояТЗ.Колонки.Количество (без скобок после «Количество()»):
Поле объекта не обнаружено (Количество)
В данном случае «поле» и «свойство» следует понимать как синонимы, или неточность терминологии разработчиков 1С. Они используют оба этих слова для обозначения одного и того же понятия. Хотя в других языках программирования эти термины могут означать разные понятия.
Получение данных из таблицы значений 1С при помощи номеров колонок
Предлагаю вам, для начала, простой пример получения данных из первой строки нашей таблицы. Обратите внимание, что мы используем заранее заполненную таблицу из начала статьи. Мы точно знаем, что в таблице есть первая строка, и есть хотя бы одна колонка. Если мы применим этот пример к незаполненной таблице, то произойдет ошибка. Итак:
На экран будет выведено:
Сначала мы получили объект-строку таблицы значений, обратившись к таблице значений при помощи оператора [. ]. (если забыли, как это делается, можно посмотреть предыдущие статьи) Внутрь оператора мы передали аргумент «0». Это индекс первой строки таблицы значений. ПерваяСтрока = МояТЗ[0];
Далее, к объекту-строке мы тоже имеем право обратиться при помощи оператора [. ]. Внутрь этого операторы мы передали номер столбца таблицы значений, в данном случае тоже «0». И, таким образом, мы получили значение столбца с номером «0» для текущей строки таблицы под номером «0». Это значение мы вывели на экран и оно представляет собой строку «Чапаев».
Немного усложним наш пример:
Теперь мы вывели на экран значения из всех трех столбцов первой строки нашей таблицы значений:
Теперь я еще модифицирую этот пример, чтобы нам обойтись без переменной «ПерваяСтрока»
На экране будет тоже самое
Мы увидели в примере выше, что для обращения к значению, находящемуся в конкретной строке и конкретном столбце таблицы значений мы можем использовать последовательный вызов двух операторов [. ] в такой форме: ТаблицаЗначений[ИндексСтроки][ИндексКолонки]
Значит, мы готовы к тому, чтобы создать цикл перебора и получить данные всех строк и всех столбцов при помощи индексов строк и столбцов:
На экран будет выведено следующее:
При помощи двух циклов, один из которых вложен в другой, мы вывели на экран значения всех колонок из всех строк таблицы значений 1С. При этом мы не использовали имена колонок, а обращались к колонкам и строкам по их индексам. Для большего понимания обратите внимание на комментарии внутри примера.
Предлагаю, в заключение, немного изменить наш пример, чтобы он вместо номеров колонок выводил на экран их названия. И дополнительно сделаю более презентабельное оформление выдачи содержимого на экран.
Сейчас, на нашем экране информация стала выглядеть более представительно:
Да, чуть не забыл. При использовании подряд двух операторов [. ][. ], мы можем вместо индекса колонки передавать имя этой колонки: ТаблицаЗначений[ИндексСтроки][ИмяКолонки]
Обратите внимание на строку, отмеченную стрелочкой «
Как научиться программировать в 1С с нуля?
Как работать программистом 1С и получать до 150 000 рублей в месяц?
ЗАПИШИСЬ НА БЕСПЛАТНЫЙ
«ПРОГРАММИРОВАНИЕ в 1С ДЛЯ НОВИЧКОВ»
Курс придет на электронную почту. Стань программистом, выполняя пошаговые задания.
Для участия нужен только компьютер и интернет
Источник