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

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

axel_work

  • Проверенный
  • ***
  • Сообщений: 161
  • ФИО: Алексей
Re: Билет 1. Спец по платформе V8
« Ответ #120 : Апрель 28, 2016, 08:31:33 am »
Мое решение.  Плиз критика.

Хз насколько правильно сделал СПР с этим условием про разные периоды. Начало и конец оклада можно ввести любой месяц, добавил только месяц базы в доп. начисления.
Посмотрел только СПР, и без  учета условия по периоды. В целом понравилось, есть некоторые моменты по-мелочи.
1.В процедуре проведения
   Движения.ОсновныеНачисления.Записать();
   Движения.ДополнительныеНачисления.Записать();
можно было заменить на Движения.Записать() и сэкономить немного времени, благо что вариант через название регистра тут не нужен, т.к. тут не нужно указывать параметры.
2.Расчет нужно перенести в общий модуль, вот за это могут немного снизить оценку.
3. Насколько я понимаю, в подобных констукциях тоже должна быть проверка на null после функции, ведь теоретически в итоге тут тоже может получится null. Или нет?
   |      МАКСИМУМ(ШкалаПроцентов.Стаж) КАК Стаж,                           МАКСИМУМ(isnull(ШкалаПроцентов.Стаж,0)) КАК Стаж,
4.При записи рассчитанных доп.начислений не нужно писать параметр Истина, ведь у них нет ФПД,не? Движения.ДополнительныеНачисления.Записать(, Истина);
И вопрос по проектированию: А можно ли со стажем и датой приема поступить было несколько проще - указать их в справочнике Сотрудников и брать их оттуда? По этому поводу что-то слышно было по информации с экзаменов?

Извините, что долго не отвечал.
По этим моментам:

1. Я обычно не использую Движения.Записать(). Во-первых для увеличения скорости и уменьшения кол-ва ошибок все действия стараюсь максимально делать однотипными. Поэтому использую запись Движения.ОсновныеНачисления.Записать(). Потому что в коде надо будет писать второй раз тоже самое, но с параметрами. Второй момент - а разве для ДвиженияЗаписать() не надо предварительно выставлять флаги Движения.ОН.Записывать = Истина? Если надо - тогда получается дольше.

2. Это согласен. Грешен, ленюсь :)

3. В запросе свертки стажей null не будет - там внутреннее соединение.

4. Насчет Движения.ДопНач.Записать(, Истина) - да, возможно вы правы. Можно и не писать. Тут частично мои аргументы из п.1 (однотипность = скорость и меньше ошибок), ведь ошибкой данное написание точно не является и не надо запоминать - какие именно наборы мы сейчас записываем. Второй момент - в справке про этот пункт еще про перерасчеты упоминалось, а перерасчеты могут быть и у доп. начислений. Хотя сильно я не разбирался в этом вопросе.

5. Можно и в справочнике задать - разницы нет, у меня РС непериодический.  Думаю, не настолько принципиальный вопрос, чтобы экзаменатор обращал на него внимание.


axel_work

  • Проверенный
  • ***
  • Сообщений: 161
  • ФИО: Алексей
Re: Билет 1. Спец по платформе V8
« Ответ #121 : Апрель 28, 2016, 09:05:37 am »
Мое решение.  Плиз критика.

Хз насколько правильно сделал СПР с этим условием про разные периоды. Начало и конец оклада можно ввести любой месяц, добавил только месяц базы в доп. начисления.

Доброго дня!

Несколько предложений по Вашему решению:
1. Я бы сделал сначала проверку на Метод списания. В вашем варианте, если не установлен, то получается зря движения по РН "ОстаткиНоменклатуры" делали, а в документе может быть много записей.

2. Зачем таскать признак услуги? Почему в первом же пакете запроса не поставить условие
"ГДЕ НЕ РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)" ?

3. Есть ли смысл делать проверку при списании партий? Уже проверили по ОстаткиТоваров, что товара хватает.

4. Во многих решениях видел - в документе Операция при установке пометки удаления на документ для набора записей снимается активность (и наоборот). Это примерно такой код в модуле документа:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

Проводки = Движения.Управленческий;
Проводки.Записывать = Истина;
Если НЕ Проводки.Модифицированность() И НЕ ЭтоНовый() Тогда
           Проводки.Прочитать();
КонецЕсли;

Для каждого Проводка Из Проводки Цикл
           Проводка.Период = Дата;

 Если НЕ ЭтоНовый() И ПометкаУдаления <> Ссылка.ПометкаУдаления Тогда
                     Проводка.Активность = НЕ ПометкаУдаления;
 КонецЕсли;
КонецЦикла;

КонецПроцедуры

5. Соглашусь с Гакусеем - начальный стаж и дата приема на работу скорее всего неизменяемая информация и их можно хранить в реквизитах справочника ФизическиеЛица.

Спасибо за комментарий!

1. По методу списания каюсь, забыл про него - поэтому он в середине. Согласен, надо вынести вперед, или в ПередЗаписью.

2. Если не обратили внимание - там МенеджерВременныхТаблиц. Признак ЭтоУслуга используется далее в коде БУ части.

3. Смысл имеет. По логике может и не нужно особо, но на форуме была информация, что на экзамене надо контролировать остатки везде, где явно не сказано обратное, ну и за исключением Операции и подобных документов.

4. Про код в Операции спасибо. Обычно в целях экономии времени я ничего туда не пишу, так как считается, что пользователь сам там все контролирует. Кроме того, в видео бонусе от Гилева - решении бух. задачи он тоже только движения вывел на форму и этим ограничился.

5. В общем разницы нет,  просто как-то проскочило предположение, что сотрудника могут несколько раз принимать и увольнять, соот-но она все таки изменяемая, но нечасто :).


aevdovin

  • Пользователь
  • **
  • Сообщений: 21
  • aevdovin
  • ФИО: Вдовин Андрей Евгеньевич
Re: Билет 1. Спец по платформе V8
« Ответ #122 : Апрель 28, 2016, 05:16:17 pm »
Посмотрите билетик, пожалуйста. Первый раз всё в кучу собрала. Буду рада любой критики и замечаниям! Заранее большое спасибо!
Нет признака учета субконто "Суммовой". Он требуется в этой задаче по условию ("Себестоимость определяется как средняя по товару по всем срокам годности.
Т.е. например если 1 пачка йогурта со сроком годности 10.01.2010 поступила по цене 90 рублей
и еще 1 пачка того же йогурта, но со сроком годности 30.01.2010 поступила по цене 110 рублей,
то при списании себестоимость одной пачки данного йогурта равна 100 рублей.
")

aevdovin

  • Пользователь
  • **
  • Сообщений: 21
  • aevdovin
  • ФИО: Вдовин Андрей Евгеньевич
Re: Билет 1. Спец по платформе V8
« Ответ #123 : Апрель 29, 2016, 02:19:07 pm »
мое решение. Если кто  прокомментирует, буду признателен. Есть сомнения по поводу расчета средней себестоимости в БУ. (скрин прилагаю).
« Последнее редактирование: Апрель 29, 2016, 02:20:41 pm от aevdovin »

CeHbKA

  • Пользователь
  • **
  • Сообщений: 88
Re: Билет 1. Спец по платформе V8
« Ответ #124 : Июнь 03, 2016, 01:59:04 pm »
Здравствуйте! Решил задача ОУ

Посмотрите, кто может пжл  :-[

CeHbKA

  • Пользователь
  • **
  • Сообщений: 88
Re: Билет 1. Спец по платформе V8
« Ответ #125 : Июнь 06, 2016, 09:20:16 am »
Выгрузка в dt

SAM

  • Пользователь
  • **
  • Сообщений: 56
  • ФИО: Сергей
Re: Билет 1. Спец по платформе V8
« Ответ #126 : Июнь 06, 2016, 12:15:22 pm »
Выгрузка в dt

Добрый день!
Вы неверно новую методику проведения используете, ошибка в модуле Расходной накладной, строка 14:
Движения.ОстаткиНоменклатуры.Записать(); //очищаем движения (нужно для перепроведения)не нужна. Почитайте статью Павла Чистова http://1c.chistov.pro/2013/07/blog-post_25.html  там все понятно и доступно про проведение по разным методикам. И запрос по остаткам весьма оригинальный - зачем в запрос передавать массив с номенклатурой, когда в БД есть сам документ?

Структура регистров построена неверно, если вы в запросе индексируете и соединение делаете по Номенклатуре, то и в регистре ставьте ее на первое место в измерениях.

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

В расходной накладной рекомендовал бы проведение сделать по следующей схеме:
1. сначала смотрите значение Учетной политики - может быть вообще не заполнено, тогда отказ.
2. Запросом группируем табличную часть документа, в запросе же исключаем услуги
3. формируем из результата запроса движения по РН "ОстаткиНоменклатуры", записываем, не забываем про блокировку
4. проверяем на отрицательные остатки
5. если не отказ, то очищаем и записываем движения по регистру с партиями, накладываем Блокировку, читаем и делаем списание.

В проведении Приходной накладной строки:
Цитировать
Движения.ОстаткиНоменклатуры.Записать();
Движения.ПартииНоменклатуры.Записать();
не нужны. Главное флаги "Записывать=Истина" не забыть выставить.

CeHbKA

  • Пользователь
  • **
  • Сообщений: 88
Re: Билет 1. Спец по платформе V8
« Ответ #127 : Июнь 06, 2016, 12:48:03 pm »
SAM, спасибо! Всё понятно, кроме
3. формируем из результата запроса движения по РН "ОстаткиНоменклатуры", записываем, не забываем про блокировку
Можете поподробнее раскрыть? Я думал, что блокировки для старой и новой методик выглядят след. образом:

1 - Новая методика (сначала пишем, потом читаем)
Движения.Регистр.Записывать = Истина;
Движения.Регистр.БлокироватьДляИзменения = Истина; //используем БлокироватьДляИзменения

//Дальше код по записи движений и контролю остатков

2 - Старая методика (сначала читаем, потом пишем)
Движения.Регистр.Записывать = Истина;

Блокировка = Новый БлокировкаДанных; //накладываем явную блокировку

//Дальше стандартный запрос к БД по партиям, контроль остатков, расчет себестоимости и запись движений

P.S. по поводу Движения.Регистр.Записать(), действительно, в голове каша была. В статье написано следуюущее:
Цитировать
При установленном свойстве "Удалять автоматически" в самом начале транзакции проведения система автоматически записывает пустые наборы записей в регистры, тем самым очищая старые движения. Это физически происходит, запись, со всеми вытекающими транзакциями и блокировками.
Видимо это ещё с 8.1 у меня привычка всегда руками очищать движения. Спасибо Вам большое

UPD.: убрал
Движения.ПартииНоменклатуры.Записать();Теперь при перепроведении система подцепляет предыдущие движения документа по данному регистру... Что-то я совсем запустался.
Как при старой методике при перепроведении документа очищать предыдущие движения без Записать() ?
« Последнее редактирование: Июнь 06, 2016, 01:34:49 pm от CeHbKA »

SAM

  • Пользователь
  • **
  • Сообщений: 56
  • ФИО: Сергей
Re: Билет 1. Спец по платформе V8
« Ответ #128 : Июнь 06, 2016, 02:59:05 pm »
SAM, спасибо! Всё понятно, кроме
3. формируем из результата запроса движения по РН "ОстаткиНоменклатуры", записываем, не забываем про блокировку
Можете поподробнее раскрыть? Я думал, что блокировки для старой и новой методик выглядят след. образом:

P.S. по поводу Движения.Регистр.Записать(), действительно, в голове каша была. В статье написано следуюущее:
Цитировать
При установленном свойстве "Удалять автоматически" в самом начале транзакции проведения система автоматически записывает пустые наборы записей в регистры, тем самым очищая старые движения. Это физически происходит, запись, со всеми вытекающими транзакциями и блокировками.
Видимо это ещё с 8.1 у меня привычка всегда руками очищать движения. Спасибо Вам большое

UPD.: убрал
Движения.ПартииНоменклатуры.Записать();Теперь при перепроведении система подцепляет предыдущие движения документа по данному регистру... Что-то я совсем запустался.
Как при старой методике при перепроведении документа очищать предыдущие движения без Записать() ?

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

При новой методике проведения:
1.Движения.Регистр.Очистить(); - можно очистить набор движений, но не обязательно, в описании Аттестации указано, что формы управляемые. Если движения не читать заранее, то набор будет пуст. Но можно и очистить, вряд ли это будет ошибкой, главное не записывать!
2. Формируем набор движений.
3. Движения.Регистр.БлокироватьДляИзменения = Истина; - блокируем для изменений.Важно, чтобы у Регистра стоял флаг разделения итогов, иначе БлокироватьДляИзменения не работает!
4. Далее на выбор:
Движения.Регистр.Записать(); - пишем набор движений по регистру
либо
Движения.Регистр.Записывать = Истина; - устанавливаем флаг, затем
Движения.Записать();  - будут записаны только те движения, у которых выставили Записывать = Истина

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

При записи новые движения заместят старые, если идет перепроведение.

5. проверка на отрицательные остатки и т.д.

При старой методике:
1. Я использовал такую конструкцию:
Движения.Регистр.Очистить();
Движения.Регистр.БлокироватьДляИзменения = Истина;
Движения.Регистр.Записать();

Павел Чистов в своей статье предлагает использовать такой код только для оперативного проведения, обернуть в Если РежимПроведения=РежимПроведенияДокумента.Оперативный Тогда
...
КонецЕсли;
однако на форуме я видел сообщения, что на аттестации такой вариант не понравился принимающему.
Т.к. сдавал дистанционно, и не было возможности поспорить, оставил только эти три строки, т.е. очищаем набор, блокируем, если вдруг это перепроведение и какие то движения там уже были, и записываем пустой набор.

Далее Блокировка = Новый БлокировкаДанных;
читаем, формируем набор движений и ставим флаг Записывать=Истина; чтобы движения записались при окончании транзакции. И все  :D

Еще замечание - при оперативном проведении запрос выполнять не на пустую дату, а в качестве момента времени передавать Неопределено.
Т.е. при новой методике
Запрос.УстановитьПараметр("Момент",?(РежимПроведение=РежимПроведенияДокумента.Оперативный,Неопределено,Новый Граница(МоментВремени(),ВидГраницы.Включая)));

CeHbKA

  • Пользователь
  • **
  • Сообщений: 88
Re: Билет 1. Спец по платформе V8
« Ответ #129 : Июнь 06, 2016, 04:32:50 pm »
Да, сейчас почитал про БлокироватьДляИзменения и тоже пришёл к таким же выводам.
Для новой методики:
Движения.Регистр.БлокироватьДляИзменения = Истина; //Блокируем старые движения

//Формируем новые движения

Движения.Регистр.Записать(); //Явно записываем их

//Делаем проверки

Для старой методики:
Движения.Регистр.Записывать = Истина; //устанавливаем маркер записи, в принципе неважно где, можно хоть в самом конце после формирования движений
Движения.Регистр.БлокироватьДляИзменения = Истина; //Блокируем старые движения
Движения.Регистр.Записать() //Очищаем движения, чтобы они не попадали в запрос

//Формируем движения и проверки

Цитировать
Еще замечание - при оперативном проведении запрос выполнять не на пустую дату, а в качестве момента времени передавать Неопределено.
Т.е. при новой методике
Запрос.УстановитьПараметр("Момент",?(РежимПроведение=РежимПроведенияДокумента.Оперативный,Неопределено,Новый Граница(МоментВремени(),ВидГраницы.Включая)));
А почему? Разве для платформы есть какая-то существенная разница? Ведь всё равно Неопределено будет преобразовано в пустую дату

freez1301

  • Пользователь
  • **
  • Сообщений: 68
Re: Билет 1. Спец по платформе V8
« Ответ #130 : Июнь 07, 2016, 10:49:42 am »
Доброго времени всем )
посмотрите плз мой вариант. Буду признателен за комменты

Гакусей

  • Проверенный
  • ***
  • Сообщений: 154
Re: Билет 1. Спец по платформе V8
« Ответ #131 : Июнь 07, 2016, 11:32:51 am »
Доброго времени всем )
посмотрите плз мой вариант. Буду признателен за комменты
Посмотрел бегло,
isnull в запросах отсутствует
В БУ отключают ПУС Суммовой по срокам годности, из-за этого меняются запросы и прочее. В БУ отчете не учтено условие, что сумма должна формироваться специфически.
Отключать всегда Оперпроведение у НЗ
Подразделение в РР не нужно, галка Базовое не проставлено

freez1301

  • Пользователь
  • **
  • Сообщений: 68
Re: Билет 1. Спец по платформе V8
« Ответ #132 : Июнь 08, 2016, 09:43:43 am »
В БУ отключают ПУС Суммовой по срокам годности, из-за этого меняются запросы и прочее. В БУ отчете не учтено условие, что сумма должна формироваться специфически.
так ведь если оставить только обороты на сроках годности, то остатка в разрезе этого субконто не видно будет. Не понятно что списывать и как строить отчет в таком случае
и про флажок - Базовое. В РР измерение одно, смысл то от него какой будет? Если бы было 2 и больше - тогда можно было бы подумать какой индекс нужен и расставить этот флажок и порядок измерений в РР. А так - не понимаю зачем его выставлять? Наоброт - это увеличит время записи наборов.
И кстати, давно хотел спросить - на индексирование реквизитов смотрят на экзамене? (я про измерения РН в частности)
« Последнее редактирование: Июнь 08, 2016, 10:19:31 am от freez1301 »

Гакусей

  • Проверенный
  • ***
  • Сообщений: 154
Re: Билет 1. Спец по платформе V8
« Ответ #133 : Июнь 08, 2016, 10:25:21 am »
ПУС и только обороты - совершенно разные вещи.
Насколько я понял на индексирование смотрят на уровне "чтобы было" . Ну а если хошь подискутировать с преподом, то такая возможность у тебя будет конечно ;D
« Последнее редактирование: Июнь 08, 2016, 10:28:12 am от Гакусей »

freez1301

  • Пользователь
  • **
  • Сообщений: 68
Re: Билет 1. Спец по платформе V8
« Ответ #134 : Июнь 08, 2016, 10:45:54 am »
ПУС и только обороты - совершенно разные вещи.
Насколько я понял на индексирование смотрят на уровне "чтобы было" . Ну а если хошь подискутировать с преподом, то такая возможность у тебя будет конечно ;D
я из региона, так что подискутировать не смогу )) буду сдавать дистанционно )
зы хм, ПУС - не понял я что это такое. Признак учета субконто, по-другому как еще расшифровать?