Автор Тема: Билет 2. Спец по платформе V8  (Прочитано 136696 раз)

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

unf13

  • Пользователь
  • **
  • Сообщений: 23
  • ФИО: unf13
Re: Билет 2. Спец по платформе V8
« Ответ #45 : Октябрь 21, 2015, 03:29:51 pm »
Да нет, ну как же. Я делаю внутренне соединение с условием что период старше даты начала периода действия строки(это уже ограничение), и беру максимально близкое значение с моему интервалу агрегирующей функцией. Я же никак не ограничу более, т.к. не знаю как давно было последнее изменение оклада.


По-хорошему тут надо определять самую раннюю и самую позднюю дату из табличной части документа, а потом получать сведения об окладах, объединив данные из среза последних на самую раннюю дату с обращением к физической таблице РС в интервале между самой ранней и самой поздней датой . Тогда на РС будет наложено полноценное ограничение по отбору записей. А так получается нарастающий итог своеобразный,чем больше записей в регистре, тем больше со временем их будет отбираться до даты, меньшей даты начала.
« Последнее редактирование: Октябрь 21, 2015, 03:36:49 pm от unf13 »

HRom

  • Пользователь
  • **
  • Сообщений: 94
  • ФИО: HRom
Re: Билет 2. Спец по платформе V8
« Ответ #46 : Октябрь 22, 2015, 12:59:04 pm »
По-хорошему тут надо определять самую раннюю и самую позднюю дату из табличной части документа, а потом получать сведения об окладах, объединив данные из среза последних на самую раннюю дату с обращением к физической таблице РС в интервале между самой ранней и самой поздней датой . Тогда на РС будет наложено полноценное ограничение по отбору записей.

ИМХО спорное решение.
Виртуальная таблица этот подзапрос к ВСЕМУ регистру, причем вы его ограничиваете только ДАТАМ!! Т.е. так и так идёт перебор всего регистра с фильтром по датам.


unf13

  • Пользователь
  • **
  • Сообщений: 23
  • ФИО: unf13
Re: Билет 2. Спец по платформе V8
« Ответ #47 : Октябрь 22, 2015, 11:07:32 pm »
По-хорошему тут надо определять самую раннюю и самую позднюю дату из табличной части документа, а потом получать сведения об окладах, объединив данные из среза последних на самую раннюю дату с обращением к физической таблице РС в интервале между самой ранней и самой поздней датой . Тогда на РС будет наложено полноценное ограничение по отбору записей.

ИМХО спорное решение.
Виртуальная таблица этот подзапрос к ВСЕМУ регистру, причем вы его ограничиваете только ДАТАМ!! Т.е. так и так идёт перебор всего регистра с фильтром по датам.

Ну в качестве параметров мы еще передаем список сотрудников (подзапрос ко временной таблице с сотрудниками из тч),по которым нам надо получить значения окладов. Собственно, как и при запросе к реальной таблице следует сделать тоже самое, а не просто вынимать всю таблицу,фильтруя записи только соединением.

HRom

  • Пользователь
  • **
  • Сообщений: 94
  • ФИО: HRom
Re: Билет 2. Спец по платформе V8
« Ответ #48 : Октябрь 23, 2015, 06:33:35 am »

Что скажете про такой вариант решения множественного изменения окладов?

По кнопке "ЗаполнитьЗначенияОкладов" на форме:

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

   
    Выборка = РегистрыСведений.СведенияОСотрудниках.Выбрать(НачалоМесяца(Объект.ПериодРегистрации),ДатаКонцаМесяца,,"Возр"); //,,"Период Возвр"
    Пока Выборка.Следующий() Цикл
        Если Выборка.Период = НачалоМесяца(Объект.ПериодРегистрации) Тогда
         Продолжить;
        КонецЕсли;
        Отбор = Новый Структура();
        Отбор.Вставить("Сотрудник",Выборка.Сотрудник);
        Отбор.Вставить("ДатаОкончания",ДатаКонцаМесяца);
        Строки = ТЗСписокСотрудников.НайтиСтроки(Отбор);
        Если Строки.Количество() > 0 Тогда
            Строки[0].ДатаОкончания = КонецДня(Выборка.Период);
        КонецЕсли;
        НоваяСтрока = ТЗСписокСотрудников.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока,Выборка);
       НоваяСтрока.Размер = Выборка.Оклад;
        НоваяСтрока.ДатаНачала = КонецДня(Выборка.Период)+1;
        НоваяСтрока.ДатаОкончания = ДатаКонцаМесяца;
    КонецЦикла;
    ТЗСписокСотрудников.ЗаполнитьЗначения(ПланыВидовРасчета.ОсновныеНачисления.Оклад,"ВидРасчета");
   
    Объект.ОсновныеНачисления.Загрузить(ТЗСписокСотрудников);
   
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьЗначенияОкладов(Команда)
    ЗаполнитьЗначенияОкладовНаСервере();
КонецПроцедуры

alex44ru

  • Пользователь
  • **
  • Сообщений: 32
  • ФИО: Александр
Re: Билет 2. Спец по платформе V8
« Ответ #49 : Октябрь 23, 2015, 08:11:21 am »
Посмотрел текст билета. Скажите я правильно понимаю условие задачи по ОУ (вот как я бы решал, мой алгоритм):

1)  Создать или отредактировать регистр остатки номенклатуры.
     Измерения: Номенклатура, Партия
     Ресурсы: Количество, Сумма

2) Создать регистр оборотный продажи.
    Измерения: Номенклатура
    Ресурсы: Количество, Продажа
   
Хотя по сути количество в регистр продажи можно было не ставить, а вытащить его из остатков, как Вы думаете? Хотя тут и услуги регистр продаж падают, так что нормально так и должно быть.

3) Проведение по новой методике, вначале записываем расход с ТЧ в регистр остатков, затем проверяем минусовые остатки, если есть выдаем ошибку и сообщение о нехватке товара, есть нет пишем регистр продажи, не пишу все за один раз так как если не хватает то и не чего регистр зря дергать. Блокировку делаю свойством блокировать для изменения = истина.

По отчету пока спрашивать не буду, так как и так много буковок читать Вам придется )

« Последнее редактирование: Октябрь 23, 2015, 08:15:04 am от alex44ru »

alex44ru

  • Пользователь
  • **
  • Сообщений: 32
  • ФИО: Александр
Re: Билет 2. Спец по платформе V8
« Ответ #50 : Октябрь 23, 2015, 09:41:09 am »
Про новую методику проведения сомнительно, т.к. надо сумму себестоимости в движениях проставлять.
прорешал билет по новой методике все отлично, начал делать отчет и о чудо себестоимость по оборотам у меня выпала в минус, думаю что такое сел подумал и понял что я затупил, зашел на форум и мне только осталось подтвердить Ваши слова )))

alex44ru

  • Пользователь
  • **
  • Сообщений: 32
  • ФИО: Александр
Re: Билет 2. Спец по платформе V8
« Ответ #51 : Октябрь 23, 2015, 09:57:24 pm »
Пересмотрел решение. Снова сделал без УФ. Вот пара комметариев.
зачем у тебя в обработке проведения ОУ документа РН берется максимум от вида номенклатуры
ВЫБРАТЬ
        |    РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
        |    МАКСИМУМ(РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНом) КАК ВидНом,
        |    РасходнаяНакладнаяСписокНоменклатуры.Партия,
        |    СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК КолДок,
        |    СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК СумДок
        |ПОМЕСТИТЬ ТЧ
        |ИЗ
        |    Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
        |ГДЕ
        |    РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |    РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
        |    РасходнаяНакладнаяСписокНоменклатуры.Партия
можно в группировку добавить вид номенклатуры
ВЫБРАТЬ
        |    РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
        |    РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНом КАК ВидНом,
        |    РасходнаяНакладнаяСписокНоменклатуры.Партия,
        |    СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК КолДок,
        |    СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК СумДок
        |ПОМЕСТИТЬ ТЧ
        |ИЗ
        |    Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
        |ГДЕ
        |    РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |    РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
        |    РасходнаяНакладнаяСписокНоменклатуры.Партия,
        |    РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНом
Так же можно сделать индексацию по Номенклатуре и Партии для ВТ

Зачем в начале сразу пишешь регистр ?
    Движения.Партии.Очистить();
    Движения.Партии.Записать();
Его имеет смысл писать перед чтением остатков только если документ не новый и проведение оперативное, если не оперативное он остатки на момент времени документа берет не включая
    Движения.Партии.Очистить();
    Если Режим = РежимПроведенияДокумента.Оперативный и НЕ ЭтоНовый()
        Движения.Партии.Записать();
    КонецЕсли;

Зачем итоги в запросе ?
|ИТОГИ
        |    МАКСИМУМ(ВидНом),
        |    СУММА(КолДок),
        |    СУММА(СумДок),
        |    СУММА(КолОст),
        |    СУММА(СумОст)
        |ПО
        |    Номенклатура

у тебя там соединение и по номенклатуре и по партии по идее группировать итогами то не нужно ничего
сугубо мое лично мнение может я не прав поправьте мы все тут учимся.
дальше не смотрел сам ОУ только делаю

еще посмотрел объекты:
Регистр Партии - Режим блокировки Автоматический, разделение итогов не включено, у измерений не стоит галка запрет незаполненных значений - говорят это проверяют и снимают баллы

Зачем у регистра Продажи реквизит  Себестоимость ? Её же можно вытащить из оборотов регистра Партии, я бы и количество убрал бы если бы не услуги. Вот сумму продажи я согласен надо выводить в отдельный регистр иначе регистр Партий не вывести в ноль

Доделал свой вариант решения ОУ, прикладываю к сообщению, прошу строго критиковать ...
« Последнее редактирование: Октябрь 24, 2015, 09:53:32 pm от alex44ru »

alex44ru

  • Пользователь
  • **
  • Сообщений: 32
  • ФИО: Александр
Re: Билет 2. Спец по платформе V8
« Ответ #52 : Октябрь 27, 2015, 09:32:47 pm »
не помню у кого но в запросе отчета по БУ есть такой код:
    РегистрБухгалтерии.Основной.Обороты(
            ,
            ,
            ,
            Счет = ЗНАЧЕНИЕ(ПланСчетов.Основной.ПрибылиУбытки),
            &МассивСубконто,
            ,
            КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Основной.Покупатели)
                ИЛИ КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Основной.Товары)
                ИЛИ КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Основной.ОбщехозяйственныеЗатраты),
            ) КАК ОсновнойОбороты
Чем пользоваться ИЛИ для корсчета уж лучше параметром передать список счетов, так как конструкция ИЛИ не приветствуется и замедляет работу запроса. Для меня ИЛИ в запросе как красная тряпка для быка ))) ИМХО
    РегистрБухгалтерии.Основной.Обороты(
            ,
            ,
            ,
            Счет = ЗНАЧЕНИЕ(ПланСчетов.Основной.ПрибылиУбытки),
            &МассивСубконто,
            ,
            КорСчет В (&СписокСчетов),
            ) КАК ОсновнойОбороты
или для извращенцев )))
    РегистрБухгалтерии.Основной.Обороты(
            ,
            ,
            ,
            Счет = ЗНАЧЕНИЕ(ПланСчетов.Основной.ПрибылиУбытки),
            &МассивСубконто,
            ,
            КорСчет В (КорСчет В
    (ВЫБРАТЬ
        ЗНАЧЕНИЕ(ПланСчетов.Основной.Покупатели)
    ОБЪЕДИНИТЬ
    ВЫБРАТЬ
        ЗНАЧЕНИЕ(ПланСчетов.Основной.Товары)
    ОБЪЕДИНИТЬ
    ВЫБРАТЬ
        ЗНАЧЕНИЕ(ПланСчетов.Основной.ОбщехозяйственныеЗатраты))),
            ) КАК ОсновнойОбороты

HRom

  • Пользователь
  • **
  • Сообщений: 94
  • ФИО: HRom
Re: Билет 2. Спец по платформе V8
« Ответ #53 : Октябрь 29, 2015, 05:45:47 am »

Что скажете про такой вариант решения множественного изменения окладов?

По кнопке "ЗаполнитьЗначенияОкладов" на форме:

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

   
    Выборка = РегистрыСведений.СведенияОСотрудниках.Выбрать(НачалоМесяца(Объект.ПериодРегистрации),ДатаКонцаМесяца,,"Возр"); //,,"Период Возвр"
    Пока Выборка.Следующий() Цикл
        Если Выборка.Период = НачалоМесяца(Объект.ПериодРегистрации) Тогда
         Продолжить;
        КонецЕсли;
        Отбор = Новый Структура();
        Отбор.Вставить("Сотрудник",Выборка.Сотрудник);
        Отбор.Вставить("ДатаОкончания",ДатаКонцаМесяца);
        Строки = ТЗСписокСотрудников.НайтиСтроки(Отбор);
        Если Строки.Количество() > 0 Тогда
            Строки[0].ДатаОкончания = КонецДня(Выборка.Период);
        КонецЕсли;
        НоваяСтрока = ТЗСписокСотрудников.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока,Выборка);
       НоваяСтрока.Размер = Выборка.Оклад;
        НоваяСтрока.ДатаНачала = КонецДня(Выборка.Период)+1;
        НоваяСтрока.ДатаОкончания = ДатаКонцаМесяца;
    КонецЦикла;
    ТЗСписокСотрудников.ЗаполнитьЗначения(ПланыВидовРасчета.ОсновныеНачисления.Оклад,"ВидРасчета");
   
    Объект.ОсновныеНачисления.Загрузить(ТЗСписокСотрудников);
   
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьЗначенияОкладов(Команда)
    ЗаполнитьЗначенияОкладовНаСервере();
КонецПроцедуры


Выкладываю базу с этим алгоритмом

alex44ru

  • Пользователь
  • **
  • Сообщений: 32
  • ФИО: Александр
Re: Билет 2. Спец по платформе V8
« Ответ #54 : Октябрь 29, 2015, 10:05:03 pm »
И все таки я думаю в расчетной задаче мы тут все намудрили ибо берем текст задачи:

В течение расчетного периода первоначальное значение оклада может быть неоднократно изменено. В информационной базе необходимо хранить историю его изменения. Расчет должен проводиться исходя из действующего на рассчитываемую дату начального значения оклада. Например, если начальное значение оклада изменилось 10 августа, то до 10 августа при расчете берется старое значение, а начиная с 10 августа – новое.

Ну не вижу я в этой задаче требования разбивать строку записи документа. Вижу что объясняется механизм получения оклада типа будьте внимательны оклад надо брать срезом не на начало месяца а на начало записи и периоды начала записи могут быть разные.

Ну нет больше похожих по сложности задач из 15 билетов по СПР, эта самая сложная причем коэффициент сложности по отношению к оставшимся как 3:1.

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

Может кто то писал про то что она попалась на экзамене и требовали разбивать запись документа, с чего все взяли что надо разбивать строки документа по периодам изменения оклада ?

venvlad

  • Пользователь
  • **
  • Сообщений: 83
Re: Билет 2. Спец по платформе V8
« Ответ #55 : Ноябрь 03, 2015, 03:51:09 pm »
Уточнил по поводу: В одном документе могут быть данные за разные расчетные периоды.
http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=644127

alex1248

  • Призрак форума
  • *****
  • Сообщений: 714
Re: Билет 2. Спец по платформе V8
« Ответ #56 : Ноябрь 03, 2015, 04:50:54 pm »
Уточнил по поводу: В одном документе могут быть данные за разные расчетные периоды.
http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=644127
Да, в данном случае ответ правильный, и ответил грамотный чел. Но во-первых, отвечал не преподаватель, а один из тутошних же бывших, а во-вторых, на том форуме могут ответить совершенно безграмотно. Я как-то спрашивал там про один из важных моментов (на тот момент для себя еще не принял решение), так в ответ получил порцию заумно-поучающего бреда, из которого было понятно, что чел не владеет как минимум предметной областью, а в общем даже не понимает, о чем пишет. Ну это так, на всякий случай, о том, что некачественную информацию можно получить везде, и на том форуме не всем стоит доверять.  :D
« Последнее редактирование: Ноябрь 03, 2015, 04:52:50 pm от alex1248 »

venvlad

  • Пользователь
  • **
  • Сообщений: 83
Re: Билет 2. Спец по платформе V8
« Ответ #57 : Ноябрь 03, 2015, 05:07:23 pm »
Уточнил по поводу: В одном документе могут быть данные за разные расчетные периоды.
http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=644127
Да, в данном случае ответ правильный, и ответил грамотный чел. Но во-первых, отвечал не преподаватель, а один из тутошних же бывших, а во-вторых, на том форуме могут ответить совершенно безграмотно. Я как-то спрашивал там про один из важных моментов (на тот момент для себя еще не принял решение), так в ответ получил порцию заумно-поучающего бреда, из которого было понятно, что чел не владеет как минимум предметной областью, а в общем даже не понимает, о чем пишет. Ну это так, на всякий случай, о том, что некачественную информацию можно получить везде, и на том форуме не всем стоит доверять.  :D
Спросил на официальном форуме 1с у преподавателей, ответил не преподаватель, а грамотный человек. В итоге всё как-то неопределённо. Бесит) Ладно, прорвемся) Сделал, удовлетворяет всем условиям.

zorky

  • Проверенный
  • ***
  • Сообщений: 222
  • ФИО: ЗЖВ
Re: Билет 2. Спец по платформе V8
« Ответ #58 : Ноябрь 03, 2015, 08:25:52 pm »
Всем  здрасте, вот доделал ПР из 2-го билета, идею "многократного изменения оклада" взял из темы
http://forum.chistov.pro/index.php?topic=3606.30  у Alex44ru, хороший запрос, небольшие "допилки" - кое где Внутреннее соединение поставил - чтобы отсекать строки с NULL - ми ненужные когда оклада не было вообще у чувака ну и другие.
Всё протестил,неоднократно при любых погодных условиях - запрос отрабатывает чисто, когда не было изменений - одна запись, когда одно изменение - две и т.д.
Есть вопросы, извечный про реквизит/измерение подразделение, в РС графики сделал изм.Подразделение , в РР Подразделение связал с графиком...
От периода регистрации в ОсновныхНачислениях ничего не зависит, есть ли смысл его выносить в ТЧ? или делать Датой Дока...)
В Доп.Начислениях вывел его в ТЧ для того, что бы Базовый период не задавать вручную.. как то не красиво - Премия, и базовый период....Просто Расчётный Период, типа за какой месяц начислять)

Блин запарился, хотел вынести в Общий Модуль все расчёты, передаю ссылку - в ОМ делаю отбор, читаю, всё как у людей!  Записываю набор, а результата нету!!! Всё перепроверил...переделал... - бесполезно.Странно. Передал движения в модуль - всё работает...Непонятно...)))
И ещё по мелочи:   ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза  - тут нужен ISNULL или нет  ;-)

А отчёт невозможно проверить, кто как делал? чтобы другим Регистратором считать Премию наверное  - убрать Регистратор из параметров ВТ.

zorky

  • Проверенный
  • ***
  • Сообщений: 222
  • ФИО: ЗЖВ
Re: Билет 2. Спец по платформе V8
« Ответ #59 : Ноябрь 03, 2015, 09:01:39 pm »
Уточнил по поводу: В одном документе могут быть данные за разные расчетные периоды.
http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=644127
Да, в данном случае ответ правильный, и ответил грамотный чел. Но во-первых, отвечал не преподаватель, а один из тутошних же бывших, а во-вторых, на том форуме могут ответить совершенно безграмотно. Я как-то спрашивал там про один из важных моментов (на тот момент для себя еще не принял решение), так в ответ получил порцию заумно-поучающего бреда, из которого было понятно, что чел не владеет как минимум предметной областью, а в общем даже не понимает, о чем пишет. Ну это так, на всякий случай, о том, что некачественную информацию можно получить везде, и на том форуме не всем стоит доверять.  :D
Спросил на официальном форуме 1с у преподавателей, ответил не преподаватель, а грамотный человек. В итоге всё как-то неопределённо. Бесит) Ладно, прорвемся) Сделал, удовлетворяет всем условиям.

К сожалению, не удовлетворяет...
Завёл Васину, завёл ей оклад в сентябре, одно изменение в том же сентябре, пытаюсь начислить за Октябрь,  - ошибка "неверно задан период действия" - отладчиком глянул - там периодДействияНачало > ПериодДействияКонец....        на запрос мельком глянул-похоже, но разбивка на периоды хромает чтоли...
Эту задачу досконально разбирал...выложил тут же...Посмотрите косяки если что.  Завтра буду допиливать если ошибки