Базовый курс. Домашнее задание №9

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

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

комментариев 88 на “Базовый курс. Домашнее задание №9”

  1. Лучше поздно, чем никогда… выполнил задание № 9.
    О деталях реализации писать особого смысла нет – частично подглядывая в решения, сделал примерно так же.
    Материал курса в основном знакомый, наибольшую трудность (не считая нехватки времени) вызвал выбор оптимального или, хотя бы, правильного способа реализации поставленных задач. И здесь, я думаю, очень важно усвоение основных принципов проектирования. Я попытался сформулировать, то что мне было известно, а также почерпнуто из видеоуроков:
    1. Избегание дублирования кода.
    2. Выбор между использованием объектных / необъектных данных.
    3. Выбор между использованием табличной части справочника / регистра сведений (уникальность по набору измерений).
    4. Принцип устойчивости документов (неизменность результатов проведения при изменении других данных в базе).
    Мне кажется, подчеркивание значимости подобных принципов должно приносить ощутимую пользу, в частности для меня последние два были не то чтобы совершенно новыми, но видеоуроки дали их более четкое осознание.
     
    Далее: СКД. Ну, оно большое, и понятно, что основная часть ещё впереди. Есть такой момент: часто СКД ведет себя очень предупредительно, например, само параметры виртуальных таблиц выносит в параметры СКД, но почему так происходит – не вполне понятно. Но, может быть, позднее прояснится.
     
    Ещё: планы видов характеристик. Для семёрочника не так легко идёт освоение. Вроде бы, и понятно, что это такое, но не хватает опыта экспериментов. Тут бы домашнее задание могло быть кстати, но там их не было, так что придется повнимательней пересмотреть ещё раз с остановками.
     
    Да, кстати, чуть не забыл – совершенно новым оказался материал о структуре таблиц СУБД, те.е использовании функции ПолучитьСтруктуруХраненияБазыДанных()  (это относится к 1-му и 2- му блоку вместе).
     
    Ну вот, пожалуй, всё по 2-му блоку. Надеюсь, мой комментарий окажется полезным.

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

  2. iporozhnyakov 19.01.2011 в 17:11

    Готово.

    На данное задание потратил больше всего времени, т.к. много ньюансов возникло с проведением документов по регистрам.

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

    Также интересно было узнать про хранение информации о комплектующих набора.

  3. Догоняю ДЗ. Сделал благо все это знакомо.

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

    • >В лекции вы говорили о том, что неправильно делать запрос с уровнем вложенности более 2, т.к. это ведет к неэффективности его исполнения. А разве запрос по контролю остатков в случае с наборами не нарушает этого правила?
      Да, правило нарушается.
      Для того чтобы решить проблему необходимо использовать временные таблицы.
      Их и другие способы оптимизации запросов мы рассматриваем в продвинутом курсе.
      > Вернее, где об этом можно почитать?
      Точного ответа у меня нет. Нужно читать литератору по проектированию БД.
      >А разве хранение флага для пользователя «не контролировать остаток» в независимом регистре сведений не нарушает этот принцип?
      Хороший вопрос.
      Пожалуй, принцип нарушается. Но если представить, что установку флага будет выполнять только администратор системы, но приведенное решение можно считать приемлемым.
      Другой вариант решения задачи: в документе определить флаг “Разрешить превышение остатка”, и этот реквизит будет доступен только определенным пользователям. Доступность флага можно обеспечить с помощью ролей.

      > Может разобрать те самые принципы конструирования ИС???
      Пожелание записали.

  5. в этом задании разбирался с видом движений при проведении.
    проведение  из формы списка вызвало затруднение, т.к.нет контекста, поэтому свойство движения недоступны.
    новое для меня в задании – обновление списка в форме.

  6. Добрался наконец-то до 9-го.  Движения по взаиморасчетам и остаткам не без погрешностей но все более ли менее самостоятельно и понятно. С наборами в теории все понятно, с реализацией же было сложновато. Мне кажется вместо хранения набора в табличной части имеет смысл вынести  набор в отдельный документ, это позволит данный вариант набора использовать и в других документах. Запутался несколько с запросом по набору и его комплектующим в документе. Тут уже честно смотрел решение.
    По вопросам:
    1. Скорее узнал не что-то принципиально новое, а понемногу все знания, полученные еще до курса, упорядочиваются. Явно лучше стал ориентироваться в запросах (+СКД).
    2.Затруднения пока есть. Не очень понял  в каких случаях в модуле объекта нужно указывать “записать” или же “записывать” для движений.
     
     

    • >имеет смысл вынести набор в отдельный документ,
      Принципиальных преимуществ не вижу.
      Объем хранимых данных будет такой же (даже несколько сложнее).
      >Не очень понял в каких случаях в модуле объекта нужно указывать «записать» или же «записывать» для движений.
      Если для формирования движений требуется уже записанные данные в регистры (например, по новой технологии контроля остатков), то нужно делать запись.
      Во всех остальных случаях можно запись доверить системе, установив флажок Записывать.

  7. Задание выполнил. Первые трудности для меня начались на организации взаиморасчетов. Второй трудный момент – безусловно – наборы…
    Трудности решал подглядыванием в отчеты о выполнении. К сожалению так до ума и не довел.. Просмотрел решение, все понятно.

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

  9. comradeegor 26.12.2010 в 01:10

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

    • >Создал непериодический регистр сведений
      Это самый оптимальный вариант решения поставленной задачи.
      >Для справочника «Номенклатура» создал реквизит типа булево «ЭтоНабор».
      Можно было воспользоваться видом номенклатуры (товар, услуга, набор).
      >Правда я не понял, как в таком случае себестоимость считать.
      Только регламентно. Либо по плановой оценке. См. мастер-группу, где Александр Горлов давал подробный ответ на этот вопрос.

      >Какие есть общие подходы, какие распространенные ошибки, какие есть фишки и стандартные приёмы
      О различных концепциях учета стоимости при выбытии мы говорим в продвинутом.

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

    </code> т.е. в первом запросе сначала выбираю все товары и услуги, а во втором получаю товары из набора. Чтобы была одна выборка запросы объединяю. Конечно много получилось из-за того что вынужден и первый и второй запрос синхронизировать по количеству выводимых реквизитов, но все равно как то слишком много текста у меня получилось в запросе. Хотя в конструкторе запроса вроде и ничего сложного не было. Хочу повторится решение задания еще не смотрел . Там уверен все сделано проще. Вот тут и возник вопрос.
    1) Может чем так утяжелять запрос надо было несколько элементарных запросов? т.е. при использовании объединения двух подзапросов это один запрос или все равно будет 2 обращения к базе (по одному из каждого запроса)?
    2)При анализе остатков (запрос не привожу так как думаю у всех почти одинаковый) использую виртуальную таблицу остатков. При установке параметров виртуальной таблицы в качестве условия делаю запрос. А может правильнее передавать в него в качестве параметров передавать заранее сформированный список товаров? т.е. сформировал запрос, обработал его и данные параметры уже передал в запрос по остаткам. (Хотя тут получается лишнее обращение к базе). И еще если у меня сформирован очень большой список параметров может выгоднее ограничивать выборку при использовании условия в запросе “ГДЕ”, а не пытаться все запихнуть в параметры виртуальной таблицы?

    Обратная связь:
    1) Очень хотелось бы чтобы поподробнее была рассмотрена иерархия форм. Вот с регистрами , справочниками очень все понятно. А вот с формами чего то у меня как то не до конца уложилось в голове до сих пор. Просто очень хочется четко понимать чем допустим расширение документа отличается от расширения динамического списка. Может это конечно с опытом и придет но пока у меня по работе с формами много непонятного.
    2) Очень нравится когда идет рассказ о том как данные хранятся физически в базе данных. Вот с планом видов характеристик так до конца и не понял. Когда сделано, смотришь и все понятно, сам начинаешь и путаница какая то. Но это наверное больше мои проблемы :)
    3) Понравился урок про новый механизм проведения в 8.2. Хотелось бы чтобы и дальше рассказывалмсь механизмы реализованные в типовых конфигурациях.
    А так все здорово. Много нового и полезного

    • >Сначала запутался как из формы передавать признак того чтобы не контролировались остатки
      В задании сказано, что без кнопка проведения без контроля должна быть в форме списка документов.
      Вы видимо сделали ее в форме документа. Сути это не меняет.
      Во-первых, документ должен быть записан.
      Во-вторых, в обработку проведения нужно действительно каким-то образом передать флаг. Делается это двумя способами:
      А. Экспортная переменная модуля объекта
      В. Свойство объекта документа ДополнительныеСвойства, это структура, мы ее рассматриваем в продвинутом курсе.

      >Допустим перепровожу без закрытия документа, а он начинает ругаться что данные изменены.
      Нужно преобразовать данные формы в документ-объект, а затем выполнить обратное преобразование.
      Примерно так (в контекстном серверном методе):

      ДокОбъект = РеквизитФормыВЗначение(“Объект”);
      ДокОбъект.ФлагПроведенияБезКонтроля = Истина;
      ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
      ЗначениеВРеквизитФормы(ДокОбъект, “Объект”);

      >Может чем так утяжелять запрос надо было несколько элементарных запросов?
      Иногда действительно очень тяжелые запросы могут медленно системой обрабатываться.
      Но это скорее исключение, когда речь будет идти о тысячах миллиардов (число условное) записей.
      Во всех остальных случаях, правильнее за одно обращение к базе данных выбрать всю информацию.
      Единственная проблема, если мы в запросах возвращаем данные для дальнейшей загрузки в наборе записей (через таблицу значений). В этом случае нужно будет использовать пакетные запросы, а их мы рассматриваем в курсе продвинутом.
      >А может правильнее передавать в него в качестве параметров передавать заранее сформированный список товаров?
      Это действительно может быть выгоднее, если в списке небольшое количество элементов – 1, 2, 3…
      Но для общего случая, список товаров правильнее получать отдельным запросом.
      Обращаю внимание, что о вопросах производительности в базовом мы подробно не говорим.

    • >может выгоднее ограничивать выборку при использовании условия в запросе «ГДЕ», а не пытаться все запихнуть в параметры виртуальной таблицы?
      Правильнее для всех условий использовать параметры виртуальной таблицы.

      • Да сделал кнопку на проведение без контроля остатков в форме документа. В следующий раз внимательнее буду читать задание.

  11. выполнил, долго провозился с запросом по контролю остатков в наборе (((

  12. Задание сделал. Основные трудности для меня это : ОбработкаПроведения реализация, оптимизация кода. Отчеты получились  легко.
    Обратная связь
    Все новое. Материал интересный и много это и радует.

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

  14. Здравствуйте:-) ДЗ №9 выполнила.

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

    И обратная связь:
    1.Традиционно “всё новое”.
    2. ПВХ. Вообще сначала в голову не ложился этот объект. После воспроизведения примера вроде полегчало, но в дз применить оказалось негде, а жаль.
    Запросы. Пришлось пересмотреть все уроки в том числе и из предыдущих блоков. И похоже пазл начинает складываться – в этом дз уже вовсю использую запросы потому что без ник уже никак:-)

    • > в этом дз уже вовсю использую запросы потому что без ник уже никак
      Отлично! :)

  15. Sergey.Volkov 19.12.2010 в 00:46

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

  16. Manase940N 18.12.2010 в 14:15

    Задание выполнил.  Основные трудности возникли при учете наборов, в остальном все быстро решалось).
    По материалам второго блока – очень интересно было узнать про особенности проведения в 8.2

  17. Евгений Шилов 17.12.2010 в 11:41

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

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

    • Евгений Шилов 17.12.2010 в 12:03

      По обратной связи:
      1) новое в блоке – ПВХ, много раз пытался понять смысл.
      Также отлично понял чем отличается СрезПоследних() от СрезПервых(). Особенно спасибо за график с бесконечностью.
      Граница, момент – зачем и как пользоваться.
      Для себя запомнил – все данные храним в документе.
      2) Затруднения только с ПВХ, преодолел, досмотрев видео :)
      3) Темы – запросы, больше примеров учета всего и вся :)
       

  18. Антон К. 17.12.2010 в 10:28

    Добрый день, домашнее задание сделал.
    1) Затруднение возникло с контролем остатков (по результатам проведения) – забыл сделать НЗ.Записать().
    2) Для учета взаиморасчетов добавил регистр накопления Взаиморасчеты.
    Движения по нему делают: Выписка, РеализацияТоваров, ПоступлениеТоваров.
    3) С реализацией наборов сложностей не возникло.
    4) С отчетами сложностей не была, за исключением дилеммы, которая возникла по последнему отчету “Рейтинг менеджеров”.
    Объем продаж – ведется в разрезе менеджеров на регистре Продажи.
    Дебиторская задолженность – ведется на регистре Взаиморасчеты, но _не в разрезе менеджеров_ (и даже не в разрезе документов).
     
    Для того чтобы строить отчет “Рейтинг” с учетом дебиторки в разрезе менеджеров – нужны данные по оплате конкретных отгрузок (т.е. вести учет по документам расчета) . Для этого необходимо a) добавить Измерение “ДокументОтгрузки” в регистр Взаиморасчеты, b) при проведении документа РеализацияТоваров закрывать авансы покупателей (по нормальному это должна быть опция), с) в документе Выписка указывать ДокументОтгрузки (ДокументПоставки – для поставщиков), d) нужен новый документ ПереносДолга для ручного сведения оплат и отгрузок (поступлений).
     
    Я не стал это реализовывать, а вместо этого построил отчет по одному регистру Взаиморасчеты (связав его с регистром сведений МенеджерыКонтрагентов): Продажи = ПриходОборот по данному регистру, Дебиторка = остатки по данному регистру. Это очень “общая” информация, зато реализовывается на порядок проще ;-)
    Что скажете по этому поводу?

    • >нужны данные по оплате конкретных отгрузок (т.е. вести учет по документам расчета)
      Зачем, ведь нужно просто знать долг в разрезе менеджеров. По каждому клиенту это своя сумма.
      >построил отчет по одному регистру Взаиморасчеты (связав его с регистром сведений МенеджерыКонтрагентов)
      В решении я использую точно такой же подход :)
      > Продажи = ПриходОборот по данному регистру
      А вот продажи я беру по данным регистра Продажи

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

    Основные моменты:

    1. Для учета контроля остатков по конкретному пользователю
    создан реквизит спр. “Пользователи”.

    2. Контроль остатков – запрос с использованием временных таблиц.

    2. Учет наборов реализован с помощью регистра сведений.

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

    4. Отчеты реализованы с помощью СКД

    Обратная связь:
    1. Новое:
    – алгоритмы проведения в 8.1 и 8.2

    2. Затруднений не возникло.

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

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

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

    Движения[ИмяРегистра].Загрузить(ТаблицаДвижений);

    Если ЗаписатьНабор Тогда
    Движения[ИмяРегистра].Записать();
    Иначе 
    Движения[ИмяРегистра].Записывать = Истина;
    КонецЕсли;

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

    В модуль объекта документа РеализацияТоваров создана отдельная функция Провести, которая используется и при обычном проведении и при проведении по кнопке в списке документов:

    <code>
    Функция Провести(КонтролироватьОстатки) Экспорт
    Запрос = Новый Запрос;

    МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;

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

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

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

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

    Если КонтролироватьОстатки Тогда  

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

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

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

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

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

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

    Возврат Ложь;

    КонецЕсли;

    КонецЕсли;

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

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

    ДвиженияПоРегистрамСервер.ДвинутьРегистр(“Взаиморасчеты”, Движения, ТаблицаДвижений, Истина);

    Возврат Истина;

    КонецФункции
    </code>

    Обработчик проведения:

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

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

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

    Обратная связь:
    1. Знания стали более упорядоченными. Новой была информация из темы «Условное проведение».
    2. Затруднений не возникло.
    3. Хотелось бы более полно освоить использование СКД для построения отчетов.

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

    • >кнопку «Провести без контроля» сделала как экспортная процедура модуля объекта – некрасиво, но вот к сожалению не нашла способ как объединить проведение чтобы было в одном месте со всеми проверками
      См. выложенное решение :)
      >когда использовать границу, когда просто прибавить секунду к концу дня
      В некоторых случаях секунду прибавлять нельзя.
      Например, если мы мы хотим получить остатки на момент времени документа (включая его), то прибавление секунды даст совершенно неверный результат.
      Смысл понятен?

      • Да, понятен,тут именно граница с моментом времени по документу и видом включая.

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

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

    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
    Запрос.Текст =

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

    </code>
    Результаты запроса записываю в Регистр остатков
    <code>
    Запрос.Текст = “Выбрать * Из ТЗ”;
    Результат = Запрос.Выполнить();

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

    </code>
    где ТЗЗапроса – это ТЗ, в которую я ранее выгрузила предыдущий запрос.
    Далее проверяю , если запрос Не Пустой() вывожу сообщение пользователю.
    5. Со СКД вроде более менее разобралась, отчеты сваяла намного быстрее :), чем предыдущий пункт.
    Обратная связь:
    1. Новое как и в 1-м блоке так и во 2-м ВСЕ!
    2. Затруднения вызывают запросы, и не теоретическая часть, рассказываете все отлично, а  практическая,  сказывается нехватка эле5ментарного опыта.  Хотя после этого ДЗ многое прояснилось и более менее разложилось по полкам.
    3. В мастер группе хотелось бы, чтоб показали как правильно организовать подбор по позициям в документе,  аналог подбора в расходных документах  по остаткам в 77.  Так как в ДЗ мы в слепую подбирали позиции.  Какой алгоритм будет самым правильным и быстрым.
     
     

    • >Движение.Активность = Истина;
      Активность можно не устанавливать. Значение по умолчанию – Истина.

      > Как раз до этого долго думала, как организовать запрос таким образом, чтоб дважды не прописывать его и уже иметь готовые данные по товарам
      В своем решении я буду несколько раз использовать одни и те же данные.
      Для того чтобы оптимизировать процесс нужно использовать временные таблицы. Мыслите в верном направлении :)
      Но это тема курса продвинутого.

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

  24. Задание выполнено. Проверку контроля остатков сделала по аналогии с видеоуроком, процедуру проведения без контроля остатков сделала в модуле расходной накладной, вызываю ее по кнопке из модуля формы списка. Наборы сделала регистром сведений, при проведении получаю из них количество комплектующих и заполняю движения. Основная сложность для меня – это запросы. Не получилось сделать одним запросом контроль остатков по номенклатуре из табличной части и остаткам по комплектущим из набора. Подожду Вашего решения. Отчеты сделала с помощью СКД, сложностей не возникло.
    Обратная связь
    1. Много нового. СКД, работа с границей, преобразование данных между формой и объектом.
    2. Запросы. Получение данных из разных таблиц в одном запросе. Когда смотрю видеоурок, все понятно. Начинаю делать – не получается. Когда нужно делать вложенный запрос, когда связанные таблицы, когда использовать запрос в параметре виртуальной таблицы. Надеюсь, что после разбора большего количества примеров, понимание придет. Вопрос – можно ли передать таблицу значений в качестве параметра или установить ее в качестве связанной таблицы?
    3. СКД. Мы разобрали только самые простые отчеты. Хотелось бы разобрать связи наборов данных, кросс-таблицы и т.д.

    • >Вопрос – можно ли передать таблицу значений в качестве параметра или установить ее в качестве связанной таблицы?
      Передать в качестве параметра таблицу значений можно.
      Однако использовать ее можно только:
      1. В условии В. Например, “…ГДЕ Таблица.Поле1 В (&ТаблицаЗначений)”. В этом примере в таблице должна быть одна колонка.
      2. Как источник для создания временной таблицы. Этот вопрос мы рассматриваем в продвинутом.

      По п. 3.
      Детальная работа с СКД в курсе продвинутом.

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

    • >А какие аргументы можно рассматривать в данном случае в пользу РС или подч. справочника?
      У регистра есть замечательное свойство – поддержка уникальности записей по комбинации измерений и периоду. Именно оно является решающим в этой задаче.

  26. Д/З Реализовал.
    Состав наборов храню в Рег. Сведений. Все данные для движений по регистрам получаю одним запросом . Затем обхожу выборку результата запроса и в цикле заполняю ТаблицыЗначений, которые затем загружаю в движения документа.
    В Реализации после записи движений, если контроль остатков включен, проверяю запросом на отрицательные остатки. (новая технология проведения) . Все отчеты достаточно простые – реализовал на СКД.
    Единственная сложность при реализации – очень хотелось при проведении документа все данные необходимые для формирования движений по всем регистрам получать ОДНИМ запросом, что в результате и было реализовано.
    Обратная связь:
    1). ПолучитьСтруктуруХраненияБазыДанных(), работа с итогами, СвязиПараметровВыбора, привязка сообщений к полю ТЧ, РегистрСведенийКлючЗаписи.
    2). Особых затруднений не было.
    3). В мастер группе хотел бы увидеть описание методологии проведения по регистрам накопления: списание по среднему, по партиям – FIFO, LIFO, по нескольким складам и т.д. Каким образом все эти способы реализуются в новой концепции проведения документов?
     

    • >Каким образом все эти способы реализуются в новой концепции проведения документов?
      Все эти, а также другие алгоритмы списания стоимости рассматриваются во втором блоке курса продвинутого..

  27. MashkaRomashkina 13.12.2010 в 11:37

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

    • MashkaRomashkina 13.12.2010 в 12:18

      Обратная связь:
      1. Во 2-м блоке много нового для меня.
      Например, заполнение из данных;
      Использование Границы – даже не подозревала, что мои отчеты по КонецДня работают некорректно :);
      Детальное объяснение создания движений документа очень полезно;
      Поменялось представление о ПВХ. Раньше не решалась использовать, т.к. плохо понимала, как применять и как использовать в отчетах.
      2. Затруднений при прослушивании нету :)
      3. Из актуального для меня на данный момент: плохо ориентируюсь в СКД-могу реализовать только самые простые отчеты, а также плохо обстоит дело с оптимальным получением данных через запрос.  Видела в ответах, что это еще предстоит прослушать, так что пока пожеланий нету.
       

  28. Вячеслав Вязигин 12.12.2010 в 19:49

    Задание выполнено. Затруднений не возникло.
    Обратная связь:
    1. ПолучитьСтруктуруХраненияБазыДанных() это меня просто убило:) Сижу и плачу, вспоминая как в полуручном режиме разбирал структуру таблиц))
    2. Ну тут у меня СКД. Будучи адептом 7.7 и в штыки принявшем построитель, я со скрипом открыл таки первый раз СКД и нарисовал несколько примитивных отчетов. Трудность даже не в самом СКД, а в том чтоб пересилить себя и начать осваивать инструмент. Ну пока вроде получается)))
    3. Возник вопрос: как же определять что документ новый?
    <code>Параметры.Ключ.Пустая()</code> или <code>ДокументОбъект.ЭтоНовый()</code>?
    Что является идеологически верным и как лучше использовать?
    Ну и про критерии отбора хотел узнать, но в видео мягко намекнули, что это из продвинутого, буду ждать))).

    ПС: Небольшой тайм-аут очень помог, теперь я в графике обучения, а это не может не радовать!

    • >а в том чтоб пересилить себя и начать осваивать инструмент.
      Чуть позже войдет в привычку :)
      >Возник вопрос: как же определять что документ новый?
      Смотря о каком контексте идет речь.
      Если о управляемой форме, то два варианта:
      1. Параметры.Ключ.Пустая()
      2. Объект.Ссылка.Пустая().
      Первый является идеологически верный, то есть по фен-шую. Работать должен чуть быстрее второго.
      А если речь о модуле объекта, то обращаемся к методу ЭтоНовый().
      > но в видео мягко намекнули, что это из продвинутого, буду ждать)
      Совершенно верно.
      >ПС: Небольшой тайм-аут очень помог, теперь я в графике обучения, а это не может не радовать!
      Отлично! Продолжаем работать :)

  29. 3. До выполнения задания еще не дошла. По мастер-группе: Очень хотелось бы поговорить пр запросы. Это тема неисчерпаемая. Связи один ко многим. Методы проверки результатов. Временные таблицы. И т.д.
     

    • О запросах мы говорим в каждом блоке.
      И очень подробно в курсе продвинутом, особый упор там делаем на оптимизацию :)

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

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

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

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

    У документа Выписка заполняется табличная часть колонки заполняются данными из запроса по виртуальным таблицам РН Закупок и Продаж на период, 
    указанный пользователем и сохраняемый в реквизитах документа. ТЧ документа заполняется через ТЧ.Загрузить(Запрос.Выполнить().Выгрузить()).

    С отчетами проблем не было. С 1-м и 3-м все просто, во 2-м отчете Тип цены и Цена номенклатуры берутся из соответственно справочника и РС. Выбранный тип цены
    передается в качестве параметров виртуальной таблице РС ЦеныНоменклатурыСрезПоследних. Из виртуальной таблицы РН Остатки левым соединением по ЦеныНоменклатурыСрезПоследних
    получаем номенклатуру с ценой заданного типа.

    Обратная связь.
    1.Для меня здесь все новое. Трудно что-то особо выделить.
    2.Наверное, регистры сведений. Их применяемость на практике, подбор параметров при создании РС. 
    Преодолевать затруднения помогают только домашние задания.
    3.Хотелось бы по отчетам узнать побольше информации – с использованием реквизитов, ТЧ.
    Ну а целом, чем больше вы будете рассказывать об отличии версии 8.2 от более ранних версий – тем лучше.

    • >Для описания Наборов решил применить планы видов характеристик.
      Вообще объект предназначен для описания видов характеристик. Условно говоря, это пользовательские типы данных, которые пользователи могут произвольно расширять.
      Можно вспомнить материал по свойствам товаров. Пользователи могут добавлять новые свойства самостоятельно.
      Поэтому правильное решение – использование только регистра сведений.

      >Далее в цикле по ТЧ документа для каждой строки проверяется
      Выполнение запроса в цикле – очень неэффективное решение.
      Нужно стараться все необходимые данные выбирать одним запросом.

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

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

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

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

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

    Обратная связь.

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

    • СКД – детально рассмотрим в продвинутом.
      Про формы – посмотрите бонусный курс “Формы. Новый взгляд”.
      А работа с формами на низком уровне – в продвинутом..

  32. Admin_Net_1C 11.12.2010 в 09:39

    Домашнее задание №9 выполнено.
    1) Для организации учета наборов у справочника “Номенклатура” добавлена табличная часть “СоставНабора” с реквизитами: Номенклатура (СправочникСсылка.Номенклатура), Количество (Ч10.3).
    2) При проведении документа “ПоступлениеТоваров” осуществляется запись в  регистры  “ОстаткиТоваров” и “Закупки”. Движения по регистрам формируется в цикле по строкам табличной части. Для регистра “ОстаткиТоваров”, если вид товара “Набор”, то цикл по строкам табличной части “СоставНабора” справочника Номенклатура. В регистр “Закупки” записывается номенклатура из табличной части документа без детализации комплектующих наборов.
    3) В МО “Реализация” функция “ПолучитьТЗДляДвиженийРегистраОстаткиТоваров(СсылкаДок, БезУслуг, ДетализироватьНаборы)”, которая возвращает ТаблицуЗначений с движениями для регистра “ОстаткиТоваров”. С помощью запроса выбираем строки из табличной части документа в разрезе Номенклатура, ВидБрака, СУММА(РеализацияТовары.Количество * РеализацияТовары.Коэффициент), СУММА(РеализацияТовары.Сумма) с группировкой по РеализацияТовары.Номенклатура, РеализацияТовары.ВидБрака. Результат выгружаем в тзДвижений = Результат.Выгрузить();.
    Если параметр функции БезУслуг=Истина, то не выбираем из табличной части номенклатуру с видом товара “Услуга”.
    Если параметр ДетализироватьНаборы=Истина, то не выбираем из табличной части номенклатуру с видом товара “Набор”. Формируем запрос на выборку из справочника Номенклатура комплектующих наборов, присутствующих в табличной части документа. Добавляем результат запроса в тзДвижений.
    Добавляем в тзДвижений колонку ВидДвижения, чтобы результат запроса выгружался в регистр “ОстаткиТоваров” с признаком “Расход”:
    тзДвижений.Колонки.Добавить(“ВидДвижения”, Новый ОписаниеТипов(Массив));
    тзДвижений.ЗаполнитьЗначения(ВидДвиженияНакопления.Расход,”ВидДвижения”);
    В форме списка документа добавлена кнопка “Провести без контроля” при нажатии на которую, осуществляется запись движений в регистр “ОстаткиТоваров”, без контроля разрешений пользователя и без контроля остатков.
    4) В справочнике “Пользователи” добавлен реквизит “КонтролироватьОстаткиПриСписании”. При проведении документа “Реализация” контролируются остатки номенклатуры, если у текущего пользователя данный реквизит установлен в Истину.
    К сожалению, так и не удалось осуществить контроль остатков с помощью запросов. (( Пришлось организовывать цикл по строкам табличной части документа, где с помощью конструкции:
    РегистрыНакопления.ОстаткиТоваров.Остатки(Момент,  Новый Структура(“Номенклатура, ВидБрака”, Номенклатура, ВидБрака),             “Номенклатура”, “Количество”);
    проверяется достаточность количества номенклатуры для списания.
    5) Добавлен регистр накопления “Продажи” с видом обороты. Для учета объемов продаж в разрезе: Контрагент, Номенклатура, Менеджер.
    6) Для учета взаиморасчетов с контрагентами созданы два регистра накопления “РасчетыСПоставщиками” и “РасчетыСПокупателями” с видом остаток.
    Регистраторы регистра “РасчетыСПоставщиками” документы: ПоступлениеТоваров, Выписка.
    Регистраторы регистра “РасчетыСПокупателями” документы: Реализация, Выписка.
    Решение на основе двух регистров выбрано из соображений того, что один и тот же контрагент может выступать как поставщиком, так и покупателем по отношению к фирме.
    7) Добавлен документ “Выписка”. Табличная часть “Взаиморасчеты” с реквизитами: Контрагент (составной тип СправочникСсылка.Контрагенты, СправочникСсылка.Сотрудники, т.к. в документе ПоступленияТоваров, закупка товаров может отражаться как по контрагентам, та и по нашим сотрудникам), Приход (Ч15.2), Расход (Ч15.2).
    При проведении, если значение Приход<>0, то делаем движение по регистру “РасчетыСПокупателями”, если Расход<>0, то по регистру “РасчетыСПоставщиками”.
    8) Созданы указанные в задании отчеты с помощью СКД. Основная сложность с отчетами заключалась в том, что взаиморасчеты с контрагентами ведутся по двум регистрам. Соответственно, чтобы получить сумму конечного долга контрагента, приходится организовывать различные соединения запросов к обоим регистрам.
    Вопросы по ДЗ:
    1) Как отловить установку пометки удаления, чтобы удалить записи регистра у непроведенного документа “Реализация”? Процедуры МО “ОбработкаУдаленияПроведения” и “ПередУдалением” для этих целей не подходят.
    2) В силу того, что в моей ИБ организация взаиморасчетов реализована на двух регистров, в первом отчете “Долги по менеджерам” результаты выводятся верные, но несколько не в той форме, в которой хотелось бы. Для того чтобы описать суть проблемы необходимо видеть мою реализацию данного отчета. Вопрос, возможно ли скинуть Вам выгрузку моей ИБ, чтобы задать вопрос по формированию данного отчета?
     
    Ответы на вопросы по итогам 2-го блока:
    1) В связи с тем, что до начала изучения курса был опыт работы только с платформой 7.7, новые механизмы при работе с документами и регистрами, а также новый регистров – регистры сведений. Новые объекты Планы видов характеристик.
    2) Наибольшее затруднения пока вызывают механизмы работа с движениями регистров и формирование запросов с различными видами соединений. Помогают преодолеть трудности материалы курса, ответы авторов на вопросы и информация из интернет источников.
    3) Более подробно про механизм оперативного и неоперативного проведения, т.к. до конца еще так и не смог вникнуть в суть, а также приемы работы с элементами форм на стороне клиента.

    • >К сожалению, так и не удалось осуществить контроль остатков с помощью запросов.
      Рассмотрим в решении ДЗ.

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

      >1) Как отловить установку пометки удаления, чтобы удалить записи регистра у непроведенного документа «Реализация»?
      Установку пометки можно поймать в событии ПередЗаписью (нужно проверять текущее что пометка сейчас установлена, а ранее была снята).
      Только не ясно зачем это нужно? Ведь при пометке на удаление (которая инициирует отмену проведения) очищаются движения.
      Проверьте свойство документа “Удаление движений” оно должно принимать значение “Удалять при отмене проведения”.
      >2) В силу того, что в моей ИБ организация взаиморасчетов реализована на двух регистров
      Да, можно скинуть. На ящик МГ.

      • Admin_Net_1C 11.12.2010 в 17:16

        Отловить пометку удалениянужно для того чтобы убрать движения регистра ОстаткиТовара, если движения созданые по кнопке из формы списка документа.
        Спасибо, выгрузку ИБ с вопросом по отчету скину в понедельник.

        • Admin_Net_1C 11.12.2010 в 19:59

          У документа Реализация свойство “Удаление движений” выставлено в значение “Удалять автоматически”. По кнопке формы списка документа выполняется запись в регистр ОстаткиТоваров даже не проведенного документа.  Движения регистра видны в форме спсика регистра, который вызывается из панели навигации документа.
          В методе ПередЗаписью, получаю количество строк в коллекции движений документа Движения.ОстаткиТоваров.Количество(). Данное количество равно нулю! у документов, у которых есть движения. Почему?

          • Это штатное поведение.
            Дело в том, что 8.2 по умолчанию, не “подтягивает” движения в наборы записей документа.
            Сделано это для оптимизации.
            Чтобы движения появились, можно вызывать команду Движения.ВашРегистр.Прочитать().

            • Admin_Net_1C 12.12.2010 в 10:56

              Спасибо, разобрался. Только сейчас вспомнил, что Вы обращали внимание на этот факт в уроках курса )

  33. Выполнил… что-то тяжело шло, несколько глупейших ошибок выявлялась чрезмерно долго…
    В целом если не приводить листинги (тут писали что не приветствуется) даже особо говорить почти не о чем, да и кода совсем не много…  Но есть несколько вопросов:
    1.Для хранения состава наборов сначало хотел использовать подчинённый справочник, потом почти сделал для ПВХ, но передумал и в конце концов сделал на РегистреСведений – а как правильнее?
    2.При проверке проведения продажи номенклатуры с учётом наборов не будет-ли правильнее сначало собрать в один список и уже потом с ним производить все действия (движения, проверка остатков)?
    3.В СКД насколько понимаю желательно нагрузку работы перенести на запрос (ну кроме тех случаев, когда всякие допотборы, группировки и т.п. чрезмерно утяжеляют запрос) или неправильно понял?
     
    По вопросам к учебному блоку:
    1.Материал по регистрам упорядочил то, до чего в 7.7 доходил сам,  момент времени очень важная тема, про контроль остаков и оперю проведение очень интересно, ну и СКД – это вещь!!!
    2.как ни странно но при выполнении заданий больше всего времени убил на 3 последних отчёта (из-за парочки просто глупых ошибок: при написании запросов в 1 отчёту и что-то приспичило мне не по кнопек СКД создавать отчёт а макет и в нём СКД… долго тупо не мог понять почему отчёт на экране представлен пустой формой).
    3.Обязательно буду пересматривать главы про ПВХ, СДК и частично регистры.
    Есть ещё 2 доп. вопроса:
    1.В загрузке взятой по итогам ДЗ№8 почему-то при щелчке по пункту “Консоль запросов specRU8” открывается пустая форма. Платформа 8.2.11.235 где я мог сделать не так?
    2.Смотрю ПолучитьСтруктуруХраненияБазыДанных(),  что в табло, что в окне “вычислить выражение” – вижу структуру сфомированной таблицы, но не вижу самого сожержимого…. что-то не так с настройкой моей базы?

    • Ответы по пунктам.
      1. Все-таки регистр сведений.
      2. Именно такой подход и необходим. Все данные получаем одним запросом. А далее – простая обработка его результатов.
      3. Все правильно.
      4. Нужно запускать толстого клиента (УП), тогда консоль должна работать.
      5. Если я правильно понял, то нужно встать на строке с таблицей и нажать на кнопку редактирования (или F2). Таблица должна открыться в отдельном окне “Вычислить выражение”.

      • Кнопка <F2> действительно помогла, а с консолью какая-то странная вещь: из конфигуратора (т.е. в режиме отладки) пустая форма, а если запустить сразу в режиме “1С:Предприятие” – тогда нормально!
         

        • А из конфигуратора вы как запускаете?
          Отладка – Начало отладки – Толстый клиент (УП).
          Так?

          • всё, разобрался… щзапускал кнопкой, если из меню толстым клиентом – тогда норм.
            Спасибо за помощь!

  34. Обратная связь:
    1.  Что нового я узнал в текущем  блоке или в чем поменялись взгляды после изучения материала?
     

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

    10.  Функция ПолучитьСтруктуруХраненияБазыДанных().
    11.  Редактирование вложенных запросов в условии с помощью конструктора.
    12.  При получении остатков в запросе на конец дня остатки получаются на начало секунды 23:59:59 и нужно прибавить секунду для получения остатков с учетом последней секунды.
    13.  Назначение параметра ВТ ОстаткиИОбороты Метод дополнения.
    14.  Свойство документа «Запись движений при проведении»
     
    2. В какой теме были наибольшие затруднения, и что помогло их преодолеть?

    Не до конца ясно назначение свойства измерения регистра сведений Основной отбор.
    Свойства документов «Запись документов пи проведении» и «Удаление движений» и особенности получения остатков при различных значениях этих свойств.

     
    3.  Какую тему, имеющую отношение к текущему блоку, вы  бы хотели подробнее раскрыть в мастер-группе?
     

    Каким образом можно оптимизировать определение остатков при неоперативном проведении документа.
    Хотелось бы рассмотреть более реальный пример применения обработки события обработкаПолученияДанныхВыбора модуля менеджера документа.
    Было бы интересно рассмотреть практический пример в котором использовались методы регистра сведений ПолучитьПервое, ПолучитьсрезПервых (никогда не сталкивался) возможно это лучше бы прояснило практический аспект применения этих методов.
    Хотелось бы подробнее узнать о параметре ВТ Периодичность – Авто, увидеть пример применения этого параметра, как это будет сказываться на производительности выполнения запроса.
    Свойства документов «Запись документов пи проведении» и «Удаление движений» и особенности получения остатков при различных значениях этих свойств.

    • По п. 3. пожелания записаны.
      Дам некоторые комментарии.
      >Каким образом можно оптимизировать определение остатков при неоперативном проведении документа.
      Самый оптимальный вариант – контролировать остатки только при оперативном проведении :)
      Что касается моментов оптимизации, то о них мы говорим в курсе продвинутом.
      >Было бы интересно рассмотреть практический пример в котором использовались методы регистра сведений ПолучитьПервое, ПолучитьсрезПервы
      С помощью СрезаПервых можно получить самую первую запись в регистре, то есть с чего все началось. Иногда это бывает необходимо.
      Также с помощью этой таблицы можно анализировать следующее состояние. Например, мы читаем данные бюджета за текущий месяц, и может заглянуть в следующий месяц.
      >Свойства документов «Запись документов пи проведении» и «Удаление движений» и особенности получения остатков при различных значениях этих свойств.
      И это тоже в курсе продвинутом..

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

    Табличная часть справочника Номенклатура.
    Подчиненный справочнику Номенклатура справочник СоставНабора.
    Регистр сведений.

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

    • Проблемы с нумерацией при вставке из Ворда.

    • >Проведение без контроля реализовал с помощью команды.
      А ведь можно было анализировать реквизит пользователя в обработке проведения. Тогда можно обойтись без дополнительной команды.
      >Выбрал первый вариант.
      Я бы выбрал вариант №3. Хотя бы из-за автоматического контроля уникальности.
      >Возникает вопрос, каким образом обеспечить устойчивость документов при работе с наборами
      Хороший вопрос. И решение вы реализовали хорошее, так и нужно делать..

      • >А ведь можно было анализировать реквизит пользователя в обработке проведения. Тогда можно обойтись без дополнительной команды.
        Таким образом вы будете поступать при решении ДЗ, если нет хотелось бы узнать подробнее из вашего ответа не совсем понятно.

        • Да, таким образом, будет выглядеть решение..

  36. Задание сделал. Отчеты о проделанном писать все труднее. Вывешивание листингов не приветствуется, а описать все – много писанины. Может в будущем лучше писать только о том, с чем были наибольшие затруднения и как с ними справился?
    Решал с конца, начал с комплектующих. В справочнике номенклатура создал ТЧ Комплектующие с полями Комплектующее и Количество.
    Изменил проведение документа ПоступлениеТоваров, чтобы вместо комплектов номенклатуры в РН ОстаткиНоменклатуры записывались комплектующие.
    В модулях документов изменил проведение, убрав движения по РН ОстаткиНоменклатуры для номенклатуры с видом Услуга (услуги участвуют только в движениях оборотных РН Закупки и Продажи).
    В справочнике Пользователи создал реквизит булевого типа КонтрольОстатков.
    Создал оборотный РН Продажи. Регистратор – РеализацияТоваров. Измерения Контрагент, Менеджер, Номенклатура. Ресурсы Количество, Сумма.
    Для документа РеализацияТоваров сделал обработку проведения. Все расчеты вынес в процедуру общего серверного модуля, куда передаю в качестве параметра объект документа. Все необходимые данные получаю одним запросом, и затем обрабатываю выборку. С запросом мучался долго. Сделал так:
    1. Создаю первую временную таблицу – выбираю данные из табличной части документа (включая номер строки). Хорошо было бы их сгруппировать по номенклатуре и качеству, на случай если пользователь умудрится ввести одинаковую номенклатуру с одним и тем же качеством в разные строки ТЧ. Но, по условию, требуется, при включенном контроле остатков, выдавать ошибку с указанием номера строки, где будет перебор по списываемому количеству. Поэтому группировку делать не стал, контроль списания сделал в обработке результата запроса.
    2. Выбрал из первой временной таблицы номенклатуру, качество, количество и сумму, левым соединением добавил данные по комлектующим. В пересчете на комплектующие посчитал количество  (если комплектующих нет, то кол-во = кол-ву в документе) и сумму (пропорционально). Это вторая временная таблица.
    3. Основа третьей временной таблицы – первая временная таблица, к которой левым соединением цепляется вторая по ключу номенклатура+количество. Если комплектующее не естьnull, заменяем номенклатуру на комлектующее, количество на количество комплектующих, сумму на стоимость комплектующих. Также левым соединением (по номенклатуре и качеству) добавляем данные по остаткам РН ОстаткиНоменклатуры. Указал параметры виртуальной таблицы так: если режим проведения оперативный, то первый параметр <Период> пустой, если не оперативный, то момент времени документа. Номенклатура выбирается только из совокупности номенклатур первой временной таблицы.  Добавил левое соединение (по контрагенту) с таблицей МенеджерыКонтагентов.СрезПоследних откуда получаю менеджера.
    Наконец самое главное: итоги по номенклатуре и качеству по СУММА(КолвоДок),  СУММА(КолвоОстаток), СУММА(Сумма),
    МАКСИМУМ(Менеджер). Т.о. в обходе выборки по иерархии на верхнем уровне у нас есть все необходимые поля для проверки и записи в регистры, а если спустится на уровень ниже, то можно получить номера строк табличной части.
    Далее, проверяю, нужен ли контроль остатков для текущего пользователя. Если да, то организую циклы по выборке из результата запроса. Обход результата запроса – ПоГруппировкамСИерархией. В циклах проверяю, не превышает ли количество в строке (с учетом количества по номенклатуре и качеству в других строчках-“дублях”) количества по остатку. Если превышает, то создаем сообщение пользователю, где указываем номер строки, где количество больше остатка. Отказываемся от формирования движений.
    Если ошибок не было, сбрасываем выборку и запускаем её вновь по иерархии, записываем движения в ОстаткиНоменклатуры (кроме услуг) и оборотный РН Продажи.
    Далее, перешел к кнопке “Провести без контроля” и все, что с ней связано. Создал команду, организовал вызов процедуры на сервере без контекста (передал в параметре элементы.Список.ТекущаяСтрока). Все хорошо, движения формируются. Одно НО – не обновляется форма после формирования движения (не появляется галочка, что документ проведен). Нужно нажимать F5. Плясал с бубном и так и этак, чувствую, что нужно как то “подлезть” либо с Обновить(), либо с ЗначениеВРеквизитФормы, в общем так и не сделал, остался недочет. :(
    Создал документ Выписка, в форме документа добавил команду ЗаполнитьТЧ, которая по оборотам за день по РН Закупки и Продажи заполняет табличную часть. Тут с отображением все четко, ничего обновлять не надо. Сперва, используя РеквизитФормыВЗначение() конвертирую данные формы в объект, вызываю процедуру модуля объекта, которая заполняет табличную часть, а потом через ЗначениеВРеквизитФормы() помещаю измененный объект в данные формы.
    Отчеты сделал, особых затруднений не возникло.
    В моем решении меня смущает:
    1. не использовал РС для хранения связи комплект-комплектующее. Не знаю, что лучше – использовать ТЧ справочника или РС?
    2. никак не применил ПВХ, хотя их требовалось изучить для выполнения ДЗ.
    Обратная связь:
    1. Узнал много нового по управляемым формам и работе с ними. Новое в проведении документов. Прочие отличия в работе с платформой 8.2 от работы с 8.1
    2. Пока что бывают затруднения в работе с формами, приходится сидеть в синтаксис-помощнике и изучать методы и свойства объектов связанных с формами, их отображением, обновлением и т.п.
    3. Формы, формы, формы! :) Настройка, приемы юзабилити, хитрые отборы, конвертация данных различных видов форм в объекты и т.д. Может на самом деле я прошу масло масленое и это все и так есть в курсе, но как то размазано по другим темам. Например, механика конвертации данных формы в объекты и обратно располагается почему то в главе 9 – Регистры накопления.
    P.s. Курс супер. Про планы обмена и/или работу с веб-сервисами, XML что-нибудь интересненькое будет?

    • “Основа третьей временной таблицы – первая временная таблица, к которой левым соединением цепляется вторая по ключу номенклатура+количество” читать как “Основа третьей временной таблицы – первая временная таблица, к которой левым соединением цепляется вторая по ключу номенклатура+качество“.

    • >Может в будущем лучше писать только о том, с чем были наибольшие затруднения и как с ними справился?
      Давайте так: описывайте затруднения + способ их решения.
      А также основные шаги по решению задачи.
      >на случай если пользователь умудрится ввести одинаковую номенклатуру с одним и тем же качеством в разные строки ТЧ
      А здесь вопрос очень философский :)
      Допустим в документе есть 2 строки:
      Стул офисный, 10 шт.
      Стул офисный, 12 шт.

      На остатке имеется 15 штук. Вопрос в какой строке ошибка? Ответ – особой разницы нет, нужно просто указать на это пользователю.
      Поэтому в решении я все же буду использовать группировку, поскольку это:
      1. Более правильное и быстрое решение.
      2. Легко писать алгоритмы, если мы уверены в уникальности строк.

      >Одно НО – не обновляется форма после формирования движения (не появляется галочка, что документ проведен). Нужно нажимать F5.
      Это странное поведение.
      Я правильно понимаю, что вы проводите из формы списка и у документа не появляется галочка?
      Если так – для эксперимента проведите поступление товаров из формы списка. Галочка появляется?

      >1. не использовал РС для хранения связи комплект-комплектующее. Не знаю, что лучше – использовать ТЧ справочника или РС?
      Все таки РС. Хотя бы, потому что он контролирует уникальность записей.
      >никак не применил ПВХ, хотя их требовалось изучить для выполнения ДЗ.
      Если в задании они не требуется, значит все ок.

      >Про планы обмена и/или работу с веб-сервисами, XML что-нибудь интересненькое будет?
      Планы обмена, универсальный обмен через XML рассматриваем в продвинутом.
      По веб-сервисам планируется тематическая сессия мастер-группы.

      • >>Допустим в документе есть 2 строки:
        >>Стул офисный, 10 шт.
        >>Стул офисный, 12 шт.
        >>На остатке имеется 15 штук. Вопрос в какой строке ошибка?
        Я накапливал количество одинаковой номенклатуры по строкам документа в цикле и постоянно сверял его с количеством на остатке. Как только получаем перебор – выдаем сообщение пользователю с номером строки.
        >>Ответ – особой разницы нет, нужно просто указать на это пользователю.
        По условию, в сообщении об ошибке требуется указать конкретную строку табличной части, поэтому я и заморочился.
        >>Я правильно понимаю, что вы проводите из формы списка и у документа не появляется галочка?
        Верно, но я провожу программно. Подозреваю, что мой алгоритм не верен/не полон. Делаю так: из процедуры на клиенте вызываю процедуру на сервере без контекста, передаю ей в параметре ссылку на документ. В процедуре на сервере из ссылки  получаю объект и передаю его процедуре общего серверного модуля. Эта процедура формирует движения и записывает их. Свойству Проведен присваиваю истину и записываю документ. Все.
        Галочка проведения появляется только после F5. Попробовал на поступлении товаров, результат тот же.
        >>Все таки РС. Хотя бы, потому что он контролирует уникальность записей.
        Хорошо. Правильной ли будет структура регистра: Измерение – Комплектующее, Ресурсы – Комплект, Количество (комплектующих в наборе)?
        >>По веб-сервисам планируется тематическая сессия мастер-группы.
        ЗдОрово!

        • >Я накапливал количество одинаковой номенклатуры по строкам документа в цикле и постоянно сверял его с количеством на остатке.
          Это правильно. Но это дополнительные действия.
          А значит дополнительная нагрузка на сервер, увеличение времени выполнения транзакции и в целом снижение масштабируемости.
          Поэтому лучше искать наиболее простые алгоритмы.

        • >Верно, но я провожу программно.
          Это меняет дело.
          Нужно сделать так:
          создать серверный контекстный вызов.
          В нем:

          ДокОбъект = РеквизитФормыВЗначение("Объект");
          // Если необходимо меняем объект
          ДокОбъект.Записать(РежимЗаписиДокумент.Проведение);
          ЗначениеВРеквизитФормы(ДокОбъект, "Объект");

          Дело в том, что в вашем случае ДокументОбъект не связан с данными формы, поэтому и не происходит обновление формы.

          • &gt;&gt;
            ДокОбъект = РеквизитФормыВЗначение("Объект");
            Евгений, но я же работаю не с формой документа, а с формой списка. Что в данном случае будет Объектом?
             
            • Тогда попробуйте принудительно обновить таблицу формы.
              Элементы.Список.Обновить();
              На стороне клиента.

        • >Правильной ли будет структура регистра: Измерение – Комплектующее, Ресурсы – Комплект, Количество (комплектующих в наборе)?
          При такой структуре одна комплектующая может входит в состав только одного комплекта.
          Например, Гайка М5 входит в состав стула.
          И она же должна входит в состав стола.
          При вашей структуре этого не получится описать.
          Поэтому предлагайте еще варианты :)

          • Точно, Вы правы :)
            Тогда так:
            Измерения – пара Комплект, Комплектующее
            Ресурс – Количество (комплектующих)

  37. Вопросы по д/з:
    1). Может ли номенклатура закупаться наборами ?
    иными словами могут ли наборы содержаться в ПоступленииТоваров ? Или закупка возможна только товаров.
    2). Может ли набор состоять из наборов?
     

    • 1. Да, могу.
      2. Такую ситуацию обрабатывать не требуется.

  38. А можно при выдаче ДЗ сразу давать список глав которые нужно к следующему ДЗ изучить?

    • Хорошее предложение.
      Думаю логично будет составить таблицу, где будет указана – не только дата выдачи ДЗ, но и затрагиваемые главы.
      Как будет время сделаем, но быстрого решения обещать не могу..