Как разработать конфигурацию для складского учета с поддержкой ФИФО, управляемых блокировок и перемещения товаров?

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

Разработка складской системы с нуля — это классическая задача, которая позволяет программисту 1С продемонстрировать владение базовыми механизмами платформы. В данной статье мы разберем, как правильно спроектировать структуру метаданных, реализовать сложные алгоритмы списания себестоимости и обеспечить высокую производительность системы с помощью управляемых блокировок.

Организация структуры регистров и управляемые блокировки

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

Рассмотрим более правильный подход с использованием объекта БлокировкаДанных. Мы должны накладывать блокировку перед чтением остатков из базы данных в процедуре ОбработкаПроведения. Это гарантирует, что данные, которые мы прочитали для проверки (например, наличие товара на складе), не будут изменены другой транзакцией до завершения нашего проведения.

Разберем пример кода для установки управляемой блокировки:


Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Склад", СкладОтправитель);
ЭлементБлокировки.ИсточникДанных = СписокТоваров;
ЭлементБлокировки.ИспользоватьИзИсточникДанных("Номенклатура", "Номенклатура");
Блокировка.Заблокировать();

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

Реализация методов списания: ФИФО и По средней

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

Метод «ФИФО» (First In, First Out) требует более сложной структуры. Нам необходимо добавить в регистр измерение Партия (обычно это документ поступления). Проанализируем алгоритм списания по ФИФО по шагам:

  1. Выполняем запрос к виртуальной таблице Остатки регистра ОстаткиНоменклатуры.
  2. В запросе обязательно устанавливаем фильтр по нужной номенклатуре и складу.
  3. Упорядочиваем результат запроса по полю Партия.МоментВремени (по возрастанию).
  4. В цикле обходим полученные партии, списывая необходимое количество товара из каждой партии последовательно, пока общая потребность не будет удовлетворена.

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

Логика работы документа «Перемещение товаров»

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

Рассмотрим, как должны выглядеть движения этого документа. Нам необходимо создать два набора записей в рамках одного проведения:

Такой подход позволяет стоимости «мигрировать» между складами без искажений. Если мы просто укажем количество без суммы на складе-получателе, наша средняя стоимость по предприятию в целом «поплывет».

Учет взаиморасчетов и денежных средств

Для выполнения дополнительных требований по взаиморасчетам нам понадобятся новые объекты. Разберем их назначение:

Регистр «Взаиморасчеты»: измерения Контрагент, ресурс Сумма. Документ «Приход товара» будет делать движение «Приход» (увеличение нашего долга перед поставщиком). Документ «Оплата поставщику» будет делать движение «Расход» (уменьшение долга).

Регистр «ДенежныеСредства»: измерения СтатьяДвиженияДенежныхСредств или СчетКасса, ресурс Сумма. Здесь мы фиксируем наличие физических денег. Оплата поставщику одновременно уменьшает и наш долг (в регистре взаиморасчетов), и остаток денег (в регистре денежных средств).

Гибкая настройка отчетов через СКД

Система компоновки данных (СКД) позволяет реализовать требование по изменению настроек пользователем без внесения правок в конфигураторе. Посмотрим на основные моменты настройки:

Во-первых, при создании схемы компоновки данных мы используем виртуальные таблицы Остатки и ОстаткиИОбороты. Это обеспечивает оптимальную выборку данных.

Во-вторых, разберем, как дать пользователю возможность менять группировки. В настройках СКД на вкладке «Настройки» есть колонка с изображением шестеренки или звездочки (свойства элемента пользовательских настроек). Нам необходимо установить флаг «Включать в пользовательские настройки» для параметров (Период), отборов (Склад, Контрагент) и выбранных полей. Теперь пользователь сможет прямо в режиме «1С:Предприятие» добавлять новые разрезы (например, группировку по складам внутри номенклатуры) простым перетаскиванием полей в форме отчета.

Важный совет: для контроля отрицательных остатков всегда выполняйте проверку в конце процедуры проведения. Если после выполнения всех движений остаток по регистру в базе данных (с учетом текущей транзакции) стал меньше нуля — вызывайте Отказ = Истина и выводите пользователю сообщение об ошибке. Это предотвратит перекосы в учете, которые крайне сложно исправлять задним числом.

← На главную