ДеревоЗначений в ТекстовыйДокумент Код 1C v 8.2 УП // Выводит данные ДереваЗначений в ТекстовыйДокумент, пригодный к рассмотрению в отладчике, окне сообщений и показу.
//
// Параметры:
// рВетка - дерево значений, подлежащее выводу. Может иметь почти любую глубину иерархии, количество и тип колонок. Если хватит
// объявленных позиционных строк-заполнителей, всё поместится. Если иерархия слишком глубока, строки просто надо нарастить;
// рТекст - на входе должен быть равен Неопределено; на выходе по окончании работы содержит результатный текстовый документ;
// рПараметры - структура дополнительных настроек, допустимые ключи:
// Колонки - структура колонок, которые подлежат выводу. Если пуста или имеет тип, отличный от структуры, выводятся все колонки;
// если в ключах структуры указаны имена колонок, будут выведены только они. В значениях структуры можно передать строковое
// представление формата, согласно которому должны будут форматироваться выводимые значения. По умолчанию формата нет;
// ПоказыватьУровни - булево, управляет выводом №№ уровней (метод Уровень()), по умолчанию выключено;
// ШагОтступа - число, определяющее шаг в символах, используемый для показа псевдографики иерархии веток в дереве.
//
&НаСервереБезКонтекста
Процедура ВывестиДеревоЗначенийВТекст(Знач рВетка,рТекст,Знач рПараметры=Неопределено)
Попытка
Если рТекст=Неопределено Тогда // первая итерация, шапочный вызов исходной части
//---------------------------------------------------------------------------------------------------------------------------
// Разбираем входные данные
Если ТипЗнч(рВетка)<>Тип("ДеревоЗначений") Тогда Возврат КонецЕсли;
Если ТипЗнч(рПараметры)<>Тип("Структура") Тогда рПараметры=Новый Структура КонецЕсли;
стрКолонок=?(рПараметры.Свойство("Колонки"),рПараметры.Колонки,Неопределено);
Если ТипЗнч(стрКолонок)<>Тип("Структура") Тогда стрКолонок=Новый Структура КонецЕсли;
рПоказыватьУровни=?(рПараметры.Свойство("ПоказыватьУровни"),рПараметры.ПоказыватьУровни,Ложь); // затратное дело, кстати
рШагОтступа=?(рПараметры.Свойство("ШагОтступа"),рПараметры.ШагОтступа,2); // для отображения отступа в колонке иерархии
//---------------------------------------------------------------------------------------------------------------------------
// Определяем максимальное количество уровней
// Также можно получить максимальный уровень, "плоско" перебрав все строки (например, получив их через НайтиСтроки)
// и в цикле для каждой вызывая Уровень() и определяя максимум.
// Вариант через СКД и служебное поле "Уровень" ни на одной известной мне платформе не работоспособен (нехватка памяти).
//
//
//рДеревоДляТеста=КакНибудьСкопироватьДерево(рВетка);
//рДеревоДляТеста.Колонки.Вставить(0,"_Level",Новый ОписаниеТипов("Булево")); // самый экономный вариант, с сохранением иерархии
//мНенужных=Новый Массив;
//Для й=1 По рДеревоДляТеста.Колонки.Количество()-1 Цикл
// мНенужных.Добавить(рДеревоДляТеста.Колонки[й]);
//КонецЦикла;
//Для каждого кол Из мНенужных Цикл
// рДеревоДляТеста.Колонки.Удалить(кол);
//КонецЦикла;
//
рДеревоДляТеста=рВетка; // пока сериализуем прямо всё дерево (неоптимально, но...)
рЗапись=Новый ЗаписьXML;
рЗапись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(рЗапись,рДеревоДляТеста);
стро=рЗапись.Закрыть();
//
стро=СтрЗаменить(стро,"xmlns=","xmlns:myns1C="); // иначе не будет работать XPath
//
рЧтение=Новый ЧтениеXML;
рЧтение.УстановитьСтроку(стро);
постр=Новый ПостроительDOM;
рДокументДОМ=постр.Прочитать(рЧтение);
рВыражение="/ValueTree/row"; максКолвоУровней=1;
рРазыменователь=Новый РазыменовательПространствИменDOM(рДокументДОМ);
Пока Истина Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя();
#КонецЕсли
рРезультат=рДокументДОМ.ВычислитьВыражениеXPath(рВыражение,рДокументДОМ,рРазыменователь,ТипРезультатаDOMXPath.Любой);
Если рРезультат.ПолучитьСледующий()=Неопределено Тогда Прервать КонецЕсли;
рВыражение=рВыражение+"/row";
максКолвоУровней=максКолвоУровней+1;
КонецЦикла;
максКолвоУровней=максКолвоУровней-1; // можно и так: СтрЧислоВхождений(рВыражение,"/row")-1;
//---------------------------------------------------------------------------------------------------------------------------
// готовим исходный макет вывода
строПробелы=" ";
строРазделители="===============================================================================================";
строОтступы="___________________________________________________________________________________________"; // тут нужны чуть для другого
//
секШапка1="|[_HCS"+Лев(строПробелы,максКолвоУровней*рШагОтступа)+"]|"; // HierarchyColumnShow
секГорРазделитель1="|"+Лев(строОтступы,максКолвоУровней*рШагОтступа+6)+"|"; // здесь именно Отступы!
рШиринаКолонкиИерархии=СтрДлина(секШапка1)-2;
строПолейШапки="#Поле _HCS
| #Выравнивание Центр";
строПолейЗаписи="";
//
Если рПоказыватьУровни Тогда
секШапка1=секШапка1+"[_Level]|";
секГорРазделитель1=секГорРазделитель1+Лев(строРазделители,8)+"|";
строПолейШапки=строПолейШапки+"
|#Поле _Level
| #Выравнивание Центр";
строПолейЗаписи="#Поле _Level
| #Выравнивание Центр
| #Забивать Истина";
КонецЕсли;
//
мИменКолонок=Новый Массив;
Для каждого кол Из рВетка.Колонки Цикл
Если стрКолонок.Количество()<>0 и не стрКолонок.Свойство(кол.Имя) Тогда Продолжить КонецЕсли; // чётко указаны конкретные колонки
рДлинаИмениКолонки=СтрДлина(кол.Имя);
рНужнаяШирина=Макс(?(кол.Ширина<3,10,кол.Ширина),рДлинаИмениКолонки);
// к сожалению, ключевое слово "#Поля" неприменимо - платформа падает - поэтому делаем всё сами
секШапка1=секШапка1+"["+кол.Имя+Лев(строПробелы,рНужнаяШирина-рДлинаИмениКолонки)+"]|";
секГорРазделитель1=секГорРазделитель1+Лев(строРазделители,рНужнаяШирина+1)+"=|";
строПолейШапки=строПолейШапки+"
|#Поле "+кол.Имя+"
| #Выравнивание Центр";
рОписТипов=кол.ТипЗначения;
Если рОписТипов.Типы().Количество()=1 и рОписТипов.СодержитТип(Тип("Булево")) Тогда
рВыравнивание="Центр";
ИначеЕсли рОписТипов.СодержитТип(Тип("Число")) Тогда
рВыравнивание="Право";
ИначеЕсли рОписТипов.СодержитТип(Тип("Строка")) и рОписТипов.КвалификаторыСтроки.Длина=0 Тогда
рВыравнивание="ПоШирине";
Иначе
рВыравнивание="Лево";
КонецЕсли;
строПолейЗаписи=строПолейЗаписи+?(ПустаяСтрока(строПолейЗаписи),"",Символы.ПС)+"#Поле "+кол.Имя+"
| #Выравнивание "+рВыравнивание;
Попытка
Если ЗначениеЗаполнено(стрКолонок[кол.Имя]) Тогда // указан формат, уточняющий показ колонки
строПолейЗаписи=строПолейЗаписи+"
| #Формат """+СокрЛП(стрКолонок[кол.Имя])+"""";
КонецЕсли;
Исключение
КонецПопытки;
мИменКолонок.Добавить(кол.Имя);
КонецЦикла;
секШапка2=СтрЗаменить(СтрЗаменить(секШапка1,"[","<"),"]",">");
секЗапись1=секШапка1; секЗапись2=секШапка2; // пусть они по дизайну пока не отличаются
секГорРазделитель2=СтрЗаменить(СтрЗаменить(секГорРазделитель1,"=","-"),"|","+");
// обработаем нормальное обрамление шапки колонки иерархии
секГорРазделитель1=СтрЗаменить(секГорРазделитель1,"_","=");
секГорРазделитель2=СтрЗаменить(секГорРазделитель2,"_"," ");
//
тМакет=Новый ТекстовыйДокумент;
тМакет.ДобавитьСтроку("#Область Шапка");
тМакет.ДобавитьСтроку(строПолейШапки);
тМакет.ДобавитьСтроку(секГорРазделитель1);
тМакет.ДобавитьСтроку(секШапка1);
тМакет.ДобавитьСтроку(секШапка2);
тМакет.ДобавитьСтроку(секГорРазделитель1);
тМакет.ДобавитьСтроку("#КонецОбласти");
тМакет.ДобавитьСтроку("");
тМакет.ДобавитьСтроку("#Область Запись");
тМакет.ДобавитьСтроку(строПолейЗаписи);
тМакет.ДобавитьСтроку(секЗапись1);
тМакет.ДобавитьСтроку(секЗапись2);
тМакет.ДобавитьСтроку(секГорРазделитель2);
тМакет.ДобавитьСтроку("#КонецОбласти");
рПараметры.Вставить("ИсходныйМакет",тМакет); // пусть будет
//---------------------------------------------------------------------------------------------------------------------------
// Запускаем вывод в итоговый документ
рТекст=Новый ТекстовыйДокумент;
сек=тМакет.ПолучитьОбласть("Шапка");
сек.Параметры._HCS="Иерархия";
Для каждого имякол Из мИменКолонок Цикл
кол=рВетка.Колонки[имякол];
сек.Параметры[кол.Имя]=?(ПустаяСтрока(кол.Заголовок),кол.Имя,кол.Заголовок);
КонецЦикла;
рТекст.Вывести(сек);
//
пар=Новый Структура;
пар.Вставить("МассивИмёнКолонок",мИменКолонок);
пар.Вставить("ТекущаяСекция",тМакет.ПолучитьОбласть("Запись"));
пар.Вставить("ШиринаКолонкиИерархии",рШиринаКолонкиИерархии);
пар.Вставить("ПоказыватьУровни",рПоказыватьУровни);
пар.Вставить("Отступ",0);
пар.Вставить("ШагОтступа",рШагОтступа);
ВывестиДеревоЗначенийВТекст(рВетка,рТекст,пар);
Иначе
// очередная итерация, вывод в текстовый документ
мИменКолонок=рПараметры.МассивИмёнКолонок;
рСекция=рПараметры.ТекущаяСекция;
рОтступ=рПараметры.Отступ;
рШиринаКолонкиИерархии=рПараметры.ШиринаКолонкиИерархии;
рПоказыватьУровни=рПараметры.ПоказыватьУровни;
//
строОтступы="_________________________________________________________________________________________________________";
строПробелы=" ";
//
пар=Новый Структура;
пар.Вставить("МассивИмёнКолонок",мИменКолонок);
пар.Вставить("ТекущаяСекция",рПараметры.ТекущаяСекция);
пар.Вставить("ШиринаКолонкиИерархии",рШиринаКолонкиИерархии);
пар.Вставить("ПоказыватьУровни",рПоказыватьУровни);
пар.Вставить("ШагОтступа",рПараметры.ШагОтступа);
пар.Вставить("Отступ",рОтступ+рПараметры.ШагОтступа);
//
Для каждого рПодветка Из рВетка.Строки Цикл
рСекция.Параметры._HCS=Лев(строПробелы,рОтступ)+"\"+Лев(строОтступы,рШиринаКолонкиИерархии-рОтступ-1);
Если рПоказыватьУровни Тогда
рСекция.Параметры._Level=рПодветка.Уровень();
КонецЕсли;
Для каждого имякол Из мИменКолонок Цикл
рСекция.Параметры[имякол]=рПодветка[имякол];
КонецЦикла;
рТекст.Вывести(рСекция);
ВывестиДеревоЗначенийВТекст(рПодветка,рТекст,пар)
КонецЦикла;
//
КонецЕсли;
Исключение
Сообщить("ВывестиДеревоЗначенийВТекст, ошибка: "+ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
КонецПопытки;
КонецПроцедуры
Источник
Категория:
Работа с Деревом Значений Как результат СКД в виде Табличного Документа разобрать и вывести в Дерево Значений Процедура получает из СКД результат в виде Табличного документа, парсит его, создает в Дереве на форме колонки и заполняет дерево данными результата СКД
Смысл в том, что СКД не может вывести результат в объект на форму, если он Таблица - выдает ошибку "Не поддерживается вывод таблиц, диаграмм и вложенных отчетов в универсальную коллекцию значений".
Поэтому я выгружаю СКД в ТабличныйДокумент и вытаскиваю данные уже из него, далее строю и заполняю Дерево на форме
Код 1C v 8.х Процедура ЗаполнитьДерево()
ДеревоЗначений.Строки.Очистить();
КолРазмеров = 0;
СхемаКомпоновкиДанных = ПолучитьМакет("Схема");
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
Для Каждого ЭлементОтбора Из ПостроительОтчета.Отбор Цикл
Если Не ЭлементОтбора.Использование Тогда
Продолжить;
КонецЕсли;
ВидСравненияВОтборе = мСоответствиеВидовСравнения.Получить(ЭлементОтбора.ВидСравнения);
Если ВидСравненияВОтборе = Неопределено Тогда
Продолжить;
КонецЕсли;
Если Лев(ЭлементОтбора.ПутьКДанным, 8) = "Свойство" Тогда
ИмяПоля = "Номенклатура.["+мСоответствиеНазначений[ЭлементОтбора.Представление]+" (свойство)]";
ИначеЕсли Лев(ЭлементОтбора.ПутьКДанным, 9) = "Категория" Тогда
ИмяПоля = "Номенклатура.["+мСоответствиеНазначений[ЭлементОтбора.Представление]+" (категория)]";
Иначе
ИмяПоля = ЭлементОтбора.ПутьКДанным;
КонецЕсли;
ПолеОтбора = Новый ПолеКомпоновкиДанных(ИмяПоля);
Отбор = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = ПолеОтбора;
Отбор.Использование = Истина;
Отбор.ВидСравнения = ВидСравненияВОтборе;
Отбор.ПравоеЗначение = ЭлементОтбора.Значение;
КонецЦикла;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки,, Тип("ГенераторМакетаКомпоновкиДанных"));
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки);
ТабличныйДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных, Истина);
//ТабличныйДокумент.Показать();
КолДанных = 5; //кол. данных в колонке таблицы СКД
СоздатьДерево(ТабличныйДокумент, КолДанных);
СтКол = Новый Структура;
СтКол.Вставить("Ном", 1);
СтКол.Вставить("Дат1", 2);
СтКол.Вставить("Дат2", 3);
СтКол.Вставить("Прих", 4);
СтКол.Вставить("Реал", 5);
СтКол.Вставить("Возв", 6);
СтКол.Вставить("Остат", 7);
СтКол.Вставить("ВПути", 8);
СтрНом = Неопределено;
СтрДерева = Неопределено;
Для i=3 По ТабличныйДокумент.ВысотаТаблицы Цикл
ПерваяКолонка = ПолучитьЗначениеРасшифровки(ТабличныйДокумент, i, СтКол.Ном);
Если ТипЗнч(ПерваяКолонка) = Тип("СправочникСсылка.Номенклатура") Тогда
Если СтрНом Неопределено Тогда
СтрНом.Строки.Сортировать("Продажи УБЫВ");
СтрНом.ОстатокМагазин = СтрНом.Строки.Итог("ОстатокМагазин");
СтрНом.ОстатокСклад = СтрНом.Строки.Итог("ОстатокСклад");
КонецЕсли;
СтрНом = ДеревоЗначений.Строки.Добавить();
СтрДерева = СтрНом;
ИначеЕсли ТипЗнч(ПерваяКолонка) = Тип("СправочникСсылка.Склады") Тогда
СтрДерева = СтрНом.Строки.Добавить();
Дат1 = Формат(ПолучитьЗначениеРасшифровки(ТабличныйДокумент, i, СтКол.Дат1), "ДФ=dd.MM.yy");
Дат2 = Формат(ПолучитьЗначениеРасшифровки(ТабличныйДокумент, i, СтКол.Дат2), "ДФ=dd.MM.yy");
СтрДерева.Период = "" + Дат1 + " - " + Дат2;
Иначе
Продолжить;
КонецЕсли;
СтрДерева.Номенклатура = ПерваяКолонка;
СтрДерева.Остаток = ПолучитьЗначениеРасшифровки(ТабличныйДокумент, i, СтКол.Остат, Истина);
СтрДерева.Приход = ПолучитьЗначениеРасшифровки(ТабличныйДокумент, i, СтКол.Прих, Истина);
СтрДерева.Продажи = ПолучитьЗначениеРасшифровки(ТабличныйДокумент, i, СтКол.Реал, Истина);
СтрДерева.Возврат = ПолучитьЗначениеРасшифровки(ТабличныйДокумент, i, СтКол.Возв, Истина);
Если ЗначениеЗаполнено(СтрДерева.Родитель) Тогда
Если ПерваяКолонка.ТипСклада = Перечисления.ТипыСкладов.ТорговыйЗал Тогда СтрДерева.ОстатокМагазин = СтрДерева.Остаток;
Иначе СтрДерева.ОстатокСклад = СтрДерева.Остаток;
КонецЕсли;
Попытка СтрДерева.ПроцентПродаж = СтрДерева.Продажи * 100 / СтрДерева.Родитель.Продажи;
Исключение СтрДерева.ПроцентПродаж = "-";
КонецПопытки;
Иначе
СтрДерева.ПроцентПродаж = "100%";
КонецЕсли;
Для j=1 По КолРазмеров Цикл
СтрДерева["Ост" + j] = ПолучитьЗначениеРасшифровки(ТабличныйДокумент, i, 3 + КолДанных * j + 4, Истина);
СтрДерева["Пут" + j] = ПолучитьЗначениеРасшифровки(ТабличныйДокумент, i, 3 + КолДанных * j + 5, Истина);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура СоздатьДерево(ТабличныйДокумент, КолДанных)
КЧ = Новый КвалификаторыЧисла(10, 0);
Массив = Новый Массив;
Массив.Добавить(Тип("Число"));
ОписаниеТиповЧ = Новый ОписаниеТипов(Массив,,,КЧ);
Ном = 3 + КолДанных + 1; //колонки в таблич. документе (Ном/Склад, перв. дата, посл. дата)
КолРазмеров = (ТабличныйДокумент.ШиринаТаблицы - Ном-1) / КолДанных + 1;
Для i=1 По КолРазмеров Цикл
Размер = ПолучитьЗначениеРасшифровки(ТабличныйДокумент, 1, Ном, Истина, Ложь);
Ном = Ном + КолДанных;
Попытка
ДеревоЗначений.Колонки.Добавить("Ост" + i, ОписаниеТиповЧ, Размер, 5);
ДеревоЗначений.Колонки.Добавить("Пут" + i, ОписаниеТиповЧ, "Путь", 5);
ДеревоЗначений.Колонки.Добавить("Пер" + i, ОписаниеТиповЧ, "Пер", 5);
Исключение
КонецПопытки;
КонецЦикла;
ЭтаФорма.ЭлементыФормы.ДеревоЗначений.Значение = ДеревоЗначений;
ЭтаФорма.ЭлементыФормы.ДеревоЗначений.СоздатьКолонки();
i=1; НомерРазмера=1;
Для Каждого Кол Из ЭтаФорма.ЭлементыФормы.ДеревоЗначений.Колонки Цикл
Кол.ТолькоПросмотр = Истина;
Если i = (НомерРазмера + 8 + 1) Тогда
Кол.Положение = ПоложениеКолонки.НоваяКолонка;
ИначеЕсли i = (НомерРазмера + 8 + 2) Тогда
Кол.Положение = ПоложениеКолонки.НаСледующейСтроке;
ИначеЕсли i = (НомерРазмера + 8 + 3) Тогда
Кол.Положение = ПоложениеКолонки.ВТойЖеКолонке;
Кол.ТолькоПросмотр = Ложь;
НомерРазмера = НомерРазмера + 3;
КонецЕсли;
Если i=1 Тогда
Кол.Ширина = 20;
Иначе
Если i=2 Тогда Кол.Ширина = 11;
ИначеЕсли i9 Тогда Кол.Ширина = 7;
Иначе Кол.Ширина = 5;
КонецЕсли;
Кол.ИзменениеРазмера = ИзменениеРазмераКолонки.НеИзменять;
КонецЕсли;
i=i+1;
КонецЦикла;
КонецПроцедуры
Автор:
Абазин Антон Категория:
Схема Компоновки Данных Экспорт и Импорт данных 1С - Microsoft Excel Экспорт
Процедура ОсновныеДействияФормыЭкспорт(Кнопка) - выгружает из указанного справочника данные в режиме экспорта в файл в формате Microsoft Excel с указанным именем, используя преобразование данных к типу число и типу строка;
Код 1C v 8.х Процедура ОсновныеДействияФормыЭкспорт(Кнопка)
Попытка
Попытка
// Загрузка объекта Microsoft Excel
Состояние("Выгрузка данных из 1С в Microsoft Excel...");
ExcelПриложение = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Ошибка при запуске Microsoft Excel."
+ Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат;
КонецПопытки;
// Создадим книгу, по умолчанию в ней уже есть листы
Книга = ExcelПриложение.WorkBooks.Add();
// Используем первый лист книги Excel
Лист = Книга.WorkSheets(1);
// Сформировать шапку документа в первой строке листа
Колонка = 1;
Для каждого стр из ТП цикл
Если стр.Выгружать Тогда
Лист.Cells(1, Колонка).Value = стр.НазваниеРеквизита;
Колонка = Колонка + 1;
КонецЕсли;
КонецЦикла;
// Выгрузить данные справочника
выборка = Справочники[ИмяСправочника].Выбрать();
СтрокаЛиста = 2;
Пока выборка.Следующий() Цикл
Колонка = 1;
Для каждого стр из ТП цикл
Если стр.Выгружать Тогда
Попытка
// Установить значение в строке и колонке
Если ТипЗнч(выборка[стр.НазваниеРеквизита])=Тип("Число") Тогда
// Установить формат для типа Число
Лист.Cells(СтрокаЛиста, Колонка).NumberFormat = "0,00";
Лист.Cells(СтрокаЛиста, Колонка).Value =
Формат(выборка[стр.НазваниеРеквизита],"ЧГ=0");
иначе
// Для всех других типов установим формат "Текстовый"
Лист.Cells(СтрокаЛиста, Колонка).NumberFormat = "@";
Лист.Cells(СтрокаЛиста, Колонка).Value =
Строка(выборка[стр.НазваниеРеквизита]);
КонецЕсли;
исключение
// в случае ошибки вывести номер строки и колонки
Сообщить("Ошибка установки значения для: " +
выборка[стр.НазваниеРеквизита]);
Сообщить("Стр: " +СтрокаЛиста+ " Кол: " +
Колонка+ " Рек: " + стр.НазваниеРеквизита);
КонецПопытки;
Колонка = Колонка + 1;
КонецЕсли;
КонецЦикла;
СтрокаЛиста = СтрокаЛиста + 1;
Состояние("Экспорт из 1С в Excel " + СтрокаЛиста);
КонецЦикла;
// Сохраним созданную книгу в файл xls
Книга.SaveAs(имяФайла);
// Обязательно закроем соединение с COM объектом для освобождения памяти
ExcelПриложение.Quit();
Сообщить("Файл выгружен успешно: " + имяФайла );
Исключение
// Обработка ошибок экспорта данных из 1С в Excel
Сообщить("Ошибка записи данных файла :" + имяФайла);
Сообщить(ОписаниеОшибки());
Попытка
ExcelПриложение.Quit();
Исключение
КонецПопытки;
КонецПопытки;
КонецПроцедуры
Импорт
Исходный код процедуры 1С для загрузки XLS файла:
Код 1C v 8.х Процедура ЧтениеXLSФайла(Элемент)
Если ПустаяСтрока(ИмяФайла) Тогда
Предупреждение("Для запуска обработки необходимо предварительно выбрать файл Microsoft Excel.");
Возврат;
КонецЕсли;
Попытка
// Загрузка Microsoft Excel
Состояние("Загрузка Microsoft Excel...");
ExcelПриложение = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Ошибка при загрузке Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат;
КонецПопытки;
Попытка
// Открытие файла Microsoft Excel
Состояние("Открытие файла Microsoft Excel...");
ExcelФайл = ExcelПриложение.WorkBooks.Open(ИмяФайла);
Исключение
Сообщить("Ошибка открытия файла Microsoft Excel." + ИмяФайла + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;
Попытка
// Обработка файла Microsoft Excel
Состояние("Обработка файла Microsoft Excel...");
// Читаем данные первого листа книги
ExcelЛист = ExcelФайл.Sheets(1);
// Определить количество строк и колонок выбранного листа книги Excel
xlCellTypeLastCell = 11;
ExcelПоследняяСтрока = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Row;
ExcelПоследняяКолонка = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Column;
Исключение
Сообщить("Ошибка открытия листа №1 Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
// Закрыть COM соединение для экономии памяти
ExcelПриложение.Quit();
КонецПопытки;
// Создание описателя типов для таблицы значений
КЧ = Новый КвалификаторыЧисла(15,2);
КС = Новый КвалификаторыСтроки(50);
Массив = Новый Массив;
Массив.Добавить(Тип("Строка"));
ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);
Массив.Очистить();
Массив.Добавить(Тип("Число"));
ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
// Очистить предыдущие значения
ТаблицаДокумента.Очистить();
ТаблицаДокумента.Колонки.Очистить();
// Создать колонки табличного документа
ТаблицаДокумента.Колонки.Добавить("Номер",ОписаниеТиповС,"Номер",5);
ТаблицаДокумента.Колонки.Добавить("Артикул",ОписаниеТиповС,"Артикул",11);
ТаблицаДокумента.Колонки.Добавить("Описание",ОписаниеТиповС,"Описание",25);
ТаблицаДокумента.Колонки.Добавить("Цена",ОписаниеТиповЧ,"Цена",6);
// Последовательное чтение строк с выбранного листа
Для Строка = 1 По ExcelПоследняяСтрока Цикл
// Обработка нажатия Ctrl + Break
ОбработкаПрерыванияПользователя();
// Добавить данные в табличную часть экранной формы
Стр=ТаблицаДокумента.Добавить();
Стр.Номер = Строка;
Попытка
Стр.Артикул = ExcelЛист.Cells(Строка, 1).Value;
Стр.Описание = ExcelЛист.Cells(Строка, 2).Value;
Стр.Цена = ExcelЛист.Cells(Строка, 3).Value;
Исключение
// Не редко происходит ошибка конвертации отдельной ячейки документа
Сообщить("Ошибка чтения строки файла Microsoft Excel." + Строка + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;
// Отобразить информацию о ходе выполнения обработки
Состояние("Обработка файла Microsoft Excel : "
+ "строка " + Строка + " из " + ExcelПоследняяСтрока);
КонецЦикла;
// Закрыть COM соединение для экономии памяти
ExcelПриложение.Quit();
// Отобразить результаты загрузки в форме элемента
ЭлементыФормы.ТаблицаДокумента.Значение = ТаблицаДокумента;
ЭлементыФормы.ТаблицаДокумента.СоздатьКолонки();
КонецПроцедуры // ЧтениеXLSФайла(Элемент)
Категория:
Работа с Microsoft Office и OpenOffice Временные таблицы, что из себя представляют и как с ними работать? Временные таблицы - хранятся на сервере и позволяют писать более простые запросы.
Временные таблицы хранятся в объекте типа
МенеджерВременныхТаблиц . Когда этот объект уничтожается, уничтожаются и временные таблицы.
Чтобы создать временную таблицу, используется ключевое слово "
ПОМЕСТИТЬ В ", например:
Код 1C v 8.х |ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ В ВТТовары
Временная таблица создается при выполнении запроса, если повторно выполнить запрос, то выдастся ошибка, что таблица уже существует.
Описания временных таблиц хранятся в свойстве запроса МенеджерВременныхТаблиц. К сожалению, нельзя получить список временных таблиц, которые хранятся в запросе.
Пример 1: Как можно выгрузить временную таблицу в таблицу значений и как использовать менеджер временных таблиц:
Код 1C v 8.х Запрос=Новый Запрос("ВЫБРАТЬ * ИЗ Справочник.Номенклатура ПОМЕСТИТЬ В ВТТовары");
Запрос.Выполнить(); //Создалась таблица ВТТовары
ЗапросТМП=Новый Запрос("ВЫБРАТЬ * ИЗ ВТТовары");
ЗапросТМП.МенеджерВременныхТаблиц=Запрос.МенеджерВременныхТаблиц; //Копируем ссылку на временные таблицы
ТЗ=ЗапросТМП.Выполнить().Выгрузить(); //Получаем временную таблицу в таблице значений
Готовую таблицу значений из памяти можно выгружать в менеджер временных таблиц запроса. Единственное условие - колонки таблицы значений должны быть типизированными, т.е. иметь тип. Вот пример, демонстрирующий это:
ТЗ=Новый ТаблицаЗначений();
//Колонки должны быть типизированы
ТЗ.Колонки.Добавить("А", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("Б", Новый ОписаниеТипов("Строка"));
//Заполняем таблицу данными
Стр=ТЗ.Добавить();
Стр.А="А";
Стр.Б="Б";
Стр=ТЗ.Добавить();
Стр.А="А1";
Стр.Б="Б1";
//Загружаем таблицу значений в менеджер временных таблиц запроса
Запрос=Новый Запрос("Выбрать Т.А, Т.Б ПОМЕСТИТЬ ВТТаб Из &Таб Как Т");
//Вариант: Запрос=Новый Запрос("Выбрать * ПОМЕСТИТЬ ВТТаб Из &Таб Как Т");
Запрос.МенеджерВременныхТаблиц=Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Таб",ТЗ);
Запрос.Выполнить();
//Получаем таблицу из менеджера временных таблиц запроса
ЗапросТМП=Новый Запрос("ВЫБРАТЬ * ИЗ ВТТаб");
ЗапросТМП.МенеджерВременныхТаблиц=Запрос.МенеджерВременныхТаблиц;
ТЗ1=ЗапросТМП.Выполнить().Выгрузить();
ТЗ1.ВыбратьСтроку(); //Показываем полученную таблицу
Вместо перечисления списка полей можно использовать "ВЫБРАТЬ * ".
Если есть ТЗ, в каждой колонке которой значения всего одного типа, для типизации колонок, можно воспользоваться функцией:
Код 1C v 8.х Процедура ТипизацияТЗ(ТЗ) Экспорт
РезультатТЗ = новый ТаблицаЗначений;
Для Каждого Колонка из ТЗ.Колонки Цикл
Имя = Колонка.Имя;
МассивТипов = новый Массив(1);
МассивТипов[0] = ТипЗнч(ТЗ[0][Имя]);
Описатель = новый ОписаниеТипов(МассивТипов);
РезультатТЗ.Колонки.Добавить(Имя, Описатель);
КонецЦикла;
Для каждого Строка из ТЗ Цикл
СтрокаРез = РезультатТЗ.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаРез, Строка);
КонецЦикла;
ТЗ = РезультатТЗ.Скопировать();
КонецПроцедуры
Пример 2: Нужно в отчете СКД Связать Данные из Регистра Накопления ВзаиморасчетыСРаботниками и Табличной Части Документа ЗарплатаКВыплате по Ссылке на Документ и ФизЛицу! И вывести полученные данные за указанный Период(с ДатаН по ДатаК) - Запрос будет такой:
Код 1C v 8.х ВЫБРАТЬ
ВзаиморасчетыСРаботникамиОрганизаций.Период,
ВзаиморасчетыСРаботникамиОрганизаций.Физлицо,
ВзаиморасчетыСРаботникамиОрганизаций.СуммаВзаиморасчетов,
ВзаиморасчетыСРаботникамиОрганизаций.Организация,
ВзаиморасчетыСРаботникамиОрганизаций.ПериодВзаиморасчетов,
ВзаиморасчетыСРаботникамиОрганизаций.Регистратор
ПОМЕСТИТЬ РегВзаимРасч
ИЗ
РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций КАК ВзаиморасчетыСРаботникамиОрганизаций
ГДЕ
ВзаиморасчетыСРаботникамиОрганизаций.Период МЕЖДУ &ДатаН И &ДатаК
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЗарплатаКВыплатеОрганизацийЗарплата.Физлицо,
ЗарплатаКВыплатеОрганизацийЗарплата.Сумма,
ЗарплатаКВыплатеОрганизацийЗарплата.ВыплаченностьЗарплаты,
ЗарплатаКВыплатеОрганизацийЗарплата.КомпенсацияЗаЗадержкуЗарплаты,
ЗарплатаКВыплатеОрганизацийЗарплата.Ссылка
ПОМЕСТИТЬ ДокумЗарплКВыпл
ИЗ
Документ.ЗарплатаКВыплатеОрганизаций.Зарплата КАК ЗарплатаКВыплатеОрганизацийЗарплата
ГДЕ
ЗарплатаКВыплатеОрганизацийЗарплата.Ссылка.Дата МЕЖДУ &ДатаН И &ДатаК
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
РегВзаимРасч.Период,
РегВзаимРасч.Физлицо,
РегВзаимРасч.СуммаВзаиморасчетов,
ДокумЗарплКВыпл.Сумма,
ДокумЗарплКВыпл.ВыплаченностьЗарплаты,
ДокумЗарплКВыпл.КомпенсацияЗаЗадержкуЗарплаты
ИЗ
РегВзаимРасч КАК РегВзаимРасч
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДокумЗарплКВыпл КАК ДокумЗарплКВыпл
ПО РегВзаимРасч.Регистратор = ДокумЗарплКВыпл.Ссылка
И РегВзаимРасч.Физлицо = ДокумЗарплКВыпл.Физлицо
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ РегВзаимРасч
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ДокумЗарплКВыпл
Категория:
Запросы Выгрузка данных в Excel с установкой разных параметров Код 1C v 8.х // Процедура выгружает из указанного справочника данные в режиме экспорта в файл в формате Microsoft Excel
// с указанным именем, используя преобразование данных к типу число и типу строка;
Процедура ОсновныеДействияФормыЭкспорт(Кнопка)
Попытка
Попытка
// Загрузка объекта Microsoft Excel
Состояние("Выгрузка данных из 1С в Microsoft Excel...");
ExcelПриложение = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Ошибка при запуске Microsoft Excel."
+ Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат;
КонецПопытки;
// Создадим книгу, по умолчанию в ней уже есть листы
Книга = ExcelПриложение.WorkBooks.Add();
// Используем первый лист книги Excel
Лист = Книга.WorkSheets(1);
// Сформировать шапку документа в первой строке листа
Колонка = 1;
Для каждого стр из ТП цикл
Если стр.Выгружать Тогда
Лист.Cells(1, Колонка).Value = стр.НазваниеРеквизита;
Колонка = Колонка + 1;
КонецЕсли;
КонецЦикла;
// Выгрузить данные справочника
выборка = Справочники[ИмяСправочника].Выбрать();
СтрокаЛиста = 2;
Пока выборка.Следующий() Цикл
Колонка = 1;
Для каждого стр из ТП цикл
Если стр.Выгружать Тогда
Попытка
// Установить значение в строке и колонке
Если ТипЗнч(выборка[стр.НазваниеРеквизита])=Тип("Число") Тогда
// Установить формат для типа Число
Лист.Cells(СтрокаЛиста, Колонка).NumberFormat = "0,00";
Лист.Cells(СтрокаЛиста, Колонка).Value =
Формат(выборка[стр.НазваниеРеквизита],"ЧГ=0");
иначе
// Для всех других типов установим формат "Текстовый"
Лист.Cells(СтрокаЛиста, Колонка).NumberFormat = "@";
Лист.Cells(СтрокаЛиста, Колонка).Value =
Строка(выборка[стр.НазваниеРеквизита]);
КонецЕсли;
исключение
// в случае ошибки вывести номер строки и колонки
Сообщить("Ошибка установки значения для: " +
выборка[стр.НазваниеРеквизита]);
Сообщить("Стр: " +СтрокаЛиста+ " Кол: " +
Колонка+ " Рек: " + стр.НазваниеРеквизита);
КонецПопытки;
Колонка = Колонка + 1;
КонецЕсли;
КонецЦикла;
СтрокаЛиста = СтрокаЛиста + 1;
Состояние("Экспорт из 1С в Excel " + СтрокаЛиста);
КонецЦикла;
// Сохраним созданную книгу в файл xls
Книга.SaveAs(имяФайла);
// Обязательно закроем соединение с COM объектом для освобождения памяти
ExcelПриложение.Quit();
Сообщить("Файл выгружен успешно: " + имяФайла );
Исключение
// Обработка ошибок экспорта данных из 1С в Excel
Сообщить("Ошибка записи данных файла :" + имяФайла);
Сообщить(ОписаниеОшибки());
Попытка
ExcelПриложение.Quit();
Исключение
КонецПопытки;
КонецПопытки;
КонецПроцедуры
Код 1C v 7.x //Простейший пример вывода из 1С:Предприятия 7.7 в MS Excel. Обеспечение наличия у рабочей книги единственного листа,
//установка размера, жирности и цвета шрифта, ширины колонок, рамок и заливки ячеек. Выравнивание текста
//ячеек, группировка строк, установка числового формата ячеек, закрепление области.
Процедура Вывод()
Попытка
Application=СоздатьОбъект("Excel.Application");
Исключение
Сообщить(ОписаниеОшибки(),"!!!");
Сообщить("Возможно, MS Excel не установлен на этом компьютере.");
Возврат;
КонецПопытки;
//Создание рабочей книги
WorkBook=Application.WorkBooks.Add();
//Получение окна
Window=WorkBook.Windows(1);
//Установка невидимости окна для убыстрения вывода
Window.Visible=0;
//Обеспечение наличия у рабочей книги единственного листа
Если WorkBook.Worksheets.Count=0 Тогда
WorkBook.Worksheets.Add();
Иначе
Application.DisplayAlerts=0;//не выдавать предупреждений
Пока WorkBook.Worksheets.Count>1 Цикл
WorkBook.Worksheets(1).Delete();
КонецЦикла;
Application.DisplayAlerts=-1;//восстановление флага выдачи предупреждений
КонецЕсли;
//Получение рабочего листа
Worksheet=WorkBook.Worksheets(1);
//Задание имени рабочего листа
Worksheet.Name="Пример вывода";
//Заголовок документа
Worksheet.Range("A1").Value="Пример вывода из 1С:Предприятия в MS Excel";
Worksheet.Range("A2").Value="сегодня "+ТекущаяДата();
Worksheet.Range("A1:A2").Font.Size=14;//размер шрифта
Worksheet.Range("A1:A2").Font.Bold=-1;//жирный шрифт
//Задание ширины колонок
Worksheet.Columns(1).ColumnWidth=60;
Worksheet.Columns(2).ColumnWidth=15;
Worksheet.Columns(3).ColumnWidth=15;
//Шапка документа
Worksheet.Range("A4").Value="Первая колонка";
Для ы=7 по 10 Цикл//рамки
Worksheet.Range("A4").Borders(ы).LineStyle=1;
Worksheet.Range("A4").Borders(ы).Weight=-4138;//xlMedium
КонецЦикла;
Worksheet.Range("A4").Interior.ColorIndex=15;//заливка серым
Worksheet.Range("A4").HorizontalAlignment=-4108;//выравнивание текста по центру
Worksheet.Range("B4").Value="Вторая";
Для ы=7 по 10 Цикл
Worksheet.Range("B4").Borders(ы).LineStyle=1;
Worksheet.Range("B4").Borders(ы).Weight=-4138;
КонецЦикла;
Worksheet.Range("B4").Interior.ColorIndex=15;
Worksheet.Range("B4").HorizontalAlignment=-4108;
Worksheet.Range("C4").Value="Третья";
Для ы=7 по 10 Цикл
Worksheet.Range("C4").Borders(ы).LineStyle=1;
Worksheet.Range("C4").Borders(ы).Weight=-4138;
КонецЦикла;
Worksheet.Range("C4").Interior.ColorIndex=15;
Worksheet.Range("C4").HorizontalAlignment=-4108;
//Для группировки строк:
Worksheet.Outline.SummaryRow=0;//"итоговые" строки отображать сверху (если снизу, то 1)
//Вывод строк
Worksheet.Range("A5").Value="Объект аналитики";
Worksheet.Range("A5").Font.ColorIndex=5;//цвет шрифта - синий
Worksheet.Range("B5").Value=123.45;
Worksheet.Range("B5").Font.ColorIndex=5;
Worksheet.Range("C5").Value=678.9;
Worksheet.Range("C5").Font.ColorIndex=5;
Worksheet.Range("A6").Value="Объект аналитики";
Worksheet.Range("A6").Font.ColorIndex=3;//цвет шрифта - красный
Worksheet.Range("B6").Value=123.45;
Worksheet.Range("B6").Font.ColorIndex=3;
Worksheet.Range("C6").Value=678.9;
Worksheet.Range("C6").Font.ColorIndex=3;
Worksheet.Range("A7").Value="Объект аналитики";
Worksheet.Range("B7").Value=123.45;
Worksheet.Range("C7").Value=678.9;
Worksheet.Range("A8").Value="Объект аналитики";
Worksheet.Range("B8").Value=123.45;
Worksheet.Range("C8").Value=678.9;
Worksheet.Range("A9").Value="Объект аналитики";
Worksheet.Range("A9").Font.ColorIndex=3;//цвет шрифта - красный
Worksheet.Range("B9").Value=123.45;
Worksheet.Range("B9").Font.ColorIndex=3;
Worksheet.Range("C9").Value=678.9;
Worksheet.Range("C9").Font.ColorIndex=3;
Worksheet.Range("A10").Value="Объект аналитики";
Worksheet.Range("B10").Value=123.45;
Worksheet.Range("C10").Value=678.9;
Worksheet.Range("A11").Value="Объект аналитики";
Worksheet.Range("B11").Value=123.45;
Worksheet.Range("C11").Value=678.9;
Worksheet.Range("A12").Value="Объект аналитики";
Worksheet.Range("A12").Font.ColorIndex=5;//цвет шрифта - синий
Worksheet.Range("B12").Value=123.45;
Worksheet.Range("B12").Font.ColorIndex=5;
Worksheet.Range("C12").Value=678.9;
Worksheet.Range("C12").Font.ColorIndex=5;
Worksheet.Range("A13").Value="Объект аналитики";
Worksheet.Range("A13").Font.ColorIndex=3;//цвет шрифта - красный
Worksheet.Range("B13").Value=123.45;
Worksheet.Range("B13").Font.ColorIndex=3;
Worksheet.Range("C13").Value=678.9;
Worksheet.Range("C13").Font.ColorIndex=3;
Worksheet.Range("A14").Value="Объект аналитики";
Worksheet.Range("B14").Value=123.45;
Worksheet.Range("C14").Value=678.9;
Worksheet.Range("A15").Value="Объект аналитики";
Worksheet.Range("B15").Value=123.45;
Worksheet.Range("C15").Value=678.9;
Worksheet.Range("A16").Value="Объект аналитики";
Worksheet.Range("A16").Font.ColorIndex=3;//цвет шрифта - красный
Worksheet.Range("B16").Value=123.45;
Worksheet.Range("B16").Font.ColorIndex=3;
Worksheet.Range("C16").Value=678.9;
Worksheet.Range("C16").Font.ColorIndex=3;
Worksheet.Range("A17").Value="Объект аналитики";
Worksheet.Range("B17").Value=123.45;
Worksheet.Range("C17").Value=678.9;
Worksheet.Range("A18").Value="Объект аналитики";
Worksheet.Range("B18").Value=123.45;
Worksheet.Range("C18").Value=678.9;
//Установка рамок
Для НомСтр=5 по 18 Цикл
Для ы=7 по 10 Цикл
Worksheet.Range("A"+НомСтр).Borders(ы).LineStyle=1;
Worksheet.Range("B"+НомСтр).Borders(ы).LineStyle=1;
Worksheet.Range("C"+НомСтр).Borders(ы).LineStyle=1;
КонецЦикла;
КонецЦикла;
//Группировка строк
Worksheet.Range("7:8").Rows.Group();
Worksheet.Range("10:11").Rows.Group();
Worksheet.Range("14:15").Rows.Group();
Worksheet.Range("17:18").Rows.Group();
Worksheet.Range("6:11").Rows.Group();
Worksheet.Range("13:18").Rows.Group();
//Свёртка группировок до первого уровня
Worksheet.Outline.ShowLevels(1);
//Установка числового формата
Попытка
Worksheet.Range("B5:C18").NumberFormat="# ##0.00";
Исключение
Попытка
Worksheet.Range("B5:C18").NumberFormat="# ##0,00";
Исключение
КонецПопытки;
КонецПопытки;
//Установка видимости приложения и его окна
Application.Visible=-1;
Window.Visible=-1;
//Закрепление области
Worksheet.Range("A5").S_elect();
Window.FreezePanes = -1;
КонецПроцедуры //Вывод
Категория:
Работа с Microsoft Office и OpenOffice Запрос к Таблице Значений Код 1C v 8.х Таблица = Новый ТаблицаЗначений;
//Опишем тип создаваемой колонки
Массив = Новый Массив;
КЧ = Новый КвалификаторыЧисла(10, 2);
Массив.Добавить(Тип("Число"));
ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
Таблица.Колонки.Добавить("КодУслуги",ОписаниеТиповЧ);
//... выборки из справочника и заполнение ТЗ
Пока ВыборкаСпр.Следующий() Цикл
НоваяСтрока = Таблица.Добавить();
НоваяСтрока.КодУслуги = ВыборкаСпр.Код;
КонецЦикла;
Запрос = Новый Запрос;
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
// Текст запроса для построения временной таблицы
Запрос.Текст = "ВЫБРАТЬ
| Таб.КодУслуги КАК Код
|ПОМЕСТИТЬ ВТДанные
|ИЗ
| &Данные КАК Таб";
Запрос.УстановитьПараметр("Данные",Таблица);
Результат = Запрос.Выполнить();
Пример Заполнения колонки одной таблицы по колонке другой, по типу ЛЕВОЕ СОЕДИНЕНИЕ
Это удобно когда например надо заполнить колонку не одним фиксированным значением, а в зависимости от значений в других колонках
Код 1C v 8.х
ТЗН1 = Новый ТаблицаЗначений;//Колонки Кол1,кол2,кол3,ИД
ТЗН2 = Новый ТаблицаЗначений;//Колонки Кол4,кол5,кол6,ИД
Запрос.УстановитьПараметр("ТЗН1",Отправления);
Запрос.УстановитьПараметр("ТЗН2",ЛотыКСписанию);
МВТ = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = МВТ;
//Запрос 1 Помещаем ТЗН1 в МенеджерВременныхТаблиц в таблицу ТЗН1
Запрос.Текст =
"ВЫБРАТЬ
| ТЗН1.Кол1 КАК Кол1,
| ТЗН1.Кол2 КАК Кол2,
| ТЗН1.Кол3 КАК Кол3,
| ТЗН1.ИД КАК ИД
|ПОМЕСТИТЬ
| ТЗН1
|ИЗ
| &ТЗН1 КАК ТЗН1";
Запрос.Выполнить();
//Запрос 2 Помещаем ТЗН2 в МенеджерВременныхТаблиц в таблицу ТЗН2
Запрос.Текст =
"ВЫБРАТЬ
| ТЗН2.Кол1 КАК Кол4,
| ТЗН2.Кол2 КАК Кол5,
| ТЗН2.Кол3 КАК Кол6,
| ТЗН2.ИД КАК ИД
|ПОМЕСТИТЬ
| ТЗН2
|ИЗ
| &ТЗН2 КАК ТЗН2";
//Получаем результирующую таблицу
Запрос.Выполнить();
Запрос.Текст =
"ВЫБРАТЬ
| ТЗН1.Кол1 КАК Кол1,
| ТЗН1.Кол2 КАК Кол2,
| ТЗН1.Кол3 КАК Кол3,
| ТЗН1.ИД КАК ИД,
| ТЗН2.Кол1 КАК Кол4,
| ТЗН2.Кол2 КАК Кол5,
| ТЗН2.Кол3 КАК Кол6,
|ИЗ
| ТЗН1 КАК ТЗН1
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗН2 КАК ТЗН2
| ПО ТЗН1.ИД = ТЗН2.ИД";
тзн3 = Запрос.Выполнить().Выгрузить();
Запрос к таблице делается в 2 этапа:
Сначала она запросом помещается в МенеджерВременныхТаблиц, а затем вторым запросом к ней делается запрос!
В 8.0 к ТЗ можно работать только построителем запроса!
Примерно так:
Код 1C v 8.х ПостроительЗапроса = Новый ПостроительЗапроса;
ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТЗ);
СтрокаОтбора = ПостроительЗапроса.Отбор.Добавить("Реквизит");
СтрокаОтбора.Значение = Истина;
СтрокаОтбора.ВидСравнения = ВидСравнения.Равно;
СтрокаОтбора.Использование = Истина;
ПостроительЗапроса.Выполнить();
ВыбрСтроки = ПостроительЗапроса.Результат.Выгрузить();
Как в запросе, в качестве источника данных, использовать таблицу значений? Категория:
Запросы Как при выборе элемента справочника сделать отображение любого реквизита, а не код и наименование? Порой бывают ситуации когда необходимо выбрать в табличном поле элемента справочника, но отобразить его не как код или наименование, а как значение какого-либо реквизита!
НО Представление справочника это либо Код, либо Наименование и другого никак не выбрать - пойдем в обход добавив в ТабЧасть отдельный Реквизит(с типом строка, число, дата и т.д) и при выборе справочника запишем туда значение любого реквизита этого справочника!
Вот примеры реализации этого:
Вариант 1 (Создаем два реквизита Контрагент и ИНН):
И при выборе Контрагента, в колонке ИНН должно появится ИНН этого контрагента!
1. Создаем в Табличной части два Реквизита:
а. Наименование = СправочникСсылка.Контрагенты
б. ИНН = Строка 12 символов
2. После размещения этих реквизитов в табличной части на форме заходим в Свойства колонки Наименование
Добавляем Событие ПриИзменении и пишем в нем:
Код 1C v 8.х //При выборе Контрагента в Колонке ИНН установить ИНН Контрагента
Процедура ТабЧастьНаименованиеПриИзменении(Элемент)
ЭлементыФормы.ТабЧасть.ТекущаяСтрока.ИНН = Элемент.Значение.ИНН;
КонецПроцедуры
3. Сохраняем, проверям, наблюдаем
Вариант 2 (Создаем Один реквизит КПП и при нажатии на кнопку выбор должен открыться справочник контрагентов, далее выбрав контрагента, в поле должно попасть его КПП):
1. Создаем в Табличной части Реквизит:
КПП = Строка 9 символов
2. После размещения реквизита в табличной части на форме заходим в его Свойства
а. В разделе
Использование :
Ставим галочку - Кнопка Выбора
б. В разделе
События :
Добавляем НачалоВыбора и пишем код:
Код 1C v 8.х Процедура ТабЧастьКППНачалоВыбора(Элемент, СтандартнаяОбработка)
СпрКонтрагент = Справочники.Контрагенты.ПолучитьФормуВыбора(,ЭтаФорма);
СпрКонтрагент.Заголовок = "Выберите Поставщика:";
Выбор = СпрКонтрагент.ОткрытьМодально();
Элемент.Значение = Выбор.КПП;
КонецПроцедуры
3. Теперь щелкнув в колонке КПП, появится кнопка выбора |...|, нажав которую откроется справочник Контрагентов и выбрав Контрагента в поле появится его КПП.
Автор:
Мигачев Евгений Категория:
Справочники