Преобразовать таблицу в строку в 1с
Форум
Создание таблицы значений
Таблица значений - это двумерный массив в 1С, который предназначен для хранения и обработки промежуточных данных, возникающих в процессе работы программы. Таблица значений часто применяется при программировании на 1С, потому что имеет множество полезных возможностей и работает очень быстро. Таблица значений создается в памяти и не сохраняется в базе данных, т.е. это временный набор данных.
ТабЗнач.НоваяКолонка("Номер");
ТабЗнач.НоваяКолонка("Сотрудник");
ТабЗнач.НоваяКолонка("Должность");
ТабЗнач.НоваяКолонка("Оклад");
//можно указать тип данных каждой колонки
//если тип данных колонки не указан, то можно хранить данные любого типа
Синтаксис: НоваяКолонка(, , , , , , , )
ТабЗнач.НоваяКолонка("Номер","Число",10,0);
ТабЗнач.НоваяКолонка("Сотрудник","Справочник.Сотрудники");
ТабЗнач.НоваяКолонка("Должность","Справочник.Должности");
ТабЗнач.НоваяКолонка("Оклад","Число",10,2);
Добавление строк в таблицу значений
ТабЗнач.НоваяСтрока();
ТабЗнач.Номер = 1;
ТабЗнач.Сотрудник = "Иванов Иван Иванович"; //следите за типом колонки!
ТабЗнач.Должность = "Программист";
ТабЗнач.Оклад = 20000;
ТабЗнач.НоваяСтрока();
ТабЗнач.Номер = 2;
ТабЗнач.Сотрудник = "Петров Петр Петрович";
ТабЗнач.Должность = "Бухгалтер";
ТабЗнач.Оклад = 10000;
//обычно строки добавляются в цикле
СпрСотр = СоздатьОбъект("Справочник.Сотрудники");
СпрСотр.ВыбратьЭлементы();
Пока СпрСотр.ПолучитьЭлемент()=1 Цикл
. ТабЗнач.НоваяСтрока();
. ТабЗнач.Номер = СпрСотр.Код;
. ТабЗнач.Сотрудник = СпрСотр.ТекущийЭлемент(); //следите за типом колонки!
. ТабЗнач.Должность = СпрСотр.Должность;
. ТабЗнач.Оклад = СпрСотр.Оклад;
КонецЦикла;
Перебор строк таблицы значений
ТабЗнач.ВыбратьСтроки();
Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
. Сообщить(ТабЗнач.Сотрудник);
КонецЦикла;
2-й способ.
Для НомерСтроки = 1 По ТабЗнач.КоличествоСтрок() Цикл
. ТабЗнач.ПолучитьСтрокуПоНомеру(НомерСтроки);
. Сообщить(ТабЗнач.Сотрудник);
КонецЦикла;
Сортировка таблицы значений
//сортировать по должности по возрастанию
ТабЗнач.Сортировать("Должность+");
//сортировать по должности по возрастанию, а внутри должности по убыванию оклада
ТабЗнач.Сортировать("Должность+,Оклад-");
Поиск в таблице значений
Синтаксис: НайтиЗначение(,,)
Возвращает число: 0 - значение не найдено; 1 - значение найдено
Если указан параметр , то поиск производится только по заданной строке
Если указан параметр , то поиск производится только по заданной колонке
номстр = 0;
Если ТабЗнач.НайтиЗначение (10000, номстр, "Оклад") = 1 Тогда
. ТабЗнач.ПолучитьСтрокуПоНомеру(номстр);
. Сообщить(ТабЗнач.Сотрудник);
КонецЕсли;
Итоги и группировка таблицы значений
//получить итог по колонке можно методом Итог
ВсеОклады = ТабЗнач.Итог("Оклад")
//часто требуется группировать строки и подсчитывать итоги по группам,
//в этом случае применяется метод Свернуть
//проссумировать оклады по каждой должности
ТабЗнач.Свернуть("Должность","Оклад");
//Можно группировать и суммировать сразу по нескольким колонкам
ТабЗнач.Свернуть("Категория, Должность","Оклад,Налог");
Удаление строк и колонок из таблицы значений
ТабЗнач.Очистить(); //очистить таблицу значений и удалить колонки
ТабЗнач.УдалитьСтроки(); //удаляет все строки (колонки сохраняются)
ТабЗнач.УдалитьСтроку(); //удаляет текущую строку
ТабЗнач.УдалитьСтроку(3); //удаляет 3-ю строку
ТабЗнач.УдалитьКолонку("Оклад"); //удаляет колонку Оклад
ТабЗнач.УдалитьКолонку(2); //удаляет 2-ю колонку
ВНИМАНИЕ
Часто требуется удалить строки, удовлетворяющие определенному условию.
Так как при удалении строки из таблицы значений следующая строка становится текущей,
то указанная ниже программа может удалить НЕ ВСЕ необходимые строки.
//ЭТА ПРОГРАММА НЕПРАВИЛЬНАЯ .
ТабЗнач.ВыбратьСтроки();
Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
. Если Тогда
. ТабЗнач.УдалитьСтроку(); //следующая строка стала текущей,
. КонецЕсли;
КонецЦикла;
В этом случае я рекомендую использовать следующий прием:
ТабЗнач.ВыбратьСтроки();
Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
~начало:
. Если Тогда
. ТабЗнач.УдалитьСтроку(); //следующая строка стала текущей
. Если ТабЗнач.НомерСтроки<>0 Тогда
. Перейти ~начало;
. КонецЕсли;
. КонецЕсли;
КонецЦикла;
А вот еще один правильный алгоритм, предложенный Wlad:
ТабЗнач.выбратьстроки();
Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
. Пока () и (ТабЗнач.НомерСтроки<>0) Цикл
. ТабЗнач.УдалитьСтроку(); //следующая строка стала текущей
. КонецЦикла;
КонецЦикла;
Таблица значений как элемент диалога
Таблица значений может использоваться в экранных формах как элемент диалога с пользователем.
//установить курсор на указанную колонку или можно узнать, где находится курсор
ТабЗнач.ТекущаяКолонка(НоваяКолонка,ТекКолонка);
//установить курсор на указанную строку или можно узнать, где находится курсор.
ТекСтрока = ТабЗнач.ТекущаяСтрока(НовСтрока);
ТабЗнач.ВидимостьКолонки("Оклад",0); //скрыть колонку Оклад
ТабЗнач.ВидимостьКолонки("Должность, Сотрудник",1); //показать колонки Должность и Сотрудник
ТабЗнач.ВидимостьКолонки("Оклад",1,1); //показать колонку Оклад в 1-й позиции
//можно зафиксировать верхние строки и левые колонки для удобства прокрутки таблицы значений в диалоге
ТабЗнач.Фиксировать(КолСтрок,КолКолонок);
Методы УстановитьЗначение и ПолучитьЗначение
Эти методы позволяют обращаться к данным в таблице значений для чтения и записи.
Они могут пригодиться в особых случаях при написании универсальных программ (мастеры отчетов и т.д.).
ТабЗнач.НоваяСтрока();
ТабЗнач.УстановитьЗначение(1,"Номер",100);
ТабЗнач.УстановитьЗначение(1,"Сотрудник","Иванов Иван Иванович");
ТабЗнач.УстановитьЗначение(1,3,10000); //обращение к 1-й строке и 3-й колонке ("Оклад")
Номер = ТабЗнач.ПолучитьЗначение(1,"Номер");
ФИО = ТабЗнач.ПолучитьЗначение(1,"Сотрудник");
Оклад = ТабЗнач.ПолучитьЗначение(1,3); //обращение к 1-й строке и 3-й колонке "Оклад"
Выгрузка таблицы значений
//выгрузить 10 сотрудников с наибольшими окладами в новую таблицу значений
ТабЗнач.Сортировать("Оклад-");
ТабЗнач.Выгрузить(НоваяТабЗнач,1,10,"Сотрудник,Оклад");
ТаблицаЗначений — это программный объект встроенного языка, позволяющий строить произвольные наборы данных в памяти компьютера, отображать их в табличном виде, а также программно и интерактивно манипулировать ими (добавлять, редактировать, удалять и сортировать).
Таблицы состоят из строк и колонок. Строки располагаются вниз по вертикали, а колонки — вправо по горизонтали. Строки и колонки имеют индексы, по которым к ним можно обращаться напрямую (начинаются с 0). Кроме этого, к колонкам можно обращаться по идентификатору.
Пересечения строк и колонок образуют ячейки, в которых содержатся значения. Тип значения определяется типом значения колонки.
Таблица значений является полностью динамическим объектом, т.е. Вы можете манипулировать не только строками таблицы, добавляя и удаляя их, но и колонками.
Таблица значений может использоваться явно при создании в коде необходимого количества переменных типа ТаблицаЗначений , либо неявно: при добавлении элемента управления ТабличноеПоле на обычную форму, и ТаблицаФормы — на управляемую. Здесь мы рассмотрим только программную работу с таблицей значений.
Создание таблицы значений
Как и большинство объектов встроенного языка, новая таблица значений может быть создана с помощью оператора Новый :
Колонки таблицы значений
Прежде чем начать работу с таблицей значений, необходимо создать структуру колонок. Каждая колонка характеризуется следующими свойствами:
- Имя — идентификатор колонки (может содержать только алфавитные символы, цифры и знаки подчеркивания. Причем, начинаться имя колонки может только с буквы или символа подчеркивания);
- Заголовок — представление колонки в диалогах (может содержать произвольные символы);
- ТипЗначения — тип значения содержимого ячеек в этой колонке. Если тип не задан, в ячейке можно хранить значения произвольного типа;
- Ширина — ширина колонки в диалогах;
Доступ к колонкам производится через свойство Колонки объекта ТаблицаЗначений . Для добавления новой колонки используется метод Добавить():
Для того, чтобы определить наличие колонки с нужным именем используется метод Найти():
Перебор колонок выполняется следующим образом:
Для удаления колонки используется метод Удалить():
Свойства колонки таблицы значений
Имя | Тип | Описание |
---|---|---|
Имя | Строка | символьный идентификатор колонки, по которому к ней можно обращаться из кода |
Заголовок | Строка | строковое представление колонки на форме |
ТипЗначения | ОписаниеТипов | свойство органичивает пространство доступных значений, которые можно указать в данной колонке |
Ширина | Число | ширина колонки на форме (выражается в количестве символов) |
Методы коллекции колонок таблицы значений
Вставить() | Вставляет новую колонку в указанную позицию коллекции |
Добавить() | Добавляет новую колонку в конец коллекции |
Количество() | Возвращает количество колонок в коллекции |
Найти() | Ищет колонку в коллекции по имени |
Очистить() | Удаляет все колонки из коллекции |
Сдвинуть() | Сдвигает колонку влево или вправо |
Удалить() | Удаляет колонку из коллекции |
Строки таблицы значений
С колонками разобрались. Давайте теперь разберемся со строками. Строки таблицы значений можно программно добавлять и удалять, перемещать и сортировать, а также выполнять операции поиска и отбора.
Добавление и удаление строк
Для добавления новой строки используется метод Добавить() объекта ТаблицаЗначений . Метод возвращает объект СтрокаТаблицыЗначений , с которым доступны дальнейшие манипуляции:
И только теперь мы можем заполнить строку данными. Для этого обращаемся к ячейкам строки, указывая идентификаторы колонок через точку:
Обратите внимание, что каждая СтрокаТаблицыЗначений ссылается на таблицу значений с помощью метода Владелец():
Для удаления строки используется метод Удалить() объекта ТаблицаЗначений . Строку можно удалить либо передав методу непосредственно строку, либо ее индекс:
Перебор строк таблицы значений
Для перебора строк удобнее всего использовать оператор цикла Для Каждого . В редких случаях оправдано применение цикла Для :
Поиск строк
Все методы таблицы значений:
Вставить() | Вставляет строку на указанное место |
ВыбратьСтроку() | Позволяет интерактивно выбрать строку в диалоговом окне |
ВыгрузитьКолонку() | Выгружает значения ячеек указанной колонки в массив значений |
Добавить() | Добавлет новую строку в таблицу значений |
ЗагрузитьКолонку() | Загружает значения в ячейки указанной колонки из массива |
ЗаполнитьЗначения() | Заполняет ячейки указанных колонок определенным значением |
Индекс() | Возвращает индекс строки таблицы значений |
Итог() | Возвращает просуммированный итог по колонке таблицы значений |
Количество() | Возвращает количество строк в таблице значений |
Найти() | Выполняет поиск строки по значению |
НайтиСтроки() | Выполняет поиск строк по указанным параметрам |
Очистить() | Очищает строки таблицы значений |
Получить() | Возвращает строку по ее индексу |
Свернуть() | Выполняет сжатие строк и колонок таблицы значений |
Сдвинуть() | Сдвигает строку вверх или вниз по таблице |
Скопировать() | Создает новую таблицу значений копированием текущей |
СкопироватьКолонки() | Создает новую пустую таблицу значений путем копирования колонок текущей таблицы |
Сортировать() | Выполняет сортировку строк таблицы значений по указанным колонкам |
Удалить() | Удаляет строку таблицы значений |
Иерархию свойств и типов значений, связанных с таблицей значений, схематически можно представить в виде дерева:
(103) :) Ну для себя я вопрос закрыл еще год назад.
Но - затем возникло новое обсуждение.
Как по мне обсуждение интересное.
И Ваша статья тоже понравилась. В ней ПЛЮС!
Но все-таки жаль , что на уровне системы ЗАПРОСОВ, 1С не реализуют функцию вида СУММА(ТекстоваяСтрока).
И приходится изощрятся.
(4) zamichnik , - конечно же, неизвестно.
(5) ndrewks, - неужели все так грустно .
Что-ж только через: запрос > обработка_запроса > массив > ВременнаяТаблица > передать ВременнаяТаблица в запрос.
(6) serge_focus,
тогда, похоже, andrewks прав - никак.
А не проще тогда формировать строку уже в обходе результата запроса и передавать её, уже скомпонованную куда угодно, в том числе и параметрически в любой следующий запрос?
(9) zamichnik ,- собственно так и пришлось сделать
запрос > обработка_результатов_запроса > ВременнаяТаблица > передать ВременнаяТаблица как параметр передал в запрос.
Но надеялся, что обработать все можно прямо а ЗАПРОСЕ на сервере.
(10) serge_focus,
Посетила мысль :) Ведь в принципе, можно попробовать динамически составить текст запроса, тогда получится желаемое.
Но. При этом по-любому сначала нужно как-то определить количество записей, всё равно одним запросом не получается.
(11) zamichnik, плохая идея для данного случая. а если строк будет очень много? это ж какое соединение надо делать-то? тут при обработке результата надо делать.
вот если бы надо было, наоборот, разбить строку с разделителем на составляющие - это пожалуйста, порождающие запросы прекрасно пишутся на 1С-диалекте sql
(11)(12)(14)(33)(37)(41)(64)(75) - Всем, кто интересовался данной темой, предлагаю ознакомится с моим решением в статье Агрегатное суммирование строк в запросе - сложно, но не невозможно
А каким образом? Запрос -- это запрос, а обработка запроса -- это обработка запроса. Извините за капитанство.
Да и язык беден всего то десяток функций.
(12) beldieff
> обработка_результатов_запроса > -это и есть
Результат =""
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Результат = Результат + Выборка.Название;
КонецЦикла;
как уже написал в (14) HeadHunter2007
(13) juntatalor - а вот это интересно .
пороюсь в СКД . Просто не знал , что в СКД есть подобный функционал. Большое вам спасибо! ;)
обработка_результатов_запроса > -это и есть
Результат =""
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Результат = Результат + Выборка.Название;
КонецЦикла;
как уже написал в (14) HeadHunter2007
(16) serge_focus, в СКД это тоже реализовано как обработка результата запроса, т.е. оперировать этим полем напрямую в запросе не получится. если же надо только на выходе - тогда да. только чем тогда не понравилась обработка результата обычного запроса?
(18) andrewks - Да собственно я и сделал через обработку результата запроса . Только у меня получается запрос "многоэтажный" и на одном из "этажей" есть необходимость свернуть таблицу значений (если она не пустая для данных параметров) в строку с разделителями. И получается что приходится на предпоследнем этапе для всех строк большого запроса после ролверки условия перебором в цыкле сворачивать отобранные другим запросом строки таблицы в строку с разделителями, Все эти строки с разделителями и ключем собирать во временной таблице, передавать ее в запрос, а затем уже в зависимости от условий отбора выводить результат.
И все это как-то "не быстро" получается. Вот и вожусь с оптимизацией.
Если у вас какой-то отчет, то требуемый функционал есть в СКД (функции Массив(), СоединитьСтроки()).
Если использование СКД по каким-то причинам нежелательно, обрабатывайте результат запроса.
Результат =""
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Результат = Результат + Выборка.Название;
КонецЦикла;
Грубо говоря предельное упрощение задачи - это:
есть таблица документов содержащих табличную часть
нужно сделать таблицу с сылкой на документ , в одном из полей которой содержится строка, которая равняется результату суммы текстовых строк , разделенных ; табличной части этого документа.
(20) serge_focus, сначала сделай запрос с обработкой ТЧ, затем обработай результат, закинь в ТЗ ссылки и текстовые представления ТЧ, и кидай параметром в следующий запрос, где эту ТЗ зальёшь во временную таблицу, а дальше - делай с ней чё хочешь - соединяй, выбирай, и т.д.
(21) andrewks - я вобщем-то по примерно такой схеме и сделал. Но занялся оптимизацией и подумал: - А вдруг можно сделать еще как-то по другому . Все одним запросом. Ан НЕТ :( .
Всем спасибо!
(22) serge_focus, все таки можно, здесь Консоль изучения запросов , 86 задание, мало того что надо собрать строки таблицы в одну, дык еще и по алфавиту ). Тему поднимали здесь, Mista . Осталась без ответа. Предлагаю обсудить. СКД, обработка результата запроса не подходит, все чисто в запросе.
ну, приведите решение, раз можно.
и, кстати, какое точно задание? ссылка не просматривается
(24) andrewks, если бы я его решил, то вопроса бы не было) И это задание 13 человек точно решило ) Можно даже фамилии в списке посмотреть.
Вот задание:
"Для каждого производителя перечислить в алфавитном порядке с разделителем "/" все типы выпускаемой им продукции."
Производитель - справочник и Типы оборудования - справочник. То есть кол-во типов продукции не ограничено.
(25) rar_xxx, задача не имеет решения в общем виде в рамках нединамического запроса 1С без СКД.
что там и как они "нарешали", мне отсюда не видно, поэтому судить не берусь
"Для каждого производителя перечислить в алфавитном порядке с разделителем "/" все типы выпускаемой им продукции."
Производитель - справочник и Типы оборудования - справочник.
и какая связь между этими справочниками?
(31) rar_xxx, ну, тогда не знаю. можно пофантазировать, например, там нет жёсткого условия, что это должно быть в одну строку.
(35) andrewks, ну я уже нафантазировал на макс 3 типа оборудования, 3мя внутренними соединениями одинаковой таблицы, как еще собирать строчку из нескольких, я пока не представляю. У них в справочнике типОборудования всего 3 типа и мой ответ идентичен ихнему, но он не принимается системой, пишет несоответствие типов, ну это там часто ихняя ошибка проверки задания. я им отправил запрос попросил намекнуть куда копать, если он не верен, пока молчат, жду )
(38) andrewks, блин сервис молчит, сейчас еще писмишко отправлю, у меня время капает и рейтинг из за этого тоже ( добился от одной участницы решения, она решала путем 3х левых соединений с таблицей различных производителей.
Я решал путем 3х внутренних соединений в условиях соединений предусмотрел сортировку.
(39) rar_xxx, ну, т.е. речь идёт не об универсальном решении, а рассчитаном на не более, чем Х (=3) значений, я правильно понял?
(40) andrewks, ну вот тут то и вопрос к создателям сервиса, я могу написать текст запроса на конечное кол-во ТиповОборудования, в условии задачи не говорится о том что например "предположим что макс. кол-во оборудования - 3".
Исходя из того что 13 человек эту задачу решили, я сделал предположение, что возможно как то написать запрос на бесконечное кол-во типовОборудования. Хотя вот одна участница данного мероприятия, которая решила эту задачу, мне написала свой запрос который тоже ограничен 3мя типамиОборудования.
Я конечно мог ответить ее запросом и пройти дальше, но сейчас мне уже интересно в чем истина )
(44) rar_xxx, я всё-таки считаю, что решения в общем виде не существует (в рамках чистого запроса 1С), и имеет место некорректное задание
(44)(45)(46)(47)(49) У меня есть решение. Из-за своей громоздкости практического значения оно, на мой взгляд, не имеет. Говорю о нем лишь для того, чтобы Вы не были так категоричны в оценках возможностей языка запросов. Публиковать я его пока не решился, так как обычная реакция на такие мои решения: "вот это жесть!". Сомневаюсь, что 13 человек применили именно его. Думаю, что там шла речь о чем-то вроде
Номера строк можно получить тэта-соединением, подсчитав для каждой строки число меньших строк.
Мое решение "агрегатная конкатенация" основано на последовательном попарном соединении смежных строк и начальном расположении строк на листьях бинарного дерева. Применять пришлось лишь однажды - для очистки артикулов от мусора.
(50) ildarovich, сказав "А" - говорите "Б".
хотелось бы увидеть решение, если оно есть, каким бы ужасным оно не было (лично у меня интерес сугубо теоретический)
(50) ildarovich, давайте посмотрим на Ваше решение, чтобы мы не были столь категоричны. Я бы (лично) с удовольствием бы на него взглянул. Если настолько стеснительно оное вам выкладывать, напишите в личку. Со своей стороны, даю слово, что если Ваше решение решает задачу с произвольным количеством строк только одним запросом на языке 1С, который можно скопировать в консоль и получить желаемый результат - я, посыпав голову пеплом, напишу что вы действительно это сделали. Все вопросы быстродействия, громоздкости и т.д. опускаем, т.к. к существу вопроса они не относятся. Вопрос, если вы не против, поставим так: есть таблица ТАБЛ с одним полем КОЛОНКА. Количество записей в таблице - произвольное. Ваш запрос возвращает одну запись, состоящую из одного поля, значением которой будет перечислением всех записей таблице ТАБЛ, как вы об этом и упомянули выше.
(52) А чем будет задаваться порядок соединяемых строк? Ведь операция конкатенации не коммутативна(результат зависит от порядка операндов)? Значит, еще должен быть столбец, который определит порядок строк в соединении? Могу я рассчитывать, что строки будут пронумерованы?
(54) ildarovich, перед всеми действиями ИМХО надо нумеровать, ну хотя все зависит от того каким алгоритмом ты собираешься собирать строки(я собирал 3мя внутренними соединениями и по номеру ориентировался добавлять/наименование или нет). Нумерую внутренним соединением таблицы саму с собой, в условии соединения участвуют наименования указываешь = в зависимости от того по алфавиту надо нумеровать или нет.
(55) Кажется, что сортировка подстрок по алфавиту перед соединением в одну строку - довольно экзотическое требование. Не хочется сужать задачу. С другой стороны, тут есть определенная проблема, что одинаковые подстроки получат после сортировки по алфавиту одинаковые номера. И придется, кроме номера еще заводить поле "число повторов". То есть и случай не типичный и задача усложняется. Поэтому я и спросил: не будет ли возражений , если в таблице ТАБЛ будет не одно поле КОЛОНКА, а два. Второе -"НомерСтроки" - порядковый номер строки в результирующем соединении. Тут должен ответить автор задачи (52), господин Новиков.
(57) ildarovich, Слишком много воды, вот задача подобная той из за которой создан этот топик "Для каждого производителя перечислить в алфавитном порядке с разделителем "/" все типы выпускаемой им продукции."
Производители и типы оборудования это справочники.
Не важно что это вообще будет просто таблица с >2 колонками любого содержания, 2я типа строка ее и надо собрать.
И как написал здесь (58) Новиков, забываем о порядке, не в порядке проблема.
Напиши свой запрос.
(54) ildarovich, давайте, если вы не против, чтобы соблюсти все правила исходной задачи, будем считать, что в поле КОЛОНКА все значения уже упорядочены по алфавиту, и в точно таком же порядке, нужно получить конечный список. Кажется, что такое допущение, не умоляет общности решения. Хотя, если вам будет угодно, мы вообще можем опустить порядок. В каком будет собираться - в таком и будет. Кажется, опять же, что для решения задачи в таком виде, порядок, не очень важен. Полагаю, что отсутствие столбца, для вас не будет являться главной проблемой.
(58) В моем запросе столбец "НомерСтроки" требуется. Но я все равно еще буду должен все протестировать - на это уйдет какое-то время. Что же, сделаю два варианта. С повторами будет еще сложнее, но постараюсь.
(59) Я понимаю Ваше нетерпение, но сейчас пока на работе, вечером или уже завтра постараюсь все сделать. А по поводу того, что порядок не важен - совершенно не правы. Вспомните: "казнить нельзя помиловать".
(60) ildarovich, с решением спешить не нужно. Хотелось бы увидеть законченный единый оттестированный запрос. Мы же не на экзамене, чтобы на время решать. Сколько нужно времени для того, чтобы появился такой запрос - столько и подождем. Ожидание только подогреет интерес к оригинальному авторскому решению :)
(54) ildarovich, я так понимаю, вопрос сводится к определению допустимости операции сравнения строк, т.к. в этом случае даже без колонки "номер строки" можно пронумеровать строки.
лично я думаю, что достаточно указать, например, так: таблица упорядочивается по некоторому столбцу "Х", в случае с одним столбцом из (52) - соответственно, по этому одному столбцу "КОЛОНКА"
Таблица значений часто применяется при программировании на 1С, потому что имеет множество полезных возможностей и работает очень быстро. Таблица значений создается в памяти и не сохраняется в базе данных, т.е. это временный набор данных.
//можно указать тип данных каждой колонки
//если тип данных колонки не указан, то можно хранить данные любого типа
Синтаксис: НоваяКолонка(, , , , , , , )
Добавление строк в таблицу значений
Перебор строк таблицы значений
Сортировка таблицы значений
Поиск в таблице значений
Синтаксис: НайтиЗначение(,,)
Возвращает число: 0 - значение не найдено; 1 - значение найдено
Если указан параметр , то поиск производится только по заданной строке
Если указан параметр , то поиск производится только по заданной колонке
Итоги и группировка таблицы значений
//часто требуется группировать строки и подсчитывать итоги по группам,
//в этом случае применяется метод Свернуть
Удаление строк и колонок из таблицы значений
ВНИМАНИЕ
Часто требуется удалить строки, удовлетворяющие определенному условию.
Так как при удалении строки из таблицы значений следующая строка становится текущей,
то указанная ниже программа может удалить НЕ ВСЕ необходимые строки.
В этом случае я рекомендую использовать следующий прием:
А вот еще один правильный алгоритм, предложенный Wlad:
Замечание(Туц). Предыдущий вариант не совсем правильный. Случай, когда последняя строка попадает под условие и в условии идёт обращение к строке таблицы, приводит к ошибке. Т.е. происходит попытка чтения для строки 0.
И ещё вариант, предложенный Туц:
Замечание (vligm). А я использую такой алгоритм (это, собственно говоря, шаблон):
Таблица значений как элемент диалога
Таблица значений может использоваться в экранных формах как элемент диалога с пользователем.
Методы УстановитьЗначение и ПолучитьЗначение
Эти методы позволяют обращаться к данным в таблице значений для чтения и записи.
Они могут пригодиться в особых случаях при написании универсальных программ (мастеры отчетов и т.д.).
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1С 8.x : Как убрать лидирующие нули в номере Документа (вариант2) 0
Скопировать строку с номером, с лидирующими нулями, в числовом поле (с форматом без групп, без группировки), и вернуть(скопировать) обратно в строковом поле с номером. Возвращает без нулей. COM-подключение к базе 7.7 из 8.2 1С 6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=" D: ВашаБаза 1с77 " ; Пользователь= Автоматическая установка ширины колонки табличного документа. 0
Процедура, которая " примерно" делает автоширину колонок (навроде, как если бы выделить все колонки и дважды щелкнуть мышкой по границе заголовка колонки). Привожу текст, работает неахти, но лучше чем ничего: Процедура РасчетШириныКолонок(Табличный Посмотреть все результаты поиска похожих
Еще в этой же категории
Вывод картинки (изображения) на печать, в макет (табличный документ) 32
// 1-й вариант //Как вывести картинку в табличный документ? ТабДок = Новый ТабличныйДокумент; Макет = ОбработкаОбъект.ПолучитьМакет(" Макет" ); ОбластьКартинки = Макет.ПолучитьОбласть(" ОбластьСКартинкой" ); Картинка = Новый Картинка(ПутьККа Вывести табличный документ в PDF 18
Данный пример работает на платформе выше 8.2.13 Макет = ПолучитьМакет(" Макет" ); ОбластьШапка = Макет.ПолучитьОбласть(" Шапка" ); ТабДок = Новый ТабличныйДокумент; ОбластьШапка.Параметры.НомерДок = Номер; ОбластьШапка.Параметры.ДатаДок = Как программно изменить текст, цвет, фон ячейки или области табличного документа? 7
Ниже приведено несколько полезных шаблонов кода по работе с табличным документом: //Пример получения текста ячейки ПолеТабДок = ЭлементыФормы.тдПолеТабличногоДокумента; ПолеТабДок.Область("R1C2").Текст = спрНоменклатура.Наименование; ПолеТабДок Как в отобразить картинку в табличной части 7
В табличной части есть документы заявки от покупателя, нам нужно добавить картинку для отображения статуса документов заявка - проведен , не проведен, помечен на удаление. //Отобразим картинку Процедура СписокПриВыводеСтроки(Элемент, Оформление Вывод колонтитулов программно ВерхнийКолонтитул, НижнийКолонтитул 6
Колонтитул является специальным текстом, выводимым вверху или внизу каждой страницы при выводе документа на печать. В тексте колонтитула можно использовать следующие управляющие конструкции: > ( >) - при печати в данном месте будет выведен номер ст Посмотреть все в категории Табличный документ
Читайте также: