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

2-ое занятие по второму блоку базового курса.

Необходимо изучить следующие главы.
Глава 5. Журналы документов.
Глава 6. Настройка командного интерфейса.
Глава 7. Регистры.
Глава 8. Регистры накопления.
Глава 9. Регистры сведений.
Глава 10. Настройка форм.

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

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

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

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

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

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

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

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

  1. elcinbektimirov 02.08.2011 в 15:22

    Наконец изучил и сделал ДЗ, пусть и поздно.
     

  2. Тимур 29.06.2011 в 19:49

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

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

  3. Догоняю группу.
    Хранение цен на товары организовал РегистромСведений,
    непереодическим и независимым. Сдела необходиую связку с
    прайсом. Для пересчёта цен в ТЧ создал общую функция
    ПересчетЦенТЧ(обк) куда передаётся ссылка на объект.
    Объектом может быть как поступление, так и реализация.
    Также реализована общая функция ПересчетСуммы() для документов
    поступление и реализации

    Выполнил универсальную процедуру
    ПолучитьВариантыПеречисления(Имя)
    <code>
    Функция ПолучитьВариантыПеречисления(Имя) Экспорт
    соот = Новый Структура;
    Для каждого стр из Метаданные.Перечисления[Имя].ЗначенияПеречисления Цикл
    соот.Вставить(стр.Имя,Перечисления[Имя][стр.Имя]);
    КонецЦикла;
    Возврат соот;
    КонецФункции

    </code>
    , смысл которой заключается
    в получении соответсвия которое заполняется значениями
    из необходимого перечисления, имя которого передаётся в функцию

    Остатки товаров хранятся в регистре остатков, данные
    о закупках регистрируются в объекте РегистрОборотов ЗакупкиТМЦ
    выгрузка БД

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

    • Раскройте свое решение.

    • 1. Менеджеры контрагентов

      В модуле документа Событие
      Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

      Менеджер = ПараметрыСеанса.ТекущийПользователь;

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

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

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

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

      Результат = Запрос.Выполнить();
      Если Результат.Пустой() Тогда
      Набор = РегистрыСведений.МенеджерыКлиентов.СоздатьНаборЗаписей();
      Набор.Отбор.Контрагент.Установить(Контрагент);
      Набор.Отбор.Период.Установить(Дата);

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

      Набор.Записать();
      КонецЕсли;

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

      Процедура ПриЗаписи(Отказ)

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

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

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

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

      КонецЦикла;

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

      2 Цены и сервис

      ОбщиеФункцииСервер

      Функция ПолучитьЕдиницуЦенуНоменклатуры(ДанныеТекущейСтроки) Экспорт

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

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

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

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

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

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

      Результат = Новый Структура;
      Результат.Вставить(“ЕдиницаИзмерения”, ЕдиницаИзмерения);
      Результат.Вставить(“Коэффициент”, Коэффициент);
      Результат.Вставить(“Цена”, Цена);

      Возврат Результат;

      КонецФункции // ()

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

      Возврат Константы.ВариантПересчетаПоСумме.Получить();

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

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

      Возврат ЕдиницаИзмерения.Коэффициент;

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

      ОбщиеФункцииКлиент

      Функция РассчитатьСуммуВСтрокеТабличнойЧасти(СтрокаТабличнойЧасти) Экспорт

      СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Цена * СтрокаТабличнойЧасти.Количество;

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

      Функция РассчитатьКоличествоЦенуВСтрокеТабличнойЧасти(СтрокаТабличнойЧасти) Экспорт

      Если глВариантПересчетаПоСумме = ПредопределенноеЗначение(“Перечисление.ВариантыПересчетаПоСумме.Количества”) Тогда
      Если СтрокаТабличнойЧасти.Цена = 0 Тогда
      СтрокаТабличнойЧасти.Количество = 0;
      Иначе
      СтрокаТабличнойЧасти.Количество = СтрокаТабличнойЧасти.Сумма / СтрокаТабличнойЧасти.Цена;
      КонецЕсли;
      Иначе
      Если СтрокаТабличнойЧасти.Количество = 0 Тогда
      СтрокаТабличнойЧасти.Цена = 0;
      Иначе
      СтрокаТабличнойЧасти.Цена = СтрокаТабличнойЧасти.Сумма / СтрокаТабличнойЧасти.Количество;
      КонецЕсли;
      КонецЕсли;

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

      Модуль формы
      &НаКлиенте
      Процедура ТоварыНоменклатураПриИзменении(Элемент)

      СтрокаТабличнойЧасти = Элементы.Товары.ТекущиеДанные;

      ДанныеТекущейСтроки = Новый Структура;
      ДанныеТекущейСтроки.Вставить(“Дата”, Объект.Дата);
      ДанныеТекущейСтроки.Вставить(“ТипЦен”, Объект.ТипЦен);
      ДанныеТекущейСтроки.Вставить(“Номенклатура”, СтрокаТабличнойЧасти.Номенклатура);

      РезультатСтруктура = ОбщиеФункцииСервер.ПолучитьЕдиницуЦенуНоменклатуры(ДанныеТекущейСтроки);

      СтрокаТабличнойЧасти.ЕдиницаИзмерения = РезультатСтруктура.ЕдиницаИзмерения;
      СтрокаТабличнойЧасти.Коэффициент = РезультатСтруктура.Коэффициент;
      СтрокаТабличнойЧасти.Цена = РезультатСтруктура.Цена;

      ОбщиеФункцииКлиент.РассчитатьСуммуВСтрокеТабличнойЧасти(СтрокаТабличнойЧасти);

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

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

      СтрокаТабличнойЧасти = Элементы.Товары.ТекущиеДанные;
      СтрокаТабличнойЧасти.Коэффициент = ОбщиеФункцииСервер.ПолучитьКоэффициентЕдиницыИзмерения(СтрокаТабличнойЧасти.ЕдиницаИзмерения);

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

      &НаКлиенте
      Процедура ТоварыКоличествоПриИзменении(Элемент)
      ОбщиеФункцииКлиент.РассчитатьСуммуВСтрокеТабличнойЧасти(Элементы.Товары.ТекущиеДанные);
      КонецПроцедуры

      &НаКлиенте
      Процедура ТоварыЦенаПриИзменении(Элемент)
      ОбщиеФункцииКлиент.РассчитатьСуммуВСтрокеТабличнойЧасти(Элементы.Товары.ТекущиеДанные);
      КонецПроцедуры

      &НаКлиенте
      Процедура ТоварыСуммаПриИзменении(Элемент)
      ОбщиеФункцииКлиент.РассчитатьКоличествоЦенуВСтрокеТабличнойЧасти(Элементы.Товары.ТекущиеДанные);
      КонецПроцедуры

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

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

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

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

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

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

      4. Проверка изменения базовой единицы
      Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

      Если НЕ ЭтоНовый() И НЕ БазоваяЕдиницаИзмерения = Ссылка.БазоваяЕдиницаИзмерения Тогда

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

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

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

      КонецЕсли;

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