1с 8.3 добавить колонку в таблицу значений. Синтаксис метода «Описание типов»

Поиск в таблице значений 1С

Какие методы существуют и как искать одновременно по нескольким значениям.

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

1. Найти

ТелевизорГоризонт = Справочники.Номенклатура.НайтиПоНаименованию("Телевизор Горизонт");
НайденнаяСтрока = ТЗНоменклатуры.Найти(ТелевизорГоризонт);
//также мы можем указать в каких колонках искать, чтобы ускорить поиск
НайденнаяСтрока = ТЗНоменклатуры.Найти(ТелевизорГоризонт, "Номенклатура");

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

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

2. НайтиСтроки


СтруктураОтбора.Вставить("Номенклатура", ТелевизорГоризонт); // сначала указываем колонку где искать, а потом что искать.

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

Чем ещё хорош этот метод, так это то, что он может искать сразу по нескольким колонкам таблицы значений одновременно:


СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить("Номенклатура", ТелевизорГоризонт);
СтруктураОтбора.Вставить("Количество", 10);
НайденныйМассивСтрок = ТЗНоменклатуры.НайтиСтроки(СтруктураОтбора);

Единственный минус, как видно, нельзя применять другие виды сравнения кроме как "равно"

Таблица значений – это специфический универсальный объект, предназначенный для хранения данных в табличном представлении. Ключевое отличие таблицы от прикладных объектов – это отсутствие привязки к физическим таблицам базы данных. Таблица значений существует только в оперативной памяти, что с одной стороны дает уникальные возможности, а с другой – накладывает определенные ограничения. Тем не менее возможности взаимодействия с таблицей сопоставимы со взаимодействием с реально существующими в базе данных объектами.

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

Структура таблицы значений как объекта

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

Таблица значений Колонки

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

Так как колонки являются коллекцией объектов, то вы можете добавлять, удалять и редактировать колонки.

Строка таблицы значений

С точки зрения программного интерфейса, строки – это отдельная коллекция, встроенная в таблицу значений. Они являются аналогом записей физических таблиц, то есть привычных для пользователя строк табличной части или журнала документов. Каждая отдельно взятая строка является объектом с набором именованных свойств, имена которых соответствуют именам колонок таблицы.

Таким образом, взаимодействие со строкой очень похоже на взаимодействие с прочими объектами. Можно считывать и записывать ее свойства, в том числе с использованием предопределенной функции «ЗаполнитьЗначенияСвойств()». Так как строки являются основной коллекцией таблицы значений, то чтобы удалить все строки таблицы, применяется метод «Очистить()».

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

Существует множество способов получить таблицу значений готовую к использованию. Рассмотрим некоторые из них. Каждый пример будет приведен в качестве листингов кода с комментариями.

Создание таблицы конструктором

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

ДемоТаблица = Новый ТаблицаЗначений; // Первым делом инициализируем ТЗ // Далее определяем необходимые параметры для новых колонок и добавляем их в коллекцию // Создание колонки "Номенклатура" Имя = "Номенклатура"; ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Номенклатура"); Заголовок = "Номенклатура (товар)"; ДемоТаблица.Колонки.Добавить(Им, ТипЗначения, Заголовок); // Создание колонки "Количество" Имя = "Количество"; ТипЗначения = Новый ОписаниеТипов("Число"); ДемоТаблица.Колонки.Добавить(Имя, ТипЗначения); // В результате данных манипуляций мы создали пустую таблицу с типизированными колонками // Если вам необходимо использовать более точную типизацию примитивных типов, то следует использовать расширенный синтаксис конструктора “ОписаниеТипов”

Создание таблицы копированием

Если у вас под рукой есть эталон с подходящей структурой и/или составом, вы можете скопировать или выгрузить эталонную таблицу значений. Если эталоном является другая таблица, то необходимо применить метод «Скопировать таблицы-эталона». Если вы имеете дело с табличной частью или набором записей регистра, необходимо использовать метод «Выгрузить таблицу значений». Если вам необходима только структура, то можно воспользоваться методом «СкопироватьКолонки».

// Вариант с копированием из ТЗ-эталона всех строк но с сохранением лишь двух указанных колонок КолонкиЭталона = "Номенклатура,Количество"; ДемоТаблица = ТаблицаЭталон.Скопировать(, КолонкиЭталона); // Вариант с копированием из ТЗ-эталона предварительно отобранных строк,с сохранением двух указанных колонок СтрокиЭталона = ОтобратьВМассивНужныеНамСтрокиИзТаблицыЭталона(); КолонкиЭталона = "Номенклатура,Количество"; ДемоТаблица = ТаблицаЭталон.Скопировать(СтрокиЭталона, КолонкиЭталона); // Вариант с копированием из ТЗ-эталона строк по указанному фильтру,с сохранением одной колонки “Номенклатура” // Будут отобраны все строки где значение в колонке Количество равно 0, в результирующую таблицу попадет только колонка Номенклатура ОтборСтрок = Новый Структура("Количество", 0); КолонкиЭталона = "Номенклатура"; ДемоТаблица = ТаблицаЭталон.Скопировать(СтрокиЭталона, КолонкиЭталона); // Вариант с полным копированием таблицы и последующем удалении одной строки со значением поля количество равным нулю и удалением целой колонки “Количество” ОтборСтрок = Новый Структура("Количество", 0); КолонкиЭталона = "Номенклатура"; ДемоТаблица = ТаблицаЭталон.Скопировать(СтрокиЭталона, КолонкиЭталона); СтрокаТаблицы = ДемоТаблица.Найти(0, "Количество"); ДемоТаблица.Удалить(СтрокаТаблицы); ДемоТаблица.Колонки.Удалить("Количество"); // Аналогичные варианты и их модификации можно применять к табличным частям и наборам записей регистров

Создание таблицы запросом

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

// Пример с созданием пустой таблицы по образцу структуры регистра накопления // Нетрудно догадаться, что таким образом можно получить и заполненную таблицу Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 0 * Из РегистрНакопления.ТоварынаСкладе"); РезультатЗапроса = Запрос.Выполнить(); ДемоТаблица = РезультатЗапроса.Выгрузить(); // Пример с созданием пустой таблицы по явно заданным типам и именам полей Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 0 | Значение(Справочник.Номенклатура.ПустаяССылка) КАК Номенклатура, | ВЫРАЗИТЬ(0 КАК ЧИСЛО(15, 3)) КАК Количество"; РезультатЗапроса = Запрос.Выполнить(); ДемоТаблица = РезультатЗапроса.Выгрузить(); // ВАЖНО! Не стоит забывать, что в типах значений колонок, полученных из запроса всегда присутствует тип Null // Таким образом, ТЗ созданная запросом, всегда имеет составные типы колонок

Заключение

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

Приветствую всех читателям infostart’a. Данная статья будет посвящена вопросу создания произвольной таблицы значений на форме управляемого приложения программным способом.

Особенности задачи.

Каждый, кто программировал в обычном приложении, часто сталкивался с задачей получения произвольной таблицы значений на форме. Под произвольной таблицей значений понимается таблица, количество и тип колонок которой наперед не известно. То есть колонок может быть 3, а может 6, а может 8. В обычном приложении все просто: можно было на форме обработки разместить элемент «ТаблицаЗначений»,и затем передать в этот элемент созданную таблицу значений программным способом. Потом простой командой:

ЭлементыФормы.ТабличноеПоле.СоздатьКолонки();

получить готовую таблицу значений на форме. Казалось бы, что может быть проще.

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

Решение задачи.

Первое, что мы должны сделать, это определить, как таблица появится на форме. Главное, что никакого элемента формы в обработке создавать не нужно. Мы его создадим программным способом, как и всю таблицу. То есть таблица будет описана, и создаваться в момент открытия формы или с помощью кнопки – это кому как нужно.

Создание таблицы на форме происходит через описание таблицы значений как реквизита:
МассивТипаВыбора = Новый Массив; МассивТипаВыбора.Добавить(Тип("ТаблицаЗначений")); ОписаниеТипаВыбора = Новый ОписаниеТипов(МассивТипаВыбора); МассивРеквизитов = Новый Массив; МассивРеквизитов.Добавить(Новый РеквизитФормы("ТаблицаРасписания", ОписаниеТипаВыбора, "", "ТЗН")); Теперь мы должны создать программную таблицу значений, которая содержит данные. Если таблица значений будет получена из запроса, то все более - менее порядок. Если таблица создается вручную, то значение колонок, которые будут содержать числа или даты могут быть созданы через «ОписаниеТипов». Суть в том, что колонки в таблице значений обязательно должны иметь какой-то тип. Если, например,предполагается, что пользователь будет заполнять данные в этих колонках интерактивно, то нельзя добавлять колонку таблицы значений просто с именем, она должна иметь тип. Имейте ввиду – это очень важно т.к. эти типы мы передадим в таблицу на форме.
Создаем таблицу, которая содержит несколько колонок:
КД = Новый КвалификаторыДаты(ЧастиДаты.Время); МассивКД = Новый Массив; МассивКД.Добавить(Тип("Дата")); ОписаниеТиповВремя = Новый ОписаниеТипов(МассивКД,КД); ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("С", ОписаниеТиповВремя);
ТЗ.Колонки.Добавить("До", ОписаниеТиповВремя);
ТЗ.Колонки.Добавить("ФИО");
ТЗ.Колонки.Добавить("Примечание");//ФИО и Примечание - строки Далее мы заполним нашу программную таблицу ТЗ нужными данными. Получаем таблицу ТЗ, которая содержит необходимые значения и готова к передаче в созданный реквизит формы. Для Каждого Колонка Из ТЗ.Колонки Цикл

МассивРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения,"ТаблицаРасписания"));
КонецЦикла;
ИзменитьРеквизиты(МассивРеквизитов);
ТаблицаПолейВыбора = Элементы.Добавить("ТЗН", Тип("ТаблицаФормы"));
ТаблицаПолейВыбора.ПутьКДанным = "ТаблицаРасписания";
ТаблицаПолейВыбора.Отображение = ОтображениеТаблицы.Список;

Вот такая нехитрая комбинация и наша таблица готова.

Для Каждого Колонка Из ТЗ.Колонки Цикл

НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), ТаблицаПолейВыбора);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "ТаблицаРасписания." + Колонка.Имя;
НовыйЭлемент.Ширина = 10;
КонецЦикла;

Условное оформление, если нам нужно мы также пишем вручную,командное меню – вручную. Обработчики таблицы также пишутся руками. Например,что бы добавить обработчик события таблицы «Выбор»:

ТаблицаПолейВыбора.УстановитьДействие("Выбор","ТЗНВыбор");

Для обработки данного события в форме процедуры прописывается отдельная процедура:

&НаКлиенте
Процедура ТЗНВыбор(ТЗ, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
//команды обработчика КонецПроцедуры

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

&НаКлиенте

Ну, и последнее что хотелось добавить, что после всех этих действий обязательно не забываем передать готовую таблицу в реквизит формы:

ЗначениеВРеквизитФормы(ТЗ, "ТаблицаРасписания");

Вот что имеем в результате:


А вот обработка события "Выбор":



Послесловие.

Надеюсь, статья окажет помощь тем программистам 1С, которые начинают создавать таблицы на форме программным способом.

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

Опубликовано 21 Сентябрь 2011

Таблица значений 1С – 3 часть. Метаданные. Перебор колонок таблицы значений

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

Для объяснения материала и для того, чтобы можно было запустить наши примеры программного кода "в живую", нам необходимая некая тестовая таблица значений 1С . Часть наших примеров будет извлекать данные из таблицы значений, поэтому мы сделаем таблицу с тремя колонками "Фамилия", "Имя", "Отчество" и внесем в нее небольшое количество данных - аж целых 3 строки:)

Итак, создадим тестовую таблицу значений 1С и заполним ее:

МояТЗ = Новый ТаблицаЗначений; // создаем новую таблицу значений, хранящуюся в переменной "МояТЗ" МояТЗ.Колонки.Добавить("Фамилия"); // создаем колонку "Фамилия" МояТЗ.Колонки.Добавить("Имя"); // создаем колонку "Имя" МояТЗ.Колонки.Добавить("Отчество"); // создаем колонку "Отчество" // добавляем первую строку в нашу таблицу значений НоваяСтрока = МояТЗ.Добавить(); НоваяСтрока.Фамилия = "Чапаев"; НоваяСтрока.Имя = "Василий"; НоваяСтрока.Отчество = "Иванович"; // добавляем вторую строку НоваяСтрока = МояТЗ.Добавить(); НоваяСтрока.Фамилия = "Дзержинский"; НоваяСтрока.Имя = "Феликс"; НоваяСтрока.Отчество = "Эдмундович"; // добавляем третью строку НоваяСтрока = МояТЗ.Добавить(); НоваяСтрока.Фамилия = "Котовский"; НоваяСтрока.Имя = "Григорий"; НоваяСтрока.Отчество = "Иванович";

Наша тестовая таблица состоит из трех колонок: Имя, Фамилия, Отчество; и имеет три заполненных строки с фамилиями героев Гражданской войны.

Первый образец кода - перебор колонок таблицы значений 1С как коллекции.

// выводим названия всех колонок ТЗ Для Каждого Колонка Из МояТЗ.Колонки Цикл Сообщить("Имя колонки: " + Колонка.Имя); КонецЦикла;

Наш цикл выведет в окно сообщений 1С все имена колонок:

Имя колонки: Фамилия Имя колонки: Имя Имя колонки: Отчество

Мы видим, что для перебора колонок применяется специальный цикл перебора коллекции, похожий на цикл перебора строк (в прошлой статье). МояТЗ.Колонки - это коллекция колонок таблицы значений 1С "МояТЗ" . Коллекция содержит в себе объекты типа "КолонкаТаблицыЗначений" Каждый объект этого типа и является колонкой таблицы значений, и содержит свойства и методы. Обращаясь к этим свойствам и методам мы получаем нужные сведения об одной колонке или производим какие-то другие действия с ней.

Например, обращаясь к свойству "Имя" (Колонка.Имя ) мы получаем имя текущей колонки.

Хочу обратить ваше внимание на заголовок цикла: "Для Каждого Колонка Из МояТЗ.Колонки Цикл" Переменная с именем "Колонка" придумана нами. Необязательно использовать такое же имя. Можно назвать эту переменную как угодно, например "МояТекущаяКолонка" Тогда пример выше будет выглядеть таким образом:

// выводим названия всех колонок ТЗ Для Каждого МояТекущаяКолонка Из МояТЗ.Колонки Цикл Сообщить("Имя колонки: " + МояТекущаяКолонка.Имя); КонецЦикла;

Когда исполняющая подсистема 1С встречает цикл такого вида, при каждом проходе цикла она присваивает переменной с указанным именем один элемент из нашей коллекции, в данном случае - один элемент коллекции колонок таблицы значений МояТЗ.Колонки А далее мы обращаемся к переменной, которая содержит в себе текущую колонку, и используем свойство "Имя" .

Предлагаю рядом с именем колонки вывести еще и номер каждой колонки в коллекции колонок:

// выводим номер и названия всех колонок таблицы значений Для Каждого Колонка Из МояТЗ.Колонки Цикл НомерКолонки = МояТЗ.Колонки.Индекс(Колонка); // получаем номер колонки ИмяКолонки = Колонка.Имя; // получаем имя колонки Сообщить("Номер колонки:" + НомерКолонки + " Имя колонки: " + ИмяКолонки); КонецЦикла;

В окно сообщений 1С будет выведен текст:

Номер колонки:0 Имя колонки: Фамилия Номер колонки:1 Имя колонки: Имя Номер колонки:2 Имя колонки: Отчество

Обратим внимание на то, что колонки в таблице значений 1С нумеруются начиная с нуля, так же, как и строки таблицы значений.

Количество колонок в таблице значений 1С

Чтобы узнать количество колонок в таблице значений, мы используем метод "Количество()" у коллекции колонок.

КоличествоКолонок = МояТЗ.Колонки.Количество(); Сообщить(КоличествоКолонок);

На экране будет выведена цифра "3". Действительно, в нашей таблице три колонки: "Фамилия", "Имя", "Отчество"

Получение объекта- колонки по ее номеру (индексу) и перебор колонок при помощи индекса колонок

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

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

На экране мы получим следующее

Фамилия Имя Отчество

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

Важно никогда не путать свойство объекта и метод объекта.

Свойство - это некая статическая величина и обращение к нему пишется без скобок, например ТекущаяКолонка.Имя . А метод - это по сути, процедура или функция объекта, а вызовы процедур и функций всегда пишутся со скобками (даже если нет входных параметров). Например: МояТЗ.Колонки.Количество()

Если мы обратимся к методу, забыв написать скобки - интерпретатор 1С выдаст нам сообщение об ошибке и не запустит код на выполнение. Так как интерпретатор будет считать, что мы обращаемся не к методу, а к свойству - потому что нет скобок. А свойства с таким именем найти не сможет (потому что с таким именем имеется только метод) - о чем и будет сказано в сообщении об ошибке.

Вот что напишет интерпретатор, если я забуду поставит скобки в вызове метода таким неправильным способом МояТЗ.Колонки.Количество (без скобок после "Количество()"):

Поле объекта не обнаружено (Количество)

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

Получение данных из таблицы значений 1С при помощи номеров колонок

Предлагаю вам, для начала, простой пример получения данных из первой строки нашей таблицы. Обратите внимание, что мы используем заранее заполненную таблицу из начала статьи. Мы точно знаем, что в таблице есть первая строка, и есть хотя бы одна колонка. Если мы применим этот пример к незаполненной таблице, то произойдет ошибка. Итак:

ПерваяСтрока = МояТЗ; // получаем первую строку (нумерация с нуля) ЗначениеПервойКолонки = ПерваяСтрока; // получаем значение первой колонки (нумерация колонок тоже с нуля) Сообщить(ЗначениеПервойКолонки); // выводим на экран значение первого столбца в первой строке таблицы

На экран будет выведено:

Чапаев

Сначала мы получили объект-строку таблицы значений, обратившись к таблице значений при помощи оператора [...]. (если забыли, как это делается, можно посмотреть предыдущие статьи) Внутрь оператора мы передали аргумент "0". Это индекс первой строки таблицы значений. ПерваяСтрока = МояТЗ;

Далее, к объекту-строке мы тоже имеем право обратиться при помощи оператора [...]. Внутрь этого операторы мы передали номер столбца таблицы значений, в данном случае тоже "0". И, таким образом, мы получили значение столбца с номером "0" для текущей строки таблицы под номером "0". Это значение мы вывели на экран и оно представляет собой строку "Чапаев".

Немного усложним наш пример:

ПерваяСтрока = МояТЗ; // получаем первую строку (нумерация с нуля) Сообщить(ПерваяСтрока); // выводим на экран значение первого столбца в первой строке таблицы Сообщить(ПерваяСтрока); // выводим на экран значение второго столбца в первой строке таблицы Сообщить(ПерваяСтрока); // выводим на экран значение третьего столбца в первой строке таблицы

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

Чапаев Василий Иванович

Теперь я еще модифицирую этот пример, чтобы нам обойтись без переменной "ПерваяСтрока"

Сообщить(МояТЗ); // выводим на экран значение первого столбца в первой строке таблицы Сообщить(МояТЗ); // выводим на экран значение второго столбца в первой строке таблицы Сообщить(МояТЗ); // выводим на экран значение третьего столбца в первой строке таблицы

На экране будет тоже самое

Чапаев Василий Иванович

Мы увидели в примере выше, что для обращения к значению, находящемуся в конкретной строке и конкретном столбце таблицы значений мы можем использовать последовательный вызов двух операторов [...] в такой форме: ТаблицаЗначений[ИндексСтроки][ИндексКолонки]

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

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

На экран будет выведено следующее:

Строка №0 столбец №0 = Чапаев Строка №0 столбец №1 = Василий Строка №0 столбец №2 = Иванович Строка №1 столбец №0 = Дзержинский Строка №1 столбец №1 = Феликс Строка №1 столбец №2 = Эдмундович Строка №2 столбец №0 = Котовский Строка №2 столбец №1 = Григорий Строка №2 столбец №2 = Иванович

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

Предлагаю, в заключение, немного изменить наш пример, чтобы он вместо номеров колонок выводил на экран их названия. И дополнительно сделаю более презентабельное оформление выдачи содержимого на экран.

Для СчетчикСтрок = 0 По МояТЗ.Количество() - 1 Цикл // цикл перебора строк Сообщить(" ======= Строка № " + СчетчикСтрок + " ======="); Сообщить(" "); // перевод строки (вставка пустой строки) Для СчетчикКолонок = 0 По МояТЗ.Колонки.Количество() - 1 Цикл // вложенный цикл перебора столбцов // получаем значение ячейки (из текущей строки и текущей колонки) ЗначениеЯчейки = МояТЗ[СчетчикСтрок][СчетчикКолонок]; // получаем имя колонки ИмяКолонки = МояТЗ.Колонки[СчетчикКолонок].Имя; // выводим на экран имя колонки и значение ячейки Сообщить(ИмяКолонки + ": " + ЗначениеЯчейки); КонецЦикла; Сообщить(" "); // перевод строки (вставка пустой строки) КонецЦикла;

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

Строка № 0 ======= Фамилия: Чапаев Имя: Василий Отчество: Иванович ======= Строка № 1 ======= Фамилия: Дзержинский Имя: Феликс Отчество: Эдмундович ======= Строка № 2 ======= Фамилия: Котовский Имя: Григорий Отчество: Иванович

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

Для СчетчикСтрок = 0 По МояТЗ.Количество() - 1 Цикл // цикл перебора строк Сообщить(" ======= Строка № " + СчетчикСтрок + " ======="); Сообщить(" "); // перевод строки (вставка пустой строки) Для СчетчикКолонок = 0 По МояТЗ.Колонки.Количество() - 1 Цикл // вложенный цикл перебора столбцов ИмяКолонки = МояТЗ.Колонки[СчетчикКолонок].Имя; // получаем имя колонки ЗначениеЯчейки = МояТЗ[СчетчикСтрок][ИмяКолонки]; //

Обратите внимание на строку, отмеченную стрелочкой ". В этой строке мы вместо индекса текущей колонки передаем имя текущей колонки в аргумент в квадратных скобках [...] Результат будет тот же самый.

А сейчас, последнее в этой статье.

ПРАВИЛЬНОЕ получение всех данных таблицы значений 1С, при помощи циклов перебора коллекции строк и коллекции колонок

Для Каждого ТекущаяСтрока Из МояТЗ Цикл // цикл перебора коллекции строк Сообщить(" ======= Строка № " + МояТЗ.Индекс(ТекущаяСтрока) + " ======="); Сообщить(" "); Для Каждого ТекущаяКолонка Из МояТЗ.Колонки Цикл // вложенный цикл перебора коллекции столбцов ИмяКолонки = ТекущаяКолонка.Имя; // получаем имя колонки ЗначениеЯчейки = ТекущаяСтрока[ИмяКолонки]; // получаем значение ячейки ПО ИМЕНИ колонки Сообщить(ИмяКолонки + ": " + ЗначениеЯчейки); // выводим на экран имя колонки и значение ячейки КонецЦикла; Сообщить(" "); КонецЦикла;

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

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

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

Для Каждого ТекущаяСтрока Из МояТЗ Цикл // перебор строк Сообщить(" ======= Строка № " + МояТЗ.Индекс(ТекущаяСтрока) + " =======" + Символы.ПС); Для Каждого ТекущаяКолонка Из МояТЗ.Колонки Цикл // перебор столбцов Сообщить(ТекущаяКолонка.Имя + ": " + ТекущаяСтрока[ТекущаяКолонка.Имя]); КонецЦикла; Сообщить(" "); КонецЦикла;

Вывод на экран не изменился, остался такой же, как в прошлом примере:

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;}