Базовый курс. Занятие №9
Заключительное занятие по второму блоку базового курса.
Необходимо изучить следующие главы.
Глава 11. Запросы.
Глава 12. Условное проведение.
Глава 13. Планы видов характеристик.
Глава 14. Создание отчетов.
Глава 15. Обработки.
Также нужно выполнить домашнее задание, текст которого доступен на странице.
Задание необходимо выполнять в ИБ после предыдущего ДЗ.
В этой же теме необходимо написать отчет о выполнении задания.
ps. Участники курса без доступа в мастер-группу отчитываться по домашним заданиям не могут.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —напишите нам на e-mail поддержки.
Ну наконец-то удалось закончить 9-е задание. По порядку…
Контроль остатков: Обработка проведения – двигаем регистры, смотрим нет ли отрицательных остатков, если есть Отказ – истина.
СообщениеПользователю – номер строки берём в запросе к ТЧ документа.
В форме списка док-та реализация создак команду.
По команде:
СписокДокументов = ЭтаФорма.ПодчиненныеЭлементы[0].ВыделенныеСтроки;
далее в цикле для каждого ПровестиНаСервере(До)
В проц. ПровестиНаСервере
Получаю объект, в ДополнительныеСвойства вставляю “КонтрольОстатков”,Ложь, записываю с режимом записи – проведение
В обработке проведения проверяю есть ли что- нибудь в доп свойствах, если нет – контролировать = истина, если есть – Ложь, соответственно от этой переменной зависит контролировать остаток или нет. Для пользователе ввёл реквизит КонрольОстатков.
Создал регистр продаж. движения по нему в обработке проведения док-та реализация и авансовый отчет. Рег. по взаиморасчетам, движения по нему в обр. проведения док-тов поступления и отгрузки
По услугам: в док-тах поступления и отгрузки – добавил закладки с ТЧ Услуги. Если есть услуги – учитываю сумму по ним в рег. взаиморасчеты. Т.к. услуга не номенклатура остальные регистры не трогаю.
Наборы меня просто измучили. Решил так:
в запросе “выбор-когда-тогда-иначе”, если вид номенклатуры товар, тогда РеализацияТоваровТовары.Номенклатура иначе Наборы.Комплектующая(наборы – это рег свед.), аналогично с качеством и количеством – это в секции ВЫБОР
В секции ИЗ – левое соединение ТЧ и регистра Наборы( в р.с. “НАБОРЫ” добавил реквизит “Качество”)по полю РеализацияТоваровТовары.Номенклатура = Наборы.Набор. Что значит “решение должно обладать устойчивостью” не понял.
В рег. Продажи и Закупки записываю набор. Записи в регистры – через запросы, далее Движения.НужныйРегистр.Загрузить(Результат.Выгрузить())
Из-за наборов развалилось сообщения пользователю. Отказался выводить сообщение в строке, т.к. если не хватает комплектующих в наборе, нет строки с комплектующей в документе.
Про 1-й отчет сказать нечего – простой.
2-й долго не мог сообразить два раза обратиться к р.с. ЦеныНоменклатуры. далее всё пошло просто, в условиях таблиц параметр ЦипЦеныПродажи и Закупки. в СКД параметр тип – справочник типыЦен.
3-й отчет
Полное соединение Взаиморасчетов и Продажи по полю контрагент.
Сортировка По (СуммаОборот – СуммаОстаток). Выводим в отчет: Менеджера из рег. Продажи, СуммаОстаток из Взаиморасчетов, СуммаОборот из Продажи.
Arbat, ваш отчет принят.
К сожалению Самостоятельно полностью реализовать решение ДЗ не смог, как бы этого не хотелось. Могу лишь отметить тот факт что полностью скопировать Ваше решение оказалось не легким делом, особенно предпоследняя часть, в проведении РеализацияТоваров.
Что касается наибольших затруднений так это часть запросов а также их соединений. Неплохо было бы не столь резко нарастающими темпами переходить к таким (на мой взгляд) сложным запросам.
P.S: Не уверен что могу рассчитывать на ответ, но все же, не подскажите, каким образом можно вывести “Запрос.Выполнить()” на экран пользователю. Я не имею ввиду консоль запросов(что тоже очень удобна). А именно чтобы была возможность на стадии разработки запроса, иметь наглядность для анализа возможных ошибок. Может реализовывать вывод результата в макет, или еще каким нибудь образом.
Заранее благодарен!
Анализировать результат выполнения запроса удобно в конфигураторе.
Ставите точку останова на строчку следующую за “Результат = Запрос.Выполнить();”.
Далее, нажимаете Shift + F9, и пишите Результат.Выгрузить(), Enter. Далее, в нижнем окне нажимаете F2. И таблица значений доступна для просмотра.
Кажется, в ходе курса я не раз показывал этот прием.
Да, но я имел ввиду просматривать сами результаты запроса.
Когда проваливаюсь с помощью F2 (Запрос.Выполнить().Колонки[0]) то я вижу
лишь : “Выражение”, “Значение” и “Тип”….Соответственно “Имя”, “Номенклатура”
“Строка”. А возможно ли видеть чему равно само значение номенклатуры?
Обратите внимание, нужно выгрузить результат в таблицу значений – Запрос.Выполнить().Выгрузить().
Тогда и сможете просматривать результат.
Добрый день, догоняю группу.
1. Проведение документа Реализация, контроль остатков реализовал в процедуре ПередЗаписью, вызывается процедура общего модуля ПроверкаОстатковТМЦ(Объект), по результату которой выполняется или запрет и вывод сообщения или просто вывод сообщения.
2. Регистр продаж выполнен оборотным, создан док Выписка который формирует движения Взаиморасчётов в зависимости прихода и расхода, также дописаны движения доков Поступление и Реализация по Взаиморасчётам.
3. Реализован механизм обработки поступления и списания наборов по ОстаткамТМЦ. Посредством проверки ВидаНоменклатуры и последующим перебором ТабЧасти Наборов. Информация о наборах хранится в табличной части Номенклатуры.
4. Выполнены отчеты на СКД
выгрузка базы
Отчет по 9-му заданию, так как с решением уже сверила – описываю итог:
1/ По документу Реализация: доработана процедура ОбработкаПроведения для контроля остатка. в целом все получилось сложности были только при выводе сообщения на конкретную строку таблицы, решение помогло найти ошибку . При создании кнопки для списка не работало автоматическое обновление списка, ответ также нашла в решении, с синтаксис-помошником все никак не сдружусь
2/ Регистр Продажи – сделано, сложностей не было. Сделано через отдельный запрос и формирование движений регистра продажи в соответствии с полученной результатом запроса
3/ Документ Выписка- сложностей с выполнением не было, немного пришлось помучиться с направлением движения (приход/расход), когда пыталась реализовать через запрос, конструкцию когда/тогда на тот момент еще не знала, поэтому, чтобы заработало, реализовала через цикл с условием по строкам документа, позже переделала на правильный механизм с запросом.
4/ Учет услуг и наборов в документах – по изменению документов для учета 3-х видов номенклатуры – справилась, за исключением оговорки о том, что решение должно было быть устойчивым. В процессе создания хранилища для состава наборов запуталась окончательно, разобралась и доделала эту часть задания только после просмотра соответствующих частей из Вашего решения.
Вынос схожих алгоритмов в общий модуль также сделала (особых сложностей не возникло)
5/ В части создания отчетов – сделано, первые два отчета было просто, с третьим помудрила – не получалось правильно настроить связи таблиц, чтобы выводилась полная информация по всем продажам и долгам. В итоге сделала, но ,посмотрев решение, возник вопрос, так как – возможно в предложенном решении есть неточность: например, если по контрагенту есть только долг, но нет движений по регистру продажи, то он в отчет выводится по строке «пустой менеджер», что не всегда корректно, ведь менеджер может быть указан в регистре менеджеры клиентов. Плюс, в предложенном решении неверно отображается долг по менеджеру, например если продажи по алхимову относятся к строке «менеджер», а долг – к «пустому менеджеру».
Предлагаю следующий вариант запроса, хотя заранее предполагаю что он не оптимален, так как пока до конца не разобралась с настройкой условий связи таблиц когда их больше двух (часто пишет противоречие при наложении связей, которое не осознаю) Поэтому в запросе оставила полные объединения, а отбрасываю пустые строки через наложение условий)
ВЫБРАТЬ
МенеджерыКонтагентовСрезПоследних.Менеджер,
ПродажиОбороты.СуммаОборот,
ВзаиморасчетыОстатки.СуммаОстаток,
ЕСТЬNULL(ПродажиОбороты.СуммаОборот, 0) – ЕСТЬNULL(ВзаиморасчетыОстатки.СуммаОстаток, 0) КАК Поле1,
Контрагенты.Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
ПО Контрагенты.Ссылка = ПродажиОбороты.Контрагент
ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.Взаиморасчеты.Остатки КАК ВзаиморасчетыОстатки
ПО Контрагенты.Ссылка = ВзаиморасчетыОстатки.Контрагент
ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.МенеджерыКонтагентов.СрезПоследних КАК МенеджерыКонтагентовСрезПоследних
ПО Контрагенты.Ссылка = МенеджерыКонтагентовСрезПоследних.Контрагент
ГДЕ
(ПродажиОбороты.СуммаОборот ЕСТЬ НЕ NULL
ИЛИ ВзаиморасчетыОстатки.СуммаОстаток ЕСТЬ НЕ NULL )
Вопрос – сортировку можно настроить по вычисляемому полю (закладка схемы компоновки данных) либо рассчитав соответствующее поле в запросе (оборот-долг) как правильнее: сразу в запросе получать необходимые данные или затем настраивать вычисляемое поле.
В данном случае, где определять поле разницы нет. Можно это сделать на уровне запросе.
Но вот саму сортировку правильно накладывать на уровне варианта отчета, а не в запросе.
Задание выполнено
1. Заполнение наборов
Меня удивило что в ДанныеФормыКоллекция нет функции Найти() но есть функция НайтиСтроки ()
Наборы заполняются при изменении номенклатуры в форме
ОбщиеФункцииСервер.ЗаполнитьСоставНабора(Номенклатура, Объект.СоставНабора);
Процедура ЗаполнитьСоставНабора(Номенклатура, СоставНабора) Экспорт
Если НЕ Номенклатура.ВидНоменклатуры = Перечисления.ВидыНомерклатуры.Набор Тогда
Возврат;
КонецЕсли;
//Если НЕ СоставНабора.Найти(Номенклатура, “Номенклатура”) = Неопределено Тогда НайденныеСтроки = СоставНабора.НайтиСтроки(Новый Структура(“Номенклатура”,Номенклатура));
Если НайденныеСтроки.Количество() = 0 Тогда
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| КомплектующиеНоменклатуры.Комплектующая,
| КомплектующиеНоменклатуры.Количество
|ИЗ
| РегистрСведений.КомплектующиеНоменклатуры КАК КомплектующиеНоменклатуры
|ГДЕ
| КомплектующиеНоменклатуры.Номенклатура = &Номенклатура”;
Запрос.УстановитьПараметр(“Номенклатура”, Номенклатура);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = СоставНабора.Добавить();
НоваяСтрока.Номенклатура = Номенклатура;
НоваяСтрока.Комплектующая = Выборка.Комплектующая;
НоваяСтрока.Количество = Выборка.Количество;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
В модуле объекта
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Сч = 0;
Пока Сч < СоставНабора.Количество() Цикл
СтрокаТаблицы = СоставНабора.Получить(Сч);
Если Товары.Найти(СтрокаТаблицы.Номенклатура, “Номенклатура”) = Неопределено Тогда
СоставНабора.Удалить(СтрокаТаблицы);
Иначе
Сч = Сч + 1;
КонецЕсли;
КонецЦикла;
СуммаДокумента = Товары.Итог(“Сумма”);
КонецПроцедуры
2 Движения и контроль остатков
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Период”, Дата);
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Запрос.УстановитьПараметр(“Менеджер”, Менеджер);
Запрос.Текст =
“ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.Качество,
| МАКСИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки,
| СУММА(РеализацияТоваровТовары.Количество * РеализацияТоваровТовары.Коэффициент) КАК Количество
|ПОМЕСТИТЬ втТовары
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНомерклатуры.Товар)
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.Качество
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| РеализацияТоваровСоставНабора.Комплектующая,
| РеализацияТоваровТовары.Качество,
| МАКСИМУМ(РеализацияТоваровТовары.НомерСтроки),
| СУММА(РеализацияТоваровСоставНабора.Количество * РеализацияТоваровТовары.Количество * РеализацияТоваровТовары.Коэффициент)
|ИЗ
| Документ.РеализацияТоваров.СоставНабора КАК РеализацияТоваровСоставНабора
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ПО РеализацияТоваровСоставНабора.Номенклатура = РеализацияТоваровТовары.Номенклатура
| И РеализацияТоваровСоставНабора.Ссылка = РеализацияТоваровТовары.Ссылка
|ГДЕ
| РеализацияТоваровСоставНабора.Ссылка = &Ссылка
| И РеализацияТоваровСоставНабора.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНомерклатуры.Набор)
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровСоставНабора.Комплектующая,
| РеализацияТоваровТовары.Качество
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения,
| &Период КАК Период,
| втТовары.Номенклатура,
| втТовары.Качество,
| втТовары.Количество
|ИЗ
| втТовары КАК втТовары
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| &Период КАК Период,
| &Контрагент КАК Контрагент,
| &Менеджер КАК Менеджер,
| РеализацияТоваровТовары.Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество * РеализацияТоваровТовары.Коэффициент) КАК Количество,
| СУММА(РеализацияТоваровТовары.Сумма) КАК Стоимость
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| &Период КАК Период,
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК ВидДвижения,
| РеализацияТоваров.Контрагент КАК Контрагент,
| РеализацияТоваров.СуммаДокумента КАК Сумма
|ИЗ
| Документ.РеализацияТоваров КАК РеализацияТоваров
|ГДЕ
| РеализацияТоваров.Ссылка = &Ссылка”;
Результат = Запрос.ВыполнитьПакет();
Движения.Товары.Загрузить(Результат[1].Выгрузить());
Движения.Товары.Записать();
Движения.Продажи.Записывать = Истина;
Движения.Продажи.Загрузить(Результат[2].Выгрузить());
Движения.Взаиморасчеты.Записывать = Истина;
Движения.Взаиморасчеты.Загрузить(Результат[3].Выгрузить());
Запрос.Текст =
“ВЫБРАТЬ
| ТоварыОстатки.Номенклатура,
| ПРЕДСТАВЛЕНИЕ(ТоварыОстатки.Номенклатура) КАК НоменклатураПредставление,
| ТоварыОстатки.Качество,
| ПРЕДСТАВЛЕНИЕ(ТоварыОстатки.Качество) КАК КачествоПредставление,
| -ТоварыОстатки.КоличествоОстаток КАК Остаток,
| втТовары.НомерСтроки – 1 КАК ИндексСтроки
|ИЗ
| РегистрНакопления.Товары.Остатки(
| ,
| (Номенклатура, Качество) В
| (ВЫБРАТЬ
| Таблица.Номенклатура,
| Таблица.Качество
| ИЗ
| втТовары КАК Таблица)) КАК ТоварыОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ втТовары КАК втТовары
| ПО ТоварыОстатки.Номенклатура = втТовары.Номенклатура
| И ТоварыОстатки.Качество = втТовары.Качество
|ГДЕ
| ТоварыОстатки.КоличествоОстаток < 0”;
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Если НЕ (ПараметрыСеанса.ТекущийПользователь.РазрешитьПревышениеОстаткаТоваров ИЛИ ДополнительныеСвойства.Свойство(“РазрешитьПревышениеОстаткаТоваров”)) Тогда
Отказ = Истина;
КонецЕсли;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “При списании “+Выборка.НоменклатураПредставление+” превышен остаток на “+Выборка.Остаток;
Сообщение.Поле = “Товары[“+Выборка.ИндексСтроки+”].Количество”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЦикла;
КонецЕсли;
КонецПроцедуры
3. Кнопка «Провести без контроля»
&НаКлиенте
Процедура ПровестиБезКонтроля(Команда)
Если НЕ Элементы.Список.ТекущаяСтрока = Неопределено Тогда
ПровестиБезКонтроляСервер(Элементы.Список.ТекущаяСтрока);
Элементы.Список.Обновить();
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПровестиБезКонтроляСервер(Документ)
Если НЕ Документ.ПометкаУдаления Тогда
ДокументОбъект = Документ.ПолучитьОбъект();
ДокументОбъект.ДополнительныеСвойства.Вставить(“РазрешитьПревышениеОстаткаТоваров”, Истина);
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецПроцедуры // ()
4. Отчет «Рейтинг менеджеров»
ВЫБРАТЬ
ВложенныйЗапрос.Менеджер КАК Менеджер,
СУММА(ВложенныйЗапрос.Дебиторка) КАК Дебиторка,
СУММА(ВложенныйЗапрос.Продажи) КАК Продажи,
СУММА(ВложенныйЗапрос.Продажи – ВложенныйЗапрос.Дебиторка) КАК Рейтиг
ИЗ
(ВЫБРАТЬ
МенеджерыКлиентовСрезПоследних.Менеджер КАК Менеджер,
ВзаиморасчетыОстатки.СуммаОстаток КАК Дебиторка,
0 КАК Продажи
ИЗ
РегистрНакопления.Взаиморасчеты.Остатки КАК ВзаиморасчетыОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МенеджерыКлиентов.СрезПоследних КАК МенеджерыКлиентовСрезПоследних
ПО ВзаиморасчетыОстатки.Контрагент = МенеджерыКлиентовСрезПоследних.Контрагент
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ПродажиОбороты.Менеджер,
0,
ПродажиОбороты.СтоимостьОборот
ИЗ
РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты) КАК ВложенныйЗапрос
СГРУППИРОВАТЬ ПО
ВложенныйЗапрос.Менеджер
УПОРЯДОЧИТЬ ПО
Рейтиг УБЫВ
Обратная связь:
1. Изменения в 8.2 по отношению к 8.1
2. Проблем не было
3. В курсе рассматривается отбор подчиненного справочника через «Связи параметров выбора», но пользователь в форме выбора может отключить отбор. Хотелось бы узнать возможность запрета отключения отбора без программирования и пример программного запрета.
3. Существует возможность управлять доступностью отбора, но делается это только программно.
Рассмотрим в мастер-группе такой пример.
Опять отвлекли от продвижения вперед — опоздал…
1,2,3) В МО документа «ДокРеализации» в процедуре «ОбработкаПроведения» сделал все как в главе 12 «Условное проведение» с маленьким дополнением в запросе. В поля запроса добавил поле ОстаткиТоваровОстатки.Качество. И во вложенном запросе выбора номеров строк документа в поля и в группировку добавил «ДокРеализацииСтроки.Качество». Для реализации отключения контроля проведения добавил перечисление «ТипыДокументов» и независимый РС с периодичностью в пределах дня – «ОтключениеКонтроляПроведения», измерения: «Пользователь» (СправочникСсылка.Пользователи) и «ТипДокумента» (ПеречислениеСсылка.ТипыДокументов), ресурсы : «ОтключениеКонтроляПроведения». И строчку кода Отказ = Истина; заменил на :
<code>
//проверка на отключение контроля проведения
ЗнФл=ЗначениеЗаполнено(ПроведениеБезКонтроляБезсообщений);
Если ЗнФл Тогда
ЗнФл=ПроведениеБезКонтроляБезсообщений
КонецЕсли;
Отказ = НаСервере.ПроверитьОтклПроведения(Дата, Перечисления.ТипыДокументов.ДокументыРеализации, Не ЗнФл);
</code> (Кстати надо просмотреть уроки на тему — почему к РС лучше обратиться запросом)
4) Кнопка «Провести без контроля». На форму документа добавлена кнопка «ПровестиБезКонтроля». В МФ документа ДокРеализации процедура ПриСозданииНаСервере –
<code>
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.ПровестиБезКонтроля.Доступность = НЕ НаСервере.ПроверитьОтклПроведения(Объект.Дата, Перечисления.ТипыДокументов.ДокументыРеализации, Ложь);
КонецПроцедуры
</code> тем самым кнопка будет доступна только тем пользователям, у кого есть права проводить без контроля. Еще отключил все сообщения при проведении по этой кнопке.
В МФ документа ДокРеализации добавлены процедуры
<code>
&НаКлиенте
Процедура ПровестиБезКонтроля(Команда)
ПровестиБезКонтроляПоКнопке();
КонецПроцедуры
&НаСервере
Процедура ПровестиБезКонтроляПоКнопке()
Объект.Ссылка.ПолучитьОбъект().ОбработкаПроведенияПоКнопке(Объект.Дата);
КонецПроцедуры
</code>
В общие модули добавил
<code>
&НаСервере Функция ПроверитьОтклПроведения(Дата, ТипДокумента, Сообщение) Экспорт
ТекПользователь = Справочники.Пользователи.НайтиПоРеквизиту(“ПользовательИБ”,ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор);
Если ЗначениеЗаполнено(ТекПользователь) Тогда
//смотрю в РС его возможности
Отбор = Новый Структура(“Пользователь,ТипДокумента”,ТекПользователь, ТипДокумента);
ВозможностиНаДату = РегистрыСведений.ОтключениеКонтроляПроведения.ПолучитьПоследнее(НачалоДня(Дата),Отбор).ОтключениеКонтроляПроведения;
Если ЗначениеЗаполнено(ВозможностиНаДату) И ВозможностиНаДату Тогда
Если Сообщение Тогда
Сообщить(“Контроль наличия остатков отключен. Докумен будет проведен. Сообщения о нехватке будут выведены.”);
КонецЕсли;
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции </code>
В модуле обьекта документа ДокРеализации добавил
<code>
&НаСервере
Перем ПроведениеБезКонтроляБезсообщений;
&НаСервере
Процедура ОбработкаПроведенияПоКнопке() Экспорт;
ПроведениеБезКонтроляБезсообщений = Истина;
Если НачалоДня(ТекущаяДата()) <= Дата и Дата <= КонецДня(ТекущаяДата()) Тогда
ЗнПроведения = РежимПроведенияДокумента.Оперативный;
Иначе
ЗнПроведения = РежимПроведенияДокумента.Неоперативный;
КонецЕсли;
ОбработкаПроведения(Ложь, ЗнПроведения);
КонецПроцедуры
</code>
5) В строки табличных частей документов добавил КоэфПересчета, изменил процедуру ОбработкаПроведения у этих документов.
6)Для учета продаж в РН в документы реализации добавил реквизит «Менеджер», заполняю его текущим пользователем при создании документа. Редактирование менеджера в документе реализации отключаю. При отладке движений в РН увидел, что проведение «Провести без контроля» не работает. В МФ ДокРеализации «ПровестиБезКонтроляПоКнопк» необходимо вызвать сохранение документа. Так как ниже, не помогает, буду смотреть решение.
<code>
Процедура ПровестиБезКонтроляПоКнопке()
ВозвратПроведения = Объект.Ссылка.ПолучитьОбъект().ОбработкаПроведенияПоКнопке(Объект.Дата);
Если ВозвратПроведения Тогда
Объект.Ссылка.ПолучитьОбъект().Записать();
Объект.Ссылка.ПолучитьОбъект().Прочитать();
//ругается – свойство не доступно для записи
//Объект.Проведен = ВозвратПроведения;
КонецЕсли;
КонецПроцедуры
</code>
7) Добавил РН «Взаиморасчеты» (вид регистра — остатки). Добавил движение по этому РН при проведении «ДокПоступлкния», «ДокРеализации», «Выписка».
8) Вот и вспомнил про перечисление «ВидыНоменклатуры»(товар, услуга, набор), и добавил в процедуру «ОбработкаПроведения»
<code>
…
Если Не ТекСтрокаСтроки.Номенклатура.Ссылка.ВидНоменклатуры = Перечисления.ВидНоменклатуры.Услуга Тогда
…
</code>
9)Набор…больше все я «страдал» с проведением, но на первый взгляд получилось. Итак — добавил справочник НаборыНоменклатуры с владельцем Справочник.Номенклатура. В ТЧ этого справочника записываю набор. Единица измерения у номенклатуры в наборе — только базовая.
Процедура документа ДокПоступления с учетом набора (code1.doc) http://ifolder.ru/23991765 Процедура документа ДокРеализации с учетом набора и с контролем на отрицательные значения и указанием на конкретную строку (много кода получилось — см надо решение) (code2.doc) http://ifolder.ru/23991766
Устойчивость при перепроведении обеспечил запретом изменения набора в МО справочника НаборыНоменклатуры
<code>
Процедура ПередЗаписью(Отказ)
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ ПЕРВЫЕ 1
| ДокРеализацииСтроки.Ссылка.Номер,
| ДокРеализацииСтроки.Ссылка.Дата
|ИЗ
| Документ.ДокРеализации.Строки КАК ДокРеализацииСтроки
|ГДЕ
| ДокРеализацииСтроки.Номенклатура = &Номенклатура
| И ДокРеализацииСтроки.Ссылка.Проведен = &Проведен”;
Номенклатура = Владелец;
Проведен = Истина;
Запрос.УстановитьПараметр(“Номенклатура”, Номенклатура);
Запрос.УстановитьПараметр(“Проведен”, Проведен);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
ВыборкаДетальныеЗаписи = Результат.Выбрать();
ВыборкаДетальныеЗаписи.Следующий();
Сообщить(“Изменение набора не возможно, он есть в проведенном документе “+ВыборкаДетальныеЗаписи.Номер+” за “+ВыборкаДетальныеЗаписи.Дата);
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
</code>
10)Отчет «ДолгиПоМенеджерам» вопросов не вызвал.
В отчете «Прогнозируемый Финансовый Результат» определил набор данных
<code>
ВЫБРАТЬ
ОстаткиТоваровОстатки.Номенклатура,
СУММА(ОстаткиТоваровОстатки.КолвоОстаток) КАК КолвоОстаток,
ЦеныЗакупки.Цена КАК ЦенаЗакупки,
ЦеныПродажи.Цена КАК ЦенаПродажи
ИЗ
РегистрНакопления.ОстаткиТоваров.Остатки(, ) КАК ОстаткиТоваровОстатки
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыСрезПоследних.ТипЦены КАК ТипЦены,
ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
ГДЕ
ЦеныНоменклатурыСрезПоследних.ТипЦены = &ТипЦеныЗакупки) КАК ЦеныЗакупки
ПО ОстаткиТоваровОстатки.Номенклатура = ЦеныЗакупки.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыСрезПоследних.ТипЦены КАК ТипЦены,
ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
ГДЕ
ЦеныНоменклатурыСрезПоследних.ТипЦены = &ТипЦеныПродажи) КАК ЦеныПродажи
ПО ОстаткиТоваровОстатки.Номенклатура = ЦеныПродажи.Номенклатура
СГРУППИРОВАТЬ ПО
ОстаткиТоваровОстатки.Номенклатура,
ЦеныЗакупки.Цена,
ЦеныПродажи.Цена
</code>
и добавил вычисляемое поле ФинРезультат = КолвоОстаток*(Isnull(ЦенаПродажи,0)-Isnull(ЦенаЗакупки,0))
В отчете «Рейтинг Продаж» задумался над запросом, но все получилось.
«ответ на 3 вопроса»
1) Что-то уже могусделать в конфигурации осознано, а не «методом научного тыка».
2) Трудности в кнопке «Провести без контроля». Пока еще быстрее ищу ответы в уроках, чем в синтаксис-помощнике. Буду работать — смотреть внимательнее иерархию классов и т.д.
Извините пишу в этом модуле. Написала на support@spec8.ru мне пока не ответили, а для меня важно. Не могу сама разобраться. При выполнении ДЗ 10 и работе с документом Операция столкнулась с проблемой. Заполняю период записей регистра датой документа, как было разобрано в теории в Процедуре ЗаполнитьПериод().
Но возникает следующее: дата проставляется только в 1 строке, затем документ остается открытым и в шапке остается заголовок “Операция (создание)*”. Если я пытаюсь закрыть документ через Х, возникает вопрос “Данные былы изменены. Сохранить изменения?”. При ответе “Да” появляется ошибка “Данные были изменены или удалены другим пользователем” ОК.
Документ насильно закрываю, и потом при открытии там пропадают все строки кроме первой. И при попытке продолжить работу с этим документом все время выдает ошибку “Данные были изменены или удалены другим пользователем” ОК.
Что мне делать?
Не знаю что изменилось, мучилась несколько дней но сегодня вдруг проблема куда-то пропала. Даже не знаю. Может нестыковка в платформе дома и на работе, хотя ставила вроде один релиз. Но сейчас уже нет пробоемы.
Скорее всего Вы изменили план видов характеристик – указали использование составного типа, и все волшебным образом исправилось :)
Сделать нужно вот что:
1. Вопросы, касающиеся материалов курса, писать в мастер-группу – mg.spec8ru@gmail.com. Тогда и ответ будет быстрее.
2. Посмотрите решение ДЗ№10, там разбирается эта проблема.
Спасибо за ответ, я решение смотрю когда уже выложу свое решение, не раньше.
Хорошо.
Задание выполнила.
Реализация проводится по остаткам по новому алгоритму, т.е. наборы разузловываются в товары, и товары списываются, затем проверяется остаток, и при ошибке указывает на строки табличной части. При отрицательных остатках по комплектующим наборов ошибка указывается на сам набор.
В справочнике “Пользователи”введен флаг “НеКонтролироватьОстатки”, если он истина, то разрешены отрицательные остатки, но с указанием на ошибке в документе.
Новый Регистр Накопления “Продажи”, вид “Обороты” заполняется при проведении Реализации.
===============================================================
Для учета наборов в Перечисление.ВидыНоменклатуры добавлено значение “Набор”. Введен РегистрСведений.КомплектующиеНоменклатуры (измерение-Номенклатура, Комплектующая; ресурс – Количество)
//Форма записи РегСвед КомплектующиеНоменклатуры
Функция ЭтоНабор(Номенклатура)
Возврат ?(Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Набор,Истина, Ложь);
КонецФункции
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Если ЭтоНабор(Запись.Комплектующая) тогда
Предупреждение(“В состав не может входить набор!”,15);
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
//конец формы записи РегСвед КомплектующиеНоменклатуры
=================================================================================
//Модуль объекта док Реализация
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
СуммаДокумента = Товары.Итог(“Сумма”);
//организуем пометку на удаление
Если ПометкаУдаления<>Ссылка.ПометкаУдаления Тогда
Набор = Движения.ОстаткиТоваров;
Набор.Записать();
КонецЕсли;
КонецПроцедуры
—————————–
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
//проведение Модуля НЗ РН ОстаткиТоваров
Движения.ОстаткиТоваров.ПровестиБезКонтроляВМодулеНЗ(Ссылка);
Движения.ОстаткиТоваров.Записать();
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ОстаткиТоваровОстатки.Номенклатура,
| ОстаткиТоваровОстатки.Качество,
| ОстаткиТоваровОстатки.КоличествоОстаток КАК Нехватка,
| Док.НомерСтроки
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(
| &МоментДок,
| Номенклатура В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВЫБОР
| КОГДА КомплектующиеНоменклатуры.Комплектующая ЕСТЬ NULL
| ТОГДА Док.Номенклатура
| ИНАЧЕ КомплектующиеНоменклатуры.Комплектующая
| КОНЕЦ КАК Номенклатура
| ИЗ
| (ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
| МАКСИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры <> &ВидНоменклатурыУслуга
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура
| ) КАК Док ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КомплектующиеНоменклатуры КАК КомплектующиеНоменклатуры
| ПО
| Док.Номенклатура = КомплектующиеНоменклатуры.Номенклатура)
| И Качество = &НужноеКачество) КАК ОстаткиТоваровОстатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВЫБОР
| КОГДА КомплектующиеНоменклатуры.Комплектующая ЕСТЬ NULL
| ТОГДА ДокРеал.Номенклатура
| ИНАЧЕ КомплектующиеНоменклатуры.Комплектующая
| КОНЕЦ КАК Номенклатура,
| ДокРеал.НомерСтроки КАК НомерСтроки
| ИЗ
| (ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
| МАКСИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры <> &ВидНоменклатурыУслуга
|
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура) КАК ДокРеал
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КомплектующиеНоменклатуры КАК КомплектующиеНоменклатуры
| ПО ДокРеал.Номенклатура = КомплектующиеНоменклатуры.Номенклатура) КАК Док
| ПО ОстаткиТоваровОстатки.Номенклатура = Док.Номенклатура
|ГДЕ
| ОстаткиТоваровОстатки.КоличествоОстаток < 0”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Граница = Новый Граница(МоментВремени(),ВидГраницы.Включая);
Запрос.УстановитьПараметр(“МоментДок”, Граница);
Запрос.УстановитьПараметр(“НужноеКачество”, Справочники.СтепениБрака.ПустаяСсылка());
Запрос.УстановитьПараметр(“ВидНоменклатурыУслуга”, Перечисления.ВидыНоменклатуры.Услуга);
Результат = Запрос.Выполнить();
Если не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Нехватает на складе “+(Выборка.Номенклатура) +” “+(-Выборка.Нехватка);
Сообщение.Поле = “Товары[“+(Выборка.НомерСтроки-1)+”].Количество”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЦикла;
Если ПараметрыСеанса.ТекущийПользователь.НеКонтролироватьОстатки = Ложь Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
// регистр Продажи
ТекущийМенеджер = ОбщийМодульНаСервере.ПолучитьМенеджераКлиента(Дата,Покупатель);
Движения.Продажи.Записывать = Истина;
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Контрагент = Покупатель;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Менеджер = ТекущийМенеджер;
//пересчет в базовые единицы
БазЕдИзмКоэф = ОбщийМодульНаСервере.ПолучитьБазовуюЕдиницу(ТекСтрокаТовары.Номенклатура,ТекСтрокаТовары.Номенклатура.БазоваяЕдиница).Коэффициент;
Если БазЕдИзмКоэф<>ТекСтрокаТовары.К тогда //пересчет в базовые единицы
Движение.Количество = ТекСтрокаТовары.Количество /БазЕдИзмКоэф*ТекСтрокаТовары.К;
иначе
Движение.Количество = ТекСтрокаТовары.Количество;
КонецЕсли;
Движение.Сумма = ТекСтрокаТовары.Сумма;
КонецЦикла;
//регистр Взаиморасчеты
Движения.Взаиморасчеты.ВыполнитьДвижениеПоРегистру(Ссылка.ПолучитьОбъект(),ВидДвиженияНакопления.Приход,Покупатель,СуммаДокумента);
КонецПроцедуры
//конец Модуля об док Реализация
=======================================================================
В форме списка “Реализаций” по кнопке “Провести без контроля” док проводится всегда
//Модуль формы списка
&НаКлиенте
Процедура ПровестиБезКонтроля(Команда)
Ссылка = Элементы.Список.Текущаястрока;
Если Ссылка = Неопределено тогда
Возврат;
КонецЕсли;
СформироватьПроведение(Ссылка);
ОповеститьОбИзменении(Ссылка);
КонецПроцедуры
————————
&НаСервереБезКонтекста
Процедура СформироватьПроведение(Ссылка)
Объект = Ссылка.ПолучитьОбъект();
Объект.Движения.ОстаткиТоваров.ПровестиБезКонтроляВМодулеНЗ(Ссылка);
КонецПроцедуры
————————————
//вызывается Модуль НЗ РН ОстаткиТоваров
Процедура ПровестиБезКонтроляВМодулеНЗ(Ссылка) экспорт
// регистр ОстаткиТоваров Расход
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВЫБОР
| КОГДА КомплектующиеНоменклатуры.Количество ЕСТЬ NULL
| ТОГДА Док.Количество
| ИНАЧЕ КомплектующиеНоменклатуры.Количество * Док.Количество
| КОНЕЦ КАК Количество,
| ВЫБОР
| КОГДА КомплектующиеНоменклатуры.Комплектующая ЕСТЬ NULL
| ТОГДА Док.Номенклатура
| ИНАЧЕ КомплектующиеНоменклатуры.Комплектующая
| КОНЕЦ КАК Номенклатура,
| Док.К
|ИЗ
| (ВЫБРАТЬ
| РеализацияТоваровТовары.Ссылка КАК Ссылка,
| РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
| РеализацияТоваровТовары.Количество КАК Количество,
| РеализацияТоваровТовары.К КАК К
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры <> &ВидНоменклатурыУслуга) КАК Док
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КомплектующиеНоменклатуры КАК КомплектующиеНоменклатуры
| ПО Док.Номенклатура = КомплектующиеНоменклатуры.Номенклатура”;
Запрос.УстановитьПараметр(“ВидНоменклатурыУслуга”, Перечисления.ВидыНоменклатуры.Услуга);
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Результат = Запрос.Выполнить();
ВыборкаКомплектующая = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаКомплектующая.Следующий() Цикл
Запись = ДобавитьРасход();
Запись.Период = Ссылка.Дата;
Запись.Номенклатура = ВыборкаКомплектующая.Номенклатура;
Запись.Качество = Справочники.СтепениБрака.ПустаяСсылка();
//пересчет в базовые единицы
БазЕдИзмКоэф = 1;
Если БазЕдИзмКоэф<>ВыборкаКомплектующая.К тогда
Запись.Количество = ВыборкаКомплектующая.Количество /БазЕдИзмКоэф*ВыборкаКомплектующая.К;
иначе
Запись.Количество = ВыборкаКомплектующая.Количество;
КонецЕсли;
Записать();
КонецЦикла;
Объект = Ссылка.ПолучитьОбъект();
Объект.Проведен = Истина;
Объект.Записать();
КонецПроцедуры
//конец Модуля НЗ
==============================================================
Новый док Выписка и Новый Регистр Накопления “Взаиморасчеты”, вид “Остатки” (Измерение – Контрагент; ресурс – Сумма).
//Модуль НЗ РН Взаиморасчеты
Процедура ВыполнитьДвижениеПоРегистру(Объект,ВидДвижения,Контрагент,Сумма) Экспорт
Запись = Добавить();
Запись.ВидДвижения = ВидДвижения;
Запись.Период = Объект.Дата;
Запись.Контрагент = Контрагент;
Запись.Сумма = Сумма;
Записать();
КонецПроцедуры
—————————-
//часть кода из процедуры “ОбработкаПроведения” Модуля объекта док Поступление
//регистр Взаиморасчеты
Движения.Взаиморасчеты.ВыполнитьДвижениеПоРегистру(Ссылка.ПолучитьОбъект(),ВидДвиженияНакопления.Расход,Поставщик,СуммаДокумента);
—————————-
//часть кода из процедуры “ОбработкаПроведения” Модуля объекта док Реализация
//регистр Взаиморасчеты
Движения.Взаиморасчеты.ВыполнитьДвижениеПоРегистру(Ссылка.ПолучитьОбъект(),ВидДвиженияНакопления.Приход,Покупатель,СуммаДокумента);
===============================================================
Услуги не приходуются и не списываются, стоит проверка.
===============================================================
Отчет “Долги по менеджерам” получился, похожее разбиралось.
———————–
//Текст запроса
===========================================================================
Отчет “Прогнозируемый финансовый результат” получился частично, а именно если у товара нет в РегСведений одного из введенных типов цен, но есть остаток, то строка не выводится. Видимо неправильно настроена связь.
———————–
//Текст запроса
ВЫБРАТЬ
ЕСТЬNULL(ОстаткиТоваровОстатки.Номенклатура, ЕСТЬNULL(ЦенаЗакуп.Номенклатура, ЦенаПрод.Номенклатура)) КАК Номенклатура,
ОстаткиТоваровОстатки.КоличествоОстаток,
ЦенаЗакуп.Цена КАК ЦенаЗакупки,
ЦенаПрод.Цена КАК ЦенаПродажи,
ЦенаЗакуп.ТипЦены,
ЦенаПрод.ТипЦены КАК ТипЦены1
ИЗ
РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦенаПрод
ПО ОстаткиТоваровОстатки.Номенклатура = ЦенаПрод.Номенклатура
ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦенаЗакуп
ПО ОстаткиТоваровОстатки.Номенклатура = ЦенаЗакуп.Номенклатура
ГДЕ
ЦенаЗакуп.ТипЦены = &ТипЦеныЗакуп
И ЦенаПрод.ТипЦены = &ТипЦеныПродаж
СГРУППИРОВАТЬ ПО
ОстаткиТоваровОстатки.КоличествоОстаток,
ЦенаЗакуп.Цена,
ЦенаПрод.Цена,
ЦенаЗакуп.ТипЦены,
ЦенаПрод.ТипЦены,
ЕСТЬNULL(ОстаткиТоваровОстатки.Номенклатура, ЕСТЬNULL(ЦенаЗакуп.Номенклатура, ЦенаПрод.Номенклатура))
============================================================================
Отчет “Рейтинг менеджеров”получился частично, а именно тоже теряется 1 клиент.
———————–
//Текст запроса
ВЫБРАТЬ
ЕСТЬNULL(ТабДебиторка.Менеджер, ПродажиОбороты.Менеджер) КАК Менеджер,
ПродажиОбороты.СуммаОборот КАК Продажи,
ТабДебиторка.СуммаОстаток КАК Дебиторка
ИЗ
(ВЫБРАТЬ
МенеджерыКлиентаСрезПоследних.Менеджер КАК Менеджер,
ЕСТЬNULL(ВзаиморасчетыОстатки.Контрагент, МенеджерыКлиентаСрезПоследних.Контрагент) КАК КлиентДебиторки,
ВзаиморасчетыОстатки.СуммаОстаток КАК СуммаОстаток
ИЗ
РегистрСведений.МенеджерыКлиента.СрезПоследних КАК МенеджерыКлиентаСрезПоследних
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Взаиморасчеты.Остатки КАК ВзаиморасчетыОстатки
ПО МенеджерыКлиентаСрезПоследних.Контрагент = ВзаиморасчетыОстатки.Контрагент) КАК ТабДебиторка
ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
ПО ТабДебиторка.Менеджер = ПродажиОбороты.Менеджер
============================================================================
Видно мало опыта, с отчетами еще надо тренироваться.
Задание выполнил. Вопросов в принципе не возникло. Движения по регистрам изначально выполнял без использования запросов., но подход показанный в решении с использованием запросов мне очень понравился и все переделал заново.
Евгений, каковы шансы опоздывающего попасть в финал курса? Быстрее выполнять ДЗ не удается из-за большой загруженности.
Можно попытаться догнать группу, тогда шансы есть.
Без выполнения всех заданий финалистом не стать.
Если не получиться выполнить все задания к финалу, то финал можно провести со следующим потоком (для этого нужно быть участником мастер-группы).
Задание выполнил.
Проведение документов сделал по технологии 8.2.
Работу с наборами реализовал через табличную часть справочника “Номенклатура” и вторые табличные части документов.
Второй и третий отчеты смог доделать только после просмотра решения.
Задание выполнил. Запрос при проведении реализации получился с большим количеством временных таблиц и менеджером ВТ. Проведение без контроля остатков из формы сделал при помощи переменной модуля объекта и конвертации данных формы в объекты.
ДЗ выполнил. Задержка была связана с большой загрузкой на работе. Задание интересное, много раз преписывал одно и то же с разными подходами. Посмотрел ответы и снова засел переделывать. Обычно на выполнение задания уходил вечер, а тут целая неделя хоть и урывками. Я понимаю необходимость высокого темпа, постараюсь нагнать группу. Задание №10 тоже выполнил, сейчас работаю над 11.
Просьба по заданию 10 отчитаться отдельно, отчеты по всем заданиям будут необходимы для финала.
ДЗ 9
Для контроля остатков, при проведении, добавлен реквизит ОтключитьКонтрольОстатков в справочник Пользователи.
Проведение по алгоритму 8.2. Запись в регистр по циклу.
Добавлен регистр накопления оборотный Продажи
Измерения –Контрагент, Номенклатура, Менеджер Ресурс Количество, Сумма
Добавлен регистр накопления остатки Взаиморасчеты
Измерения- Контрагент; Ресурс- Сумма
При проведение в цикле проверяем содержимое табличной части, если приход или расход заполнен, то делаем соответствующие записи в Взаиморасчетах
Для хранения наборов добавлен регистр сведений
Измерения -Набор, Комплектующие ;Ресурс -Количество
В документы добавлена Табличная часть Наборы- заполняется перед записью документа.
По регистру остатков проводим содержимое таблицы (вид=товары)+наборы.количество*на состав наборов
Спасибо за задание – очень понравилось!
Надеюсь скоро догоню группу
По вопросам – хотелось по подробней о плане видов характеристик
Вставлю и свои 5 копеек в обратную связь. :0)
Материал интересный, хорошо и понятно рассказывается. Узнал много нового и о 8.2 и даже о том, что было в 8.1, но по работе до сих пор не сталкивался.
Единственно, что расстраивает, так это очень быстрый темп. Если предполагается,что человек работает четко с 10 до 18, то темп может и нормальный. Но при большой загрузке и задержках, честно говоря, выматывает. Сначало перестал смотреть МГ, теперь накопились не смотренные сессии ответов на вопросы.
Хотелось бы, чтобы хватало времени не только чтобы отрапортовать о ДЗ и бросаться в новое ралли, но и просто обдумать увиденное. Очень надеюсь, что в продвинутом курсе будет хотябы чуток побольше времени между занятиями.
Спасибо, Дмитрий, пожелание будем анализировать.
И про меня тоже Дмитрий написал.
И ведь понимаю организаторов – и так базовый длится 3 месяца, а уменьшать темп преподавания – увеличится длительность…
Для себя решил – после окончания базового – немного отдохну, потом пройду его еще раз, самостоятельно, с подробным разбором, и, только потом, пойду на продвинутый.