Индексированная таблица 1с 7.7 пример. Класс "поставщикданных"

  • 18.08.2023

Вопрос: Индексированная Таблица значений


Вопрос такой, можно ли сделать Таблицу Значений на форме диалога индексированной и далее работать с ней, как с индексированной таблицей?
Или лучше работать отдельно с ИТЗ а потом итоги выгружать в видимую на форме Таблицу значений?
И второй вопрос, как сделать так, чтобы при выгрузке ИТЗ в Таблицу значений, не слетал формат колонок?
ПыСы -компонента 1с ++ стоит, если чо.

Ответ: () после кулдауна натахауза пряника нигде не достать, если это конечно не просто сабж из анекдота

Вопрос: Работа с таблицей значений


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

1. В форму диалога поместите таблицу значений.
2. В модуле формы опишите колонки таблицы: Товар, Количество, Цена, Сумма.
3. Поместите на форму диалога реквизиты диалога "Товар", "Цена", "Коли¬чество" и кнопку Добавить строку, которая добавляет новую строку в таблицу значений и заполняет ее значениями соответствующих реквизи¬тов. Сумма должна вычисляться как произведение цены на количество.
4. Добавьте кнопку Удалить строку, которая удаляет текущую строку таб¬лицы значений. Предусмотрите ситуацию пустой таблицы значений.
5. Добавьте кнопку Свернуть, которая должна суммировать по товарам сумму и количество, в колонке Цена должна вычисляться средняя цена товара.
6. Добавьте кнопку Развернуть, которая восстанавливает состояние табли¬цы значений до свертки.
7. Добавьте кнопку Сортировка для упорядочивания строк по товарам.

Заранее спасибо!

Ответ: платформа? Управляемый или обычный режим?
В синт.поме "Таблица значений"

Вопрос: 8.2 - Получить данные из вычисляемого поля таблицы значений


Не знаю как толком объяснить.
На форме есть табличное поле. В процедуре ПриПолученииДанных(Элемент, ОформленияСтрок) в отдельную
колонку вычисляю значение:

Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл.... ОформлениеСтроки.Ячейки.Отгружено.Значение = Тут формула.... КонецЦикла

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

Ответ:

ты путаешь понятия. табличное поле и есть табличное поле -ТЗ тут не пахнет. так же как и рассчитываешь та же и обходи

Вопрос: СКД: Иерархию из таблицы значений


Здравствуйте!
Подскажите как создать иерархию из таблицы значений типа такой

ПолеСтрока | ПолеСтрокаРодитель
________________________________
Основной каталог | Основной каталог
Васильев И.А. | Основной каталог
Аренда имущества | Васильев
Разные документы | Васильев
Иванов | Основной каталог
Аренда имущества | Иванов
Разные документы | Иванов

Нужно как-то получить дерево из этого. Пока работает программно, но думаю, что такое дерево можно вполне в скд построить.

Ответ: Ну программно ты создаешь объект ДеревоЗначений и тулишь туда ручками владельца (узлы) и подчиненные элементы (строки).

А эти данные только в виде таблицы значений, а ен элементы иерархического справочника? Если это иерархический справочник, то это проще простого.

А если надо именно из таблицы значений, создавая ее как угодно, то делать так:

Определяешь в запросе временную таблицу, куда помещаешь свою ТЗ.
Потом делаешь выборку по ней с соединением строки с родителем.

Вопрос: Вынос Таблицы значений в общий модуль


Добрый день!
Новичок в 1С. Изучаю версию 3.0 Тонкий клиент. Есть внешняя управляемая форма. Хочу вынести таблицу значений в общие модули. Застопорилась, помогите пожалуйста:
1C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 & НаСервере Процедура Выполнить ЗапросНаСервере() З= Новый запрос; З. Текст = "ВЫБРАТЬ | РасходныйКассовыйОрдерРасшифровкаПлатежа.ДоговорКонтрагента, | РасходныйКассовыйОрдерРасшифровкаПлатежа.СуммаПлатежа |ИЗ | Документ.РасходныйКассовыйОрдер.РасшифровкаПлатежа КАК РасходныйКассовыйОрдерРасшифровкаПлатежа" ; Тз= З. Выполнить () . Выгрузить() ; //Вывод результата запроса в таблицу формы ТФ(Тз) ; КонецПроцедуры & НаСервере Процедура ТФ(Тз) ОбщиеФункции. ЗаполнитьТаблицуФормы(Тз) КонецПроцедуры

Общий модуль:

Ошибка:{Форма.Форма.Форма(23)}: Ошибка при вызове метода контекста (ЗаполнитьТаблицуФормы)
ОбщиеФункции.ЗаполнитьТаблицуФормы(Тз)
по причине:
Несоответствие типов (параметр номер "1") (Неверный тип параметра. Допустимы только примитивные типы, ссылки, Структура)
Как передать ТЗ для дальнейшей обработки?

Ответ:

Сообщение от Prsvet

Почему тип число передает, а при передачи ТЗ нужно ставить повторное использование возвращаемых значений не использовать?

Потому что,

Сообщение от Prsvet

повторное использование возвращаемых значений

Кэшируется на клиенте, а таблица значений не сериализуется на клиенте

Добавлено через 32 секунды
с этим параметром нужно работать аккуратно!

Добавлено через 35 секунд
Prsvet , если ты не знаешь как работает этот параметр, то лучше не используй его!

Вопрос: Таблица значений с циклическим заполнением колонок


Всем доброго.
Задача - вывести таблицу прихода/расхода товаров за выбранный период с понедельной разбивкой. Решил реализовать как ТаблицуЗначений (сначала думал сделать отчетом, но не нашел, как). Поскольку количество столбцов заранее неизвестно, таблица генерируется программно:

//*** описание ТЗ как реквизита формы массивТипаВыбора = новый массив; массивТипаВыбора.Добавить(тип("таблицаЗначений")); описаниеТипаВыбора = новый описаниеТипов(массивТипаВыбора); массивРеквизитов = новый массив; массивРеквизитов.Добавить(новый реквизитФормы("ТЗФорма", описаниеТипаВыбора, "", "ТЗформа")); //*** описание типов КЧ = новый КвалификаторыЧисла(10,2); КС = новый КвалификаторыСтроки(100); мас = новый массив; мас.Добавить(тип("Строка")); ТипСтрока = новый ОписаниеТипов(мас, КС); мас.Очистить(); мас = новый массив; мас.Добавить(тип("Число")); ТипЧисло = новый ОписаниеТипов(мас, КЧ); мас.Очистить(); // *** //создаем временную таблицу значений ТЗ = новый ТаблицаЗначений; ТЗ.Колонки.Добавить("товар", ТипСтрока, "товар"); для н=1 по КолвоНедель цикл ТЗ.Колонки.Добавить("приход" + н, ТипЧисло, "приход" + н); ТЗ.Колонки.Добавить("расход" + н, ТипЧисло, "расход" + н); КонецЦикла; для каждого колонка из тз.Колонки цикл массивРеквизитов.Добавить(новый РеквизитФормы(колонка.Имя, колонка.ТипЗначения, "ТЗФорма")); КонецЦикла; изменитьРеквизиты(массивРеквизитов); таблицаПолейВыбора = Элементы.Добавить("ТЗФорма", тип("ТаблицаФормы")); таблицаПолейВыбора.ПутьКДанным = "ТЗФорма"; таблицаПолейВыбора.Отображение = отображениеТаблицы.Список; для каждого колонка из ТЗ.колонки цикл новыйЭлемент = элементы.Добавить(колонка.Имя, тип("ПолеФормы"), таблицаПолейВыбора); новыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; новыйЭлемент.ПутьКДанным = "ТЗФорма." + Колонка.Имя; новыйЭлемент.Ширина = 10; КонецЦикла;

Потом заполняется колонка наименований:

ЗапрНом = новый запрос; запрНом.Текст = "выбрать ТоварыНаСкладахОбороты.Номенклатура КАК номенклатура | из РегистрНакопления.ТоварыНаСкладах.Обороты() КАК ТоварыНаСкладахОбороты"; ТЗНом = запрНом.Выполнить().Выгрузить(); для каждого стрНом из ТЗНом цикл стрНом = стрНом.номенклатура; //добавить данную номенклатуру во временную ТЗ СтрТЗ = ТЗ.Добавить(); СтрТЗ.товар = стрНом; КонецЦикла;

Наконец, выгружаем товар из временной ТЗ в ТЗ формы:

ЗначениеВРеквизитФормы(ТЗ, "ТЗФорма");

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

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

Вопрос возникает при передаче сумм прихода и расхода из таблицы значений по результатам запроса во временную таблицу. Как описать, что в каждой итерации при выгрузке данных из таблицы результата запроса во временную ТЗ цифра в имени колонок прихода и расхода увеличивается на 1? Ведь в целом процесс выгрузки выглядит так:

ТЗПрихРасхОбор = ЗапрПрихРасхОбор.Выполнить().выгрузить(); для каждого стрПрихРасхОбор из ТЗПрихРасхОбор цикл стрТЗ.приход = стрПрихоРасхОбор.приход; стрТЗ.расход = стрПрихоРасхОбор.расход; стрТЗ.оборот = стрПрихоРасхОбор.оборот; КонецЦикла;

Ответ:

наконец добрался до кода. спасибо, помогло. получилось так:

ТЗ = ЗапросНоменклатуры(); для н=1 по колвоНедель цикл ТЗ.колонки.добавить("приход" + н, типЧисло, "приход" + н); ТЗ.колонки.добавить("расход" + н, типЧисло, "расход" + н); КонецЦикла; для н = 1 по колвоНедель цикл КолонкаПрих = ТЗ.колонки.найти("приход" + н); КолонкаРасх = ТЗ.колонки.найти("расход" + н); КонецПериода = началоПериода + неделя; ТЗПР = ЗапросОборотов(НачалоПериода, КонецПериода); МПрих = ТЗПР.выгрузитьКолонку(0); МРасх = ТЗПР.выгрузитьКолонку(1); ТЗ.загрузитьКолонку(МПрих, КолонкаПрих); ТЗ.загрузитьКолонку(Мрасх, КолонкаРасх); НачалоПериода = КонецПериода; КонецЦикла;

оптимизировать не стал (например, по поводу запроса в цикле), так как итоговый вид таблицы изначально не устраивал в плане наглядности, хотелось другого решения. вспомнил про макет и табличный документ, пробую через него

Вопрос: Как не зная структуры таблицы значений обработать ее в Запросе


Здравствуйте. Есть таблица значений. Точные имена колонок не известны. Необходимо обработать таблицу значений и добавить к ней одну колонку и заполнить ее. Заполнение осуществляется на основании одной колонки у которой известно имя.
Самый простой вариант - добавить колонку и обработать таблицу в цикле. Но это не совсем хорошо.
Возможно ли это сделать в запросе?
Спасибо.

Ответ:

В первом приближении:

Выбрать * ПОМЕСТИТЬ ВТ_ВнешниеДанные ИЗ &Таблица КАК ВнешниеДанные

Выбрать ВнешниеДанные.*, Таблица.ПОЛЕ1 ИЗ ВТ_ВнешниеДанные КАК ВнешниеДанные ЛЕВОЕ СОЕДИНЕНИЕ <Таблица> КАК Таблица ПО ВнешниеДанные.Поле1 = Таблица.Поле1

Вопрос: Как при выборе значения ячейки таблицы значений на УФ делать отбор по владельцу?


Уважаемые коллеги! Не так давно жизнь вынудила меня столкнуться с управляемыми формами, потому я в них еще не сильно понимаю. Не сочтите вопрос дурацким и помогите кто чем может:) Вопрос следующий. Формирую свою таблицу значений и вывожу ее на форму. Первая колонка - ссылка на справочник номенклатуры, остальные колонки - ссылки на справочник для которого Номенклатура является Владельцем. Как мне сделать так, что бы при начале выбора значения в такой колонке в списке значений уже стоял отбор по владельцу. Пока сделал через событие НачалоВыбора, там открываю список с нужным отбором. Но проблема не понимаю куда полученное значение пихать в обработке подбора? И есть подозрение, что отбор по владельцу можно установить через свойство колонки ПараметрыВыбора. Как быть? Подскажите!

Ответ: и вот у меня есть

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) Если ИсточникВыбора.ИмяФормы = "Справочник.ЗначенияСвойствОбъектов.Форма.ФормаСписка" Тогда И вот ту я не заню что написать
, что бы поместить ВыбранноеЗначение в редактируемую ячейку таблицы!!!

КонецЕсли;
КонецПроцедуры

Вопрос: Группировки и Свернуть() по таблице значений


внимательно, это 7 .7 :)
Итак сабж: выгружаю ТЧ документа в таблицу значений.
ТЧ документа имеет вид
Расх.накл. | Клиент | адрес доставки.

Обрабатываю таблицу значений:
выбратьСтроки();
пока получитьСтроку() = 1 Цикл тбл.НоваяСтрока(); тбл.Клиент = Клиент; тбл.АдресДоставки = АдресДоставки; тбл.НомерДок = Накладная.НомерДок; КонецЦикла ;
Суть в следующем. В макете при печать должно в одной ячейке выходить Клиент, АдресДоставки и номера всех расходных накладных по клиенту, а так же может быть один клиент, но разные адреса доставки. То есть, в случае совпадения Клиента и Адреса, выводить список накладных по этим параметрам.

Ответ: () Используй черный запрос про документам. Группировки: Клиент, Адрес доставки, Реализация (Упорядочивание по номеру). Циклы используешь с учетом группировок. В исходную таблицу выводи строки во второй группировке (Адрес доставки), но после цикла по третьей группировке (Реализация), потому что во второй группировке будешь формировать строку с номерами накладных.
НомераНакладных = "";
Пока Запрос.Группировка(3 ) = 1 Цикл НомераНакладных = НомераНакладных + ?(ПустаяСтрока (НомераНакладных) = 1 , "", ", ") + Запрос.ЗначениеУпорядочивания((СтрокаТаблицы.Данные,ДлинаСтроки)=ЧтоИщем Тогда МассивНайденныхСтрок.Добавить(СтрокаТаблицы); КонецЕсли ; КонецЦикла ;

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

Такого ускорения просто невозможно добиться аппаратными средствами. Поэтому данной теме необходимо уделить пристальное внимание.

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

В видеоуроках мы рассмотрим несколько способов создания индекса. Также рассмотрим ситуацию когда индекс необходимого состава невозможно создать штатными средствами платформы и его придется создавать в СУБД .

Настройка индексов штатными средствами платформы

В уроке показано, какие индексы реально создаются для объектов на уровне СУБД.
В этой теме не все так очевидно, как может показаться на первый взгляд. Ведь для ряда объектов есть особенности создания индексов.
Все нюансы рассмотрим в данном видео.

Индексация с дополнительным упорядочиванием

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

Создание индекса для измерений регистров

Индексация первого измерения регистров имеет несколько нюансов.
В видео показано, какие индексы создаются для измерений регистров. Также рассмотрена ситуация индексации первого измерения регистра.

Vandalsvq 1114 08.11.14 17:00 Сейчас в теме

() CheBurator, группировка условий есть, в версии 5+. Но она только на 1С++ - http://www.1cpp.ru/forum/YaBB.pl?num=1273512019 .
Были планы сделать условное оформление, а также группировку, но увы. Причина тому одна - я не занимаюсь 7-кой на коммерческой основе и поэтому не дорабатываю эти инструменты. Тестировать даже элементарно не на чем. Раньше и sql-ные базы были и файловые и разных конфигураций навалом. Сейчас вроде как только одна на которой была разработка и ту открывал очень давно.

А вообще вот последние изменения:
5.0.1 от 15.04.12 г.
- Изменена система отборов в динамических расширениях (Справочник, Документ, Журнал, Регистр, Операции, Проводки). Добавлена возможность произвольного построения условий с иерархией.
- В связи с изменением системы отборов внесены изменения в объекты-расширения «ПоставщикДанных.Журнал», «ПоставщикДанных.Проводки» «ПоставщикДанных.Документы», «ПоставщикДанных.Справочник», «ПоставщикДанных.Операции», «ПоставщикДанных.Регистр».
- Исправлено поведение кнопки «Отбор по текущей колонке». При нажатии не отключаются остальные отборы. Также если отбор включен, то он выключается.
- При активизации колонки изменяется отображение кнопки «Отбор по текущей колонке».
- Оптимизировано построение условия отборов по реквизитам.
- Исправлена ошибка потери текущей строки при изменении иерархического просмотра у объекта-расширения «ПоставщикДанных.Справочник».
- Отключено использование параметра «ВыводитьПиктограммуОтбора». Параметр оставлен для обратной совместимости.
- Объект «ПоставщикДанных.ОписаниеТипов» и «ПоставщикДанных.ВидыСравнения» выведены из состава поставщика данных. Вместо них используются общие объекты «ОписаниеТипов» и «ВидыСравнения» соответственно. Подробнее см. документацию по классам «Объекты_v8».
- Исправлено падение 1С при изменении типа значения объекта «ПоставщикДанных».

5.0.2 от 24.04.12 г.
- Исправлена ошибка при укладке списков со строковыми значениями для отбора.
- Исправлена ошибка формирования запроса для объекта-расширения «ПоставщикДанных.Регистр» если у регистра стоит признак «Быстрая обработка движений»
- Исправлены выявленные ошибки.

5.0.3 от 22.05.13 г.
- Объект «ПоставщикДанных.ПрямойЗапрос» обновлен до версии 1.8.6 от 22.05.13 г.
- все классы собраны вместе в один архив + примеры

5.0.4 от 25.10.13 г.
- Исправлены выявленные ошибки

5.0.5 от 23.05.14 г.
- Исправлены выявленные ошибки при добавлении колонок данных
- Добавлена возможность построения древовидных структуры в доступных полях при добавлении колонок данных (фактически теперь можно объект "Отбор" использовать для построения отборов вроде СКД в 8-ке, но напильник must have)

или

Зачем разработчику 1С «индексировать» измерения регистров и реквизиты?

— Ну у вас и запросы! — сказала база данных и повисла…

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

Что такое индекс?

Оптимизация размещения индексов

При объеме таблиц не позволяющем им «разместиться» в оперативной памяти сервера, на первое место выходит скорость дисковой подсистемы (I/O). И здесь можно обратить внимание возможность размещать индексы в отдельных файлах расположенных на разных жестких дисках .

Подробное описание действий http ://technet .microsoft .com /ru -ru /library /ms 175905.aspx
Использование индекса из другой файловой группы повышает производительность некластерных индексов в связи с параллельностью выполнения процессов ввода/вывода и работы с самим индексом.
Для определения размеров можно использовать выше упомянутую обработку.

Влияние индексов на блокировки

Отсутствие необходимого индекса для запроса означает перебор всех записей таблицы, что в свою очередь приводит к избыточным блокировкам, т.е. блокируются лишние записи. Кроме того, чем дольше выполняется запрос из-за отсутствующих индексов, тем больше время удержания блокировок.
Другая причина блокировок — малое количество записей в таблицах. В связи с этим SQL Server, при выборе плана выполнения запроса, не использует индексы, а обходит всю таблицу(Table Scan), блокируя целиком. Для того, чтобы избежать подобных блокировок, необходимо увеличить количество записей в таблицах до 1500-2000. В этом случае сканирование таблицы становится долее дорогостоящей операцией и SQL Server начинает использовать индексы. Конечно это можно сделать не всегда, ряд справочников как «Организации», «Склады», «Подразделения» и т.п. обычно имеют мало записей. В этих случаях индексирование не будет улучшать работу.

Эффективность индексов

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

  • Запросы, которые указывают «узкие» критерии поиска. Такие запросы должны считывать лишь небольшое число строк, отвечающих определенным критериям.
  • Запросы, которые указывают диапазон значений. Эти запросы также должны считывать небольшое количество строк.
  • Поиск, который используется в операциях связывания. Колонки, которые часто используются как ключи связывания, прекрасно подходят для индексов.
  • Поиск, при котором данные считываются в определенном порядке. Если результирующий набор данных должен быть отсортирован в порядке кластеризованного индекса, то сортировка не нужна, поскольку результирующий набор данных уже заранее отсортирован. Например, если кластеризованный индекс создан по колонкам lastname (фамилия), firstname (имя), а для приложения требуется сортировка по фамилии и затем по имени, то здесь нет необходимости добавлять инструкцию ORDER BY.

Правда при всей полезности индексов, есть одно очень важное НО – индекс должен быть «эффективно используемым» и должен позволять находить данные с использованием меньшего числа операций ввода-вывода и объема системных ресурсов. И наоборот, неиспользуемые (редко используемые) индексы скорее ухудшают скорость записи данных (поскольку каждая операция, изменяющая данные, должна также обновлять страницы индексов) и создают избыточный объем базы.

Покрывающим (для данного запроса), называется индекс в котором есть все необходимые поля для этого запроса. Например, если индекс создан по колонкам a, b и c, а оператор SELECT запрашивает данные только из этих колонок, то требуется доступ только к индексу.

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