Базовый курс. Занятие №8
2-ое занятие по второму блоку базового курса.
Необходимо изучить следующие главы.
Глава 5. Журналы документов.
Глава 6. Настройка командного интерфейса.
Глава 7. Регистры.
Глава 8. Регистры накопления.
Глава 9. Регистры сведений.
Глава 10. Настройка форм.
Также нужно выполнить домашнее задание, текст которого доступен на странице.
Задание необходимо выполнять в ИБ после предыдущего ДЗ.
В этой же теме необходимо написать отчет о выполнении задания.
ps. Участники курса без доступа в мастер-группу отчитаться по домашним заданиям не получиться.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —напишите нам на e-mail поддержки.
Выполнил.
С проверкой на запрет изменения БЕ, разбирался по решению.
P.S. раньше не было возможности отчитаться:(
Необходимо обеспечить привязку менеджеров компании (тип данных – справочник
«Пользователи») к клиентам. Считается, что в один момент времени с клиентом может работать
только один менеджер, но с течением времени менеджер у контрагента может измениться.
Смена менеджера производится в произвольный момент вручную (не требуется
отдельного документа).
Заводим РС “Менеджеры контрагентов”. Измерение: Контрагент (Ведущий), Ресурс: Менеджер. Периодичность в пределах дня.
В документе «КонтактСКлиентом» (у вас документ может называться по-другому)
необходимо создать реквизит “Менеджер” (тип данных – справочник «Пользователи»). При
создании нового документа в реквизит нужно подставлять текущего пользователя.
завёл параметр сеанса, содержащий ссылку на текущего пользователя из справочника Пользователи и модуле документа заполняю:
<code>Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Менеджер = ПараметрыСеанса.ТекущийПользователь;
КонецПроцедуры
</code>
При
проведении документа необходимо выполнять анализ, если происходит первый контакт с
контрагентом, то необходимо в качестве менеджера для контрагента нужно установить значение,
указанное в документе.
<code>Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Запрос = Новый Запрос(“ВЫБРАТЬ
| МенеджерыКонтрагентовСрезПоследних.Период
|ИЗ
| РегистрСведений.МенеджерыКонтрагентов.СрезПоследних(&Дата, Контрагент = &Контрагент) КАК МенеджерыКонтрагентовСрезПоследних”);
Запрос.УстановитьПараметр(“Дата”, Дата);
Запрос.УстановитьПараметр(“Контрагент”,Контрагент);
Если Запрос.Выполнить().Пустой() Тогда
Запись = РегистрыСведений.МенеджерыКонтрагентов.СоздатьМенеджерЗаписи();
Запись.Контрагент = Контрагент;
Запись.Менеджер = Менеджер;
Запись.Период = Дата;
Запись.Записать();
КонецЕсли;
КонецПроцедуры
</code>
Реквизиты “Менеджер” и “Контрагент” должны быть обязательными для
заполнения в этом документе.
включаем для этих реквизитов проверку заполнения
Также обеспечьте, чтобы система позволяла выбирать контактных
лиц, указанного в документе контрагента.
настраиваем для реквизита Контактное лицо связь параметров выбора.
Обеспечьте хранение цен на товары. При этом необходимо предусмотреть ведение
различных прайс-листов, например, цены розничные, мелкооптовые и т.д. Цены задаются
пользователем самостоятельно.
Создаем РС Цены. Периодичность в пределах дня, режим записи – независимый. Измерения: Номенклатура(ведущее), Тип цен. Ресурс – Цена.
Необходимо поработать над удобством работы с документами системы. В документах
закупки и отгрузки создайте реквизит, в котором пользователь будет выбирать прайс, для
заполнения цен текущего документа. Для всех документов по учету ТМЦ реализуйте следующее
поведение:
• Автоматическую подставку цен при выборе номенклатуры, согласно указанного
прайса;
В общем серверном модуле создаём функцию:
<code>Функция ПолучитьЦенуПоТипуНаТовар(Товар, ТипЦен, Дата = Неопределено) Экспорт
Если Не (ЗначениеЗаполнено(Товар) И ЗначениеЗаполнено(ТипЦен)) Тогда
Возврат 0;
КонецЕсли;
Запрос = Новый Запрос(“ВЫБРАТЬ
| ЦеныСрезПоследних.Цена
|ИЗ
| РегистрСведений.Цены.СрезПоследних(
| &Дата,
| Номенклатура = &Номенклатура
| И ТипЦенНоменклатуры = &ТипЦенНоменклатуры) КАК ЦеныСрезПоследних”);
Запрос.УстановитьПараметр(“Номенклатура”, Товар);
Запрос.УстановитьПараметр(“ТипЦенНоменклатуры”, ТипЦен);
Запрос.УстановитьПараметр(“Дата”, Дата);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Цена;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции // ПолучитьЦенуПоТипуНаТовар()
</code>
и вызываем её в модуле формы документов при изменении товара:
<code>&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ТД = Элементы.Товары.ТекущиеДанные;
ТД.ЕдиницаИзмерения = ПолучитьЕдиницуИзмерения(ТД.Номенклатура);
ТД.Цена = ОбщиеФункцииСервер.ПолучитьЦенуПоТипуНаТовар(ТД.Номенклатура, Объект.ТипЦенНоменклатуры, Объект.Дата);
КонецПроцедуры
</code>
• Пересчет суммы по цене и количеству;
создаем в общем клиентском модуле процедуру:
<code>
Процедура ПересчитатьСуммуСтрокиТабличнойЧасти(Строка) Экспорт
Строка.Сумма = Строка.Цена*Строка.Количество;
КонецПроцедуры
</code>
вызываем её во всех документах ТМЦ при изменении номенклатуры, количествамили цены.
• Пересчет цены или количества при изменении суммы (сам вариант пересчета –
количества или цены, определите с помощью константы
создаём сервере модуль для пересчета с получением константы.
• Отображение итоговой суммы документа
добавляем на форму
• Номенклатура, единица измерения и количество являются обязательными для
заполнения.
устанавливаем проверку заполнения
• В документе реализации контактное лицо должно быть связано с контрагентом.
устанавливаем связь параметров выбора
Создайте регистр для хранения остатков товаров, при этом номенклатура должна
храниться в разрезе качества (степеней брака). Количество в регистре храниться в базовых
единицах измерения.
Стоимостной учет номенклатуры вести не нужно.
Создаём РН “Остатки товаров”. Измерения: Номенклатура, Качество. Ресурсы: “Количество”.
Обеспечьте приходные движения в регистр при проведении документов закупки.
В Поступлении товаров и Авансовом отчете вот такой код:
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ТЗ = Товары.Выгрузить(, “Номенклатура, Качество, Количество”);
ТЗ.Свернуть(“Номенклатура, Качество”, “Количество”);
ТЗ.Колонки.Добавить(“Период”);
ТЗ.Колонки.Добавить(“ВидДвижения”);
ТЗ.ЗаполнитьЗначения(Дата, “Период”);
ТЗ.ЗаполнитьЗначения(ВидДвиженияНакопления.Приход, “ВидДвижения”);
ДвижОстатки = Движения.ОстаткиТоваров;
ДвижОстатки.Записывать = Истина;
ДвижОстатки.Загрузить(ТЗ);
КонецПроцедуры
</code>
Создайте объект, для хранения данных о закупках от поставщиков.
Обеспечьте заполнение
данных объекта при проведении документов. Информацию о закупках необходимо хранить в
разрезе поставщиков и товаров, необходимые показатели для учета – количество и стоимость
закупок. В дальнейшем эти данные будут использоваться для построения отчетов о закупках за
различные периоды.
Создаём оборотный РН Закупки. Измерения: Номенклатура, Контрагент. Ресурсы: Количество, Сумма
Тогда обработка проведения Поступления товаров и Авансового отчета изменится:
<code>Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ТЗ = Товары.Выгрузить(, “Номенклатура, Качество, Количество, Сумма”);
ТЗ.Свернуть(“Номенклатура, Качество”, “Количество, Сумма”);
ТЗ.Колонки.Добавить(“Период”);
ТЗ.Колонки.Добавить(“ВидДвижения”);
ТЗ.Колонки.Добавить(“Контрагент”);
ТЗ.ЗаполнитьЗначения(Дата, “Период”);
ТЗ.ЗаполнитьЗначения(ВидДвиженияНакопления.Приход, “ВидДвижения”);
ТЗ.ЗаполнитьЗначения(Контрагент, “Контрагент”);
ДвижОстатки = Движения.ОстаткиТоваров;
ДвижОстатки.Записывать = Истина;
ДвижОстатки.Загрузить(ТЗ);
ДвижЗакупки = Движения.Закупки;
ДвижЗакупки.Записывать = Истина;
ДвижЗакупки.Загрузить(ТЗ);
КонецПроцедуры
</code>
Необходимо реализовать проверку, которая будет запрещать изменять базовую единицу
измерения для номенклатуры, если по ней уже есть движения в регистрах.
в модуле объекта справочника номенклатура:
<code>Процедура ПередЗаписью(Отказ)
ЭтоНовый = ЭтоНовый();
Если не ЭтоНовый И Ссылка.БазоваяЕдиница <> БазоваяЕдиница Тогда
Запрос = Новый Запрос(“ВЫБРАТЬ ПЕРВЫЕ 1
| ОстаткиТоваровОбороты.Номенклатура
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Обороты(, , , Номенклатура = &Номенклатура) КАК ОстаткиТоваровОбороты”);
Запрос.УстановитьПараметр(“Номенклатура”, Ссылка);
Если Не Запрос.Выполнить().Пустой() Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Невозможно изменить, т.к. товар участвует в движении”;
Сообщение.Поле = “БазоваяЕдиница”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
Создайте журнал документов «Документы закупки», в котором должна
отображаться информация о виде документа, контрагенте/подотчетном лице, сумме документа.
сделал. Единственное, требуется завести у документов реквизит СуммаДокумента и в модуле документа его заполнять:
<code>
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
СуммаДокумента = Товары.Итог(“Сумма”);
КонецПроцедуры
</code>
Задание выполнено.
1. Для хранения данных по менеджерам клиентов создан независимый регистр сведений “Менеджеры клиентов” (измерение – контрагент, ресурс – менеджер), периодичность в пределах секунды.
2. Документ “Контакт с клиентом”
– заполнение текущего пользователя при создании нового документа происходит в процедуре “ОбработкаЗаполнения” в модуле объекта
– Запись в рег.сведений “Менеджеры клиентов” происходит в процедуре ОбработкаПроведения модуля объекта
3. Создан справочник “Типы цен”, регистр сведений “Цены номенклатуры” (измерения – тип цен, номенклатура; ресурс – цена).
4. Документы движения товаров
– автоматическое заполнение цены производится в обработчике события “ТоварыНоменклатураПриИзменении”, вызывается серверная процедура модуля “ЗаполнениеДокументовСервер”
– в модуле формы создана клиентская процедура “Пересчет” для пересчета суммы по цене и количеству, созданы обработчики события “При изменении” для полей “Количество” и “Цена” ТЧ “Товары”.
– Создана константа “Вариант пересчета суммы”, тип значения – Перечисление “Варианты пересчета суммы”. Добавлен обработчик события поля “Сумма” ТЧ “Товары”. В клиентскую процедуру “Пересчет” добавлен алгоритм пересчета цены или количества в зависимости от установленного в соответствующей константе варианта пересчета. Для получения значения константы потребовалось создать соответствующую серверную функцию.
5. Создан регистр накопления “ОстаткиТоваров” вида “Остатки”, измерения – номенклатура, качество; ресурс – количество.
6. Создан регистр накопления “Закупки” вида “Обороты”, измерения – контрагент, номенклатура; ресурсы – количество, сумма. С помощью конструктора движений создана процедура “ОбработкаПроведения” по обоим созданным регистрам в модуле документа “ПоступлениеТоваров”.
7. Проверка на возможность изменения реквизита “Базовая ед.изм.” в справочнике “Номенклатура”:
Процедура БазоваяЕдиницаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = ОбщиеФункцииСервер.МожноИзменятьБазовуюЕдиницуИзмерения(Объект.Ссылка);
Если НЕ СтандартнаяОбработка Тогда
Сообщить(“Нельзя изменять базовую единицу измерения
| По номенклатуре “+Объект.Наименование+” существуют движения в информационной базе!”);
КонецЕсли;
КонецПроцедуры
Функция МожноИзменятьБазовуюЕдиницуИзмерения(Номенклатура) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ТоварыОбороты.Номенклатура
|ИЗ
| РегистрНакопления.Товары.Обороты(, , Период, Номенклатура = &Номенклатура) КАК ТоварыОбороты
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЗакупкиОбороты.Номенклатура
|ИЗ
| РегистрНакопления.Закупки.Обороты(, , Период, Номенклатура = &Номенклатура) КАК ЗакупкиОбороты”;
Запрос.Параметры.Вставить(“Номенклатура”,Номенклатура);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции
8. Создан журнал “Документы закупки”, отображаемые документы – “Поступление товаров” и “Авансовый отчет”. Т.к. необходимо отображать сумму документа, были созданы реквизиты “Сумма документа” соответствующих документов. Кроме того, в модулях объектов создана процедура “ПередЗаписью” в которой происходит заполнение реквизита “СуммаДокумента”.
Задание выполнено. Реализованы регистры остатков, оборотов, сведений, журнал документов, в журнал документов добавлены документы Реализация и Поступление товаров, в них же, для корректного отображения в журналах добавлены реквизиты ВидДокумента и СуммаДокумента. В вышеупомянутых документах реализована обработка проведения. В документе Контакты с клиентами добавлен отбор контактного лица по контактным лицам, имеющихся в табличной части соответствующего контрагента.
<code>
&НаКлиенте
Процедура КонтактноеЛицоНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
МассивКонтактныхЛиц = Новый Массив;
МассивКонтактныхЛиц = ПолучитьМассивКонтактныхЛиц(Объект.Контрагент);
ДанныеВыбора = Новый СписокЗначений;
Для Каждого Данное Из МассивКонтактныхЛиц Цикл
ДанныеВыбора.Добавить(Данное);
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьМассивКонтактныхЛиц(Ссылка)
Запрос = Новый Запрос(“ВЫБРАТЬ
| КонтрагентыКонтактныеЛица.КонтактноеЛицо КАК КонтактноеЛицо
|ИЗ
| Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица
|ГДЕ
| КонтрагентыКонтактныеЛица.Ссылка = &Ссылка”);
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Массив = Новый Массив;
Массив = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(“КонтактноеЛицо”);
Возврат Массив;
КонецФункции
</code>
Остальные обработчики и реквизиты также доработаны, проблем не возникло.
Задание выполнено, все ок. Реализована несколко другая более сложная задача :) включающая все виды операции задачи № 8.
Последующие задачи параллельно буду реализовывать в УТ 11.
Задание выполнила.
Создала необходимые регистры, справочники, журнал документов, изменила документы (формы, реквизиты, обработчики событий, модули документов).