1С добавить значение в таблицу значений

Таблица значений 1С – предназначена для хранения и обработки данных. Очень часто используется программистами для хранения временных (промежуточных) данных.

В таблицах значений существуют строки и колонки. У каждой строки есть индекс, он начинается с 0 (нуля). Таблицу значений можно создавать с различными колонками и добавлять в нее строки. По строкам в таблице можно делать выборку и поиск, устанавливать и получать значения, сортировать, группировать и удалять строки.

Далее постараюсь дам ответы на вопросы, касающиеся таблиц значений 1С.

Как можно создать новую таблицу значений?

Функция создает таблицу значений с колонками «КолКод», «КолНоменклатура» и «КолКоличество».

Как добавить новую колонку с определенным типом и заголовком?

Функция добавляет колонку «КолКоличество» с типом «Число», длиной в 9 символов и с точностью в 2 символа.

Как можно добавить новые строки?

Функция делает выборку по номенклатуре и добавляет полученные данные в таблицу значений.

Как выгрузить результат запроса в таблицу значений?

Функция делает запрос по номенклатуре и выгружает результат в таблицу значений. Колонка будет одна «СсылкаНоменклатура».

Как сделать выборку строк в таблице значений?

Для Каждого СтрокаТаб Из ТабЗначений Цикл
Сообщить(СтрокаТаб.КолНоменклатура);
КонецЦикла;

или

Функция делает выборку по таблице значений и сообщает все элементы, которые находятся в колонке «Номенклатура». В первом примере выборка идет по строкам, а во втором строки получаем по индексу.

Как сделать выборку строк в таблице значений с отбором?

// Создаем отбор
ОтборСтруктура = Новый Структура;
ОтборСтруктура.Вставить(«КолНоменклатура «, СсылкаНоменклатура);
// Используем отбор в поиске строк
ТабЗначенийСтроки = ТабЗначений.НайтиСтроки(ОтборСтруктура);
Для Каждого СтрокаТаб Из ТабЗначенийСтроки Цикл
Сообщить(СтрокаТаб.КолКоличество);
КонецЦикла;

Функция делает выборку по таблице значений с отбором по колонке «Номенклатура».

Как сделать сортировку?

ТабЗначений.Сортировать(«КолКод Убыв, КолНоменклатура Возр»);

Функция делает сортировку таблицы по колонкам «КолКод» по убыванию и «КолНоменклатура» по возрастанию.

Как вычислить итоги по колонке?

ИтогКоличество = ТабЗначений.Итог(«КолКоличество»);

Функция получает итоги по колонке «КолКоличество» и записывает их в переменную «ИтогКоличество».

Как сделать копию таблицы значений?

КопияТабЗначений = ТабЗначений.Скопировать();

Функция делает полную копию таблицы «ТабЗначений» в таблицу «КопияТабЗначений».

Как свернуть таблицу значений по колонке Номенклатура и суммировать по количеству?

ТабЗначений.Свернуть(«КолНоменклатура», «КолКоличество»);

Функция сворачивает таблицу по колонке «Номенклатура» и суммирует колонку «Количество». Если существуют еще колонки, то они будут удалены.

Как найти строку в таблице значений по значению?

НайтиСтрока = ТабЗначений.Найти(СсылкаНоменклатура);

Функция делает поиск по таблице и возвращает строку если строка найдена.

Как удалить строку или полностью очистит таблицу значений?

ТабЗначений.Удалить(0); // Удалит первую строку по индексу
ТабЗначений.Очистить(); // Полностью очистить таблицу

Как установить и получить значение?

ПерваяСтрока = ТабЗначений.Получить(0);

Функция получает строку из таблицы значений по индексу

Как вставить значение в таблицу?

НоваяСтрока = ТабЗначений.Вставить(1);
НоваяСтрока.КолНоменклатура = ТекНоменклатура;
НоваяСтрока.КолКоличество = 5;

Функция вставляет строку по индексу и устанавливает значения.

Дополнительные функции, которые упрощают работу с таблицей значений в 1С

Содержание

Документы

  • Как создать новый документ?
  • Как найти документ?
  • Как открыть форму документа?
  • Как изменить значение реквизита и записать документ?
  • Как удалить строки из табличной части документа?
  • Как перебрать строки документа?
  • Как выгрузить табличную часть документа?
  • Как посчитать итог в табличной части документа?
  • Как провести документ?
  • Как перебрать документы?
  • Как пометить на удаление все приходные накладные?
  • Как определить, по каким регистрам документ выполнил движения?
  • Как в табличной части документа удалить строки с нулевым значением реквизита «Количество»?
  • Как очистить колонку «СтавкаНДС» в табличном поле «Товары» уже заполненного документа?
  • Как заполнить значения свойств нового документа на основании существующего?
  • Как получить перечень приходных накладных, в которых не заполнены номенклатурные позиции?
  • Как на дату расходной накладной определить курс валюты управленческого учета? Валюта управленческого учета храниться в периодическом регистре сведений.
  • Как из формы документа вызвать его неоперативное проведение?
  • Как в обработке проведения получить остатки, актуальные на позицию документа?
  • Как определить количество документов и количество разных значений реквизита в таблице записей документа?
  • В последовательность «ПартионныйУчет» добавлено измерение «Организация». Как теперь получить данные по границам последовательности для каждого значения этого измерения?

Как создать новый документ?

НовыйДокумент = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент(); НовыйДокумент.Дата = ТекущаяДата();

Как найти документ?

ИскомыйДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(НомерДок, Дата(2005, 1, 1)); Если НЕ ИскомыйДокумент.Пустая() Тогда // Выполнить действия в случае обнаружения такого документа. … КонецЕсли;

Как открыть форму документа?

Форма = ИскомыйДокумент.ПолучитьФорму(); Форма.Открыть();

Как изменить значение реквизита и записать документ?

ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект(); ДокОбъект.Ответственный = глТекущийПользователь; ДокОбъект.Записать(); // Запись с проведением документа ДокОбъект.Записать(РежимЗаписиДокумента.Проведение); // Запись с отменой проведения ДокОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);

Как добавить строку в табличную часть документа, имея ссылку на документ?

ОбъектДок = Док.ПолучитьОбъект(); НоваяСтрока = ОбъектДок.Товары.Добавить(); // Заполнить значения реквизитов. НоваяСтрока.Количество = 10; НоваяСтрока.Цена = 55; // Записать документ. ОбъектДок.Записать();

Как удалить строки из табличной части документа?

ОбъектДокумента = Документ.ПолучитьОбъект(); ОбъектДокумента.Товары.Очистить();

Как перебрать строки документа?

Для Каждого ТекущаяСтрока Из Документ.Товары Цикл // Действия со строкой табличной части. КонецЦикла; СтаршийИндекс = Документ.Товары.Количество() — 1; Для Сч = 0 по СтаршийИндекс Цикл // Действия со строкой табличной части. КонецЦикла;

Как выгрузить табличную часть документа?

ТаблицаТоваровДокумента = Документ.Товары.Выгрузить();

Как посчитать итог в табличной части документа?

ВсегоПоКолонкеСумма = Документ.Товары.Итог(«Сумма»);

Как провести документ?

НужныйДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

Как перебрать документы?

ВыборкаДокументов = Документы.Расходная.Выбрать(НачалоГода(ТекущаяДата()), КонецГода(ТекущаяДата())); Пока ВыборкаДокументов.Следующий() Цикл // Действия с документом — элементом выборки, // его значение содержится в переменной ВыборкаДокументов КонецЦикла Запрос = Новый Запрос; Запрос.Текст = » |ВЫБРАТЬ | РеализацияТоваровУслуг.Ссылка |ИЗ | Документ. РеализацияТоваровУслуг КАК РеализацияТоваровУслуг |ГДЕ | РеализацияТоваровУслуг.Контрагент = &Контрагент | И | (РеализацияТоваровУслуг.Номер < 100 | ИЛИ | РеализацияТоваровУслуг.Дата < ДАТАВРЕМЯ(2005, 1, 1)) | И | РеализацияТоваровУслуг.Товары.Номенклатура В ИЕРАРХИИ(&Номенклатура)»; Запрос.УстановитьПараметр(«Контрагент», ОтбКонтрагент); Запрос.УстановитьПараметр(«Номенклатура», ОтбНоменклатура); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл // действия с документом — элементом выборки, // его значение содержится в переменной Выборка КонецЦикла;

Как пометить на удаление все приходные накладные?

ДокументыВида = Документы.ПоступлениеТоваровУслуг.Выбрать(); Пока ДокументыВида.Следующий() Цикл ДокОбъект = ДокументыВида.ПолучитьОбъект(); ДокОбъект.УстановитьПометкуУдаления(Истина); КонецЦикла;

Как, имея ссылку на документ, создать в базе его копию?

ДокументКопия = ИсходныйДокумент.Скопировать(); ДокументКопия.Дата = РабочаяДата; ДокументКопия.Записать(); ДокументКопия.Дата = ИсходныйДокумент.Дата;

Как, имея ссылку на документ, прочитать его движения по регистру?

Запрос = Новый Запрос; Запрос.Текст =»ВЫБРАТЬ * |ИЗ | РегистрНакопления.ОстаткиНоменклатуры КАК ОстаткиНоменклатуры |ГДЕ | ОстаткиНоменклатуры.Регистратор = &Регистратор»; Запрос.УстановитьПараметр(«Регистратор», ПолеВводаРегистратор); НаборЗаписейРегистра = Движения.ОстаткиНоменклатуры; НаборЗаписейРегистра.Прочитать(); Для Каждого Запись из НаборЗаписейРегистра Цикл // Чтение и модификация очередного движения. КонецЦикла; Для Каждого НаборЗаписейРегистра из Движения Цикл НаборЗаписейРегистра.Прочитать(); Для Каждого Запись из НаборЗаписейРегистра Цикл // Чтение и модификация очередного движения. КонецЦикла; КонецЦикла;

Как определить, по каким регистрам документ выполнил движения?

ВЫБРАТЬ ПЕРВЫЕ 1 «Внутренние заказы» КАК Регистр ИЗ РегистрНакопления.ВнутренниеЗаказы КАК ВнутренниеЗаказы ГДЕ ВнутренниеЗаказы.Регистратор = &Регистратор ОБЪЕДИНИТЬ ВЫБРАТЬ ПЕРВЫЕ 1 «Заказы поставщикам» КАК Регистр ИЗ РегистрНакопления.ЗаказыПоставщикам КАК ЗаказыПоставщикам ГДЕ ЗаказыПоставщикам.Регистратор = &Регистратор ОБЪЕДИНИТЬ ВЫБРАТЬ ПЕРВЫЕ 1 «Размещение заказов покупателей» КАК Регистр ИЗ РегистрНакопления.РазмещениеЗаказовПокупателей КАК РазмещениеЗаказовПокупателей ГДЕ РазмещениеЗаказовПокупателей.Регистратор = &Регистратор ОБЪЕДИНИТЬ ВЫБРАТЬ ПЕРВЫЕ 1 «Товары в резерве на складах» КАК Регистр ИЗ РегистрНакопления.ТоварыВРезервеНаСкладах КАК ТоварыВРезервеНаСкладах ГДЕ ТоварыВРезервеНаСкладах.Регистратор = &Регистратор

Как в табличной части документа удалить строки с нулевым значением реквизита «Количество»?

ОбъектДок = СсылкаДок.ПолучитьОбъект(); СтруктураДляПоиска = Новый Структура(«Количество», 0); ТабличнаяЧастьДок = ОбъектДок.Товары; МассивПустыхСтрок = ТабличнаяЧастьДок.НайтиСтроки(СтруктураДляПоиска); Для каждого Строка Из МассивПустыхСтрок Цикл ТабличнаяЧастьДок.Удалить(Строка); КонецЦикла; ОбъектДок.Записать(); СтруктураДляПоиска = Новый Структура(«Количество», 0); МассивПустыхСтрок = Товары.НайтиСтроки(СтруктураДляПоиска); Для каждого Строка Из МассивПустыхСтрок Цикл Товары.Удалить(Строка); КонецЦикла;

Как очистить колонку «СтавкаНДС» в табличном поле «Товары» уже заполненного документа?

Процедура ТоварыСтавкаНДСПриИзменении(Элемент) // Рассчитать реквизиты табличной части. РассчитатьСуммуНДСТабЧасти(ЭлементыФормы.Товары.ТекущиеДанные, ЭтотОбъект); КонецПроцедуры // ТоварыСтавкаНДСПриИзменении() Для Каждого Строка из Товары Цикл Строка.СтавкаНДС = Неопределено; // Передать управление на процедуру, вызываемую // из обработчика события «ПриИзменении» для поля ввода «СтавкаНДС» ЭлементыФормы.Товары.ТекущаяСтрока = Строка; РассчитатьСуммуНДСТабЧасти(ЭлементыФормы.Товары.ТекущиеДанные, ЭтотОбъект); КонецЦикла;

Как заполнить значения свойств нового документа на основании существующего?

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

Как получить перечень приходных накладных, в которых не заполнены номенклатурные позиции?

Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ РАЗЛИЧНЫЕ | ПриходнаяТовары.Ссылка как Накладные |ИЗ | Документ.ПоступлениеТоваровУслуг.Товары КАК ПриходнаяТовары |ГДЕ | ПриходнаяТовары.Номенклатура = &ПустаяНоменклатура»; Запрос.УстановитьПараметр(«ПустаяНоменклатура», Справочники.Номенклатура.ПустаяСсылка()); ТаблицаНакладных = Запрос.Выполнить();

Как на дату расходной накладной определить курс валюты управленческого учета?

ВЫБРАТЬ КурсыВалютСрезПоследних.Валюта КАК ВалютаУпр, КурсыВалютСрезПоследних.Курс КАК КурсУпр ИЗ РегистрСведений.КурсыВалют.СрезПоследних(&ДатаДокумента, Валюта В (ВЫБРАТЬ УчетнаяПолитикаСрезПоследних.ВалютаУправленческая ИЗ РегистрСведений.УчетнаяПолитика.СрезПоследних(&ДатаДокумента, ) КАК УчетнаяПолитикаСрезПоследних ) ) КАК КурсыВалютСрезПоследних

Как из формы документа вызвать его неоперативное проведение?

Процедура ОсновныеДействияФормыОК(Кнопка) ЭтаФорма.ИспользоватьРежимПроведения = ИспользованиеРежимаПроведения.Неоперативный; ЗаписатьВФорме(РежимЗаписиДокумента.Проведение); Закрыть(); КонецПроцедуры

Как в обработке проведения получить остатки, актуальные на позицию документа?

Запрос.Текст = » ВЫБРАТЬ | ВзаиморасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток, | ВзаиморасчетыСКонтрагентамиОстатки.СуммаУпрОстаток |ИЗ | РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&ПараметрПериод, | ДоговорКонтрагента = &Договор | И | Сделка =&Сделка) КАК ВзаиморасчетыСКонтрагентамиОстатки»; Запрос.УстановитьПараметр(«ПараметрПериод», МоментВремени());

Как определить количество документов и количество разных значений реквизита в таблице записей документа?

ВЫБРАТЬ КОЛИЧЕСТВО(РегистрацияПростоевВОрганизации.Ссылка) КАК Случаев, КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегистрацияПростоевВОрганизации.ФизЛицо) КАК Работников ИЗ Документ.РегистрацияПростоевВОрганизации КАК РегистрацияПростоевВОрганизации ГДЕ РегистрацияПростоевВОрганизации.Проведен

В последовательность «ПартионныйУчет» добавлено измерение «Организация». Как теперь получить данные по границам последовательности для каждого значения этого измерения?

ТаблицаГраниц = Последовательности.ПартионныйУчет.ПолучитьГраницы(«Организация»); Для Каждого СтрокаТаблицыГраниц Из ТаблицаГраниц Цикл Организация = СтрокаТаблицыГраниц.Организация; ДатаГП = СтрокаТаблицыГраниц.Граница.Дата; СсылкаГП = СтрокаТаблицыГраниц.Граница.Ссылка; КонецЦикла;

Для поиска в таблице значений существует два специальных метода:

Найти

ТелевизорГоризонт = Справочники.Номенклатура.НайтиПоНаименованию(«Телевизор Горизонт»);
НайденнаяСтрока = ТЗНоменклатуры.Найти(ТелевизорГоризонт);
//также мы можем указать в каких колонках искать, чтобы ускорить поиск
НайденнаяСтрока = ТЗНоменклатуры.Найти(ТелевизорГоризонт, «Номенклатура»);

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

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

НайтиСтроки

СтруктураОтбора.Вставить(«Номенклатура», ТелевизорГоризонт); // сначала указываем колонку где искать, а потом что искать.

Этот метод всегда возвращает массив, но он может быть и пустой, если ничего не найдено. И ещё этот метод также как и предыдущий возвращает сами строки таблицы значений, а не сами значения в отдельном массиве. Поэтому изменив значения в строке массива или как в предыдущем методе у найденной строки, Вы поменяете значение в обрабатываемой таблице значений.

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

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

Единственный минус, как видно, нельзя применять другие виды сравнения кроме как «равно»

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

В одной таблице перечислены товары к отгрузке со склада. В другой таблице – обязательства по оплате этих товаров.

Поэтому в 1С видное место занимает работа с таблицами.

Таблицы в 1С также называют «табличные части». Они есть у справочников, документов и других .

Запрос в результате своего выполнения возвращает таблицу, доступ к которой возможно получить двумя разными способами.

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

Важная особенность – в таблице, которая получена из результата запроса, все колонки будут строго типизированы. Это значит, что запросив поле Наименование из справочника Номенклатура, Вы получите колонку вида Строка с допустимой длиной не более N символов.

Таблица на форме (толстый клиент)

Пользователь работает с таблицей, когда она размещена на форме.

Базовые принципы работы с формами мы с Вами обсуждали в уроке по и в уроке по

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

Данные могут храниться в конфигурации – тогда нужно выбрать существующую (ранее добавленную) табличную часть того объекта конфигурации, форму которого Вы редактируете.

Нажмите кнопку «…» в свойстве Данные. Для того, чтобы увидеть список табличных частей, нужно раскрыть ветку Объект.

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

В этом же свойстве Данные Вы можете ввести произвольное имя и выбрать тип ТаблицаЗначений.

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

Нажав правой кнопкой на таблице Вы можете добавить колонку. В свойствах колонки можно указать его имя (для обращения в коде 1С), заголовок колонки на форме, связь с реквизитом табличной части (последнее – если выбрана не произвольная таблица, а табличная часть).

В свойствах таблицы на форме Вы можете указать – доступно ли пользователю добавлять/удалять строки. Более продвинутая форма – галочка ТолькоПросмотр. Эти свойства удобно использовать для организации таблиц предназначенных для вывода информации, но не редактирования.

Чтобы управлять таблицей, нужно вывести на форму командную панель. Выберите пункт меню Форма/Вставить элемент управления/Командная панель.

В свойствах командной панели выберите галочку Автозаполнение, чтобы кнопки на панели появились автоматически.

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

На управляемой форме указанные действия выглядят немного по другому. Если Вам нужно разместить на форме табличную часть – раскройте ветку Объект и перетащите одну из табличных частей влево. И все!

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

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

После чего также перетащите таблицу влево.

Чтобы у таблицы появилась командная панель, в свойствах таблицы выберите значения в секции Использование – Положение командной панели.

Выгрузка таблицы в Excel

Любую таблицу 1С, расположенную на форме, можно распечатать или выгрузить в Excel.

Для этого щелкните правой кнопкой мыши на свободном месте в таблице и выберите пункт Вывести список.

В управляемом (тонком) клиент аналогичные действия можно выполнить с помощью пункта меню Все действия/Вывести список.

Вот есть для начала небольшой фак — простые примеры работы с таблицей значений:

1. Создать таблицу значений

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

2. Создать колонки таблицы значений:

ТаблицаЗначений.Колонки.Добавить(«Имя»);
ТаблицаЗначений.Колонки.Добавить(«Фамилия»);

3. Добавить новые строки используя имена колонок:

НоваяСтрока.Имя = «Василий»;
НоваяСтрока.Фамилия = «Пупкин»;

4. Как искать значение в таблице значений:
Необходимо найти строку таблицы содержащую искомое значение.

НайденнаяСтрока = ТаблицаЗначений.Найти(ИскомоеЗначение);

5. Найти первое вхождение в определенных колонках таблицы значений

НайденнаяСтрока = ТаблицаЗначений.Найти(ИскомоеЗначение, «Поставщик, Покупатель»);

6. Если надо найти все вхождения в таблице значений:
Используем структуру поиска.
Создадим структуру поиска, каждый элемент которой будет содержать имя колонки в качестве ключа и искомое значение в этой колонке – в качестве значения. Передаем СтруктуруПоискав качестве параметра методу НайтиСтроки(). В результате получеем строк таблицы.
Если в структуру поиска добавить поиск нужного значения, например, еще и в колонке Ответственный, то в результате применения метода НайтиСтроки() получим все строки, где и Сотрудник, и Ответственный равны искомому значению.

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

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

Тоже самое используя индексы:

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 столбец №0 = Чапаев Строка №0 столбец №1 = Василий Строка №0 столбец №2 = Иванович Строка №1 столбец №0 = Дзержинский Строка №1 столбец №1 = Феликс Строка №1 столбец №2 = Эдмундович Строка №2 столбец №0 = Котовский Строка №2 столбец №1 = Григорий Строка №2 столбец №2 = Иванович

При помощи двух циклов, один из которых вложен в другой, мы вывели на экран значения всех колонок из всех строк таблицы значений 1С. При этом мы не использовали имена колонок, а обращались к колонкам и строкам по их индексам. Для большего понимания обратите внимание на комментарии внутри примера.

Предлагаю, в заключение, немного изменить наш пример, чтобы он вместо номеров колонок выводил на экран их названия. И дополнительно сделаю более презентабельное оформление выдачи содержимого на экран.

Сейчас, на нашем экране информация стала выглядеть более представительно:

Обратите внимание на строку, отмеченную стрелочкой «. В этой строке мы вместо индекса текущей колонки передаем имя текущей колонки в аргумент в квадратных скобках Результат будет тот же самый.

А сейчас, последнее в этой статье.

ПРАВИЛЬНОЕ получение всех данных таблицы значений 1С, при помощи циклов перебора коллекции строк и коллекции колонок

Для Каждого ТекущаяСтрока Из МояТЗ Цикл // цикл перебора коллекции строк Сообщить(» ======= Строка № » + МояТЗ.Индекс(ТекущаяСтрока) + » =======»); Сообщить(» «); Для Каждого ТекущаяКолонка Из МояТЗ.Колонки Цикл // вложенный цикл перебора коллекции столбцов ИмяКолонки = ТекущаяКолонка.Имя; // получаем имя колонки ЗначениеЯчейки = ТекущаяСтрока; // получаем значение ячейки ПО ИМЕНИ колонки Сообщить(ИмяКолонки + «: » + ЗначениеЯчейки); // выводим на экран имя колонки и значение ячейки КонецЦикла; Сообщить(» «); КонецЦикла;

В примере было использовано два цикла. Цикл перебора коллекции колонок вложен внутрь цикла перебора строк. Если вы разбирались с примерами выше, и читали предыдущие статьи, то у вас не будет затруднений в понимании работы этого примера.

Напоследок, я максимально сокращу количество строк кода нашего последнего примера, исключив использование промежуточных переменных. Мы получим образец «промышленного кода», который используется в реальных задачах.

Это следует делать только тогда, когда вы хорошо понимаете то, что делаете. Если же код очень сложен, то допустимо оставлять промежуточные переменные, чтобы облегчить понимание собственного кода впоследствии. Так же любой код необходимо хотя бы минимально комментировать, чтобы спустя какое-то время было легче разобраться с текстами программы.

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

2-НЕДЕЛЬНЫЙ КУРС

«ПРОГРАММИРОВАНИЕ в 1С ДЛЯ НОВИЧКОВ»

Курс придет на электронную почту. Стань программистом, выполняя пошаговые задания.

Для участия нужен только компьютер и интернет

Бесплатный доступ на курс: