Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 сен 2024, 03:17

Регистр сведений срезпоследних

Автор GShutter, 20 авг 2015, 23:02

0 Пользователей и 1 гость просматривают эту тему.

GShutter

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

GShutter

Цитата: GShutter от 20 авг 2015, 23:02
Здравствуйте, подскажите пожалуйста, у меня есть документ в котором я обновляю принтера в там вносятся Дата и принтер, эти данные с проведением я передаю в регистр сведений, проблема в том что в регистре сохраняются дубли ( один и тот же принтер но с разным временем) а мне для дальнейшей работы необходимо смотреть на последнюю дату относительно каждого принтера, как я уже понял мне необходимо прописать срезпоследних по дате, но я с этим очень сильно запутался где прописать и как, дальнейшую работу с регистром я планирую использовать в форме документа( там я реализовал кнопку заполнения которая мне выбирает принтера которые необходимо обновить, но для этого нужны последние даты по принтерам а не как у меня все и дубли в том числе), я смотрел описания срезапоследних на многих сайтах, но все равно не могу понять как описать его.
Пытался сделать так
Выборка = РегистрыСведений.ДатаСменыКатриджей.СрезПоследних(ТекущаяДата(),);
Для каждого Стр Из Выборка Цикл
Сообщить(Строка(Стр.Принтер));
КонецЦикла;
ничего не получается, скорее всего то что написал по коду полный бред, но я пытаюсь, подскажите пожалуйста

Я немного продвинулся и сделал запрос но он не делает отбор последних 
Запрос = Новый Запрос(
"ВЫБРАТЬ
|   ДатаСменыКатриджейСрезПоследних.Принтер КАК Принтер,
|   ДатаСменыКатриджейСрезПоследних.Дата
|ИЗ
|   РегистрСведений.ДатаСменыКатриджей.СрезПоследних(&Дата,) КАК ДатаСменыКатриджейСрезПоследних
|
|СГРУППИРОВАТЬ ПО
|   ДатаСменыКатриджейСрезПоследних.Принтер,
|   ДатаСменыКатриджейСрезПоследних.Дата");
Запрос.УстановитьПараметр("Дата", ТекущаяДата());
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
   
   Сообщить(Выборка.Принтер);
   
КонецЦикла;

Подскажите пожалуйста где я тут накосячил, почему выдает все принтера а не только последние

vitasw

А что такое "последний" принтер?
Периодический регистр сведений позволяет хранить ресурсы в разрезе измерений по датам.

pavl_vs

GShutter, особого косяка в последнем варианте запроса нет - Вы продвинулись в правильном направлении и результат по запросу.

Если Вы полагаете, что в результате запроса в списке должен "светиться" только принтер №5,
то должно быть дополнительное условие на ПУСТУЮ дату, которое обычно записывается в конструкции "ГДЕ".

Если я неправильно понял, то опишите, что бы Вы хотели увидеть в результате запроса и обязательно в связке с приведенной картинкой.

GShutter

Цитата: pavl_vs от 21 авг 2015, 13:26
GShutter, особого косяка в последнем варианте запроса нет - Вы продвинулись в правильном направлении и результат по запросу.

Если Вы полагаете, что в результате запроса в списке должен "светиться" только принтер №5,
то должно быть дополнительное условие на ПУСТУЮ дату, которое обычно записывается в конструкции "ГДЕ".

Если я неправильно понял, то опишите, что бы Вы хотели увидеть в результате запроса и обязательно в связке с приведенной картинкой.

Я бы хотел увидеть, если взять ту картинку, в результате запроса след каждый тип принтера в одном экземпляре с последней датой ( то что у 5 принтер нету даты то мой косяк на самом деле там есть дата), примерно вот так :
1 Принтер 20.08.2015
5 Принтер 17.08.2015( то что на картинки нету даты мой косяк, там есть дата)
9 Принтер 18.08.2015
10 Принтер 16.08.2015

Вот такой вариант результата запроса для меня был бы идеален к нему я стремлюсь и уже многое перепробовал, но так ничего и не выходит, разве что если я беру в запросе просто измерение Принтер то выдает действительно 1,5,9,10 но я не могу обратиться к дате данных принтеров (поэтому данное решение теряет свой смысл). Если у кого есть идеи я рад буду услышать, я пытался убрать измерение Дата и использовать Период, но результат такой же как в запросе с датой

pavl_vs

GShutter, тогда "СрезПоследних" не нужен;
Вам нужно ВЫБРАТЬ РАЗЛИЧНЫЕ с использованием функции МАКСИМУМ(...ДатаСменыКатриджей.Дата).

GShutter

Цитата: pavl_vs от 21 авг 2015, 23:29
GShutter, тогда "СрезПоследних" не нужен;
Вам нужно ВЫБРАТЬ РАЗЛИЧНЫЕ с использованием функции МАКСИМУМ(...ДатаСменыКатриджей.Дата).
Ты просто человечище, мозг, бог, просто красавчик,спасибо огромное, я столько промучился и вот все получилось,СПАСИБО!!!
Добавлено: 22 авг 2015, 03:49


Обрадовался, но поспешил , столкнулся с проблемой которую раньше уже встречал но так и не решил(только хитро обходил сейчас это не выйдет). При записи(программно) в табличную часть значений(документа) с регистра сведений данные переносятся на ура, а вот при попытке перенести данные со справочника никак (пытался и ссылку и значение передать), у ячейки табличной части тип: СправочникСсылка.Принтера, в итоге выходит такой бред как на картинке, подскажите пожалуйста как можно данные справочника точнее данные тойже ячейки что и привязана к табличной части передать в нее программно( у меня просто стоит отбор).Спасибо большое если кто то подскажет.(в прошлый раз с такой проблемой, я просто изменил тип ячейки на строку это позволила мне вставлять программно, сейчас так сделать не могу). 

pavl_vs

GShutter, с таким описанием последней проблемы мучения Вам гарантированы.

Кто-то из здешних классиков сказал: правильно заданный вопрос - содержит половину ответа; и он прав!
Вы еще раз почитайте, что Вы написали. Вы поняли? Или это только моя проблема, но я конкретно ничего не понял.

Попробуйте так:
- источник данных (желательна картинка); справочник (его структура)?
- приемник данных (желательна картинка); документ (структура ТЧ)?
- собственно данные;
- как пытались передать (фрагмент кода); результат похоже уже показали.


GShutter

Цитата: pavl_vs от 22 авг 2015, 18:22
GShutter, с таким описанием последней проблемы мучения Вам гарантированы.

Кто-то из здешних классиков сказал: правильно заданный вопрос - содержит половину ответа; и он прав!
Вы еще раз почитайте, что Вы написали. Вы поняли? Или это только моя проблема, но я конкретно ничего не понял.

Попробуйте так:
- источник данных (желательна картинка); справочник (его структура)?
- приемник данных (желательна картинка); документ (структура ТЧ)?
- собственно данные;
- как пытались передать (фрагмент кода); результат похоже уже показали.
1 Рисунок это мой справочник, 2 Рисунок это мой документ, 3 рисунок это заполнение документа после выполнения кода который я сейчас вставлю:

Запрос = Новый Запрос(
"ВЫБРАТЬ
|   ДатаСменыКатриджейСрезПоследних.Принтер КАК Принтер,
|   МАКСИМУМ(ДатаСменыКатриджейСрезПоследних.Дата) КАК Дата
|ИЗ
|   РегистрСведений.ДатаСменыКатриджей.СрезПоследних(&Дата, ) КАК ДатаСменыКатриджейСрезПоследних
|
|СГРУППИРОВАТЬ ПО
|   ДатаСменыКатриджейСрезПоследних.Принтер");
Запрос.УстановитьПараметр("Дата", ТекущаяДата());
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Количество1 = 0;
Количество = 0;
ВыбСправочник = Справочники.Принтеры.Выбрать();
Пока ВыбСправочник.Следующий() Цикл
    Пока Выборка.Следующий() Цикл
      Если СокрЛП(ВРег(ВыбСправочник.Наименование)) = СокрЛП(ВРег(Выборка.Принтер)) Тогда
         ДСК = День(ТекущаяДата()) - День(Выборка.Дата);
         Если ДСК >= ВыбСправочник.КоличествоДнейДоСмены Тогда
         НоваяСтрока = Объект.СписокПринтеров.Добавить();
         НоваяСтрока.Принтер = Выборка.Принтер;
            КонецЕсли;
      Иначе
         Количество = Количество + 1;
      КонецЕсли;
      Количество1 = Количество1 + 1;
   КонецЦикла;
   Если Количество = Количество1 Тогда
     НоваяСтрока = Объект.СписокПринтеров.Добавить();
     НоваяСтрока.Принтер = ВыбСправочник.Наименование;
   КонецЕсли;
   Выборка.Сбросить();
   Количество = 0;
   Количество1 = 0;
КонецЦикла;

Логика данного кода такова, если Принтер есть в регистре то с ним работаю по условию, если его нету(все принтера описаны в справочнике, сравниваю наличие принтеров в регистре относительно справочника) то его надо внести в табличную часть документа ( собственно с этим у меня и проблема).
Добавлено: 23 авг 2015, 04:07


Поспешил я конечно с вопросом, спасибо огромное за внимание, у меня все получилось ( я дольше составлял вопрос) ответ на мой вопрос крайне прост, ну я надеюсь хоть вопрос задал верно и всем все понятно стало. Ответ был прост мне надо было передать ВыбСправочник.Ссылка;(а я пытался передавать ВыбСправочник.Ссылка.Наименование, у меня не получалось и я решил спросить у вас, а надо было просто дольше посидеть). Огромное спасибо за внимание, и прошу прощение за потраченное на меня время.
Добавлено: 23 авг 2015, 04:12


Я решил свой вопрос( если честно потратил больше времени на написания вопроса и жалею об этом), огромное спасибо за внимание, и прошу прощение за последний вопрос.(ответ там выходит очень банальный, надеюсь я хоть его внятно составил во второй раз)

pavl_vs

Цитата: GShutter от 23 авг 2015, 02:53
Я решил свой вопрос( если честно потратил больше времени на написания вопроса и жалею об этом)
Не стоит сожаления - формулирование проблемы для "непонятливых", как правило, логически верно выстраивает собственные мысли и зачастую приводит к самостоятельному решению.

Если в будущем придется представлять программные коды, то заключайте их в теги кода - решетка (#) в панели инструментов, это повысит читаемость кода и избавит читателя от излишнего напряжения.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск