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; .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%;). size: 13px; font-style: normal; font-weight: bold;).sp-form .sp-button ( border-radius: 4px; -moz-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;

(Ця стаття відноситься до циклу статей 1С з нуля; програмування 1с з нуля; таблиця значень 1с)

Віртуальна структура-сховище даних у табличній формі - ось що таке

Таблиця значень не є постійним об'єктом бази даних 1С і не зберігається між сеансами запуску.

Таблиця значень 1С(ТЗ) створюється "на льоту" за допомогою програмного коду, і далі робота з нею здійснюється так само, з будь-яким іншим програмним об'єктом мови програмування 1С. За допомогою викликів методів та звернень до властивостей таблиці-об'єкта.

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

Створимо таблицю значень і заповнимо її чимось. Потрібно пам'ятати, що таблицю значень 1С можна створити не лише вручну, викликом оператора

Новий ТаблицяЗначень;

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

Відразу наведу простий приклад.

// МояТЗ = Новий ТаблицяЗначень; // Створюємо нову таблицю значень, що зберігається в змінній "МояТЗ"Моя ТЗ. Колонки. Додати("Прізвище"); // створюємо колонку "Прізвище"Моя ТЗ. Колонки. Додати("Ім'я"); // створюємо колонку "Ім'я"Повідомити (МояТЗ) ; // вивести значення змінної МояТЗ //

Я створив таблицю значень 1С з двома колонками: "Прізвище", "Ім'я". Процедура Повідомити(МояТЗ)виведе у вікно повідомлень тип змінної Моя ТЗ: ТаблицяЗначень

Наша таблиця значень поки що порожня. Додамо до неї кілька рядків, з іменами та прізвищами.

// Заповнюємо таблицю значень // додаємо перший рядок до нашої таблиці значеньНоваРядок = МояТЗ. Додати (); НовийРядок. Прізвище = "Сидорів"; НовийРядок. Ім'я = "Вася"; // додаємо другий рядок до нашої таблиці значеньНоваРядок = МояТЗ. Додати (); НовийРядок. Прізвище = "Іванов"; НовийРядок. Ім'я = "Петя";

Ми отримали таблицю такого виду:

Потрібно запам'ятати: номери рядків у таблиці значень починаються з нуля

Навіщо нам взагалі потрібні номери рядків? А для того, щоб ми могли звернутися до окремого рядка таблиці значень, наприклад, взяти та вивести цей рядок на екран.

// *** виводимо значень нульового рядка на екран *** (у побуті ми зазвичай нумеруємо речі з одиниці, а тут – з нуля) // отримуємо нульовий рядок нашої таблиці за допомогою індексу рядка у квадратних дужкахНаша нульова Рядок = Моя ТЗ [0]; // тепер весь нульовий рядок міститься в змінній "Наш Перший Рядок"Повідомити (НашаНулеваяРядок. Прізвище) ; // Виводимо на екран значення стовпця "Прізвище", що зберігається в нульовому рядкуПовідомити (НашаНулеваяРядок. Ім'я) ; // Виводимо на екран значення стовпця "Ім'я", з цього ж рядка

В результаті на екран буде виведено:

Сидорів Вася

Тепер для дуже розумних і лаконічних покажу приклад, який дозволяє звернутися до значення колонки в одному рядку (Значень колонки в такому рядку - це осередок таблиці значень. Неофіційний термін, зате зручний). Але без використання проміжної змінної, на кшталт "Наша Нульова Рядок".

Щоб вивести значення осередків з другого рядка (не забуваємо, що рядок другий, але індекс цього рядка дорівнює одиниця, то нумерація починається з нуля)

Зрештою, заключний момент у цій статті. Я показав приклад звернення до окремого рядка таблиці значень за індексом (номером рядка). Універсальна форма для читання або присвоєння вмісту осередку така: "МояТаблиціЗначень[НомерРядки].Ім'яКолонки"

Тепер наведу вам відразу, цикл повного виведення вмісту таблиці значень. Без докладних пояснень, щоб ви теж могли поламати голову:)

// // цикл перебору та виведення всіх рядків нашої таблиці значень// Для НомерРядки = 0 По МояТЗ. Кількість() - 1 Цикл Повідомити (МояТЗ[ НомерСтроки] . Прізвище) ; // Виводимо на екран значення стовпця "Прізвище"Повідомити (МояТЗ[ НомерРядки] . Ім'я) ; // Виводимо на екран значення стовпця "Ім'я"Кінець циклу;

В результаті запуску цього циклу на екран буде виведено:

Сидоров Вася Іванов Петя

Тут я розповів найази в роботі з таблицею значень 1С. Ці відомості застосовні до 1С 8.0, 8.1, 8.2 На цьому цікаві подробиці про об'єкт "таблиця значень 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; .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%;). size: 13px; font-style: normal; font-weight: bold;).sp-form .sp-button ( border-radius: 4px; -moz-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;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ТаблицяПолівВибору.ВстановитиДію("Вибір","ТЗНВибір");

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

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

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

&На Клієнті

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

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

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


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



Післямова.

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

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

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

В одній таблиці перераховані товари для відвантаження зі складу. В іншій таблиці – зобов'язання щодо оплати цих товарів.

Тому в 1С чільне місце займає робота з таблицями.

Таблиці 1С також називають «табличні частини». Вони є у довідників, документів та інших.

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

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

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

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

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

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

Таблиця на формі (товстий клієнт)

Користувач працює із таблицею, коли вона розміщена на формі.

Базові принципи роботи з формами ми з Вами обговорювали в уроці з і в уроці з

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

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

Натисніть кнопку «…» у властивості Дані. Щоб побачити список табличних частин, потрібно розкрити гілку Об'єкт.

При виборі табличної частини 1С сама додасть колонки таблиці на формі. Рядки введені користувачем у таку таблицю зберігатимуться автоматично разом із довідником/документом.

У цьому ж властивості Дані Ви можете ввести довільне ім'я і вибрати тип ТаблицяЗначень.

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

Натиснувши правою кнопкою на таблиці, Ви можете додати колонку. У властивості колонки можна вказати його ім'я (для звернення в коді 1С), заголовок колонки на формі, зв'язок з реквізитом табличної частини (останнє – якщо обрано не довільну таблицю, а табличну частину).

У властивостях таблиці на формі Ви можете вказати, чи доступно користувачеві додавати/видаляти рядки. Більш просунута форма – галочка Тільки Перегляд. Ці властивості зручно використовуватиме організації таблиць призначених висновку інформації, але з редагування.

Щоб керувати таблицею, потрібно вивести форму командну панель. Виберіть пункт Форма/Вставити елемент керування/Командна панель.

У властивостях командної панелі виберіть пункт Автозаповнення, щоб кнопки на панелі з'явилися автоматично.

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

На керованій формі зазначені дії виглядають трохи інакше. Якщо Вам потрібно розмістити на формі табличну частину, розкрийте гілку Об'єкт і перетягніть одну з табличних частин ліворуч. І все!

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

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

Після цього перетягніть таблицю вліво.

Щоб у таблиці з'явилася командна панель, у властивостях таблиці виберіть значення у розділі Використання – Положення командної панелі.

Вивантаження таблиці в Excel

Будь-яку таблицю 1С, розташовану на формі, можна роздрукувати чи вивантажити до Excel.

Для цього клацніть правою кнопкою миші на вільному місці в таблиці та виберіть пункт Вивести список.

У керованому (тонкому) клієнт аналогічні дії можна виконати за допомогою пункту меню Усі дії/Вивести список.

Питання Створення колонки таблиці значень різних типів 1С v8
Відповідь
При створенні колонки таблиці значень як тип можна передавати масив типіві можна конкретний тип. Масив типів використовується, коли потрібно вказати кілька різних типів однієї колонки.

Для вказівки типів використовується "загальний об'єкт" - "Опис типів". Тому спочатку пояснимо, що таке "Опис типів" ("Опис типів значень").

«Опис типів значень». Для опису допустимих типів значень властивостей різних об'єктів у системі використовується спеціальний об'єкт «ОписТипів». За допомогою цього об'єкта можна описувати допустимі типи значень, які можна буде надавати властивостям. Для додаткового обмеження можливих значень примітивних типів Число, Рядок та Дата передбачено кваліфікатори. Кваліфікатори описують такі параметри, як довжина рядка чи числа, допустимі частини дати тощо.

Синтаксис методу "Опис типів"

Новий ОписТипів(<Исходное описание типов>, <Добавляемые типы>, <Вычитаемые типы>, <Квалификаторы числа>, <Квалификаторы строки>, <Квалификаторы даты>)
Параметри:
<Исходное описание типов> (Необов'язковий)
Тип: ОписТипів. Початковий опис типів, на основі якого будуватиметься нове.
<Добавляемые типы> (Необов'язковий)
Тип: Масив, Рядок. Масив значень типу Тип, що складається з типів, які будуть використані в об'єкті, або рядок містить імена типів розділених комами.
<Вычитаемые типы> (Необов'язковий)
Тип: Масив, Рядок. Масив значень типу Тип (або рядок, що містить імена типів, розділених комами), що складається з типів, які будуть виключені з вихідного опису, вказаного в першому параметрі.
<Квалификаторы числа> (Необов'язковий)
Тип: КваліфікаториЧисла. Кваліфікатори числа, що описують допустимі значення числового типу.
<Квалификаторы строки> (Необов'язковий)
Тип: КваліфікаторРядки. Кваліфікатори рядка, що описують допустимі значення рядкового типу.
<Квалификаторы даты> (Необов'язковий)
Тип: КваліфікаториДати. Кваліфікатори дати, що описують допустимі значення типу Дата.
Опис:
Створює опис типів на підставі іншого опису типів шляхом додавання одних і виключення інших типів. Якщо новий кваліфікатор не вказано, залишаться кваліфікатори вихідного опису типів.
Приклад використання об'єкта «Опис типів»:

// Розширимо опис Допустимі Типи новими типамиМасив = Новий Масив; Масив. Додати(Тип( "ДовідникПосилання.Методи")); Масив. Додати(Тип("Число")); Знак = Допустимий Знак. Невід'ємний; КвЧисла = Новий КваліфікаториЧисла (10, 2, Знак); Допустимі Типи = Новий Опис Типів (Припустимі Типи, Масив, КвЧисла);
Тепер, власне, приклади коректного створення таблиці значень колонок різних типів.

Загалом достатньо визначити типи колонок таким чином:

ТЗ. Колонки. Додати( "ІндексСортування", Новий ОписТипів("Число" ) ) ; ТЗ. Колонки. Додати("Ім'яРозділу" , Новий ОписТипів("Рядок" ) ) ; ТЗ. Колонки. Додати("ДатаКорр" , Новий ОписТипів("Дата" ) ) ; ТЗ. Колонки. Додати( "Безумовне Видалення", Новий ОписТипів("Булево") ) ; ТЗ. Колонки. Додати("Номенклатура" , Новий ОписТипів() ) ; ТЗ. Колонки. Додати("ДаніРозділу" , Новий ОписТипів("Структура" ) ) ; // Приклад створення колонок "число" і "рядок" з уточненням параметрів:ТЗ. Колонки. Додати( "Відсоток виконання", Новий Опис Типів ( " Число " , Новий Кваліфікатори Числа ( 18 , 2 ) ) ) ; ТЗ. Колонки. Додати("Ім'яРозділу" , Новий ОписТипів("Рядок" , , Новий КваліфікаторРядки(200 , ДопустимаДовжина. Змінна) ) ) ; ТЗ. Колонки. Додати("ДатаСписання" , Новий ОписТипів("Дата" , , , Новий КваліфікаториДати(ЧастиниДаті. ДатаВремя) ) ) ;

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

////// формування структури ТЗ (створення колонок) //// визначимо кваліфікатори для підстановки на полях кваліфікаторів ТЗКЧ = Новий КваліфікаториЧисла (18, 9); КС = Новий Кваліфікатор Рядки(200 ) ; КД = Новий КваліфікаториДати(ЧастиниДаті. ДатаЧас) ; //// визначимо описи типів для майбутніх колонок ТЗ // Масив - це вихідний опис типів, виходячи з якого будуватися нове // Зверніть увагу, що для колонок ТЗ вихідний опис типів у цьому прикладі - масивМасив = Новий Масив; Масив. Додати(Тип("Рядок")); Опис ТипівРядок = Новий Опис Типів (Масив, , КС) ; Масив. Очистити(); Масив. Додати(Тип("Число")); Опис Типів Число = Новий Опис Типів (Масив, , , КЧ) ; Масив. Очистити(); Масив. Додати(Тип("Дата")); Опис ТипівДата = Новий Опис Типів (Масив, , , , КД) ; Масив. Очистити(); Масив. Додати(Тип( "ДовідникПосилання.Номенклатура") ) ; Опис ТипівНоменклатура = Новий Опис Типів (Масив) ; Масив. Очистити(); Масив. Додати(Тип( "ДовідникПосилання.СеріїНоменклатури") ) ; Опис Типів Серія = Новий Опис Типів (Масив) ; Масив. Очистити(); Масив. Додати(Тип( "ДовідникПосилання.Якість") ) ; Опис Типів Якість = Новий Опис Типів (Масив) ; Масив. Очистити(); Масив. Додати(Тип("Булево")); Опис Типів Бульово = Новий Опис Типів (Масив) ; // Власне додавання колонок в ТЗ (створення структури майбутньої ТЗ)ТЗ. Колонки. Додати("Номенклатура" , ОписТипівНоменклатура) ; ТЗ. Колонки. Додати("Код" , ОписТипівРядку) ; ТЗ. Колонки. Додати( "Серія Номенклатури", ОписТиповСерія) ; ТЗ. Колонки. Додати ("КонтрагентКод", Опис Типів Рядок); ТЗ. Колонки. Додати("ДатаДії" , ОписТиповДата) ; ТЗ. Колонки. Додати("Якість", ОписТипівЯкість); ТЗ. Колонки. Додати("КількістьУС" , ОписТипівЧисло) ; ТЗ. Колонки. Додати("Списувати" , ОписТипівБулеве) ; . . . //////// формування структури ТЗ (створення колонок) ////////////////////////////////////////////////////////

Про додавання рядка до таблиці значень див.