Как правильно спроектировать структуру регистров для учета ГСМ и технических жидкостей в транспортных средствах в 1С

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При автоматизации учета автотранспортных предприятий или компаний с собственным автопарком регулярно возникает классическая задача: учет горюче-смазочных материалов (ГСМ) и технических жидкостей (ТЖ). Масла, антифриз, тормозная жидкость и топливо сначала поступают на обычные склады компании, а затем перемещаются "в борт" транспортных средств (ТС). В дальнейшем эти жидкости списываются по путевым листам или актам обслуживания.

Основная сложность заключается в проектировании структуры регистров. Как правильно связать обычные склады и автомобили, чтобы получить прозрачную отчетность вида: Склад -> ОстатокНачало -> Приход -> Расход -> ОстатокКонец -> ОстатокВТСНачало -> ПриходВТС -> РасходВТС -> ОстатокВТСКонец? Рассмотрим и детально проанализируем возможные варианты реализации этой задачи на платформе "1С:Предприятие 8".

Анализ архитектурных подходов: один регистр или два?

На практике разработчики часто колеблются между двумя архитектурными решениями. Проанализируем их особенности, достоинства и недостатки.

Подход 1: Один регистр накопления с составным измерением "Склад / ТС"

При таком подходе создается один регистр накопления (например, ТоварыНаСкладах), в котором измерение Склад имеет составной тип данных: СправочникСсылка.Склады и СправочникСсылка.ТранспортныеСредства. Либо под каждое транспортное средство в справочнике Склады заводится виртуальный элемент-дублер.

Выделим ключевые недостатки этого подхода:

  1. Нарушение нормализации данных. Справочник транспортных средств содержит специфические реквизиты: госномер, одометр, нормы расхода, марку, данные полиса ОСАГО. Справочник складов решает совершенно другие задачи. Смешивание этих сущностей в одной точке или создание дублей — грубая архитектурная ошибка.
  2. Падение производительности СУБД. Использование составных типов данных в измерениях регистров накопления приводит к усложнению SQL-запросов, ухудшению работы индексов и, как следствие, замедлению получения остатков.
  3. Сложности регламентированного учета. Топливо и жидкости на складе учитываются на субсчете 10.03.1 ("Материалы на складе"), а в баках транспортных средств — на субсчете 10.03.2 ("Топливо в баках"). Разделение этих потоков внутри одного регистра при формировании проводок потребует написания сложных и неоптимальных алгоритмов.

Подход 2: Двухконтурная схема учета (Два независимых регистра)

Это отраслевой стандарт автоматизации (применяемый, например, в специализированных решениях линейки "1С:Управление автотранспортом"). Учет разделяется на два независимых регистра накопления:

Связующим звеном между ними выступают специализированные документы, которые делают движения одновременно в оба регистра.

Проектируем структуру регистров накопления

Разберем детально структуру метаданных для двухконтурной схемы. Создадим два регистра накопления с типом "Остатки".

1. Регистр накопления ТоварыНаСкладах (Остатки):

2. Регистр накопления ГСМВТранспортныхСредствах (Остатки):

Реализация бизнес-логики в документах

Выясним, как должна работать логика проведения документов, чтобы баланс между складами и машинами всегда сходился.

Документ "Заправка ГСМ" (или "Перемещение в ТС")

Этот документ фиксирует факт выдачи технической жидкости со склада и заливки ее в автомобиль. При проведении он должен уменьшить остаток на складе и увеличить остаток в ТС.

Рассмотрим пример программного кода в модуле проведения этого документа:


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

Документ "Путевой лист" (или "Акт списания ТЖ")

Этот документ фиксирует фактический расход жидкости (например, угар масла или расход топлива по пробегу). Он делает движение только по одному регистру:

Разработка сводного отчета в Системе компоновки данных (СКД)

Теперь решим ключевую задачу пользователя — получение красивого, объединенного отчета по обоим регистрам. Многие считают, что для этого обязательно иметь один общий регистр. На самом деле, с помощью механизма СКД связать два регистра можно изящно и быстро.

Проанализируем шаги настройки схемы компоновки данных:

  1. Создаем новый отчет и добавляем схему компоновки данных.
  2. Добавляем Набор данных - Запрос для получения данных по складам. Текст запроса будет обращаться к виртуальной таблице ТоварыНаСкладах.ОстаткиИОбороты:
    
    ВЫБРАТЬ
    	СкладыОстатки.Номенклатура КАК Номенклатура,
    	СкладыОстатки.Склад КАК ИсточникХранения,
    	СкладыОстатки.КоличествоНачальныйОстаток КАК ОстатокНачало,
    	СкладыОстатки.КоличествоПриход КАК Приход,
    	СкладыОстатки.КоличествоРасход КАК Расход,
    	СкладыОстатки.КоличествоКонечныйОстаток КАК ОстатокКонец
    ИЗ
    	РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, ,, ) КАК СкладыОстатки
    
  3. Добавляем второй Набор данных - Запрос для получения данных по автомобилям. Запрос обращается к виртуальной таблице ГСМВТранспортныхСредствах.ОстаткиИОбороты:
    
    ВЫБРАТЬ
    	ТСОстатки.Номенклатура КАК Номенклатура,
    	ТСОстатки.ТранспортноеСредство КАК ИсточникХранения,
    	ТСОстатки.КоличествоНачальныйОстаток КАК ОстатокВТСНачало,
    	ТСОстатки.КоличествоПриход КАК ПриходВТС,
    	ТСОстатки.КоличествоРасход КАК РасходВТС,
    	ТСОстатки.КоличествоКонечныйОстаток КАК ОстатокВТСКонец
    ИЗ
    	РегистрНакопления.ГСМВТранспортныхСредствах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, ,, ) КАК ТСОстатки
    
  4. Переходим на вкладку Связи наборов данных. Настраиваем связь между Набором 1 и Набором 2 по полю Номенклатура. Это позволит сопоставить остатки на складах и в автомобилях для каждого вида ГСМ/ТЖ в одной строке отчета.
  5. На вкладке Настройки выстраиваем необходимую структуру вывода. Мы можем сгруппировать данные по Номенклатуре, а в колонках вывести детальные показатели остатков складов и ТС рядом друг с другом.

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

← На главную