Процедура ПриКомпоновкеРезультата
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
На вопрос «Что можно делать в СКД , в процедуре ПриКомпоновкеРезультата ?» смело отвечайте «Все!» и вы не ошибетесь. Ниже список приемов кодирования внутри процедуры ПриКомпоновкеРезультата, подходит для УТ 11.4.6.188 и многих других современных программ. Пункты 6-8 уже подробно описаны на сайте, включил их для полной картины. Хотелось обобщить, собрать все приемы в одном месте.
В процедуре это удобнее и нагляднее, чем в полях "Значение" и "Выражение" на закладке Параметры.

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ЗначениеРасчета = "Заменить текст вычислением значения";
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(КомпоновщикНастроек, "СложныйАлгоритмРасчета", ЗначениеРасчета);
//альтернативный вариант, если нет модуля КомпоновкаДанныхКлиентСервер
//ПараметрРасчета = Новый ПараметрКомпоновкиДанных("СложныйАлгоритмРасчета");
//ЗначениеРасчета = "Заменить текст вычислением значения";
//КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрРасчета, ЗначениеРасчета);
КонецПроцедуры
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ТаблицаПредупреждение = Новый ТабличныйДокумент;
ОбластьПредупреждение = ТаблицаПредупреждение.Область(1,1,1,1);
ОбластьПредупреждение.Текст = "В отчет не включены организации, имеющие метод оценки стоимости";
ОбластьПредупреждение.ЦветТекста = ЦветаСтиля.ЦветОтрицательногоЧисла;
ДокументРезультат.ВставитьОбласть(
ОбластьПредупреждение,
ДокументРезультат.Область(1,1,1,1),
ТипСмещенияТабличногоДокумента.ПоВертикали);
ДокументРезультат.АвтоМасштаб = Истина;
КонецПроцедуры
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ПолеСоставногоТипа = КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(КомпоновщикНастроек,"ПолеСоставногоТипа");
//альтернативный вариант, если нет модуля КомпоновкаДанныхКлиентСервер
//НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
//ПолеСоставногоТипа = НастройкиОтчета.ПараметрыДанных.Элементы.Найти("ПолеСоставногоТипа").Значение;
ТекстЗапроса = СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос;
ИмяСоставногоТипа = ПолеСоставногоТипа.Значение.Метаданные().Имя;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ПриобретениеТоваровУслуг", ИмяСоставногоТипа);
СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = ТекстЗапроса;
КонецПроцедуры
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
НастройкиНовые = КомпоновщикНастроек.ПолучитьНастройки();
ЗначениеОтбора = 2;
Использование = Истина;
ДополнительныеПараметры = Новый Структура("ВПользовательскиеНастройки, ЗаменятьСуществующий", Истина, Истина);
КомпоновкаДанныхКлиентСервер.ДобавитьОтбор(
НастройкиНовые,
Новый ПолеКомпоновкиДанных("Количество"),
ЗначениеОтбора,
ВидСравненияКомпоновкиДанных.БольшеИлиРавно,
Использование,
ДополнительныеПараметры);
КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиНовые);
КонецПроцедуры
Большинство наших отчетов имеют обязательный отбор по подразделению. Процедура ПроверитьОбязательныйОтбор() - в общем модуле. Она содержит еще проверку прав доступа для значений отбора, но это уже не про СКД.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ПроверитьОбязательныйОтбор(КомпоновщикНастроек.ПолучитьНастройки().Отбор.Элементы, "Подразделение");
КонецПроцедуры
Процедура ПроверитьОбязательныйОтбор(ЭлементыОтбора, ПутьКДаннымПоля) Экспорт
ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКДаннымПоля);
ЗначениеОтбора = Неопределено;
Для каждого Элемент Из ЭлементыОтбора Цикл
Если НЕ Элемент.Использование Тогда
Продолжить;
КонецЕсли;
Если Элемент.ЛевоеЗначение = ЛевоеЗначение
И (Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно
ИЛИ Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке
ИЛИ Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии
ИЛИ Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии) Тогда
ЗначениеОтбора = Элемент.ПравоеЗначение;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЗначениеОтбора = Неопределено Тогда
ВызватьИсключение "Установите отбор по "+ПутьКДаннымПоля;
КонецЕсли;
КонецПроцедуры
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ИсполняемаяСКД = КомпоновкаДанныхСервер.СкопироватьСхемуКомпоновкиДанных(СхемаКомпоновкиДанных);
ИсполняемыйКомпоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
ИсполняемыйКомпоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(ИсполняемаяСКД));
ИсполняемыйКомпоновщик.ЗагрузитьНастройки(КомпоновщикНастроек.ПолучитьНастройки());
ИсполняемыйКомпоновщик.Настройки.Структура.Очистить();
ГруппировкаСтруктуры = КомпоновкаДанныхКлиентСервер.ДобавитьГруппировкуВКореньСтруктуры(ИсполняемыйКомпоновщик, "");
//долго разбирался, что второй параметр должен быть "".
//в результате такой настройки - одна строка. "Количество" - ресурс.
КомпоновкаДанныхКлиентСервер.ОтключитьВыводОбщихИтогов(ИсполняемыйКомпоновщик.Настройки);
//подготовить аргумент функции
Аргумент = КомпоновкаДанныхСервер.ПараметрыВыгрузитьРезультатСКД();
Аргумент.СхемаКомпоновки = ИсполняемаяСКД;
Аргумент.НастройкиКомпоновки = ИсполняемыйКомпоновщик.ПолучитьНастройки();
ТаблицаРезультата = КомпоновкаДанныхСервер.ВыгрузитьРезультатСКД(Аргумент);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Итог, количество " + ТаблицаРезультата.Итог("Количество"));
КонецПроцедуры
//Элегантное решение от разработчиков.
Функция СкопироватьСхемуКомпоновкиДанных(ИсходнаяСхема) Экспорт
Если ТипЗнч(ИсходнаяСхема) = Тип("СхемаКомпоновкиДанных") Тогда
СхемаКомпоновкиДанных = СериализаторXDTO.ПрочитатьXDTO(СериализаторXDTO.ЗаписатьXDTO(ИсходнаяСхема));
Иначе
СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
КонецЕсли;
Возврат СхемаКомпоновкиДанных;
КонецФункции
Примечание: похожий способ применяют для нахождения итогов по динамическому списку. Чтобы получить схему и настройку для списка, используют методы ПолучитьИсполняемуюСхемуКомпоновкиДанных(); ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
Знаю, много написано, повторяться не хотел. Но каждый раз приходится где-то искать. Пусть будет в одном месте.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить( СхемаКомпоновкиДанных, НастройкиКомпоновки, ДанныеРасшифровки );
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать( МакетКомпоновки, ВнешниеНаборыДанных(), ДанныеРасшифровки, Истина, Ложь);
//количество аргументов различается в разных релизах платформы ?
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры
Функция ВнешниеНаборыДанных()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗНАЧЕНИЕ(Справочник.Номенклатура.Пустаяссылка) КАК Номенклатура,
| 0 КАК Цена";
РезультатЗапроса = Запрос.Выполнить();
Возврат Новый Структура( "ВнешняяТаблица", РезультатЗапроса.Выгрузить() );
Конецфункции
В современных конфигурациях нестандартную обработку можно легко найти по ключевому слову "Процессор"
Постановка задачи: в регистре «РегистрацияИзмененияВОбъектах» в измерении хранится уникальный идентификатор измененного объекта. Необходимо построить отчет СКД, содержащий ссылку на объект.
Решение: Создадим вспомогательный регистр «ИДОбъектов», содержащий поля Уникальный идентификатор, СсылкаОбъекта. Запрос СКД выглядит примерно так:
ВЫБРАТЬ
РегистрацияИзмененияВОбъектах.УникальныйИдентификатор,
РегистрацияИзмененияВОбъектах.Дата,
РегистрацияИзмененияВОбъектах.Пользователь,
ИДОбъектов.СсылкаОбъекта
ИЗ
РегистрСведений.РегистрацияИзмененияВОбъектах КАК РегистрацияИзмененияВОбъектах
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИДОбъектов КАК ИДОбъектов
ПО РегистрацияИзмененияВОбъектах.УникальныйИдентификатор = ИДОбъектов.УникальныйИдентификатор
ГДЕ РегистрацияИзмененияВОбъектах.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
Регистр ИДОбъектов можно заполнять регламентным заданием, но как ограничить выбор объектов и с какой частотой запускать ? Поэтому заполнение регистра сделал при формировании отчета. Можно было сделать отдельный запрос, не привязываясь к компоновке данных, но здесь формирование в коллекцию значений позволяет учитывать все установленные отборы СКД. Поля в исходном и заменяемом запросе совпадают. После заполнения вспомогательного регистра ИДОбъектов текст запроса возвращаем, происходит формирование основного отчета.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ВременныйТекст =
"ВЫБРАТЬ
| РегистрацияИзмененияВОбъектах.УникальныйИдентификатор
| РегистрацияИзмененияВОбъектах.Дата,
| РегистрацияИзмененияВОбъектах.Пользователь,
| ИДОбъектов.СсылкаОбъекта
|ИЗ
| РегистрСведений.РегистрацияИзмененияВОбъектах КАК РегистрацияИзмененияВОбъектах
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИДОбъектов КАК ИДОбъектов
| ПО (ИДОбъектов.УникальныйИдентификатор = РегистрацияИзмененияВОбъектах.УникальныйИдентификатор)
|ГДЕ
| РегистрацияИзмененияВОбъектах.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
| И ИДОбъектов.СсылкаОбъекта ЕСТЬ NULL";
ТекстЗапроса = СхемаКомпоновкиДанных.НаборыДанных[0].Запрос;
СхемаКомпоновкиДанных.НаборыДанных[0].Запрос = ВременныйТекст;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ГенераторМакета = Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений");
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки, , ГенераторМакета);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ОтсутствующиеИДНоменклатуры = Новый ТаблицаЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ОтсутствующиеИДНоменклатуры);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных, Ложь);
Для каждого ОтсутствующийИдентификатор Из ОтсутствующиеИдентификаторы Цикл
ЗаписьРегистра = РегистрыСведений.ИДОбъектов.СоздатьМенеджерЗаписи();
ЗаписьРегистра.УникальныйИдентификатор = ОтсутствующийИдентификатор.УникальныйИдентификатор;
Попытка
УникальныйИдентификатор = Новый УникальныйИдентификатор(ЗаписьРегистра.УникальныйИдентификатор);
ЗаписьРегистра.СсылкаОбъекта = Справочники.Номенклатура.ПолучитьСсылку(УникальныйИдентификатор);
Исключение
Продолжить;
КонецПопытки;
ЗаписьРегистра.Записать();
КонецЦикла;
СхемаКомпоновкиДанных.НаборыДанных[0].Запрос = ТекстЗапроса;
КонецПроцедуры
Можно изменять условное оформление СКД при формировании отчета.
Пример для динамических списков
//Параметрами, которые здесь находятся, тоже можно управлять
Настройки = КомпоновщикНастроек.Настройки;
Параметр = Новый ПараметрКомпоновкиДанных("ВыводитьЗаголовок");
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра(Параметр, Истина);
Параметр = Новый ПараметрКомпоновкиДанных("Заголовок");
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра(Параметр, "Новый заголовок");
Параметр = Новый ПараметрКомпоновкиДанных("МакетОформления");
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра(Параметр, "Море");
Опубликовал несколько отчетов под брендом "Очень простой отчет":
Две разных схемы СКД в одном отчете. Не спрашивайте - зачем.
Ограничение доступа через Отбор в СКД, Динамических списках.
"Сравнение выручки за два периода"
"Структура данных конфигурации"
Кроме всего вышеперечисленного, в процедуре «ПриКомпоновкеРезультата» можно устанавливать нужный вариант отчета или проверять права пользователя на доступ к отчету, но как правило, это выполняют раньше. В типовой конфигурации УТ разработчики чаще всего используют приемы 2-4, 7. Любопытно, что изменять табличный документ или данные расшифровки я догадался в самую последнюю очередь.
Файл с учебным примером прикреплен.
Обновление от 13/09/2019
Для ДинамическогоСписка обратите внимание на функции
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(),
ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка(),
ПолучитьИсполняемуюСхемуКомпоновкиДанных(),
ПолучитьИсполняемыеНастройкиКомпоновкиДанных().
Проверено на следующих конфигурациях и релизах:
- Управление торговлей, редакция 11, релизы 11.5.23.64
Вступайте в нашу телеграмм-группу Инфостарт
См. также
Инструментарий разработчика Роли и права Запросы СКД Разработчик Руководитель проекта 1С:Предприятие 8 Платные (руб)
Инструменты для разработчиков 1С 8.3 и 8.5: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.
16500 руб.
02.09.2020 285493 1606 423
СКД Разработчик 1С:Предприятие 8 Бесплатно (free)
Как решить проблему с отборами по полям СКД, когда с одинаковым отбором Отчет показывает одно, а Консоль запросов другое.
16.06.2026 6358 sapervodichka 45
Инструментарий разработчика СКД Разработчик 1С 8.3 Бесплатно (free)
В этой статье представлен ПовелительОтчетов — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.
29.01.2026 9425 454 shapa_pro 31
СКД Разработчик 1С:Предприятие 8 Бесплатно (free)
Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.
29.10.2025 26995 ovetgana 112
СКД Разработчик 1С:Предприятие 8 Бесплатно (free)
Описан способ заполнения списка доступных значений для полей наборов данных и параметров в схеме компоновки данных для любых конфигураций (с использованием БСП или без).
01.07.2025 15754 krasnoshchekovpavel 7
СКД Разработчик Стажер 1С:Предприятие 8 Россия Бесплатно (free)
Несколько способов управления формами выбора параметров и отборов СКД.
10.04.2025 15195 Neti 0
СКД Разработчик 1С:Предприятие 8 Бесплатно (free)
Хорошая отчетная форма - сродни искусству. Есть какое-то невероятное эстетическое удовольствие в том, чтобы разобраться в логике учета и анализируемых показателях, спроектировать архитектуру хранения данных так, чтобы оптимально собрать эти показатели вместе с аналитическими разрезами в запросе, а затем настроить отображение так, чтобы, глядя на результат, сразу было понятно, что это за отчет и какие задачи он призван решать. Система компоновки данных - это моя первая, главная и, наверное, единственная "рабочая" любовь. Ее я использую везде, где только можно и где нельзя тоже. Хочу поделиться с вами некоторыми практическими приемами в работе с отчетами на СКД, которые, надеюсь, будут полезны.
27.02.2025 19813 ovetgana 50
СКД Разработчик 1С:Предприятие 8 Бесплатно (free)
СКД – инструмент, на базе которого в современных конфигурациях реализованы практически все отчеты. СКД используется в динамических списках, печатных формах и универсальных механизмах. Если построить простейший отчет может каждый разработчик, то с нюансами знакомы далеко не все. Расскажем о неочевидных на первый взгляд приемах, способных значительно повысить качество отчетов.
24.12.2024 17736 Akcium 17
ЗначениеРасчета = "Заменить текст вычислением значения";
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(КомпоновщикНастроек, "СложныйАлгоритмРасчета", ЗначениеРасчета);
вот за это 1сников и не считают за программистов
ввел значение расчета выделил под нее память и она тут же используется и больше нигде
и это в образцы кода
комментария достаточно 3й параметр то-то и то-то
плюс еще названа ЗначениеРасчета можно подумать что это Значение но это разные вещи
Это учебный пример.
В реальности вместо текста должен быть вызов функции (вычисление значения).
:))
но переменная не нужна и можно было в комментарий записать или вообще в строковый реквизит вместо переменной
"тут команда выполнить"
я когда прочитал прямо почувствовал как у меня из-за напряжения в голове уменьшилось количество во нейронов, поэтому и высказал претензию автору образцы кода должны быть легкими для восприятия
за колво строк я не борюсь - читай внимательно выше "я не против писать в две строки"
ну и далее читай и думай, значит голову включай)
хоть это и не по теме
для этого надо понимать отличия интерпретатора от компилятора - интепретатор выполняет код таким какой он есть по сути выполняя построчный перевод, в нем по определению нет оптимизации
а то что кнфигуратор не среда разработки - гугли определение - это один из режимов программы. 1с хочет создать среду разработки - их продукт едт, он на нее больше похож. То что в конфигураторе есть отладчик и редактор текста это не делает его средой разработки, я так на блокнот напишу сверху проверку синтаксиса и скажу создал среду разработки. Скорее конфигуратор это песочница (вряд ли поймешь если две строки не понял - но пробуй читай определение, что это программа ограничивающая кривые руки разработчиков - основные объекты изменять нельзя, код можно писать только в заданных модулях), вероятно корпоративный желтый цвет не случайно, песок же желтый)))
изначально мой пост был о том что заметил человек в (19) попробуй там прочитать и понять, не считай себя тупым не отчаивайся)
(23)
не, изначально сообщение было о том, что оптимизаций нет, потому, что конфигуратор не такой, как тебе бы хотелось
Спасибо, добрый, человек, я стараюсь
если бы ты включил голову и вчитался в приведенную тобой цитату то увидел бы в ней предположение и никакой аргументации, вероятно из-за этого ты увел спор в другую тему совсем не связанную с темой топика
еще раз вернуться к теме топика и высказанной мной претензии - объявляется переменная, которая тут же используется и больше нигде - это не нужно и конфигуратор или интерпретатор или "среда разработки" как ты ее называешь вряд ли такое оптимизирует будет выделена память на ненужную переменную
вроед то что конфигуратор не среда обработки я тоже пояснил - ты загуглил "определение конфигуратора" получил конфигуратор - это режим работы программы
Просто поток сознания, никак не относящийся к беседе с обсуждением что предполагает под собой термин.
Как все таки связаны
как ты из (6)Вряд ли там есть оптимизация, это даже не среда разработки...
перевел это в
Можно объяснить, для тупых, как связаны среда разработки и оптимизация байткода?
ты невнимательно читал на что я ответил в (6)
оптимизация может быть не только байт кода а подсказки среды разработки как лучше написать программу представляешь - это тоже оптимизация - среда разработки подсказывает лучшее решение
ты не узнал контекст используемого слова придумал свое и просишь меня дать ответ интересный ход, я не случайно каждый раз тебя возвращаю к теме - уходишь от нее все время ты
даже попробую восстановить ход мыслей чтоб ты не мучался цени
5. Rais96 26.07.19 14:33
(2) Вы смотрели байт-код этой процедуры? В си, компилятор оптимизирует байт-код и независимо как написать в одну или две строки на выходе будет один и тот же код. А программа пишется для программиста и понятнее как раз в две строки.
отвечаю на 5 поправляю что конфигуратор интерпретирует код и написанный в модулях а значит не оптимизирует и далее по тексту - не будет код одинаковым если сначала идет оператор присваиваний а затем вызов процедуры
или сразу вызов процедуры с установленным значением это мог бы сделать компилятор но у нас интерпретатор, байт код для этого смотреть не надо - смотришь средство конфигуратора замер производительности на выполнение присваивания тратится время
не утони в тексте - не уйди опять в сторону
(51)
(52)
(52)
(53)
Бомбануло знатно, лулзов норм прилетело, получил тонну удоволствия от этих брызг эмоций, правда монитор мне забрызгал с обратной стороны, как его теперь оттирать хз.
(53)
Что случилось то? Надеюсь с тобой все хорошо. Не переживай так сильно пожалуйста из-за переменной в конфигураторе.Или из-за чего ты там так сильно разволновался. Неважно, просто не переживай )
кстати то что интерпретатор выполняет бесконечные циклы чтоб ты знал это не оптимизация а обработка исключительной ситуации - контролируется команда на повторение не больше Н раз - я не знаю, с разработчиками не спал, это логика , не всем доступно
ты ж не знаешь что такое оптимизация - это выбор лучшего из альтернатив, приводящих к решению.. бесконечный цикл к решению не приводит, это ошибочная ситуация а не вариант оптимизации.. с тобой было бы приятно рассуждать если бы в твоем тексте была бы не вода а вот такие рассуждения.. в прошлом (44) ты старался и мне показалось ты что то понял а тут (48) опять скатился на непонимание
итого кратко простыми словами
человек в 5 говорит какая разница 2 строки или одна конфигуратор оптимизирует
я возражаю говорю у нас интерпретатор и он каждую строку кода выполняет отдельно, оптимизации в виде представления двух строк в одну нет
байт код не смотрим, смотрим замер производительности
тебе кажется что в моих ответах вода потому что ты ждешь что я тебе расскажу про связь среды разработки и оптимизации байт кода... если все еще ждешь прочти 3 предыдущих абзаца повторно
1сников это не волнует...
радуйтесь жизни и не глядите в рот другим...
Вроде, чтобы глядеть в рот, надо впереди стоять. В большом мире считается, что 1Сники стоял позади. Куда им тогда не глядеть? :)
ЗУП 8.3.15.1489 не современная... Присвоение значения параметра выглядит примерно так:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
НашПараметр = Справочники.ПодразделенияОрганизаций.НайтиПоКоду("9999")
Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;
Параметры.УстановитьЗначениеПараметра("Подразделение", НашПараметр);
КонецПроцедурыМало адептов ЗУП, никто не заметил. Можно еще посмотреть версию БСП командой
СтандартныеПодсистемыСервер.ВерсияБиблиотеки();
?
Во всех отчетах используют Параметры.УстановитьЗначениеПараметра, или исключительный отчет ?
3.0.1.440
В типовых отчетах для каждого параметра используется примерно такой код:
ПараметрДанных = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("НачалоПериода");
ПараметрДанных.Значение = ПериодНастройкаПользовательская.Значение.ДатаНачала;
ПараметрДанных.Использование = Истина;
Мы для себя решили, что в самописных отчетах будем получать все параметры данных и уже с этим работать
В БСП имеется функционал:
НастройкиОтчета.ОпределитьНастройкиФормы = Истина; (необходимо в модуле менеджера отчета или общего модуля описать)
потом в модуле объекта Отчета уже прописать установку таких параметров.
// Настройки общей формы отчета подсистемы "Варианты отчетов".
//
// Параметры:
// Форма - УправляемаяФорма, Неопределено - Форма отчета или форма настроек отчета.
// Неопределено когда вызов без контекста.
// КлючВарианта - Строка, Неопределено - Имя предопределенного
// или уникальный идентификатор пользовательского варианта отчета.
// Неопределено когда вызов без контекста.
// Настройки - Структура - см. возвращаемое значение
// ОтчетыКлиентСервер.ПолучитьНастройкиОтчетаПоУмолчанию().
//
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.События.ПриОпределенииПараметровВыбора = Истина;
КонецПроцедуры
// Вызывается в форме отчета перед выводом настройки.
// Подробнее - см. ОтчетыПереопределяемый.ПриОпределенииПараметровВыбора().
//
Процедура ПриОпределенииПараметровВыбора(Форма, СвойстваНастройки) Экспорт
Параметры = Форма.Параметры;
Если Параметры.Свойство("ПараметрКоманды") Тогда
Если Параметры.Свойство("ОписаниеКоманды")
И Параметры.ОписаниеКоманды.Свойство("ДополнительныеПараметры") Тогда
Если СвойстваНастройки.Тип = "ЗначениеПараметраНастроек"
И СвойстваНастройки.ПолеКД = Новый ПолеКомпоновкиДанных("ПараметрыДанных.Номера")
И Параметры.ОписаниеКоманды.ДополнительныеПараметры.ИмяКоманды = "СОтборомПоНомерам" Тогда
Список = ПолучитьСписокНомерИзТабличнойЧасти(Параметры.ПараметрКоманды);
СвойстваНастройки.ПользовательскаяНастройкаКД.Значение = Список;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
ПоказатьМожет кому пригодится...
Фразу "...что можно сделать ? - Все.." я написал с долей иронии.
Как я понимаю, открытие отчета происходит раньше формирования, раньше события "ПриКомпоновке..."
Кстати, я следующую статью уже заготовил, там будет про ОпределитьНастройкиФормы.
В любом случае, спасибо за отзыв, может кому пригодится.
Я только хотел чтобы Вы обратили внимание именно на БСП. Там много фичей при получении настроек Вне формы (основной) эта форма переопределяется. И вот здесь нам разработчики немножко оставили поле для деятельности.
Откуда Вы узнали про мой склероз ?
Не помню, чтобы я про это кому-то рассказывал....
есть форма документа - счет на оплату поставщика
вызывается внешний отчет СКД
сформированные данные надо записать в документ откуда вызывался отчет
&НаСервере
Функция ПолучитьПользовательскиеНастройки(ВнешнийОтчетОбработкаДляОткрытияСсылка);
КомпоновщикНастроек=ДополнительныеОтчетыИОбработкиВызовСерве ра.ОбъектВнешнейОбработки(ВнешнийОтчетОбработкаДляОткрытияСсылка).КомпоновщикНастроек;
Настройки=КомпоновщикНастроек.ПолучитьНастройки();
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода",НачалоГода(ТекущаяДата()));
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода",КонецДня(ТекущаяДата()));
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Ссылка",объект);
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
Возврат КомпоновщикНастроек.ПользовательскиеНастройки;
КонецФункции
Показатьв модуле объекта отчета
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
ПараметрыДанных = Настройки.ПараметрыДанных;
Регистратор = ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Проба")).Значение;
ссылка = ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ссылка")).Значение;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки, , , Ложь);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
если Регистратор = Истина тогда
ДокОб = ДанныеФормыВЗначение(ссылка,Тип("ДокументОбъект.Счетнаоплатупоставщика"));
ну и далее обработка..
конецесли;
Показатьэтот вариант работает но настройки недоступны потому что форма настроек не понимает
что такое ссылка
поэтому пытаюсь получить владельцаформы.объект
в форме отчета
&НаКлиенте
Процедура СН_ПриОткрытииПосле(Отказ)
Сообщить(ВладелецФормы.Объект);
ПриОткрытииНаСервере(ВладелецФормы.Объект);
КонецПроцедуры
&НаСервере
Процедура ПриОткрытииНаСервере(Знач Об1)
ДокОб = ДанныеФормыВЗначение(Об1,Тип("ДокументОбъект.Счетнаоплатупоставщика"));
Сообщить(ДокОб);
КонецПроцедуры
ПоказатьВопрос каким образом передать владельцаформы.объект в процедуру ПриКомпоновкеРезультата????????
вопрос не по теме, но попробую ответить.
Чтобы из внешней обработки изменять документ, лучше воспользоваться типовым механизмом БСП "Обработки табличных частей", например
посчитали посмотрели записали в документ
вот вроде и все ....
Если вы не хотите пользоваться БСП - при открытии формы обработки сохраняйте значение ВладелецФормы.Объект в реквизит объекта-обработки. При компоновке читайте ее оттуда.
У нас получается уже полноценная консультация. ((
А вот как подпихнуть внешний набор данных, не заменяя весь стандартный механизм, так и непонятно(
Как ответ на Ваш вопрос, добавил пункт 9.
СтандартнаяОбработка = Истина, дополнительная обработка данных.
Да - с этим кодом можно постобработку полученного документа сделать, но при этом отчет формируется явно.
Были надежды, что эту функцию вызовет собственно фоновое задание, но увы - 1С не может сделать удобно.
Чтобы оно не печатало а отдавало мне ТЗ и ВСЁ!!!
Пояснюсь: Есть очень сложный отчет
К нему надо прилепить отчет попроще, чтобы они выдавали результат в один табдок
Структуры выходные похожи
попробовал по феншую, понял что БЕСПОЛЕЗНЯК!!! там такие дебри... я скд вообще не знаю, это реально необоримо!!!!!!! наинавороченнейший отчет с макетами вложенными схемами кучей наборов данных...
Хочу: Чтобы отработала одна схема (с параметрами на форме как будто бы ты просто делаешь отчет выбираешь кучу параметров на форме)
Формируешь. Но отчет чтобы НЕ ФОРМИРОВАЛСЯ на экран, а скидывался в ТЗ
Потом то же самое сделать со второй схемой(как - то передать параметры, выбранные в первой схеме, во вторую), получить вторую ТЗ, потом просто по колхозному в коде слить эти 2 таблицы (или запросом к этим 2 таблицам с соединением, не суть, дело техники). ГЛАВНОЕ - получить 2 ТЗ и запретить вывод результата на экран для этих двух схем, а чтобы просто отдали мне две таблицы значений. Такое возможно?
Заранее благодарен
Все мои сертификаты 1С:Специалист от 2000 года по 1С 7.7,
Поэтому мне тоже было трудно приспособиться к новшествам 1С 8.
Но оно того стоило, рекомендую.
Для вывода в таблицу значений посмотрите примеры кода 1С со словом
ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений
Добавил несколько отборов по пункту 4.
Как их объединить в группу ИЛИ?
Посмотрите в процедуре при создании отбора, как указать родитель.
Если стандартной возможности нет - напишите свою процедуру.
НастройкиНовые = КомпоновщикНастроек.ПолучитьНастройки();
НастройкиНовые.Отбор.Элементы.Очистить();
ГруппаЭлементовОтбора = НастройкиНовые.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаЭлементовОтбора.Использование = Истина;
ГруппаЭлементовОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
ГруппаЭлементовОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
Запрос = Новый Запрос;
Запрос.Текст = "";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ПодгруппаЭлементовОтбора = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ПодгруппаЭлементовОтбора.Использование = Истина;
ПодгруппаЭлементовОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
ЭлементОтбора = ПодгруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Выборка.Организация;
ЭлементОтбора = ПодгруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Подразделение");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
ЭлементОтбора.ПравоеЗначение = Выборка.Подразделение;
КонецЦикла;
КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиНовые);
ПоказатьВы всегда так внимательно читаете или конкретно этот фрагмент чем-то зацепил ?
Ищем, заменяем на шапку таблицы, добавляем строки и по диапазону конвертируем в таблицу.
В документе word добавить строку *таблицапомещения* и *Арендатор*
ОбъектПриложение = ПолучитьCOMОбъект("d:\test\test.docx");
ОбъектПриложение.Application.Visible = 1;
WordApp = ОбъектПриложение.Application;
Doc = ОбъектПриложение.Application.Documents(1);
Doc.Activate();
// Тут можно в цикле искать переменные на замену
Doc.Content.Find.Execute("*Арендатор*",,,,,,,,,"Рога и копыта",2);
// Таблица
Text = WordApp.Application.Selection;
//Text.Find.Text="*таблицапомещения*";
Text.Find.Execute("*таблицапомещения*",,,,,,,,,"Помещение*Корпус*Этаж*Характеристика");
НачалоДиапазонаТаблицы = Text.Range.Start;
//Табл= Word.Selection.Range;
ТаблицаВставка = Text.Range;
ТаблицаВставка.InsertParagraphAfter();
ТаблицаВставка.InsertAfter("2341*1*2*Врагу не пожелаешь");
ТаблицаВставка.InsertParagraphAfter();
ТаблицаВставка.InsertAfter("1253*1*3*Чистилище");
ТаблицаВставка.InsertParagraphAfter();
ТаблицаВставка.Start = НачалоДиапазонаТаблицы;
ТаблицаВставка.ConvertToTable("*");
//Рамки таблицы
Doc.Tables(1).Borders(1).LineStyle = WordApp.Options.DefaultBorderLineStyle;
Doc.Tables(1).Borders(1).LineWidth = WordApp.Options.DefaultBorderLineWidth;
Doc.Tables(1).Borders(1).Color = WordApp.Options.DefaultBorderColor;
Doc.Tables(1).Borders(2).LineStyle = WordApp.Options.DefaultBorderLineStyle;
Doc.Tables(1).Borders(2).LineWidth = WordApp.Options.DefaultBorderLineWidth;
Doc.Tables(1).Borders(2).Color = WordApp.Options.DefaultBorderColor;
Doc.Tables(1).Borders(3).LineStyle = WordApp.Options.DefaultBorderLineStyle;
Doc.Tables(1).Borders(3).LineWidth = WordApp.Options.DefaultBorderLineWidth;
Doc.Tables(1).Borders(3).Color = WordApp.Options.DefaultBorderColor;
Doc.Tables(1).Borders(4).LineStyle = WordApp.Options.DefaultBorderLineStyle;
Doc.Tables(1).Borders(4).LineWidth = WordApp.Options.DefaultBorderLineWidth;
Doc.Tables(1).Borders(4).Color = WordApp.Options.DefaultBorderColor;
Doc.Tables(1).Borders(5).LineStyle = WordApp.Options.DefaultBorderLineStyle;
Doc.Tables(1).Borders(5).LineWidth = WordApp.Options.DefaultBorderLineWidth;
Doc.Tables(1).Borders(5).Color = WordApp.Options.DefaultBorderColor;
Doc.Tables(1).Borders(6).LineStyle = WordApp.Options.DefaultBorderLineStyle;
Doc.Tables(1).Borders(6).LineWidth = WordApp.Options.DefaultBorderLineWidth;
Doc.Tables(1).Borders(6).Color = WordApp.Options.DefaultBorderColor;
//Таблица по ширине листа
ТаблицаВставка.Tables(1).AutoFitBehavior (2);
//Обновить документ
Doc.Fields.Update(); ПоказатьВы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 1098946
Создание 26.07.19 12:31
Обновление 15.12.25 14:16
Просмотры 159949
Загрузки 81
Рейтинг
633
Комментарии 83
Код открыт Да
Рубрики СКД
Кому Разработчик
Тип файла Внешний отчет (ert,erf)
Платформа 1С:Предприятие 8
Конфигурация Универсальные
Операционная система Windows
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)