Версия для печати темы (https://pro1c.org.ua/index.php?s=0b3d67903a320aaa1ccf32c1f9d349af&showtopic=60305)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Задать свой период отчета в СКД

Автор: Gigi 16.07.20, 10:01

Всем привет!
Давно не нуждался в помощи, но к сожалению опять приходится
Короче что требуется ... сущий пустяк, который на удивление стал целой проблемой с которой уже, с этими бесконечными методами тыка, уже второй день вожусь, и трачу кучу времени. Тогда как изначально думал, что вопрос слишком простой что бы он превращался в целую проблему и что бы вообще возникла сама надобность выходить на форум. Но видимо без этого никак не получается. Ладно ... так и быть...
Так вот, что нужно... нужно в созданную форму отчета СКД вставить любую свою дату. И сделать это программно (т.е. не интерактивным, а кодовым способом).
Вот что нужно...
Казалось бы сущий пустяк ... Просто ерунда ...но дорогие друзья ... честно говорю ... осточертело уже ... вожусь с этой чепухой ... то так, то сяк ... ну никак не хочет система подчиниться.
А все что нужно это просто вставить эту несчастную указанную дату в это несчастное поле даты на форме. Всего лишь и больше НИЧЕГО!
Т.е. Допустим в метаданных: "Отчеты", мы создали: "Отчет1". Потом определили выгрузку данных: "ОсновнаяСхемаКомпоновкиДанных". А потом создали форму "отчета1".
И вот тут нужно что бы при открытии формы, или при изменении какого-нибудь реквизита отчета в поля: "НачалоПериода", "КонецПериода" вставлялась и отображалась своя дата.
Вот что нужно.
Вот пример кода, где взяты условные значения дат:

&НаКлиенте
Процедура ГодПриИзменении(Элемент)
ПараметрыДанных_Заполнить('00010101',ТекущаяДата());
КонецПроцедуры
&НаКлиенте
Процедура МесяцПриИзменении(Элемент)
ПараметрыДанных_Заполнить('00010101',ТекущаяДата());    
КонецПроцедуры
&НаКлиенте
Процедура ПараметрыДанных_Заполнить(ДатаНачало,ДатаКонец)
КомпоновщикНастроек = Отчет.КомпоновщикНастроек;
ПараметрСКД = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("КонецПериода");
ПараметрСКД.Использование = Истина;
ПараметрСКД.Значение = ДатаКонец;
ПараметрСКД2 = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("НачалоПериода");
ПараметрСКД2.Использование = Истина;
ПараметрСКД2.Значение = ДатаНачало; //Сообщить(ПараметрСКД.Значение);
//Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(..);
КонецПроцедуры

Короче ... дорогие друзья ... никак че то не выходит. При изменении на пример реквизита "Год" или "Месяц" в открытой форме НИЧЕГО НЕ ПРОИСХОДИТ! Абсолютно!
Буду признателен!

Автор: pablo 16.07.20, 14:05

Для программного заполнения параметров СКД используйте обработчик события ПриКомпоновкеРезультата модуля отчета

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
        ТекНастройки=КомпоновщикНастроек.ПолучитьНастройки();
    ТекНастройки.ПараметрыДанных.УстановитьЗначениеПараметра("Дата",ТекущаяДата());
    КомпоновщикНастроек.ЗагрузитьНастройки(ТекНастройки);
КонецПроцедуры

Автор: TohaMonster 16.07.20, 14:29

Цитата(Gigi @ 16.07.20, 11:01) *
А все что нужно это просто вставить эту несчастную указанную дату в это несчастное поле даты на форме.

Немного запутанно. Уточните пожалуйста, Вы хотите изменить дату на форме, чтобы она попала в Параметр СКД?
Тогда, вроде, в ПараметрыДанных_Заполнить() всё чотко, должно сработать. Естественно, когда Вы нажмете "Сформировать"

Что у Вас должно происходить в ГодПриИзменении() и МесяцПриИзменении(), не совсем понятно. Почему-то Вы передаете в правильную процедуру ПараметрыДанных_Заполнить() все время одинаковый интервал: с начала веков по текущую дату. Возможно, там имеется в виду что-то вроде
&НаКлиенте
Процедура ГодПриИзменении(Элемент)
ДатаСКоторойПолучаемОтчет = Дата(РеквизитГодНаФорме, РеквизитМесяцНаФорме, 1);
ПараметрыДанных_Заполнить(ДатаСКоторойПолучаемОтчет, ТекущаяДата());
КонецПроцедуры


Автор: Gigi 16.07.20, 17:47

TohaMonster @ Сегодня, 14:29 * ,
Гуу ... хоть что-то в ответ..

Цитата(TohaMonster @ 16.07.20, 14:29) *
все время одинаковый интервал: с начала веков по текущую дату. Возможно, там имеется в виду что-то вроде

Да нет ... я там просто чисто условно указал даты... да хоть какие ... это для теста. А что касается того, какими датами должны заполняться параметры: начала/конец периода то суть в следующем...
Дело в том, у нас все отчеты... акты,счета и т.д. оформляются в месяц раз... и статистика тоже нужна за один месяц или год.
А в отчетах СКД по стандарту для этого постоянно нужно указывать дату на пример: с 01.07.2020 по 01.08.2020 а это не очень удобно... ну не знаю .. лично мне не удобно ковырять и выбирать дату, тогда как всегда нужно с 01... по 01.
Поэтому в чем идея... создать доп реквизиты в отчете СКД: "Отчет.Год" и "Отчет.Месяц". Типы которых СправочникСсылка.Год и ПеречислениеСсылка.Месяц.
И что нужно в конечном счете ... при изменении года или месяца дата будет вставляться с 01 ... по 01... в зависимости от того какой указан год/месяц.
Как это сделать это не вопрос... Вопрос в том, что в интеракивном режиме при изменении года или месяца в поля Начало-Конец периода не вставляется вообще ничего.
Не смотря на то что РУССКИМ КОДОВЫМ ЯЗЫКОМ написано что должно быть отображено..
Вот в чем проблема ..

pablo @ Сегодня, 14:05 * ,
Цитата(pablo @ 16.07.20, 14:05) *
Для программного заполнения параметров СКД используйте обработчик события ПриКомпоновкеРезультата модуля отчета

Стоп .. пардон.... упустил ... нужно протестить то что рекомендует автор этого поста... ладно проверю ...

Gigi @ Сегодня, 16:27 * ,
Только что пробовал так ...
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;    
ТекНастройки=КомпоновщикНастроек.ПолучитьНастройки();
ТекНастройки.ПараметрыДанных.УстановитьЗначениеПараметра("Дата",ТекущаяДата()); // Условно взята
ТекНастройки.ПараметрыДанных.УстановитьЗначениеПараметра("ДатаНачала",ТекущаяДата());    // Условно взята
ТекНастройки.ПараметрыДанных.УстановитьЗначениеПараметра("ДатаОкончания",ТекущаяДата());     // Условно взята
КомпоновщикНастроек.ЗагрузитьНастройки(ТекНастройки);
КонецПроцедуры

хотя это не совсем то что нужно... так как это не модуль отчета, а модуль объекта отчета... но при нажатии на кнопку "Сформировать" ошибка...


Цитата(Gigi @ 16.07.20, 16:57) *
так как это не модуль отчета, а модуль объекта отчета.

Тьфу ты ... не модуль формы, а модуль отчета...
Просто ... дорогие друзья ... я могу конечно создать отчет и в нем и вовсе не создавать СКД и обойтись без него. А вместо этого создать произвольную форму отчета и там делать что угодно и как угодно оперируя с регом накопления по командам оборотов. Но это ведь нужно повозиться... создавать макет ... потом писать код заполнения в макет... Не охота на это тратить время. Проще воспользоваться СКД .. там все в готовом виде. Единственное что нужно как говорил это вставлять даты промежутков в зависимости от указанного на форме года и месяца... с 01... по 01. Вот что нужно. А в остальном все устраивает. СКД это ведь слишком удобно что бы программист не пользоваться им.
Вот собственно и весь вопрос..

Автор: pablo 17.07.20, 9:05

СтандартнаяОбработка=Ложь;
-лишнее.


Если Вам нужно в модуле объекта отчета получать данные с формы - добавьте пару реквизитов отчета. Эти реквизиты можно заполнять на форме и они будут доступны в модуле объекта.

Автор: Gigi 17.07.20, 9:24

Цитата(pablo @ 17.07.20, 9:05) *
Эти реквизиты можно заполнять на форме и они будут доступны в модуле объекта

Ну эт понято... знаю... и заполонять то можно, но все равно ничего не выходит.... как с сервера(в модуле отчета), так и с клиента(в модуле формы отчета).
А если говорить о модуле отчета то, после кнопки "Сформировать" ВЫДАЕТ ОШИБКУ:на этой линии:
ТекНастройки.ПараметрыДанных.УстановитьЗначениеПараметра("Дата",ТекущаяДата()); // Условно взята

И пишет:
Цитата
Ошибка исполнения отчета
по причине:
Ошибка при выполнении обработчика - 'ПриКомпоновкеРезультата'
по причине:
{Отчет.Накопление_ЮрЛица_НачисленоОплачено_НаПериод.МодульОбъекта(5)}: Ошибка при вызове метода контекста (УстановитьЗначениеПараметра)
ТекНастройки.ПараметрыДанных.УстановитьЗначениеПараметра("Дата",ТекущаяДата()); // Условно взята
по причине:
Параметр с указанным именем не найден

Короче и так тоже че то не работает. Не выезжаю почему ...

Автор: pablo 17.07.20, 9:30


А какие у Вас есть параметры в СКД?

Автор: Gigi 17.07.20, 9:52

pablo @ Сегодня, 9:30 * ,

Цитата(pablo @ 17.07.20, 9:30) *
А какие у Вас есть параметры в СКД?

Обычные ... ничего особенного ...
1. Запрос выгрузки с рега накопления
2. Определение нужных столбцов отображения в таб.доке СКД
3. Определение даты промежутка
Короче все как обычно.

Автор: sava1 17.07.20, 10:05

Параметры - это то, что во вкладке Параметры схемы СКД

Автор: Gigi 17.07.20, 10:34

sava1 @ Сегодня, 10:05 * ,

Цитата(sava1 @ 17.07.20, 10:05) *
Параметры - это то, что во вкладке Параметры схемы СКД

Вы имеете ввиду эту вкладку?


 ! 

https://pro1c.org.ua/index.php?act=announce&id=2: 8
 

Автор: sava1 17.07.20, 11:25

Цитата(Gigi @ 17.07.20, 10:24) *
ТекНастройки.ПараметрыДанных.УстановитьЗначениеПараметра("Дата",ТекущаяДата()); // Условно взята


ТекНастройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода",ТекущаяДата()); // Условно взята
ТекНастройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода",ТекущаяДата()); // Условно взята

Автор: Gigi 17.07.20, 13:43

sava1 @ Сегодня, 11:25 * ,

Цитата(sava1 @ 17.07.20, 11:25) *
ТекНастройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода",ТекущаяДата()); // Условно взята
ТекНастройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода",ТекущаяДата()); // Условно взята

Отлично! Работает! Как сам не догнал ... то что ошибка возникала из-за не правильного указания реквизитов дат.
Просто я как то смотрел реквизиты на форме Отче.ПараметрыДанных, а там обнаружил "Дата", "ДатаНачала","ДатаОкончания" это меня запутало. Слишком многими другими задачами голова лопается.
Оказывается нужно так как указано в параметрах СКД: "НачалоПериода","КонецПериода"... Вот как..
И вообще с СКД не очень дружил и практический не пользовался ... это что бы было больше свободы и меньше разных ограничений стандарта... вот почему. И тольо недавно решил пользоваться возможностями СКД. При условии что это не сильно ограничит свободу действий.
Но представленное решение вопроса через модуль отчета конечно не на все сто устраивает,
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
//СтандартнаяОбработка=Ложь;    
ТекНастройки=КомпоновщикНастроек.ПолучитьНастройки();
ТекНастройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода",ТекущаяДата()); // Условно взята
ТекНастройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода",ТекущаяДата()); // Условно взята
КомпоновщикНастроек.ЗагрузитьНастройки(ТекНастройки);
КонецПроцедуры

Больше устраивало бы с клиента (в модуле формы).
Но ладно... путь хотя бы так ...по кр. мере, это лучше чем ничего
За что огромное Вам спасибо дорогие друзья!
Ладно! Вопрос решен и тема думаю закрыта!
Спасибо!

Автор: Gigi 17.07.20, 15:03

Цитата(Gigi @ 17.07.20, 13:43) *
Больше устраивало бы с клиента (в модуле формы).

Пардон! Только что прописал все что требовалось... и вообще что касается параметров СКД НачалоПериода/КонецПериода эти поля и вовсе скрыл на форме....Ну имею ввиду: Элементы.КомпоновщикНастроекПользовательскиеНастройки ...
А потом создал уже свои реквизиты в отчете: Отчет.ДатаНачало,Отчет.ДатаКонец,Отчет.Год,Отчет.Месяц и еще числовой тип Отчет.ПараметрыОтчетногоПериода с переключением уже на форме: "Отчетный месяц", "Отчетный год" и "По промежутку дат". При чем если галка стоит на первом то на форме видимы только Отчет.Год,Отчет.Месяц; если на втором то только Отчет.Год; а если на третьем то Отчет.ДатаНачало, Отчет.ДатаКонец.
При этом при изменении года месяца , равно как и опции "ПараметрыОтчетногоПериода " в полях: Отчет.ДатаНачало, Отчет.ДатаКонец автоматический вставляются нужный промежуток.
А все остальное согласно предложенному тут решению... Вот как:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)    
ТекНастройки=КомпоновщикНастроек.ПолучитьНастройки();
ТекНастройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода",ЭтотОбъект.ДатаНачало);
ТекНастройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода",ЭтотОбъект.ДатаКонец);
КомпоновщикНастроек.ЗагрузитьНастройки(ТекНастройки);
КонецПроцедуры

Именно поэтому
Цитата(Gigi @ 17.07.20, 13:43) *
Но представленное решение вопроса через модуль отчета конечно не на все сто устраивает,

Пардон! Уже не так когда включил все поставленные задачи. Беру свои слова обратно!
Очень устраивает... на все сто. Главное то что отвечает всем требованиям поставленных задач.
Ладно! Еще раз огромное спасибо!

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua