При проектировании собственной конфигурации или решении экзаменационных задач (например, уровня «1С:Специалист по платформе») часто возникает задача организовать учет производства без избыточной сложности типовых конфигураций. Разберем по шагам, как выстроить архитектуру регистров, организовать списание материалов в производство, рассчитать себестоимость выпуска и настроить разграничение прав доступа на уровне записей (RLS) по складам.
Рассмотрим оптимальную структуру метаданных для учета движения материалов и выпуска продукции. Для решения задачи прямого производственного учета достаточно использовать два регистра накопления с типом Остатки:
Служит для складского учета сырья, материалов и готовой продукции на складах предприятия.
Измерения: Номенклатура, Склад.
Ресурсы: Количество (Число), Сумма (Число — себестоимость).
Отражает прямые затраты сырья и материалов, переданных в цех под конкретное изделие, но еще не списанных на готовый выпуск.
Измерения: Продукция (номенклатура готового изделия), Материал (номенклатура сырья).
Ресурсы: Количество (Число), Сумма (Число).
Проанализируем цепочку хозяйственных операций и принципы формирования движений в модулях документов:
Документ ПриходнаяНакладная делает движение Приход в регистр ОстаткиТМЦ с указанием поступившего количества и покупной суммы.
В документе указывается, какой материал, в каком объеме и под какую будущую продукцию списывается. При проведении выполняются следующие действия:
— Проверяются остатки материалов на складе и рассчитывается текущая себестоимость списания по средней стоимости (или FIFO);
— Формируется движение Расход по регистру ОстаткиТМЦ (списываются количество и сумма);
— Формируется движение Приход по регистру МатериалыВПроизводстве с заполнением измерений Продукция, Материал и ресурсов Количество, Сумма.
В документе указывается выпускаемая номенклатура (с видом «Готовая продукция»), количество и склад-получатель. В момент проведения система определяет накопленные прямые затраты:
— Запрашиваются остатки из регистра МатериалыВПроизводстве с отбором по выпущенной продукции;
— Формируется движение Расход по регистру МатериалыВПроизводстве, полностью или пропорционально списывающее зависшие затраты по данному изделию;
— Накопленная сумма затрат переносится в движение Приход регистра ОстаткиТМЦ (на склад готовой продукции поступает количество выпущенных изделий с рассчитанной совокупной себестоимостью).
Документ РасходнаяНакладная списывает готовую продукцию со склада движением Расход из регистра ОстаткиТМЦ (списывается количество и рассчитанная при выпуске себестоимость).
Разберем пример программного кода в модуле документа ВыпускПродукции в процедуре ОбработкаПроведения. Обратите внимание на установку управляемых блокировок и корректное списание копеечных остатков.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.МатериалыВПроизводстве.Записывать = Истина;
Движения.ОстаткиТМЦ.Записывать = Истина;
// Устанавливаем управляемую блокировку
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.МатериалыВПроизводстве");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Продукция", Продукция);
Блокировка.Заблокировать();
// Запрос остатков материалов в производстве
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Материал КАК Материал,
| Остатки.КоличествоОстаток КАК КоличествоОстаток,
| Остатки.СуммаОстаток КАК СуммаОстаток
|ИЗ
| РегистрНакопления.МатериалыВПроизводстве.Остатки(&МоментВремени, Продукция = &Продукция) КАК Остатки";
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("Продукция", Продукция);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
ОбщаяСебестоимостьВыпуска = 0;
Пока Выборка.Следующий() Цикл
// Списываем все зависшие в НЗП затраты под данную продукцию
Движение = Движения.МатериалыВПроизводстве.ДобавитьРасход();
Движение.Период = Дата;
Движение.Продукция = Продукция;
Движение.Материал = Выборка.Материал;
Движение.Количество = Выборка.КоличествоОстаток;
Движение.Сумма = Выборка.СуммаОстаток;
ОбщаяСебестоимостьВыпуска = ОбщаяСебестоимостьВыпуска + Выборка.СуммаОстаток;
КонецЦикла;
// Приходуем готовую продукцию на склад
ДвижениеТМЦ = Движения.ОстаткиТМЦ.ДобавитьПриход();
ДвижениеТМЦ.Период = Дата;
ДвижениеТМЦ.Склад = Склад;
ДвижениеТМЦ.Номенклатура = Продукция;
ДвижениеТМЦ.Количество = Количество;
ДвижениеТМЦ.Сумма = ОбщаяСебестоимостьВыпуска;
КонецПроцедуры
Рассмотрим, как настроить условие, при котором кладовщики видят документы и остатки только своего склада, а пользователи с полными правами управляют всей базой:
В ветке метаданных создаем параметр сеанса ТекущийСклад (тип: СправочникСсылка.Склады).
В предопределенной процедуре УстановкаПараметровСеанса модуля сеанса определяем склад текущего пользователя:
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
Если ТребуемыеПараметры.Найти("ТекущийСклад") <> Неопределено Тогда
ПараметрыСеанса.ТекущийСклад = ПользователиИнформационнойБазы.ТекущийПользователь().Склад;
КонецЕсли;
КонецПроцедуры
Для пользовательской роли настраиваем ограничение доступа к данным на чтение и изменение документов и регистров со складами:
ГДЕ Склад = &ТекущийСклад
Для общей нормативно-справочной информации (справочники Номенклатура, ЕдиницыИзмерения) ограничения RLS не задаются. Для роли ПолныеПрава RLS также не настраивается, что обеспечивает беспрепятственный доступ ко всем данным.