Мы уже упоминали, что документы при проведении могут изменять значения периодических реквизитов справочников. Разумеется, документы могут изменять значения и непериодических реквизитов, но это мало интересно. При изменении периодических, программа будет запоминать когда и с помощью чего меняли значения.
В справочнике "Номенклатура" мы имеем два реквизита интересующего нас типа: "ЦенаП" и "ЦенаР". В их свойствах мы указали, что они могут изменяться документами. Спроектируем такой документ.
Пусть наш документ
будет иметь возможность изменять цену не одного товара, а любого
количества. Значит наш документ будет содержать многострочную часть.
Документ должен иметь возможность изменять сразу и цену поступления
и цену реализации. При работе с ценами товара мы хотим видеть, какие
цены были до изменения. Эти поля должны быть не редактируемые. Для
документа будет заведен отдельный журнал. Создадим этот документ.
Все данные по документу сведем в таблицу:
Идентификатор: ИзменениеЦен Журнал: ИзменениеЦен Нумератор: Нет         Периодичность: Год Длина: 5         Тип: число Уникальность: да     Автонумерация: да Оперативный учет: нет Может являться основанием для документа любого вида?: нет | |||
Является основанием для |
Вводится на основании |
||
Шапка |
|||
Реквизит |
Описание |
ТипЗначения |
Доп. |
Таблица |
|||
Реквизит |
Описание |
ТипЗначения |
Доп. |
Товар | Товар | С.Номенклатура | |
СтЦенаП |
Старая цена прихода |
Число 7.2 |
|
ЦенаП |
Новая цена прихода |
Число 7.2 |
|
СтЦенаР |
Старая цена расхода |
Число 7.2 |
|
ЦенаР |
Новая цена расхода |
Число 7.2 |
Процедура ВыбТовар()
  СтЦенаП=Товар.ЦенаП.Получить(ДатаДок);
  ЦенаП=Товар.ЦенаП.Получить(ДатаДок);
  СтЦенаР=Товар.ЦенаР.Получить(ДатаДок);
  ЦенаР=Товар.ЦенаР.Получить(ДатаДок);
// Получаем значения периодических реквизитов
справочника на дату документа
КонецПроцедуры
//-----------------------------------------------
Процедура ЦенаП()
  ЦенаР=Окр(ЦенаП*(1+(Константа.ПроцентНаценки/100)),2,1);
КонецПроцедуры
Процедура ОбработкаПроведения()
  ВыбратьСтроки();
  Пока ПолучитьСтроку()=1 Цикл
    УстановитьРеквизитСправочника(Товар,"ЦенаП",ЦенаП);
    УстановитьРеквизитСправочника(Товар,"ЦенаР",ЦенаР);
// Мы указываем периодические реквизиты
элемента справочника,
// указанного в поле Товар и значения, которые они будут теперь
иметь
  КонецЦикла;
КонецПроцедуры
Нами теперь уже накоплен некоторый опыт работы с документами и регистрами. Займемся конструированием регистров по товарам. Мы уже упоминали, что регистры бывают двух типов: остатков и оборотов. Заведем для примера оба типа регистров. А чтоб никто не догадался, назовем их так: регистр остатков – "ОстаткиТоваров" – для хранения информации по остаткам товаров, и регистр оборотов – "ОборотыТоваров" – для накопления информации по оборачиваемости товара.
Регистр "ОстаткиТоваров"
будет содержать информацию: где хранится/хранился товар, что хранилось,
какого сорта. Следовательно, у нас будут измерения "Склад", "Товар",
"Сорт". В задании сказано, что списание товара может идти либо по
LIFO, либо по FIFO, либо по среднему. Для первых двух вариантов
нам надо хранить еще информацию – когда этот товар поступил на склад.
Удобнее всего будет завести еще одно измерение – "Партия" – типа
документ прихода товара ("ПриходнаяНакладная"). В документе хранятся
дата и время, и можно без труда отсортировать их по порядку постановки
на учет. Ресурсы регистра – то, что хранит регистр. Нас будет интересовать
во-первых, количество товара в основной единице измерения товара,
во-вторых его сумма по цене поступления – цена учета, и в-третьих
сумма по цене документа – для определения полученного навара. Ценой
документа в случае приходной накладной и накладной на перемещение
будет цена поставки, а в случае расходной накладной – цена реализации.
Реквизит у нас будет один – "ФлагДвижения" тип Число 1.0. В нем
мы будем отражать характер движения, он будет равен 1 при движении
Контрагент-Склад/Склад-Контрагент, и 2 при движении Склад-Склад.
Движения по регистру у нас будут – приход для прихода товара на
склад и расход для расхода товара со склада. Данные по регистру
сведем в таблицу:
Идентификатор: ОстаткиТоваров Тип: Остатки Периодичность: - |
|||
Измерения |
|||
Идентификатор |
Комментарий |
Тип значения |
Дополнительно |
Склад |
Место хранения |
С.Склады |
|
Товар |
Товар |
С.Номенклатура |
|
Сорт |
Сорт |
С.Сорт |
|
Партия |
Партия прихода товара |
Д.Приходная Накладная |
|
Ресурсы |
|||
Идентификатор |
Комментарий |
Тип значения |
Дополнительно |
Количество |
Количество товара |
Число 17.2 |
|
СуммаП |
Сумма по цене поступления |
Число 19.2 |
|
СуммаД |
Сумма по цене документа |
Число 19.2 |
|
Реквизиты |
|||
Идентификатор |
Комментарий |
Тип значения |
Дополнительно |
ФлагДвижения |
Характер движения |
Число 1.0 |
+ |
Регистр "ОборотыТоваров" будет накапливать информацию по движению товара как между складами и контрагентами, так и между самими складами. Нас здесь не интересует – это приход или расход, нам важен сам факт движения. Но движение вообще – мало информативно для анализа. Необходимо движение за какой-либо период для сравнения как было раньше и как обстоят дела с оборотами сейчас. В качестве такого периода выберем, для примера, месяц.
Определимся
теперь с измерениями. Нам нужно знать по какому складу какой товар
какого сорта дал какой оборот. Таким образом мы имеем следующие
измерения: "Склад", "Товар", "Сорт". Накапливать обороты мы будем
по количеству в основной единице измерения товара и по сумме по
цене учета (поступления). Реквизит будет такой же как и в регистре
"ОстаткиТоваров". Сведем все в таблицу:
Идентификатор: ОборотыТоваров Тип: Обороты Периодичность: - месяц |
|||
Измерения |
|||
Идентификатор |
Комментарий |
Тип значения |
Дополнительно |
Склад |
Место хранения |
С.Склады |
|
Товар |
Товар |
С.Номенклатура |
|
Сорт |
Сорт |
С.Сорт |
|
Ресурсы |
|||
Идентификатор |
Комментарий |
Тип значения |
Дополнительно |
Количество |
Количество товара |
Число 17.2 |
|
СуммаУ |
Сумма по цене учета |
Число 19.2 |
|
Реквизиты |
|||
Идентификатор |
Комментарий |
Тип значения |
Дополнительно |
ФлагДвижения |
Характер движения |
Число 1.0 |
+ |