Как выбрать или быстро разработать простую конфигурацию 1С для учета складских операций и перемещений между МОЛ

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

Перед многими специалистами и автоматизаторами периодически возникает задача: организовать максимально простой, «не перегруженный» складской учет. Типичные требования заказчика или собственного бизнеса звучат крайне лаконично: нужен только учет прихода, расхода и внутренних перемещений товаров между материально-ответственными лицами (МОЛ) или физическими местами хранения. При этом внедрение тяжелых типовых решений, таких как «1С:Управление торговлей» или «1С:ERP», видится нецелесообразным из-за избыточного функционала, высоких системных требований и сложности освоения пользователями.

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

---

Вариант 1. Быстрое создание собственной микро-конфигурации на платформе 1С 8.3

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

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

  1. Справочники:
    • Номенклатура — для хранения списка товаров или материалов.
    • Склады — в качестве складов в нашей системе будут выступать физические места хранения либо непосредственно материально-ответственные лица (МОЛ).
  2. Регистры накопления:
    • ОстаткиТоваров — регистр с типом «Остатки». Он будет накапливать оперативную информацию о наличии ТМЦ.
      • Измерения: Номенклатура (тип: СправочникСсылка.Номенклатура), Склад (тип: СправочникСсылка.Склады).
      • Ресурсы: Количество (тип: Число, длина 15, точность 3).
  3. Документы:
    • ПоступлениеТоваров — фиксирует приход номенклатуры на склад (движение «Приход» в регистр ОстаткиТоваров).
    • РасходТоваров — отражает отгрузку, списание или продажу (движение «Расход» с контролем остатков).
    • ПеремещениеТоваров — ключевой документ для учета движения между МОЛами (делает одновременно «Расход» со склада-отправителя и «Приход» на склад-получатель).

Рассмотрим подробнее логику работы и пример программного кода для проведения основного документа — ПеремещениеТоваров. Нам необходимо не просто перебросить остатки с одного склада на другой, но и гарантировать, что у склада-отправителя в момент проведения документа физически присутствует необходимое количество списываемого товара.

Проанализируем пример кода обработчика проведения документа ПеремещениеТоваров на управляемых формах с контролем остатков:


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    // Очищаем движения по регистру перед проведением
    Движения.ОстаткиТоваров.Записывать = Истина;
    Движения.ОстаткиТоваров.Очистить();
    
    // Блокируем данные регистра, чтобы избежать коллизий при одновременной работе пользователей
    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиТоваров");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.ИсточникДанных = Товары;
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
    ЭлементБлокировки.УстановитьЗначение("Склад", СкладОтправитель);
    Блокировка.Заблокировать();
    
    // Формируем запрос для проверки текущих остатков на складе-отправителе
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ДокТовары.Номенклатура КАК Номенклатура,
        |   СУММА(ДокТовары.Количество) КАК КоличествоДок
        |ПОМЕСТИТЬ ВТ_Товары
        |ИЗ
        |   &ТаблицаТоваров КАК ДокТовары
        |СГРУППИРОВАТЬ ПО
        |   ДокТовары.Номенклатура
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |   ВТ_Товары.Номенклатура КАК Номенклатура,
        |   ВТ_Товары.Номенклатура.Представление КАК НоменклатураПредставление,
        |   ВТ_Товары.КоличествоДок КАК КоличествоДок,
        |   ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК КоличествоОстаток
        |ИЗ
        |   ВТ_Товары КАК ВТ_Товары
        |       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(
        |               &МоментВремени,
        |               Склад = &СкладОтправитель
        |                   И Номенклатура В (ВЫБРАТЬ ВТ.Номенклатура ИЗ ВТ_Товары КАК ВТ)) КАК Остатки
        |       ПО ВТ_Товары.Номенклатура = Остатки.Номенклатура";
        
    Запрос.УстановитьПараметр("ТаблицаТоваров", Товары.Выгрузить());
    // Если проводим документ оперативно, берем остатки на текущий момент времени
    Запрос.УстановитьПараметр("МоментВремени", Новый Граница(МоментВремени(), ВидГраницы.Исключая));
    Запрос.УстановитьПараметр("СкладОтправитель", СкладОтправитель);
    
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        // Сверяем требуемое количество с фактическим остатком
        Если Выборка.КоличествоДок > Выборка.КоличествоОстаток Тогда
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = Шаблон("Недостаточно товара %1 на складе %2! Требуется: %3, в наличии: %4", 
                Выборка.НоменклатураПредставление, СкладОтправитель, Выборка.КоличествоДок, Выборка.КоличествоОстаток);
            Сообщение.Сообщить();
            Отказ = Истина;
        КонецЕсли;
        
        // Если ошибок нет, записываем движения в регистр накопления
        Если Не Отказ Тогда
            // 1. Списание со склада-отправителя
            ДвижениеРасход = Движения.ОстаткиТоваров.ДобавитьРасход();
            ДвижениеРасход.Период = Дата;
            ДвижениеРасход.Номенклатура = Выборка.Номенклатура;
            ДвижениеРасход.Склад = СкладОтправитель;
            ДвижениеРасход.Количество = Выборка.КоличествоДок;
            
            // 2. Поступление на склад-получатель
            ДвижениеПриход = Движения.ОстаткиТоваров.ДобавитьПриход();
            ДвижениеПриход.Период = Дата;
            ДвижениеПриход.Номенклатура = Выборка.Номенклатура;
            ДвижениеПриход.Склад = СкладПолучатель;
            ДвижениеПриход.Количество = Выборка.КоличествоДок;
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Для завершения разработки конфигурации останется лишь построить простой отчет с использованием Системы компоновки данных (СКД) по виртуальной таблице РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты. Такой отчет позволит в один клик увидеть начальный остаток, приход, расход, перемещения и конечный остаток товаров в разрезе каждого материально-ответственного лица.

---

Вариант 2. Использование готовых легких решений от сторонних разработчиков

Если на программирование нет времени или желания («хочется скачать и сразу работать»), стоит обратить внимание на существующие бесплатные или условно-бесплатные мини-конфигурации, созданные независимыми разработчиками сообщества 1С.

Рассмотрим наиболее популярные варианты:

---

Вариант 3. Адаптация типовых решений и технические подводные камни (на примере 1С:УНФ)

Иногда компании принимают решение развернуть для складских нужд типовую конфигурацию, например «1С:Управление нашей фирмой» (УНФ) или «1С:Управление торговлей» (УТ), планируя в будущем использовать более широкий функционал.

При таком подходе важно понимать, с какими трудностями и неочевидными нюансами вы можете столкнуться. Выясним одну из наиболее частых проблем, возникающих при совместном использовании «1С:УНФ» и «1С:Бухгалтерии предприятия» (БП), когда себестоимость перемещаемых товаров начинает расходиться.

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

  1. Различие методологий учета: УНФ — это программа для управленческого (оперативного) учета, тогда как БП служит для регламентированного. Алгоритмы расчета себестоимости списания партии в них могут различаться (например, разные настройки применения FIFO или распределения дополнительных расходов на приобретение товаров).
  2. Влияние настроек налогообложения: Если в карточке организации внутри УНФ указано, что компания применяет спецрежим (например, УСН или Патент), программа по умолчанию включает входящий НДС в себестоимость приобретаемых товаров (так как упрощенцы не принимают НДС к вычету). Если в этот же момент в «1С:Бухгалтерии» учет ведется по общей системе налогообложения (ОСНО), входящий НДС там учитывается отдельно на счете 19 и не должен увеличивать стоимость запасов. При выгрузке документов поступления и перемещения себестоимость в двух базах гарантированно разойдется.
  3. Флаг «НДС в стоимости»: В документах поступления УНФ критически важно обучить персонал контролировать признак включения НДС в стоимость товара. Неверная установка данной опции мгновенно искажает финансовый результат и оценку складских запасов.

Если перед вами стоит задача вести только простой физический учет перемещений по МОЛам без сложного финансового анализа, то использование тяжелых систем вроде УНФ или УТ потребует от вас постоянного контроля за вводом документов и регулярного администрирования. В таком случае отключение неиспользуемого функционала в правах пользователей или создание микро-базы «с нуля» сохранит множество ресурсов и избавит от операционных ошибок.

← На главную