Войти
Портал компьютерных советов - Hiper-ru
  • Конвертирование файла TIB do VMDK Преобразование файла disk image backup в vhd
  • Как на мобильнике набрать добавочный номер
  • Как я справился с запароленным RAR-архивом Программа для расшифровки rar архивов
  • Тайминги оперативной памяти
  • Подключение и отключение разъёмов на шлейфах
  • Client kazynashylyk kz вход в систему
  • 1 что такое таблица. А сейчас: повторение материала

    1 что такое таблица. А сейчас: повторение материала

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    &НаКлиенте

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

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

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


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



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

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

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

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

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

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

    1. Найти

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

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

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

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


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

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

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


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

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

    (Эта статья относится к циклу статей 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С 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. Колонки, описывающие структуру таблицы;
    2. Строки, наполняющие таблицу информацией.

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

    Но обо всем по порядку.

    На Рис.1 показано, как выглядит таблица значений, выведенная на печать простейшей процедурой, которая показывает их структуру и наполнение.

    Как видно из примера, колонок у таблицы 5, не считая номера строки по порядку.

    В большинстве случаев нет необходимости указывать тип данных колонки и её ширину, достаточно определить наименование столбца, но в некоторых случаях без этого просто не обойтись (допустим, при выгрузке таблицы в файл формата dbf).

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

    Добавление строки происходит методом Добавить(), с присвоением имени новой строки.

    Индексы таблицы значений

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

    • Найти (возвращает первый найденный элемент по определенным параметрам, в противном случае значение Неопределено);
    • НайтиСтроки (возвращает массив строк таблицы, удовлетворяющих определенным условиям).

    Поиск по большим таблицам сильно «подвешивает» систему и может быть продолжителен по времени. Именно в этих случаях и надо использовать индексы.

    В первом случае поиск происходит по одному значению и одной колонке, именно её и надо передавать в индексы (Рис.3)

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

    В случае, приведенном на примере, вторая строка указывает на одновременный поиск строк, содержащих определенное значение Номенклатуры и ее характеристики, а третьей строкой указано, что к параметрам поиска может быть добавлен документ «Заказ на производство».

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

    Здесь на помощь снова приходит таблица значений. В ТЗ, воспользовавшись методом табличных частей Выгрузить() можно:

    1. Полностью повторить структуру таблицы документа, с сохранением всей возможной информации;
    2. Определить только те колонки и строки, которые необходимы для дальнейшей работы, и вывести их.

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

    Следует отметить, что сопоставление колонок табличной части и ТЗ происходит по именам.

    Полностью скопировать одну ТЗ в другую, а также определить, какие строки и колонки будут перенесены можно методом Скопировать().

    Рис.4

    При этом будут сохранены колонки таблицы, а информация и строки из дубликата будут удалены.

    Таблица значений и запрос

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

    Технология запросов в 1С не предполагает использование ТЗ в качестве источников данных, но это ограничение легко можно обойти с помощью . Код на Рис.5 показывает, как это делается.

    Рис.5

    Заменив «*» на наименование колонок (строку вида ТЗ.Номенклатура) можно уменьшить объем выгружаемой информации.

    Ошибка при выполнении запроса (Рис.5) «Тип не может быть обработан в запросе», говорит о том, что разработчик забыл выполнить часть кода Рис.2 и не типизировал колонки.

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

    При переборе строк таблицы значений методом содержащим счетчик (Рис. 6) , важно помнить, что начальное значение индекса строк – 0, а конечное значение итератора должно быть на 1 меньше количества строк в таблице. В противном случае есть 100% вероятность возникновения ошибки «Значение индекса выходит за границы диапазона»

    Рис.6

    Вообще же, перебор строк ТЗ лучше осуществлять через конструкцию «Для каждго … из», определив имя итератора.