При автоматизации учета автотранспортных предприятий или компаний с собственным автопарком регулярно возникает классическая задача: учет горюче-смазочных материалов (ГСМ) и технических жидкостей (ТЖ). Масла, антифриз, тормозная жидкость и топливо сначала поступают на обычные склады компании, а затем перемещаются "в борт" транспортных средств (ТС). В дальнейшем эти жидкости списываются по путевым листам или актам обслуживания.
Основная сложность заключается в проектировании структуры регистров. Как правильно связать обычные склады и автомобили, чтобы получить прозрачную отчетность вида: Склад -> ОстатокНачало -> Приход -> Расход -> ОстатокКонец -> ОстатокВТСНачало -> ПриходВТС -> РасходВТС -> ОстатокВТСКонец? Рассмотрим и детально проанализируем возможные варианты реализации этой задачи на платформе "1С:Предприятие 8".
На практике разработчики часто колеблются между двумя архитектурными решениями. Проанализируем их особенности, достоинства и недостатки.
Подход 1: Один регистр накопления с составным измерением "Склад / ТС"
При таком подходе создается один регистр накопления (например, ТоварыНаСкладах), в котором измерение Склад имеет составной тип данных: СправочникСсылка.Склады и СправочникСсылка.ТранспортныеСредства. Либо под каждое транспортное средство в справочнике Склады заводится виртуальный элемент-дублер.
Выделим ключевые недостатки этого подхода:
Подход 2: Двухконтурная схема учета (Два независимых регистра)
Это отраслевой стандарт автоматизации (применяемый, например, в специализированных решениях линейки "1С:Управление автотранспортом"). Учет разделяется на два независимых регистра накопления:
Связующим звеном между ними выступают специализированные документы, которые делают движения одновременно в оба регистра.
Разберем детально структуру метаданных для двухконтурной схемы. Создадим два регистра накопления с типом "Остатки".
1. Регистр накопления ТоварыНаСкладах (Остатки):
Склад (Тип: СправочникСсылка.Склады)Номенклатура (Тип: СправочникСсылка.Номенклатура)Количество (Тип: Число, длина 15, точность 3)2. Регистр накопления ГСМВТранспортныхСредствах (Остатки):
ТранспортноеСредство (Тип: СправочникСсылка.ТранспортныеСредства)Номенклатура (Тип: СправочникСсылка.Номенклатура)Количество (Тип: Число, длина 15, точность 3)Выясним, как должна работать логика проведения документов, чтобы баланс между складами и машинами всегда сходился.
Документ "Заправка ГСМ" (или "Перемещение в ТС")
Этот документ фиксирует факт выдачи технической жидкости со склада и заливки ее в автомобиль. При проведении он должен уменьшить остаток на складе и увеличить остаток в ТС.
Рассмотрим пример программного кода в модуле проведения этого документа:
Процедура ОбработкаПроведения(Отказ, Режим)
// Очищаем движения перед проведением
Движения.ТоварыНаСкладах.Записывать = Истина;
Движения.ГСМВТранспортныхСредствах.Записывать = Истина;
Движения.ТоварыНаСкладах.Очистить();
Движения.ГСМВТранспортныхСредствах.Очистить();
// Проводим по регистру "Товары на складах" (Расход со склада)
Для Каждого ТекСтрока Из Товары Цикл
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Склад = СкладОтправитель;
Движение.Номенклатура = ТекСтрока.Номенклатура;
Движение.Количество = ТекСтрока.Количество;
КонецЦикла;
// Проводим по регистру "ГСМ в ТС" (Приход в автомобиль)
Для Каждого ТекСтрока Из Товары Цикл
Движение = Движения.ГСМВТранспортныхСредствах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.ТранспортноеСредство = ТранспортноеСредствоПолучатель;
Движение.Номенклатура = ТекСтрока.Номенклатура;
Движение.Количество = ТекСтрока.Количество;
КонецЦикла;
КонецПроцедуры
Документ "Путевой лист" (или "Акт списания ТЖ")
Этот документ фиксирует фактический расход жидкости (например, угар масла или расход топлива по пробегу). Он делает движение только по одному регистру:
ГСМВТранспортныхСредствах.Теперь решим ключевую задачу пользователя — получение красивого, объединенного отчета по обоим регистрам. Многие считают, что для этого обязательно иметь один общий регистр. На самом деле, с помощью механизма СКД связать два регистра можно изящно и быстро.
Проанализируем шаги настройки схемы компоновки данных:
ТоварыНаСкладах.ОстаткиИОбороты:
ВЫБРАТЬ
СкладыОстатки.Номенклатура КАК Номенклатура,
СкладыОстатки.Склад КАК ИсточникХранения,
СкладыОстатки.КоличествоНачальныйОстаток КАК ОстатокНачало,
СкладыОстатки.КоличествоПриход КАК Приход,
СкладыОстатки.КоличествоРасход КАК Расход,
СкладыОстатки.КоличествоКонечныйОстаток КАК ОстатокКонец
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, ,, ) КАК СкладыОстатки
ГСМВТранспортныхСредствах.ОстаткиИОбороты:
ВЫБРАТЬ
ТСОстатки.Номенклатура КАК Номенклатура,
ТСОстатки.ТранспортноеСредство КАК ИсточникХранения,
ТСОстатки.КоличествоНачальныйОстаток КАК ОстатокВТСНачало,
ТСОстатки.КоличествоПриход КАК ПриходВТС,
ТСОстатки.КоличествоРасход КАК РасходВТС,
ТСОстатки.КоличествоКонечныйОстаток КАК ОстатокВТСКонец
ИЗ
РегистрНакопления.ГСМВТранспортныхСредствах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, ,, ) КАК ТСОстатки
Номенклатура. Это позволит сопоставить остатки на складах и в автомобилях для каждого вида ГСМ/ТЖ в одной строке отчета.Номенклатуре, а в колонках вывести детальные показатели остатков складов и ТС рядом друг с другом.Благодаря такому подходу база данных остается чистой и нормализованной. Справочники выполняют свои непосредственные функции, регистры работают с максимальной производительностью, а конечный пользователь получает информативный и быстродействующий отчет.