Главная страница

6Глава Концепция управляемого приложения


Скачать 6.74 Mb.
Название6Глава Концепция управляемого приложения
Дата02.11.2022
Размер6.74 Mb.
Формат файлаpdf
Имя файлаLab.rabotyISiTvE.S.Merkulova.pdf
ТипДокументы
#767994
страница9 из 17
1   ...   5   6   7   8   9   10   11   12   ...   17
Глава 8. Регистры накопления
8.1. Назначение регистров накопления
Представим себе организацию, в которой все сведения о приходе материалов хранятся лишь в виде приходных документов. Для того, чтобы узнать количество и стоимость имеющихся в организации материалов, нам понадобится обращаться к документам, просматривать каждый из них, выписывая нужные данные, после чего суммировать их, получая нужные данные. Такой подход неудобен – он слишком медленный как для нашего "ручного" случая, так и для автоматизированного учета.
Логичнее было бы, в дополнение к документам, вести специальные таблицы, в которые, при приеме материалов и при их списании, вносить краткие сведения об этом.
Если, скажем, ежедневно, подводить итоги по этим таблицам и выводить остатки материалов, то, для того, чтобы сказать, сколько и каких материалов имеется в организации на определенную дату, достаточно обратиться к соответствующей графе таблицы. В системе 1С:Предприятие такими таблицами являются регистры накопления
(РН). Как следует из названия, они предназначены для отражения, накопления, неких показателей. И отражение в регистрах прихода и расхода материалов – один из типичных примеров их использования.
8.2. Регистры остатков
В нашей организации ведется учет материалов в привязке к ответственным лицам, которые их получают и с которых эти материалы списывают при отпуске в производство. Нам нужно хранить информацию о количестве материалов и об их стоимости, а так же, при списании в производство, иметь сведения о том, какому именно мастеру эти материалы переданы. Для хранения движений документов учета движения материалов создадим регистр накопления.
При планировании состава регистра накопления нужно понять, какие именно данные мы собираемся в нем хранить, после чего "разложить" эти данные по измерениям, ресурсам и реквизитам регистра.
Итак, нам нужно хранить следующие данные:
 Номенклатурная позиция
 Ответственный сотрудник, на котором числится данная позиция
 Количество номенклатуры
 Стоимость номенклатуры
 Данные о мастере, которому переданы материалы для использования.

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

161
Включим регистр накопления в состав подсистемы Документы..
На вкладке Данные создадим следующие измерения, ресурсы и реквизиты:
Измерения:
Имя: Номенклатура, Тип: СправочникСсылка.Номенклатура, Запрет незаполненных значений – установлено.
Имя: ОтветственныйСотрудник, Тип: СправочникСсылка.Сотрудники, Запрет незаполненных значений – установлено.
Ресурсы
Имя: Количество, Тип: число, длина 10, точность 3
Имя: Сумма, Тип: число, длина 10, точность 2
Реквизиты:
Имя: ПолучательМатериалов, Тип: СправочникСсылка.Сотрудники
Имена этих реквизитов, их типы, а так же – стандартные реквизиты регистра (рис.
8.2.) – будут использованы при работе над процедурой проведения документа.
Рис. 8.2. Регистр накопления ОстаткиМатериалов, состав данных
Исключим из состава реквизитов регистра общий реквизит Организация. Сейчас в нем нет необходимости. Для организации хранения данных в регистре в разрезе различных организаций нам понадобилось бы новое измерение – Организация, благодаря наличию которого мы смогли бы работать с материалами различных организаций.
Перейдем на вкладку Регистраторы окна редактирования объекта и выберем в качестве документов-регистраторов документы – ПоступлениеМатериалов и
ОтпускМатериаловМастеру.
На данном этапе настройка регистра накопления окончена, перейдем к настройкам документов. Начнем с документа ПоступлениеМатериалов.
Откроем окно редактирования объекта для этого документа, перейдем на вкладку
Движения (рис. 8.3.) и нажмем на кнопку Конструктор движений

162
Рис. 8.3. Документ ПоступлениеМатериалов, вкладка Движения
В конструкторе, выберем тип движения регистра – Приход, в поле Табличная часть укажем табличную часть документа Материалы, нажмем на кнопку Заполнить
выражения. Автоматический механизм установления соответствия между данными документа и регистра не всегда работает правильно (в том случае, если не может однозначно определить соответствия, или тогда, когда соответствие, определенное им по его логике, отличается от желаемого), поэтому проверим правильность установленных соответствий. В итоге окно Конструктора движения регистра должно выглядеть так, как показано на рис. 8.4.
После нажатия на кнопку ОК, в модуле объекта документа будет сформирована такая процедура обработки проведения (так она выглядит после удаления комментариев о том, что код построен конструктором движений):

163
Рис. 8.4. Конструктор движений
Процедура ОбработкаПроведения(Отказ, Режим)
/
/ регистр ОстаткиМатериалов Приход
Движения.ОстаткиМатериалов.Записывать = Истина;
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаМатериалы.Номенклатура;
Движение.ОтветственныйСотрудник = ОтветственныйСотрудник;
Движение.Количество = ТекСтрокаМатериалы.Количество;
Движение.Сумма = ТекСтрокаМатериалы.Сумма;
КонецЦикла;
КонецПроцедуры
Эта процедура объявлена в модуле объекта, она исполняется на сервере. Установка свойства Движения.ОстаткиМатериалов.Записывать в значение Истина говорит системе о том, что она должна записать в регистр движения, сформированные в процедуре. Движения заполняются в цикле обхода табличной части документа. Они будут физически записаны в регистр после того, как будет сформирован полный набор записей. Процедура проведения вполне может использовать и другие механизмы обращения к данным. Например, нужные данные могут быть получены с помощью запроса.

164
Так как мы проводим документ, отвечающий за приход товаров, параметр
Движение.ВидДвижения устанавливается в значение
ВидДвиженияНакопления.Приход. Период устанавливается равным дате документа
(мы напрямую работаем с реквизитами документа). Остальные данные заполняются, опять же, либо из реквизитов документа, либо из реквизитов текущей строки табличной части.
Запустим конфигурацию в режиме 1С:Предприятие, проверим работу механизма на практике.
Для этого перепроведем существующие документы
ПоступлениеМатериалов, можем ввести и новые документы этого вида. При проведении или перепроведении данные из документов попадают в регистр накопления
ОстаткиМатериалов, рис. 8.5
Рис. 8.5. Данные в регистре накопления
Замечание. Регистры накопления, как объекты, которые не предназначены изначально для "ручной" работы пользователя, не выводятся в командном интерфейсе даже при указании подсистем, в которые они входят. Нам, при разработке, понадобится просматривать регистры.
Для того, чтобы открыть окно регистра, можно либо воспользоваться командой
Главное меню > Все функции и в появившемся окне Все функции найти нужный регистр, либо открывать его с помощью команды в интерфейсе, предварительно самостоятельно добавив эту команду в нужный раздел интерфейса.
При записи данных о приходе материалов нам, в нашем случае, нет нужды в каких- либо дополнительных проверках вводимых данных, поэтому нас вполне устроит стандартная процедура проведения.
Следующим документом, проведение которого мы хотим организовать, является документ, списывающий материалы – ОтпускМатериаловМастеру.
Для начала сформулируем цели, которых мы хотим достичь при проведении данного документа. Если в случае с документом поступления материалов в нашей конфигурации все довольно просто – нам нужно лишь отразить поступление материалов без каких-либо дополнительных проверок или расчетов, то списание материалов даже в нашем, достаточно простом случае, превращается в непростую задачу.

165
Во-первых, мы хотим, чтобы система не позволяла списать больше материалов, чем числится за конкретным ответственным лицом. Это означает, что перед формированием движений мы должны сверить данные, введенные в табличную часть документа с данными по остаткам материалов, хранящимися в нашей базе, и, в том случае, если материалов нам не хватит – отказаться проводить документ и сообщить пользователю об ошибке.
Во-вторых, списывая материалы, мы должны придерживаться какой-либо политики оценки. Наиболее простая и широко используемая политика – это списание материалов по средней стоимости.
Предположим, мы приняли две партии одного и того же товара – в первой было 10 единиц по 9 рублей единица (общая стоимость 90 рублей), во второй – 20 единиц по 12 рублей единица (общая стоимость 240 рублей). В регистре мы храним общую стоимость материалов и их общее количество. Поэтому, списывая по методу средней стоимости, например, 15 единиц товара, мы сначала должны найти среднюю стоимость единицы имеющихся товаров, разделив их общую стоимость на общее количество – в нашем случае это (90+240)/(10+20)=11 рублей – и умножить полученную стоимость на количество списываемых товаров – то есть, 11*15=165 рублей. Таким образом, мы сможем оценивать стоимость списанных товаров и оценивать стоимость остатков.
Существуют и другие методы списания материальных ценностей, в частности – это
ФИФО, ЛИФО. Вполне можно организовать учет каждой единицы материальных ценностей и списание их по индивидуальной себестоимости. Мы реализуем списание материалов по средней стоимости.
Определившись с нашими двумя основными задачами – реализации списания материалов по средней стоимости и контроля остатков, приступим к работе над процедурой для проведения нашего документа.
Перейдем в модуль объекта документа ОтпускМатериаловМастеру, с помощью панели инструментов Модуль создадим процедуру ОбработкаПроведения. Данные из табличной части мы будем получать с помощью запроса – в дальнейшем мы будем развивать этот запрос для получения необходимых сведений об остатках номенклатуры.
В процедуре ОбработкаПроведения документа ОтпускМатериаловМастеру.
Процедура пока пуста, щелкнем в ней правой кнопкой мыши и вызовем из контекстного меню команду Конструктор запроса с обработкой результата. В ответ на вопрос конструктора о создании нового запроса, ответим утвердительно, после чего, в окне конструктора нажмем на кнопку Запрос и вставим в пустое поле для текста запроса полученный текст запроса (предварительно нажав на кнопку Редактировать
запрос в окне Запрос), рис. 8.6.

166
Рис. 8.6. Добавление сформированного текста запроса в конструктор
На закладке Обработка окна Конструктор запроса оставим переключатель Тип
обработки в положении Обход результата. После закрытия окна Запрос конструктор автоматически разберет запрос, "разложит" по закладкам своего окна, при необходимости, его можно будет редактировать, пользуясь инструментами, расположенными на этих закладках. Нас запрос устраивает – поэтому мы можем нажимать в окне конструктора ОК и переходить к дальнейшему редактированию кода..

167
Здесь нас, в первую очередь, не устраивает автоматическое заполнение параметров запроса
Заменим код:
Запрос.УстановитьПараметр("МоментВремени", МоментВремени);
Запрос.УстановитьПараметр("ОтвСотр", ОтвСотр);
На код:
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("ОтвСотр", ОтветственныйСотрудник);
Здесь мы, во-первых, вызвали метод МоментВремени(), возвращающий момент времени для нашего документа (то есть – для того, в модуле объекта которого мы сейчас работаем). Во-вторых, мы обратились к реквизиту документа
ОтветственныйСотрудник для установки параметра ОтвСотр.
Проверим работу созданного механизма, запустив систему в режиме отладки и установив в коде модуля точку останова после получения выборки из результатов запроса. (рис.8.7.)

168
Рис. 8.7. Анализ результата выполнения запроса в коде процедуры проведения документа
Здесь мы выполнили метод Выгрузить() для результата выполнения запроса
(переменная Результат), получили таблицу значений, которую можно проанализировать. Результат нас устраивает, поэтому мы принимаемся за дальнейшую работу над процедурой. В итоге у нас получился следующий код:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокМ.Номенклатура,
| СУММА(ДокМ.Количество) КАК Количество,
| МАКСИМУМ(ЕСТЬNULL(ОстМ.КоличествоОстаток, 0)) КАК
|КоличествоОстатков,
| МАКСИМУМ(ЕСТЬNULL(ОстМ.СуммаОстаток, 0)) КАК СуммаОстатков
|ИЗ
| Документ.ОтпускМатериаловМастеру.Материалы КАК ДокМ
| ЛЕВОЕ СОЕДИНЕНИЕ
|РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени,
|ОтветственныйСотрудник = &ОтвСотр) КАК ОстМ
| ПО ДокМ.Номенклатура = ОстМ.Номенклатура
|ГДЕ
| ДокМ.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ДокМ.Номенклатура";
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("ОтвСотр", ОтветственныйСотрудник);
Запрос.УстановитьПараметр("Ссылка", Ссылка);

169
Результат = Запрос.Выполнить();
ВыборкаДЗ = Результат.Выбрать();
Движения.ОстаткиМатериалов.Записывать=Истина;
Пока ВыборкаДЗ.Следующий() Цикл
Если ВыборкаДЗ.Количество>ВыборкаДЗ.КоличествоОстатков Тогда
Сообщить("Недостаточное количество товара
"+ВыборкаДЗ.Номенклатура
+", необходимо "+ВыборкаДЗ.Количество+", в наличии "
+ВыборкаДЗ.КоличествоОстатков);
Отказ=Истина;
Движения.ОстаткиМатериалов.Записывать=Ложь;
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
Движение=Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
Движение.Период=Дата;
Движение.Номенклатура=ВыборкаДЗ.Номенклатура;
Движение.Количество=ВыборкаДЗ.Количество;
Движение.Сумма=ВыборкаДЗ.Количество*ВыборкаДЗ.СуммаОстатков/Вы
боркаДЗ.КоличествоОстатков;
Движение.ОтветственныйСотрудник=ОтветственныйСотрудник;
Движение.ПолучательМатериалов=ПолучательМатериалов;
КонецЦикла;
КонецПроцедуры
Сначала мы сравнили требуемое и реальное количество материалов. Если нужно больше, чем имеется за конкретным ответственным лицом, мы формируем сообщение для пользователя, устанавливаем параметр Отказ в значение Истина (то есть указываем системе на то, что документ мы проводить не будем), и отключаем запись данных в регистр накопления. После проверки количества мы выполняем еще одну проверку – на состояние переменной Отказ. Если эта переменная установлена в значение Истина – мы переходим к следующей итерации цикла, не выполняя оставшиеся команды. Если же Отказ установлен в значение Ложь, мы формируем запись по регистру ОстаткиМатериалов с использованием текущих данных. Обратите внимание на то, как рассчитывается поле Сумма – для его получения мы умножаем количество материалов, которые нужно списать, на результат деления общей суммы остатков материалов на общее количество остатков.
Проверим результаты работы нашего кода в режиме 1С:Предприятие. Если документ верно реагирует на попытку списания материалов, количество которых превышает имеющееся, и если анализ состава регистра накопления после проведения показывает, что списано нужное количество материалов и их стоимость определена верно – можно считать, что мы справились с поставленной задачей.

170
1   ...   5   6   7   8   9   10   11   12   ...   17


написать администратору сайта