THE BELL

Є ті, хто прочитали цю новину раніше вас.
Підпишіться, щоб отримувати статті свіжими.
Email
ім'я
Прізвище
Як ви хочете читати The Bell
без спаму

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

& НаКліенте

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

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

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


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



Післямова.

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

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

Опубліковано 21 Вересень 2011

Таблиця значень 1С - 3 частина. Метадані. Перебір колонок таблиці значень

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

Для пояснення матеріалу і для того, щоб можна було запустити наші приклади програмного коду "в живу", нам необхідна якась тестова таблиця значень 1С. Частина наших прикладів буде отримувати дані з таблиці значень, тому ми зробимо таблицю з трьома колонками "Прізвище", "Ім'я", "По батькові" і внесемо в неї невелика кількість даних - аж цілих 3 рядки :)

Отже, створимо тестову таблицю значень 1С і заповнимо її:

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

Наша тестова таблиця складається з трьох колонок: Ім'я, Прізвище, По батькові; і має три заповнених рядки з прізвищами героїв Громадянської війни.

Перший зразок коду - перебір колонок таблиці значень 1С як колекції.

// виводимо назви всіх колонок ТЗ Для Кожного Колонка З МояТЗ.Колонкі Цикл Повідомити ( "Ім'я колонки:" + Колонка.Імя); КонецЦікла;

Наш цикл виведе у вікно повідомлень 1С все імена колонок:

Ім'я колонки: Прізвище Ім'я колонки: Ім'я Ім'я колонки: По батькові

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

Наприклад, звертаючись до властивості "Ім'я" (Колонка.Імя) Ми отримуємо ім'я поточної колонки.

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

// виводимо назви всіх колонок ТЗ Для Кожного МояТекущаяКолонка З МояТЗ.Колонкі Цикл Повідомити ( "Ім'я колонки:" + МояТекущаяКолонка.Імя); КонецЦікла;

Коли виконуюча підсистема 1С зустрічає цикл такого вигляду, при кожному проході циклу вона привласнює змінної з зазначеним ім'ям один елемент з нашої колекції, в даному випадку - один елемент колекції колонок таблиці значень МояТЗ.Колонкі А далі ми звертаємося до змінної, яка містить в собі поточну колонку, і використовуємо властивість "Ім'я".

Пропоную поруч з ім'ям колонки вивести ще й номер кожної колонки в колекції колонок:

// виводимо номер і назви всіх колонок таблиці значень Для Кожного Колонка З МояТЗ.Колонкі Цикл НомерКолонкі \u003d МояТЗ.Колонкі.Індекс (Колонка); // отримуємо номер колонки ІмяКолонкі \u003d Колонка.Імя; // отримуємо ім'я колонки Повідомити ( "Номер колонки:" + НомерКолонкі + "Ім'я колонки:" + ІмяКолонкі); КонецЦікла;

У вікно повідомлень 1С буде виведений текст:

Номер колонки: 0 Ім`я колонки: Прізвище Номер колонки: 1 Ім'я колонки: Ім'я Номер колонки: 2 Ім'я колонки: По батькові

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

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

Щоб дізнатися кількість колонок в таблиці значень, ми використовуємо метод "Кількість ()" у колекції колонок.

КолічествоКолонок \u003d МояТЗ.Колонкі.Колічество (); Повідомити (КолічествоКолонок);

На екрані буде виведена цифра "3". Дійсно, в нашій таблиці три колонки: "Прізвище", "Ім'я", "По батькові"

Отримання об'єкта-колонки по її номеру (індексу) і перебір колонок за допомогою індексу колонок

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

Для Сч \u003d 0 За МояТЗ.Колонкі.Колічество () - 1 Цикл ТекущаяКолонка \u003d МояТЗ.Колонкі [Сч]; Повідомити (ТекущаяКолонка.Імя); КонецЦікла;

На екрані ми отримаємо наступне

Прізвище ім'я по батькові

Думаю, що цей приклад був зрозумілий. Ми звернулися до методу Кількість () колекції колонок " МояТЗ.Колонкі.Колічество ()", Отримали кількість колонок, і запустили цикл з лічильником від нуля до кількість колонок мінус один. Всередині циклу ми отримуємо кожну колонку з колекції колонок і присвоюємо поточний об'єкт-колонку в змінну ТекущаяКолонка Далі, у змінної ТекущаяКолонка ми звертаємося до властивості ім'я і виводимо значення цієї властивості на екран: Повідомити (ТекущаяКолонка.Імя);

Важливо ніколи не плутати властивість об'єкта і метод об'єкта.

Властивість - це якась статична величина і звернення до нього пишеться без дужок, наприклад ТекущаяКолонка.Імя. А метод - це по суті, процедура або функція об'єкта, а виклики процедур і функцій завжди пишуться з дужками (навіть якщо немає вхідних параметрів). наприклад: МояТЗ.Колонкі.Колічество ()

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

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

Поле об'єкта не виявлено (Кількість)

В даному випадку "поле" і "властивість" слід розуміти як синоніми, або неточність термінології розробників 1С. Вони використовують обидва цих слова для позначення одного і того ж поняття. Хоча в інших мовах програмування ці терміни можуть означати різні поняття.

Отримання даних з таблиці значень 1С за допомогою номерів колонок

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

ПерваяСтрока \u003d МояТЗ; // отримуємо перший рядок (нумерація з нуля) ЗначеніеПервойКолонкі \u003d ПерваяСтрока; // отримуємо значення першої колонки (нумерація колонок теж з нуля) Повідомити (ЗначеніеПервойКолонкі); // виводимо на екран значення першого стовпчика в першому рядку таблиці

На екран буде виведено:

Чапаєв

Спочатку ми отримали об'єкт-рядок таблиці значень, звернувшись до таблиці значень за допомогою оператора [...]. (Якщо забули, як це робиться, можна подивитися попередні статті) Всередину оператора ми передали аргумент "0". Це індекс першого рядка таблиці значень. ПерваяСтрока \u003d МояТЗ;

Далі, до об'єкта-рядку ми теж маємо право звернутися за допомогою оператора [...]. Всередину цього оператори ми передали номер стовпця таблиці значень, в даному випадку теж "0". І, таким чином, ми отримали значення стовпця з номером "0" для поточного рядка таблиці під номером "0". Це значення ми вивели на екран і воно являє собою рядок "Чапаєв".

Трохи ускладнити наш приклад:

ПерваяСтрока \u003d МояТЗ; // отримуємо перший рядок (нумерація з нуля) Повідомити (ПерваяСтрока); // виводимо на екран значення першого стовпчика в першому рядку таблиці Повідомити (ПерваяСтрока); // виводимо на екран значення другого стовпця в першому рядку таблиці Повідомити (ПерваяСтрока); // виводимо на екран значення третього стовпчика в першому рядку таблиці

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

Чапаєв Василь Іванович

Тепер я ще модифікує цей приклад, щоб нам обійтися без змінної "ПерваяСтрока"

Повідомити (МояТЗ); // виводимо на екран значення першого стовпчика в першому рядку таблиці Повідомити (МояТЗ); // виводимо на екран значення другого стовпця в першому рядку таблиці Повідомити (МояТЗ); // виводимо на екран значення третього стовпчика в першому рядку таблиці

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

Чапаєв Василь Іванович

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

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

Для СчетчікСтрок \u003d 0 За МояТЗ.Колічество () - 1 Цикл // цикл перебору рядків Для СчетчікКолонок \u003d 0 За МояТЗ.Колонкі.Колічество () - 1 Цикл // вкладений цикл перебору стовпців // отримуємо значення осередки (з поточного рядка і поточної колонки) ЗначеніеЯчейкі \u003d МояТЗ [СчетчікСтрок] [СчетчікКолонок]; // виводимо на екран номер рядка, номер колонки і значення комірки Повідомити ( "Рядок №" + СчетчікСтрок + "стовпець №" + СчетчікКолонок + "\u003d" + ЗначеніеЯчейкі); КонецЦікла; КонецЦікла;

На екран буде виведено наступне:

Рядок №0 стовпець №0 \u003d Чапаєв рядок №0 стовпець №1 \u003d Василь рядок №0 стовпець №2 \u003d Іванович рядок №1 стовпець №0 \u003d Дзержинський рядок №1 стовпець №1 \u003d Фелікс рядок №1 стовпець №2 \u003d Едмундович рядок № 2 стовпець №0 \u003d Котовський Рядок №2 стовпець №1 \u003d Григорій Рядок №2 стовпець №2 \u003d Іванович

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

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

Для СчетчікСтрок \u003d 0 За МояТЗ.Колічество () - 1 Цикл // цикл перебору рядків Повідомити ( "\u003d\u003d\u003d\u003d\u003d\u003d\u003d Рядок №" + СчетчікСтрок + "\u003d\u003d\u003d\u003d\u003d\u003d\u003d"); Повідомити ( ""); // новий рядок (вставка порожнього рядка) Для СчетчікКолонок \u003d 0 За МояТЗ.Колонкі.Колічество () - 1 Цикл // вкладений цикл перебору стовпців // отримуємо значення осередки (з поточного рядка і поточної колонки) ЗначеніеЯчейкі \u003d МояТЗ [СчетчікСтрок] [ СчетчікКолонок]; // отримуємо ім'я колонки ІмяКолонкі \u003d МояТЗ.Колонкі [СчетчікКолонок] .Імя; // виводимо на екран ім'я колонки і значення комірки Повідомити (ІмяКолонкі + ":" + ЗначеніеЯчейкі); КонецЦікла; Повідомити ( ""); // новий рядок (вставка порожнього рядка) КонецЦікла;

Зараз, на нашому екрані інформація стала виглядати більш представницький:

Рядок № 0 \u003d\u003d\u003d\u003d\u003d\u003d\u003d Прізвище: Чапаєв Ім'я: Василь По батькові: Іванович \u003d\u003d\u003d\u003d\u003d\u003d\u003d рядок № 1 \u003d\u003d\u003d\u003d\u003d\u003d\u003d Прізвище: Дзержинський Ім'я: Фелікс батькові: Едмундович \u003d\u003d\u003d\u003d\u003d \u003d\u003d Рядок № 2 \u003d\u003d\u003d\u003d\u003d\u003d\u003d Прізвище: Котовський Ім'я: Григорій батькові: Іванович

Так, мало не забув. При використанні поспіль двох операторів [...] [...], ми можемо замість індексу колонки передавати ім'я цієї колонки: ТабліцаЗначеній [ІндексСтрокі] [ІмяКолонкі]

Для СчетчікСтрок \u003d 0 За МояТЗ.Колічество () - 1 Цикл // цикл перебору рядків Повідомити ( "\u003d\u003d\u003d\u003d\u003d\u003d\u003d Рядок №" + СчетчікСтрок + "\u003d\u003d\u003d\u003d\u003d\u003d\u003d"); Повідомити ( ""); // новий рядок (вставка порожнього рядка) Для СчетчікКолонок \u003d 0 За МояТЗ.Колонкі.Колічество () - 1 Цикл // вкладений цикл перебору стовпців ІмяКолонкі \u003d МояТЗ.Колонкі [СчетчікКолонок] .Імя; // отримуємо ім'я колонки ЗначеніеЯчейкі \u003d МояТЗ [СчетчікСтрок] [ІмяКолонкі]; //

Зверніть увагу на рядок, зазначену стрілочкою ". У цьому рядку ми замість індексу поточної колонки передаємо ім'я поточної колонки в аргумент в квадратних дужках [...] Результат буде той же самий.

А зараз, останнім в цій статті.

ПРАВИЛЬНЕ отримання всіх даних таблиці значень 1С, за допомогою циклів перебору колекції рядків і колекції колонок

Для Кожного ТекущаяСтрока З МояТЗ Цикл // цикл перебору колекції рядків Повідомити ( "\u003d\u003d\u003d\u003d\u003d\u003d\u003d Рядок №" + МояТЗ.Індекс (ТекущаяСтрока) + "\u003d\u003d\u003d\u003d\u003d\u003d\u003d"); Повідомити ( ""); Для Кожного ТекущаяКолонка З МояТЗ.Колонкі Цикл // вкладений цикл перебору колекції стовпців ІмяКолонкі \u003d ТекущаяКолонка.Імя; // отримуємо ім'я колонки ЗначеніеЯчейкі \u003d ТекущаяСтрока [ІмяКолонкі]; // отримуємо значення осередку НА ІМ'Я колонки Повідомити (ІмяКолонкі + ":" + ЗначеніеЯчейкі); // виводимо на екран ім'я колонки і значення комірки КонецЦікла; Повідомити ( ""); КонецЦікла;

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

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

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

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

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

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-weig ht: 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С чільне місце займає робота з таблицями.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1. Знайти

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

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

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

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


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

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

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


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

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

Ось є для початку невеликий фак - прості приклади роботи з таблицею значень:

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

ТабліцаЗначеній \u003d Новий ТабліцаЗначеній;


2. Створити колонки таблиці значень:

ТабліцаЗначеній.Колонкі.Добавіть ( "Ім'я");
ТабліцаЗначеній.Колонкі.Добавіть ( "Прізвище");


3. Додати нові рядки використовуючи імена колонок:


НоваяСтрока.Імя \u003d "Василь";
НоваяСтрока.Фамілія \u003d "Пупкін";


4. Як шукати значення в таблиці значень:
Необхідно знайти рядок таблиці містить дані значення.

НайденнаяСтрока \u003d ТабліцаЗначеній.Найті (ІскомоеЗначеніе);


5. Знайти перше входження в певних колонках таблиці значень

НайденнаяСтрока \u003d ТабліцаЗначеній.Найті (ІскомоеЗначеніе, "Постачальник, Покупець");


6. Якщо треба знайти всі входження в таблиці значень:
Використовуємо структуру пошуку.

СтруктураПоіска \u003d Структура ( "Співробітник", ІскомоеЗначеніе);
МассівНайденнихСтрок \u003d ТабліцаЗначеній.НайтіСтрокі (СтруктураПоіска);


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

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

Для Кожного ТекущаяСтрока З ТабліцаЗначеній Цикл
Повідомити (ТекущаяСтрока.Імя);
КонецЦікла;

Теж саме використовуючи індекси:

СтаршійІндекс \u003d ТабліцаЗначеній.Колічество () - 1;
Для Сч \u003d 0 по СтаршійІндекс Цикл
Повідомити (ТабліцаЗначеній [Сч] .Імя);
КонецЦікла;


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

ТабліцаЗначеній.Удаліть (УдаляемаяСтрока);

за індексом

ТабліцаЗначеній.Удаліть (0);


9. Видалення наявної колонки таблиці значень

ТабліцаЗначеній.Колонкі.Удаліть (УдаляемаяКолонка);


за індексом

ТабліцаЗначеній.Колонкі.Удаліть (0);

Необхідно враховувати, що видалення рядка (або колонки) «з середини» таблиці значень призведе до зменшення на одиницю індексів рядків, що стояли «після» віддаленої

10. Як заповнити таблицю значень, якщо імена колонок містяться в змінних?

НоваяСтрока \u003d ТабліцаЗначеній.Добавіть ();
НоваяСтрока [ІмяКолонкі] \u003d Значення;


11. Як заповнити всю колонку таблиці значень потрібним значенням?
Колонку ФлагФіскальногоУчета в таблиці значень ТабліцаЗначеній необхідно заповнити значенням Брехня

ТабліцаЗначеній.ЗаполнітьЗначенія (Брехня, "ФлагФіскальногоУчета");


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

12. Як таблицю значень «ТабліцаПолучатель» заповнити даними таблиці значень «ІсходнаяТабліца»?

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

ТабліцаПолучатель \u003d ТабліцаІсходная.Скопіровать ();


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

Часткове перенесення даних для колонок з однаковими іменами:

Для Кожного СтрокаІсходнойТабліци З ІсходнаяТабліца Цикл
ЗаполнітьЗначеніяСвойств (НоваяСтрока, СтрокаІсходнойТабліци);
КонецЦікла


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

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

Повне копіювання даних для колонок з однаковими іменами

ОдноіменниеКолонкі \u003d Новий Масив ();

Для Кожного Колонка З ІсходнаяТабліца.Колонкі Цикл
СовпадающаяКолонка \u003d ТабліцаПолучатель.Колонкі.Найті (Колонка.Імя);

якщо СовпадающаяКолонка<> Не визначено Тоді

// Отримати властивості колонки.
Ім'я \u003d Колонка.Імя;
ТіпЗначенія \u003d Колонка.ТіпЗначенія;
Тема \u003d Колонка.Заголовок;
Ширина \u003d Колонка.Шіріна;

// Замінити колонки в таблиці-одержувачі.
Індекс \u003d ТабліцаПолучатель.Колонкі.Індекс (СовпадающаяКолонка);

ТабліцаПолучатель.Колонкі.Удаліть (Індекс);
ТабліцаПолучатель.Колонкі.Вставіть (Індекс, Ім'я, ТіпЗначенія, Тема, Ширина);

// Додати чергове ім'я збігаються колонок в масив.
ОдноіменниеКолонкі.Добавіть (Колонка.Імя);

КонецЕсли;

КонецЦікла;

// Цикл перебору рядків вихідної таблиці.
Для кожного СтрокаІсходнойТабліци З ІсходнаяТабліца Цикл

// Додати новий рядок в таблицю-одержувач.
НоваяСтрока \u003d ТабліцаПолучатель.Добавіть ();

// Заповнити значення в співпадаючих осередках.
Для кожного ІмяКолонкі З ОдноіменниеКолонкі Цикл
НоваяСтрока [ІмяКолонкі] \u003d СтрокаІсходнойТабліци [ІмяКолонкі];

КонецЦікла;

КонецЦікла;


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

13. Як додати колонки до таблиці значень «ТабліцаЗначеній» з обмеженнями по типу?

При додаванні колонки можна просто вказати її ім'я, а другий параметр методу Додати () не чіпати. У цьому випадку тип даних колонки - довільний.

Додавання колонки без вказівки типу даних

// Додати колонку без обмежень по типу.
ТабліцаЗначеній.Колонкі.Добавіть ( "Об'єкт");


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

Додавання колонки із зазначенням типу даних

// Обмеження за типами даних колонки:
// Тільки елементи довідника "Контрагенти".
ТабліцаЗначеній.Колонкі.Добавіть ( "Контрагент", Новий ОпісаніеТіпов ( "СправочнікСсилка.Контрагенти"));


Якщо серед типів, дозволених до заповнення даних колонки, є рядок, можна обмежити її розрядність (довжину), вказати використання змінної або фіксованої довжини. Все це забезпечується створенням об'єкта за допомогою конструктора КваліфікаториСтрокі. Далі цей об'єкт буде використаний в якості одного з параметрів конструктора ОпісаніеТіпов.

Використання кваліфікаторів для уточнення типу даних колонки таблиці значень

// Підготовка та установка обмежень для даних типу Рядок.
КваліфікаториСтрокі \u003d Новий КваліфікаториСтрокі (20, ДопустімаяДліна.Переменная);
ДопустімиеТіпи \u003d Новий ОпісаніеТіпов ( "Рядок", КваліфікаториСтрокі);
ТабліцаЗначеній.Колонкі.Добавіть ( "ПрімечаніеСтроковоеКороткое", ДопустімиеТіпи);


Аналогічні дії можна здійснювати стосовно кваліфікаторів числа і дати.
Зверніть увагу: опис типів можна будувати конструктором як «з нуля», так і використовувати в якості основи вже існуюче опис типів

Використання існуючих описів типів для вказівки типу даних колонки таблиці значень

// Розширення вже використаного раніше опису типів.
КваліфікаториЧісла \u003d Новий КваліфікаториЧісла (10, 2, ДопустімийЗнак.Неотріцательний);
КваліфікаториДати \u003d Новий КваліфікаториДати (ЧастіДати.Дата);
РасшіренниеДопустімиеТіпи \u003d Новий ОпісаніеТіпов (ДопустімиеТіпи, "Число, Дата", КваліфікаториЧісла, КваліфікаториДати);

ТабліцаЗначеній.Колонкі.Добавіть ( "Примітка", РасшіренниеДопустімиеТіпи);

THE BELL

Є ті, хто прочитали цю новину раніше вас.
Підпишіться, щоб отримувати статті свіжими.
Email
ім'я
Прізвище
Як ви хочете читати The Bell
без спаму