Документ «Инвентаризация товаров на складе»

Документ фиксирует результат пересчёта ТМЗ на складе: подтягивает учётные остатки, вы вносите фактические количества, программа считает отклонения (недостачи/излишки) и печатает ИНВ-10 и ИНВ-18. Документ непроводимый — он ничего не списывает и не делает проводок; это «фотография» расхождений и основание для последующих документов оприходования излишков и списания недостач.

Бухгалтерия для Казахстана, ред. 3.0 · v3.0.72.1 · обновлено 2026-06-04

🎯 Что это и зачем

Раз в год (а часто и чаще — при смене материально ответственного лица, перед аудитом, после порчи/кражи) товар на складе пересчитывают вживую и сравнивают с тем, что числится в базе. Документ «Инвентаризация товаров на складе» — рабочее место этого сравнения:

Кто работает: кладовщики и бухгалтеры по складу. Периодичность — от ежегодной до выборочной по отдельному складу.

⚠️ Главное, что нужно понять сразу. Этот документ не меняет остатки и не делает бухгалтерских проводок. Он только сравнивает факт с учётом и оформляет результат на бумаге. Чтобы недостача/излишек попали в учёт — на основании выявленных расхождений вы отдельно вводите документы оприходования излишков и списания недостач (см. раздел «Что после инвентаризации»). Это поведение зашито в метаданных: Проведение = Запретить.

🧭 Где найти в программе

Раздел «Склад» → пункт «Инвентаризация ТМЗ на складе». Откроется журнал; новый документ создаём кнопкой «Создать».

📷 СКРИН 01
СКРИН 01 — раздел «Склад», открытый журнал «Инвентаризация ТМЗ на складе» с кнопкой «Создать». (AccountingKZ30 во Fresh)
⚠️ Оговорка по навигации [KZ30-INV-04]. В машинном маршрутизаторе navigation-map.json этого документа нет — точное имя пункта в левом меню вашей сборки Fresh может отличаться. Раздел «Склад» определён по подсистемам объекта и расположению справочника «Склады» («Номенклатура и склад»). Если пункта не видно — проверьте, включена ли подсистема складского учёта в настройках, либо ищите документ через «Все функции» / по полнотекстовому поиску «Инвентаризация».

👤 Часть 1. Для пользователя

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

Урок 1. Инвентаризация по одному складу (выборочная)

Когда: плановая или внеплановая проверка остатков на конкретном складе.

Шаг 1. Создаём документ и выбираем вид операции

«Создать». Первое и главное поле — Вид операции: - По складу — пересчёт одного склада (поле «Склад» становится видимым и обязательным); - По организации — полная инвентаризация по всем складам (поле «Склад» скрывается).

📷 СКРИН 02
СКРИН 02 — новый документ, поле «Вид операции» с раскрытым списком (По складу / По организации).
💡 Подсказка. Вид операции выбирайте до заполнения товаров. При его смене программа предложит очистить и переполнить таблицу — это нормально, контур инвентаризации меняется.

Шаг 2. Заполняем шапку

📷 СКРИН 03
СКРИН 03 — заполненная шапка документа инвентаризации (организация, склад, причина, основание).

Шаг 3. Заполняем учётные остатки

Кнопка «Заполнить по остаткам на складе». Программа в фоновом режиме (с окном ожидания) загрузит в таблицу Товары все позиции с ненулевым остатком: проставит Номенклатуру, Счёт учёта (БУ), Учётное количество, а для счетов с суммовым учётом — Учётную сумму и Цену.

📷 СКРИН 04
СКРИН 04 — окно «Заполнить по остаткам» / таблица «Товары» после автозаполнения учётными остатками.
💡 Заполнение асинхронное: дождитесь закрытия окна ожидания, не правьте таблицу «на ходу».
⚠️ В таблицу попадают только позиции с остатком больше нуля на дату документа (см. реальный код в Части 2). Если ждёте позицию с нулём — добавьте её вручную через «Подбор».

Шаг 4. Вносим фактическое количество

Главная ручная работа: в колонке Количество проставляем то, что реально пересчитали на складе. Поле Учётное количество — только для чтения. Колонка Отклонение = Количество − Учётное количество пересчитывается на лету.

Сканером штрихкодов: кнопка «Добавить по штрихкоду» — найденная позиция добавится строкой или увеличит количество существующей.

📷 СКРИН 05
СКРИН 05 — таблица «Товары» с заполненным фактическим количеством и видимой колонкой «Отклонение» (недостачи красным/минусом).
💡 Подсказка. Нет позиции в списке (новое поступление, забыли при автозаполнении)? Кнопка «Подбор» → выбираете номенклатуру → у неё подтянутся единица, коэффициент, цена и счёт; учётное количество будет 0, а всё фактическое уйдёт в излишек.

Шаг 5. Заполняем комиссию (для печати)

Кнопка «Комиссия» → выбираем физических лиц из справочника, одному ставим признак Председатель. Без комиссии формы ИНВ-10/ИНВ-18 напечатаются без подписей.

📷 СКРИН 06
СКРИН 06 — табличная часть «Инвентаризационная комиссия» с отмеченным председателем.

Шаг 6. Записываем и печатаем

«Записать» или «Записать и закрыть». Кнопки «Провести» здесь нет — документ непроводимый. Затем «Печать» → выбираем форму: - «Инвентаризация товаров на складе» — основная форма документа; - «ИНВ-10 (Инвентаризационная опись запасов)»; - «ИНВ-18 (Сличительная ведомость)»; - «Комплект документов» / «…(на принтер)» / «Настраиваемый комплект документов» — пакетом.

📷 СКРИН 07
СКРИН 07 — меню «Печать» с пунктами ИНВ-10, ИНВ-18 и комплектом документов.
⚠️ Важно. Обязательны только Организация и Вид операции (плюс «Склад» при виде «По складу»). Записать документ с пустой таблицей платформа не помешает, но печатные формы выйдут пустыми, а смысла в инвентаризации без строк нет.

Урок 2. Инвентаризация по всей организации (полная)

Отличия от Урока 1: 1. Вид операции — «По организации»; поле Склад скрыто и не требуется. 2. «Заполнить по остаткам» загрузит остатки по всем складам организации (таблица может быть очень большой). 3. Фактические количества вносите по результатам пересчёта всех мест хранения.

💡 Для крупной номенклатуры полную инвентаризацию удобнее дробить на несколько документов «По складу» — и печатать по складам, и считать отклонения проще.

Урок 3. Перезаполнить учётные количества и суммы

Если после загрузки остатков поменялись цены/курс или вы случайно сбили учётные данные — кнопка «Перезаполнить учётные количества и суммы». Программа переспросит подтверждение и пересчитает колонки Учётное количество и Учётная сумма заново из регистров, не трогая введённые вами фактические количества и суммы. Отклонения пересчитаются.

📷 СКРИН 08
СКРИН 08 — диалог подтверждения «Перезаполнить учётные количества и суммы?».

Что после инвентаризации

Документ инвентаризации — это итог сравнения, а не движение по складу. Дальше по выявленным отклонениям оформляются отдельные документы: - излишки (отклонение «+») — оприходование (Дт счёта запасов — Кт прочих доходов); - недостачи (отклонение «−») — списание / отнесение на виновное лицо.

⚠️ В метаданных этого документа нет зарегистрированных команд «Создать на основании» и нет связанных регистров. То есть кнопки «ввести списание на основании инвентаризации» в типовой поставке 3.0.72.1 может не быть — последующие документы оформляются вручную, перенося данные из инвентаризации. Точный набор доступных команд проверяйте в своей сборке.

🛠 Часть 2. Для программиста

Источник: реальный код релиза 3.0.72.1 (Documents/ИнвентаризацияТоваровНаСкладе/Ext/ObjectModule.bsl, .../Ext/ManagerModule.bsl, .../Forms/ФормаДокумента/Ext/Form/Module.bsl), метаданные Documents/ИнвентаризацияТоваровНаСкладе.xml, плюс разбор objects/ и business-logic/.

Главное: документ непроводимый

В метаданных объекта:

<Posting>Deny</Posting>
<RegisterRecords/>

Проведение = Запретить, набор регистраторов пуст. Документ не формирует движений ни по регистрам бухгалтерии (Типовой/Налоговый), ни по регистрам накопления (товарные остатки), ни по оборотным регистрам. Кнопки «Провести» в форме нет. Всё, что он делает, — хранит таблицу факт/учёт и печатает формы. Поэтому раздела «движения по регистрам» и «таблицы проводок Дт/Кт» у этого документа не существует — и это не пробел, а конструкция.

Структура объекта

Реквизиты шапки. Обязательные (ЗаполнениеОбязательно = ВыдаватьОшибку): Организация, ВидОперации (Перечисление.ВидыОперацийИнвентаризация: ПоСкладу / ПоОрганизации). Условно-обязательный: Склад (только при ВидОперации = ПоСкладу, проверка в форме). Прочие: СтруктурноеПодразделение, ДатаНачалаИнвентаризации, ДатаОкончанияИнвентаризации, ПричинаПроведенияИнвентаризации, ДокументОснованиеВид/Номер/Дата, Ответственный, Автор, Комментарий.

Табличная часть Товары: Номенклатура, ЕдиницаИзмерения, Коэффициент, Количество (факт), КоличествоУчет (учёт, read-only), Цена, Сумма, СуммаУчет, СчетУчетаБУ (ПланСчетов.Типовой). Колонка Отклонение — расчётная (факт − учёт), в базе не хранится, заполняется в форме.

Табличная часть ИнвентаризационнаяКомиссия: ФизЛицо (Справочник.ФизическиеЛица), Председатель (Булево). Только для печатных форм.

Жизненный цикл (обработчики ObjectModule)

ObjectModule.bsl крошечный (≈40 строк) — в нём нет ни ОбработкаПроведения, ни ОбработкаПроверкиЗаполнения, ни ПередЗаписью. Только два обработчика:

Обработчик Что делает
ОбработкаЗаполнения Удаляет Автор из переданной структуры (автора назначает система), копирует свойства из ДанныеЗаполнения, затем ЗаполнениеДокументов.ЗаполнитьШапкуДокумента(ЭтотОбъект, ДанныеЗаполнения)
ПриКопировании Сбрасывает Дата = НачалоДня(ОбщегоНазначения.ТекущаяДатаПользователя()) — копия получает текущую дату

Реальный код целиком:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

    ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);

    Если ТипДанныхЗаполнения = Тип("Структура") Тогда
        Если ДанныеЗаполнения.Свойство("Автор") Тогда
            ДанныеЗаполнения.Удалить("Автор");
        КонецЕсли;
        ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения);
    КонецЕсли;

    ЗаполнениеДокументов.ЗаполнитьШапкуДокумента(ЭтотОбъект, ДанныеЗаполнения);

КонецПроцедуры

Процедура ПриКопировании(ОбъектКопирования)

    Дата = НачалоДня(ОбщегоНазначения.ТекущаяДатаПользователя());

КонецПроцедуры

Вывод для разработчика: вся «жизнь» документа — это не проведение, а заполнение табличной части по остаткам. Эта логика вынесена в ManagerModule (сервер) и форму (асинхронный запуск). Туда и смотрим.

Ключевая процедура — заполнение по остаткам склада (реальный код, 3.0.72.1)

Источник: ManagerModule.bsl, ЗаполнитьПоОстаткамНаСкладе (стр. 6). Выполняется в фоновом задании, результат кладётся во временное хранилище. Сокращённо:

Процедура ЗаполнитьПоОстаткамНаСкладе(СтруктураПараметров, АдресХранилища) Экспорт

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

    // 2. Реальные остатки на дату документа берёт общий модуль учёта товаров
    ТаблицаОстатки = УчетТоваров.ПолучитьОстаткиТоваров(
        Новый Граница(СтруктураПараметров.Дата, ВидГраницы.Включая),
        СтруктураПараметров.Организация,
        СтруктураПараметров.СтруктурноеПодразделение,
        ОтборОстатков);

    ТаблицаОстатки.Свернуть("СчетУчетаБУ,Номенклатура", "Стоимость,Количество,КоличествоПоСкладу");

    Для Каждого СтрокаТаблицы Из ТаблицаОстатки Цикл

        Если СтрокаТаблицы.Количество = NULL ИЛИ СтрокаТаблицы.Количество <= 0 Тогда
            Продолжить;                                  // нулевые/пустые остатки пропускаем
        КонецЕсли;

        // ведётся ли по счёту суммовой учёт в разрезе складов — кэшируем
        ВедетсяСуммовойУчет = ...ВедетсяСуммовойУчетПоСкладам(СтрокаТаблицы.СчетУчетаБУ);

        СтрокаТабличнойЧасти = СтруктураПараметров.Товары.Добавить();

        Количество = ?(НЕ ВедетсяСуммовойУчет И ЗначениеЗаполнено(СтруктураПараметров.Склад),
                       СтрокаТаблицы.КоличествоПоСкладу, СтрокаТаблицы.Количество);

        СтрокаТабличнойЧасти.Номенклатура   = СтрокаТаблицы.Номенклатура;
        СтрокаТабличнойЧасти.СчетУчетаБУ    = СтрокаТаблицы.СчетУчетаБУ;
        СтрокаТабличнойЧасти.Количество     = Количество;     // ВАЖНО: факт = учёт по умолчанию
        СтрокаТабличнойЧасти.КоличествоУчет = Количество;
        СтрокаТабличнойЧасти.ЕдиницаИзмерения = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(
                                                  СтрокаТаблицы.Номенклатура, "БазоваяЕдиницаИзмерения");
        СтрокаТабличнойЧасти.Коэффициент    = 1;

        Если ВедетсяСуммовойУчет Тогда
            СтрокаТабличнойЧасти.СуммаУчет = СтрокаТаблицы.Стоимость;
            СтрокаТабличнойЧасти.Сумма     = СтрокаТабличнойЧасти.СуммаУчет;
            СтрокаТабличнойЧасти.Цена      = СтрокаТабличнойЧасти.Сумма / СтрокаТабличнойЧасти.Количество;
        КонецЕсли;
    КонецЦикла;

    // 3. Результат — во временное хранилище (фоновое задание → клиент)
    СтруктураДанныхЗаполнения = Новый Структура;
    СтруктураДанныхЗаполнения.Вставить("Товары", СтруктураПараметров.Товары);
    СтруктураДанныхЗаполнения.Вставить("ЗаполнитьДобавленныеКолонкиТаблиц", Истина);
    ПоместитьВоВременноеХранилище(СтруктураДанныхЗаполнения, АдресХранилища);

КонецПроцедуры

Что важно вычитать из кода:

  1. Источник остатков — РегистрБухгалтерии.Типовой.Остатки, а конкретные числа возвращает общий модуль УчетТоваров.ПолучитьОстаткиТоваров(...). То есть «правда» об остатках — в бухгалтерском регистре по счетам с субконто Склады, а не в отдельном товарном регистре документа.
  2. Факт инициализируется равным учёту (Количество = КоличествоУчет). Сразу после автозаполнения отклонение по всем строкам = 0 — это задумано: пользователь правит только реально расходящиеся позиции.
  3. Позиции с остатком ≤ 0 пропускаются (Продолжить). Отсутствие позиции в таблице после автозаполнения = нулевой/отрицательный учётный остаток.
  4. Суммовой учёт по складам управляет тем, берётся КоличествоПоСкладу или общее Количество, и заполняются ли Сумма/Цена. Для несуммовых счетов сумма/цена остаются пустыми — это нормально.
  5. Парная процедура ЗаполнитьПоОстаткамОрганизации (стр. 119) делает то же без фильтра по складу; ПерезаполнитьУчетныеКоличестваИСуммы (стр. 196) обновляет только учётные колонки.

Запуск из формы — асинхронность

Форма не выполняет запрос синхронно. ЗаполнитьПоОстаткамНаСкладе(Команда) (форма, стр. 365) сначала валидирует, потом при непустой таблице переспрашивает и уходит в фон:

Если НЕ ЗначениеЗаполнено(Объект.Склад) И НЕ ЗначениеЗаполнено(Объект.Организация) Тогда
    ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Не заполнен склад для получения остатков!'"),, "Склад", "Объект");
    ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Не заполнена организация для получения остатков!'"),, "Организация", "Объект");
    Возврат;
ИначеЕсли НЕ ЗначениеЗаполнено(Объект.Организация) Тогда
    // ... только организация ...
ИначеЕсли НЕ ЗначениеЗаполнено(Объект.Склад)
        И Объект.ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперацийИнвентаризация.ПоСкладу") Тогда
    ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Не заполнен склад для получения остатков!'"),, "Склад", "Объект");
    Возврат;
КонецЕсли;

Дальше — ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(...), ожидание задания через ПодключитьОбработчикОжидания, чтение результата из АдресХранилища. Вывод для автоматизации: программно дёргать заполнение нужно через серверные процедуры ManagerModule и дожидаться завершения фонового задания, а не имитировать клик по команде формы.

Переключение вида операции

ВидОперацииПриИзменении (форма, стр. 185): при смене вида, если таблица непуста, выводит вопрос «Перезаполнить таблицу товаров…? Существующая таблица будет очищена», сбрасывает Объект.Склад = "", вызывает серверную перенастройку видимости и УправлениеФормой(ЭтаФорма). То же подтверждение — в СкладПриИзменении (стр. 231).

Печатные формы (ManagerModule)

ДобавитьКомандыПечати регистрирует команды с такими представлениями (реальные строки НСтр):

Идентификатор Представление в меню «Печать» Функция-построитель
ИнвентаризацияТоваровНаСкладе «Инвентаризация товаров на складе» ПечатьИнвентаризацияТоваровНаСкладе (стр. 547)
ИнвентаризацияТоваровНаСкладе_ИНВ10 «ИНВ-10 (Инвентаризационная опись запасов)» ПечатьИНВ10 (стр. 708)
ИнвентаризацияТоваровНаСкладе_ИНВ18 «ИНВ-18 (Сличительная ведомость)» ПечатьИНВ18 (стр. 1157)
…,…_ИНВ10,…_ИНВ18 «Комплект документов» / «…(на принтер)» / «Настраиваемый комплект документов» комплект из трёх форм

Макеты: Templates/ПФ_MXL_ИНВ10, ПФ_MXL_ИНВ18, ПФ_MXL_ИнвентаризацияТоваровНаСкладе. Печать идёт под управлением УправлениеПечатью; функции печати используют ТабДокумент, Макет, Запрос к данным документа.

⚠️ Несостыковка [KZ30-INV-01]. Разбор objects/ называет ИНВ-10 «инвентаризационной описью товарно-материальных ценностей». В реальном коде представление команды — «ИНВ-10 (Инвентаризационная опись запасов)». В тексте и интерфейсе ориентируйтесь на формулировку из кода.

Иллюстрация: как расхождения попадут в учёт (НЕ движения этого документа)

Сам документ проводок не делает. Но чтобы партнёр понимал, куда «уходят» отклонения, — типовая картина последующих документов в плане счетов РК (ПланСчетов.Типовой, проверено по ChartsOfAccounts/Типовой/Ext/Predefined.xml):

Ситуация Документ-следствие Дт Кт
Излишек (факт > учёт) Оприходование излишков 1330 «Товары» (или 1310/1320/1350) 6280 «Прочие доходы»
Недостача (факт < учёт), виновный не установлен Списание недостачи 7470 «Прочие расходы» 1330 «Товары» (или 1310/1320/1350)
Недостача, отнесена на МОЛ Списание + претензия 1280 «Прочая краткосрочная дебиторская задолженность» 1330 «Товары»

Счета запасов в конфигурации: 1310 «Сырьё и материалы», 1320 «Готовая продукция», 1330 «Товары», 1350 «Прочие запасы». Это казахстанский план счетов — никаких 10/41/91/94. Конкретный счёт берётся из СчетУчетаБУ строки.

⚠️ Важно [KZ30-INV-02]. Таблица выше — иллюстрация бизнес-процесса, а не движения этого документа и не «зашитые» проводки. Точные Дт/Кт определяются документами оприходования/списания и учётной политикой. Источник истины — отчёт «Дт/Кт» на тех документах, а не на инвентаризации (у неё движений нет вообще).

Валидации

Отдельной ОбработкаПроверкиЗаполнения в ObjectModule нет. Контроль складывается из:

Логической проверки «дата окончания ≥ дата начала» и «председатель ровно один» в коде нет — это на совести пользователя.

Зависимости (общие модули)

УчетТоваров (ПолучитьОстаткиТоваров — ядро заполнения), ЗаполнениеДокументов (ЗаполнитьШапкуДокумента), ОбработкаТабличныхЧастейКлиентСервер (расчёт сумм/коэффициентов/отклонений в строках), ДлительныеОперацииКлиент (фоновое заполнение), РаботаСДиалогами/РаботаСДиалогамиКлиент (заголовок формы, выбор подразделения), УправлениеПечатью (печатные формы), ОбщегоНазначения, ПодключаемыеКоманды (версионирование, управление доступом).

💼 Партнёру / внедренцу.
  1. «Не заполняются остатки» / «таблица пустая». Причина почти всегда снаружи документа: (а) не указаны Организация/Склад; (б) на дату документа нет остатков > 0 по счетам ТМЗ с субконто «Склады»; (в) проблема с правами — заполнение идёт под РАЗРЕШЕННЫЕ и в фоновом задании. Смотреть УчетТоваров.ПолучитьОстаткиТоваров и настройку счетов учёта номенклатуры, а не модуль документа.
  2. «Где проводки инвентаризации». Их нет и не будет — документ непроводимый по метаданным. Излишки/недостачи проводятся отдельными документами; объясняйте это клиенту сразу.
  3. Суммы/цены пустые у части строк — нормально для счетов без суммового учёта по складам. Это не ошибка заполнения.
  4. Печать без подписей — не заполнена табличная часть «Инвентаризационная комиссия».
🧩 Заметки для разработчика.
  1. Нет смысла искать ОбработкаПроведения — её нет. Точка расширения для интеграций — ManagerModule (заполнение/печать) и форма, а не проведение.
  2. Заполнение строго асинхронное через временное хранилище. Для пакетной обработки/тестов вызывайте серверные ЗаполнитьПоОстаткамНаСкладе/…Организации/Перезаполнить… напрямую и читайте АдресХранилища; не эмулируйте команды формы.
  3. После вставки строк из буфера обмена пересчёт сумм и отклонений не срабатывает автоматически — нужен явный вызов ОбработкаТабличныхЧастейКлиентСервер (как в ТоварыКоличествоПриИзменении).
  4. Хотите автоматически создавать списание/оприходование на основании инвентаризации — это доработка: ни ОснованиеВвода, ни команды «Создать на основании», ни регистры в типовом объекте не зарегистрированы.

🔗 Связанные разделы

🆕 Что нового

Версия Изменение Тип
3.0.72.1 Первичное описание (на релизе 3.0.72.1) 🆕