Опубликован: 06.12.2011 | Доступ: платный | Студентов: 163 / 27 | Оценка: 4.55 / 4.38 | Длительность: 04:16:00
Лекция 9:

Оборотные регистры накопления, последовательности, нумераторы, регистры сведений

Аннотация: Лекция посвящена описанию особенностей работы с оборотными регистрами накопления, кроме того, она затрагивает темы использования агрегатов, последовательностей, нумераторов и регистров сведений.

Оборотные регистры накопления

Выше мы работали с регистром накопления, основной задачей которого было – предоставление данных об остатках материалов. Приходные данные в этот регистр попадали при поступлении материалов в организацию, они были "привязаны" к определенному ответственному лицу. Расходные данные в регистр вносились тогда, когда материалы отпускались мастеру для производственных целей.

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

Подобные результирующие показатели в реальной системе учета могут, например, влиять на заработную плату сотрудников. К тому же, анализ таких показателей в разрезе контрагентов, которым проданы материалы или которым оказаны услуги, поможет выделить среди контрагентов тех, кто приносит организации наибольшую прибыль, а, значит, может нуждаться в особом внимании.

Для реализации этих задач нам, во-первых, понадобится документ (или документы), для фиксации в системе продаж материалов и оказания услуг, а, во-вторых – объекты для хранения сведений о проданных материалах, их себестоимости, об оказанных услугах и о материалах, которые были затрачены на оказание этих услуг.

В осуществлении этого замысла нам помогут оборотные регистры накопления. Конечно, показатели оборотов мы можем получать и сейчас, так как регистр с видом Остатки хранит и остатки, и обороты, но, если показатель остатков нам не важен (например, нам нет смысла считать "остатки" по количеству оказанных услуг), предпочтительнее будет использовать регистр с видом Обороты. Частота получения данных из регистра так же имеет значение, так как оборотные регистры накопления поддерживают механизм агрегатов, который позволяет ускорить получение данных за определенные периоды, по определенному набору измерений (разрезов) регистра.

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

Создадим документ РеализацияМатериалов. Добавим его в состав подсистемы ОперативныйУчетМатериалов. Запретим оперативное проведение документа.

В состав данных документа включим следующие реквизиты:

Имя: Покупатель: Тип: СправочникСсылка.Контрагенты

Имя: ОтветственныйСотрудник: Тип: СправочникСсылка.Сотрудники

Добавим в документ табличную часть Материалы со следующими реквизитами:

Имя: Номенклатура, Тип: СправочникСсылка.Номенклатура

Имя: Остаток, Тип: Число, Длина 10, точность 3

Имя: Себестоимость, Тип: Число, длина 10, точность 2

Имя: Количество, Тип: Число, длина 10, точность 3

Имя: ЦенаПродажи, Тип: Число, длина 10, точность 2

Имя: Выручка, тип: Число, длина 10, точность 2

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

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

Конструирование формы документа РеализацияМатериалов

увеличить изображение
Рис. 8.1. Конструирование формы документа РеализацияМатериалов

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

Запрет редактирования поля пользователем

Рис. 8.2. Запрет редактирования поля пользователем

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

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

Мы начинаем с такого текста запроса:

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

В этом запросе нам понадобится откорректировать обращение к таблице документа, который содержит нужные данные. Предполагая, что пользователь может ввести одну и ту же номенклатурную позицию несколькими строками, возможно, собираясь особым образом задать цену продажи для одной и той же позиции, мы не будем группировать запрос по номенклатуре. Мы получим из таблицы все данные, которые мог ввести пользователь – позже мы используем эти данные для заполнения табличного поля.

Остальные данные нас устраивают. У нас получился такой запрос, рис. 8.3.

Запрос для получения данных для заполнения табличного поля

увеличить изображение
Рис. 8.3. Запрос для получения данных для заполнения табличного поля
Лариса Дятчина
Лариса Дятчина

Код 

&НаКлиенте

Процедура ОсновноеКонтактноеЛицоПриИзменении(Элемент)

Если НЕ ПроверитьЗаполнениеРеквизита() Тогда

 Сообщить("Выбранное контактное лицо, "+Объект.ОсновноеКонтактноеЛицо+",не работает у контрагента.");

КонецЕсли;

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

 

&НаСервере

Функция ПроверитьЗаполнениеРеквизита()

 Возврат (Объект.ОсновноеКонтактноеЛицо.ПредставительРаботает);  

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

&НаСервере

Процедура УстановитьНомерПредставителя()

 

 Объект.ТелефонКонтактногоЛица=Объект.ОсновноеКонтактноеЛицо.КонтактныеСведения;

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

При проверке выдает ошибку:

{Справочник.Контрагенты.Форма.ФормаСписка.Форма(12,11)}: Переменная не определена (Объект)
 Возврат (<<?>>Объект.ОсновноеКонтактноеЛицо.ПредставительРаботает);   (Проверка: Сервер)
{Справочник.Контрагенты.Форма.ФормаСписка.Форма(17,2)}: Переменная не определена (Объект)
 <<?>>Объект.ТелефонКонтактногоЛица=Объект.ОсновноеКонтактноеЛицо.КонтактныеСведения; (Проверка: Сервер)
{Справочник.Контрагенты.Форма.ФормаСписка.Форма(17,32)}: Переменная не определена (Объект)
 Объект.ТелефонКонтактногоЛица=<<?>>Объект.ОсновноеКонтактноеЛицо.КонтактныеСведения; (Проверка: Сервер)
{Справочник.Контрагенты.Форма.ФормаСписка.Форма(6,41)}: Переменная не определена (Объект)
 Сообщить("Выбранное контактное лицо, "+<<?>>Объект.ОсновноеКонтактноеЛицо+",не работает у контрагента."); (Проверка: Тонкий клиент)

 

работаю на версии 1С:Предприятие 8.3 (8.3.10.2650)

максим матасов
максим матасов