Як до таблиці значень додати елемент довідника




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

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

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


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

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


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


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


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

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


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

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


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

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


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

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

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

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

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


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

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

за індексом

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


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

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


за індексом

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

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

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

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


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

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


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

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

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

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


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

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

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


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

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

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

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

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

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

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

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

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

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

КінецьЯкщо;

КінецьЦикл;

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

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

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

КінецьЦикл;

КінецьЦикл;


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

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

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

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

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


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

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

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


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&На Клієнті

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

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

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


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



Післямова.

Сподіваюся, стаття допоможе тим програмістам 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 – послідовний доступ до результатів запиту

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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