1с как массив сохранить в табличный документ
Когда возникла необходимость вывести данные табличной части документа в отчет, то, перерыв множество сайтов, в том числе и на Инфостарте, нашла несколько дельных советов-руководств к действию, но, к сожалению, ни один сразу не оказался действенным, ибо найти написанный подробным образом расписанный вариант не получилось.
Моя конфигурация - 1С Университет ПРОФ, редакция 1.1 (1.1.7.1), хотя в данном вопросе суть не в этом.
Создание отчета выполняется через систему компоновки данных.
Моя задача была вот в чем:
Отчет создается через Систему компоновки данных.
На вкладке "Связи" настраиваем связь между этими наборами данных.
Источник связи - НаборДанных1, приемник связи - НаборДанных2, Выражение источник - Ссылка из НаборДанных1, Выражение приемник - Ссылка из НаборДанных2.
Для того, чтобы в поле табличной части (Авторы.Автор) вывести всех авторов через запятую, переходим на вкладку Ресурсы.
Выбираем поле Авторы.Автор и в части "Выражение" пишем:
то есть мы указываем, что объединяем массив данных и размещаем записи через ", ".
В настройках отчета создаем группировку, я поле не выбирала, т.е. добавила ДетальныеЗаписи.
Ну, и как обычно выбираем поля, которые отчет должен отражать, и добавляем отборы.
Специальные предложения
Удивляет, что появлении незнакомой задачи люди пытаются перерыть множество сайтов, но не документацию.
Выложить разработкой простейшее использование базовых возможностей СКД это круто.
Но раз люди плюсуют, значит, кому-то действительно полезно.
Где-то на сайте уже было описано года два назад. Я помню, потому что мы тогда делали серию похожих отчетов с выводом данных из ТЧ.
1. Адский баян.
2. Достаточно просто использовать Массив, без СоединитьСтроки, тогда ещё и расшифровка будет работать. (Если не нужны экзотические разделители.)
(6) Я бы сказал, это описано в документации по СКД (F1) N лет назад.
(10) dock, F1 в конфигураторе
"1С:Предприятие 8" - "Система компоновки данных" - "Язык выражений системы компоновки данных"
СоединитьСтроки (JoinStrings)
Предназначена для объединения строк в одну строку.
Синтаксис:
СоединитьСтроки (Значение, РазделительЭлементов, РазделителиКолонок)
Параметры:
Значение - выражения, которые нужно объединить в одну строку. Если является Массивом, то в строку будут объединяться элементы массива. Если является ТаблицаЗначений, то в строку будут объединяться все колонки и строки таблицы;
РазделительЭлементов - строка, содержащая текст, который нужно использовать в качестве разделителя между элементами массива и строками таблицы значений. По умолчанию – символ перевода строк;
РазделителиКолонок -строка, содержащая текст, который нужно использовать в качестве разделителя между колонками таблицы значений. По умолчанию "; ".
Пример:
СоединитьСтроки(ТаблицаЗначений(НомерТелефона, Адрес));
Массив (Array)
Функция формирует массив, содержащий для каждой детальной записи значение параметра.
Синтаксис:
Массив([Различные] Выражение)
В качестве параметра можно использовать таблицу значений. При этом результатом работы функции будет массив, содержащий значения первой колонки таблицы значений, переданной в качестве параметра.
Если выражение содержит функцию Массив, то считается, что данное выражение является агрегатным.
Если указано ключевое слово Различные, то получаемый массив не будет содержать дублирующихся значений.
Пример:
Массив(Контрагент)
Жаль, что раньше этой статьи не было. Сэкономил бы много времени. Действительно полезная функция. Спасибо автору.
(15)
Например есть таблица с 2 колонками.
В первой договоры контрагента, во второй документы реализации.
По каждому договору может быть несколько документов.
Как вывести Документы одной ячейкой для каждого договора не используя ресурсы?
Доброго времени суток.Я новичок в 1с,так что прошу быть снисходительными. Ситуация такая, имеется массив структур, некоторые из элементов структур - массивы. Как вывести в табличный документ все значения элементов массива?
(3) Ага. Мы добавили в ваши структуры структуры, чтобы вы могли выводить структуры, пока выводите структуры.
Вот кусок написанной мною лабуды.Прошу прощение за оформление,пока только учусь. Выводится только область "НомерЗаказа".
"Если НЕ МассивСтруктур[I].Свойство(МассСтрок) = Ложь Тогда" -это часть кода,и эта проверка мне нужна. Если вам режет глаза,можете просто игнорировать,на сколько мне видится это никак не влияет на ситуацию.
(8) каким образом,если необходимые мне значения находятся в структуре,элементом которой является массив? Для чего ввести новую переменную?Да и как это изменит результат?)Мне необходимо из собранного массива выводить элементы в табличный документ. Т к элементами являются структуры, я не понимаю как вывести её значения,имеющие разные типы.(Старался выразиться наиболее понятно)
(9) затем, чтобы у читающего твой код не было ощущения, что он в *овне копается; для этого же, кстати, есть оператор цикла "Для каждого"
(10) К сожалению,я все равно не понимаю,вместо чего вы хотели бы видеть переменные. Причина этому то ли моя непроходимая тупость,то ли отсутствия опыта. В любом случае прошу прощение за "*овно".
(12) Видимо я не верно описал проблему.До самого значения Массива или СТруктуры я добраться могу,возникает проблема с непосредственным выводом в ТабДок через макет.
(13) хватит унижаться перед ними, настоящий 1сник начинает агриться и язвить что в первом посте уже упоминал что опыта нет, а если у кого то проблемы со зрением или вниманием они идут лесом, больше по теме или идите в другие ветки обсуждать ваши зп
(15) Первый день на вашем форуме, да и я пока ещё не "настоящий 1сник",так что подобной наглости позволить себе не могу.
(14) а что у тебя не получается? если используешь метод заполнить() то имена параметров должны совпадать с ключами структуры или делай явно:
одну и ту же область ты можешь выводить в цикле, заполняя ее параметр:
(17) Все сделал именно так,ключи совпадают.Но когда пишу Вывести() и указываю область, макет пуст. То что в массиве есть эти значения с этими ключами - я проверил в отладчике. Но выводится только область "НомерЗаказа", собственно в ней значение в структуре одного типа. А за это областью должна следовать другая область,в неё нужно вывести элемент структуры с типом массив(Список Номенклатур Определенного заказа), и вот тут и возникает проблема.
(23) В таком случае я могу написать так.Только ничего не меняется.Выводится у меня только "НомерЗаказа".
Господа,возвращаясь к ТС,имеется пресловутая структура,в которой первый элемент,к примеру,имеет тип "Строка",который содержит номер заказа,а второй - массив с наименованиями номенклатуры.Необходимо выводить Номер заказа,а рядом массив Номенклатур в цикле,не могу разобраться как это сделать. В результате моих стараний,он выводит все в одну строку.
(26) но зачем вам сдались структуры из массивов? Этот дурдом. Ведь нет такого в 1с. Работайте как все, не выпендривайтесь. Освойте обычную работу в 1с. Где-то на 5-й 7-й год плавненько начнете переходить на массивы.
(27) все довольно просто,я пытаюсь соорудить внешнюю обработку, что-то вроде отчета АнализПроизводства. Собрал все необходимые мне данные в массив.То есть,какай-то заказ реализовывался поэтапно,и мой массив содержит элементы с данными дат отгрузки,реализации,производста,количества и т.д. И теперь мне это нужно вывести в документ. Лучшего "контейнера" для хранения разнотипных данных чем структура - я не знаю.
"но зачем вам сдались структуры из массивов?" Тем не менее,мне необходимо собранный мною массив структур вывести в ТабДок, именно для этого здесь и написал,в надежде на помощь.
Проблема свелась к тому, как объединить ячейки,то есть чтоб была одна ячейка Номер - и напротив список номенлкатуры для этого номера(что-то врое "плюсика",как я понимаю)
(28) пользуйтесь таблицей значений. Выбросьте нафиг все эти массивы. Это же надо так напиться, чтобы соорудить такую фигню.
Путем простого перебора и вывода в табличный документ, вот пример:
Похожие FAQ
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 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 " ; Пользователь= Посмотреть все результаты поиска похожих
Еще в этой же категории
Сравнение двух структур 7
// Сравнение 2-х стурктур // Возвращает структуру с полями которые отличаются и значением из сравниваемой // Если в стСравнимое нет нужного поля,то в результат добавляется поля = Неопределенно // стОсновная, стСравнимое - сравниваемые структуры Массив ~ Как удалить повторяющиеся элементы массива? 6
Функция УдалитьПовторяющиесяЭлементыМассива(Массив) Экспорт ТекущийИндекс = 0; ВсегоЭлементов = Массив.Количество(); Пока ТекущийИндекс ВсегоЭлементов Цикл Индекс2 = ТекущийИндекс + 1; Пока Индекс2 ВсегоЭлементов Цикл Если Массив = Структура ~ Преобразовании Структуры в Таблицу Значений 4
//Струтура в ТЗ Функция СтруктураВТЗ(Структр) ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить(" Значение" ); ТЗ.Колонки.Добавить(" Описание" ); Для Каждого ТекЭлем из Структр Цикл НовСтр=ТЗ.Добавить(); НовСтр.Значение = ТекЭлем.Ключ; НовСтр Структура ~ Создать структуру и добавить элементы 3
// Создание структуры СозданнаяСтруктура = Новый Структура; // Создание структуры и добавление элементов СтруктураОтбора = Новый Структура; СтруктураОтбора.Вставить(" Качество" , Качество); СтруктураОтбора.Вставить(" Номенклатура" , Номенкла Массив ~ Как Свернуть Массив? 2
НовыйМассив = Новый Массив; Соответствие = Новый Соответствие; Для каждого ЭлементМассива Из Массив Цикл Соответствие.Вставить(ЭлементМассива); КонецЦикла; Для каждого КлючИЗначение Из Соответствие Цикл НовыйМассив.Добавить(КлючИЗначение.Знач Посмотреть все в категории Работа с Массивом, Структурой, Соответствием
Пример функции формирующей печатную форму Счета по Ссылке на документ:
Похожие FAQ
Еще в этой же категории
Как программно изменить текст, цвет, фон ячейки или области табличного документа? 7
Ниже приведено несколько полезных шаблонов кода по работе с табличным документом: //Пример получения текста ячейки ПолеТабДок = ЭлементыФормы.тдПолеТабличногоДокумента; ПолеТабДок.Область("R1C2").Текст = спрНоменклатура.Наименование; ПолеТабДок Загрузка данных из файла табличного документа в управляемом приложении 3
В управляемом приложении (если конечно вы не работаете в Толстом клиенте) можно столкнутся с такой проблемой, что многие функции работают только на сервере. Что делать, если у Вас есть файл-макет с данными, которые надо прочитать (обработать)? Надо Как при печати выводить шапку на каждой странице (ПовторятьПриПечатиСтроки)? 1
Необходимо при печати, если происходит переход на следующую страницу таблицы, выводить шапку таблицы вверху на новой странице. для печати шапки на каждой странице в языке программирования есть специальный метод - ПовторятьПриПечатиСтроки Прим Как преобразовать MXL файл в Таблицу Значений? 0
Встретилась задачка, нужно было загружать данные из mxl файлов выгруженных из другой базы 1С. Файл MXL – это созданный в программе «1С: Предприятие» (последних версий 7.7 или 8) табличный документ. вот код быстрой конвертации mxl в тз ТабДок Как сделать Расшифровку в табличном документе 0
Вопрос: Подскажите пожалуйста, каким образом можно сделать следующее. У меня есть выводимый в табличный документ результат запроса, к ячейке есть расшифровка. Я хочу чтобы при двойном клике на ячейку выполнялась процедура которая к примеру зап Посмотреть все в категории Табличный документ
После манипуляции с файлом необходимо его закрыть. В противном случае он останется захваченным в системе, и мы не сможем его использовать в других приложениях.
Клиент-Серверный вариант в управляемых формах.
1. Считываем данные из файла в массив из структур и затем этот массив передаем на сервер для дальнейших манипуляций с данными.
2-ой способ - это передать файл Excel на сервер через хранилище данных и далее работать с ним уже на сервере.
Очень часто приходится работать с очень большими файлами Excel, и его обработка путем перебора строк занимает огромное количество времени.
В таких случаех удобно в одно действие загрузить всю таблицу в массив и в потом работать уже непосредственно с массивом.
На выходе получаем двумерный массив, который содержит все данные указанного листа Excel
Полезные функции при работе с Excel:
Устанавливает видимость Excel при работе |
Добавление новой книги в файл Excel |
Сохранение книги Excel |
Добавление нового листа к книге |
Переименование листа |
Изменение маштаба листа |
Изменение ориентации листа |
Отступы листа |
Обращение к ячейки чтение/запись |
Обращение к области ячеек |
Очень часто при чтении или записи значений в Excel ставятся лишние пробелы в числе, например, вместо 1502 он читает как 1 502 и в дальнейшем это значение не приводится к числу. Эту проблему можно решить заменой. |
Объединение ячеек |
Работа с именованными ячейками в Excel |
Удаление ячейки |
Удаление области ячеек |
Обращение к строке |
Изменение ширины колонки |
Обращение к колонке |
Удаление Строки |
Фон ячейки / области / Строки / |
Функция переводит цвет из формата RGB в формат Excel |
Управление шрифтом в ячейки/строке/области |
Р азрешает переносить по словам в ячейке |
Управление рамкой ячейки |
Устанавливаем формат ячейки |
Формула в ячейки |
Формула в ячейки |
Формула в ячейки |
Формула в ячейки |
Функция для получения ширины колонки Excel Спасибо пользователю goodwill |
Разрешить перенос слов в ячейке Спасибо пользователю roofless |
Группировки данных на листе Спасибо пользователю dr-wit, ignor |
При работе с Excel мы оперируем столбцами как числом (Например, 1 столбец), а у Excel адресация столбцов производится с помощью символов. И когда нам нужно отредактировать формулу, то нам нужно номер столбца преобразовать в символ. В таких случаях вам пригодится эта функция.
2. Работа с Excel через ТабличныйДокумент 1С
С помощью данного метода можно и загружать из Excel и выгружать в Excel. Но на мой взгляд этот метод идепально подходит когда вам необходимо посто сохранить информацию в Excel без дальнейшей манипуляции.
Итак, приступим: загрузка из Excel:
1. Загружаем файл Excel в табличный документ
2. Производим манипуляции уже с ТабличнымДокументом
Давайте теперь разберем сохранение в Excel с помощью данного метода:
Тут все очень просто сначала мы формируем обычный Табличный документ и затем записываем его в Excel
2. Работа с Excel ADODB
Выражаю особую благодарность коллеги Fragster за хороший комментарий
Данный метод позволяет работать с Excel через ODBC и имеет ряд преимуществ:
- Не требует установки самой Excel, необходима лишь установить ODBC. Но как правило он уже установлен. Это особенность позволяет работать на стороне сервера без дополнительных установок Excel.
- Позволяет работать с таблицой Excel как с БД и строить к ней запросы на T-SQL. Таким образом мы можем делать отборы еще на этапе чтения данных и другие преимущества что дает Т-SQL. Что на мой взгляд огромный плюс.
Подключение к ADO
Отключение от ADO
Выполнение запроса
Пример запроса:
Запись в Excel тоже производится в виде запроса:
Хочу отметить что наименование полей производится по первой строке в таблице
ADODB предоставляет ряд объектов, с которыми мы работаем
ADODB.Recordset
В файле продемонстрированны оба варианта работы с запросами.
На этом пока все. По возможности буду дополнять статью :)
В архиве находится обработка, которая демонстрирует все описанные и другие возможности при работе с Excel.
Читайте также: