Отправка и получение почты с использованием технологии шифрования SSL Почти все почтовые сервисы перешли на использование SSL и для получения почты нужно использовать IMAP, можно конечно и POP, но это уже прошлый век )
Пример получения почты с mail.ru по IMAP используя SSL:
Код 1C v 8.3 Функция ПолучитьНовыеПисьма() Экспорт
Почта = Новый ИнтернетПочта;
ИспользоватьIMAP=Истина; ПочтовыйЯщик = "";
Профиль = ПолучитьПрофиль();
Попытка
Если ИспользоватьIMAP Тогда
Почта.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP);
Если ПочтовыйЯщик = "" Тогда
ПочтовыйЯщик = "INBOX";
КонецЕсли;
Почта.ТекущийПочтовыйЯщик = ПочтовыйЯщик;
Иначе;
Почта.Подключиться(Профиль, ПротоколИнтернетПочты.POP3);
КонецЕсли;
Исключение
Сообщить(НСтр("ru = 'Ошибка при подключении к почтовому серверу. Проверьте настройки.'"));
Сообщить(ОписаниеОшибки());
Возврат 0;
КонецПопытки;
ЗагруженныеПисьма = ПолучитьИдентификаторыЗагруженныхПисем();
ИдентификаторыНовыхПисем = Почта.ПолучитьИдентификаторы(ЗагруженныеПисьма);
Если ИдентификаторыНовыхПисем.Количество() = 0 Тогда
//Новых нет
Иначе
//Получаем новые письма
Письма = Почта.Выбрать(Ложь, ИдентификаторыНовыхПисем,Истина);
Для каждого Письмо Из Письма Цикл
Если Найти(Письмо.Тема,"siteabc.ru")>0 Тогда //Если это наше письмо то грузим его
ПисьмоОбъект = Справочники.ВходящиеПисьма.СоздатьЭлемент();
ПисьмоОбъект.Идентификатор = Письмо.Идентификатор[0];
ПисьмоОбъект.Наименование = Письмо.Тема;
ПисьмоОбъект.Дата = Письмо.ДатаОтправления;
ПисьмоОбъект.Отправитель = Письмо.Отправитель;
Если ИспользоватьIMAP Тогда
ПисьмоОбъект.ПочтовыйЯщик = "IMAP/" + ПочтовыйЯщик;
Иначе
ПисьмоОбъект.ПочтовыйЯщик = "POP3";
КонецЕсли;
Для каждого Элемент Из Письмо.Тексты Цикл
Если Элемент.ТипТекста = ТипТекстаПочтовогоСообщения.HTML Тогда
ПисьмоОбъект.ВидСодержимого = "HTML";
Текст = Элемент.Текст;
Если Найти(Текст, "<HTML>") = 0 Тогда
Текст = "<HTML><BODY>" + Текст + "</BODY></HTML>";
КонецЕсли;
//Вложения = Новый Массив;
//// обрабатываем вложения, что бы правильно сформировать HTML
//Для каждого Вложение Из Письмо.Вложения Цикл
// Ид = "cid:" + Вложение.Идентификатор;
// Если Найти(Текст, Ид) <> 0 Тогда
// Вложения.Добавить(Вложение);
// КонецЕсли;
//КонецЦикла;
Прервать;
ИначеЕсли Элемент.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст Тогда
ПисьмоОбъект.ВидСодержимого ="Текст";
Текст = Элемент.Текст;
КонецЕсли;
КонецЦикла;
ПисьмоОбъект.Текст = Текст;
ПисьмоОбъект.Записать();
КонецЕсли;
КонецЦикла;
КонецЕсли;
Почта.Отключиться();
Функция ПолучитьПрофиль(ИмяОтправителя = "", ИспользоватьIMAP = Ложь) Экспорт
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АутентификацияPOP3 = СпособPOP3Аутентификации.Обычная;
Профиль.POP3ПередSMTP=Ложь;
Профиль.АдресСервераIMAP = "imap.mail.ru";
Профиль.ПортIMAP = 993;
Профиль.ИспользоватьSSLIMAP = Истина;
Профиль.ПользовательIMAP ="siteabcz@mail.ru";
Профиль.ПарольIMAP = "9Ljkuf";
Профиль.ТолькоЗащищеннаяАутентификацияIMAP = Ложь;
Возврат Профиль;
КонецФункции
Функция ПолучитьИдентификаторыЗагруженныхПисем() Экспорт
Идентификаторы = Новый Массив();
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Идентификатор ИЗ Справочник.ВходящиеПисьма";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Идентификаторы.Добавить(Выборка.Идентификатор);
КонецЦикла;
Возврат Идентификаторы;
КонецФункции
/// ЕЩЕ примеры настройки профиля
Функция ПолучитьПрофиль(ИмяОтправителя = "", ИспользоватьIMAP = Ложь) Экспорт
//Профиль = Новый ИнтернетПочтовыйПрофиль;
//Профиль.АдресСервераSMTP = Выборка.АдресSMTPСервера;
//Профиль.ПортSMTP = Выборка.ПортSMTP;
//Профиль.ИспользоватьSSLSMTP = Выборка.SSLSMTP;
//Профиль.ПарольSMTP = Выборка.ПарольSMTP;
//Профиль.ПользовательSMTP = Выборка.ПользовательSMTP;
//Профиль.ТолькоЗащищеннаяАутентификацияSMTP = Ложь;
//
//Профиль.АдресСервераIMAP = Выборка.АдресIMAPСервера;
//Профиль.ПортIMAP = Выборка.ПортIMAP;
//Профиль.ИспользоватьSSLIMAP = Выборка.SSLIMAP;
//Профиль.ПользовательIMAP = Выборка.ПользовательIMAP;
//Профиль.ПарольIMAP = Выборка.ПарольIMAP;
//Профиль.ТолькоЗащищеннаяАутентификацияIMAP = Ложь;
//
//Профиль.АдресСервераPOP3 = Выборка.АдресPOP3Сервера;
//Профиль.ПортPOP3 = Выборка.ПортPOP3;
//Профиль.ИспользоватьSSLPOP3 = Выборка.SSLPOP3;
//Профиль.Пароль = Выборка.ПарольPOP3;
//Профиль.Пользователь = Выборка.ПользовательPOP3;
//Профиль.ТолькоЗащищеннаяАутентификацияPOP3 = Ложь;
//
//Профиль.ВремяОжидания = Выборка.ТаймаутИнтернетПочты;
//
//ИмяОтправителя = Выборка.ИмяОтправителяПочтовогоСообщения;
//ИспользоватьIMAP = Выборка.ИспользоватьIMAP;
//
Профиль = Новый ИнтернетПочтовыйПрофиль;
//Профиль.АдресСервераSMTP = "smtp.mail.ru";
//Профиль.ПортSMTP = 465;
//Профиль.ИспользоватьSSLSMTP = Истина;
//Профиль.ПарольSMTP ="9LEY";
//Профиль.ПользовательSMTP = "siteabcz@mail.ru";
//Профиль.ТолькоЗащищеннаяАутентификацияSMTP = Истина;
//Профиль.Пользователь = "siteabcz@mail.ru";
//Профиль.Пароль = "siteabcz";
//Профиль.АдресСервераPOP3 = "pop.mail.ru";
//Профиль.ПортPOP3 = 995;
//Профиль.ИспользоватьSSLPOP3 = Истина;
Профиль.АутентификацияPOP3 = СпособPOP3Аутентификации.Обычная;
Профиль.POP3ПередSMTP=Ложь;
Профиль.АдресСервераIMAP = "imap.mail.ru";
Профиль.ПортIMAP = 993;
Профиль.ИспользоватьSSLIMAP = Истина;
Профиль.ПользовательIMAP ="siteabcz@mail.ru";
Профиль.ПарольIMAP = "siteabcz";
Профиль.ТолькоЗащищеннаяАутентификацияIMAP = Ложь;
Возврат Профиль;
КонецФункции
//ОБЩИЙ ПРИМЕР ОТПРАВКИ и ПОЛУЧЕНИЯ
Функция ОтправитьПисьмо(EmailОтправителя, ПарольОтправителя,
Порт, АдресСервера, EmailПолучателя,
ИмяПолучателя, ТекстСообщения,
ЗаголовокСообщения, МассивФайловыхПутей)
//ПОЧТОВЫЙ ПРОФИЛЬ
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.АдресСервераSMTP = АдресСервера;
Профиль.ПортSMTP = Порт;
Профиль.Пользователь = EmailОтправителя;
Профиль.Пароль = ПарольОтправителя;
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
Профиль.ПарольSMTP = ПарольОтправителя;
Профиль.ПользовательSMTP = EmailОтправителя;
//ПОЧТОВОЕ СООБЩЕНИЕ
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель = EmailОтправителя;
Сообщение.Тема = ЗаголовокСообщения;
Сообщение.Тексты.Добавить(ТекстСообщения, ТипТекстаПочтовогоСообщения.HTML);
Сообщение.Организация = "The company";
Адрес = Сообщение.Получатели.Добавить(EmailПолучателя);
Адрес.ОтображаемоеИмя = ИмяПолучателя;
Для каждого ПутьКФайлу Из МассивФайловыхПутей Цикл
Сообщение.Вложения.Добавить(ПутьКФайлу);
КонецЦикла;
// ПОЧТОВЫЙ СЕРВЕР
Почта = Новый ИнтернетПочта();
//Подключение к серверу
Попытка
Почта.Подключиться(Профиль);
Исключение
Сообщить("Ошибка при подключении к серверу: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
//Отправка письма
Попытка
Почта.Послать(Сообщение);
Исключение
Почта.Отключиться();
Сообщить("Ошибка при отправке письма: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Почта.Отключиться();
Возврат Истина;
КонецФункции
Функция ПолучитьПисьма()
//ПОЧТОВЫЙ ПРОФИЛЬ
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.Пользователь = "xxx@xxxx.xx";
Профиль.Пароль = "xxxxxx";
Профиль.АдресСервераPOP3 = "pop3.mail.ru";
ПРофиль.АутентификацияPOP3 = СпособPOP3Аутентификации.Обычная;
МассивПисем = Новый массив();
//ПОЛУЧЕНИЕ ПИСЕМ
Попытка
Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
МассивПисем = Почта.Выбрать(Ложь);
Исключение
Сообщить("Ошибка получения почты " + ОписаниеОшибки());
КонецПопытки;
Возврат МассивПисем;
КонецФункции
Категория:
Работа с Интернет, Почтой (Mail), FTP Как программно сформировать отчет СКД указав параметры и на выходе получить таблице значений? В одном документе для расчета потребовалось получать данные из отчета на СКД, реализовал следующим образом:
Код 1C v 8.х //Програмное формирование отчета СКД
СхемаОст = Отчеты.ТоннажПоЭкспедиторам.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикНастроекНастройки = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроекНастройки.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаОст));
КомпоновщикНастроекНастройки.ЗагрузитьНастройки(СхемаОст.НастройкиПоУмолчанию);
КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", НачалоМесяца(МесяцРасчета));
КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", КонецМесяца(МесяцРасчета));
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаОст, КомпоновщикНастроекНастройки.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ДанныеТЗ = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ДанныеТЗ);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
ТоннажПоЭкспедиторам.Очистить();
// ДанныеТЗ.ВыбратьСтроку();
Для каждого СтрокаТЗ Из ДанныеТЗ Цикл
Если ЗначениеЗаполнено(СтрокаТЗ.Экспедитор) и СтрокаТЗ.Доставка=Неопределено Тогда
нСтр = ТоннажПоЭкспедиторам.Добавить();
ЗаполнитьЗначенияСвойств(нСтр,СтрокаТЗ);
нСтр.Сотрудник=СтрокаТЗ.Экспедитор;
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
Категория:
Схема Компоновки Данных Как в СКД повторять шапку на каждой странице при печати и вывести колонтитулы? Нужно выводить на каждой странице отчета, шапку. Отчет сделан через СКД (Схема компоновки данных). В схеме есть макет, в нем есть ячейки шапки.
Для этого используется метод - ПовторятьПриПечатиСтроки, о нем я уже писал: Как при печати выводить шапку на каждой странице (ПовторятьПриПечатиСтроки)?
Код кнопки формирования отчета:
Код 1C v 8.3 СводнаяКартаРезультат = Новый ТабличныйДокумент;
ПечатьСводнойКартыНаСервере(СводнаяКартаРезультат);
СводнаяКартаРезультат.Показать("СводнаяКарта");
Процедура вывода отчета:
Код 1C v 8.3 &НаСервере
Процедура ПечатьСводнойКартыНаСервере(СводнаяКартаРезультат)
СхемаКомпоновкиДанных = Справочники.Номенклатура.ПолучитьМакет("МакетСводнаяКарта");
СводнаяКартаРезультат.ПовторятьПриПечатиСтроки = СводнаяКартаРезультат.Область(7, , 7); // <- Строки вывода повторения нужно считать в уже результате вывода, а не в макете!
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
НомеклатураСсылка = Настройки.ПараметрыДанных.Элементы.Найти("НоменклатураСсылка");
НомеклатураСсылка.Значение = Объект.Ссылка;
НомеклатураСсылка.Использование = Истина;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки, ДанныеРасшифровки);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(СводнаяКартаРезультат);
//ПроцессорВывода.ОтображатьПроцентВывода = Истина;
ПроцессорВывода.НачатьВывод();
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных, Истина);
ПроцессорВывода.ЗакончитьВывод();
КонецПроцедуры
Если дополнительно нужно вывести колонтитулы,
тогда:
Код 1C v 8.3 // Верхний колонтитул
ТабДок.ВерхнийКолонтитул.Выводить = Истина;
ТабДок.ВерхнийКолонтитул.НачальнаяСтраница = 2;
ТабДок.ВерхнийКолонтитул.Шрифт = Новый Шрифт(Результат.ВерхнийКолонтитул.Шрифт, , , , Истина);
ТабДок.ВерхнийКолонтитул.ТекстСлева = "Заголовок отчета";
ТабДок.ВерхнийКолонтитул.ТекстВЦентре = "Стр. [&НомерСтраницы] из [&СтраницВсего]";
ТабДок.ВерхнийКолонтитул.ТекстСправа = "Дата/время печати: [&Дата]/[&Время]";
// Нижний колонтитул
ТабДок.НижнийКолонтитул.Выводить = Истина;
ТабДок.НижнийКолонтитул.Шрифт = Новый Шрифт(Результат.ВерхнийКолонтитул.Шрифт, , , , Истина);
ТабДок.НижнийКолонтитул.ТекстВЦентре = "Заголовок отчета";
Категория:
Схема Компоновки Данных Загрузка данных в 1С из PDF В данной статье описан пример реализации загрузки данных накладных из PDF файлов для одного крупного Ритейла...
И так у Нас есть несколько файлов в формате pdf, которые нам необходимо загрузить в 1С.
Чтение PDF файлов из 1С
Первым дело я стал искать, как напрямую можно прочитать данные из 1С в PDF файлах - было найдено много информации и вариантов решений, но к сожалению большинство из них не правильно работали с кодировкой В результате банальный текст вида Красный стул превращался в страшную кракозябру.
Далее после долгих поисков был найден конвертер PDF в TXT - pdf2txt
Поддержка командной строки:
PDF2TXT <input PDF file> [output TXT file] [-logfile] [-open] [-space] [-html] [-format] [-silent] [-blankline] [-summary] [-zoom <num>] [-?] [-h]
<input PDF file> : Open an existing PDF file to convert.
[output TXT file] : Write to TEXT file, the default is same filename of input PDF file.
[-first <page number>]: Specify the first page number.
[-last <page number>]: Specify the last page number.
[-logfile] : Write log to "C:\pdf2txt.log" file.
[-open] : Auto open the text file after it be created.
[-space] : Auto insert spaces into text file.
[-html] : Output to a HTML file, not a text file.
[-format] : Keep the page layout in the generated TXT file.
[-silent] : Disable error and warning messages.
[-blankline] : Auto delete blank line in the generated TXT file.
[-summary] : Get PDF document summary.
[-zoom <num>] : Set zoom ratio, the range is from 50 to 200.
[-unicode] : Create UTF-8 encoding text file.
Примеры:
Код Batch File (DOS, CMD, BAT) C:\>PDF2TXT C:\input.pdf
C:\>PDF2TXT C:\input.pdf -unicode
C:\>PDF2TXT C:\input.pdf -first 10 -last 12
C:\>PDF2TXT C:\input.pdf C:\output.txt
C:\>PDF2TXT C:\input.pdf -open -silent -logfile -zoom 150
C:\>PDF2TXT C:\input.pdf C:\output.txt -open -silent
C:\>PDF2TXT C:\*.pdf
C:\>PDF2TXT C:\*.pdf C:\*.txt
C:\>PDF2TXT C:\test\*.pdf C:\test\*.txt
В архиве (Скачать Вы можете из статьи по ссылке ) заготовка 1С обработки для частного случая, если она Вам подойдет - Хорошо
Если же нет, то Мы можем для Вас быстро доработать загрузку PDF в 1С !
Код на 1С для конфигурации УТ 10.3:
Код 1C v 8.х Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
МассивСтрок = Новый Массив();
Если Разделитель = " " Тогда
Стр = СокрЛП(Стр);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = СокрЛ(Сред(Стр,Поз));
КонецЦикла;
Иначе
ДлинаРазделителя = СтрДлина(Разделитель);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
ТекЗнч = СокрЛП(Лев(Стр,Поз-1));
Если ЗначениеЗаполнено(ТекЗнч) Тогда
МассивСтрок.Добавить(ТекЗнч);
КонецЕсли;
Стр = Сред(Стр,Поз+ДлинаРазделителя);
КонецЦикла;
КонецЕсли;
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)
//Ищем Файлы
тч.Очистить();
НайденныеФайлы = НайтиФайлы(ПутьКPDF,"*.pdf",ложь);
Для каждого стр Из НайденныеФайлы Цикл
Нстр = ТЧ.Добавить();
Нстр.ФайлPDF = стр.Имя;
КонецЦикла;
ЭтаФорма.Обновить();
//Преобразуем PDF в TXT
Для каждого стр Из ТЧ Цикл
Попытка
pdf = СокрЛП(ПутьКPDF+"\"+стр.ФайлPDF);
txt = СтрЗаменить(pdf,"pdf","txt");
Команд = ПутьКPDF2TXT+"\pdf2txt.exe "+pdf+" "+txt;
ЗапуститьПриложение(Команд,ПутьКPDF,Истина);
стр.ФайлTXT = txt;
Исключение
стр.ФайлTXT = "!!!_ОШИБКА";
КонецПопытки;
ЭлементыФормы.ТЧ.ТекущаяСтрока = стр;
ЭлементыФормы.ТЧ.ОбновитьСтроки(стр);
КонецЦикла;
мТекущийПользователь = глЗначениеПеременной("глТекущийПользователь");
мСкладПоУмолчанию = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновнойСклад");
мОсновноеПодразделение = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновноеПодразделение");
мОсновнаяВалютаВзаиморасчетов = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновнаяВалютаВзаиморасчетов");
мОсновноеВедениеВзаиморасчетовПоДоговорам = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновноеВедениеВзаиморасчетовПоДоговорам");
мВидНоменклатурыПоУмолчанию = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновнойВидНоменклатуры");
мОтражатьВРеглУчете = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОтражатьДокументыВУправленческомУчете");
мОтражатьВБухУчета = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОтражатьДокументыВБухгалтерскомУчете");
мОтражатьВНалУчете = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОтражатьДокументыВНалоговомУчете");
//Создаем Документ
Для каждого стр Из ТЧ Цикл
Состояние("Загружаю: "+стр.ФайлTXT);
текдок=Новый ТекстовыйДокумент;
текдок.Прочитать(стр.ФайлTXT,"UTF-8");
ЗагрузкаТЧ=Ложь;
ДокВозвратТоваровОтПокупателя = Документы.ВозвратТоваровОтПокупателя.СоздатьДокумент();
ДокВозвратТоваровОтПокупателя.Ответственный = мТекущийПользователь;
ДокВозвратТоваровОтПокупателя.Дата = ОбщегоНазначения.ПолучитьРабочуюДату();
ДокВозвратТоваровОтПокупателя.УстановитьНовыйНомер();
ДокВозвратТоваровОтПокупателя.ВидПоступления = Перечисления.ВидыПоступленияТоваров.НаСклад;
ДокВозвратТоваровОтПокупателя.СкладОрдер = Склад;
ДокВозвратТоваровОтПокупателя.Подразделение = мОсновноеПодразделение;
ДокВозвратТоваровОтПокупателя.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643");
ДокВозвратТоваровОтПокупателя.УчитыватьНДС = ИСТИНА;
ДокВозвратТоваровОтПокупателя.СуммаВключаетНДС = ИСТИНА;
Для Ном=1 по текдок.КоличествоСтрок() цикл
ТСтр = текдок.ПолучитьСтроку(Ном);
ТекСтр = СокрЛП(ТСтр);
Если Найти(ТекСтр, "Всего по накладной")>0 Тогда
ЗагрузкаТЧ=Ложь;
//делаем пересчеты сумм, количества мест и НДС по строкам
Для Каждого СтрокаТабличнойЧасти Из ДокВозвратТоваровОтПокупателя.Товары Цикл
ОбработкаТабличныхЧастей.РассчитатьКоличествоМестТабЧасти(СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя);
ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя);
ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя);
КонецЦикла;
Попытка
ДокВозвратТоваровОтПокупателя.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ДокВозвратТоваровОтПокупателя.Записать(РежимЗаписиДокумента.Запись);
КонецПопытки;
стр.Документ = ДокВозвратТоваровОтПокупателя.Ссылка;
стр.Инфо = "Все ОК";
ЭлементыФормы.ТЧ.ТекущаяСтрока = стр;
ЭлементыФормы.ТЧ.ОбновитьСтроки(стр);
//ВСЕ
Прервать;
КонецЕсли;
Если ЗагрузкаТЧ Тогда
ТекСтр = СтрЗаменить(ТекСтр, "подложке ","подложке");
ТекСтр = СтрЗаменить(ТекСтр, " ","|");
СтрМ=РазложитьСтрокуВМассивПодстрок(ТекСтр,"|");
Если СтрМ.Количество()>2 Тогда
//Сообщить(СтрМ);
Попытка
НоваяСтрока = ДокВозвратТоваровОтПокупателя.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду(СтрМ[2]);
//НоваяСтрока.ХарактеристикаНоменклатуры = СтрокаТаблицы.ХарактеристикаНоменклатуры;
//УстановитьСтавкуНДСВТабЧасти(НоваяСтрока, СтрокаТаблицы);
//ПроверитьНаличиеСерииНоменклатуры(НоваяСтрока, СтрокаТаблицы);
//УстановитьПризнакВеденияПоСериямНоменклатуры(НоваяСтрока);
НоваяСтрока.ЕдиницаИзмерения = НоваяСтрока.Номенклатура.БазоваяЕдиницаИзмерения;
НоваяСтрока.Коэффициент = 1;
НоваяСтрока.Количество = Число(СтрМ[6]);
НоваяСтрока.Цена = Число(СтрМ[7]);
НоваяСтрока.Сумма = Число(СтрМ[8]);
НоваяСтрока.СуммаНДС = Число(СтрМ[11]);
НоваяСтрока.Качество = Справочники.Качество.Новый;
Попытка
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС["НДС"+Лев(СокрЛП(СтрМ[9]),2)];
Исключение
НоваяСтрока.СтавкаНДС = НоваяСтрока.Номенклатура.СтавкаНДС;
КонецПопытки;
Исключение
Сообщить("Не загружено: "+ТекСтр);
КонецПопытки;
Иначе
Продолжить;
КонецЕсли;
Иначе
// Возможно что-то будет
КонецЕсли;
//Сообщить(ТекСтр);
Если Найти(ТекСтр, "Товарная накладная")>0 Тогда
ТекСтр = СтрЗаменить(ТекСтр, " ","|");
СтрМ=РазложитьСтрокуВМассивПодстрок(ТекСтр,"|");
Если СтрМ.Количество()>1 Тогда
//Сообщить(СтрМ);
ДокВозвратТоваровОтПокупателя.НомерВходящегоДокументаЭлектронногоОбмена = СтрМ[1];
ТекДата = СтрМ[2];
ДокВозвратТоваровОтПокупателя.ДатаВходящегоДокументаЭлектронногоОбмена = Дата(Прав(ТекДата,4)+Сред(ТекДата,4,2)+Лев(ТекДата,2));
КонецЕсли;
КонецЕсли;
Если Найти(ТекСтр, "Грузополучатель:")>0 Тогда
//Сообщить(ТекСтр);
//Получим ИНН
ГдеИНН = Найти(ТекСтр, "ИНН");
Если ГдеИНН>0 Тогда
ГдеИННвр= лев(ТекСтр,ГдеИНН+15);
текИНН = Прав(гдеИННвр, СтрДлина(ГдеИННвр)-(ГдеИНН+3));
текИНН = СокрЛП(СтрЗаменить(текИНН,".","")); текИНН = СокрЛП(СтрЗаменить(текИНН,",",""));
ТекОрганизация = Справочники.Организации.НайтиПоРеквизиту("ИНН",текИНН);
Если ТекОрганизация=Справочники.Организации.ПустаяСсылка() Тогда
ДокВозвратТоваровОтПокупателя.Организация = Организация;
Иначе
ДокВозвратТоваровОтПокупателя.Организация = ТекОрганизация;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Найти(ТекСтр, "Поставщик:")>0 Тогда
//Сообщить(ТекСтр);
//Получим ИНН
ГдеИНН = Найти(ТекСтр, "ИНН");
Если ГдеИНН>0 Тогда
ГдеИННвр= лев(ТекСтр,ГдеИНН+15);
текИНН = Прав(гдеИННвр, СтрДлина(ГдеИННвр)-(ГдеИНН+3));
текИНН = СокрЛП(СтрЗаменить(текИНН,".","")); текИНН = СокрЛП(СтрЗаменить(текИНН,",",""));
ТекПоставщик = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН",текИНН);
ДокВозвратТоваровОтПокупателя.Контрагент = ТекПоставщик;
ДокВозвратТоваровОтПокупателя.ДоговорКонтрагента = ТекПоставщик.ОсновнойДоговорКонтрагента;
КонецЕсли;
КонецЕсли;
Если Найти(ТекСтр, "Плательщик:")>0 Тогда
//Сообщить(ТекСтр);
//Получим ИНН
ГдеИНН = Найти(ТекСтр, "ИНН");
Если ГдеИНН>0 Тогда
ГдеИННвр= лев(ТекСтр,ГдеИНН+15);
текИНН = Прав(гдеИННвр, СтрДлина(ГдеИННвр)-(ГдеИНН+3));
текИНН = СокрЛП(СтрЗаменить(текИНН,".","")); текИНН = СокрЛП(СтрЗаменить(текИНН,",",""));
ТекПлательщик = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН",текИНН);
КонецЕсли;
КонецЕсли;
Если текстр="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15" Тогда
ЗагрузкаТЧ=Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура ПутьКPDF2TXTОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.Каталог = "";
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберите каталог с PDF2TXT";
Если ДиалогОткрытия.Выбрать() Тогда
ПутьКPDF2TXT = ДиалогОткрытия.Каталог;
ПутьКPDF = ДиалогОткрытия.Каталог;
КонецЕсли;
КонецПроцедуры
Процедура ПутьКPDFОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.Каталог = "";
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберите каталог с PDF2TXT";
Если ДиалогОткрытия.Выбрать() Тогда
ПутьКPDF = ДиалогОткрытия.Каталог;
КонецЕсли;
КонецПроцедуры
Категория:
Загрузка данных в 1С Получение уникального идентификатора ссылки в СКД Как известно, с помощью языка запросов 1С получить уникальный идентификатор объекта ссылочного типа на данный момент нельзя. Но используя возможность СКД обращаться к внешним функциям можно получить строковое представление уникального идентификатора ссылки. Для этого необходимо использовать глобальную функцию XMLСтрока в вычисляемых полях в макете схемы компоновки.
Далее проведем эксперимент по быстродействию получения результата через запрос с последующей обработкой выборки и вариантов с использованием СКД.
Рассмотрим два случая - вывод в табличный документ и формирование текстового документа.
Так же в случае с СКД мы можем создать схему компоновки программно или использовать готовую. Результат работы СКД так же можно обойти в цикле, либо вывести в таблицу значений с последующей обработкой. Для экспериментов будет использоваться платформа 8.3, конфигурация УТ11 (файловая), справочник "КлассификаторБанковРФ", более 4000 элементов.
Схему компоновки и макет можно посмотреть, скачав обработку (ссылка в конце).
Код 1C v 8.2 УП &НаКлиентеНаСервереБезКонтекста
Функция ПолучитьТекстЗапроса()
Возврат "ВЫБРАТЬ
| КлассификаторБанковРФ.Ссылка,
| КлассификаторБанковРФ.Наименование
|ИЗ
| Справочник.КлассификаторБанковРФ КАК КлассификаторБанковРФ";
КонецФункции // ПолучитьТекстЗапроса()
&НаСервере
Функция ПолучитьСхемуОбработки()
Возврат РеквизитФормыВЗначение("Отчет").ПолучитьМакет("Макет");
КонецФункции
&НаСервереБезКонтекста
Функция ПолучитьСхемуКомпоновки()
Схема = Новый СхемаКомпоновкиДанных;
ИсточникДанных = Схема.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "Источник";
ИсточникДанных.ТипИсточникаДанных = "Local";
НаборДанных = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
НаборДанных.Имя = "НаборДанных";
НаборДанных.ИсточникДанных = "Источник";
НаборДанных.Запрос = ПолучитьТекстЗапроса();
НаборСсылка = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
НаборСсылка.Поле = "Ссылка";
НаборСсылка.ПутьКДанным = "Ссылка";
НаборНаименование= НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
НаборНаименование.Поле = "Наименование";
НаборНаименование.ПутьКДанным = "Наименование";
ПолеИД = Схема.ВычисляемыеПоля.Добавить();
ПолеИД.Выражение = "XMLСтрока(Ссылка)";
ПолеИД.Заголовок = "ИД";
ПолеИД.ПутьКДанным = "ИД";
СтрокаТЗ = Схема.НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
СтрокаТЗ.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
ЭлементыВыбора = Схема.НастройкиПоУмолчанию.Выбор.Элементы;
ПолеСсылка = ЭлементыВыбора.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ПолеСсылка.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
ПолеНаименование = ЭлементыВыбора.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ПолеНаименование.Поле = Новый ПолеКомпоновкиДанных("Наименование");
ПолеИД = ЭлементыВыбора.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ПолеИД.Поле = Новый ПолеКомпоновкиДанных("ИД");
Возврат Схема;
КонецФункции
&НаСервереБезКонтекста
Функция ЗаполнитьПоКомпоновкеПрямойОбход(Схема)
Док = Новый ТекстовыйДокумент;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, Схема.НастройкиПоУмолчанию,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет,,, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(Новый ТаблицаЗначений);
ПроцессорВывода.НачатьВывод();
Пока Истина Цикл
ЭлементКомпоновки = ПроцессорКомпоновки.Следующий();
Если ЭлементКомпоновки = Неопределено Тогда
Прервать;
КонецЕсли;
ПроцессорВывода.ВывестиЭлемент(ЭлементКомпоновки);
Если ЭлементКомпоновки.Макет = "Макет2" И ЭлементКомпоновки.ТипЭлемента = ТипЭлементаРезультатаКомпоновкиДанных.НачалоИКонец Тогда
Док.ДобавитьСтроку(ЭлементКомпоновки.ЗначенияПараметров.П2.Значение + ";" + ЭлементКомпоновки.ЗначенияПараметров.П3.Значение);
КонецЕсли;
КонецЦикла;
ТЗ = ПроцессорВывода.ЗакончитьВывод();
Возврат Док;
КонецФункции // ЗаполнитьПоКомпоновкеПрямойОбход()
&НаСервере
Функция ЗаполнитьОбходТЗ(ИспользоватьСхемуОбработки)
Если ИспользоватьСхемуОбработки Тогда
Схема = ПолучитьСхемуОбработки();
Иначе
Схема = ПолучитьСхемуКомпоновки();
КонецЕсли;
Возврат ЗаполнитьПоКомпоновкеОбходТЗ(Схема);
//Возврат ЗаполнитьПоКомпоновкеОбходТЗ(?(ИспользоватьСхемуОбработки, ПолучитьСхемуОбработки(), ПолучитьСхемуКомпоновки()));
КонецФункции // ЗаполнитьОбходТЗ()
&НаСервере
Функция ЗаполнитьПрямойОбход(ИспользоватьСхемуОбработки)
Если ИспользоватьСхемуОбработки Тогда
Схема = ПолучитьСхемуОбработки();
Иначе
Схема = ПолучитьСхемуКомпоновки();
КонецЕсли;
Возврат ЗаполнитьПоКомпоновкеПрямойОбход(Схема);
//Возврат ЗаполнитьПоКомпоновкеПрямойОбход(?(ИспользоватьСхемуОбработки, ПолучитьСхемуОбработки(), ПолучитьСхемуКомпоновки()));
КонецФункции // ЗаполнитьОбходТЗ()
&НаСервереБезКонтекста
Функция ЗаполнитьПоКомпоновкеОбходТЗ(Схема)
Док = Новый ТекстовыйДокумент;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, Схема.НастройкиПоУмолчанию,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет,,, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(Новый ТаблицаЗначений);
ТЗ = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Для Каждого СтрокаТЗ Из ТЗ Цикл
Док.ДобавитьСтроку(СтрокаТЗ.Наименование + ";" + СтрокаТЗ.ИД);
КонецЦикла;
Возврат Док;
КонецФункции // ЗаполнитьПоКомпоновкеОбходТЗ()
&НаСервереБезКонтекста
Функция ЗаполнитьПоЗапросу()
Док = Новый ТекстовыйДокумент;
Запрос = Новый Запрос(ПолучитьТекстЗапроса());
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Док.ДобавитьСтроку(Результат.Наименование + ";" + XMLСтрока(Результат.Ссылка));
КонецЦикла;
Возврат Док;
КонецФункции // ЗаполнитьПоЗапросу()
&НаСервере
Процедура ЗаполнитьТабДокСхема(ИспользоватьСхемуОбработки)
Если ИспользоватьСхемуОбработки Тогда
Схема = ПолучитьСхемуОбработки();
ТабДок = ТабДок1;
Иначе
Схема = ПолучитьСхемуКомпоновки();
ТабДок = ТабДок2;
КонецЕсли;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, Схема.НастройкиПоУмолчанию);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет,,, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры // ЗаполнитьТабДокСхема()
&НаСервере
Процедура ЗаполнитьТабДокЗапрос()
Макет = РеквизитФормыВЗначение("Отчет").ПолучитьМакет("Отчет");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Запрос = Новый Запрос(ПолучитьТекстЗапроса());
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
ОбластьСтрока.Параметры.Заполнить(Результат);
ОбластьСтрока.Параметры.ИД = XMLСтрока(Результат.Ссылка);
ТабДок3.Вывести(ОбластьСтрока);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЗаполнитьТабДокСхема(Истина);
ЗаполнитьТабДокСхема(Ложь);
ЗаполнитьТабДокЗапрос();
Т1 = ЗаполнитьПоЗапросу();
Т2 = ЗаполнитьОбходТЗ(Ложь);
Т3 = ЗаполнитьОбходТЗ(Истина);
Т4 = ЗаполнитьПрямойОбход(Ложь);
Т5 = ЗаполнитьПрямойОбход(Истина);
КонецПроцедуры
По результатам замера производительности видно, что вывод результата в табличный документ происходит быстрее при использовании СКД, причем вариант с программным созданием схемы отрабатывает несколько быстрее.
В тоже время вывод результатов в текстовый документ отрабатывает быстрее для запроса.
Программное создание схемы компоновки отработало быстрее, чем получение макета схемы.
Источник
Категория:
Схема Компоновки Данных Как добавить подписи в отчет СКД? Во многих организациях сформированные отчеты заверяют подписями.
В данном примере я покажу как можно вывести подписи для типового отчета ЗУП Свод начислений.
Для начала создадим макет в котором и разместим подписи, макет я создам общий, т.к. он будет использоваться и в других отчетах.
Макет такой:
Открываем Отчет СводНачисленнойЗарплатыОрганизаций, открываем Форму и ищем процедуру
ОбновитьОтчет()
После
Код 1C v 8.х СформироватьОтчет(ЭлементыФормы.Результат, ДанныеРасшифровки);
добавляем вывод подписей
Код 1C v 8.х Макет = ПолучитьОбщийМакет("МакетПодписи");
ОбластьВывести = Макет.ПолучитьОбласть("Подпись");
ЭлементыФормы.Результат.Вывести(ОбластьВывести);
Полный код процедуры ОбновитьОтчет()
Код 1C v 8.х Процедура ОбновитьОтчет() Экспорт
СостояниеМодифицированности = Модифицированность;
Если ПанельНастроекНарисована <> Истина Тогда
ОбновлениеОтображения();
КонецЕсли;
ТиповыеОтчеты.ЗагрузитьВРеквизитЗначенияНастроекПанелиПользователя(ЭтотОбъект, ЭтаФорма);
ПараметрыПанели = ТиповыеОтчеты.ПолучитьПараметрыПанелиПользователяОбъекта(ОтчетОбъект);
ЗначенияНастроек = ТиповыеОтчеты.ПолучитьЗначенияНастроекПанелиПользователяОбъекта(ОтчетОбъект);
Отказ = ложь;
ТиповыеОтчеты.ПроверитьЗначенияПараметров(ЗначенияНастроек, ПараметрыПанели, Отказ);
Если Отказ тогда
Возврат;
КонецЕсли;
РежимформированияОтчета = НЕ ЭтоОтработкаРасшифровки;
СформироватьОтчет(ЭлементыФормы.Результат, ДанныеРасшифровки);
//Мигачев - Вывод подписей
Макет = ПолучитьОбщийМакет("МакетПодписи");
ОбластьВывести = Макет.ПолучитьОбласть("Подпись");
// Если надо вывести параметр
//ОбластьВывести.Параметры.Подписант = Бухгалтер;
ЭлементыФормы.Результат.Вывести(ОбластьВывести);
//*//
УправлениеОтчетами.УстановитьКолонтитулыПоУмолчанию(ЭлементыФормы.Результат, Заголовок, Строка(ПараметрыСеанса.ТекущийПользователь));
Модифицированность = СостояниеМодифицированности;
КонецПроцедуры
Категория:
Схема Компоновки Данных Отбор в динамическом списке Пример отбора по организации
Код 1C v 8.2 УП ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
ЭлементОтбора.ПравоеЗначение = ОтборОрганизация;
ЭлементОтбора.Использование = Истина;
// Сделаем недоступным для изменения
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
Элементы.Список.Обновить();
Полый пример для конфигурации УНФ
Код 1C v 8.2 УП // Ограничение на просмотр записей
Если РольДоступна("ПолныеПрава") Тогда
// Видит ВСЕ!
Иначе
Пользователь = Пользователи.ТекущийПользователь();
ОсновнойОтветственный = УправлениеНебольшойФирмойПовтИсп.ПолучитьЗначениеПоУмолчаниюПользователя(Пользователь,"ОсновнойОтветственный");
ОтборОрганизация = УправлениеНебольшойФирмойПовтИсп.ПолучитьЗначениеПоУмолчаниюПользователя(Пользователь,"ОсновнаяОрганизация");
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
ЭлементОтбора.ПравоеЗначение = ОтборОрганизация;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
Элементы.Список.Обновить();
КонецЕсли;
Категория:
Список Справочника, Документов, Регистров Обход метаданных (полезные функции) При написании небольших автоматизированных тестов часто надо обойти всю конфигурацию и проверить, например, для всех форм какое-нибудь свойство. Это всё легко делается через свойство глобального контекста "Метаданные", но чтоб дорбаться до обхода реквизитов надо написать кучу вложенных циклов. При этом код становится слабочитаемым и слабомодифицируемым.
Ниже приведен небольшой модуль, который решает задачу легко и удобно. Создана специальная функция РазвернутьСтрокуОбходаМетаданных, которая может по строке типа "Метаданные.Справочники.*.Реквизиты.*" построить массив строк с перечислением всех реквизитов всех справочников. При помощи этой и нескольких других функций в экспортных функциях модуля реализованы вполне прикладные задачи - получение всех реквизитов, всех макетов, всех форм конфигурации и построение таблицы всех составных типов.
Код 1C v 8.х // Автор: Alexander Speshilov
// Рекрсивная функция, которая разворачивает строку вида "Метаданные.Справочники.*[Имя].Реквизиты.*.Тип"
// в массив строк, заменяя "*" или другой символ, задаваемый параметрами обходом всех элементов
// коллекции. Допускает выполнение функций встроенного языка (не стоит отдавать ввод параметров
// пользователям). При этом выражение, используемое для получения по умолчанию может быть задано в
// квадратных скобках или параметром функции.
//
// Параметры
// СтрокаОбхода - Строка - Разворачиваемая строка
// ЗаменяемоеЗначение - Строка - заменяемое значение
// ПредставлениеПоУмолчанию - Строка - выражение для получения представления
//
// Возвращаемое значение:
// Массив строк
//
Функция РазвернутьСтрокуОбходаМетаданных(СтрокаОбхода, ЗаменяемоеЗначение = "*", ПредставлениеПоУмолчанию = "")
Рез = Новый Массив;
ЧастиСтрокиОбхода = РазобратьСтрокуОбхода(СтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию);
Если ЧастиСтрокиОбхода = Неопределено тогда
Рез.Добавить(СтрокаОбхода); //фактически это ограничение рекурсии.
Иначе
ОбъектКоллекции = Вычислить(ЧастиСтрокиОбхода.СтрокаКоллекции);
РазвернутаяКоллекция = РазвернутьКоллекциюВПредставления(ОбъектКоллекции, ЧастиСтрокиОбхода.СтрокаПредставление);
Для каждого ЭлементРазвернутойКоллекции Из РазвернутаяКоллекция Цикл
// рекурсивный вызов
ТекущаяСтрокаОбхода = ЧастиСтрокиОбхода.СтрокаНачало + ЭлементРазвернутойКоллекции + ЧастиСтрокиОбхода.СтрокаКонец;
МассивЭлемента = РазвернутьСтрокуОбходаМетаданных(ТекущаяСтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию);
Для каждого ПримитивныйЭлементОбхода Из МассивЭлемента Цикл
Рез.Добавить(ПримитивныйЭлементОбхода);
КонецЦикла;
КонецЦикла;
КонецЕсли;
Возврат Рез;
КонецФункции // РазвернутьСтрокуОбходаМетаданных()
// Разбирает строку обхода на удобные для работы поля
//
// Параметры
// СтрокаОбхода - Строка - Разворачиваемая строка
// ЗаменяемоеЗначение - Строка - заменяемое значение
// ПредставлениеПоУмолчанию - Строка - выражение для получения представления
//
// Возвращаемое значение:
// Структура с полями ПозицияЗамены, СтрокаНачало, СтрокаКоллекции, СтрокаПредставление, СтрокаКонец
// или Неопределено (если строка не содержит ЗаменяемоеЗначение)
//
Функция РазобратьСтрокуОбхода(СтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию)
Если ПустаяСтрока(ЗаменяемоеЗначение) Тогда
ВызватьИсключение "Некорректное выражение заменяемого значения";
КонецЕсли;
ПозицияЗамены = Найти(СтрокаОбхода, ЗаменяемоеЗначение);
// Если не найдена строка - возвращаем неопределено, как индикатор
Если ПозицияЗамены = 0 Тогда
Возврат Неопределено;
КонецЕсли;
СтрокаНачало = Лев(СтрокаОбхода,ПозицияЗамены - 1);
//Получение строки для выражения-коллекции
СтрокаКоллекции = СтрокаНачало;
Если Прав(СтрокаКоллекции, 1) = "." Тогда
СтрокаКоллекции = Лев(СтрокаКоллекции,СтрДлина(СтрокаКоллекции) - 1);
КонецЕсли;
ПозицияОкончанияЗамены = ПозицияЗамены + СтрДлина(ЗаменяемоеЗначение);
ОстатокВыражения = Сред(СтрокаОбхода, ПозицияОкончанияЗамены);
//Обработка явного задания представления
ОткрывающаяСкобка = "[";
ЗакрывающаяСкобка = "]";
Если Найти(ОстатокВыражения, ОткрывающаяСкобка) = 1 Тогда
ОстатокВыражения = Сред(ОстатокВыражения, СтрДлина(ОткрывающаяСкобка) + 1);
ПозицияЗакрывающейСкобки = Найти(ОстатокВыражения, ЗакрывающаяСкобка);
Если ПозицияЗакрывающейСкобки = 0 Тогда
ВызватьИсключение "Синтаксическая ошибка разбора выражения";
КонецЕсли;
СтрокаПредставление = Лев(ОстатокВыражения, ПозицияЗакрывающейСкобки - 1);
ОстатокВыражения = Сред(ОстатокВыражения, ПозицияЗакрывающейСкобки + СтрДлина(ЗакрывающаяСкобка));
Иначе
СтрокаПредставление = ПредставлениеПоУмолчанию;
КонецЕсли;
СтрокаКонец = ОстатокВыражения;
Рез = Новый Структура("ПозицияЗамены, СтрокаНачало, СтрокаКоллекции, СтрокаПредставление, СтрокаКонец",
ПозицияЗамены, СтрокаНачало, СтрокаКоллекции, СтрокаПредставление, СтрокаКонец);
Возврат Рез;
КонецФункции // РазобратьСтрокуОбхода()
// Разворачивает объект коллекции в массив представления элементов
//
// Параметры
// Коллекция - Произвольный - Коллекция, которую можно обойти через "Для каждого"
// ПредставлениеЭлемента - Строка - необяз., свойство элементов коллекции, которое
// используется для получения представления.
//
// Возвращаемое значение:
// Массив - Массив представлений коллекции
//
Функция РазвернутьКоллекциюВПредставления(Коллекция, Знач ПредставлениеЭлемента = "")
//Проверка и подгонка параметров
Если не ПустаяСтрока(ПредставлениеЭлемента) Тогда
Если Найти(ПредставлениеЭлемента, ";")>0 Тогда
ВызватьИсключение "Некорректное выражение представления";
КонецЕсли;
ПредставлениеЭлемента = "." + ПредставлениеЭлемента;
КонецЕсли;
Рез = Новый Массив;
Для каждого ЭлементКоллекции Из Коллекция Цикл
ТекПредставление = Строка(Вычислить("ЭлементКоллекции" + ПредставлениеЭлемента));
Рез.Добавить(ТекПредставление);
КонецЦикла;
Возврат Рез;
КонецФункции // РазвернутьКоллекцию()
// Разворачивает массив строк через РазвернутьСтрокуОбходаМетаданных
//
// Параметры
// МассивСтрокОбхода - Массив - Массив разворачиваемых строк
// ЗаменяемоеЗначение - Строка - заменяемое значение
// ПредставлениеПоУмолчанию - Строка - выражение для получения представления
//
// Возвращаемое значение:
// Массив строк
//
Функция РазвернутьМассивСтрокОбходаМетаданных(МассивСтрокОбхода, ЗаменяемоеЗначение = "*", ПредставлениеПоУмолчанию = "Имя")
Рез = Новый Массив;
Для каждого СтрокаОбхода Из МассивСтрокОбхода Цикл
ДополнениеРезультата = РазвернутьСтрокуОбходаМетаданных(СтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию);
Для каждого ТекСтрока Из ДополнениеРезультата Цикл
Рез.Добавить(ТекСтрока);
КонецЦикла;
КонецЦикла;
Возврат Рез;
КонецФункции // РазвернутьМассивСтрокОбходаМетаданных()
// Преобразует строку в массив одиночных строк по разделителю Символы.ПС
//
// Параметры
// ПреобразуемаяСтрока - строка для преобразования
// ИгнорироватьПустые - Булево - Пропускать пустые строки
// СокращатьПробелы - Использовать СокрЛП
//
// Возвращаемое значение:
// Массив строк
//
Функция ПолучитьМассивСтрокМногострочнойСтроки(ПреобразуемаяСтрока, ИгнорироватьПустые = Истина, СокращатьПробелы = Истина)
Рез = Новый Массив;
ЧислоСтрок = СтрЧислоСтрок(ПреобразуемаяСтрока);
Для Сч = 1 По ЧислоСтрок Цикл
ТекСтрока = СтрПолучитьСтроку(ПреобразуемаяСтрока, Сч);
Если ИгнорироватьПустые и ПустаяСтрока(ТекСтрока) Тогда
Продолжить;
КонецЕсли;
Если СокращатьПробелы Тогда
ТекСтрока = СокрЛП(ТекСтрока);
КонецЕсли;
Рез.Добавить(ТекСтрока);
КонецЦикла;
Возврат Рез;
КонецФункции // ПолучитьМассивСтрокМногострочнойСтроки()
// Возвращает все реквизиты конфигурации, которые сохраняются в ИБ
//
// Параметры - Нет
//
// Возвращаемое значение:
// Массив объектов метаданных
//
Функция ПолучитьВсеХранимыеРеквизитыКонфигурации() Экспорт
СтрокаВсехРеквизитов =
"
|Метаданные.Константы.*
|Метаданные.ПланыОбмена.*.Реквизиты.*
|Метаданные.ПланыОбмена.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Справочники.*.Реквизиты.*
|Метаданные.Справочники.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Документы.*.Реквизиты.*
|Метаданные.Документы.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Последовательности.*.Измерения.*
|Метаданные.ПланыВидовХарактеристик.*.Реквизиты.*
|Метаданные.ПланыВидовХарактеристик.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.ПланыСчетов.*.Реквизиты.*
|Метаданные.ПланыСчетов.*.ПризнакиУчета.*
|Метаданные.ПланыСчетов.*.ПризнакиУчетаСубконто.*
|Метаданные.ПланыСчетов.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.ПланыВидовРасчета.*.Реквизиты.*
|Метаданные.ПланыВидовРасчета.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.РегистрыСведений.*.Измерения.*
|Метаданные.РегистрыСведений.*.Ресурсы.*
|Метаданные.РегистрыСведений.*.Реквизиты.*
|Метаданные.РегистрыНакопления.*.Измерения.*
|Метаданные.РегистрыНакопления.*.Ресурсы.*
|Метаданные.РегистрыНакопления.*.Реквизиты.*
|Метаданные.РегистрыБухгалтерии.*.Измерения.*
|Метаданные.РегистрыБухгалтерии.*.Ресурсы.*
|Метаданные.РегистрыБухгалтерии.*.Реквизиты.*
|Метаданные.РегистрыРасчета.*.Измерения.*
|Метаданные.РегистрыРасчета.*.Ресурсы.*
|Метаданные.РегистрыРасчета.*.Реквизиты.*
|Метаданные.БизнесПроцессы.*.Реквизиты.*
|Метаданные.БизнесПроцессы.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Задачи.*.Реквизиты.*
|Метаданные.Задачи.*.РеквизитыАдресации.*
|Метаданные.Задачи.*.ТабличныеЧасти.*.Реквизиты.*
|";
ВсеХранимыеРеквизитыКонфигурации = РазвернутьМассивСтрокОбходаМетаданных(ПолучитьМассивСтрокМногострочнойСтроки(СтрокаВсехРеквизитов));
Возврат ВсеХранимыеРеквизитыКонфигурации;
КонецФункции // ПолучитьВсеХранимыеРеквизитыКонфигурации()
// Возвращает все реквизиты конфигурации составного типа, которые сохраняются в ИБ
//
// Параметры - Нет
//
// Возвращаемое значение:
// ТаблицаЗначений
//
Функция ПолучитьВсеХранимыеРеквизитыКонфигурацииСоставногоТипа() Экспорт
ВсеХранимыеРеквизитыКонфигурации = ПолучитьВсеХранимыеРеквизитыКонфигурации();
Рез = Новый ТаблицаЗначений;
Рез.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка"));
Рез.Колонки.Добавить("Тип", Новый ОписаниеТипов("ОписаниеТипов"));
Рез.Колонки.Добавить("КоличествоПростыхТипов", Новый ОписаниеТипов("Число"));
Для каждого ТекРеквизит Из ВсеХранимыеРеквизитыКонфигурации Цикл
Реквизит = Вычислить(ТекРеквизит);
Тип = Реквизит.Тип;
КоличествоПростыхТипов = Тип.Типы().Количество();
Если КоличествоПростыхТипов<>1 Тогда
ТекСтрока = Рез.Добавить();
ТекСтрока.Имя = ТекРеквизит;
ТекСтрока.Тип = Тип;
ТекСтрока.КоличествоПростыхТипов = КоличествоПростыхТипов;
КонецЕсли;
КонецЦикла;
Возврат Рез;
КонецФункции // ПолучитьВсеХранимыеРеквизитыКонфигурации()
// Возвращает все формы конфигурации
//
// Параметры - Нет
//
// Возвращаемое значение:
// Массив объектов метаданных
//
Функция ПолучитьВсеФормыКонфигурации() Экспорт
СтрокаВсехРеквизитов =
"
|Метаданные.ПланыОбмена.*.Формы.*
|Метаданные.КритерииОтбора.*.Формы.*
|Метаданные.ОбщиеФормы.*
|Метаданные.Справочники.*.Формы.*
|Метаданные.Документы.*.Формы.*
|Метаданные.ЖурналыДокументов.*.Формы.*
|Метаданные.Перечисления.*.Формы.*
|Метаданные.Отчеты.*.Формы.*
|Метаданные.Обработки.*.Формы.*
|Метаданные.ПланыВидовХарактеристик.*.Формы.*
|Метаданные.ПланыСчетов.*.Формы.*
|Метаданные.ПланыВидовРасчета.*.Формы.*
|Метаданные.РегистрыСведений.*.Формы.*
|Метаданные.РегистрыНакопления.*.Формы.*
|Метаданные.РегистрыБухгалтерии.*.Формы.*
|Метаданные.РегистрыРасчета.*.Формы.*
|Метаданные.БизнесПроцессы.*.Формы.*
|Метаданные.Задачи.*.Формы.*
|";
ВсеФормыКонфигурации = РазвернутьМассивСтрокОбходаМетаданных(ПолучитьМассивСтрокМногострочнойСтроки(СтрокаВсехРеквизитов));
Возврат ВсеФормыКонфигурации;
КонецФункции // ПолучитьВсеФормыКонфигурации()
// Возвращает все макеты конфигурации
//
// Параметры - Нет
//
// Возвращаемое значение:
// Массив объектов метаданных
//
Функция ПолучитьВсеМакетыКонфигурации() Экспорт
СтрокаВсехРеквизитов =
"
|Метаданные.ПланыОбмена.*.Макеты.*
|Метаданные.ОбщиеМакеты.*
|Метаданные.Справочники.*.Макеты.*
|Метаданные.Документы.*.Макеты.*
|Метаданные.ЖурналыДокументов.*.Макеты.*
|Метаданные.Перечисления.*.Макеты.*
|Метаданные.Отчеты.*.Макеты.*
|Метаданные.Обработки.*.Макеты.*
|Метаданные.ПланыВидовХарактеристик.*.Макеты.*
|Метаданные.ПланыСчетов.*.Макеты.*
|Метаданные.ПланыВидовРасчета.*.Макеты.*
|Метаданные.РегистрыСведений.*.Макеты.*
|Метаданные.РегистрыНакопления.*.Макеты.*
|Метаданные.РегистрыБухгалтерии.*.Макеты.*
|Метаданные.РегистрыРасчета.*.Макеты.*
|Метаданные.БизнесПроцессы.*.Макеты.*
|Метаданные.Задачи.*.Макеты.*
|";
ВсеМакетыКонфигурации = РазвернутьМассивСтрокОбходаМетаданных(ПолучитьМассивСтрокМногострочнойСтроки(СтрокаВсехРеквизитов));
Возврат ВсеМакетыКонфигурации;
КонецФункции // ПолучитьВсеМакетыКонфигурации()
Категория:
Метаданные Печатная форма с использованием СКД Создаем макет СКД, там произвольно или с какими-нибудь условиями выбираем в наборе данных поля табличной части, ставим условие на документ владелец, и задаем оформление. В форме документа добавляем кнопку печать, прописываем в параметрах наш документ и оп-ля - печатная форма готова
Код 1C v 8.х Процедура ОсновныеДействияФормыПечать(Кнопка)
Если Ссылка = Документы.РасчетЗаказа.ПустаяСсылка() тогда
Предупреждение("Документ не записан");
Возврат;
Иначе
Схема = ПолучитьМакет("Макет1");
Настройки = Схема.НастройкиПоУмолчанию;
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных();
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
ПараметрДок = Новый ПараметрКомпоновкиДанных("документ");
ЗначениеПараметраДок = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрДок);
ЗначениеПараметраДок.Значение = Ссылка;
ЗначениеПараметраДок.Использование = Истина;
Настройки = КомпоновщикНастроек.Настройки;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
ДокументРезультат = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
ДокументРезультат.ОтображатьЗаголовки = Ложь;
ДокументРезультат.ОтображатьСетку = Ложь;
ДокументРезультат.АвтоМасштаб = Истина;
ДокументРезультат.Показать();
КонецЕсли;
КонецПроцедуры
Автор:
sanja Категория:
Схема Компоновки Данных Фунции отвечающие за обмен данных с формой на сервере. РеквизитФормыВЗначение - Преобразует указанный реквизит формы в объект прикладного типа.
Код 1C v 8.2 УП &НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
ДокументОбъект = РеквизитФормыВЗначение("Объект");
ПеречитатьДанныеПоСертификатам(ДокументОбъект);
КонецПроцедуры
ЗначениеВРеквизитФормы – Преобразует объект прикладного типа в реквизит управляемой формы
Код 1C v 8.2 УП // При изменении реквизитов
&НаСервере
Процедура ПриИзмененииПартнераСервер()
СправочникОбъект = РеквизитФормыВЗначение("Объект");
СправочникОбъект.ЗаполнитьУсловияПродажПоУмолчанию();
ЗначениеВРеквизитФормы(СправочникОбъект, "Объект");
УстановитьВидимостьЭлементовПоРегулярностиСервер();
КонецПроцедуры
ДанныеФормыВЗначение – Преобразует данные формы в объект прикладного типа.
Код 1C v 8.2 УП &НаСервере
Функция НовыйЭлементСправочника()
СправочникОбъект = ДанныеФормыВЗначение(Объект, Тип("СправочникОбъект.Номенклатура"));
СправочникОбъект.Записать();
............................
ЗначениеВДанныеФормы – Преобразует объект прикладного типа в универсальный объект данных.
Код 1C v 8.2 УП &НаСервере
Процедура НовыйЧекНаСервере()
НовыйЧек = Документы.ЧекККМ.СоздатьДокумент();
НовыйЧек.Партнер = Справочники.Партнеры.РозничныйПокупатель;
НовыйЧек.ОбработкаЗаполнения(Новый Структура("КассаККМ", Объект.КассаККМ), Истина);
ЗначениеВДанныеФормы(НовыйЧек, Объект);
Категория:
Управляемое приложение, Тонкий клиент Пример программного вызова СКД отчета Пример использования СКД отчета для заполнения табличного документа.
Вызываем отчет “Маркетинговый план” сделаного на основе СКД.
Установка параметр “Вероятность”. И отбора по ключу “Основание.МВЗ.СПО”
Код 1C v 8.х Отчет = Отчеты.МаркетинговыйПлан.Создать();
Схема = Отчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ТабДок = Новый ТабличныйДокумент;
// Типы переменных:
// Схема - СхемаКомпоновкиДанных
// Настройки - НастройкиКомпоновкиДанных
// насПланЕБП - ЗначениеПараметраНастроекКомпоновкиДанных
// Макет - МакетКомпоновкиДанных
ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема);
КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек);
// --- установка параметров
Настройки = Схема.НастройкиПоУмолчанию;
насВероятнось = Настройки.ПараметрыДанных.Элементы.Найти("Вероятность");
насВероятнось.Использование = Истина;
насВероятнось.Значение = Веротяность;
// --- установка отборов
Если ЗначениеЗаполнено(СПО) тогда
ПолеОтбораСПО = Новый ПолеКомпоновкиДанных("Основание.МВЗ.СПО");
ОтборПоСПО = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборПоСПО.ЛевоеЗначение = ПолеОтбораСПО;
ОтборПоСПО.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборПоСПО.ПравоеЗначение = СПО;
ОтборПоСПО.Использование = Истина;
КонецЕсли;
// --- компануем
Макет = КомпоновщикМакета.Выполнить(Схема, Настройки);
ПроцессорКомпоновки.Инициализировать(Макет,,,Истина);
ПроцессорВывода.УстановитьДокумент(ТабДок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Категория:
Схема Компоновки Данных Универсальный отчет в прикладных решениях фирмы 1С Как настроить Универсальный отчет?
Все настройки
универсального отчета описываются в процедуре
УстановитьНачальныеНастройки :
Код 1C v 8.х Процедура УстановитьНачальныеНастройки(ДополнительныеПараметры = Неопределено) Экспорт
// Настройка общих параметров универсального отчета
//начальный вариант оформления цветовой схемы
УниверсальныйОтчет.ВариантОформления = СтандартноеОформление.Песок;
// Содержит название отчета, которое будет выводиться в шапке.
// Тип: Строка.
// Пример:
// УниверсальныйОтчет.мНазваниеОтчета = "Название отчета";
УниверсальныйОтчет.мНазваниеОтчета = СокрЛП(ЭтотОбъект.Метаданные().Синоним);
// Содержит признак необходимости отображения надписи и поля выбора раздела учета в форме настройки.
// Тип: Булево.
// Значение по умолчанию: Истина.
// Пример:
// УниверсальныйОтчет.мВыбиратьИмяРегистра = Ложь;
УниверсальныйОтчет.мВыбиратьИмяРегистра = Ложь;
// Содержит имя регистра, по метаданным которого будет выполняться заполнение настроек отчета.
// Тип: Строка.
// Пример:
// УниверсальныйОтчет.ИмяРегистра = "ТоварыНаСкладах";
УниверсальныйОтчет.ИмяРегистра = "-";
// Содержит признак необходимости вывода отрицательных значений показателей красным цветом.
// Тип: Булево.
// Значение по умолчанию: Ложь.
// Пример:
// УниверсальныйОтчет.ОтрицательноеКрасным = Истина;
УниверсальныйОтчет.ОтрицательноеКрасным = Истина;
// Содержит признак необходимости вывода в отчет общих итогов.
// Тип: Булево.
// Значение по умолчанию: Истина.
// Пример:
// УниверсальныйОтчет.ВыводитьОбщиеИтоги = Ложь;
УниверсальныйОтчет.ВыводитьОбщиеИтоги = Истина;
// Содержит признак необходимости вывода детальных записей в отчет.
// Тип: Булево.
// Значение по умолчанию: Ложь.
// Пример:
// УниверсальныйОтчет.ВыводитьДетальныеЗаписи = Истина;
УниверсальныйОтчет.ВыводитьДетальныеЗаписи = Ложь;
// Содержит признак необходимости отображения флага использования свойств и категорий в форме настройки.
// Тип: Булево.
// Значение по умолчанию: Истина.
// Пример:
// УниверсальныйОтчет.мВыбиратьИспользованиеСвойств = Ложь;
УниверсальныйОтчет.мВыбиратьИспользованиеСвойств = Истина;
// Содержит признак использования свойств и категорий при заполнении настроек отчета.
// Тип: Булево.
// Значение по умолчанию: Ложь.
// Пример:
// УниверсальныйОтчет.ИспользоватьСвойстваИКатегории = Истина;
//УниверсальныйОтчет.ИспользоватьСвойстваИКатегории = ЛОЖЬ;
// Содержит признак использования простой формы настроек отчета без группировок колонок.
// Тип: Булево.
// Значение по умолчанию: Ложь.
// Пример:
// УниверсальныйОтчет.мРежимФормыНастройкиБезГруппировокКолонок = Истина;
// Дополнительные параметры, переданные из отчета, вызвавшего расшифровку.
// Информация, передаваемая в переменной ДополнительныеПараметры, может быть использована
// для реализации специфичных для данного отчета параметрических настроек.
// Описание исходного текста запроса.
ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| CRM_ПредложенияОбороты.Номенклатура КАК Номенклатура,
| ПРЕДСТАВЛЕНИЕ(CRM_ПредложенияОбороты.Номенклатура) КАК НоменклатураПредставление,
| CRM_ПредложенияОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| ПРЕДСТАВЛЕНИЕ(CRM_ПредложенияОбороты.ХарактеристикаНоменклатуры) КАК ХарактеристикаНоменклатурыПредставление,
| CRM_ПредложенияОбороты.Контрагент КАК Контрагент,
| ПРЕДСТАВЛЕНИЕ(CRM_ПредложенияОбороты.Контрагент) КАК КонтрагентПредставление,
| CRM_ПредложенияОбороты.ДокументПредложения КАК Документ,
| ПРЕДСТАВЛЕНИЕ(CRM_ПредложенияОбороты.ДокументПредложения) КАК ДокументПредставление,
| CRM_ПредложенияОбороты.ДокументПредложения.Ответственный КАК Ответственный,
| ПРЕДСТАВЛЕНИЕ(CRM_ПредложенияОбороты.ДокументПредложения.Ответственный) КАК ОтветственныйПредставление,
| CRM_ПредложенияОбороты.КоличествоОборот КАК КоличествоОборот,
| CRM_ПредложенияОбороты.СтоимостьОборот КАК СтоимостьОборот,
| 0 КАК СкидкаОборот,
| 1 КАК Количество,
| CRM_ПредложенияОбороты.СтоимостьБезСкидокОборот КАК СтоимостьБезСкидокОборот
| //ПОЛЯ_СВОЙСТВА
| //ПОЛЯ_КАТЕГОРИИ
|{ВЫБРАТЬ
| Контрагент.*,
| Номенклатура.*,
| ХарактеристикаНоменклатуры.*,
| Ответственный.*,
| Документ.*,
| КоличествоОборот,
| СтоимостьОборот,
| СкидкаОборот,
| Количество,
| (ЕСТЬNULL(ИсточникиИнформацииПриОбращении.ИсточникИнформации,ЗНАЧЕНИЕ(Справочник.ИсточникиИнформацииПриОбращенииПокупателей.ПустаяСсылка))).* КАК ИсточникИнформации
| //ПСЕВДОНИМЫ_СВОЙСТВА
| //ПСЕВДОНИМЫ_КАТЕГОРИИ
|}
|ИЗ
| РегистрНакопления.CRM_Предложения.Обороты(&ДатаНач, &ДатаКон, , ) КАК CRM_ПредложенияОбороты
|{ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсточникИнформацииПриОбращении.СрезПоследних(&ДатаКон) КАК ИсточникиИнформацииПриОбращении
|ПО CRM_ПредложенияОбороты.Контрагент = ИсточникиИнформацииПриОбращении.Контрагент}
|//СОЕДИНЕНИЯ
|{ГДЕ
| CRM_ПредложенияОбороты.Контрагент.* КАК Контрагент,
| CRM_ПредложенияОбороты.Номенклатура.* КАК Номенклатура,
| CRM_ПредложенияОбороты.ХарактеристикаНоменклатуры.* КАК ХарактеристикаНоменклатуры,
| CRM_ПредложенияОбороты.ДокументПредложения.Ответственный.* КАК Ответственный,
| CRM_ПредложенияОбороты.ДокументПредложения.* КАК Документ,
| (ЕСТЬNULL(ИсточникиИнформацииПриОбращении.ИсточникИнформации,ЗНАЧЕНИЕ(Справочник.ИсточникиИнформацииПриОбращенииПокупателей.ПустаяСсылка))).* КАК ИсточникИнформации
| //УСЛОВИЯ_СВОЙСТВА
| //УСЛОВИЯ_КАТЕГОРИИ
|}
|{УПОРЯДОЧИТЬ ПО
| Контрагент.*,
| Номенклатура.*,
| ХарактеристикаНоменклатуры.*,
| Ответственный.*,
| Документ.*,
| (ЕСТЬNULL(ИсточникиИнформацииПриОбращении.ИсточникИнформации,ЗНАЧЕНИЕ(Справочник.ИсточникиИнформацииПриОбращенииПокупателей.ПустаяСсылка))).* КАК ИсточникИнформации
| //ПСЕВДОНИМЫ_СВОЙСТВА
| //ПСЕВДОНИМЫ_КАТЕГОРИИ
|}
|
|ИТОГИ
| СУММА(КоличествоОборот),
| СУММА(СтоимостьОборот),
| СУММА(СтоимостьБезСкидокОборот - СтоимостьОборот) КАК СкидкаОборот,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ(Документ)) КАК Количество
|ПО
| ОБЩИЕ
|{ИТОГИ ПО
| Контрагент.*,
| Номенклатура.*,
| ХарактеристикаНоменклатуры.*,
| Ответственный.*,
| Документ.*,
| (ЕСТЬNULL(ИсточникиИнформацииПриОбращении.ИсточникИнформации,ЗНАЧЕНИЕ(Справочник.ИсточникиИнформацииПриОбращенииПокупателей.ПустаяСсылка))).* КАК ИсточникИнформации,
| НАЧАЛОПЕРИОДА(CRM_ПредложенияОбороты.ДокументПредложения.Дата, ДЕНЬ) КАК ПериодДень,
| НАЧАЛОПЕРИОДА(CRM_ПредложенияОбороты.ДокументПредложения.Дата, НЕДЕЛЯ) КАК ПериодНеделя,
| НАЧАЛОПЕРИОДА(CRM_ПредложенияОбороты.ДокументПредложения.Дата, МЕСЯЦ) КАК ПериодМесяц,
| НАЧАЛОПЕРИОДА(CRM_ПредложенияОбороты.ДокументПредложения.Дата, КВАРТАЛ) КАК ПериодКвартал,
| НАЧАЛОПЕРИОДА(CRM_ПредложенияОбороты.ДокументПредложения.Дата, ГОД) КАК ПериодГод
| //ПСЕВДОНИМЫ_СВОЙСТВА
| //ПСЕВДОНИМЫ_КАТЕГОРИИ
|}";
// В универсальном отчете включен флаг использования свойств и категорий.
Если УниверсальныйОтчет.ИспользоватьСвойстваИКатегории Тогда
// Добавление свойств и категорий поля запроса в таблицу полей.
// Необходимо вызывать для каждого поля запроса, предоставляющего возможность использования свойств и категорий.
// УниверсальныйОтчет.ДобавитьСвойстваИКатегорииДляПоля(<ПсевдонимТаблицы>.<Поле> , <ПсевдонимПоля>, <Представление>, <Назначение>);
УниверсальныйОтчет.ДобавитьСвойстваИКатегорииДляПоля("CRM_ПредложенияОбороты.Номенклатура" , "Номенклатура", "Номенклатура", ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Номенклатура);
УниверсальныйОтчет.ДобавитьСвойстваИКатегорииДляПоля("CRM_ПредложенияОбороты.ХарактеристикаНоменклатуры" , "ХарактеристикаНоменклатуры", "Характеристика номенклатуры", ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Номенклатура);
УниверсальныйОтчет.ДобавитьСвойстваИКатегорииДляПоля("CRM_ПредложенияОбороты.Контрагент" , "Контрагент", "Контрагент", ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Номенклатура);
УниверсальныйОтчет.ДобавитьСвойстваИКатегорииДляПоля("CRM_ПредложенияОбороты.ДокументПредложения" , "Документ", "Коммерческое предложение", ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Документ_CRM_КоммерческоеПредложение);
// Добавление свойств и категорий в исходный текст запроса.
УниверсальныйОтчет.ДобавитьВТекстЗапросаСвойстваИКатегории(ТекстЗапроса);
КонецЕсли;
// Инициализация текста запроса построителя отчета
УниверсальныйОтчет.ПостроительОтчета.Текст = ТекстЗапроса;
// Представления полей отчета.
// Необходимо вызывать для каждого поля запроса.
// УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить(<ИмяПоля>, <ПредставлениеПоля>);
УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("ХарактеристикаНоменклатуры", "Характеристика номенклатуры");
УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("Документ", "Коммерческое предложение");
УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("ИсточникИнформации", "Источник информации при обращении покупателя");
// Добавление показателей
// Необходимо вызывать для каждого добавляемого показателя.
// УниверсальныйОтчет.ДобавитьПоказатель(<ИмяПоказателя>, <ПредставлениеПоказателя>, <ВключенПоУмолчанию>, <Формат>, <ИмяГруппы>, <ПредставлениеГруппы>);
//УниверсальныйОтчет.ДобавитьПоказатель("Задача", "Задача", Истина,);
УниверсальныйОтчет.ДобавитьПоказатель("Количество", "Количество документов", Истина, "ЧЦ = 15 ; ЧДЦ = 3");
УниверсальныйОтчет.ДобавитьПоказатель("КоличествоОборот", "Количество номенклатуры", Истина, "ЧЦ = 15 ; ЧДЦ = 3",,);
УниверсальныйОтчет.ДобавитьПоказатель("СтоимостьОборот", "Сумма", Истина, "ЧЦ = 15 ; ЧДЦ = 2");
УниверсальныйОтчет.ДобавитьПоказатель("СкидкаОборот", "Скидка", Истина, "ЧЦ = 15 ; ЧДЦ = 2",,);
// Добавление предопределенных группировок строк отчета.
// Необходимо вызывать для каждой добавляемой группировки строки.
// УниверсальныйОтчет.ДобавитьИзмерениеСтроки(<ПутьКДанным>);
УниверсальныйОтчет.ДобавитьИзмерениеСтроки("Контрагент");
УниверсальныйОтчет.ДобавитьИзмерениеСтроки("Номенклатура");
// Добавление предопределенных группировок колонок отчета.
// Необходимо вызывать для каждой добавляемой группировки колонки.
// УниверсальныйОтчет.ДобавитьИзмерениеКолонки(<ПутьКДанным>);
// Добавление предопределенных отборов отчета.
// Необходимо вызывать для каждого добавляемого отбора.
// УниверсальныйОтчет.ДобавитьОтбор(<ПутьКДанным>);
УниверсальныйОтчет.ДобавитьОтбор("Контрагент");
УниверсальныйОтчет.ДобавитьОтбор("Номенклатура");
УниверсальныйОтчет.ДобавитьОтбор("Ответственный");
УниверсальныйОтчет.ДобавитьОтбор("Документ");
// Добавление предопределенных полей порядка отчета.
// Необходимо вызывать для каждого добавляемого поля порядка.
// УниверсальныйОтчет.ДобавитьПорядок(<ПутьКДанным>);
// Установка связи подчиненных и родительских полей
// УниверсальныйОтчет.УстановитьСвязьПолей(<ПутьКДанным>, <ПутьКДаннымРодитель>);
//УниверсальныйОтчет.УстановитьСвязьПолей("ТочкаМаршрута","Задача");
// Установка связи полей и измерений
// УниверсальныйОтчет.УстановитьСвязьПоляИИзмерения(<ИмяПоля>, <ИмяИзмерения>);
// Установка представлений полей
УниверсальныйОтчет.УстановитьПредставленияПолей(УниверсальныйОтчет.мСтруктураПредставлениеПолей, УниверсальныйОтчет.ПостроительОтчета);
// Установка типов значений свойств в отборах отчета
УниверсальныйОтчет.УстановитьТипыЗначенийСвойствДляОтбора();
// Заполнение начальных настроек универсального отчета
УниверсальныйОтчет.УстановитьНачальныеНастройки(Ложь);
// Добавление предопределенных отборов отчета.
// Необходимо вызывать для каждого добавляемого отбора.
// УниверсальныйОтчет.ДобавитьОтбор(<ПутьКДанным>);
УниверсальныйОтчет.ДобавитьОтбор("Контрагент");
УниверсальныйОтчет.ДобавитьОтбор("Номенклатура");
УниверсальныйОтчет.ДобавитьОтбор("Ответственный");
УниверсальныйОтчет.ДобавитьОтбор("Документ");
// Добавление дополнительных полей
// Необходимо вызывать для каждого добавляемого дополнительного поля.
// УниверсальныйОтчет.ДобавитьДополнительноеПоле(<ПутьКДанным>, <Размещение>, <Положение>);
УниверсальныйОтчет.мСтруктураФорматаПолей.Вставить("ДатаВыполнения", "ДЛФ=DDT");
УниверсальныйОтчет.мСтруктураФорматаПолей.Вставить("ДатаФактическогоВыполнения", "ДЛФ=DDT");
УниверсальныйОтчет.мМинимальнаяШиринаКолонкиПоказатель = 10;
УниверсальныйОтчет.мМаксимальнаяШиринаКолонки = 80;
КонецПроцедуры // УстановитьНачальныеНастройки()
Как настроить условное оформление в Универсальном отчете?
Выравнивание значений влево :
Код 1C v 8.х ЭлементОформления = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("Номенклатура", "Номенклатура");
ЭлементОформления.Область.Добавить("Номенклатура", "Номенклатура", ТипОбластиОформления.Поле);
ЭлементОформления.Оформление.ГоризонтальноеПоложение.Значение = ГоризонтальноеПоложение.Лево;
ЭлементОформления.Оформление.ГоризонтальноеПоложение.Использование = Истина;
ЭлементОформления.Использование = Истина;
ЭлементОформления = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("ХарактеристикаНоменклатуры", "ХарактеристикаНоменклатуры");
ЭлементОформления.Область.Добавить("ХарактеристикаНоменклатуры", "ХарактеристикаНоменклатуры", ТипОбластиОформления.Поле);
ЭлементОформления.Оформление.ГоризонтальноеПоложение.Значение = ГоризонтальноеПоложение.Лево;
ЭлементОформления.Оформление.ГоризонтальноеПоложение.Использование = Истина;
ЭлементОформления.Использование = Истина;
УниверсальныйОтчет.мМинимальнаяШиринаКолонкиПоказатель = 7;
УниверсальныйОтчет.мМаксимальнаяШиринаКолонки = 50;
Изменение цвета текста и т.д.
Код 1C v 8.х // Условное оформление поля "Состояние"
ЭлементОформления = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("ТребуетсяЗаказать", "Требуется заказать");
ЭлементОформления.Область.Добавить("Состояние", "Состояние", ТипОбластиОформления.Поле);
ЭлементОтбора = ЭлементОформления.Отбор.Добавить("Состояние");
ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;
ЭлементОтбора.Значение = 0;
ЭлементОтбора.Использование = Истина;
ЭлементОформления.Оформление.ЦветТекста.Значение = WebЦвета.Красный;
ЭлементОформления.Оформление.ЦветТекста.Использование = Истина;
ЭлементОформления.Оформление.Текст.Значение = "Требуется заказать";
ЭлементОформления.Оформление.Текст.Использование = Истина;
ЭлементОформления.Использование = Истина;
ЭлементОформления = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("РекомендуетсяЗаказать", "Рекомендуется заказать");
ЭлементОформления.Область.Добавить("Состояние", "Состояние", ТипОбластиОформления.Поле);
ЭлементОтбора = ЭлементОформления.Отбор.Добавить("Состояние");
ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;
ЭлементОтбора.Значение = 1;
ЭлементОтбора.Использование = Истина;
ЭлементОформления.Оформление.ЦветТекста.Значение = WebЦвета.Коричневый;
ЭлементОформления.Оформление.ЦветТекста.Использование = Истина;
ЭлементОформления.Оформление.Текст.Значение = "Рекомендуется заказать";
ЭлементОформления.Оформление.Текст.Использование = Истина;
ЭлементОформления.Использование = Истина;
ЭлементОформления = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("НеТребуетсяЗаказывать", "Не требуется заказывать");
ЭлементОформления.Область.Добавить("Состояние", "Состояние", ТипОбластиОформления.Поле);
ЭлементОтбора = ЭлементОформления.Отбор.Добавить("Состояние");
ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;
ЭлементОтбора.Значение = 2;
ЭлементОтбора.Использование = Истина;
ЭлементОформления.Оформление.ЦветТекста.Значение = WebЦвета.Зеленый;
ЭлементОформления.Оформление.ЦветТекста.Использование = Истина;
ЭлементОформления.Оформление.Текст.Значение = "Не требуется заказывать";
ЭлементОформления.Оформление.Текст.Использование = Истина;
ЭлементОформления.Использование = Истина;
ЭлементОформления = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("ЗонаПоСумме", "Зона По Сумме");
ЭлементОформления.Область.Добавить("ЗонаПоСумме", "ЗонаПоСумме", ТипОбластиОформления.Поле);
ЭлементОтбора = ЭлементОформления.Отбор.Добавить("ЗонаПоСумме");
ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;
ЭлементОтбора.Значение = "крас";
ЭлементОтбора.Использование = Истина;
ЭлементОформления.Оформление.ЦветФона.Значение = WebЦвета.Красный;
ЭлементОформления.Оформление.ЦветФона.Использование = Истина;
ЭлементОформления.Оформление.Текст.Значение = "";
ЭлементОформления.Оформление.Текст.Использование = Истина;
ЭлементОформления.Использование = Истина;
ЭлементОформления = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("ЗонаПоСумме", "Зона По Сумме");
ЭлементОформления.Область.Добавить("ЗонаПоСумме", "ЗонаПоСумме", ТипОбластиОформления.Поле);
ЭлементОтбора = ЭлементОформления.Отбор.Добавить("ЗонаПоСумме");
ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;
ЭлементОтбора.Значение = "зелн";
ЭлементОтбора.Использование = Истина;
ЭлементОформления.Оформление.ЦветТекста.Значение = WebЦвета.Зеленый;
ЭлементОформления.Оформление.ЦветТекста.Использование = Истина;
ЭлементОформления.Оформление.Шрифт.Значение = Новый Шрифт(,,Истина);
ЭлементОформления.Оформление.Шрифт.Использование = Истина;
ЭлементОформления.Оформление.Текст.Значение = "|||||||||||||||||";
ЭлементОформления.Оформление.Текст.Использование = Истина;
ЭлементОформления.Использование = Истина;
Для типа «Дата»:
Код 1C v 8.х ЭлементОформления = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("ДатаЗаписи", "Дата записи");
ЭлементОформления.Область.Добавить("ДатаЗаписи", "Дата записи", ТипОбластиОформления.Поле);
ЭлементОформления.Оформление.Формат.Значение = "ДФ=dd.MM.yyyy";
ЭлементОформления.Оформление.Формат.Использование = Истина;
ЭлементОформления.Использование = Истина;
Для типа «Булево»:
Код 1C v 8.х ЭлементОформления = УниверсальныйОтчет.ПостроительОтчета.УсловноеОформление.Добавить("Печать", "Печать");
ЭлементОформления.Область.Добавить("Печать", "Печать", ТипОбластиОформления.Поле);
ЭлементОформления.Оформление.ГоризонтальноеПоложение.Значение = ГоризонтальноеПоложение.Центр;
ЭлементОформления.Оформление.Формат.Значение = «БЛ=Нет; БИ=Напечатан»;
ЭлементОформления.Оформление.ГоризонтальноеПоложение.Использование = Истина;
ЭлементОформления.Использование = Истина;
Категория:
Прочие вопросы Как выгрузить Таблицу значение в файл Excel? Код 1C v 8.х Процедура СохранитьТаблицуВФайлExcel(Таблица, ПолноеИмяФайла="", ОткрыватьДиалогВыбораФайла=Истина, ВыгружаемыеКолонки="") Экспорт
Если ПустаяСтрока(ПолноеИмяФайла) ИЛИ ОткрыватьДиалогВыбораФайла Тогда
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Сохранение документа Excel";
Диалог.Фильтр = "Документ Excel (*.xls)|*.xls";
Диалог.Расширение = "xls";
Диалог.ПолноеИмяФайла = ПолноеИмяФайла;
Диалог.Каталог = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнойКаталогФайлов");
Если (Диалог.Выбрать()) И (НЕ ПустаяСтрока(Диалог.ПолноеИмяФайла)) Тогда
ПолноеИмяФайла = Диалог.ПолноеИмяФайла;
Иначе
Возврат;
КонецЕсли;
КонецЕсли;
ФайлНаДиске = Новый Файл(ПолноеИмяФайла);
Попытка
// Загрузка Microsoft Excel
Состояние("Выгрузка данных из 1С в Microsoft Excel...");
ExcelПриложение = Новый COMОбъект("Excel.Application");
Книга = ExcelПриложение.WorkBooks.Add();
Лист = Книга.WorkSheets(1);
Исключение
Сообщить("Ошибка при загрузке Microsoft Excel."
+ Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат;
КонецПопытки;
Если ПустаяСтрока(ВыгружаемыеКолонки) Тогда
ТаблицаВыгрузки = Таблица.Скопировать();
Иначе
ТаблицаВыгрузки = Таблица.Скопировать(, ВыгружаемыеКолонки);
КонецЕсли;
Для Кол = 0 По ТаблицаВыгрузки.Колонки.Количество()-1 Цикл
Лист.Cells(1, Кол + 1).Value = ТаблицаВыгрузки.Колонки[Кол].Заголовок;
КонецЦикла;
Попытка
Для Стр = 0 По ТаблицаВыгрузки.Количество()-1 Цикл
Для Кол = 0 По ТаблицаВыгрузки.Колонки.Количество()-1 Цикл
Если ТипЗнч(ТаблицаВыгрузки[Стр][Кол]) = Тип("Число") Тогда
// Установним формат для типа Число
//Лист.Cells(Стр + 2, Кол + 1).NumberFormat = "0,00";
Лист.Cells(Стр + 2, Кол + 1).Value = ТаблицаВыгрузки[Стр][Кол];
Иначе
// Для всех других типов установим формат "Текстовый"
//Лист.Cells(Стр + 2, Кол + 1).NumberFormat = "@";
Лист.Cells(Стр + 2, Кол + 1).Value = Строка(ТаблицаВыгрузки[Стр][Кол]);
КонецЕсли;
КонецЦикла;
КонецЦикла;
ExcelПриложение.DisplayAlerts = False;
Книга.SaveAs(ПолноеИмяФайла);
ExcelПриложение.ActiveWorkbook.Close();
ExcelПриложение.Quit();
Сообщить("Файл выгружен успешно: " + ПолноеИмяФайла);
Исключение
Сообщить("Ошибка записи данных файла :" + ПолноеИмяФайла);
Сообщить(ОписаниеОшибки());
Попытка
ExcelПриложение.Quit();
Исключение
КонецПопытки;
КонецПопытки;
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice Как результат СКД в виде Табличного Документа разобрать и вывести в Дерево Значений Процедура получает из СКД результат в виде Табличного документа, парсит его, создает в Дереве на форме колонки и заполняет дерево данными результата СКД
Смысл в том, что СКД не может вывести результат в объект на форму, если он Таблица - выдает ошибку "Не поддерживается вывод таблиц, диаграмм и вложенных отчетов в универсальную коллекцию значений".
Поэтому я выгружаю СКД в ТабличныйДокумент и вытаскиваю данные уже из него, далее строю и заполняю Дерево на форме
Код 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;
КонецЦикла;
КонецПроцедуры
Автор:
Абазин Антон Категория:
Схема Компоновки Данных Фильтрация иерархического справочника по какому-либо условию в форме списка Есть ли в 8.х аналог ИспользоватьСписокЭлементов?
В динамических списках документов, справочников и т.д. может быть программно установлен отбор по полю Ссылка с указанием в качестве вида сравнения вхождения в список значений. Это позволяет отображать в списке только определенные объекты.
Однако эта возможность может иметь только ограниченное применение, так как динамический список имеет достаточно большое количество универсальных возможностей (установка отбора пользователем, переходы по уровням в иерархических списках и т.д.) и совмещение в прикладных решениях этих механизмов с отбором по конкретным значениям ссылок достаточно сложно реализуется.
В большинстве случаев, если необходимо обеспечить отображение в списке специально отобранного перечня объектов, можно рекомендовать использовать другие возможности (например, выборку данных запросом и отображение в форме с помощью таблицы значений или табличного документа). При этом система обеспечивает возможность полноценного взаимодействия с такими формами других системных механизмов.
Код 1C v 8.х Запрос = Новый Запрос();
Запрос.Текст = " ВЫБРАТЬ
| СпецификацииНоменклатуры.Ссылка
|ИЗ
| Справочник.СпецификацииНоменклатуры КАК СпецификацииНоменклатуры
|ГДЕ
| СпецификацииНоменклатуры.Владелец.Ссылка = &НоменклатураСсылка
| И СпецификацииНоменклатуры.Организация В ИЕРАРХИИ (&Организация)";
Запрос.УстановитьПараметр("НоменклатураСсылка", ГотоваяПродукция);
Запрос.УстановитьПараметр("Организация", Организация);
СписокСпецификаций = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
ФормаВыбора = Справочники.СпецификацииНоменклатуры.ПолучитьФормуВыбора(,Элемент,Элемент);
ЭлементОтбора = ФормаВыбора.СправочникСписок.Отбор.Ссылка;
ЭлементОтбора.ВидСравнения = ВидСравнения.ВСписке;
ЭлементОтбора.Значение = СписокСпецификаций;
ЭлементОтбора.Использование = Истина;
ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.Ссылка.Доступность = Ложь;
ФормаВыбора.Открыть();
Код 1C v 8.2 УП &НаКлиенте
Процедура ПоУмолчаниюОпцияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ФормаВыбора = ПолучитьФорму("Справочник.ОпцииАвтомобилей.Форма.ФормаВыбора");
ФормаВыбора.Открыть();
ЭлементОтбора = ФормаВыбора.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
ЭлементОтбора.ПравоеЗначение = СписокОпций;
ЭлементОтбора.Использование = Истина;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//считаем данные по опциям доступной для данной модели
СписокОпций.ЗагрузитьЗначения(Объект.Владелец.ОпцииМодели.Выгрузить().ВыгрузитьКолонку("Опция"));
КонецПроцедуры
Для 7.7 используем метод ИспользоватьСписокЭлементов
Автор:
Antoska
Для решения данной задачи я решил воспользоваться методом формы списка "ИспользоватьСписокЭлементов(<СписокЗначений>)", так как использование процедуры "ОбработкаПодбора()" требует наличия реквизита справочника для отбора, а это мне не очень подходит. Вот как я реализовал этот алгоритм (код из модуля формы списка справочника):
Код 1C v 7.x Функция СоответствуетУсловиямФильтра(ЭлементСправочника)
Если ПустоеЗначение(ЭлементСправочника) = 0 Тогда
//Условие фильтра: текущий остаток не равен нулю
Если Регистр.ПартииТоваров.СводныйОстаток("",ЭлементСправочника.ТекущийЭлемент(),,,,,"ОстатокТовара") <> 0 Тогда
Возврат 1;
КонецЕсли;
КонецЕсли;
Возврат 0;
КонецФункции
Процедура УстановитьФильтр(Знач Группа="", Знач Иерархия="")
//Для флажка Фильтр задана формула "УстановитьФильтр()"
Если Фильтр = 1 Тогда
//Определяем параметры процедуры
Группа = ?(Группа="",ТекущийЭлемент().Родитель,Группа);
Иерархия = ?(Иерархия="",ИерархическийСписок(),Иерархия);
СписокФильтра = СоздатьОбъект("СписокЗначений");
Спр = СоздатьОбъект("Справочник.Номенклатура");
//Определяемся с использованием родителя при выборке элементов
Если ПустоеЗначение(Группа) = 0 Тогда
Спр.ИспользоватьРодителя(Группа);
КонецЕсли;
Спр.ВключатьПодчиненные(0);
//Выбираем элементы с учётом иерархии
Спр.ВыбратьЭлементы(Иерархия);
Пока Спр.ПолучитьЭлемент() = 1 Цикл
//Показваем группы, для удобства навигации
Если Спр.ЭтоГруппа() = 1 Тогда
//Добавляем группу в список фильтра
СписокФильтра.ДобавитьЗначение(Спр.ТекущийЭлемент());
Продолжить;
КонецЕсли;
//Проверяем элемент на соответствие условиям фильтра
Если СоответствуетУсловиямФильтра(Спр.ТекущийЭлемент()) = 1 Тогда
//Добавляем элемент в список фильтра
СписокФильтра.ДобавитьЗначение(Спр.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;
//Устанавливаем фильтр
ИспользоватьСписокЭлементов(СписокФильтра);
Иначе
//Снимаем фильтр
ИспользоватьСписокЭлементов();
КонецЕсли;
КонецПроцедуры
Процедура ПриВыбореРодителя(Элемент)
УстановитьФильтр(Элемент)
КонецПроцедуры
Процедура ПриСменеИерархии(Способ)
УстановитьФильтр(,Способ)
КонецПроцедуры
Функцией "СоответствуетУсловиямФильтра(ЭлементСправочника)" можно задавать любые условия фильтрации списка опираясь на передаваемый ей элемент справочника.
Скорость работы приемлема, но можно попробовать реализовать и через запрос...
Категория:
Справочники