1с 8.3 структура таблицю значень

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&На Клієнті

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

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

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


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



Післямова.

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

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

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

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

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


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

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


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


НоваРядок.Ім'я = "Василь";
НоваРядок.Прізвище = "Пупкін";


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

ЗнайденаРядок = ТаблицяЗначень.Знайти(ШуканийЗначення);


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

ЗнайденаРядок = ТаблицяЗначень.Знайти(ШуканеЗначення, "Постачальник, Покупець");


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

СтруктураПошук = Структура("Співробітник", ШуканеЗначення);
МасивЗнайденихРядок = ТаблицяЗначень.ЗнайтиРядки(СтруктураПошуку);


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

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

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

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

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


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

ТаблицяЗначень.Видалити(Видалити Рядок);

за індексом

ТаблицяЗначень.Видалити(0);


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

ТаблицяЗначень.Колонки.Видалити(ВилученаКолонка);


за індексом

ТаблицяЗначень.Колонки.Видалити(0);

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

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

НовийРядок = ТаблицяЗначень.Додати();
НовийРядок[Ім'яКолонки] = Значення;


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

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


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

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

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

ТаблицяОтримувач = ТаблицяВихідна.Скопіювати();


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

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

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


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

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

Повне копіювання даних для колонок з іменами, що збігаються.

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

Для кожного Колонка З ВихіднаТаблиця.Колонки Цикл
ЗбігаючаКолонка = ТаблицяОтримувач.Колонки.Знайти(Колонка.Ім'я);

Якщо ЗбігаючаКолонка<>Невизначено Тоді

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

// Замінити колонки у таблиці-одержувачі.
Індекс = ТаблицяОтримувач.Колонки.Індекс(ЗбігаючаКолонка);

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

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

КінецьЯкщо;

КінецьЦикл;

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

// Додати новий рядок у таблицю-одержувач.
НовийРядок = ТаблицяОтримувач.Додати();

// Заповнити значення в комірках, що збігаються.
Для кожного Ім'яКолонки З ОдноіменніКолонки Цикл
НоваРядок[Ім'яКолонки] = РядокВихідноїТаблиці[Ім'яКолонки];

КінецьЦикл;

КінецьЦикл;


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

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

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

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

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


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

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

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


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

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

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


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

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

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

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

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

1. Знайти

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

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

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

2. ЗнайтиРядки


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

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

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


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

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