Базовый курс. Занятие №9

Заключительное занятие по второму блоку базового курса.

Необходимо изучить следующие главы.
Глава 11. Запросы.
Глава 12. Условное проведение.
Глава 13. Планы видов характеристик.
Глава 14. Создание отчетов.
Глава 15. Обработки.

Также нужно выполнить домашнее задание, текст которого доступен на странице.

Задание необходимо выполнять в ИБ после предыдущего ДЗ.

В этой же теме необходимо написать отчет о выполнении задания.

ps. Участники курса без доступа в мастер-группу отчитываться по домашним заданиям не могут.

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

Если не активировали токен — посмотрите видео-инструкцию (видео N5)

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

комментариев 109 на “Базовый курс. Занятие №9”

  1. Майор 25.05.2011 в 20:53

    Обратная связь по второму блоку:
    1) Теория по регистрам, до этого не на столько детально изучал. Создание печатных форм.
    2) Пока по-прежнему = запросы, нет ещё прозрачности и полного понимания чего руки творят….
    3) Скорее всего – создание отчётов.

  2. По поводу трех вопросов для Золушки.
    Порой действительно ощущаю себя Золушкой,  вставая (о ужас!) каждый день в 5 часов, чтобы (хотя бы час) позаниматься.  Даже в отпуске не изменял этому режиму.
    Ну это так, лирика.
    Материала очень много, и он – очень интересный. С одной стороны – практически все затрагиваемые вами темы – мне, как минимум, в общих чертах, знакомы (за исключением тех,  которые отличают 8.2 от 8.1). С другой стороны – вы порой раскрываете эти темы до такой глубины, на которую я не заныривал.
    Основные затруднения – нехватка времени. Все остальное – преодолимо.
    К сожалению,  не могу сейчас ответить на вопрос – какую тему осветить подробнее. Для этого изучаемая информация должна улечься в голове, а я едва успеваю ее (информацию) туда (в голову) запихивать. :)

  3. Добрый день!
    Прошу прощения за опоздание.
    Задание решено.

    Написана процедура «ОбработкаПроведения» документа «РеализацияТоваров».
    Особых трудностей не возникло, т.к. подобный пример разбирался в лекциях. Но я пошел несколько иным путем – через цикл, а не через вложенный запрос – т.к. не смог справиться с тем, что (из-за проверки качества) результат вложенного запроса получался не список, а таблица из 2-х колонок.
    Для того, чтобы отделить пользователей, которым разрешено проведение реализации, не взирая на отрицательные остатки, в справочник пользователей ввел соответствующий реквизит.
    http://paste.org.ru/?q33ago

    Создал форму списка документа «РеализацияТоваров», а на ней – кнопку «Провести безусловно». В модуле формы списка написал 2 небольшие процедуры:
    http://paste.org.ru/?9h0ksl
    В модуле объекта документа «РеализацияТоваров» также сделана небольшая доработка:
    http://paste.org.ru/?j2grvh
    Ну а проверить переменную мПровестиБезусловно в процедуре «ОбработкаПроведения» документа «РеализацияТоваров», и, в том случае, если она = Истина, обойти проверку на отрицательные остатки – дело техники.

    Создан оборотный регистр накопления «Продажи». Обеспечено его движение при проведении документа «РеализацияТоваров». Трудностей не возникло.

    Создан регистр остатков «ВзаиморасчетыСКонтрагентами».
    Создан документ «Выписка».
    Согласно заданию, в табличной части данного документа – 2 суммовых колонки – «СуммаРасход» и «СуммаПриход».
    В модуле формы документа «Выписка» сделана элементарная проверка при вводе сумм – если введена сумма расхода, то нельзя ввести сумму прихода. И наоборот – если введена сумма прихода, то нельзя ввести сумму расхода:
    http://paste.org.ru/?ofaby9
    Обеспечено движение регистра «ВзаиморасчетыСКонтрагентами» при проведении документов «Выписка», «РеализацияТоваров», «ПоступлениеТоваров».

    Переименован документ «ПоступлениеТоваров» в документ «ПоступлениеТоваровУслуг».
    Переименован документ «РеализацияТоваров» в документ «РеализацияТоваровУслуг».
    Переименование, в принципе, было необязательно, но так более красиво с точки зрения логики.
    Проверена конфигурация на предмет выявления и замены ссылок на старые наименования документов.
    В обоих документах добавлены табличные части «Услуги».
    На формах обоих документов добавлены закладки «Услуги».
    Процедуры обработки проведения обоих документов переписаны с учетом табличных частей «Услуги».

    Для поддержки реализации операций покупки/продажи наборов сделано следующее:
    – В справочнике «Номенклатура» создана табличная часть «Наборы».
    – В модуле формы сделана проверка – если элемент справочника не Набор, то табличная часть «Наборы» очищается и становится недоступной:
    http://paste.org.ru/?b5midr
    – Изменена процедура «ОбработкаПроведения» документа «ПоступлениеТоваровУслуг»
    http://paste.org.ru/?k37cci
    – Изменена процедура «ОбработкаПроведения» документа «РеализацияТоваровУслуг»
    http://paste.org.ru/?bzhvps

    Создан отчет «Долги по менеджерам».

    Создан отчет «Прогнозируемый финансовый результат».

    Создан отчет «Рейтинг менеджеров».

  4. Не совсем успеваю, поэтому задержка. Задание выполнил. После 7.7 никак не привыкну к синтаксис помощнику, отсюда дополнительный расход времени.

  5. С опозданием отчитываюсь о выполнении задания (был в отъезде). Движение Реализации по регистру остатков работает с проверкой остатков по новому алгоритму для 8.2. Проверка отключается для пользователя с соотв. признаком в справочнике Пользователи. Сообщение об ошибках отрабатывает всегда с указанием места ошибки. Кнопка “Провести без контроля” работает, но делает движение только по регистру остатков (другие регистры пока не участвуют). Создан РН.Продажи (оборотный) и движения по нему документов, в т.ч. документа Выписка. В поступлениях и реализациях учитывается признак номенклатуры – услуга. В справочнике Номенклатура добавлена ТЧ.СоставНабора. Пока не придумал как реализовать устойчивость – пожалуй самый непонятный момент этого ДЗ для меня. Движения по регистрам наборов реализовано. Отчеты не вызвали сложности, сделал на СКД. Единственное по отчету Рейтинг менеджеров не удалось красиво сделать отборы по периоду, но это больше вопрос по СКД. Участвуют две таблицы итогов, соответственно параметров получается 3: начало и конец периода – для одно й таблицы и период – для другой. Пока не удалось в СКД сделать, чтобы пользователь выбирал период единожды.
    Поскольку отчитываюсь с опозданием, надеюсь ответы на свои вопросы найду в решении этого ДЗ.

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

    • К сожалению, конкретной книги по проектированию подсказать не могу.


  6. Я с задержкой, но не подглядываю. Еще, заметил, что со временем в каждом последующем уроке количество комментариев уменьшается.
    Проведение документа реализации сделал двумя процедурами – “БесусловноеПроведение”, в ней документ проводится по табличной части и “ОбработкаПроведения”, в которой сначала документ проводится безусловно (вызывается упомянутая процедура), а затем проверяются остатки на минусы, и если они имеются, производится откат. Обработка “БезусловноеПроведение” вызывается также из списка по кнопке “Провести без контроля”. Заметил, что при подобном проведении (вне обработки проведения) не устанавливается свойство “Проведен”, пришлось его ставить вручную и дополнительно проводить запись документа, что, по моему мнению, криво, но умнее пока не придумал. Отключение контроля – булевый реквизит в справочнике пользователей.
    Заполнение регистра “Продажи” производится также в процедуре “БезусловноеПроведение”, менеджер выдергивается левым соединением по контрагенту и срезу последних на дату документа.
    Заполнение регистра “Взаиморасчеты” производится одной записью по контрагенту и сумме по документу.
    Наборы реализовал табличной частью справочника номенклатуры. Пришлось значительно усложнить процедуры для проведения документа реализации и использовать пакетные запросы: 1. Собираю в табличной части всю номенклатуру, вид которой “Набор”. 2. Делаю левое соединение с табличной частью каждого элемента справочника-набора, таким образом получаю разворот по составляющим набора, при этом количество в документе и в наборе перемножается, затем объединяю полученный список с номенклатурой из табличной части документа, вид которой “Товар”. 3. Группирую полученный список по номенклатуре, чтобы не было дублей. 4. Делаю левое соединение с остатками по номенклатуре для выявления отрицательных позиций.
    Для устойчивости набора использовал тот же метод, что и с единицей – проверка на наличие движений и запрет изменения карточки номенклатуры, если движения были.
    Отчеты все простые. Долги по менеджерам – ВзаиморасчетыОстатки Левое Соединение МенеджерыКонтрагентовСрезПослених. Прогнозируемый финансовый результат – ОстаткиНоменклатурыОстатки и два Левых Соединения с ЦеныНаТоварыСрезПоследних, одно для цен закупок, другое для цен продаж, условие на ВидЦены включено в скобки среза последних. Рейтинг менеджеров – ПродажиОбороты Левое Соединение ВзаиморасчетыОстатки, сортировка по разнице между оборотом и остатком по контрагенту.
    1. Что нового. В целом, тема второго блока мне была известна, но несмотря на большое количество знакомой информации, здесь раскрыто множество неусвоенных ранее нюансов, а также, что очень важно, мои знания постепенно приводятся в порядок, выстраиваются в некую систему.
    2. Затруднения. План видов характеристик, преодолеваю как и всегда – обстоятельным конспектированием и возвращением к конспекту при необходимости.
    3. Тема СКД освещена, на мой взгляд, крайне поверхностно. Не очень, я считаю, правильно, выносить бОльшую массу информации по СКД в продвинутый курс. Также, считаю важным в плане преподавания, создать мастер-группы по построителю отчетов и механизму универсального отчета в типовых и отраслевых конфигурациях – они довольно часто встречаются в повседневной работе, а учитывая медлительность разработки отраслевых решений, то еще долго с ними жить.

    • >Я с задержкой, но не подглядываю. Еще, заметил, что со временем в каждом последующем уроке количество комментариев уменьшается.
      Практически естественный отбор :)
      > дополнительно проводить запись документа, что, по моему мнению, криво, но умнее пока не придумал
      Это правильное решение. В платформе движения по регистру и признак “Проведен” не связаны между собой.

      Пожелание по СКД записали. Что касается “Универсального отчета” на построителе, то все же пока нет планов его рассматривать.

  7. Сделано, но…

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

    Очень много угробил времени на поиски возможности отфильтрофать виртуальную таблицу остатков по 2 измерениям. Ни на ИТС , ни в помошнике не нашел использованной Вами конструции:
    (Номенклатура, Качество) в (<запрос>). Что бы обойти последствия фильтрации по 1 измерению, использовал 2 условия в связке таблиц “вышестоящего” запроса.
    Опять таки же вопрос возникает, а где эта конструкция описана? Или это то, что передается из уст в уста.

    Итак, остается вопрос: нужно ли свое решение “подгонять” под Ваше, что бы в последующих ДЗ можно было его использовть? Или лучше для нового ДЗ брать Ваше последнее решение?

    • Решение не требуется подгонять под решение преподавателя. Разрабатывайте следующие ДЗ в Вашей же базе.
      Базу преподавателя, следует брать за основу, только если чувствуете, что в своем решении Вы кардинально ошиблись, либо вообще не получилось справиться с заданием.

      Что касается конструкции “В”, то различные варианты ее синтаксиса описаны во встроенной справке:
      Встроенный язык – Работа с запросами – Синтаксис текста запросов – Использование выражений в языке запросов – Логические выражения – В – оператор проверки совпадения значения.

      • Про  конструкцию “… В …”:
        В справке по указанному Вами пути( кстати, возможно как-то получать просто ссылку  на подобные вещи( в справке, синтаксис-помошнике, диске ИТС)  а не указанием пути) написано, в стиле “1С”, очень аккуратно. Придерживаясь SQL’ного синтаксиса, одно значение в <чем-то>. А Вашего примера со скобками(и несколькими значениями) там нет. Поэтому у меня и возникает состояние “собаки”: интуитивно понимаю какой результат получу, а как работает нет.

        • Нашел упоминание этого формата на ИТС : Руководство разработчика / Глава 8 / в самом конце пункта 8.2.17.3  “параграф” называется “Использование операции В (НЕ В) по нескольким полям” . Но только упоминание! Не описан механизм как это работает.
           

          • Значит, механизм документирован :)
            В продвинутом курсе мы рассматриваем множество вариантов синтаксиса вариантов оператора “В”.

            • Хорошо, буду ждать продвинутого. А сейчас буду воспринимать эту конструкцию как левое соединение по нескольким полям.

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

  8. Создал подчиненный справочник СоставНабора с возможностью выбора только номенклатуры с типом “товар”.
    В документы Поступление и Реализация добавлена табличная часть ТМЦ куда записываются товары из доумента и части комплектов. Движения по регситру Остатки номенклатуры делаются по этой ТЧ.
    Контроль остатков при проведении документа Реализация сделан как в видеоуроке.
    С отчетами проблем не возникло.
    Вторая часть оказалось очень интересной и полезной.
    Создал подчиненный справочник СоставНабора с возможностью выбора только номенклатуры с типом “Товар”. В документы Поступление и Реализация добавлена табличная часть ТМЦ, куда записываются товары из документа и части комплектов. Движения по регистру “Остатки номенклатуры” делаются по этой ТЧ. Контроль остатков при проведении документа Реализация сделан как в видеоуроке.С отчетами проблем не возникло.
    Вторая часть оказалось очень интересной и полезной.

  9. S. Bashutin 22.05.2011 в 23:08

    Ну и самое главное, ответы на три заветных вопроса :)
    1) Этот блок для меня был особенно интересным. Для меня оказалось очень полезной информация из блока “Условное проведение” и “Запросы”.
    2) Наибольшие затруднения были связаны с 9 домашним заданием. На мой взгляд по сложности оно очень резко отличалось от 8-го. Например, 8-мое задание я сделала за полтора часа, а 9-ое задание я делал не менее 9 часов точно:) И связано это прежде всего с малым количеством опыта работы с запросами, плюс существует всё-таки некоторая неразбериха в голове по поводу типов соединения таблиц. Помогло со всем разобраться перепросмотр блока “Запросы”+ рабочая тетрадь.
    3) Я думаю всем слушателем курса будет интересно услышать дополнительно про ПВХ. Особенно если вернуться к решению задания 9 и предположить, что нам бы потребовалось настроить несколько различных настроек для пользователя и так что бы их можно было интерактивно менять в форме элемента пользователя. :)
    P.S.: Чем дальше изучаю курс, тем больше он мне нравится :) Спасибо!:)

  10. S. Bashutin 22.05.2011 в 23:05

    Задание выполнил. Это перовое задание, которое вызвало у меня реальное затруднение. Пришлось где-то подумать, где-то конкретно зависнуть, где-то подсмотреть решение. Но всё таки я его сделал:)
    Первая трудность с которой я столкнулся, так это я почему-то решил, что право отключение контроля остатков нужно реализовать через ПВХ(ПраваПользователей). Я наверно часа 4 не меньше( а то и больше) пытался реализовать, чтобы в форме элемента справочника “Пользователи” выводились текущие значения прав пользователей и при изменении, чтобы они записывались в регистр сведений “ПраваПользователей”. В итоге решил действовать просто и “в лоб”, сделал булевский реквизит у справочника “Пользователи”.

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

    • >родился вопрос, где его лучше было посчитать?
      Принципиальной разницы нет, в любом случае данное поле будет рассчитано на стороне СУБД.

  11. Дмитрий 22.05.2011 в 14:19

    Задание выполнил. Не смотря на сильное опоздание, в решение не подглядывал.
    1) Проведение реализации
    Настройку “Не проверять остатки” для пользователя реализовал следующим образом:
    – добавил план видов характеристик “НастройкиПользователей”. В него добавил предопределенный элемент “НеПроверятьОстаткиПриОтгрузке”.
    – добавил непериодический независимый регистр сведений “СохраненныеНастройкиПользователей”. Измерения:
    Пользователь, Настройка. Ресурс: Значение. Тип Значение – Характеристика.НастройкиПользователей
    – вынес на форму элемента справочника “Пользователи” ДинамическийСписок с настройками. Сделал все аналогично, как в уроке было показано для Номенклатуры.
    В РеализацииТоваровУслуг добавил кнопку “ПровестиБезКонтроляОстатков”. Для ее работы необходимо было как-то предавать параметр в обработку проведения в модуле документа. Не придумал ничего лучше, как создать служебный реквизит в документе “НеКонтролироватьОстатки”. Присваиваю Истина при нажатии на эту кнопку, в обработчике события “ПередЗаписью” присваиваю его значение переменной модуля документа, сам реквизит делаю Ложь.
    Добавил регистр остатков “ВзаиморасчетыСКонтрагентами” и регистр оборотов “Продажи”.
    Для разделения товаров, услуг и наборов использую ВидНоменклатуры(Перечисление)
    2) Наборы
    Для хранения состава набора добавил независимый непериодический регистр сведений “КомплектующиеНоменклатуры”. Измерения: Номенклатура, Комплектующая. Ресурсы: Количество
    Для устойчивости решения добавил в документы РеализацияТУ, ПоступлениеТУ и АвансовыйОтчет табличную часть “СоставНабора” с реквизитами: Номенклатура. Комплектующая, Количество.
     
    Модуль формы документа “РТУ”
    <code>

    //ДЗ 9_________
    &НаКлиенте
    Перем мПредыдущееЗначениеНоменклатуры;
    //ДЗ 9_________
    &НаКлиентеПерем мПредыдущееЗначениеНоменклатуры;

    &НаСервере
    Процедура ПриИзмененииНоменклатуры(СтрокаТабЧасти, ПредыдущееЗначениеНоменклатуры)

    Если НЕ ЗначениеЗаполнено(СтрокаТабЧасти) Тогда
    Возврат;
    КонецЕсли;

    ЕдИзм = Справочники.ЕдиницыИзмеренияНоменклатуры.ПодобратьЕдиницуИзмеренияДляНоменклатурыПоКлассификатору(СтрокаТабЧасти.Номенклатура, СтрокаТабЧасти.Номенклатура.БазоваяЕдиница);
    СтрокаТабЧасти.ЕдиницаИзмерения = ЕдИзм;
    СтрокаТабЧасти.Коэффициент = СтрокаТабЧасти.ЕдиницаИзмерения.К;
    СтрокаТабЧасти.Цена = ОбщиеФункцииСервер.ПолучитьЦенуНоменклатуры(СтрокаТабЧасти.Номенклатура, Объект.ТипЦен, ?(ЗначениеЗаполнено(Объект.Дата), Объект.Дата, ТекущаяДата()))*СтрокаТабЧасти.Коэффициент;
    СтрокаТабЧасти.Сумма = СтрокаТабЧасти.Цена*СтрокаТабЧасти.Количество;

    //ДЗ 9
    Если СтрокаТабЧасти.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Набор Тогда
    //Если в документе нет строк со старым набором удаляем его состав, если нет других строк с такимже набором
    Если ЗначениеЗаполнено(ПредыдущееЗначениеНоменклатуры) И СтрокаТабЧасти.Номенклатура <> ПредыдущееЗначениеНоменклатуры Тогда

    СтруктураПоиска = Новый Структура(“Номенклатура”, ПредыдущееЗначениеНоменклатуры);
    НайденнаяСтрокиСПредыдущимНабором = Объект.Товары.НайтиСтроки(СтруктураПоиска);
    Если НайденнаяСтрокиСПредыдущимНабором.Количество() = 0 Тогда

    СтруктураПоиска = Новый Структура(“Номенклатура”, ПредыдущееЗначениеНоменклатуры);
    НайденнаяСтрокиСоставПредыдущегоНабора = Объект.СоставНабора.НайтиСтроки(СтруктураПоиска);
    Для Каждого Строка Из НайденнаяСтрокиСоставПредыдущегоНабора Цикл
    Объект.СоставНабора.Удалить(Строка);
    КонецЦикла;
    КонецЕсли;
    КонецЕсли;

    //Если для выбранного набора еще не указан состав, то заполняем
    СтруктураПоиска = Новый Структура(“Номенклатура”, СтрокаТабЧасти.Номенклатура);
    НайденнаяСтрокиСоставНабора = Объект.СоставНабора.НайтиСтроки(СтруктураПоиска);
    Если НайденнаяСтрокиСоставНабора.Количество() = 0 Тогда
    ТаблицаКомплектующих = ОбщиеФункцииСервер.ПолучитьСтруктуруНабора(СтрокаТабЧасти.Номенклатура);
    Для Каждого ТекСтрокаКомплектующая Из ТаблицаКомплектующих Цикл
    НоваяСтрока = Объект.СоставНабора.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекСтрокаКомплектующая);
    КонецЦикла;
    КонецЕсли;

    ПредыдущееЗначениеНоменклатуры = СтрокаТабЧасти.Номенклатура;

    КонецЕсли;

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

    &НаКлиенте
    Процедура ПровестиБезКонтроляОстатков(Команда)

    Объект.НеКонтролироватьОстатки = Истина;

    ПараметрыЗаписи = Новый Структура;
    ПараметрыЗаписи.Вставить(“РежимЗаписи”, РежимЗаписиДокумента.Проведение);
    Записать(ПараметрыЗаписи);

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

    &НаКлиенте
    Процедура ТоварыПередНачаломИзменения(Элемент, Отказ)

    ТекСтрока = Элементы.Товары.ТекущиеДанные;
    Если ТекСтрока = Неопределено Тогда
    Возврат;
    КонецЕсли;

    мПредыдущееЗначениеНоменклатуры = ТекСтрока.Номенклатура;

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

    </code>
    //Модуль документа РТУ
    <code>
    Перем мНеКонтролироватьОстатки Экспорт;

    Процедура ОбработкаПроведения(Отказ, РежимПроведения)

    //По регистру ТоварыНаСкладах
    ТаблицаТоваровОприходованныхНаСклад = ПолучитьТаблицуТоваровОприхцФодованныхНаСклад();;
    Движения.ТоварыНаСкладах.Загрузить(ТаблицаТоваровОприходованныхНаСклад);
    Движения.ТоварыНаСкладах.Записать();

    ПроверитьОстаткиПоРегиструТоварыНаСкладах(ТаблицаТоваровОприходованныхНаСклад, Отказ);

    Если Отказ Тогда
    Возврат;
    КонецЕсли;

    //По регистру Продажи
    ТаблицаПродаж = Товары.ВыгрузитьКолонки();
    ТаблицаПродаж.Колонки.Добавить(“Период”);
    ТаблицаПродаж.Колонки.Добавить(“Контрагент”);
    ТаблицаПродаж.Колонки.Добавить(“Менеджер”);

    Для Каждого ТекСтрока Из Товары Цикл
    НоваяСтрока = ТаблицаПродаж.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекСтрока);
    НоваяСтрока.Количество = ТекСтрока.Количество*ТекСтрока.Коэффициент;
    НоваяСтрока.Период = Дата;
    НоваяСтрока.Контрагент = Контрагент;
    НоваяСтрока.Менеджер = Ответствтвенный;
    КонецЦикла;

    НаборДвижений = Движения.Продажи;
    НаборДвижений.Записывать = Истина;
    НаборДвижений.Загрузить(ТаблицаПродаж);

    //По регистру Взаиморасчеты с контрагентами
    Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина;

    НоваяЗапись = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьПриход();
    НоваяЗапись.Период = Дата;
    НоваяЗапись.Контрагент = Контрагент;
    НоваяЗапись.Сумма = Товары.Итог(“Сумма”);

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

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

    мНеКонтролироватьОстатки = НеКонтролироватьОстатки;
    НеКонтролироватьОстатки = Ложь;

    КонецПроцедуры
     
    Процедура ПроверитьОстаткиПоРегиструТоварыНаСкладах(ТаблицаТоваровОприходованныхНаСклад, Отказ)

    Запрос = Новый Запрос;
    Запрос.Текст =

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

    Запрос.УстановитьПараметр(“ТаблицаТоваровОприходованныхНаСклад”, ТаблицаТоваровОприходованныхНаСклад);
    Запрос.УстановитьПараметр(“Склад”, Склад);
    ГраницаМомента = Новый Граница(МоментВремени(), ВидГраницы.Включая);
    Запрос.УстановитьПараметр(“МоментВремени”, ГраницаМомента);

    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();

    НеКонтролироватьОстаткиДляПОльзователя = ОбщиеФункцииСервер.ПолучитьНастройкуПользователя(“НеПроверятьОстаткиПриотгрузке”);
    Если НЕ Результат.Пустой() И НЕ (мНеКонтролироватьОстатки ИЛИ НеКонтролироватьОстаткиДляПОльзователя) Тогда
    Отказ = Истина;
    КонецЕсли;

    Пока Выборка.Следующий() Цикл
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Не хватает товара ” + Выборка.Номенклатура + ” в количестве ” + (-Выборка.Количество);
    Если Отказ И Выборка.НомерСтроки>0 Тогда
    Сообщение.Поле = “Товары[” + (Выборка.НомерСтроки-1) + “].Количество”;
    КонецЕсли;
    Сообщение.УстановитьДанные(ЭтотОбъект);
    Сообщение.Сообщить();
    КонецЦикла;

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

    Функция ПолучитьТаблицуТоваровОприхцФодованныхНаСклад()

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

    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);

    Возврат Запрос.Выполнить().Выгрузить();

    КонецФункции
     
     
    мНеКонтролироватьОстатки = Ложь;
    </code>
    //Модуль общего модуля “Общие функции сервер”

    <code>
    Функция ПолучитьНастройкуПользователя(НаименованиеНастройки, Пользователь = Неопределено) Экспорт

    Пользователь = ?(ЗначениеЗаполнено(Пользователь), Пользователь, СинхронизацияПользователей(Неопределено));
    Настройка = ПланыВидовХарактеристик.НастройкиПользователей[НаименованиеНастройки];

    МенеджерЗаписи = РегистрыСведений.СохраненныеНастройкиПользователей.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Пользователь = Пользователь;
    МенеджерЗаписи.Настройка = Настройка;
    МенеджерЗаписи.Прочитать();

    Возврат МенеджерЗаписи.Значение;

    КонецФункции
     
    Функция ПолучитьСтруктуруНабора(Набор) Экспорт

    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | КомплектующиеНоменклатуры.Комплектующая,
    | КомплектующиеНоменклатуры.Количество,
    | КомплектующиеНоменклатуры.Номенклатура
    |ИЗ
    | РегистрСведений.КомплектующиеНоменклатуры КАК КомплектующиеНоменклатуры
    |ГДЕ
    | КомплектующиеНоменклатуры.Номенклатура = &Номенклатура”;

    Запрос.УстановитьПараметр(“Номенклатура”, Набор);

    Возврат Запрос.Выполнить().Выгрузить();

    КонецФункции
     

    </code>
    Изменения модуля формы документа “ПоступлениеТУ” для работы с наборами аналогичен модулю документа “РеализацииТУ”
    //Модуль документа “ПоступлениеТУ”
    <code>
    Процедура ОбработкаПроведения(Отказ, РежимПроведения)

    //По регистру ТоварыНаСкладах
    ТаблицаТоваровОприходованныхНаСклад = ПолучитьТаблицуТоваровОприхцФодованныхНаСклад();
    Движения.ТоварыНаСкладах.Записывать = Истина;
    Движения.ТоварыНаСкладах.Загрузить(ТаблицаТоваровОприходованныхНаСклад);

    //По регистру Закупки
    Движения.Закупки.Записывать = Истина;
    Для Каждого ТекСтрока Из Товары Цикл
    НовоеДвижение = Движения.Закупки.Добавить();
    НовоеДвижение.Активность = Истина;
    НовоеДвижение.Период = Дата;
    НовоеДвижение.Контрагент = Контрагент;
    НовоеДвижение.Номенклатура = ТекСтрока.Номенклатура;
    НовоеДвижение.Количество = ТекСтрока.Количество*ТекСтрока.Коэффициент;
    НовоеДвижение.Стоимость = ТекСтрока.Сумма;
    КонецЦикла;

    //По регистру Взаиморасчеты с контрагентами
    Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина;

    НоваяЗапись = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход();
    НоваяЗапись.Период = Дата;
    НоваяЗапись.Контрагент = Контрагент;
    НоваяЗапись.Сумма = Товары.Итог(“Сумма”);

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

    Функция ПолучитьТаблицуТоваровОприхцФодованныхНаСклад()

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

    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);

    Возврат Запрос.Выполнить().Выгрузить();

    КонецФункции

    </code>
    3)Создал документ “Выписка”
    //Модуль документа “Выписка”
    <code>

    Процедура ОбработкаПроведения(Отказ, РежимПроведения)

    //По регистру “Взаиморасчеты с контрагентами”
    Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина;

    ТаблицаПоКонтрагентам = Оплаты.Выгрузить();
    ТаблицаПоКонтрагентам.Свернуть(“Контрагент”,”СуммаПрихода, СуммаРасхода”);
    Для Каждого ТекСтрока ИЗ ТаблицаПоКонтрагентам Цикл
     
    Если ТекСтрока.СуммаРасхода <> 0 Тогда
    НоваяЗапись = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьПриход();
    НоваяЗапись.Период = Дата;
    НоваяЗапись.Контрагент = ТекСтрока.Контрагент;
    НоваяЗапись.Сумма = ТекСтрока.СуммаРасхода;
    КонецЕсли;

    Если ТекСтрока.СуммаПрихода <> 0 Тогда
    НоваяЗапись = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход();
    НоваяЗапись.Период = Дата;
    НоваяЗапись.Контрагент = ТекСтрока.Контрагент;
    НоваяЗапись.Сумма = ТекСтрока.СуммаПрихода;
    КонецЕсли;

    КонецЦикла;

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

    </code>
    4) Отчеты
    Приведу только тексты запросов, которые использую в СКД
    а. Долги по менеджера
    <code>

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

    </code>
    б.Прогнозируемый финансовый результат
    <code>

    ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Номенклатура,
    ТоварыНаСкладахОстатки.КоличествоОстаток,
    ЕСТЬNULL(ЦеныНоменклатурыЗакупка.Цена, 0) КАК ЦенаЗакупки,
    ЕСТЬNULL(ЦеныНоменклатурыПродажа.Цена, 0) КАК ЦенаПродажи,
    (ЕСТЬNULL(ЦеныНоменклатурыПродажа.Цена, 0)-ЕСТЬNULL(ЦеныНоменклатурыЗакупка.Цена, 0))*ТоварыНаСкладахОстатки.КоличествоОстаток КАК ФинансовыйРезультат

    ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦенЗакупка) КАК ЦеныНоменклатурыЗакупка
    ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыЗакупка.Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦенПродажа) КАК ЦеныНоменклатурыПродажа
    ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыПродажа.Номенклатура

    </code>
    в.Рейтинг менеджеров
    <code>

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

    </code>
    Для упорядочивая, добавил соответствующее вычисляемое поле.

    • Дмитрий 22.05.2011 в 14:47

      Вопросы:
      Возможно ли средствами СКД сделать параметры обязательными к заполнению? В отчете “Прогнозируемый финансовый результат”, если не задать типы цен будет ошибка.
      P.S. Если ответ есть в решении ДЗ 9 можно вопрос проигнорировать.

      • В текущих релизах это можно сделать только с помощью программного кода.
        В 14-м релизе будет такая настройка, об этом поговорим в ближайшей мастер-группе.

  12. Сделано проведение док-та Реализация товара,  анализ остатков. Сделан регистры Накопления ПродажаТовара,ВзаиморасчетыСКонтрагентами и сделаны движения по ним при проведении док Реализации и Поступления . Создан док-т оплаты Выписка и его движения в регистр ВзаиморасчетыСКонтрагентами. Сделаны изменения при проведении док-тов ТМЦ при видеНоменклатуры Услуга, не проводится в регист ОстаткиТовара, не проводится проверка остатков, сделана проверка кодом на заполнение полей ТЧ Количество, ЕдиницаИзмерения для номенклатуры Не Услуга.
    Для ВидаНоменклатуры набор сделан РегистрСведений Комплектующие, добавлена ТЧ  Комплектующие в док-ты ТМЦ для устойчивости. ТЧ заполняется при изменении Номенклатуры. Не смогла сделать отптимально, сделано в процедурах форм с &НаСервере .
    Сделаны отчеты, в последнем не смола привести к одному периоду,  осталось 2 параметра, период и дата.
    **********************************
    По лекциям много полезного и интересного. Большое спасибо.
    Трудности с оптимизацией кода с обращениями к серверу и размещением в общих модулях.
     

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

  14. Документ выписка Процедура ОбработкаПроведения(Отказ, Режим)
    //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

    // регистр Взаиморасчеты Приход
    Движения.Взаиморасчеты.Записывать = Истина;
    Для Каждого ТекСтрокаВыписки Из Выписки Цикл
    Если (ТекСтрокаВыписки.СуммаПриход<>0) Тогда

    Движение = Движения.Взаиморасчеты.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
    Движение.Период = Дата;
    Движение.Контрагент = ТекСтрокаВыписки.Контрагент;
    Движение.Сумма = ТекСтрокаВыписки.СуммаПриход;

    КонецЕсли;     КонецЦикла;

    // регистр Взаиморасчеты Расход
    Движения.Взаиморасчеты.Записывать = Истина;
    Для Каждого ТекСтрокаВыписки Из Выписки Цикл
    Если (ТекСтрокаВыписки.СуммаРасход<>0) Тогда

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

    //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    КонецПроцедуры

  15. Задание выполнил были проблемы по организации хранения комплектующих
    Реализация товара
    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
    // Заполнение шапки
    ЗаполнениеДокументовСервер.ЗаполнитьПоКонтрагенту(ДанныеЗаполнения, ЭтотОбъект);
    КонецЕсли;
    КонецПроцедуры

    Процедура ОбработкаПроведения(Отказ, Режим)
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    |    &Период,
    |    РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
    |    РеализацияТоваровТовары.Качество КАК Качество,
    |    РеализацияТоваровТовары.Количество * РеализацияТоваровТовары.К КАК Количество
    |ИЗ
    |    Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары,
    |    Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
    |ГДЕ
    |    РеализацияТоваровТовары.Ссылка = &Ссылка
    |    И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    |    &Период,
    |    РеализацияТоваровСоставНабора.Комплектующая,
    |    РеализацияТоваровТовары.Качество,
    |    РеализацияТоваровТовары.Количество * РеализацияТоваровТовары.К
    |ИЗ
    |    Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров.СоставНабора КАК РеализацияТоваровСоставНабора
    |        ПО РеализацияТоваровТовары.Номенклатура = РеализацияТоваровСоставНабора.Набор
    |ГДЕ
    |    РеализацияТоваровСоставНабора.Ссылка = &Ссылка
    |    И РеализацияТоваровТовары.Ссылка = &Ссылка
    |    И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Набор)”;

    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);

    Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
    Запрос.УстановитьПараметр(“Период”, Дата);

    Результат = Запрос.Выполнить();

    Движения.ОстаткиНоменклатуры.Загрузить(Результат.Выгрузить());
    Движения.ОстаткиНоменклатуры.Записать();

    Если БезПроверки<>Истина Тогда

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

    Запрос.УстановитьПараметр(“Ссылка”,Ссылка);
    Запрос.УстановитьПараметр(“Услуга”,Перечисления.ВидыНоменклатуры.Услуга);

    СпрПол = Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().ПолноеИмя);

    Граница = новый Граница(МоментВремени(), ВидГраницы.Включая);
    Запрос.УстановитьПараметр(“Момент”,Граница);
    Результат = Запрос.Выполнить();
    Если Не Результат.Пустой() Тогда
    Если СпрПол.ВозможностьПроведения=Ложь Тогда

    Отказ = Истина;
    КонецЕсли;
    Выборка=Результат.Выбрать();
    Пока Выборка.Следующий() Цикл

    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Нехватка товара в количестве”+(-Выборка.Нехватка);
    Сообщение.Поле = “Товары[“+(выборка.НомерСтроки-1)+”].Количество”;
    Сообщение.УстановитьДанные(ЭтотОбъект);
    Сообщение.Сообщить();     

    КонецЦикла;

    КонецЕсли;
    КонецЕсли;

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

    // регистр Взаиморасчеты Расход

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

    Запрос2.УстановитьПараметр(“Ссылка”, Ссылка);    

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

    КонецЕсли;        

    КонецПроцедуры
    Процедура Сохранить() Экспорт
    БезПроверки=Истина;
    Записать();
    КонецПроцедуры

    Процедура ОбработкаУдаленияПроведения(Отказ)
    // Вставить содержимое обработчика.
    БезПроверки=Ложь;
    Записать();
    КонецПроцедуры

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

    Поступление товара

    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
    // Заполнение шапки
    ЗаполнениеДокументовСервер.ЗаполнитьПоКонтрагенту(ДанныеЗаполнения, ЭтотОбъект);
    КонецЕсли;
    КонецПроцедуры

    Процедура ОбработкаПроведения(Отказ, РежимПроведения)

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

    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
    Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
    Запрос.УстановитьПараметр(“Период”, Дата);

    Результат = Запрос.Выполнить();

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

    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);

    Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
    Запрос.УстановитьПараметр(“Период”, Дата);

    Результат = Запрос.Выполнить();

    ДвиженияПоРегистрамСервер.ДвиженияПоНоменклатуре1(Движения, Результат);

    Запрос2 = Новый Запрос;
    Запрос2.Текст = “ВЫБРАТЬ
    |    ПоступлениеТоваров.Дата КАК Период,
    |    ПоступлениеТоваров.Контрагент,
    |    ПоступлениеТоваров.СуммаДокумента КАК Сумма
    |ИЗ
    |    Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
    |ГДЕ
    |    ПоступлениеТоваров.Ссылка = &Ссылка”;

    Запрос2.УстановитьПараметр(“Ссылка”, Ссылка);    

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

    КонецЕсли;    

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

    Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    СуммаДокумента = Товары.Итог(“Сумма”);
    СоставНабора.Загрузить(РаботаСДокументаСервер.ПолучитьСоставНаборов(Товары, Ссылка));
    КонецПроцедуры
    Общие модули
    Движения по регистрам сервера
    Процедура ДвиженияПоНоменклатуре(Движения, Результат) Экспорт

    Движения.Закупки.Записывать = Истина;
    Движения.Закупки.Загрузить(Результат.Выгрузить());    

    КонецПроцедуры
    Процедура ДвиженияПоРеализ(Движения,Рез) Экспорт

    Движения.Продажи.Записывать = Истина;
    Движения.Продажи.Загрузить(Рез.Выгрузить());        
    Движения.Продажи.Записывать = Истина;
    Движения.Продажи.Загрузить(Рез.Выгрузить());
    КонецПроцедуры
    Процедура ДвиженияПоНоменклатуре1(Движения, Результат) Экспорт

    Движения.ОстаткиНоменклатуры.Записывать = Истина;
    Движения.ОстаткиНоменклатуры.Загрузить(Результат.Выгрузить());
    КонецПроцедуры

    Работасдокументамисервера
    Функция ПолучитьЕдиницуИзмеренияИЦену(Товар, Дата, ТипЦены) Экспорт

    ДанныеТовара = Новый Структура();

    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    |    ЕдиницыИзмеренияНоменклатуры.Ссылка
    |ИЗ
    |    Справочник.ЕдиницыИзмеренияНоменклатуры КАК ЕдиницыИзмеренияНоменклатуры
    |ГДЕ
    |    ЕдиницыИзмеренияНоменклатуры.Владелец = &Товар
    |    И ЕдиницыИзмеренияНоменклатуры.ЕдиницаПоКлассификатору = &ЕдиницаПоКлассификатору
    |    И (НЕ ЕдиницыИзмеренияНоменклатуры.ПометкаУдаления)”;

    Запрос.УстановитьПараметр(“ЕдиницаПоКлассификатору”, Товар.БазоваяЕдиница);
    Запрос.УстановитьПараметр(“Товар”, Товар);

    Результат = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = Результат.Выбрать();

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

    ДанныеТовара.Вставить(“ЕдиницаИзмерения”, Единица);
    ДанныеТовара.Вставить(“К”, Единица.К);

    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    |    ЦеныНоменклатурыСрезПоследних.Цена
    |ИЗ
    |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
    |            &Дата,
    |            Номенклатура = &Номенклатура
    |                И ТипЦены = &ТипЦены) КАК ЦеныНоменклатурыСрезПоследних”;

    Запрос.УстановитьПараметр(“Дата”, Дата);
    Запрос.УстановитьПараметр(“Номенклатура”, Товар);
    Запрос.УстановитьПараметр(“ТипЦены”, ТипЦены);

    Результат = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = Результат.Выбрать();

    Если ВыборкаДетальныеЗаписи.Следующий() Тогда
    Цена = ВыборкаДетальныеЗаписи.Цена;
    Иначе
    Цена = 0;
    КонецЕсли;

    ДанныеТовара.Вставить(“Цена”, Цена);

    Возврат ДанныеТовара;

    КонецФункции // ПолучитьЕдиницуИзмерения()

    Функция ПолучитьКоэффициент(Единица) Экспорт

    Возврат Единица.К;

    КонецФункции // ПолучитьКоэффициент(Единица) Экспорт()
    Функция ПолучитьСоставНаборов(Товары, Ссылка) Экспорт

    ИмяТаблицы = “Документ.”+Ссылка.Метаданные().Имя+”.СоставНабора”;

    МассивНаборов = Новый Массив;
    Для каждого СтрокаТЧ Из Товары Цикл
    Если СтрокаТЧ.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Набор Тогда
    МассивНаборов.Добавить(СтрокаТЧ.Номенклатура);
    КонецЕсли;
    КонецЦикла;

    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    |    ДокСоставНаборов.Набор,
    |    ДокСоставНаборов.Комплектующая,
    |    ДокСоставНаборов.Количество
    |ИЗ
    |    &ДокСоставНаборов КАК ДокСоставНаборов
    |ГДЕ
    |    ДокСоставНаборов.Ссылка = &Ссылка
    |    И ДокСоставНаборов.Набор В(&МассивНаборов)
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    |    СоставНаборов.Набор,
    |    СоставНаборов.Комплект,
    |    СоставНаборов.Количество
    |ИЗ
    |    РегистрСведений.КомплектНоменклатуры КАК СоставНаборов
    |ГДЕ
    |    СоставНаборов.Набор В(&МассивНаборов)
    |    И (НЕ СоставНаборов.Набор В
    |                (ВЫБРАТЬ
    |                    ДокСоставНаборов.Набор
    |                ИЗ
    |                    &ДокСоставНаборов КАК ДокСоставНаборов
    |                ГДЕ
    |                    ДокСоставНаборов.Ссылка = &Ссылка))”;

    Запрос.УстановитьПараметр(“МассивНаборов”, МассивНаборов);
    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);

    Запрос.Текст = СтрЗаменить(Запрос.Текст, “&ДокСоставНаборов”, ИмяТаблицы);

    Результат = Запрос.Выполнить();

    Возврат Результат.Выгрузить();

    КонецФункции

  16. Задание выполнила.  Анализ остатков в реализации – по методике 8.2.
    <code> ЗапросОстатки = Новый Запрос;
    ЗапросОстатки.Текст = “ВЫБРАТЬ
    |    ЕСТЬNULL(КомплНабора.Комплектующая, РеализацияТоваровТовары.Номенклатура) КАК Номенклатура,
    |    ЕСТЬNULL(КомплНабора.Количество, 1) * РеализацияТоваровТовары.Количество * РеализацияТоваровТовары.К КАК Количество,
    |    РеализацияТоваровТовары.Сумма,
    |    &Период,
    |    &ВидДвижения
    |ИЗ
    |    (ВЫБРАТЬ
    |        РеализацияТоваровКомплектующие.Набор КАК Набор,
    |        РеализацияТоваровКомплектующие.Комплектующая КАК Комплектующая,
    |        РеализацияТоваровКомплектующие.Количество КАК Количество
    |    ИЗ
    |        Документ.РеализацияТоваров.Комплектующие КАК РеализацияТоваровКомплектующие
    |    ГДЕ
    |        РеализацияТоваровКомплектующие.Ссылка = &Ссылка) КАК КомплНабора
    |        ПОЛНОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
    |        ПО КомплНабора.Набор = РеализацияТоваровТовары.Номенклатура
    |ГДЕ
    |    РеализацияТоваровТовары.Ссылка = &Ссылка”;

    ЗапросОстатки.УстановитьПараметр(“Ссылка”,Ссылка);
    ЗапросОстатки.УстановитьПараметр(“Период”,Дата);
    ЗапросОстатки.УстановитьПараметр(“ВидДвижения”,ВидДвиженияНакопления.Расход);

    РезЗапроса = ЗапросОстатки.Выполнить();
    ДвиженияПоРегистрамСервер.ДвиженияПоОстаткам(Движения,РезЗапроса);
    Движения.ОстаткиНоменклатуры.Записать();

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

    РезЗапроса = Запрос.Выполнить().Выбрать();
    Пока РезЗапроса.Следующий() Цикл
    Отказ = Истина;
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ” не хватает остатка по товару ” + (-РезЗапроса.Остаток);
    Сообщение.Поле = “Товары.[“+Строка(РезЗапроса.НомерСтроки-1)+”]”;
    Сообщение.УстановитьДанные(ЭтотОбъект);
    Сообщение.Сообщить();
    КонецЦикла;    

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

    ЗапросПоПродажам.УстановитьПараметр(“Контрагент”,Контрагент);
    ЗапросПоПродажам.УстановитьПараметр(“МоментВремени”,Граница);
    ЗапросПоПродажам.УстановитьПараметр(“Период”,Дата);
    ЗапросПоПродажам.УстановитьПараметр(“Ссылка”,Ссылка);
    ЗапросПоПродажам.УстановитьПараметр(“ВидДвижения”,ВидДвиженияНакопления.Приход);

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

    РезЗапроса = Запрос.Выполнить();
    ДвиженияПоРегистрамСервер.ДвижениеПоВзаиморасчетам(Движения,РезЗапроса);

    </>
    Для набора сделала регистр “Комплектующие”,  в самом регистре настроила параметры отбора для измерений по виду номенклатуры. В реализации при выбора набора  заполняю табличную часть “Комплектующие”:
    <code> &НаСервере
    Процедура ЗаполнитьКомплектующие(Номенклатура,НомерСтроки)
    Если Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Набор Тогда
    МассивСтрок = Объект.Комплектующие.НайтиСтроки(Новый Структура(“НомерСтрокиТоваров”,НомерСтроки));
    Для каждого СтрокаМассива Из МассивСтрок Цикл
    Объект.Комплектующие.Удалить(СтрокаМассива);    
    КонецЦикла;

    Запрос = Новый Запрос;
    Запрос.Текст = “ВЫБРАТЬ
    |    КомплектующиеНоменклатуры.Набор,
    |    КомплектующиеНоменклатуры.Комплектующая,
    |    КомплектующиеНоменклатуры.Количество,
    |    &НомерСтрокиТоваров
    |ИЗ
    |    РегистрСведений.КомплектующиеНоменклатуры КАК КомплектующиеНоменклатуры
    |ГДЕ
    |    КомплектующиеНоменклатуры.Набор = &Набор”;
    Запрос.УстановитьПараметр(“НомерСтрокиТоваров”,НомерСтроки);
    Запрос.УстановитьПараметр(“Набор”,Номенклатура);

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

  17. Майор 21.05.2011 в 00:46

    Коллеги, Евгений, всем доброго времени суток.

    Для начала попробую составить отчёт по домашнему заданию.

    Проведение документа РеализацияТоваров обеспечил в соответствии с заданными условиями: условное проведение практически идентично уроку, с учётом необходимости контроля качества списываемой номенклатуры, в запросе +1 строка (условно). Отключение контроля – добавил в справочник Пользователи реквизит КонтрольПроведения типа булево, стоит галочка – контролируем проведение, нет галочки – проводим как есть, но вывод сообщений остался.
    Соответсвенно сообщение привязано к строке с ошибкой, полю Номенклатура. Пересчёт в базовые еденицы учёта аналогичен, как в докуменах поступления.
    К форме списка прикрутил кнопку “Провести без контроля”, листинг модуля формы:
    <code>
    &НаКлиенте
    Процедура ПровестиБезКонтроля(Команда)
    АктивныеСтроки = Элементы.Список.ВыделенныеСтроки;
    ПровестиБезКОнтроляНаСервере(АктивныеСтроки);
    Элементы.Список.Обновить();
    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура ПровестиБезКОнтроляНаСервере(Массив)
    Для каждого Ссылка Из Массив Цикл
    Ссылка.ПолучитьОбъект().ПроведениеБезКонтроля();
    КонецЦикла;
    КонецПроцедуры
    </code>
    Экспортная процедура модуля объекта ПроведениеБезКонтроля() устанавливает флаг ПроводитьБезКонтроля (который отслеживается в процедуре проведения), вызывает процедуру проведения документа и для полной красоты дорисовывает галочку “Проведён” у документа в списке.

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

    Создал регистр накопления ВзаиморасчетыСКонтрагентами вида Остатки. Регистраторы – ПоступлениеТоваров, РеализацияТоваров, Выписка (АвансовыйОтчёт включать не стал – это расчёты с сотрудниками). Листинг модуля объекта документа Выписка:
    <code>
    Процедура ОбработкаПроведения(Отказ, Режим)
    Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина;
    Для Каждого ТекСтрокаВзаиморасчеты Из Взаиморасчеты Цикл
    // Проведение по регистру взаиморасчетов
    Если ТекСтрокаВзаиморасчеты.Поступило > 0 Тогда
    Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход();
    Движение.Период = Дата;
    Движение.Контрагент = ТекСтрокаВзаиморасчеты.Контрагент;
    Движение.ДолгКонтрагента = ТекСтрокаВзаиморасчеты.Поступило;    
    КонецЕсли;

    Если ТекСтрокаВзаиморасчеты.Перечислено > 0 Тогда
    Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьПриход();
    Движение.Период = Дата;
    Движение.Контрагент = ТекСтрокаВзаиморасчеты.Контрагент;
    Движение.ДолгКонтрагента = ТекСтрокаВзаиморасчеты.Перечислено;    
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
    </code>
    Исходил из того, что в одной строке по контрагенту сразу и приход и расход может быть указан. Да, в регистре по взаиморасчётам ресурс у меня называется ДолгКонтрагента (левую часть (приход) формируют документы реализации и колонка “Перечислено” документа Выписка, соответственно правую часть – документы поступления товара и колонка “Поступило” (в смысле – деньги от контрагента), мне так понятнее).

    Подозреваю, что учёт по наборам реализуется через непереодический регистр сведений. Структуру регистра сходу не придумал и сделал всё через одно место, а именно – через подчинённый номенклатуре справочник Наборы. Все требования, которые были предъявлены – в итоге реализованы, по крайней мере я нашёл у себя только один “косяк” – при списании набора контроль остатков корректно не работает. Тот запрос к базе данных, который был – видит, что остаток по номенклатуре (которая набор) = 0, (приход же в регистр по комплектующим организован). Вобщем надо запрос докручивать в этом плане, сходу сделать просто не успел.
    Вот в этом месте у меня, кстати, вопрос по заданию созрел – почему мы приходуем от поставщиков набор? Логичней же заносить в номенклатуру комплектующие…
    В документы реализации и поступления, для обеспечения устойчивости ИБ, добавил табличную часть СоставНабора (в документе не отражается), которую заполняю перед проведением документа в соответствии со справочником Наборы, если в табличной части Товары такие наборы присутствуют. (В этом месте помучался с вопросом как быть, если пользователю взбредёт в голову удалить из документа строку с набором). Частичный листинг модуля документа РеализацияТовара (поступление вообще во многом по аналогии организовано):
    <code>
    &НаКлиенте
    Процедура ТоварыПередУдалением(Элемент, Отказ)
    ТоварыПередУдалениемНаСервере(Элемент.ТекущиеДанные.Номенклатура, Элемент.ТекущаяСтрока+1);    
    КонецПроцедуры

    &НаСервере
    Процедура ТоварыПередУдалениемНаСервере(ТекСтрока, НомерСтроки)
    ЭтоНабор = ТекСтрока.ВидНоменклатуры;
    Если ЭтоНабор = Перечисления.ВидыНоменклатуры.Набор Тогда
    Массив = Новый Массив();
    Для каждого Строчка Из Объект.СоставНабора Цикл
    Если Строчка.НоменклатураТовары = (Строка(ТекСтрока) + “(” + НомерСтроки + “)”) Тогда
    Индекс = Объект.СоставНабора.Индекс(Строчка);
    Массив.Добавить(Индекс);
    КонецЕсли;
    КонецЦикла;
    Сч = Массив.Количество();
    Пока Сч > 0  Цикл
    Сч = Сч – 1;
    Объект.СоставНабора.Удалить(Массив[Сч]);
    КонецЦикла;
    КонецЕсли;
    КонецПроцедуры
    </code>
    Зато вроде окончательно разобрался, почему у меня не получалось с табличными частями работать )))

    Проведение по регистрам организовано в соответсвии с условиями задания – ОстаткиНоменклатуры заполняются комплектующими, “Закупки” и “УчётПродаж” – наборами. Привожу листинг процедуры проведения документа РеализацияТоваров (в поступлении некоторых моментов просто нет):
    <code>
    Процедура ОбработкаПроведения(Отказ, Режим)

    Для каждого ТекСтрока Из Товары Цикл

    ЭтоНабор = ТекСтрока.Номенклатура.ВидНоменклатуры;
    Если ЭтоНабор = Перечисления.ВидыНоменклатуры.Набор Тогда

    Отбор = Новый Структура(“НоменклатураТовары”, Строка(ТекСтрока.Номенклатура) + “(” + ТекСтрока.НомерСтроки + “)”);
    Значение = СоставНабора.НайтиСтроки(Отбор).Количество();

    Если Значение = 0 Тогда

    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    |    НаборыСоставНабора.Комплектующая КАК Комплектующая,
    |    НаборыСоставНабора.Количество КАК Количество,
    |    Наборы.Владелец КАК Владелец
    |ИЗ
    |    Справочник.Наборы.СоставНабора КАК НаборыСоставНабора
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Наборы КАК Наборы
    |        ПО НаборыСоставНабора.Ссылка = Наборы.Ссылка
    |ГДЕ
    |    Наборы.Владелец = &Номенклатура”;

    Запрос.УстановитьПараметр(“Номенклатура”, ТекСтрока.Номенклатура);

    Результат = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = Результат.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Запись = СоставНабора.Добавить();
    Запись.НоменклатураТовары = Строка(ТекСтрока.Номенклатура) + “(” + ТекСтрока.НомерСтроки + “)”;
    Запись.Комплектующая = Строка(ВыборкаДетальныеЗаписи.Комплектующая);    
    Запись.Количество = ВыборкаДетальныеЗаписи.Количество;
    КонецЦикла;
    Записать();    
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;

    Для Каждого ТекСтрока Из Товары Цикл
    // Движение по регистру ОстаткиНоменклатуры
    ЭтоНабор = ТекСтрока.Номенклатура.ВидНоменклатуры;
    Если ЭтоНабор = Перечисления.ВидыНоменклатуры.Набор Тогда

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

    Иначе
    Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход();
    Движение.Период = Дата;
    Движение.Номенклатура = ТекСтрока.Номенклатура;
    Движение.Качество = ТекСтрока.Качество;
    Движение.Количество = ТекСтрока.Количество * ТекСтрока.К;
    КонецЕсли;

    // Движение по регистру УчетПродаж
    Движение = Движения.УчетПродаж.Добавить();
    Движение.Период = Дата;
    Движение.Контрагент =  Контрагент;
    Движение.Номенклатура = ТекСтрока.Номенклатура;
    Движение.Количество = ТекСтрока.Количество * ТекСтрока.К;
    Движение.Сумма = ТекСтрока.Сумма;

    Отбор = Новый Структура(“Контрагент”, Контрагент);
    Структура = РегистрыСведений.МенеджерыКонтрагентов.ПолучитьПоследнее(Дата, Отбор);
    Структура.Свойство(“Менеджер”, Движение.Менеджер);

    КонецЦикла;
    Движения.ОстаткиНоменклатуры.Записать();
    Движения.УчетПродаж.Записать();

    //Движение по регистру взаиморасчетов
    Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьПриход();
    Движение.Период = Дата;
    Движение.Контрагент = Контрагент;
    Движение.ДолгКонтрагента = СуммаДокумента;
    Движения.ВзаиморасчетыСКонтрагентами.Записать();

    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    |    ОстаткиНоменклатурыОстатки.Номенклатура КАК Товар,
    |    ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Остаток,
    |    ОстаткиНоменклатурыОстатки.Качество КАК Качество
    |ИЗ
    |    РегистрНакопления.ОстаткиНоменклатуры.Остатки(
    |            &Момент,
    |            Номенклатура В
    |                (ВЫБРАТЬ РАЗЛИЧНЫЕ
    |                    РеализацияТоваровТовары.Номенклатура
    |                ИЗ
    |                    Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
    |                ГДЕ
    |                    РеализацияТоваровТовары.Ссылка = &Ссылка)) КАК ОстаткиНоменклатурыОстатки
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |            РеализацияТоваровСоставНабора.Комплектующая КАК Комплектующая
    |        ИЗ
    |            Документ.РеализацияТоваров.СоставНабора КАК РеализацияТоваровСоставНабора
    |        
    |        СГРУППИРОВАТЬ ПО
    |            РеализацияТоваровСоставНабора.Комплектующая) КАК ДанныеДокумента
    |        ПО ОстаткиНоменклатурыОстатки.Номенклатура = ДанныеДокумента.Комплектующая
    |ГДЕ
    |    ОстаткиНоменклатурыОстатки.КоличествоОстаток < 0
    |    И ОстаткиНоменклатурыОстатки.Качество = ОстаткиНоменклатурыОстатки.Качество”;

    Граница = Новый Граница(МоментВремени(), ВидГраницы.Включая);
    Запрос.УстановитьПараметр(“Момент”, Граница);
    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);

    Результат = Запрос.Выполнить();

    Если НЕ Результат.Пустой() Тогда

    Если ПровестиБезКонтроля ИЛИ ОбщиеФункцииСервер.СинхронизацияПользователей().КонтрольПроведения Тогда
    Отказ = Истина;    
    КонецЕсли;

    ВыборкаДетальныеЗаписи = Результат.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Номенклатуры ” + ВыборкаДетальныеЗаписи.Товар + ” не хватает в количестве ” + (-ВыборкаДетальныеЗаписи.Остаток);
    Сообщение.Поле = “Товары[” + (ВыборкаДетальныеЗаписи.НомерСтроки – 1) + “].Количество”;
    Сообщение.УстановитьДанные(ЭтотОбъект);
    Сообщение.Сообщить();

    КонецЦикла;

    КонецЕсли;

    КонецПроцедуры
    </code>

    Как отчитываться по отчётам не знаю, могу например привести текст запроса по отчёту о долгах по менеджерам:
    <code>
    ВЫБРАТЬ
    Менеджеры.Менеджер,
    Менеджеры.Контрагент,
    Остатки.ДолгКонтрагента КАК СуммаОстаток
    ИЗ
    РегистрСведений.МенеджерыКонтрагентов КАК Менеджеры
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    ВзаиморасчетыСКонтрагентами.Контрагент КАК Контрагент,
    СУММА(ВзаиморасчетыСКонтрагентами.ДолгКонтрагента) КАК ДолгКонтрагента
    ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами

    СГРУППИРОВАТЬ ПО
    ВзаиморасчетыСКонтрагентами.Контрагент) КАК Остатки
    ПО Менеджеры.Контрагент = Остатки.Контрагент
    </code>
    Добавлю только, что в настройках отчёта установлена группировка по менеджерам и указан ресурс – СуммаОстатка. Параметр Период – включен в пользовательские настройки (быстрый доступ).

  18. Виталий Межаков 20.05.2011 в 23:00

    Задание выполнил.
     
    1. Организовал условное проведение документа реализации аналогично примеру в материалах курса.
    2. Настроил механизм хранения пользовательских настроек при помощи ПВХ “Настройки пользователей”. Аналогично примеру со свойствами в материалах курса. Доработал соответствующим образом алгоритм проведения реализации. Организовал общую серверную процедуру для определения значений настроек пользователя.
    3. Для реализации кнопки “Проведение без контроля” в форме списка, добавил в модуль объекта реализации экспортную переменную “”Контроль остатка”, на которую завязал обработку проведения. При вызове проведения по кнопке из формы списка устанавливаю соответствующее значение переменной.
    4. Организовал учет продаж в разрезе контрагентов, номенклатуры, менеджеров.
    5. Обеспечил ведение взаиморасчетов с контрагентами. Для этого организовал регистр накопления “Взаиморасчеты с контрагентами”. В своей учетной системе предполагаю, что увеличение значения “Сумма взаиморасчетов” обозначает увеличение задолженности контрагента(поставщика или покупателя) перед нашей организацией. Соответственно этому предположению организовал модули проведения документов. Добавил в систему документ “Выписка”.
    6. Исключил учет услуг на регистре остатков.
    7. Доработал систему для учета наборов. Для этого в справочник “Номенклатура” добавил табличную часть “Состав набора” с полями “Комплектующая” и “Количество”.  Далее, в документы поступления и реализации добавил системную, невидимую для пользователя табличную часть “Состав комплекта” с полями “Комплект”, “Качество”, “Комплектующая”, “Количество”. Табличная часть синхронизируется с наборами из табличной части товары перед записью документа в общей серверной процедуре. Такое хранение необходимо для обеспечения устойчивости решения к перепроведениям задним числом. Ключом, по которому можно отобрать из вспомогательной таблицы комплектующие является сочетание “Комплект + Качество”. Доработал модули проведения документов поступления и реализации таким образом, чтобы данные о комплектующих брались из вспомогательных табличных частей. Также модернизировал запрос для контроля остатков
    8. Разработал три указанных в задании отчета при помощи системы компоновки данных, тут сложностей не возникло.
     
    Обратная связь.
    1. Открыл для себя механику контроля остатков, принятую в новой версии платформы. Током разобрался в работе с ПВХ. Стал увереннее работать с регистрами. Особенно это касается регистров сведений.
    2. Весь материал был достаточно доступным.
    3. Более подробно хотелось бы узнать о “черной лошадке” СКД. =)

  19. kuznetsovimail 20.05.2011 в 22:35

    Обработка проведения реализации товаров
    <code>

    Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    Для Каждого ТекСтрокаТовары Из Товары Цикл
    Если ТипЗнч(ТекСтрокаТовары.Номенклатура)=Тип(“ПланВидовХарактеристикСсылка.Набор”) тогда
    Выборка=ТекСтрокаТовары.Номенклатура.табличнаяЧасть1.Количество() ;
    Для й=0 по Выборка-1 цикл
    Движение1= Движения.УчетПродаж.Добавить();
    Движение1.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение1.Период = Дата;
    Движение1.Контрагент = Контрагент;
    Движение1.КонтактноеЛицо = КонтактноеЛицо;
    Движение1.Номенклатура =ТекСтрокаТовары.Номенклатура.табличнаяЧасть1[й].Номенклатура;
    Движение1.Количество =ТекСтрокаТовары.Номенклатура.табличнаяЧасть1[й].Количество;
    Движение1.Сумма =ТекСтрокаТовары.Номенклатура.табличнаяЧасть1[й].Количество*
    ТекСтрокаТовары.Номенклатура.табличнаяЧасть1[й].Цена;
    Движение = Движения.ОстаткиНоменклатуры.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Номенклатура = ТекСтрокаТовары.Номенклатура.табличнаяЧасть1[й].Номенклатура;
    Движение.Количество = ТекСтрокаТовары.Номенклатура.табличнаяЧасть1[й].Количество;

    КонецЦикла;
    Иначе
    Движение1= Движения.УчетПродаж.Добавить();
    Движение1.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение1.Период = Дата;
    Движение1.Контрагент = Контрагент;
    Движение1.КонтактноеЛицо = КонтактноеЛицо;
    Движение1.Номенклатура = ТекСтрокаТовары.Номенклатура;
    Движение1.Количество = ТекСтрокаТовары.Количество;
    Движение1.Сумма = ТекСтрокаТовары.Количество*ТекСтрокаТовары.Цена;

    Движение = Движения.ОстаткиНоменклатуры.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
    Движение.Качество = ТекСтрокаТовары.Качество;
    Движение.Количество = ТекСтрокаТовары.Количество;

    КонецЕсли;

    КонецЦикла;
    Движения.ОстаткиНоменклатуры.Записать();
    Движения.УчетПродаж.Записать();

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

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

    • Пожелание по расширению списка уроков в конфигурации записано, спасибо.

  20. Первые пункты по “Реализации товаров”:
    <code>
    Процедура ОбработкаПроведения(Отказ, РежимПроведения)

    Отказ = ОбработкаДокументов.ПроверкаНаУслуги(Услуги);

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

    Движение = Движения.ОстаткиТоваров.ДобавитьРасход();
    Движение.Период = Дата;
    Движение.Номенклатура = СтрокаСпец.Номенклатура;
    Движение.Качество = СтрокаТабл.Качество;
    Движение.Количество = СтрокаСпец.Количество*СтрокаТабл.К;

    КонецЦикла;
    КонецЕсли;
    КонецЦикла;
    Движения.ОстаткиТоваров.Записать();

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

    Граница = Новый Граница(МоментВремени(),ВидГраницы.Включая);
    Запрос.УстановитьПараметр(“Момент”, Граница);
    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);

    Результат = Запрос.Выполнить();

    Если НЕ Результат.Пустой() Тогда

    Выборка = Результат.Выбрать();
    Пользователь = ПоискПользователя.НайтиПольз();
    Если Пользователь.Проводимость= Истина Тогда
    Отказ = Ложь;
    Иначе
    Отказ = Истина;
    КонецЕсли;

    Пока Выборка.Следующий() Цикл

    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Нехватка товара! В количестве: “+Выборка.Количество+” в качестве “+Выборка.Качество;
    //Сообщение.Поле = “Товары[“+(Выборка.НомерСтроки-1)+”].Количество”;
    Сообщение.УстановитьДанные(ЭтотОбъект);
    Сообщение.Сообщить();

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

    Движение = РегистрыНакопления.ОстаткиТоваров.СоздатьНаборЗаписей();
    Движение.Записывать = Истина;
    Движение.Отбор.Регистратор.Значение = Ссылка;

    Для каждого Строка Из Ссылка.Товары Цикл

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

    Граница = Новый Граница(ДатаОкончания,ВидГраницы.Включая);
    Запрос.УстановитьПараметр(“КонецПериода”, Граница);
    Запрос.УстановитьПараметр(“НачалоПериода”, ДатаНачала);
    Запрос.УстановитьПараметр(“Ссылка”, Контрагент);

    Результат = Запрос.Выполнить().Выгрузить();

    Объект.Сверка.Загрузить(Результат);
    </code>
    Услуги реализовал дополнительной табличной частью для документов закупки и продажи при проведении этих документов происходит проверка на вид номенклатуры товары в табл. части “Услуги”.
    Набор реализован с помощью отдельного справочника спецификации (явл. реквизитом справочнике “номенклатура”). При добавлении номенклатуры в документы, если спецификация есть, то добавляется в строку таб. “Товары”. Может быть немного некрасиво, но при переборе строк таблицы (ЗначениеЗаполнено(строка.Спецификация)) нахожу комплекты номенклатуры при переборе строк табл части “Товары” и делаю движения по регистрам накопления.
    С отчетами проблем не возникло.
    1. Много нового узнал по запросам и движении регистров.
    2. Проблем не возникло.
    3. Дополнительную тему можно по файлам xml и конфигурации “Конвертация данных.”

  21. ОТЧЕТ ДЗ №9
     РЕГИСТРЫ.

    Создал регистры Продажи измерения: Покупатель, Номенклатура, Менеджер, ресурсы: Количество, Сумма; Взаиморасчеты измерения: Контрагент, ресурсы: Сумма.
    Создал РегистрСведений Наборы измерение Набор, Ресурсы: Номенклатура, Количество, ЕдиницаИзмерения. Непериодический, независимый.

     ДОКУМЕНТЫ.

    Добавил реквизит СуммаДокумента в док. РасходнаяНакладная, обработал в событии ПриЗаписи;
    Добавил табличные части «Комплектующие» в док. ПриходнаяНакладная и РасходнаяНакладная, реквизиты: Номенклатура, Качество, ЕдиницаИзиерения, Количество. В формах документов разложил по Страницам. В КоманднойПанели таблицы Товары разместил кнопку «Заполнить комплектующие», Действие команды:

    <code>&НаКлиенте
    Процедура ЗаполнитьКомплектующие(Команда)
                  
                   ЗаполнитьКомплектующиеСервер();
                  
    КонецПроцедуры
     
    &НаСервере
    Процедура ЗаполнитьКомплектующиеСервер()
     
                   Запрос = Новый Запрос;
                   Запрос.Текст =
                                   “ВЫБРАТЬ
                                   |             Наборы.Номенклатура,
                                   |             Наборы.ЕдиницаИзмерения,
                                   |             ЗНАЧЕНИЕ(Справочник.Качество.Новый) КАК Качество,
                                   |             Наборы.Количество * РасходнаяНакладнаяТовары.Количество * РасходнаяНакладнаяТовары.Коэффициент КАК Количество
                                   |ИЗ
                                   |             Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
                                   |                             ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Наборы КАК Наборы
                                   |                             ПО РасходнаяНакладнаяТовары.Номенклатура = Наборы.Набор
                                   |ГДЕ
                                   |             РасходнаяНакладнаяТовары.Ссылка = &Ссылка”;
     
                   Запрос.УстановитьПараметр(“Ссылка”, Объект.Ссылка);
     
                   Результат = Запрос.Выполнить();
                  
                   Объект.Комплектующие.Загрузить(Результат.Выгрузить());
     
    КонецПроцедуры // ЗаполнитьКомплектующиеСервер()</code>
     
    Доработал алгоритмы проведения документов: по рег. Запасы провожу только номенклатуру с Видом Номенклатуры = Товар и номенклатуру из табличной части Комплектующие, у этой табличной части поставил Параметры выбора Отбор.ВидНоменклатуры = Товар.
     
    Из табличной части Товары все элементы провожу по регистрам «Закупки» и «Продажи», в соответствии с хоз. Операцией.
     
    По рег. Взаиморасчеты провожу общую Сумму по документам из реквизита СуммаДокумента.
     
    Контроль отрицательных остатков, с отключением по пользователю (добавил новый реквизит в спр. Пользователи – КонтролироватьОстаткиПриПроведении), с сообщением на конкретную строку … сделал вот так: записал все движения из табличных частей Товары и Комплектующие, затем извлек остатки вот таким запросом:
    <code>                …Движения.Запасы.Записать();           
     
                   // контроль отрицательных остатков для запасов
                   Запрос = Новый Запрос(“ВЫБРАТЬ
                                         |       ЗапасыОстатки.Номенклатура,
                                         |       ЗапасыОстатки.Качество,
                                         |       СУММА(ЗапасыОстатки.КоличествоОстаток) КАК Нехватка,
                                         |       ДанныеДокумента.НомерСтроки
                                         |ИЗ
                                         |       РегистрНакопления.Запасы.Остатки(
                                         |                                      &Момент,
                                         |                                      Номенклатура В
                                         |                                                      (ВЫБРАТЬ РАЗЛИЧНЫЕ
                                         |                                                                      РасходнаяНакладнаяТовары.Номенклатура
                                         |                                                      ИЗ
                                         |                                                                      Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
                                         |                                                      ГДЕ
                                         |                                                                      РасходнаяНакладнаяТовары.Ссылка = &Ссылка
                                         |                                                                      И РасходнаяНакладнаяТовары.Номенклатура.ВидНоменклатуры = &ВидНоменклатуры)) КАК ЗапасыОстатки
                                         |                       ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                                         |                                      РасходнаяНакладнаяТовары.Номенклатура КАК Номенклатура,
                                         |                                      МАКСИМУМ(РасходнаяНакладнаяТовары.НомерСтроки) КАК НомерСтроки
                                         |                       ИЗ
                                         |                                      Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
                                         |                       ГДЕ
                                         |                                      РасходнаяНакладнаяТовары.Ссылка = &Ссылка
                                         |                      
                                         |                       СГРУППИРОВАТЬ ПО
                                         |                                      РасходнаяНакладнаяТовары.Номенклатура) КАК ДанныеДокумента
                                         |                       ПО ЗапасыОстатки.Номенклатура = ДанныеДокумента.Номенклатура
                                         |ГДЕ
                                         |       ЗапасыОстатки.КоличествоОстаток < 0
                                         |
                                         |СГРУППИРОВАТЬ ПО
                                         |       ЗапасыОстатки.Номенклатура,
                                         |       ЗапасыОстатки.Качество,
                                         |       ДанныеДокумента.НомерСтроки”);
                                                                                                   
                                                                                                   
                   Запрос.УстановитьПараметр(“Ссылка”,           Ссылка);                                                             
                   Граница = Новый Граница( МоментВремени(), ВидГраницы.Включая);
                   Запрос.УстановитьПараметр(“Момент”, Граница);
                   Запрос.УстановитьПараметр(“ВидНоменклатуры”, Перечисления.ВидыНоменклатуры.Товар);
                  
                   Результат = Запрос.Выполнить();
                   Если НЕ Результат.Пустой() Тогда
                                  
                                   Если КонтрольОтрицательныхОстатков Тогда
                                                   Отказ = Истина;
                                   КонецЕсли;
                                  
                                   Выборка = Результат.Выбрать();
                                   Пока Выборка.Следующий() Цикл
                                                  
                                                   Сообщение = Новый СообщениеПользователю;
                                                   Сообщение.Текст = “Нехватка товара в количестве”+-Выборка.Нехватка;
                                                   Сообщение.Поле = “Товары[“+(Выборка.НомерСтроки-1)+”].Количество”;
                                                   Сообщение.УстановитьДанные(ЭтотОбъект);
                                                  Сообщение.Сообщить();
                                  
                                   КонецЦикла;
                  
                   КонецЕсли;</code>
     
    Аналогично поступил для табличной части “Комплектующие».
    В док. РасходнаяНакладная добавил Команду «ПровестиБезКонтроля», свойства Группа – Командная панель формы.Важное, Тип параметра – ДокументСсылка.РасходнаяНакладная, режим использования Множественный. Код модуля:
    <code>&НаКлиенте
    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
                   
                    БезУсловноеПроведение(ПараметрКоманды);
                   
    КонецПроцедуры
     
    &НаСервере
    Процедура БезУсловноеПроведение(МассивДокументов)
     
                    Для каждого ДокСсылка Из МассивДокументов Цикл
                                   ДокСсылка.ПолучитьОбъект().Записать(РежимЗаписиДокумента.Проведение);
                    КонецЦикла;
     
    КонецПроцедуры // БезУсловноеПроведение()</code>
     
    Создал док. «Выписка», табл. Часть «Платежи»: Контрагент, Приход, Расход. Исключил возможность ввод суммы в Приход и Расход в одной строке. Вот так
    <code>&НаКлиенте
    Процедура ПлатежиПриходПриИзменении(Элемент)
                   
                    Если Элементы.Платежи.ТекущиеДанные.Расход > 0 Тогда
                        Элементы.Платежи.ТекущиеДанные.Приход = 0;
                    КонецЕсли;
                   
    КонецПроцедуры</code>
    Процедуру ОбработкаПроведения изготовил конструктором и немного доработал.
     
    ОТЧЕТЫ. ( Все изготовил компоновкой)
    ДолгиПоМенеджерам. НаборДанных – Запрос
    <code>ВЫБРАТЬ
                    ВзаиморасчетыОстатки.Контрагент,
                    ВзаиморасчетыОстатки.СуммаОстаток,
                    МенеджерыКонтрагентовСрезПоследних.Менеджер
    ИЗ
                    РегистрНакопления.Взаиморасчеты.Остатки КАК ВзаиморасчетыОстатки
                                   ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МенеджерыКонтрагентов.СрезПоследних КАК МенеджерыКонтрагентовСрезПоследних
                                   ПО ВзаиморасчетыОстатки.Контрагент = МенеджерыКонтрагентовСрезПоследних.Контрагент</code>
    Ресурсы: Сумма(СуммаОстаток)
    Параметры: Период тип только Дата
    Настройки – Список Менеджер\Контрагент. Быстрый отбор Период.
     
     Прогнозный финансовый результат. Источник-Запрос
    <code>ВЫБРАТЬ
                    ЗапасыОстатки.Номенклатура,
                    ЗапасыОстатки.КоличествоОстаток,
                    ЦеныНоменклатурыСрезПоследних1.Цена КАК ЦенаЗакупки,
                    ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаПродажи
    ИЗ
                    РегистрНакопления.Запасы.Остатки КАК ЗапасыОстатки
                                   ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦен = &ЦенаПродажи) КАК ЦеныНоменклатурыСрезПоследних
                                   ПО ЗапасыОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
                                   ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦен = &ЦенаЗакупки) КАК ЦеныНоменклатурыСрезПоследних1
                                   ПО ЗапасыОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних1.Номенклатура
    </code>
    Вычисляемое поле ФинРезультат = (ЦенаПродажи-ЦенаЗакупки)*КоличествоОстаток
    Ресурсы: Сумма(Количество), Сумма(ФинРезультат), ЦенаЗакупки, ЦенаПродажи
    Параметры: Период тип только Дата, ЦенаЗакупки, ЦенаПродажи
    Настройка: Список. Быстрые настройки Цена закупки, Цена продажи.
     
     РейтингМенеджеров
    Запрос: <code>ВЫБРАТЬ
                    ЕСТЬNULL(ПродажиОбороты.Менеджер, ВложенныйЗапрос.Менеджер) КАК Менеджер,
                    СУММА(ЕСТЬNULL(ВложенныйЗапрос.СуммаОстаток, 0)) КАК СуммаОстаток,
                    СУММА(ЕСТЬNULL(ПродажиОбороты.СуммаОборот, 0)) КАК СуммаОборот
    ИЗ
                    РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
                                   ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                                                   ВзаиморасчетыОстатки.Контрагент КАК Контрагент,
                                                   ВзаиморасчетыОстатки.СуммаОстаток КАК СуммаОстаток,
                                                   МенеджерыКонтрагентовСрезПоследних.Менеджер КАК Менеджер
                                   ИЗ
                                                   РегистрНакопления.Взаиморасчеты.Остатки(, ) КАК ВзаиморасчетыОстатки
                                                                   ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МенеджерыКонтрагентов.СрезПоследних КАК МенеджерыКонтрагентовСрезПоследних
                                                                   ПО ВзаиморасчетыОстатки.Контрагент = МенеджерыКонтрагентовСрезПоследних.Контрагент) КАК ВложенныйЗапрос
                                   ПО ПродажиОбороты.Менеджер = ВложенныйЗапрос.Менеджер
     
    СГРУППИРОВАТЬ ПО
                    ЕСТЬNULL(ПродажиОбороты.Менеджер, ВложенныйЗапрос.Менеджер) </code>
    Исправил заголовки на Продажи и Дебиторка.
    Добавил вычисляемое поле Разница. Ресурсы Сумма(Продажи), Сумма(Дебиторка)
    Добавил параметр СтандартныйПериод через него определил «Выражение» для параметров используемых в Запросе: Период – &СтандартныйПериод.ДатаОкончания, соответственно для НачалоПериода, КонецПериода. Отметил все что нужно.
    Вывел Списком, упорядочил по полю Разница (По убыванию) + быстрый отбор периода

  22. Yuri Golovko 20.05.2011 в 17:50

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

  23. Задание выполнил все получилось.
    Право проведение без контроля сделал через регистр сведений “дополнительные права” и ПланВидовХарактеристик “Дополнительные права пользователей” с предопределенным элементом “ПравоПроведенияБезКонтроляОстатков”.
    В дальнейшем можно будет добавлять права, а механизм получения и хранения будет единым.

    Для услуг реализована отдельная таличная часть “Услуги”.

    В отчетах на СКД удобно пользоваться Стандартным периодом.

    По 2-му блоку:
    1. Очень удобно оказалось в конструкторе запросов использовать конструктор для под запросов в условиях и параметрах.
    2. Затруднений небыло все по полочкам.
    3. Какими принципами лучше руководствоваться чтобы подсистемы были максимально автономными и построеный на основе подсистем интерфейс максимально наглядным/удобным

    • В продвинутом курсе мы отмечаем моменты “стандартизации” интерфейсов.

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

  25. Задания оказалось не простым… Скорее из-за нехватки времени. НО ОЧЕНЬ ПОЛЕЗНЫМ
    Каждый шаг – в обнимку с “Синтакс-Помощником”. Возможно что-то перемудрил.

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

    Очень МНОГО ВРЕМЕНИ ушло на СИНХРОНИЗАЦИЮ табличной части Товаров с Комплектующими (в основном на эксперименты)
    Для этого в табл.части Комплектующие вставил поле Ключ равный идентификатору строки в ТЧ Товары.
    При изменении или удалении строки в ТЧ Товары происходят изменения в ТЧ Комплектующие

    Следующая БО’ЛЬШАЯ часть времени ушла на оптимизацию проведений документов Поступления и Реализация.
    Использовал новый алгоритм 8.2 и следующую идею:
    одним запросом строю универсальную таблицу значений, которую после некоторых преобразований загружаю поэтапно в наборы записей регистров
    (у документа Поступления – Остатки,Закупки,ДолгиКонтрагентов, у Реализации – Остатки, Продажи, ДолгиКонтрагентов).

    Пример для документа поступления:

    Процедура ОбработкаПроведения(Отказ, Режим)

    Движения.ОстаткиТоваров.Записывать     = Истина;
    Движения.Закупки.Записывать             = Истина;
    Движения.ДолгиКонтрагентов.Записывать     = Истина;

    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    |    ПоступлениеТоваровТовары.ВидНоменклатуры КАК ВидНоменклатуры,
    |    ПоступлениеТоваровТовары.Номенклатура КАК Номенклатура,
    |    СУММА(ПоступлениеТоваровТовары.Количество * ПоступлениеТоваровТовары.Коэффициент) КАК Количество,
    |    СУММА(ПоступлениеТоваровТовары.Сумма) КАК Сумма,
    |    ПоступлениеТоваровТовары.СостояниеТовара КАК Состояние,
    |    &Поставщик КАК Поставщик,
    |    &Поставщик КАК Контрагент,
    |    &Период КАК Период
    |ИЗ
    |    Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
    |ГДЕ
    |    ПоступлениеТоваровТовары.Ссылка = &Ссылка
    |СГРУППИРОВАТЬ ПО
    |    ПоступлениеТоваровТовары.ВидНоменклатуры,
    |    ПоступлениеТоваровТовары.Номенклатура,
    |    ПоступлениеТоваровТовары.СостояниеТовара
    |
    |ОБЪЕДИНИТЬ ВСЕ
    |
    |ВЫБРАТЬ
    |    0 КАК ВидНоменклатуры,
    |    ПоступлениеТоваровКомплектующие.Комплектующее КАК Номенклатура,
    |    СУММА(ПоступлениеТоваровКомплектующие.Количество) КАК Количество,
    |    0 КАК Сумма,
    |    ПоступлениеТоваровКомплектующие.СостояниеКомплектующего КАК Состояние,
    |    &Поставщик КАК Поставщик,
    |    &Поставщик КАК Контрагент,
    |    &Период КАК Период
    |ИЗ
    |    Документ.ПоступлениеТоваров.КомплектующиеНаборов КАК ПоступлениеТоваровКомплектующие
    |ГДЕ
    |    ПоступлениеТоваровКомплектующие.Ссылка = &Ссылка
    |СГРУППИРОВАТЬ ПО
    |    
    |    ПоступлениеТоваровКомплектующие.Комплектующее,
    |    ПоступлениеТоваровКомплектующие.СостояниеКомплектующего”;

    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
    Запрос.УстановитьПараметр(“Поставщик”, ?(ЗначениеЗаполнено(Контрагент),Контрагент,ПодотчетноеЛицо));  
    Запрос.УстановитьПараметр(“Период”, Дата);
    Запрос.УстановитьПараметр(“Услуга”, Перечисления.ВидыНоменклатуры.Услуга);

    Результат = Запрос.Выполнить();   

    ТаблицаДвижений = Результат.Выгрузить();

    ТаблицаДвиженийЗакупок = ТаблицаДвижений.Скопировать();
    //закупки: предварительно НАДО убрать строки с комплектующими (пустой вид):
    МассивСтрок = ТаблицаДвиженийЗакупок.НайтиСтроки(Новый Структура(“ВидНоменклатуры”,0));
    Если МассивСтрок.Количество() > 0 Тогда
    Для каждого Строка Из МассивСтрок Цикл
    ТаблицаДвиженийЗакупок.Удалить(Строка);
    КонецЦикла;
    КонецЕсли;

    //предварительно свернем:
    ТаблицаДвиженийЗакупок.Свернуть(“Период,Поставщик,Номенклатура”,”Сумма,Количество”);

    Движения.Закупки.Загрузить(ТаблицаДвиженийЗакупок); //загружаем закупки

    //что касается остатков: предварительно НАДО убрать строки с услугой и набором. Берем ИСХОДНУЮ таблицу ТаблицаДвижений:

    МассивСтрок = ТаблицаДвижений.НайтиСтроки(Новый Структура(“ВидНоменклатуры”,Перечисления.ВидыНоменклатуры.Набор));
    Если МассивСтрок.Количество() > 0 Тогда
    Для каждого Строка Из МассивСтрок Цикл
    ТаблицаДвижений.Удалить(Строка);
    КонецЦикла;
    КонецЕсли;
    МассивСтрок = ТаблицаДвижений.НайтиСтроки(Новый Структура(“ВидНоменклатуры”,Перечисления.ВидыНоменклатуры.Услуга));
    Если МассивСтрок.Количество() > 0 Тогда
    Для каждого Строка Из МассивСтрок Цикл
    ТаблицаДвижений.Удалить(Строка);
    КонецЦикла;
    КонецЕсли;

    //предварительно сворачиваем
    ТаблицаДвижений.Свернуть(“Период,Номенклатура,Состояние”,”Количество”);
    Движения.ОстаткиТоваров.Загрузить(ТаблицаДвижений); //загружаем остатки

    //для учета взаиморасчетов можно взять таблицу движений закупок  – НО ЕСЛИ поставка ЧЕРЕЗ ПОСТАВЩИКА
    Если ЗначениеЗаполнено(Контрагент) Тогда
    ТаблицаДвиженийЗакупок.Свернуть(“Период,Поставщик”,”Сумма”);

    //поменяем имя на контрагента
    ТаблицаДвиженийЗакупок.Колонки.Поставщик.Имя = “Контрагент”;

    //добавим Вид движения – УМЕНЬШЕНИЕ долга поставщика (по умолчанию таблица загружается в набор данных с видом движения = ПРИХОД!!)
    ТаблицаДвиженийЗакупок.Колонки.Добавить(“ВидДвижения”);
    ТаблицаДвиженийЗакупок.ЗаполнитьЗначения(ВидДвиженияНакопления.Расход,”ВидДвижения”);

    Движения.ДолгиКонтрагентов.Загрузить(ТаблицаДвиженийЗакупок); //загружаем долги
    КонецЕсли;

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

    ЧТО НЕ СДЕЛАЛ…

    При проведении ИЗ СПИСКА документа реализации НЕ СМОГ проставить признак “Проведен” у документа.
    Не смог вывести сообщение при проведении без контроля у пользователя. Окно сообщений закрывается. Метод “борьбы” с этим видел где-то в видео уроках…

    Скажу кратко (извиняюсь, устал) – БЛОК очень полезный.  Конфигурацию ДЗ-9 подвожу к “товарному виду” :) – знаний уже хватает.
    Катастрофически не хватало времени: 2-3 часов в день на вдумчивое “переваривание” информации не хватает – осознавать начинаешь лишь при выполнении ДЗ.  Краду рабочее время …

  26. Yuri Golovko 20.05.2011 в 14:28

    Задание выполнил

  27. Мария 20.05.2011 в 09:46

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

  28. Юрий Торговцев 19.05.2011 в 23:48

    Задание выполнил.

    Возможность отключения контроля для конкретного пользователя
    реализована с помощью добавления реквизита КонтрольОстатков
    типа Булево по умочанию Истина в справочник Пользователи.
    В зависимости от текщего значения этого реквизита строится
    логика процедуры ОбработкаПроведения() документа РеализацияТоваров.

    В процедуре ОбработкаПоведения() документа Выписка приход денежных средств
    относится к ВидДвижения.Расход регистра Взаиморасчеты, а расход соответственно
    к ВидДвижения.Приход.

    СуммыДокумента документов поступления относятся к ВидДвижения.Расход,
    а документов отгрузки ВидДвижения.Приход регистра Взаиморасчеты.

    Исключил поступление наборов и услуг в регистр ОстаткиНоменклатуры. Для этого
    в запрос процедуры ОбработкаПоведения() документа ПоступлениеТоваров
    добавил следующее условие
    <code>
    ПоступлениеТоваровТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)
    </code>
    Добавил условие на добавления записей в регистр ОстаткиНоменклатуры
    <code>
    ТекСтрокаТовары.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар
    </code>
    для документа РеализацияТоваров.

    Для описания наборов создал справочник СоставНаборов реквизитами
    Комплектующая типа СправочникСсылка.Номенклатура и Количество Число 15.3.
    В документы товародвижения добавил табличные части Состав в которые при
    наличии номенклатуры с видом номенклатуры Набор в обработчике ПередЗаписьюНаСервере()
    запросом выбираются составляющие набора и др. и с помощью следующего кода
    <code>
    ТекущийОбъект.Состав.Загрузить(Результат.Выгрузить());
    </code>
    загружаются в табличную часть Состав.
    В обработки проведения добавил поступление в регистры информации из
    табличной части Состав.

    С помощью конструктора запросов создал отчеты. Макет отчета ПрогнозируемыйФинансовыйРезультат
    сотоит из 2х наборов данных типа запрос к ЦеныНоменклатурыСрезПоследних и 1 го к
    ОстаткиНоменклатурыОстатки.КоличествоОстаток объединением их на закладке СвязиНаборовДанных
    и вычисляемого поля ФинРезультат с выражением ЦенаПродажи – ЦенаЗакупки и  настройки.

    1. Много интересных ньюансов. Особенно при работе с регистрами.
    2. Особых затруднений не было главная трудность лимит времени.

  29. кнопка «Провести без контроля» – делает движения всех документов или документа где стоит курсор в списке док-тов?

    • Кнопка работает для текущего документа.

  30. Задание выполнила. Не понятно, как надо было соединить две проверки на качество и количество, запрос на качество и вложенный запрос на количество практически одинаковы, но у них разные условия, сделала 2 разные проверки.
    http://fotoifolder.ru/view_full_size/c4j7pj1xjc12
    По учету продаж сделала регистр накопления обороты
    Взаимозачет и выписка
    http://fotoifolder.ru/view_full_size/yos2n8kureg6
    Отчеты
    http://fotoifolder.ru/view_full_size/fozcg7t_bm56
     

  31. Андрей Кусанов 19.05.2011 в 17:48

    Задание понравилось. Выполнял довольно долго, много вариантов и соблазн рюшек.

    ~) В Расх. накл. применил новый метод контроля остатков.
    Создал ПВХ “НастройкиПользователей” с предопр. хар-кой “РазрешитьОтрицательныеОстатки” (булево).
    Регистр сведений “НастройкиПользователей” с изм. “Пользователь” и “Параметр” (ПланВидовХарактеристикСсылка.НастройкиПользователей).
    Ресурс “Значение” (Характеристика.НастройкиПользователей).
    Новый Параметр сеанса “РазрешитьОтрицательные” инициализируется в модуле сеанса и при записи в модуле набора записей регистра.

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

    <code>
    &НаСервере
    Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
    Если ТекущийОбъект.ДополнительныеСвойства.Свойство(“Ошибки”) Тогда
    ЭтаФорма.БылиОшибки = Истина;
    КонецЕсли;
    КонецПроцедуры

    &НаКлиенте
    Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    Если ЭтаФорма.БылиОшибки Тогда
    Если НЕ Вопрос(“Были ошибки! Закрыть форму?”, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда
    Отказ = Истина;
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры
    </code>

    Расходная накладная, модуль объекта:
    <code>
    Процедура ОбработкаПроведения(Отказ, РежимПроведения)

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

    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
    Запрос.УстановитьПараметр(“ВидДвижения”, ВидДвиженияНакопления.Расход);

    //списываем с остатков сразу
    ТабДвижений = Запрос.Выполнить().Выгрузить();

    МассивРегистров = Новый Массив;
    МассивРегистров.Добавить(“ОстаткиНоменклатуры”);
    ДвиженияПоРегистрамСервер.ДвиженияПоНоменклатуреРасход(Движения, ТабДвижений, МассивРегистров, Истина);

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

    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
    Запрос.УстановитьПараметр(“ГраницаВключая”, Новый Граница(МоментВремени(), ВидГраницы.Включая));

    Результат = Запрос.Выполнить();

    Если НЕ Результат.Пустой() Тогда

    Отказ = НЕ ПараметрыСеанса.РазрешитьОтрицательные;

    ВыборкаДетальныеЗаписи = Результат.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Нехватает “+-ВыборкаДетальныеЗаписи.КоличествоОстаток+” базовых единиц номенклатуры “+ВыборкаДетальныеЗаписи.НоменклатураПредставление+” с качеством “+ВыборкаДетальныеЗаписи.КачествоПредставление;
    Сообщение.Поле = Строка(ВыборкаДетальныеЗаписи.ИмяТЧ)+”[“+(ВыборкаДетальныеЗаписи.НомерСтроки-1)+”].”+?(Строка(ВыборкаДетальныеЗаписи.ИмяТЧ)=”Комплектующие”,”КоличествоБазовыхЕдиниц”,”Количество”);
    Сообщение.УстановитьДанные(ЭтотОбъект);
    Сообщение.Сообщить();
    КонецЦикла;

    Если НЕ Отказ Тогда
    ДополнительныеСвойства.Вставить(“Ошибки”, “Были отрицательные остатки!!!”);
    КонецЕсли;

    КонецЕсли;

    Если НЕ Отказ Тогда

    МассивРегистров = Новый Массив;
    МассивРегистров.Добавить(“Продажи”);
    ДвиженияПоРегистрамСервер.ДвиженияПоНоменклатуреРасход(Движения, ТабДвижений, МассивРегистров);

    //Взаиморасчеты
    Движения.Взаиморасчеты.Записывать = Истина;
    Движение = Движения.Взаиморасчеты.ДобавитьПриход();
    Движение.Период = Дата;
    Движение.Контрагент = Контрагент;
    Движение.Сумма = СуммаДокумента;

    КонецЕсли;

    КонецПроцедуры
    </code>

    ~) В форме списка расх. накл. команда “ПровестиБезКонтроля”. Запретил это действие пользователям без настройки “РазрешитьОтрицательныеОстатки” Истина.
    В серверной функции делаю запрос к таб. частям РН, с целью получить выгрузку “ТабДвижений” (таб. значений).
    Движения по регистрам делаю в транзакции теми же общими процедурами, что и из модуля объекта. Эти процедуры принимают параметры, в т.ч. записывать ли принудительно движения.
    В этом случае – принудительно.
    Регистр продаж – обороты. Взаиморасчеты – остатки. Выписка при приходе денег уменьшает долг контрагента.
    Услуги и наборы в отдельных таб. частях. Для элемента “Номенклатура” указал “ПараметрыВыбора” Отбор.ВидНоменклатуры.
    В тч “Услуги” выбираются только услуги.
    В тч “Товары” выбираются товары и наборы. Для наборов в тч. есть реквизит “ЭтоНабор” – зап. при изм. ном-ры.
    Этот мех-зм нужен для устойчивости перепроведения документа. Признак и состав набора сохраняются в документе.
    Есть команда формы “ЗаполнитьКомплектующие”, вызываемая как кнопкой, так и “перед записью” формы. Так происходит первое заполнение тч “Комплектующие” и перезаполнение
    ее в случае мродифицированности формы.
    Состав комплекта заполняется в тч справочника “Номенклатура” – “Комплектующие” и читается при перезаполнении документа.
    В этой тч есть колонки “ЭлементНабора” (ном.), “Качество”, “КоличествоБазовыхЕдиниц”.

    <code>
    &НаКлиенте
    Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    Если Объект.Комплектующие.Количество() = 0 Тогда
    ЗаполнитьКомплектующиеСервер();
    ИначеЕсли Модифицированность Тогда
    Если Вопрос(“Таблица комплектующих будет перезаполнена. Продолжить?”, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда
    ЗаполнитьКомплектующиеСервер();
    Иначе
    Отказ = Истина
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры
    </code>

    Фрагмент кода модуля формы списка РН (проведение без контроля из списка):

    <code>
    //запрос…
    ТабДвижений = Запрос.Выполнить().Выгрузить();

    МассивРегистров = Новый Массив;
    МассивРегистров.Добавить(“ОстаткиНоменклатуры”);
    МассивРегистров.Добавить(“Продажи”);

    ДвиженияПоРегистрамСервер.ДвиженияПоНоменклатуреРасход(Движения, ТабДвижений, МассивРегистров, Истина);

    //Взаиморасчеты
    ДвиженияВзаиморасчеты = ДокОбъект.Движения.Взаиморасчеты;
    ДвижениеВзаиморасчеты = ДвиженияВзаиморасчеты.ДобавитьПриход();
    ДвижениеВзаиморасчеты.Период = ТабДвижений[0].Период;
    ДвижениеВзаиморасчеты.Регистратор = Ссылка;
    ДвижениеВзаиморасчеты.Контрагент = ТабДвижений[0].Контрагент;
    ДвижениеВзаиморасчеты.Сумма = ТабДвижений[0].СуммаДокумента;
    ДвиженияВзаиморасчеты.Записать();

    Если Не Ссылка.Проведен Тогда
    ДокОбъект.Проведен = Истина;
    ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
    КонецЕсли;
    ЗафиксироватьТранзакцию();
    </code>

    Движения – Общий модуль для расхода:

    <code>
    Процедура ДвиженияПоНоменклатуреРасход(Движения, ТабДвижений, МассивРегистров, ЗаписатьПринудительно = Ложь) Экспорт

    //Продажи
    Если НЕ МассивРегистров.Найти(“Продажи”) = Неопределено Тогда

    ДвиженияПродажи = Движения.Продажи;
    ДвиженияПродажи.Записывать = НЕ ЗаписатьПринудительно;

    Для каждого Строка Из ТабДвижений Цикл
    Если Строка.ИмяТЧ = “Товары” ИЛИ Строка.ИмяТЧ = “Услуги” Тогда
    Движение = ДвиженияПродажи.Добавить();
    Движение.Сумма = Строка.Сумма;
    Движение.Количество = Строка.Количество;
    Движение.Контрагент = Строка.Контрагент;
    Движение.Менеджер = Строка.Менеджер;
    Движение.Номенклатура = Строка.Номенклатура;
    Движение.Период = Строка.Период;
    КонецЕсли;
    КонецЦикла;
    Если ЗаписатьПринудительно Тогда
    ДвиженияПродажи.Записать();
    КонецЕсли;
    КонецЕсли;

    //Остатки
    Если НЕ МассивРегистров.Найти(“ОстаткиНоменклатуры”) = Неопределено Тогда

    //без услуг
    ДвиженияОстаткиНоменклатуры = Движения.ОстаткиНоменклатуры;
    ДвиженияОстаткиНоменклатуры.Записывать = НЕ ЗаписатьПринудительно;

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

    КонецЕсли;

    КонецПроцедуры
    </code>

    По отчетам сложностей не возникло. По рейтингам менеджеров получился запрос:

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

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

    СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Менеджер) КАК ПродажиМенеджеры
    ПО ОстаткиМенеджеры.Менеджер = ПродажиМенеджеры.Менеджер
    </code>

    Обратная связь:
    1. Нового узнал много в деталях. Возможности 8.2 в основном.
    2. Материал во многом знакомый, сложностей не было.
    3. Хотелось бы рассмотреть СКД подробнее.

  32. Готово.
    В документы добавлен реквизит БазоваяЕИ  для устойчивости обработки проведения, заполняется при выборе Номенклатуры. в документ Реализация добавлен реквизит Менеджер, заполняется при выборе Контрагента запросом к регистру сведений МенеджерыКлиенты, недоступен для изменения.
    Проверка остатков по принципу 8.2.
    Отчеты. Первый без проблем, дата приводится к концу дня. Второй –  использование isnull для цен.
    Третий – поле для упорядочивания без вывода его в отчет.
    Наборы – регистр сведений СоставыКомплектов с измерением Номенклатура, если потребуется изменение во времени, можно будет сделать его периодическим. В документы поступления и отгрузки добавлен ТЧ Комплектующие для устойчивости при перепроведении. Тч заполняется при выборе Номенклатуры. Добавила Набор записей на форму Номенклатуры, при заполнении записываю в регистр. Также различные проверки, что набор не может состоять  из самого себя, очистка набора записей при смене типа номенклатуры (если не найдено ссылок в документах), и т.п

    • Обратная связь. С ПВХ  не работала, про другой метод контроля остатков тоже узнала впервые, очень полезно, спасибо.
      Затруднений пока нет, все при внимательном изучении материала обычно находится.
      По мастер-группе писала на почту  – про движения в регистрах, выполняемые документами при записи без проведения.

  33. 1. Применение клиентских и серверных процедур заставили больше внимания обращать на оптимизацию кода, чтобы лишний раз не обращаться к серверу.
    2. Особых затруднений не было
    3.  Хотелось бы узнать, чему отдать предпочтение при обработке данных формы – менее производительной обработке данных на клиенте или более производительной обработке с запросом к серверу?

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

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

  35. Виталий Межаков 18.05.2011 в 13:35

    Block2-402-part02-main называется в материалах “Установка параметров запроса. Обход результата запроса в цикле”, по факту показывает материал “Применимость нового способа проведения документов”
     
    Block2-402-part04-main называется в материалах “Проверка работы алгоритмов. Исправление ошибок”, по факту показывает материал “Установка параметров запроса. Обход результата запроса в цикле”
     
    Block2-402-part05-main называется в материалах “Как это было в 8.1. Написание запроса, получающего данные об остатках”, по факту показывает материал “Проверка работы алгоритмов. Исправление ошибок”
     
    Block2-402-part06-main называется в материалах “Как это было в 8.1. Обработка результата запроса. Формирование движений в регистрах”, по факту показывает материал “Как это было в 8.1. Написание запроса, получающего данные об остатках”
     
    Block2-402-part10-main называется в материалах “Применимость нового способа проведения документов”, по факту показывает материал “Как это было в 8.1. Обработка результата запроса. Формирование движений в регистрах”
     

    • Спасибо за информацию.
      Попробуйте использовать версию 19.1 конфигурации для просмотра курсов.

      • Виталий Межаков 18.05.2011 в 21:07

        По ссылке “Актуальная версия конфигурации 1.1.19.1” на странице с материалами курса скачивается релиз 1.1.18.2

        • Все-таки должен был скачиваться 19-й релиз.
          Попробуйте скачать другим браузером.

  36. какаято путаница в главе 12 файлы перепутаны местами

    • Установите релиз 19.1 конфигурации для просмотра курсов

  37. какаято путаница в главе 12

  38. 12 Глава – файлы перепутаны, т.е.  такая же ситуация как у tol.

    • Установите релиз 19.1 конфигурации для просмотра курсов.

      • А можно ссылочку? =)

        • Открываете в меню сайта “Базовый курс – Материалы курса” ну а далее мимо не пройдете :)

  39. У меня последний урок в Главе 12 – Применяемость нового способа проведения документов, который заканчивается словами «… ряд проблем, с которыми мы познакомимся в рамках следующего урока». Следующего урока в главе нет, это так и должно быть?

    • Файл называется Block2-402-part10-main.exe?
      У меня он заканчивается словами “Поэтому нужно стараться, чтобы время проведения документа было минимальным”.
      У Вас есть такая фраза?

      • Андрей Кусанов 17.05.2011 в 13:27

        Скорее всего Block2-402-part10-main.avi – файл из поставки. У меня так же. Но «Поэтому нужно стараться, чтобы время проведения документа было минимальным» есть в уроке отображаемом как “Установка параметров запроса. Обход результата запроса в цикле” в файле Block2-402-part02-main.avi.
        У меня в каталоге курсов присутствуют как “avi” так и “exe”. При двойном клике база для просмотра преимущественно читает “avi” с тем же именем.

        • Андрей, поясните, пока не могу понять, что конкретно случилось.
          У Вас в поставке на дисках файл Block2-402-part10-main.avi и Block2-402-part10-main.exe?
          При этом .avi файл больше по длительности?

          • Андрей Кусанов 17.05.2011 в 14:52

            В поставке Block2-402-part10-main.avi длительность в проигрывателе 3:15
            Скачал с сайта Block2-402-part10-main.exe  дл. 2:07 по факту – при врспроизведении.
             

          • Андрей Кусанов 17.05.2011 в 14:55

            Различается содержание одноименных файлов поставки и с сайта.

          • фраза “Поэтому нужно стараться, чтобы время проведения документа было минимальным” финалит  Block2-402-part02-main.exe
            фраза «… ряд проблем, с которыми мы познакомимся в рамках следующего урока» – файл
             Block2-402-part10-main.exe
            Уроков в Главе 12 у меня 15, столько и должно быть?

            • Установите релиз 19.1 конфигурации для просмотра курсов..

      • Андрей Кусанов 17.05.2011 в 13:33

        Евгений, хотелось бы понять, можно ли брать файлы из поставки (они “avi”, что очень удобно для ускоренного просмотра) и добавлять к ним обновленные материалы с сайта, но только кроме самых ранних (они в формате “exe”).
        Либо все-таки нужно просматривать еще и “exe” от 30.06.2010, скачав их с сайта?

        • Можно брать файлы и из поставки и с сайта.
          Попробуйте использовать релиз 19.1 конфигурации.

          • Андрей Кусанов 18.05.2011 в 19:49

            Евгений, не помогло.
            Код “000004587”
            Наименование “Применимость нового способа проведения документов”
            Имя файла “Block2-402-part10-main.exe”
            У меня в поставке “avi”, воспроизводится Block2-402-part10-main.avi и оканчивается «… ряд проблем, с которыми мы познакомимся в рамках следующего урока»
             

            • Вы точно обновились?
              Для чистоты эксперимента поставьте новую базу последнего релиза.
              Для урока “Применимость нового способа проведения документов” имя файла должно быть таким – Block2-402-part02-main.

              • Андрей Кусанов 19.05.2011 в 08:56

                Спасибо, теперь все нормально!
                Дома поставил в каталог по умолчанию C:\Users\Андрей\Documents\Spec81 – урак на месте.
                На работе же удалил файлы из каталога …\Spec8 и поставил туда новую конфигурацию. Путаница осталась. Но в любом случае – решение есть – ставить в новый каталог.

  40. Задание выполнил

    • Хотелось бы увидеть более подробный отчет.