Інтернет Windows Android

1с як створити таблицю значень. Які методи існують і як шукати одночасно за кількома значеннями

Вітаю всіх читачів infostart'a. Дана стаття буде присвячена питанню створення довільної таблиці значень на формі керованого застосування програмним способом.

Особливості завдання.

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

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

отримати готову таблицю значень на формі. Здавалося б, що може бути простіше.

Це все було в звичайному додатку. У керованому додатку все змінилося. Так просто довільну таблицю чи не створити. Тепер потрібно або жорстко параметризованих таблицю значень на формі, або створювати її програмним способом (описувати, ну, в цьому, власне, і суть самого керованого застосування). Це ми і спробуємо зробити: програмними засобами створити довільну таблицю значень на керованої формі.

Рішення задачі.

Перше, що ми повинні зробити, це визначити, як таблиця з'явиться на формі. Головне, що ніякого елемента форми в обробці створювати не потрібно. Ми його створимо програмним способом, як і всю таблицю. Тобто таблиця буде описана, і створюватися в момент відкриття форми або за допомогою кнопки - це кому як потрібно.

Створення таблиці на формі відбувається через опис таблиці значень як реквізиту:
МассівТіпаВибора \u003d Новий Масив; МассівТіпаВибора.Добавіть (Тип ( "ТабліцаЗначеній")); ОпісаніеТіпаВибора \u003d Новий ОпісаніеТіпов (МассівТіпаВибора); МассівРеквізітов \u003d Новий Масив; МассівРеквізітов.Добавіть (Новий РеквізітФорми ( "ТабліцаРаспісанія", ОпісаніеТіпаВибора, "", "ТЗН")); Тепер ми повинні створити програмну таблицю значень, яка містить дані. Якщо таблиця значень буде отримана із запиту, то все більше - менш порядок. Якщо таблиця створюється вручну, то значення колонок, які будуть містити числа або дати можуть бути створені через «ОпісаніеТіпов». Суть в тому, що колонки в таблиці значень обов'язково повинні мати якийсь тип. Якщо, наприклад, передбачається, що користувач буде заповнювати дані в цих колонках інтерактивно, то не можна додавати колонку таблиці значень просто з ім'ям, вона повинна мати тип. Майте на увазі - це дуже важливо тому ці типи ми передамо в таблицю на формі.
Створюємо таблицю, яка містить кілька колонок:
КД \u003d Новий КваліфікаториДати (ЧастіДати.Время); МассівКД \u003d Новий Масив; МассівКД.Добавіть (Тип ( "Дата")); ОпісаніеТіповВремя \u003d Новий ОпісаніеТіпов (МассівКД, КД); ТЗ \u003d Новий ТабліцаЗначеній;
ТЗ.Колонкі.Добавіть ( "С", ОпісаніеТіповВремя);
ТЗ.Колонкі.Добавіть ( "До", ОпісаніеТіповВремя);
ТЗ.Колонкі.Добавіть ( "ПІБ");
ТЗ.Колонкі.Добавіть ( "Примітка"); // ПІБ і Примітка - рядки Далі ми заповнимо нашу програмну таблицю ТЗ потрібними даними. Отримуємо таблицю ТЗ, яка містить необхідні значення і готова до передачі в створений реквізит форми. Для Кожного Колонка З ТЗ.Колонкі Цикл

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

Ось така нехитра комбінація і наша таблиця готова.

Для Кожного Колонка З ТЗ.Колонкі Цикл

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

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

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

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

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

Зверніть увагу, що обробники таблиці спрацьовують на клієнті і тому повинні мати команду покажчик компілятора

& НаКліенте

Ну, і останнє що хотілося додати, що після всіх цих дій обов'язково не забуваємо передати готову таблицю в реквізит форми:

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

Ось що маємо в результаті:


А ось обробка події "Вибір":



Післямова.

Сподіваюся, стаття надасть допомогу тим програмістам 1С, які починають створювати таблиці на формі програмним способом.

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

Пошук в таблиці значень 1С

Які методи існують і як шукати одночасно за кількома значеннями.

Для пошуку в таблиці значень існує два спеціальних методу:

1. Знайти

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

Даний метод повертає першу знайдену рядок з потрібним значенням або Не визначено, якщо не знаходить. Тому його зручно використовувати для пошуку унікальних значень, Тому що інакше доведеться при знаходженні значення видаляти його з таблиці, щоб знайти наступне.

Щоб так не мучитися існує наступного метод, Який дозволяє знаходити масив відповідних рядків:

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


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

Цей метод завжди повертає масив, але він може бути і порожньою, якщо нічого не знайдено. І ще цей метод також як і попередній повертає самі рядки таблиці значень, а не самі значення в окремому масиві. Тому змінивши значення в рядку масиву або як в попередньому методі у знайденої рядки, Ви поміняєте значення в оброблюваної таблиці значень.

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


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

Єдиний мінус, як видно, не можна застосовувати інші види порівняння крім як "одно"

Таблиця значень - це специфічний універсальний об'єкт, Призначений для зберігання даних в табличному вигляді. Ключова відмінність таблиці від прикладних об'єктів - це відсутність прив'язки до фізичних таблиць бази даних. Таблиця значень існує тільки в оперативної пам'яті, Що з одного боку дає унікальні можливості, а з іншого - накладає певні обмеження. Проте можливості взаємодії з таблицею можна порівняти зі взаємодією з реально існуючими в базі даних об'єктами.

Історично таблиця значень в 1С має подвійне призначення, будучи віртуальним аналогом існуючих таблиць, але при цьому - і елементом управління. З переходом на кероване додаток велика частина цієї функціональності застаріла, але і в даний час вона може бути також елементом користувальницького інтерфейсу, але з низкою суттєвих обмежень.

Структура таблиці значень як об'єкта

Властивості таблиці значень визначаються комбінаціями двох визначених колекцій: її колонок і рядків.

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

Колонка таблиці значень - її визначальне властивість. Саме набір колонок таблиці визначає її структуру. Колонки відповідають полях фізичних таблиць або знайомим по призначеному для користувача інтерфейсу колонкам табличній частині або журналу документів. Колонка може мати внутрішнє ім'я, тип значення і заголовок, який відображається при інтерактивній роботі з таблицею.

Так як колонки є колекцією об'єктів, то ви можете додавати, видаляти і редагувати колонки.

Рядок таблиці значень

З точки зору програмного інтерфейсу, рядки - це окрема колекція, вбудована в таблицю значень. Вони є аналогом записів фізичних таблиць, тобто звичних для користувача рядків табличної частини або журналу документів. Кожна окремо взята рядок є об'єктом з набором іменованих властивостей, імена яких відповідають іменам колонок таблиці.

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

Створити таблицю значень

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

Створення таблиці конструктором

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

ДемоТабліца \u003d Новий ТабліцаЗначеній; // Насамперед инициализируем ТЗ // Далі визначаємо необхідні параметри для нових колонок і додаємо їх в колекцію // Створення колонки "Номенклатура" Ім'я \u003d "Номенклатура"; ТіпЗначенія \u003d Новий ОпісаніеТіпов ( "СправочнікСсилка.Номенклатура"); Тема \u003d "Номенклатура (товар)"; ДемоТабліца.Колонкі.Добавіть (Їм, ТіпЗначенія, Заголовок); // Створення колонки "Кількість" Ім'я \u003d "Кількість"; ТіпЗначенія \u003d Новий ОпісаніеТіпов ( "Число"); ДемоТабліца.Колонкі.Добавіть (Ім'я, ТіпЗначенія); // В результаті даних маніпуляцій ми створили порожню таблицю з типізований колонками // Якщо вам необхідно використовувати більш точну типізацію примітивних типів, То слід використовувати розширений синтаксис конструктора "ОпісаніеТіпов"

Створення таблиці копіюванням

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

// Варіант з копіюванням з ТЗ-еталона всіх рядків але зі збереженням лише двох зазначених колонок КолонкіЕталона \u003d "Номенклатура, Кількість"; ДемоТабліца \u003d ТабліцаЕталон.Скопіровать (, КолонкіЕталона); // Варіант з копіюванням з ТЗ-еталона попередньо відібраних рядків, зі збереженням двох зазначених колонок СтрокіЕталона \u003d ОтобратьВМассівНужниеНамСтрокіІзТабліциЕталона (); КолонкіЕталона \u003d "Номенклатура, Кількість"; ДемоТабліца \u003d ТабліцаЕталон.Скопіровать (СтрокіЕталона, КолонкіЕталона); // Варіант з копіюванням з ТЗ-еталона рядків за вказаною фільтру, зі збереженням однієї колонки "Номенклатура" // Будуть відібрані всі рядки де значення в колонці Кількість дорівнює 0, в результуючу таблицю потрапить тільки колонка Номенклатура ОтборСтрок \u003d Новий Структура ( "Кількість" , 0); КолонкіЕталона \u003d "Номенклатура"; ДемоТабліца \u003d ТабліцаЕталон.Скопіровать (СтрокіЕталона, КолонкіЕталона); // Варіант з повним копіюванням таблиці і наступному видаленні одного рядка із значенням поля кількість рівним нулю і видаленням цілої колонки "Кількість" ОтборСтрок \u003d Новий Структура ( "Кількість", 0); КолонкіЕталона \u003d "Номенклатура"; ДемоТабліца \u003d ТабліцаЕталон.Скопіровать (СтрокіЕталона, КолонкіЕталона); СтрокаТабліци \u003d ДемоТабліца.Найті (0, "Кількість"); ДемоТабліца.Удаліть (СтрокаТабліци); ДемоТабліца.Колонкі.Удаліть ( "Кількість"); // Аналогічні варіанти і їх модифікації можна застосовувати до табличних частинах і наборах записів регістрів

Створення таблиці запитом

Якщо в базі даних існує еталон необхідної вам таблиці, то можна скористатися запитом для швидкого створення таблиці з потрібною структурою.

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

висновок

У цій невеликій статті ми розглянули основні властивості і практичні прийоми створення таблиці значень, достатні для розуміння і початку застосування. Сам об'єкт таблиці значень настільки багатогранний, що докладний опис його можливостей вимагає написання окремої статті про прийоми та методи роботи.