Материалы курса «Подготовка к Аттестации по Платформе 8.2»
– Раздел 1, задача 1.25 «Пени»

Вторая задача раздела “Оперативный учет” – задача 1.25 “Пени”

Кооментарий от Павла:
Хорошая задача. У нее есть “братья близнецы” в сборнике. В задаче я разобрал все, за исключением однотипных блокировок. Управляемые блокировки описаны в двух документах, в остальных я думаю вы без труда допишите их сами.

  • Изучите материалы задачи.
  • Вопросы, возникшие в ходе изучения этих материалов, задавайте в комментариях на текущей странице. Ответы преподавателя и комментарии других участников будут Вам доступны, только если Вы залогинены и у Вас есть доступ в Мастер-группу.
  • Общие вопросы по курсу (в т.ч. организационные) задавайте на стартовой странице.

К сожалению, у Вас недостаточно прав для дальнейшего просмотра.

Если Вы приобрели курс, но еще не активировали токен — пожалуйста, активируйте доступ по инструкциям, высланным на Ваш email после покупки.

Если Вы не залогинены на сайте — залогиньтесь, вернитесь на эту страницу и обновите ее.

Если Вы залогинены, у Вас активирован токен доступа, но Вы все равно видите эту запись — напишите нам на e-mail поддержки.

Комментарии / обсуждение (126):

  1. alexa19

    Добрый день, Павел!
    Я реализовал задачу “Пени” с двумя регистрами накопления. Оба имеют измерение Счет и ресурс Сумма. Но один из этих регистров – регистр оборотов (тот который нужен для отчета “Анализа счета”). Все остальное похоже на ваше решение. На мой взгляд моё решение достаточно жизнеспособное, т. к. отчеты строятся проще и работают быстрее. Но хотелось бы узнать ваше мнение. Могли бы вы посмотреть на моё решение и как вам его показать?

    • GROOVY

      Приветствую. Я не имею возможности проверять решения слушателей, но с удовольствием отвечу на конкретные вопросы.

      • alexa19

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

        • GROOVY

          Хотя бы структуру регистра приведите :) От структуры регистров зависит успешность сдачи на 99%.

          • alexa19

            Оба регистра имеют измерение “Счет” и ресурс “Сумма”. Большего, думаю, не нужно. Но второй регистр у вас остатков, а у меня оборотный. На основании оборотного регистра строил второй отчет из задания. Собственно этот второй отчет и сподвиг сделать оборотный регистр

            • GROOVY

              В отчете наглядно видно, что есть увеличение и уменьшение долга по счету – это не обороты.

  2. Rokkie

    Приветствую!
    Правда ли, если в задании написано, что документы задним числом не вводятся, то получается, что нужно использовать только Оперативный режим. Выходит, что и тестировать ничего не нужно в неопереативном режиме. Т.е. вводить данные нужно только СЕГОДНЯШНИМ ДНЕМ?

    • GROOVY

      Неправда. Пользователь может открыть старый документ и изменить там дату.

  3. Ящук Евгений

    Добрый день!
    Павел, мне кажется было бы лучше сделать следующим образом.

    Регистраторами для РН “ЗадолженностьПоОплате”:
    – Расходная (ее Вы не включили, вместо этого движение делает Счет)
    – ПКО
    – Начисление пени
    – Счет исключить из регистраторов.

    Это позволило бы:
    – в отчете “Анализ счета” использовать одну таблицу “ЗадолженностьПоОплате”.

    • GROOVY

      Не соглашусь. Как тогда задолженность по неотгруженному счету будет формироваться?

  4. Михаил

    Добрый день!
    Запрос по пени составлен левым соединением с регистром сведений.
    т.е. счета по которым есть есть остатки,но нет полной отгрузки дадут поле null
    Не понятно почему не дает ошибки при сравнении null и 0
    и функция добавитьКДате прибавляет к null какое то число ,тоже вроде должна дать ошибку

    “….
    |ГДЕ
    РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(СостояниеСчетов.ДатаПолнойОтгрузки, ДЕНЬ, Долги.Счет.ОтсрочкаПлатежа), &Дата, ДЕНЬ) > 0
    …”

    • GROOVY

      Некоторые функции сами производят преобразование NULL к примитивным типам. Точнее можно сказать посмотрев весь текст запроса. И как я вспоминаю, по задаче до полной отгрузки пени начисляться не должны.

    • Анна

      У меня такой же вопрос, а Ваш ответ, Павел, не вполне устроил. Скажите, чтобы наверняка было правильно, к чему нужно привести isnull(СостояниеСчетов.ДатаПолнойОтгрузки, …) К пустой дате?

      • GROOVY

        Не могу понять, почему Вы считаете приведенный код неправильным. Приводите к дате 0001-01-01.

  5. Alenka Kremer

    Здравствуйте! В данном решении не учитывается тот момент что платёж мог проходить несколькими этапами в течении недели. Является ли это ошибкой? Мне кажется, что после каждого этапа следует пересчитывать пени.

  6. ucheba

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

    • GROOVY

      Так по ним остатков нет ни в одной таблице.

      • ucheba

        Понял свою ошибку. Не использовал регистр задолженностей по товарам. Если полностью отгружено – то там остатков не будет. Премного благодарен.

  7. pila86

    Добрый день, Павел! Вопрос по задаче 1.25 “Пени”. А при начислении пени не нужно накладывать блокировку на весь регистр “ЗадолженностьПоОплате”? Вдруг в момент проведения документа кто-то создаст документы по контрагенту.

    • GROOVY

      Добрый. А у меня как? Регистр по контрагенту надо блокировать.

      • pila86

        Модуль документа “НачислениеПени”
        Процедура ОбработкаПроведения(Отказ, РежимПроведения)

        Запрос = Новый Запрос;
        Запрос.Текст = “ВЫБРАТЬ
        | Долги.Контрагент,
        | Долги.Счет,
        | РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(СостояниеСчетов.ДатаПолнойОтгрузки, ДЕНЬ, Долги.Счет.ОтсрочкаПлатежа), &Дата, ДЕНЬ) * (Долги.Счет.ПроцентПени / 100) * Долги.СуммаОстаток КАК Пени
        |ИЗ
        | РегистрНакопления.ЗадолженностьПоОплате.Остатки КАК Долги
        | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостояниеСчетов.СрезПоследних КАК СостояниеСчетов
        | ПО Долги.Счет = СостояниеСчетов.Счет
        |ГДЕ
        | РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(СостояниеСчетов.ДатаПолнойОтгрузки, ДЕНЬ, Долги.Счет.ОтсрочкаПлатежа), &Дата, ДЕНЬ) > 0”;
        Запрос.УстановитьПараметр(“Дата”, Дата);
        РезультатЗапроса = Запрос.Выполнить();

        Движения.ЗадолженностьПоОплате.Записывать = Истина;

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

        Тут нет блокировок.

        • GROOVY

          Да, я не повторяю в курсе блокировки везде.
          Если есть вопросы по блокировкам посмотрите первые видео, задавайте вопросы.

  8. vmalov

    Добрый день!
    Возник вопрос по задаче 1.25 Пени.
    Требуется ли в документе по начислению пени учитывать тот факт, что раз пени начисляется еженедельно – пени на просрочку предыдущего периода (недели) уже были начислены документом прошлой недели (т.е. пени надо начислять только на остаток просрочки, приходящейся на эту неделю).
    В задаче была фраза по поводу еженедельных начислений пени. Как понять, какие фразы рассматривать как условие задачи, которое необходимо соблюсти, а какие можно не реализовывать?

    • GROOVY

      Как следует из отчете, начисленные пени увеличивают долг, следовательно следующее начисление пени будет включать в расчет и суммы всех ранее начисленных пеней. Как говорится “поставили на счетчик”.
      Фраза в задаче для корректного ввода тестовых данных. Автоматизировать это не надо.

  9. zaharknyaz

    Добрый день!

    1. Отчёт “АнализСостоянияСчетов”: В задаче сказано “В отчете должны отображаться только те счета, по которым товар еще не отгружен или не прошла
    полная оплата”. В СКД в наборе данных объединение “НаборДанных1Объединение” мы добавляем 2 набора: 1 – ЗадолженностьПоОтгрузкеОстатки, 2 – ЗадолженностьПоОплатеОстатки т.е. на примере Счет1, если он полностью отгружен, но проплата не полностью то в 1 наборе его не будет, зато будет в наборе 2 т.к. не полностью проплачен т.е. вот такая конструкция запросов исключает возможность того, что в отчете не будет отображаться информация по счетам которые уже отгружены, но не проплачены и наоборот которые недоотгружены, но проплачены?

    2.В обработке проведения документа “РасходнаяНакладная”:

    2.1.Почему после добавления движения по регистру сведений “СостояниеСчетов” не делаем “Движения.Записать();”, а записи в регистре сведений всё равно создаются.

    2.2. Почему пользуемся таким синтаксисом “Движение = Движения.СостояниеСчетов.Добавить();”, а не таким “МенеджерЗаписи = РегистрыСведений.СостояниеСчетов.СоздатьМенеджерЗаписи();МенеджерЗаписи.Записать(); разве в регистры сведений записи пишутся не только при помощи “Создать набор записей” или “Создать менеджер записи”?

    • GROOVY

      Приветствую.
      1. Это же объединение, туда попадут и те и другие данные из обеих таблиц. Возможно я не понял вопроса.
      2.1 Запись происходит в конце транзакции по флагу Записывать=Истина.
      2.2 Удивительно, но не только такими методами. Особенно если регистр подчинен регистратору.

      Советую пройти Базовый курс http://www.spec8.ru/devbase

      • zaharknyaz

        1. Это же объединение, туда попадут и те и другие данные из обеих таблиц. Возможно я не понял вопроса. Источник: ©Курсы-по-1С.рф

        Понятно, что это обьединение, такое же как “ОБЪЕДИНИТЬ ВСЕ” в запросах.Вопрос был в другом, исключит ли такое объединение запросов по виртуальным таблицам остатков того, что в отчет не попадут полностью отгруженные, но не полностью проплаченные счета, или наоборот которые полностью проплачены(документом ПКО), но недоотгружены(документом Расходная накладная)?

        2.1.Почему после добавления движения по регистру сведений «СостояниеСчетов» не делаем «Движения.Записать();», а записи в регистре сведений всё равно создаются.

        Насколько я помню, при вызове метода Движения.Записать(), запишутся только те движения по которым стоит флаг Записывать = Истина(после записи они сбросятся в ложь), но для записи же всё равно необходимо вызвать метод “Движения.Записать()”.

        • GROOVY

          1. Попадут все данные из обеих таблиц, это не соединение, здесь нет условия соединения. Если данные есть хотя бы в одной таблице (или в обеих) они будут выведены.
          2. Флаг набора записей “Записывать=Истина” используется системой для анализа надо ли записать движения при явном методе “Движения.Записать()” и в конце транзакции проведения.

  10. AlexKo

    Добрый день!
    Нужен ли вообще рн ЗадолженностьПоОтгрузке? В комментарии к заданию написано «4. Счет не может быть сверхотгружен, т.е. нет необходимости отслеживать остаток при
    проведении расходной для целей контроля сверхпродажи.» поэтому я сделал только один рн где Расходная и НачислениеПени делает долг, а ПриходДенег уменьшает долг, а состояние чета указываю в документе Расходная вручную. Правильный ли такой подход или нет?
    Зачем в отчете Анализ состояния счетов объединение двух регистров? Разве одного рн ЗадолженностьПоОплате не достаточно. Вопрос теоретический: в рн ЗадолженностьПоОплате кто должен делать долг Счет или Расходная и почему?

      • AlexKo

        В комментариях к заданию написано
        Причем у счета есть 3 состояния:
        1. Выписал, не отгружен полностью
        2. Полностью отгружен
        3. Полностью оплачен
        поэтому я создал рс СостояниеСчета и когда Расходная “закрывала” Счет вручную ставил “ПолностьюОтгружен”, дата отгрузки – период, и проверял отгрузку по этому регистру. Запрос отчета “Анализ состояния счетов” из-за этого выглядит не так красиво.

  11. kan200823

    Здравствуйте!

    Почему бы не хранить дату полной отгрузки в реквизите документа счет (записывать в документ при проведении расходной накладной)? Так и размер базы будет меньше, и при проведении документа “Начисление пени” не нужно будет целый регистр сведений считывать.

    С уважением,
    Антон

    • GROOVY

      И при записи этого реквизита блокировать все таблицы в которые входит документ?
      И в чем экономия размера базы?

      • kan200823

        А для чего блокировать таблицы? Ссылка на документ никак не изменится (от того, что изменится значение реквизита). Или платформа их автоматически при записи счета блокировать будет? Но блокировки вроде управляемые…
        Впрочем есть серьезный минус такого решения: не будет связи между Датой полной отгрузки и накладной, которой она установлена.

        • GROOVY

          Я не про блокировки на чтение. При записи данных в таблицы устанавливаются блокировки сервером СУБД в транзакции записи. Так при записи документа будут заблокированы: таблица документа (шапки) таблицы табличных частей документа, таблицы регистров по которым он является регистратором.

  12. koupny

    Добрый день. Хочу уточнить один момент. Необходима ли блокировка регистра “ЗадолженностьПоОплате” в обработке проведения документа “Пени”? Если да, то получается необходимо весь регистр заблокировать? (Мы же не знаем для какого контрагента и по какому счету будет начислена пеня)

      • kan200823

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

  13. Илья

    Добрый день!

    Думаю, что в запрос, получающий сумму пени, было бы не лишним добавить округление до копеек и проверку получившегося числа на > 0.
    Иначе при копеечных долгах могут появиться нулевые движения в регистре.

  14. Александр

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

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

    Допустим ли такой вариант решения данной проблемы:
    В модуле объекта создаем переменную. В процедуре “перед записью” модуля объекта присваиваем туда момент времени документа. В обработке проведения проверяем, если момент времени документа больше, чем момент времени в переменной (т.е. прошлый момент времени), значит дата была изменена в большую сторону (т.е. это либо оперативное проведение, либо неоперативное, но с изменением времени). Соответственно, перед чтением данных нужно записать пустые наборы.
    Или же данная проблема имеет более умное решение? Хотелось бы как-то избежать безусловной записи пустых наборов, если это не всегда нужно.

    2. Блокировка пустых наборов.
    В Ваших решениях встречал разные варианты: где-то вы устанавливали блокировку перед записью пустых наборов, где-то нет.

    Пример. Есть набор движений. Допустим там движение по номенклатуре Н1. Если мы записываем пустой набор, то после этого данные по Н1 доступны для редактирования другими транзакциями? Или до конца транзакции, в которой происходила запись пустых наборов, другие транзакции не смогут работать с этими данными в любом случае?
    Если случай первый, выходит, что надо заблокировать эти освободившиеся данные от изменения. Т.е. перед записью пустого набора добавляем блокировку – БлокироватьДляИзменения.

    Возникает вопрос: в каких случаях блокировка должна быть установлена при записи пустых наборов?
    Предположу, что во всех случаях при проверке остатков старым способом если нужна запись пустых наборов (мой первый вопрос).

    3. Получение остатков на дату.
    С документом счет все предельно ясно: он просто создает задолжность безо всяких проверок.

    В Расходной накладной никакого периода не устанавливается. Получается, что если каждая последующая расходная вносится позже предыдущей, то такой вариант работает.

    Допустим расходная №5 списывает наш долг в ноль.
    Далее (по какой-то причине) документ перепроводится и изменяется сумма (т.е. документ больше не выводит в 0 наш долг). Потом добавляем недостающую сумму в один из ранее проведенных документов и перепроводим его. Запрос по итогам покажет, что долг выводится в 0, в регистр попадает дата не последней расходной, а той, которая обнулила долг. Соотв. пени будут считаться неправильно.
    Выходит, что если проведение не оперативное, то нужно
    придумать иной способ регистрации даты полной отгрузки.

    Либо получать остатки на границу момента времени с включением границы и перепроводить документы, используя, например, последовательности. Тогда дата последнего документ будет датой полной отгрузки.

    Понятно, что можно условиться на том, что все корректировки могут вноситься только новыми документами и проблема отпадет, но ведь по условию задачи не сказано, что нельзя перепроводить задним числом.
    С учетом описанного, нужно ли получать остатки на момент времени или предположить самую простую ситуацию? Не будет ли это “упрощением задачи”?

    В обработке проведения ПКО также не учитывается период при получении остатков. Т.е. выходит, что даже если какой-то из счетов был выставлен позже, чем пришли деньги, то на этот счет также может быть добавлено погашения долга, если хватит суммы.
    Не правильнее было бы отбирать счета по задолженности исходя из даты ПКО?

    Аналогичная ситуация и в начислении пени. Никакого периода нет. Но в данном случае это уже точно недосмотр.

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

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

    • GROOVY

      Вы изменение даты/времени уже проведенного документа учитывайте, и учитывайте другие транзакции параллельные текущей, с таким же вариантом.
      Я повторно очень редко рассматриваю уже описанные механизмы. Это блокировки и тп. То что однообразно.
      По методике оперативного проведения рекомендую почитать http://1c.chistov.pro/2013/07/blog-post_25.html

      • Александр

        1. С записью пустых наборов вроде окончательно разобрался.
        Исходя из фразы в статье “Подобное действие не помешает и при смене даты или времени документа, а не только при оперативном проведении” делаю вывод, что при любом изменении момента времени в + надо очищать наборы, будь то оперативное проведение или нет.
        При изменении момента времени в меньшую сторону, можно ограничиться просто моментом времени, т.к. даже если движения были, то получать остатки мы будем на более ранний период и они не будут учтены.

        Мой вариант с переменной и сравнением времени подходит (второй абзац вопроса) или сравнение даты/времени делается иным путем?

        2. Установка блокировки на пустой набор перед записью является обязательной или могут быть ситуации, когда достаточно просто записать набор без блокировки?

        3. И по регистрам сведений. Насколько помню, вопрос блокировки/ее отсутствия не обсуждался. Стоит ли их блокировать или можно считать, что применительно к регистрам сведений информация не может вдруг поменяться (для экзамена)?

        • GROOVY

          1. Да с переменной можно и так. Только ее фиксировать надо при получении объекта, как интерактивном, так и программном.
          2. Не могу представить таких ситуаций. Пустой набор пишем для исключения движений при чтении, а читать можно и параллельно, так что…
          3. Для регистров сведений, равно как и для регистров расчета вопрос блокировок остро не стоит, туда оперативные данные параллельно не пишутся. Для экзамена: пара лишних строчек кода при наличии времени не повредит.

  15. 87konstantin@mail.ru

    Здравствуйте, Павел. Вы используете для построения отчетов объединение наборов. Решил попробовать построить отчеты без объединений – одним набором данных. Для 1 отчета у меня получился след запрос:
    ВЫБРАТЬ
    ОтгрузкаОстатки.Счет,
    NULL КАК СуммаОстаток
    ПОМЕСТИТЬ ВрТаб
    ИЗ
    РегистрНакопления.Отгрузка.Остатки КАК ОтгрузкаОстатки

    ОБЪЕДИНИТЬ

    ВЫБРАТЬ
    ОплатаСчетовОстатки.Счет,
    ОплатаСчетовОстатки.СуммаОстаток
    ИЗ
    РегистрНакопления.ОплатаСчетов.Остатки КАК ОплатаСчетовОстатки
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ВрТаб.Счет,
    СУММА(ВрТаб.СуммаОстаток) КАК СуммаОстаток,
    ДатыПолныхОтгрузокСчетовСрезПоследних.ДатаПолнойОтгрузки
    ИЗ
    ВрТаб КАК ВрТаб
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДатыПолныхОтгрузокСчетов.СрезПоследних КАК ДатыПолныхОтгрузокСчетовСрезПоследних
    ПО ВрТаб.Счет = ДатыПолныхОтгрузокСчетовСрезПоследних.Счет

    СГРУППИРОВАТЬ ПО
    ВрТаб.Счет,
    ДатыПолныхОтгрузокСчетовСрезПоследних.ДатаПолнойОтгрузки

    Допустимо ли такое решение?

    Еще 1 вопрос в документе расходная накладная отсутствует контроль остатков по сумме для регистра “ЗадолженностьПоОтгрузке”, я конечно понимаю, что в задании об этом явно не сказано, но в требованиях к экзамену есть пункт “Отсутствие в решении проверок на правильное заполнение ресурсов регистра, приводящее, например, к появлению отрицательных остатков товаров на складе. Наличие отрицательных значений ресурсов регистра допустимо, только если об этом явно сказано в задании или следует из логики учетной схемы, не противоречащей ситуации, возникающей в реальной практике ведения учета”. Как поступать в этой ситуации – всегда делать контроль остатков?

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

    • GROOVY

      Объединение наборов данных средствами SQL предпочтительнее, если нет необходимости в варьировании настроек СКД. Если запрос собирает сама СКД, то есть шанс, что некоторые таблицы не будут участвовать в объединении/соединении из-за настроек пользователя.

      По второму вопросу Вы допускаете досадную ошибку. Соединение в отчете данных из регистра с остатками не может дать реальные цифры о себестоимости продаж – не каждое списание есть продажа.

  16. Fmhf1970_041

    Здравствуйте!
    В отчете о состоянии счетов выводится итоговая строка, которая при выбранном способе выделения ресурсов (Максимум), не имеет смысла. Да и в задании ее нет. Как убрать строку итогов? Стоит ли обращать внимание на это на экзамене?

    • GROOVY

      Выводите в отчете только детальные записи. Итогов не будет.

      • Fmhf1970_041

        Тогда появляется лишняя строка из регистра долгов по отгрузке. Нужно ставить условие на отбор строк.

  17. Mutabor

    Почему в видеорешении факт задолженности по оплате возникает при выписке счета, а не при отгрузке товара?

    • GROOVY

      Потому, что факт долга устанавливается именно счетом, а не накладной. Отгрузки вообще может не быть, а долг уже будет.

  18. CeHbKA

    Не очень понимаю момент с блокировками в документе “Начисление пени”
    БлокироватьДляИзменения – используем, когда пишем
    Объект БлокировкаДанных – используем, когда читаем.

    С документами Счет, ПКО и Расходная накладная всё понятно, проблем нет. Там есть реквизиты контрагент и счет, и с помощью этих реквизитов, мы ставим БлокировкуДанных на нужные измерения в регистрах накопления.

    А как ставить блокировку в “Начисление пени”? Там ведь нет никаких реквизитов => установить блокировку ПЕРЕД чтением данных (перед запросом) не получится. Варианта 2:
    1 – грязное чтение (недопустимо)
    2 – блокировать всю таблицу регистра (перед запросом)

    Объясните, пожалуйста

  19. nikita.garichev

    Не могу понять, почему в документе “Пени” остатки по регистру берутся без учета момента времени. Да, документы задним числом не вводятся, но что если мы перепроведем существующий документ?
    Тогда остатки сформируются на конец периода, а не на момент времени документа?

  20. boobzx

    Все еще не могу понять про блокировки в документе ПКО

    Мы там делаем управляемую блокировку… А что будет если я напишу

    перед запросом такую шапку..

    Движения.ЗадолжностьПоОплате.Записывать = Истина;
        Движения.ЗадолжностьПоОплате.Очистить();
        Движения.ЗадолжностьПоОплате.БлокироватьДляИзменения = Истина;
       
        Блокировать = Новый БлокировкаДанных;
        ЭлементБлокировки = Блокировать.Добавить("РегистрНакопления.ЗадолжностьПоОплате");
        ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
        ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент);
        Блокировать.Заблокировать();

        Запрос = Новый Запрос;

    будет ли это считаться за ошибку? Не могу понять чем отличается
    Движения.ЗадолжностьПоОплате.БлокироватьДляИзменения = Истина; (это если открываем в обычном приложении?)
    и
    Новый БлокировкаДанных;

  21. soft-1c@mail.ru

    Добрый вечер! Тоже вопрос по блокировкам.
    В документе ПКО, когда описываем блокировку, по-умолчаниу если не указан источник данных, то берется сам объект? Или как?

    И еще. В том же проведении, обычно всегда в начале пишем в свойство Движения..Записывать = Истина; А вы это сделали после блокировки перед выборкой. В этом есть смысл какой-то или просто так получилось?)

    Еще. При проведении ПКО в запросе мне кажется нужно установить дату получения остатков, иначе при вводе ПКО задним числом – остатки будут неверные.

    • GROOVY

      Если не указан источник, то ничего за источник не берется.
      Записывать – это флаг, маркер, признак, необходимости записать движения, где его указать до записи, абсолютно не важно.
      В условии задачи сказано, что документы задним числом не вводятся.

  22. vava32

    Добрый день!
    Возникли вопросы общие и частные.
    1.Я оценила фразу “накладные могут быть только на основании счета” как требование для расходной накладной “создания на основании” счета.
    Ввод нового с заполненным реквизитом “счет”- можно оценить как на основании счета. В решении нет ни настройки свойства “Проверка заполнения” для реквизита “счет”, ни обработки события проверки заполнения.
    Я потеряла много времени на обработку ввода на основании и контроль остатков по счету. Для экзамена -не годится.

    Вариант из Вашего решения после “незатратной” корректировки оценили бы правильным на экзамене?

    2.Два регистра накопления в видео решении сделали решение с проведением и отчетами простыми.
    Я сделала один регистр взаиморасчетов, но в РС у счета добавила состояние (3 значения перечисления) .
    Отчеты были сложнее и затратнее по времени.По форме отчетов видно,что не нужен регистр отгрузки.
    Какое в условиях цейтнота экзамена решение выбрать?
    3.В реальном решении задачи, наверное, нужно распределять остатки от ПКО, если было больше перечислено,чем долг.
    Я это и учитывала при решении. Значит ли это, что надо выполнять буквально, не домысливая, понимая условность задания?
    Спасибо!

    • GROOVY

      1. Не усложняйте себе задачу. Защиту от дурака делать не надо, если об этом явно не написано. То что накадные могут быть только на основании счета – это облегчение задачи, не нужно учитывать “левые” накладные.
      2. Решение правильным является не в контексте цейтнота, а в контексте правильного проектирования регистров: 1 регистр = 1 показатель учета.
      3. Не понял что такое “реальное решение”. Задача поставлена конкретно, ее надо решить самым быстрым и правильным способом. Примеры их мы тут и приводим.

  23. Андрей

    Добрый день. Вопрос по блокировкам в документе Начисления пени. Читаем остатки по задолженности, но в документе у нас нет ни контрагента, ни счета, получается что по заданию и блокировка не нужна?

    • GROOVY

      Нужна. Если нет значения фильтра для блокировки, будем блокировать все. А то параллельное чтение может очень плохо нам сделать.

      • Андрей

        Насколько я понял правильно будет так
        Блокировка = Новый БлокировкаДанных;
        Элемент = Блокировка.Добавить(“РегистрНакопления.ЗадолженностьПоОплате”);
        Элемент.Режим = РежимБлокировкиДанных.Исключительный;
        Блокировка.Заблокировать();

  24. piskunov_alexandr

    Павел, подскажите, пожалуйста, почему в отчете “анализ состояния счетов” участвует регистр “задолженностьПоОтгрузке” и из него выбирается только счет? Я попробовал без него, просто с “задолженностьПоОплате” и “СостояниеСчетов”, отчет показывает нормальные данные. Поясните задачу использования “задолженностьПоОтгрузке”

    • GROOVY

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

      • piskunov_alexandr

        полностью он отгружен или нет – это же на отчет не влияет (в отчете дата полной отгрузки может стоять, а может нет). А если задолженности по оплате нет (ни обычной, ни просроченной), то счет в отчет вообще ни попадет, и задолженностьПоОтгрузке тут роли никакой не играет. Нужен ли тут “ЗадолженностьПоОтгрузке”?

        • GROOVY

          Исключите таблицу из запроса. Возможно я привел не оптимальный запрос.

  25. GarmonM

    Добрый день можно ли в данной задаче для установки блокировок при расчете Пени в запросе указывать признак ДЛЯ ИЗМЕНЕНИЯ, будет ли это корректно?

    • GROOVY

      Можно, в том случае если у регистра ЗадолженностьПоОплате будет установлен автоматический режим блокировки.

  26. uvers

    Здравствуйте, Павел.
    У меня вопрос по блокировкам:
    1с рекомендует при проведении документа по возможности обращаться к таблице документа 1 раз, т.е все необходимые данные получить одним запросом. Будут ли сняты балы если блокировку устанавливать по табличной части? Ведь по сути мы обращаемся к таблице документа дважды. Первый раз скажем при получении остатков,а второй раз при блокировке. На сколько это критично?

  27. aricsoft

    Добрый день. Павел – в задаче сказано что отсрочка платежа дается календарными днями. А как решать вопрос – если бы была фраза такая – отсрочка платежа дается в течении 14 рабочих дней? Вопрос в следующем – как правильно найти дату окончания отсрочки – неужели перебором графика работы и анализом – рабочий не рабочий ? Или есть какой то метод который позволит это сделать проще ?.

    • GROOVY

      Нужно завести календарь – регистр сведений и считать дни по нему.

  28. Екатерина

    Здравствуйте, Павел, Должен ли обязательно быть погашен счет в течении одной недели, ведь иначе документ Начисление Пени будет делать неправильные движения. Он сложит сумму из результата предыдущего документа и заново посчитанную всю задолженность контрагента. И еще , достаточно будет препроводить одну и ту же позицию документа Начисление Пени, меняя дату, или заводить на каждую дату начисления новый документ?

    • GROOVY

      Задолженность контагента складывается из долга и сумм пени. Так что все нормально.
      Документы фиксируют факт некой операции, для каждого начисления пени нужно вводить новый документ.

      • hame1e00n

        То есть ничего, что на следующей неделе можем начислить пеню как на то, что просрочили по оплате, так и на начисленную на предыдущей недели пеню? А если все-таки будет явно сказано в задаче, что нужно начислять пеню только на непроплаченные вовремя суммы, как это сделать? Добавить в регистр по взаиморасчетам измерение ПризнакПени и просто устанавливать отбор при анализе?

  29. Insp2012

    Уважаемый Павел,
    Я посмотрел Ваше изящное решение для Первого потока.
    На мой взгляд не учтена следующая стуация:
    Окончился льготный период, в течении первой штрафной недели оплат не было,
    в конце последнего дня недели начисляем пени и выясняется, что в начале этого дня поступила полная оплата. т.е. всю неделю был долг, а на момент начисления пений
    долга не стало. так, что пеней за неделю не начислено, хотя всю неделю долг висел.
    Вторая ситуация:
    во время штрафного периода проходила поэтапная оплата долга. Пени должны быть начислены за фактический долг в течении недели, а не на задолженнось, получившуюся на конец последнего дня в котором начисляется пеня. 
    Павел, мне кажется, что решение несколько упрощено.

    С уважением, Олег Кашира

    • GROOVY

      Если бы в задаче было сказано что пени начисляются на каждый день просрочки, то да, тогда Ваше замечание было бы на 100% верным.
      Но даже если мы учтем, что такая фраза в задаче есть, то я не вижу почему задача должна стать сложнее. Для выбора фактического периода просрочки и фактического долга нам нужно прикрутить таблицу с оборотами от даты прошлого начисления пени, до текущего дня.
      Не умаю что следует усложнять задачи.

      • Insp2012

        Уважаемый Павел,
        понимаю, что достаю Вас глупыми запросами во всех темах.
        Я знаю, что надо прикрутить таблицу с оборотами и посчитать остаток
        задолженности на каждый день, получить ее итог. При этом надо еще учесть
        задолженности в льготном периоде. Запрос получается несовсем тривиальным.
        Вот мне и хочется разобраться со схемой построения такого запроса.

        С уважением, Олег Кашира

      • aricsoft

        Добрый день. В задаче это может быть влоб не сказано – но Вы сами об этом говорите на 42 секунде если не ошибаюсь ))) (пени начисляются на каждый день просрочки)

  30. ShulgOlya

    Регистр Состояние счетов существенно облегчает решение задачи, спасибо =))). Есть аналогичная задача про пени 1.37 (там пени не включается в задолженность, и просрочка отсчитывается либо от даты полной отгрузки, либо от даты последнего начисления пени). Если решать по аналогии, то просто нужно завести еще регистр, но периодический, куда записывать дату начисления пени?

    • GROOVY

      Приведите, пожалуйста, текст задачи, у меня сейчас под рукой нет сборника, я отвечу подробнее. Но в целом решение мне представляется верным.

      • ShulgOlya

        Компания занимается оптовой торговлей. Взаиморасчеты с покупателями ведутся в разрезе счетов. Покупателю выставляется счет, на основании котрого далее происходит отгрузка документами «Расходная накладная», причем накладных по одному счету может быть несколько. Считается, что товар по счету в конце кондов будет отгружен полностью, а накладные могут быть только на основании счета.
        В том случае, если товар по счету отгружен полностью, а покупатель оплатил не до конца, ему насчитываются пени.
        При поступлении оплаты (документ «Приход денег») пользователь указывает счета, по которым должна быть зачтена оплата. При проведении документа в том случае, если некоторые счета были отгружены полностью, происходит начисление пеней по ним.
        Расчет пени происходит по формуле:
        «количество дней просрочки» * «% пени» * «оставшаяся сумма
        задолженности по счету».
        Просрочка отсчитывается от даты полкой отгрузки, если это первая оплата после полной отгрузки, или с момента последнего начисления пеней. Процент пеней указывается в каждом счете. В сумму задолженности начисленные пени не включаются.
        В первую очередь оплата распределяется на все начисленные пени, а потом уже на счета, начиная с самого раннего недооплаченного.
        Следует считать, что сумма оплаты в документе не превосходит задолженности этого контрагента.
        Складской учет товаров не ведется.

  31. dmnblg

    1. Расскажите пожалуйста, почему РС СостояниеСчета периодический?
    Считтаю что можно было бы обойтись обычным.

    2. В структура РН ЗадолженностьПоОплате
    Вы добавили измерение Контрагент, хотел бы проконсультироваться
    по этому поводу, т.к. довольно часто такая ситуация возникает на практике.

    Плюсы и минусы Вы описали, объём базы или скорость запросов, но вот
    что ещё меня немного тревожит, может это параноя. :)
    При такой структуре регистра может сложиться следующая ситуация:
    Измерение Контрагент — Вася, Измерение Счет — Счет № 3.
    А реквизит Контрагент в Счете № 3 — Петя.

    Всегда ведь есть документ Корректировка регистра, или Операция.
    Насколько “весомы” мои опасения?
    Может дополнительная проверка в модуле регистра не так уж страшна. :)

    3. Разве пени “капитализируется”? Мне кажется пени начисляется только
    на сумму основного долга, без накопившихся процентов.
    Для решения, как вариант, в регистр ЗадолженностьПоОплате можно
    добавить ещё один ресурс, СуммаПени. И при поступлении денег
    погашать в первую очередь пени. Правда отчеты бы сложней пришлось
    формировать.

    Подскажите правильный вариант.

    • dmnblg

      Простите за опечатки. Трудно набирать когда ваш волшебный плеер играет,
      экран не прорисовывается. :) 

      • GROOVY

        А я и без плеера иногда умею здорово опечатываться :)

    • GROOVY

      1. Можно было бы, но хотелось хранить историю изменения и менять состояние регистратором (дабы при отмене проведения возвращать в состояние “как было”).
      2. Несоответствие счета контрагенту конечно возможно, но “защиту от дурака” я делать бы на сертификации не стал. Основной плюс контрагента я вижу в блокировках.
      3. Судя по отчету: капитализируется и увеличивает долг контрагента.

  32. malecula

    Отправила отчеты по этой задаче на почту
    Хотелось бы посмотреть правильное решение :)

    • GROOVY

      Я письмо получил, отвечу до субботы, сейчас негде базу развернуть.

  33. Денис Попов

    Почему считаем что учет по товарам не ведем?
    Написано ведь, что Складской учет товаров не ведется. Т.е. в разрезе складов учитывать товары не нужно, но не сказано, что учет товаров не нужно вести вовсе.
    Слово “товар” в задании встречается несколько раз. 

    Не будет ли в данном случае это минусом на реальном экзамене..

    P.S. без учета товаров у меня на решение этой задачи ушло полтора часа… если добавить еще и учет по Товарам – то как минимум 2 часа уйдет :(.

    • GROOVY

      В отчетах товаров нет. Я считаю излишним реализовывать учет товаров. Про контроль остатков и расчет себестоимости ничего не сказано.

  34. Денис Попов

    Доработка Оперативного/НеОперативного проведения + Блокировки.
     Документ «РегистрацияЗаказаКлиента».
    Движения.СвободныеОстатки.БлокироватьДляИзменения = Истина;

    Если Режим = РежимПроведенияДокумента.Оперативный Тогда
       МоментИтогов = ‘00010101’;
    Иначе
       МоментИтогов = Новый Граница(МоментВремени(),ВидГраницы.Включая);
    КонецЕсли;
    Запрос.УстановитьПараметр(“МоментИтогов”,МоментИтогов);
     Документ «ВыдачаЗаказов».
    Запрос на получение данных разбил на два Запроса с подключением МенеджераВременныхТаблиц.
    В первый Запрос добавлено поле Склад (ТочкаВыдачи) через параметр.
    По результатам этого запроса устанавливается блокировка на Регистры ОстатковТоваров и СтоимостиТоваров.
    Во второй Запрос добавлен параметр «МоментИтогов» для реализации Оперативного/НеОперативного проведения. 
    Движения.ОстаткиТоваров.Очистить();
    Движения.СтоимостьТоваров.Очистить();
     Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
       Движения.ОстаткиТоваров.Записать();
       Движения.СтоимостьТоваров.Записать();
       МоментИтогов = ‘00010101’;
    Иначе
       МоментИтогов = Новый Граница(МоментВремени(), ВидГраницы.Исключая);
    КонецЕсли;
    Запрос.УстановитьПараметр(“МоментИтогов”, МоментИтогов);
    БлокировкаДанных = Новый БлокировкаДанных;
    ЭлементБлокировки = БлокировкаДанных.Добавить(“РегистрНакопления.ОстаткиТоваров”);
    ЭлементБлокировки.ИсточникДанных = ДанныеДляБлокировки;
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных(“Склад”, “Склад”);
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных(“Номенклатура”, “Номенклатура”);
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки = БлокировкаДанных.Добавить(“РегистрНакопления.СтоимостьТоваров”);
    ЭлементБлокировки.ИсточникДанных = ДанныеДляБлокировки;
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных(“Номенклатура”, “Номенклатура”);
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    БлокировкаДанных.Заблокировать();
     Создание Отчетов
    С отчетами по Остаткам и по Продажам проблем не возникло.
    А вот с отчетом по Заказам в пути было не просто.
    Реализовал следующим образом:
    Никаких изменений в структуру регистров вносить не стал.
    В справочник Номенклатуры добавил два реквизита: Вес и Объем.
    Список заказов в пути получаю из СрезаПоследних регистра сведений.
    Присоединяю к нему данные табличной части Товары документа Заказов и сохраняю во временную таблицу.
    Затем во временную таблицу получаю данные по остаткам и стоимости товаров.
    В следующем запросе соединяю данные первой и второй временных таблиц и рассчитываю себестоимость.

  35. Денис Попов

    Спасибо, Павел, за решение.
    Есть несколько вопросов.

    1. О выдаче товаров.
    Нет проверки на наличие данного заказа именно в этой точке выдачи. 
    В таком случае товар может спокойно уйти в минус на одном складе и остаться в плюсе на другом.

    2. Перемещение.
    На мой взгляд более верным будет формировать движения о Приеме товаров в событии ОбработкаПроведения, а не командой… в этом случае не будет проблем с многочисленным нажатием на эту кнопку, а также не будет проблем при простом перепроведении документа (в вашем случае движения по приему будут затерты).
    Можно добавить дополнительный реквизит “ДатаПриемаВТочкеВыдачи”. По этой дате и формировать движения о приеме. Если дата пуста – значит приема еще не было.

    3.  В общем.
    Не попали ли мы при таком решении (смущает частое получение данных не из Регистров, а из таблицы Документов) под ошибку: “Получение расчетных данных не из регистра…”: цена 3 балла?

    В любом случае вы потратили на эту задачу (если прибавить время на создание отчетов и включение блокировок) около 90 минут. Весьма похвально! 

    • GROOVY

      1. Согласен.
      2. Согласен. Но я не хотел регистрировать изменение самого документа.
      3. Неудачная задача, каюсь еще раз. Я ориентировался на ввод данных в документах на основании. Задача в более расширенном варианте функционирует в одном из реальных магазинов, но контроль заказов и остатков товаров почти полностью лежит на менеджерах, единственный момент это резервирование и контроль резервов автоматизирован. Но к сертификации это конечно не имеет отношения.

  36. Manase940N

    День добрый! Решил описать блокировки и оперативное проведение документов для эталонного решения задания №9, чтобы получить доступ к бонусу :).
    В документе РегистрацияЗаказаКлиента модуль процедуры ОбработкаПроведения будет таким:
    <code>
     
    Процедура ОбработкаПроведения(Отказ, Режим)
                   
                    Движения.СвободныеОстатки.БлокироватьДляИзменения = Истина;
                   
                    Запрос = Новый Запрос;
                    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
                    Запрос.Текст = “ВЫБРАТЬ
                                   |              РегистрацияЗаказаКлиентаСписокТоваров.Номенклатура КАК Номенклатура,
                                   |              СУММА(РегистрацияЗаказаКлиентаСписокТоваров.Количество) КАК Количество,
                                   |              СУММА(РегистрацияЗаказаКлиентаСписокТоваров.СуммаПродажи) КАК СуммаПродажи
                                   |ПОМЕСТИТЬ ДокТЧ
                                   |ИЗ
                                   |              Документ.РегистрацияЗаказаКлиента.СписокТоваров КАК РегистрацияЗаказаКлиентаСписокТоваров
                                   |ГДЕ
                                   |              РегистрацияЗаказаКлиентаСписокТоваров.Ссылка = &Ссылка
                                   |
                                   |СГРУППИРОВАТЬ ПО
                                   |              РегистрацияЗаказаКлиентаСписокТоваров.Номенклатура
                                   |
                                   |ИНДЕКСИРОВАТЬ ПО
                                   |              Номенклатура
                                   |;
                                   |
                                   |////////////////////////////////////////////////////////////////////////////////
                                   |ВЫБРАТЬ
                                   |              ДокТЧ.Номенклатура,
                                   |              ДокТЧ.Количество
                                   |ИЗ
                                   |              ДокТЧ КАК ДокТЧ”;
                    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
                    РезультатЗапроса = Запрос.Выполнить();
                   
                    Выборка = РезультатЗапроса.Выбрать();
                   
                    Движения.СвободныеОстатки.Записывать = Истина;
                    Пока Выборка.Следующий() Цикл
                                   Движение = Движения.СвободныеОстатки.Добавить();
                                   Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                                   Движение.Период = Дата;
                                   Движение.Номенклатура = Выборка.Номенклатура;
                                   Движение.Количество = Выборка.Количество;
                    КонецЦикла;
                   
                    Движения.Записать();
                   
        Запрос.Текст = “ВЫБРАТЬ
                       |          СвободныеОстаткиОстатки.Номенклатура.Представление,
                       |          СвободныеОстаткиОстатки.КоличествоОстаток
                       |ИЗ
                       |          РегистрНакопления.СвободныеОстатки.Остатки(
                       |                                         &МоментИтогов,
                       |                                         Номенклатура В
                       |                                                         (ВЫБРАТЬ
                       |                                                                         ДокТЧ.Номенклатура
                       |                                                         ИЗ
                       |                                                                         ДокТЧ КАК ДокТЧ)) КАК СвободныеОстаткиОстатки
                       |ГДЕ
                       |          СвободныеОстаткиОстатки.КоличествоОстаток < 0”;
     
                    Если Режим = РежимПроведенияДокумента.Оперативный Тогда
                                   МоментИтогов = Дата(‘00010101’);
                    Иначе
                                   МоментИтогов = Новый Граница(МоментВремени(), ВидГраницы.Включая);
                    КонецЕсли;
                    Запрос.УстановитьПараметр(“МоментИтогов”, МоментИтогов);
                   
                    РезультатЗапроса = Запрос.Выполнить();
                   
                    Если НЕ РезультатЗапроса.Пустой() Тогда
                                   Отказ = Истина;
                                  
                                   Выборка = РезультатЗапроса.Выбрать();
                                   Пока Выборка.Следующий() Цикл
                                                   Сообщение = Новый СообщениеПользователю;
                                                   Сообщение.Текст = “Товар: ” + Выборка.НоменклатураПредставление + “, нехватает: ” +
                                                                   (-Выборка.КоличествоОстаток);
                                                   Сообщение.Сообщить();                         
                                   КонецЦикла;
                    КонецЕсли;
                   
                   
                    Движения.СостояниеЗаказов.Записывать = Истина;
                   
                    Движение = Движения.СостояниеЗаказов.Добавить();
                    Движение.Период = Дата;
                    Движение.Заказ = Ссылка;
                    Движение.Состояние = Перечисления.СостоянияЗаказов.Новый;
                   
    КонецПроцедуры
    </code>
    В документе ВыдачаТоваров модуль процедуры ОбработкаПроведения будет таким:
    <code>
     
    Процедура ОбработкаПроведения(Отказ, РежимПроведения)
                   
                    Запрос = Новый Запрос;
                    Запрос.Текст = “ВЫБРАТЬ
                                   |              РегистрацияЗаказаКлиентаСписокТоваров.Номенклатура,
                                   |              СУММА(РегистрацияЗаказаКлиентаСписокТоваров.Количество) КАК Количество,
                                   |              СУММА(РегистрацияЗаказаКлиентаСписокТоваров.СуммаПродажи) КАК СуммаПродажи,
                                   |              ВыдачаЗаказовЗаказы.Заказ
                                   |ПОМЕСТИТЬ ОтгружаемыеТовары
                                   |ИЗ
                                   |              Документ.ВыдачаЗаказов.Заказы КАК ВыдачаЗаказовЗаказы
                                   |                              ЛЕВОЕ СОЕДИНЕНИЕ Документ.РегистрацияЗаказаКлиента.СписокТоваров КАК РегистрацияЗаказаКлиентаСписокТоваров
                                   |                              ПО ВыдачаЗаказовЗаказы.Заказ = РегистрацияЗаказаКлиентаСписокТоваров.Ссылка
                                   |ГДЕ
                                   |              ВыдачаЗаказовЗаказы.Ссылка = &Ссылка
                                   |
                                   |СГРУППИРОВАТЬ ПО
                                   |              РегистрацияЗаказаКлиентаСписокТоваров.Номенклатура,
                                   |              ВыдачаЗаказовЗаказы.Заказ
                                   |;
                                   |
                                   |////////////////////////////////////////////////////////////////////////////////
                                   |ВЫБРАТЬ
                                   |              ОтгружаемыеТовары.Номенклатура,
                                   |              ОтгружаемыеТовары.Количество,
                                   |              ОтгружаемыеТовары.СуммаПродажи КАК СуммаПродажи,
                                   |              ОстаткиТоваровОстатки.КоличествоОстаток,
                                   |              СтоимостьТоваровОстатки.СтоимостьОстаток,
                                   |              ОтгружаемыеТовары.Заказ КАК Заказ
                                   |ИЗ
                                   |              ОтгружаемыеТовары КАК ОтгружаемыеТовары
                                   |                              ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(
                                   |                                                             &МоментИтогов,
                                   |                                                             Номенклатура В
                                   |                                                                             (ВЫБРАТЬ
                                   |                                                                                            ОтгружаемыеТовары.Номенклатура
                                   |                                                                             ИЗ
                                   |                                                                                            ОтгружаемыеТовары КАК ОтгружаемыеТовары)) КАК ОстаткиТоваровОстатки
                                   |                              ПО ОтгружаемыеТовары.Номенклатура = ОстаткиТоваровОстатки.Номенклатура
                                   |                              ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьТоваров.Остатки(
                                   |                                                             &МоментИтогов,
                                   |                                                             Номенклатура В
                                   |                                                                             (ВЫБРАТЬ
                                   |                                                                                            ОтгружаемыеТовары.Номенклатура
                                   |                                                                             ИЗ
                                   |                                                                                            ОтгружаемыеТовары КАК ОтгружаемыеТовары)) КАК СтоимостьТоваровОстатки
                                   |                              ПО ОтгружаемыеТовары.Номенклатура = СтоимостьТоваровОстатки.Номенклатура
                                   |ИТОГИ
                                   |              СУММА(СуммаПродажи)
                                   |ПО
                                   |              ОБЩИЕ,
                                   |              Заказ”;
                                                                     
                    Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
                                   Движения.ОстаткиТоваров.Записывать = Истина;
                                   Движения.СтоимостьТоваров.Записывать = Истина;
                                   Движения.ОстаткиТоваров.Очистить();
                                   Движения.СтоимостьТоваров.Очистить();
                                   Движения.Записать();
                                   МоментИтогов = Дата(‘00010101’);
                    Иначе
                                   МоментИтогов = МоментВремени();
                    КонецЕсли;
                    Запрос.УстановитьПараметр(“МоментИтогов”, МоментИтогов);
     
                    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
                    РезультатЗапроса = Запрос.Выполнить();
                   
                    Движения.ОстаткиТоваров.Записывать = Истина;
                    Движения.СтоимостьТоваров.Записывать = Истина;
                    Движения.Продажи.Записывать = Истина;
                    Движения.СостояниеЗаказов.Записывать = Истина;
                   
                    Блокировка = Новый БлокировкаДанных;
                    ЭлементОстатки = Блокировка.Добавить(“РегистрНакопления.ОстаткиТоваров”);
                    ЭлементОстатки.ИсточникДанных = РезультатЗапроса;
                    ЭлементОстатки.ИспользоватьИзИсточникаДанных(“Номенклатура”, “Номенклатура”);
                    ЭлементОстатки.Режим = РежимБлокировкиДанных.Исключительный;
                    ЭлементСтоимость = Блокировка.Добавить(“РегистрНакопления.СтоимостьТоваров”);
                    ЭлементСтоимость.ИсточникДанных = РезультатЗапроса;
                    ЭлементСтоимость.ИспользоватьИзИсточникаДанных(“Номенклатура”, “Номенклатура”);
                    ЭлементСтоимость.Режим = РежимБлокировкиДанных.Исключительный;
                    Блокировка.Заблокировать();
     
                    СебестоимостьИтого = 0;
                    КолЗаказов = 0;
                   
                    ВыборкаОбщиеИтоги = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                    Пока ВыборкаОбщиеИтоги.Следующий() Цикл
                                  
                                  
                                   ВыборкаИтоги = ВыборкаОбщиеИтоги.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                                  
                                   Пока ВыборкаИтоги.Следующий() Цикл
                                                  
                                                   Выборка = ВыборкаИтоги.Выбрать();
                                                  
                                                   Пока Выборка.Следующий() Цикл
                                                                   Движение = Движения.ОстаткиТоваров.ДобавитьРасход();
                                                                   Движение.Период = Дата;
                                                                   Движение.Номенклатура = Выборка.Номенклатура;
                                                                   Движение.Склад = ТочкаВыдачи;
                                                                   Движение.Количество = Выборка.Количество;
                                                                  
                                                                  
                                                                   Движение = Движения.СтоимостьТоваров.ДобавитьРасход();
                                                                   Движение.Период = Дата;
                                                                   Движение.Номенклатура = Выборка.Номенклатура;
                                                                   Если Выборка.Количество = Выборка.КоличествоОстаток Тогда
                                                                                  Себестоимость = Выборка.СтоимостьОстаток;
                                                                   Иначе
                                                                                  Себестоимость = Выборка.Количество / Выборка.КоличествоОстаток * Выборка.СтоимостьОстаток;
                                                                   КонецЕсли;
                                                                   Движение.Стоимость = Себестоимость;
                                                                  
                                                                   СебестоимостьИтого = СебестоимостьИтого + Себестоимость;
                                                                  
                                                   КонецЦикла; 
                                                  
                                                   Движение = Движения.СостояниеЗаказов.Добавить();
                                                   Движение.Период = Дата;
                                                   Движение.Заказ = ВыборкаИтоги.Заказ;
                                                   Движение.Состояние = Перечисления.СостоянияЗаказов.Завершен;
                                                  
                                                   КолЗаказов = КолЗаказов + 1;
                                                  
                                   КонецЦикла;
                                  
                                   Движение = Движения.Продажи.Добавить();
                                   Движение.Период = Дата;
                                   Движение.ТочкаВыдачи = ТочкаВыдачи;
                                   Движение.КолЗаказов = КолЗаказов;
                                   Движение.Себестоимость = СебестоимостьИтого;
                                   Движение.Выручка = ВыборкаОбщиеИтоги.СуммаПродажи;
                                  
                    КонецЦикла;
    КонецПроцедуры
    </code>
    В документах ПоступлениеТоваров и ПеремещениеТоваров изменения не нужны.

  37. bol

    я вижу 2 регистра: регистр накопления оборотный (измерение- Счет, ресурс Задолженность)и регистр сведений(измерение- Счет, ресурс- Состояние, ДатаПоследнейОтгрузки)  Что упускаю?

    • GROOVY

      Наш долг перед покупателем упускаете. А так правильно. Состояние зачем в регистре?

  38. Мария

    Если это классический партионный учет, то мне кажется должен быть РН(остатки) Взаиморасчеты  измерения счет и документы, ресурс сумма. Документы расходная и пени увеличивают задолженность, а ПКО уменьшает.  

  39. zse63

    По-моему 3 регистра:
    1) регистр накопления ТекущаяЗадолженностьПоТовару Измерение – Счет, Ресурс – Задолженность (Регистраторы – Расходная) – По списанию суммы товара при поступлении
    2)Регистр накопления  ТекущаяЗадолженностьПоОплате
    Измерение – Счет, Ресурс – Задолженность (Регистраторы – ПоступлениеДенег). По списанию задолженности при оплате.
    3) Непериодический Регистр сведений (Измерение – Счет, Ресурс – дата поной отгрузки) 

  40. Serg

    Тоже пока остановился на двух регистрах накопления ОстаткиПоСчетам(регистратор Счет и Расходная накладная) и Взаиморасчеты(регистраторы РасходнаяНакладная, ПриходДенег, Пени). В обоих Измерение Счет и Ресурс Сумма. Но во Взаиморасчетах еще добавил измерение Контрагент. Т.к. при оплате надо будет отбирать счета по конкретному покупателю. Пока последнюю отгрузку проверяю по Регистратору в регистре ОстаткиПоСчетам, но мне кажется что как-то неправильно это. Как вариант, можно попробовать добавить еще непериодический регистр сведений (регистратор Расходная накладная) куда записывать полностью отгруженные счета. Измерения Счет, ПроцентПени и ДатаПолнойОтгрузки. А остаток суммы при расчете пени брать из Взаиморасчетов. Вроде бы и проще будет чем искать последнюю отгрузку по регистратору…

    • GROOVY

      Про Контрагента: Это правильная мысль в случае построения запросов с точки зрения скорости. Не очень правильная с точки зрения объема БД.
      И совсем правильная в том случае когда деньги без привязки в заказам могут быть (не наш случай).

      Это просто комментарий.

      • Serg

        По условию задачи: “В документе «Приход денег» указывается только покупатель и сумма”. Если регистр Взаиморасчеты делать без учета Контрагента, то тогда надо табличную часть делать для подбора Счетов конкретного покупателя. И их уже закрывать по дате выписки Счета. А иначе как отобрать счета по Покупателю?

      • Денис Попов

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

        • GROOVY

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

  41. Денис Попов

    не совсем понял вот это:
    “3. Нет контрагентов, покупателей, поставщиков, сотрудников и пр…”.
    А как же Покупатель, который вводится в документе “ПриходДенег”.. ведь в этом документе не указываются счета, по которым идет оплата.. распределение оплаты по счетам должно проходить автоматом.. т.е. разрез по Покупателям, на мой взгляд, необходим;

    “4. Счет не может быть сверхотгружен, т.е. нет необходимости отслеживать остаток при проведении расходной для целей контроля сверхпродажи.”
    Для меня данная фраза противоречива… Если счет не может быть сверхотгружен => необходимо запретить пользователю сверхотгружать счет.. т.е. контроль наоборот необходим. 

    Поясните данные пункты подробнее пожалуйста. 

    • GROOVY

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

      4. Оплата без привязки к счетам/заказам у нас не регистрируется. Не стоит тратить время на эту проверку. Априори считаем, что больше чем должны нам никто денег не принесет.

      • Денис Попов

        при чем здесь оплата? отгрузка – это ведь реализация (документ РасхдоднаяНакладная)… сверхотгружен, как я понимаю, это когда по счету 100 рублей, а сумма по нескольким реализациям (привязанным к этому счету) на 150 рублей.
        P.S.
        я так понимаю, что при чтении заданий 1С нужно обладать определенным опытом, дабы иметь способность “додумать” что имеется ввиду между строк… :( 
        для меня на данный момент это очень не просто… с нетерпением жду вашего решения первого ДЗ… 

  42. 7on

    Долго не мог понять, почему обходимся без контрагентов, пока не осознал, что покупатель не придет оплачивать “не свой” счет.

    Первым я бы создал непериодический регистр сведений “Счет” (или “Заявка”) , где одно измерение “Счет” типа “Документ.Счет” и ресурсы “Сумма счета”, “Процент пени”, “Дней просрочки”. Регистраторами были бы “Документ.Счет”.

    Вторым  – регистр накопления “Задолженность” вида “Остатки”. Измерение: “Счет” типа “Документ.Счет”; Ресурс: “Сумма”; Регистраторы: “Документ.Реализация” , “Документ.Пени” (оба увеличение задолженности), “Документ.ПриходДенег” (уменьшение задолженности). 

    Третьим – периодический по регистратору регистр сведений “Состояние счета” с измерением “Счет”, ресурсом “Состояние счета” (перечисление со значениями “Выписан, не отгружен полностью”, “отгружен полностью”, “оплачен полностью”) и  регистраторами “Документ.Реализация” (если сумма прихода по регистру “Задолженность” >= значения ресурса “Сумма” регистра “Счет”, то “отгружен полностью”) и “Документ.ПриходДенег” (если остаток по регистру “Задолженность” <= 0, то “оплачен полностью”)

    Как такой вариант?

  43. Borisuch

    Добрый день, уважаемые господа! Попробую составить структуру регистров и перечень подзадач.
    И так: Мы имеем три «товарных» документа (счет, расходная накладная и расчет пени).
    Мы имеем один денежный документ на приход денег.
    Регистров накопления должно быть два. Один, назовем его «Остатки по счетам» с видом регистра остатки и обороты, ресурсами Счет, измерением Сумма, отражает расход товара. Другой регистр накопления «Задолженность» будет с такими же параметрами
    Подзадачи:
    1. Приход суммы товара в РН «Остатки по счетам» формируется при проведении счета. Расход – по мере выписки расходных накладных
    Эти же самые накладные формируют приход (увеличение задолженности ) в РН «Задолженность», а денежный приходник – списание (уменьшение задолженности) в РН «Задолженность»
    2. Проверка отрицательных остатков в накладных. На основании счета выписывается накладная, сумма которой автоматически проставляется из расчета «счет минус всех накладных. При самостоятельном заполнении суммы обработка проведения сравнивает прописанную сумму с остатком суммы в РН «Остатки по счетам»
    3. Обработка проведения денежного приходника должна проверить превышение суммы приходника  над задолженностью по самому старому (отбор по дате) счету и в случае превышения сумму этого превышения относить на счет следующего менее старого по дате счета.
    4. По кнопке пеня в документе расчет пеней должны отразиться те счета, у которых на дату, следующей за датой оплаты имелся остаток по РН «Задолженность». Каждый отражаемый счет должен отображать   эту самую задолженность и рассчитанную сумму пени. НО по моему разумению, одновременно надо проверять, был ли документ расчета пени на данный счет ранее, если был, то сумму задолженности нужно брать текущую, а количество дней за минусом раннее бравшуюся по предыдущим документом расчета пени. Например, по счету 1 через 7 дней просрочки насчитали пени. Ура! Еще через семь дней сумма просрачки будет равна остатку на текущий день, а время просрочки равна всему промежутку времени просрочки минус суммами времени предыдущих документов Иначе вместо пеней приедут боксеры учить правильному расчету штрафных санкций. Вот как-то так с регистрами
    Вопрос не по теме: публикация решения второй задачи планируется? А то не всё получилось.

  44. Sokol

    Здравствуйте, предлагаю следующую структуру регистров:
    Поставки, измерения – счет, номенклатура, ресурс – количество. Регистраторы: счет (приход) и расходная накладная (расход)
    Долги, измерения – покупатель, счет, ресурс – сумма. Регистраторы расходная накладная (приход) и  приход денег (расход).
     

  45. Serg

    Добрый день. 
    Возник вопрос. Судя по условию задачи авансов по счетам нет? Т.е. сделать приход денег на пустой счет нельзя? И тогда Расходной накладной смотрим была ли оплата по счету, чтоб ее зачесть или всю отгрузку писать в долг?

    • GROOVY

      Авансов нет. Приход денег “просто так” делать нельзя.
      Вторую часть вопроса не понял, уточните.

      • Serg

        Имел ввиду, проверять или нет ранее поступившую оплату счета (ведь  оплатить  могли  сразу же после выписки счета, не дожидаясь отгрузки) при проведении РН, но тут скорее всего надо только проверять оставшуюся неотгруженную сумму по счету, чтобы не отгрузить лишнего. А оплаченность счета будет проверять уже документ Пени.

  46. Manase940N

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

    • GROOVY

      Очень много регистров :)

      Контрагент фигурирует в каждом счета. Если Вам нужен еще один разрез (укрупненный) по контрагентам, можно рассмотреть и такой вариант.

Комментарии закрыты